From 65266a918d9e714c5f33eb16720ff6de6284dfa4 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Mon, 3 Jan 2022 11:59:31 +0100 Subject: [PATCH] built on 03/01/2022 11:59:31 --- basic_materials/.gitlab-ci.yml | 8 - basic_materials/.luacheckrc | 30 - basic_materials/LICENSE | 600 ------------ basic_materials/electrical-electronic.lua | 86 -- basic_materials/init.lua | 15 - basic_materials/locale/basic_materials.de.tr | 33 - basic_materials/locale/basic_materials.fr.tr | 33 - basic_materials/locale/basic_materials.it.tr | 34 - basic_materials/locale/basic_materials.ru.tr | 33 - basic_materials/metals.lua | 300 ------ basic_materials/misc.lua | 126 --- basic_materials/mod.conf | 4 - .../models/basic_materials_chains.obj | 881 ------------------ basic_materials/plastics.lua | 56 -- .../textures/basic_materials_brass_block.png | Bin 272 -> 0 bytes .../textures/basic_materials_brass_ingot.png | Bin 223 -> 0 bytes .../textures/basic_materials_cement_block.png | Bin 243 -> 0 bytes .../textures/basic_materials_chain_brass.png | Bin 344 -> 0 bytes .../basic_materials_chain_brass_inv.png | Bin 1886 -> 0 bytes .../textures/basic_materials_chain_steel.png | Bin 386 -> 0 bytes .../basic_materials_chain_steel_inv.png | Bin 1730 -> 0 bytes .../basic_materials_chainlink_brass.png | Bin 178 -> 0 bytes .../basic_materials_chainlink_steel.png | Bin 175 -> 0 bytes .../basic_materials_concrete_block.png | Bin 252 -> 0 bytes .../textures/basic_materials_copper_strip.png | Bin 326 -> 0 bytes .../textures/basic_materials_copper_wire.png | Bin 306 -> 0 bytes .../textures/basic_materials_empty_spool.png | Bin 214 -> 0 bytes .../basic_materials_energy_crystal.png | Bin 817 -> 0 bytes .../textures/basic_materials_gear_steel.png | Bin 5845 -> 0 bytes .../textures/basic_materials_gold_wire.png | Bin 286 -> 0 bytes .../basic_materials_heating_element.png | Bin 369 -> 0 bytes .../textures/basic_materials_ic.png | Bin 293 -> 0 bytes .../textures/basic_materials_motor.png | Bin 247 -> 0 bytes .../textures/basic_materials_oil_extract.png | Bin 1966 -> 0 bytes .../textures/basic_materials_padlock.png | Bin 215 -> 0 bytes .../textures/basic_materials_paraffin.png | Bin 345 -> 0 bytes .../basic_materials_plastic_sheet.png | Bin 293 -> 0 bytes .../basic_materials_plastic_strip.png | Bin 160 -> 0 bytes .../textures/basic_materials_silicon.png | Bin 769 -> 0 bytes .../textures/basic_materials_silver_wire.png | Bin 251 -> 0 bytes .../textures/basic_materials_steel_bar.png | Bin 311 -> 0 bytes .../textures/basic_materials_steel_strip.png | Bin 326 -> 0 bytes .../textures/basic_materials_steel_wire.png | Bin 284 -> 0 bytes .../basic_materials_terracotta_base.png | Bin 775 -> 0 bytes .../textures/basic_materials_wet_cement.png | Bin 366 -> 0 bytes hyperloop/data_base.lua | 2 +- hyperloop/init.lua | 5 +- hyperloop/junction.lua | 10 +- hyperloop/locale/hyperloop.de.tr | 6 +- hyperloop/map.lua | 2 +- hyperloop/network.lua | 8 + hyperloop/settingtypes.txt | 2 +- minecart/baselib.lua | 7 +- minecart/entitylib.lua | 20 +- minecart/monitoring.lua | 6 +- minecart/recording.lua | 10 +- minecart/storage.lua | 2 +- safer_lua/environ.lua | 5 +- safer_lua/init.lua | 2 +- safer_lua/readme.md | 3 +- signs_bot/basis.lua | 42 +- signs_bot/cmd_item.lua | 24 +- signs_bot/init.lua | 4 +- signs_bot/signs.lua | 4 +- techage/README.md | 25 +- techage/basic_machines/autocrafter.lua | 84 +- techage/basic_machines/chest.lua | 1 + techage/basic_machines/consumer.lua | 9 +- techage/basic_machines/electronic_fab.lua | 64 +- techage/basic_machines/gravelrinser.lua | 22 +- techage/basic_machines/gravelsieve.lua | 68 +- techage/basic_machines/grinder.lua | 42 +- techage/basic_machines/recipeblock.lua | 244 +++++ techage/basic_machines/recycler.lua | 58 +- techage/basic_machines/ta5_chest.lua | 185 ++++ techage/basis/assemble.lua | 115 +++ techage/basis/command.lua | 81 ++ techage/basis/counting.lua | 4 + techage/basis/fly_lib.lua | 733 +++++++++++++++ techage/basis/hyperloop.lua | 235 +++++ techage/basis/laser_lib.lua | 11 +- techage/basis/lib.lua | 206 +++- techage/basis/liquid_lib.lua | 24 +- techage/basis/mark_lib.lua | 122 +++ techage/basis/node_states.lua | 3 +- techage/basis/oggfiles.lua | 103 ++ techage/basis/recipe_lib.lua | 156 +++- techage/basis/shared_inv.lua | 69 ++ techage/basis/shared_tank.lua | 105 +++ techage/{tools => basis}/submenu.lua | 57 +- techage/basis/teleport.lua | 167 ++++ techage/chemistry/ta4_doser.lua | 14 +- techage/collider/cooler.lua | 91 ++ techage/collider/detector.lua | 414 ++++++++ techage/collider/inlets.lua | 364 ++++++++ techage/collider/magnet.lua | 305 ++++++ techage/collider/terminal.lua | 208 +++++ techage/collider/vacuumtube.lua | 130 +++ techage/collider/worker.lua | 210 +++++ techage/doc/guide.lua | 5 + techage/doc/items.lua | 18 +- techage/doc/manual_DE.lua | 365 +++++++- techage/doc/manual_EN.lua | 363 +++++++- techage/doc/plans.lua | 31 + techage/energy_storage/heatexchanger1.lua | 6 +- techage/energy_storage/heatexchanger2.lua | 107 ++- techage/energy_storage/heatexchanger3.lua | 13 +- techage/furnace/cooking.lua | 22 +- techage/icta_controller/commands.lua | 133 ++- techage/init.lua | 50 +- techage/iron_age/meltingpot.lua | 44 +- techage/items/ceramic.lua | 14 + techage/items/cracking.lua | 29 +- techage/items/electronic.lua | 10 + techage/items/petroleum.lua | 28 +- techage/liquids/pump.lua | 29 +- techage/liquids/ta5_tank.lua | 105 +++ techage/liquids/tank.lua | 2 +- techage/locale/techage.de.tr | 254 +++-- techage/locale/template.txt | 243 ++++- techage/logic/button_2x.lua | 252 +++++ techage/logic/button_4x.lua | 27 +- techage/logic/lib.lua | 2 +- techage/logic/mba_detector.lua | 100 ++ techage/logic/movecontroller.lua | 812 ---------------- techage/logic/sequencer2.lua | 5 +- techage/logic/signallamp_2x.lua | 151 +++ techage/logic/signallamp_4x.lua | 182 ++++ techage/logic/terminal.lua | 364 +++++--- techage/manuals/QSG.md | 14 +- techage/manuals/manual_DE.md | 8 +- techage/manuals/manual_EN.md | 8 +- techage/manuals/manual_ta3_DE.md | 12 + techage/manuals/manual_ta3_EN.md | 11 + techage/manuals/manual_ta4_DE.md | 215 ++++- techage/manuals/manual_ta4_EN.md | 218 ++++- techage/manuals/manual_ta5_DE.md | 101 ++ techage/manuals/manual_ta5_EN.md | 97 ++ techage/manuals/markdown2formspec.py | 2 + techage/manuals/ta4_lua_controller_EN.md | 41 +- techage/manuals/ta4_lua_controller_EN.pdf | Bin 354649 -> 391891 bytes techage/manuals/toc_DE.md | 35 +- techage/manuals/toc_EN.md | 34 +- techage/mod.conf | 4 +- .../{logic => move_controller}/doorblock.lua | 0 .../doorcontroller.lua | 0 .../doorcontroller2.lua | 6 +- techage/move_controller/flycontroller.lua | 241 +++++ .../{logic => move_controller}/gateblock.lua | 0 techage/move_controller/movecontroller.lua | 216 +++++ techage/move_controller/soundblock.lua | 128 +++ techage/move_controller/turncontroller.lua | 164 ++++ techage/settingtypes.txt | 6 +- techage/sounds/techage_hum.ogg | Bin 0 -> 11397 bytes techage/sounds/techage_watermill.ogg | Bin 23079 -> 18269 bytes techage/ta1_watermill/watermill.lua | 2 +- techage/ta4_power/laser.lua | 18 +- techage/teleport/teleport_pipe.lua | 191 ++++ techage/teleport/teleport_tube.lua | 180 ++++ techage/textures/techage_aichip.png | Bin 0 -> 297 bytes .../textures/techage_appl_movecontroller.png | Bin 642 -> 133 bytes techage/textures/techage_appl_recipeblock.png | Bin 0 -> 144 bytes techage/textures/techage_appl_sound.png | Bin 0 -> 146 bytes techage/textures/techage_appl_tele_pipe.png | Bin 0 -> 138 bytes techage/textures/techage_appl_tele_tube.png | Bin 0 -> 175 bytes techage/textures/techage_appl_teleport.png | Bin 0 -> 163 bytes techage/textures/techage_appl_turn.png | Bin 0 -> 149 bytes .../techage_collider_detector_appl.png | Bin 0 -> 135 bytes .../techage_collider_detector_banner.png | Bin 0 -> 124 bytes .../techage_collider_detector_core.png | Bin 0 -> 490 bytes techage/textures/techage_collider_magnet.png | Bin 0 -> 168 bytes .../textures/techage_collider_magnet_appl.png | Bin 0 -> 153 bytes .../textures/techage_collider_magnet_sign.png | Bin 0 -> 138 bytes .../textures/techage_collider_magnet_tube.png | Bin 0 -> 123 bytes techage/textures/techage_collider_plan.png | Bin 0 -> 585 bytes techage/textures/techage_collider_tube.png | Bin 0 -> 223 bytes .../textures/techage_collider_tube_open.png | Bin 0 -> 289 bytes techage/textures/techage_frame_ta5.png | Bin 0 -> 167 bytes techage/textures/techage_frame_ta5_top.png | Bin 0 -> 146 bytes techage/textures/techage_isobutane_inv.png | Bin 0 -> 574 bytes techage/textures/techage_round_ceramic.png | Bin 0 -> 435 bytes .../textures/techage_smartline_button_2x.png | Bin 0 -> 190 bytes .../techage_smartline_mba_detector.png | Bin 0 -> 408 bytes .../techage_smartline_mba_detector_inv.png | Bin 0 -> 669 bytes .../textures/techage_smartline_signal_2x.png | Bin 0 -> 175 bytes .../textures/techage_smartline_signal_4x.png | Bin 0 -> 162 bytes .../techage_smartline_signal_amber1.png | Bin 0 -> 108 bytes .../techage_smartline_signal_amber2.png | Bin 0 -> 108 bytes .../techage_smartline_signal_amber3.png | Bin 0 -> 108 bytes .../techage_smartline_signal_amber4.png | Bin 0 -> 108 bytes .../techage_smartline_signal_green1.png | Bin 0 -> 108 bytes .../techage_smartline_signal_green2.png | Bin 0 -> 108 bytes .../techage_smartline_signal_green3.png | Bin 0 -> 108 bytes .../techage_smartline_signal_green4.png | Bin 0 -> 108 bytes .../techage_smartline_signal_off1.png | Bin 0 -> 108 bytes .../techage_smartline_signal_off2.png | Bin 0 -> 108 bytes .../techage_smartline_signal_off3.png | Bin 0 -> 108 bytes .../techage_smartline_signal_off4.png | Bin 0 -> 108 bytes .../techage_smartline_signal_red1.png | Bin 0 -> 108 bytes .../techage_smartline_signal_red2.png | Bin 0 -> 108 bytes .../techage_smartline_signal_red3.png | Bin 0 -> 108 bytes .../techage_smartline_signal_red4.png | Bin 0 -> 108 bytes techage/textures/techage_ta4c.png | Bin 0 -> 7606 bytes techage/tools/repairkit.lua | 22 +- tubelib2/depends.txt | 2 +- tubelib2/init.lua | 4 +- tubelib2/internal1.lua | 2 +- tubelib2/settingtypes.txt | 3 + tubelib2/tube_test.lua | 2 +- 209 files changed, 9106 insertions(+), 3779 deletions(-) delete mode 100644 basic_materials/.gitlab-ci.yml delete mode 100644 basic_materials/.luacheckrc delete mode 100644 basic_materials/LICENSE delete mode 100644 basic_materials/electrical-electronic.lua delete mode 100644 basic_materials/init.lua delete mode 100644 basic_materials/locale/basic_materials.de.tr delete mode 100644 basic_materials/locale/basic_materials.fr.tr delete mode 100644 basic_materials/locale/basic_materials.it.tr delete mode 100644 basic_materials/locale/basic_materials.ru.tr delete mode 100644 basic_materials/metals.lua delete mode 100644 basic_materials/misc.lua delete mode 100644 basic_materials/mod.conf delete mode 100644 basic_materials/models/basic_materials_chains.obj delete mode 100644 basic_materials/plastics.lua delete mode 100644 basic_materials/textures/basic_materials_brass_block.png delete mode 100644 basic_materials/textures/basic_materials_brass_ingot.png delete mode 100644 basic_materials/textures/basic_materials_cement_block.png delete mode 100644 basic_materials/textures/basic_materials_chain_brass.png delete mode 100644 basic_materials/textures/basic_materials_chain_brass_inv.png delete mode 100644 basic_materials/textures/basic_materials_chain_steel.png delete mode 100644 basic_materials/textures/basic_materials_chain_steel_inv.png delete mode 100644 basic_materials/textures/basic_materials_chainlink_brass.png delete mode 100644 basic_materials/textures/basic_materials_chainlink_steel.png delete mode 100644 basic_materials/textures/basic_materials_concrete_block.png delete mode 100644 basic_materials/textures/basic_materials_copper_strip.png delete mode 100644 basic_materials/textures/basic_materials_copper_wire.png delete mode 100644 basic_materials/textures/basic_materials_empty_spool.png delete mode 100644 basic_materials/textures/basic_materials_energy_crystal.png delete mode 100644 basic_materials/textures/basic_materials_gear_steel.png delete mode 100644 basic_materials/textures/basic_materials_gold_wire.png delete mode 100644 basic_materials/textures/basic_materials_heating_element.png delete mode 100644 basic_materials/textures/basic_materials_ic.png delete mode 100644 basic_materials/textures/basic_materials_motor.png delete mode 100644 basic_materials/textures/basic_materials_oil_extract.png delete mode 100644 basic_materials/textures/basic_materials_padlock.png delete mode 100644 basic_materials/textures/basic_materials_paraffin.png delete mode 100644 basic_materials/textures/basic_materials_plastic_sheet.png delete mode 100644 basic_materials/textures/basic_materials_plastic_strip.png delete mode 100644 basic_materials/textures/basic_materials_silicon.png delete mode 100644 basic_materials/textures/basic_materials_silver_wire.png delete mode 100644 basic_materials/textures/basic_materials_steel_bar.png delete mode 100644 basic_materials/textures/basic_materials_steel_strip.png delete mode 100644 basic_materials/textures/basic_materials_steel_wire.png delete mode 100644 basic_materials/textures/basic_materials_terracotta_base.png delete mode 100644 basic_materials/textures/basic_materials_wet_cement.png create mode 100644 techage/basic_machines/recipeblock.lua create mode 100644 techage/basic_machines/ta5_chest.lua create mode 100644 techage/basis/fly_lib.lua create mode 100644 techage/basis/hyperloop.lua create mode 100644 techage/basis/mark_lib.lua create mode 100644 techage/basis/oggfiles.lua create mode 100644 techage/basis/shared_inv.lua create mode 100644 techage/basis/shared_tank.lua rename techage/{tools => basis}/submenu.lua (84%) create mode 100644 techage/basis/teleport.lua create mode 100644 techage/collider/cooler.lua create mode 100644 techage/collider/detector.lua create mode 100644 techage/collider/inlets.lua create mode 100644 techage/collider/magnet.lua create mode 100644 techage/collider/terminal.lua create mode 100644 techage/collider/vacuumtube.lua create mode 100644 techage/collider/worker.lua create mode 100644 techage/liquids/ta5_tank.lua create mode 100644 techage/logic/button_2x.lua create mode 100644 techage/logic/mba_detector.lua delete mode 100644 techage/logic/movecontroller.lua create mode 100644 techage/logic/signallamp_2x.lua create mode 100644 techage/logic/signallamp_4x.lua create mode 100644 techage/manuals/manual_ta5_DE.md create mode 100644 techage/manuals/manual_ta5_EN.md rename techage/{logic => move_controller}/doorblock.lua (100%) rename techage/{logic => move_controller}/doorcontroller.lua (100%) rename techage/{logic => move_controller}/doorcontroller2.lua (98%) create mode 100644 techage/move_controller/flycontroller.lua rename techage/{logic => move_controller}/gateblock.lua (100%) create mode 100644 techage/move_controller/movecontroller.lua create mode 100644 techage/move_controller/soundblock.lua create mode 100644 techage/move_controller/turncontroller.lua create mode 100644 techage/sounds/techage_hum.ogg create mode 100644 techage/teleport/teleport_pipe.lua create mode 100644 techage/teleport/teleport_tube.lua create mode 100644 techage/textures/techage_aichip.png create mode 100644 techage/textures/techage_appl_recipeblock.png create mode 100644 techage/textures/techage_appl_sound.png create mode 100644 techage/textures/techage_appl_tele_pipe.png create mode 100644 techage/textures/techage_appl_tele_tube.png create mode 100644 techage/textures/techage_appl_teleport.png create mode 100644 techage/textures/techage_appl_turn.png create mode 100644 techage/textures/techage_collider_detector_appl.png create mode 100644 techage/textures/techage_collider_detector_banner.png create mode 100644 techage/textures/techage_collider_detector_core.png create mode 100644 techage/textures/techage_collider_magnet.png create mode 100644 techage/textures/techage_collider_magnet_appl.png create mode 100644 techage/textures/techage_collider_magnet_sign.png create mode 100644 techage/textures/techage_collider_magnet_tube.png create mode 100644 techage/textures/techage_collider_plan.png create mode 100644 techage/textures/techage_collider_tube.png create mode 100644 techage/textures/techage_collider_tube_open.png create mode 100644 techage/textures/techage_frame_ta5.png create mode 100644 techage/textures/techage_frame_ta5_top.png create mode 100644 techage/textures/techage_isobutane_inv.png create mode 100644 techage/textures/techage_round_ceramic.png create mode 100644 techage/textures/techage_smartline_button_2x.png create mode 100644 techage/textures/techage_smartline_mba_detector.png create mode 100644 techage/textures/techage_smartline_mba_detector_inv.png create mode 100644 techage/textures/techage_smartline_signal_2x.png create mode 100644 techage/textures/techage_smartline_signal_4x.png create mode 100644 techage/textures/techage_smartline_signal_amber1.png create mode 100644 techage/textures/techage_smartline_signal_amber2.png create mode 100644 techage/textures/techage_smartline_signal_amber3.png create mode 100644 techage/textures/techage_smartline_signal_amber4.png create mode 100644 techage/textures/techage_smartline_signal_green1.png create mode 100644 techage/textures/techage_smartline_signal_green2.png create mode 100644 techage/textures/techage_smartline_signal_green3.png create mode 100644 techage/textures/techage_smartline_signal_green4.png create mode 100644 techage/textures/techage_smartline_signal_off1.png create mode 100644 techage/textures/techage_smartline_signal_off2.png create mode 100644 techage/textures/techage_smartline_signal_off3.png create mode 100644 techage/textures/techage_smartline_signal_off4.png create mode 100644 techage/textures/techage_smartline_signal_red1.png create mode 100644 techage/textures/techage_smartline_signal_red2.png create mode 100644 techage/textures/techage_smartline_signal_red3.png create mode 100644 techage/textures/techage_smartline_signal_red4.png create mode 100644 techage/textures/techage_ta4c.png create mode 100644 tubelib2/settingtypes.txt diff --git a/basic_materials/.gitlab-ci.yml b/basic_materials/.gitlab-ci.yml deleted file mode 100644 index ff51e7e..0000000 --- a/basic_materials/.gitlab-ci.yml +++ /dev/null @@ -1,8 +0,0 @@ -stages: - - test - -luacheck: - stage: test - image: pipelinecomponents/luacheck:latest - script: - - luacheck . diff --git a/basic_materials/.luacheckrc b/basic_materials/.luacheckrc deleted file mode 100644 index 55879b0..0000000 --- a/basic_materials/.luacheckrc +++ /dev/null @@ -1,30 +0,0 @@ -std = "lua51+minetest" -unused_args = false -allow_defined_top = true -max_line_length = 999 - -stds.minetest = { - read_globals = { - "DIR_DELIM", - "minetest", - "core", - "dump", - "vector", - "nodeupdate", - "VoxelManip", - "VoxelArea", - "PseudoRandom", - "ItemStack", - "default", - table = { - fields = { - "copy", - }, - }, - } -} - -read_globals = { - "default", - "moreores", -} diff --git a/basic_materials/LICENSE b/basic_materials/LICENSE deleted file mode 100644 index c5885ae..0000000 --- a/basic_materials/LICENSE +++ /dev/null @@ -1,600 +0,0 @@ -License for code: LGPL 3.0 -License for media and all other assets: CC-by-SA 4.0 - -############################################################################### - - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. - -############################################################################### - -Attribution-ShareAlike 4.0 International - -======================================================================= - -Creative Commons Corporation ("Creative Commons") is not a law firm and -does not provide legal services or legal advice. Distribution of -Creative Commons public licenses does not create a lawyer-client or -other relationship. Creative Commons makes its licenses and related -information available on an "as-is" basis. Creative Commons gives no -warranties regarding its licenses, any material licensed under their -terms and conditions, or any related information. Creative Commons -disclaims all liability for damages resulting from their use to the -fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and -conditions that creators and other rights holders may use to share -original works of authorship and other material subject to copyright -and certain other rights specified in the public license below. The -following considerations are for informational purposes only, are not -exhaustive, and do not form part of our licenses. - - Considerations for licensors: Our public licenses are - intended for use by those authorized to give the public - permission to use material in ways otherwise restricted by - copyright and certain other rights. Our licenses are - irrevocable. Licensors should read and understand the terms - and conditions of the license they choose before applying it. - Licensors should also secure all rights necessary before - applying our licenses so that the public can reuse the - material as expected. Licensors should clearly mark any - material not subject to the license. This includes other CC- - licensed material, or material used under an exception or - limitation to copyright. More considerations for licensors: - wiki.creativecommons.org/Considerations_for_licensors - - Considerations for the public: By using one of our public - licenses, a licensor grants the public permission to use the - licensed material under specified terms and conditions. If - the licensor's permission is not necessary for any reason--for - example, because of any applicable exception or limitation to - copyright--then that use is not regulated by the license. Our - licenses grant only permissions under copyright and certain - other rights that a licensor has authority to grant. Use of - the licensed material may still be restricted for other - reasons, including because others have copyright or other - rights in the material. A licensor may make special requests, - such as asking that all changes be marked or described. - Although not required by our licenses, you are encouraged to - respect those requests where reasonable. More considerations - for the public: - wiki.creativecommons.org/Considerations_for_licensees - -======================================================================= - -Creative Commons Attribution-ShareAlike 4.0 International Public -License - -By exercising the Licensed Rights (defined below), You accept and agree -to be bound by the terms and conditions of this Creative Commons -Attribution-ShareAlike 4.0 International Public License ("Public -License"). To the extent this Public License may be interpreted as a -contract, You are granted the Licensed Rights in consideration of Your -acceptance of these terms and conditions, and the Licensor grants You -such rights in consideration of benefits the Licensor receives from -making the Licensed Material available under these terms and -conditions. - - -Section 1 -- Definitions. - - a. Adapted Material means material subject to Copyright and Similar - Rights that is derived from or based upon the Licensed Material - and in which the Licensed Material is translated, altered, - arranged, transformed, or otherwise modified in a manner requiring - permission under the Copyright and Similar Rights held by the - Licensor. For purposes of this Public License, where the Licensed - Material is a musical work, performance, or sound recording, - Adapted Material is always produced where the Licensed Material is - synched in timed relation with a moving image. - - b. Adapter's License means the license You apply to Your Copyright - and Similar Rights in Your contributions to Adapted Material in - accordance with the terms and conditions of this Public License. - - c. BY-SA Compatible License means a license listed at - creativecommons.org/compatiblelicenses, approved by Creative - Commons as essentially the equivalent of this Public License. - - d. Copyright and Similar Rights means copyright and/or similar rights - closely related to copyright including, without limitation, - performance, broadcast, sound recording, and Sui Generis Database - Rights, without regard to how the rights are labeled or - categorized. For purposes of this Public License, the rights - specified in Section 2(b)(1)-(2) are not Copyright and Similar - Rights. - - e. Effective Technological Measures means those measures that, in the - absence of proper authority, may not be circumvented under laws - fulfilling obligations under Article 11 of the WIPO Copyright - Treaty adopted on December 20, 1996, and/or similar international - agreements. - - f. Exceptions and Limitations means fair use, fair dealing, and/or - any other exception or limitation to Copyright and Similar Rights - that applies to Your use of the Licensed Material. - - g. License Elements means the license attributes listed in the name - of a Creative Commons Public License. The License Elements of this - Public License are Attribution and ShareAlike. - - h. Licensed Material means the artistic or literary work, database, - or other material to which the Licensor applied this Public - License. - - i. Licensed Rights means the rights granted to You subject to the - terms and conditions of this Public License, which are limited to - all Copyright and Similar Rights that apply to Your use of the - Licensed Material and that the Licensor has authority to license. - - j. Licensor means the individual(s) or entity(ies) granting rights - under this Public License. - - k. Share means to provide material to the public by any means or - process that requires permission under the Licensed Rights, such - as reproduction, public display, public performance, distribution, - dissemination, communication, or importation, and to make material - available to the public including in ways that members of the - public may access the material from a place and at a time - individually chosen by them. - - l. Sui Generis Database Rights means rights other than copyright - resulting from Directive 96/9/EC of the European Parliament and of - the Council of 11 March 1996 on the legal protection of databases, - as amended and/or succeeded, as well as other essentially - equivalent rights anywhere in the world. - - m. You means the individual or entity exercising the Licensed Rights - under this Public License. Your has a corresponding meaning. - - -Section 2 -- Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, - the Licensor hereby grants You a worldwide, royalty-free, - non-sublicensable, non-exclusive, irrevocable license to - exercise the Licensed Rights in the Licensed Material to: - - a. reproduce and Share the Licensed Material, in whole or - in part; and - - b. produce, reproduce, and Share Adapted Material. - - 2. Exceptions and Limitations. For the avoidance of doubt, where - Exceptions and Limitations apply to Your use, this Public - License does not apply, and You do not need to comply with - its terms and conditions. - - 3. Term. The term of this Public License is specified in Section - 6(a). - - 4. Media and formats; technical modifications allowed. The - Licensor authorizes You to exercise the Licensed Rights in - all media and formats whether now known or hereafter created, - and to make technical modifications necessary to do so. The - Licensor waives and/or agrees not to assert any right or - authority to forbid You from making technical modifications - necessary to exercise the Licensed Rights, including - technical modifications necessary to circumvent Effective - Technological Measures. For purposes of this Public License, - simply making modifications authorized by this Section 2(a) - (4) never produces Adapted Material. - - 5. Downstream recipients. - - a. Offer from the Licensor -- Licensed Material. Every - recipient of the Licensed Material automatically - receives an offer from the Licensor to exercise the - Licensed Rights under the terms and conditions of this - Public License. - - b. Additional offer from the Licensor -- Adapted Material. - Every recipient of Adapted Material from You - automatically receives an offer from the Licensor to - exercise the Licensed Rights in the Adapted Material - under the conditions of the Adapter's License You apply. - - c. No downstream restrictions. You may not offer or impose - any additional or different terms or conditions on, or - apply any Effective Technological Measures to, the - Licensed Material if doing so restricts exercise of the - Licensed Rights by any recipient of the Licensed - Material. - - 6. No endorsement. Nothing in this Public License constitutes or - may be construed as permission to assert or imply that You - are, or that Your use of the Licensed Material is, connected - with, or sponsored, endorsed, or granted official status by, - the Licensor or others designated to receive attribution as - provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not - licensed under this Public License, nor are publicity, - privacy, and/or other similar personality rights; however, to - the extent possible, the Licensor waives and/or agrees not to - assert any such rights held by the Licensor to the limited - extent necessary to allow You to exercise the Licensed - Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this - Public License. - - 3. To the extent possible, the Licensor waives any right to - collect royalties from You for the exercise of the Licensed - Rights, whether directly or through a collecting society - under any voluntary or waivable statutory or compulsory - licensing scheme. In all other cases the Licensor expressly - reserves any right to collect such royalties. - - -Section 3 -- License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the -following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material (including in modified - form), You must: - - a. retain the following if it is supplied by the Licensor - with the Licensed Material: - - i. identification of the creator(s) of the Licensed - Material and any others designated to receive - attribution, in any reasonable manner requested by - the Licensor (including by pseudonym if - designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of - warranties; - - v. a URI or hyperlink to the Licensed Material to the - extent reasonably practicable; - - b. indicate if You modified the Licensed Material and - retain an indication of any previous modifications; and - - c. indicate the Licensed Material is licensed under this - Public License, and include the text of, or the URI or - hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any - reasonable manner based on the medium, means, and context in - which You Share the Licensed Material. For example, it may be - reasonable to satisfy the conditions by providing a URI or - hyperlink to a resource that includes the required - information. - - 3. If requested by the Licensor, You must remove any of the - information required by Section 3(a)(1)(A) to the extent - reasonably practicable. - - b. ShareAlike. - - In addition to the conditions in Section 3(a), if You Share - Adapted Material You produce, the following conditions also apply. - - 1. The Adapter's License You apply must be a Creative Commons - license with the same License Elements, this version or - later, or a BY-SA Compatible License. - - 2. You must include the text of, or the URI or hyperlink to, the - Adapter's License You apply. You may satisfy this condition - in any reasonable manner based on the medium, means, and - context in which You Share Adapted Material. - - 3. You may not offer or impose any additional or different terms - or conditions on, or apply any Effective Technological - Measures to, Adapted Material that restrict exercise of the - rights granted under the Adapter's License You apply. - - -Section 4 -- Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that -apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right - to extract, reuse, reproduce, and Share all or a substantial - portion of the contents of the database; - - b. if You include all or a substantial portion of the database - contents in a database in which You have Sui Generis Database - Rights, then the database in which You have Sui Generis Database - Rights (but not its individual contents) is Adapted Material, - - including for purposes of Section 3(b); and - c. You must comply with the conditions in Section 3(a) if You Share - all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not -replace Your obligations under this Public License where the Licensed -Rights include other Copyright and Similar Rights. - - -Section 5 -- Disclaimer of Warranties and Limitation of Liability. - - a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE - EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS - AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF - ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, - IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, - WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, - ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT - KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT - ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. - - b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE - TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, - NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, - INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, - COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR - USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR - DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR - IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. - - c. The disclaimer of warranties and limitation of liability provided - above shall be interpreted in a manner that, to the extent - possible, most closely approximates an absolute disclaimer and - waiver of all liability. - - -Section 6 -- Term and Termination. - - a. This Public License applies for the term of the Copyright and - Similar Rights licensed here. However, if You fail to comply with - this Public License, then Your rights under this Public License - terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under - Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided - it is cured within 30 days of Your discovery of the - violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any - right the Licensor may have to seek remedies for Your violations - of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the - Licensed Material under separate terms or conditions or stop - distributing the Licensed Material at any time; however, doing so - will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public - License. - - -Section 7 -- Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different - terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the - Licensed Material not stated herein are separate from and - independent of the terms and conditions of this Public License. - - -Section 8 -- Interpretation. - - a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Material that could lawfully - be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is - deemed unenforceable, it shall be automatically reformed to the - minimum extent necessary to make it enforceable. If the provision - cannot be reformed, it shall be severed from this Public License - without affecting the enforceability of the remaining terms and - conditions. - - c. No term or condition of this Public License will be waived and no - failure to comply consented to unless expressly agreed to by the - Licensor. - - d. Nothing in this Public License constitutes or may be interpreted - as a limitation upon, or waiver of, any privileges and immunities - that apply to the Licensor or You, including from the legal - processes of any jurisdiction or authority. - - -======================================================================= - -Creative Commons is not a party to its public -licenses. Notwithstanding, Creative Commons may elect to apply one of -its public licenses to material it publishes and in those instances -will be considered the “Licensor.” The text of the Creative Commons -public licenses is dedicated to the public domain under the CC0 Public -Domain Dedication. Except for the limited purpose of indicating that -material is shared under a Creative Commons public license or as -otherwise permitted by the Creative Commons policies published at -creativecommons.org/policies, Creative Commons does not authorize the -use of the trademark "Creative Commons" or any other trademark or logo -of Creative Commons without its prior written consent including, -without limitation, in connection with any unauthorized modifications -to any of its public licenses or any other arrangements, -understandings, or agreements concerning use of licensed material. For -the avoidance of doubt, this paragraph does not form part of the -public licenses. - -Creative Commons may be contacted at creativecommons.org. diff --git a/basic_materials/electrical-electronic.lua b/basic_materials/electrical-electronic.lua deleted file mode 100644 index 91fac4e..0000000 --- a/basic_materials/electrical-electronic.lua +++ /dev/null @@ -1,86 +0,0 @@ --- Translation support -local S = minetest.get_translator("basic_materials") - --- items - -minetest.register_craftitem("basic_materials:silicon", { - description = S("Silicon lump"), - inventory_image = "basic_materials_silicon.png", -}) - -minetest.register_craftitem("basic_materials:ic", { - description = S("Simple Integrated Circuit"), - inventory_image = "basic_materials_ic.png", -}) - -minetest.register_craftitem("basic_materials:motor", { - description = S("Simple Motor"), - inventory_image = "basic_materials_motor.png", -}) - -minetest.register_craftitem("basic_materials:heating_element", { - description = S("Heating element"), - inventory_image = "basic_materials_heating_element.png", -}) - -minetest.register_craftitem("basic_materials:energy_crystal_simple", { - description = S("Simple energy crystal"), - inventory_image = "basic_materials_energy_crystal.png", -}) - --- crafts - -minetest.register_craft( { - output = "mesecons_materials:silicon 4", - recipe = { - { "default:sand", "default:sand" }, - { "default:sand", "default:steel_ingot" }, - }, -}) - -minetest.register_craft( { - output = "basic_materials:ic 4", - recipe = { - { "mesecons_materials:silicon", "mesecons_materials:silicon" }, - { "mesecons_materials:silicon", "default:copper_ingot" }, - }, -}) - -minetest.register_craft( { - output = "basic_materials:motor 2", - recipe = { - { "default:mese_crystal_fragment", "basic_materials:copper_wire", "basic_materials:plastic_sheet" }, - { "default:copper_ingot", "default:steel_ingot", "default:steel_ingot" }, - { "default:mese_crystal_fragment", "basic_materials:copper_wire", "basic_materials:plastic_sheet" } - }, - replacements = { - { "basic_materials:copper_wire", "basic_materials:empty_spool" }, - { "basic_materials:copper_wire", "basic_materials:empty_spool" }, - } -}) - -minetest.register_craft( { - output = "basic_materials:heating_element 2", - recipe = { - { "default:copper_ingot", "default:mese_crystal_fragment", "default:copper_ingot" } - }, -}) - -minetest.register_craft({ - --type = "shapeless", - output = "basic_materials:energy_crystal_simple 2", - recipe = { - { "default:mese_crystal_fragment", "default:torch", "default:mese_crystal_fragment" }, - { "default:diamond", "default:gold_ingot", "default:diamond" } - }, -}) - --- aliases - -minetest.register_alias("homedecor:ic", "basic_materials:ic") -minetest.register_alias("homedecor:motor", "basic_materials:motor") -minetest.register_alias("technic:motor", "basic_materials:motor") -minetest.register_alias("homedecor:heating_element", "basic_materials:heating_element") -minetest.register_alias("homedecor:power_crystal", "basic_materials:energy_crystal_simple") - -minetest.register_alias_force("mesecons_materials:silicon", "basic_materials:silicon") diff --git a/basic_materials/init.lua b/basic_materials/init.lua deleted file mode 100644 index 348c059..0000000 --- a/basic_materials/init.lua +++ /dev/null @@ -1,15 +0,0 @@ --- Basic materials mod --- by Vanessa Dannenberg - --- This mod supplies all those little random craft items that everyone always --- seems to need, such as metal bars (ala rebar), plastic, wire, and so on. - -local modpath = minetest.get_modpath("basic_materials") - -basic_materials = {} -basic_materials.mod = { author = "Vanessa Dannenberg" } - -dofile(modpath.."/metals.lua") -dofile(modpath.."/plastics.lua") -dofile(modpath.."/electrical-electronic.lua") -dofile(modpath.."/misc.lua") diff --git a/basic_materials/locale/basic_materials.de.tr b/basic_materials/locale/basic_materials.de.tr deleted file mode 100644 index 8fddd8a..0000000 --- a/basic_materials/locale/basic_materials.de.tr +++ /dev/null @@ -1,33 +0,0 @@ -# textdomain: basic_materials -Silicon lump=Siliziumklumpen -Simple Integrated Circuit=Einfacher Integrierter Schaltkreis -Simple Motor=Einfacher Motor -Heating element=Heizelement -Simple energy crystal=Einfacher Energiekristall - -Spool of steel wire=Spule mit Stahldraht -Spool of copper wire=Spule mit Kupferdraht -Spool of silver wire=Spule mit Silberdraht -Spool of gold wire=Spule mit Golddraht -Steel Strip=Stahlstreifen -Copper Strip=Kupferstreifen -Steel Bar=Stahlstab -Chainlinks (brass)=Messingkettenglieder -Chainlinks (steel)=Stahlkettenglieder -Brass Ingot=Messingbarren -Steel gear=Stahlzahnrad -Padlock=Vorhängeschloss -Chain (steel, hanging)=Hängende Stahlkette -Chain (brass, hanging)=Hängende Messingkette -Brass Block=Messingblock - -Oil extract=Ölextrakt -Unprocessed paraffin=Unverarbeitetes Paraffin -Uncooked Terracotta Base=Ungebranntes Terrakotta -Wet Cement=Nasser Zement -Cement=Zement -Concrete Block=Betonblock - -Plastic sheet=Kunststoffplatte -Plastic strips=Kunststoffstreifen -Empty wire spool=Leere Drahtspule diff --git a/basic_materials/locale/basic_materials.fr.tr b/basic_materials/locale/basic_materials.fr.tr deleted file mode 100644 index 0bebf79..0000000 --- a/basic_materials/locale/basic_materials.fr.tr +++ /dev/null @@ -1,33 +0,0 @@ -# textdomain: basic_materials -Silicon lump=Morceau de silicium -Simple Integrated Circuit=Circuit intégré simple -Simple Motor=Moteur simple -Heating element=Élément chauffant -Simple energy crystal=Cristal d’énergie simple - -Spool of steel wire=Bobine de fil d’acier -Spool of copper wire=Bobine de fil de cuivre -Spool of silver wire=Bobine de fil d’argent -Spool of gold wire=Bobine de fil d’or -Steel Strip=Bande de acier -Copper Strip=Bande de cuivre -Steel Bar=Barre d’acier -Chainlinks (brass)=Maillon en laiton -Chainlinks (steel)=Maillon en acier -Brass Ingot=Lingot de laiton -Steel gear=Rouage en acier -Padlock=Cadenas -Chain (steel, hanging)=Chaine en acier -Chain (brass, hanging)=Chaine en laiton -Brass Block=Bloc de laiton - -Oil extract=Extrait d’huile -Unprocessed paraffin=Paraffine non transformée -Uncooked Terracotta Base=Argile crue -Wet Cement=Ciment humide -Cement=Ciment -Concrete Block=Bloc de béton - -Plastic sheet=Morceau de plastique -Plastic strips=Bande de plastique -Empty wire spool=Bobine de fil vide diff --git a/basic_materials/locale/basic_materials.it.tr b/basic_materials/locale/basic_materials.it.tr deleted file mode 100644 index aae0b3b..0000000 --- a/basic_materials/locale/basic_materials.it.tr +++ /dev/null @@ -1,34 +0,0 @@ -# textdomain: basic_materials -# Author: Salvo 'LtWorf' Tomaselli -Silicon lump=Grumo di silicio -Simple Integrated Circuit=Circuito integrato semplice -Simple Motor=Motore semplice -Heating element=Elemento riscaldante -Simple energy crystal=Cristallo di energia semplice - -Spool of steel wire=Bobina di filo d'acciaio -Spool of copper wire=Bobina di filo di rame -Spool of silver wire=Bobina di filo d'argento -Spool of gold wire=Bobina di filo d'oro -Steel Strip=Striscia d'acciaio -Copper Strip=Striscia di rame -Steel Bar=Barra d'acciaio -Chainlinks (brass)=Catena (ottone) -Chainlinks (steel)=Catena (acciaio) -Brass Ingot=Lingotto di ottone -Steel gear=Ingranaggio d'acciaio -Padlock=Catenaccio -Chain (steel, hanging)=Catena (acciaio, pendente) -Chain (brass, hanging)=Catena (ottone, pendente) -Brass Block=Blocco di ottone - -Oil extract=Estratto d'olio -Unprocessed paraffin=Paraffina grezza -Uncooked Terracotta Base=Argilla cruda -Wet Cement=Cemento umido -Cement=Cemento -Concrete Block=Blocco di calcestruzzo - -Plastic sheet=Foglio di plastica -Plastic strips=Striscia di plastica -Empty wire spool=Rocchetto vuoto diff --git a/basic_materials/locale/basic_materials.ru.tr b/basic_materials/locale/basic_materials.ru.tr deleted file mode 100644 index 85e9c0c..0000000 --- a/basic_materials/locale/basic_materials.ru.tr +++ /dev/null @@ -1,33 +0,0 @@ -# textdomain: basic_materials -Silicon lump=Кусок Кремния -Simple Integrated Circuit=Микросхема -Simple Motor=Мотор -Heating element=Нить Накала -Simple energy crystal=Энергетический Кристалл - -Spool of steel wire=Катушка Стальной Проволоки -Spool of copper wire=Катушка Медной Проволоки -Spool of silver wire=Катушка Серебрянной Проволоки -Spool of gold wire=Катушка Золотой Проволоки -Steel Strip=Стальная Полоса -Copper Strip=Медная Полоса -Steel Bar=Стальной Прут -Chainlinks (brass)=Латунные Звенья -Chainlinks (steel)=Стальные Звенья -Brass Ingot=Латунный Брусок -Steel gear=Стальная Шестерня -Padlock=Навесной Замок -Chain (steel, hanging)=Стальная Цепь -Chain (brass, hanging)=Латунная Цепь -Brass Block=Латунный Блок - -Oil extract=Масляный Экстракт -Unprocessed paraffin=Необработанный Парафин -Uncooked Terracotta Base=Ком Мокрого Терракота -Wet Cement=Ком Мокрого Цемента -Cement=Цемент -Concrete Block=Железобетон - -Plastic sheet=Пластиковый Лист -Plastic strips=Пластиковая Полоса -Empty wire spool=Пустая Катушка diff --git a/basic_materials/metals.lua b/basic_materials/metals.lua deleted file mode 100644 index 0a3243b..0000000 --- a/basic_materials/metals.lua +++ /dev/null @@ -1,300 +0,0 @@ --- Translation support -local S = minetest.get_translator("basic_materials") - --- items - -minetest.register_craftitem("basic_materials:steel_wire", { - description = S("Spool of steel wire"), - groups = { wire = 1 }, - inventory_image = "basic_materials_steel_wire.png" -}) - -minetest.register_craftitem("basic_materials:copper_wire", { - description = S("Spool of copper wire"), - groups = { wire = 1 }, - inventory_image = "basic_materials_copper_wire.png" -}) - -minetest.register_craftitem("basic_materials:silver_wire", { - description = S("Spool of silver wire"), - groups = { wire = 1 }, - inventory_image = "basic_materials_silver_wire.png" -}) - -minetest.register_craftitem("basic_materials:gold_wire", { - description = S("Spool of gold wire"), - groups = { wire = 1 }, - inventory_image = "basic_materials_gold_wire.png" -}) - -minetest.register_craftitem("basic_materials:steel_strip", { - description = S("Steel Strip"), - groups = { strip = 1 }, - inventory_image = "basic_materials_steel_strip.png" -}) - -minetest.register_craftitem("basic_materials:copper_strip", { - description = S("Copper Strip"), - groups = { strip = 1 }, - inventory_image = "basic_materials_copper_strip.png" -}) - -minetest.register_craftitem("basic_materials:steel_bar", { - description = S("Steel Bar"), - inventory_image = "basic_materials_steel_bar.png", -}) - -minetest.register_craftitem("basic_materials:chainlink_brass", { - description = S("Chainlinks (brass)"), - groups = { chainlinks = 1 }, - inventory_image = "basic_materials_chainlink_brass.png" -}) - -minetest.register_craftitem("basic_materials:chainlink_steel", { - description = S("Chainlinks (steel)"), - groups = { chainlinks = 1 }, - inventory_image = "basic_materials_chainlink_steel.png" -}) - -minetest.register_craftitem("basic_materials:brass_ingot", { - description = S("Brass Ingot"), - inventory_image = "basic_materials_brass_ingot.png", -}) - -minetest.register_craftitem("basic_materials:gear_steel", { - description = S("Steel gear"), - inventory_image = "basic_materials_gear_steel.png" -}) - -minetest.register_craftitem("basic_materials:padlock", { - description = S("Padlock"), - inventory_image = "basic_materials_padlock.png" -}) - --- nodes - -local chains_sbox = { - type = "fixed", - fixed = { -0.1, -0.5, -0.1, 0.1, 0.5, 0.1 } -} - -minetest.register_node("basic_materials:chain_steel", { - description = S("Chain (steel, hanging)"), - drawtype = "mesh", - mesh = "basic_materials_chains.obj", - tiles = {"basic_materials_chain_steel.png"}, - walkable = false, - climbable = true, - sunlight_propagates = true, - paramtype = "light", - inventory_image = "basic_materials_chain_steel_inv.png", - groups = {cracky=3}, - selection_box = chains_sbox, -}) - -minetest.register_node("basic_materials:chain_brass", { - description = S("Chain (brass, hanging)"), - drawtype = "mesh", - mesh = "basic_materials_chains.obj", - tiles = {"basic_materials_chain_brass.png"}, - walkable = false, - climbable = true, - sunlight_propagates = true, - paramtype = "light", - inventory_image = "basic_materials_chain_brass_inv.png", - groups = {cracky=3}, - selection_box = chains_sbox, -}) - -minetest.register_node("basic_materials:brass_block", { - description = S("Brass Block"), - tiles = { "basic_materials_brass_block.png" }, - is_ground_content = false, - groups = {cracky=1, level=2}, - sounds = default.node_sound_metal_defaults() -}) - --- crafts - -minetest.register_craft( { - output = "basic_materials:copper_wire 2", - type = "shapeless", - recipe = { - "default:copper_ingot", - "basic_materials:empty_spool", - "basic_materials:empty_spool", - }, -}) - -minetest.register_craft( { - output = "basic_materials:silver_wire 2", - type = "shapeless", - recipe = { - "moreores:silver_ingot", - "basic_materials:empty_spool", - "basic_materials:empty_spool", - }, -}) - -minetest.register_craft( { - output = "basic_materials:gold_wire 2", - type = "shapeless", - recipe = { - "default:gold_ingot", - "basic_materials:empty_spool", - "basic_materials:empty_spool", - }, -}) - -minetest.register_craft( { - output = "basic_materials:steel_wire 2", - type = "shapeless", - recipe = { - "default:steel_ingot", - "basic_materials:empty_spool", - "basic_materials:empty_spool", - }, -}) - -minetest.register_craft( { - output = "basic_materials:steel_strip 12", - recipe = { - { "", "default:steel_ingot", "" }, - { "default:steel_ingot", "", "" }, - }, -}) - -minetest.register_craft( { - output = "basic_materials:copper_strip 12", - recipe = { - { "", "default:copper_ingot", "" }, - { "default:copper_ingot", "", "" }, - }, -}) - -minetest.register_craft( { - output = "basic_materials:steel_bar 6", - recipe = { - { "", "", "default:steel_ingot" }, - { "", "default:steel_ingot", "" }, - { "default:steel_ingot", "", "" }, - }, -}) - -minetest.register_craft( { - output = "basic_materials:padlock 2", - recipe = { - { "basic_materials:steel_bar" }, - { "default:steel_ingot" }, - { "default:steel_ingot" }, - }, -}) - -minetest.register_craft({ - output = "basic_materials:chainlink_steel 12", - recipe = { - {"", "default:steel_ingot", "default:steel_ingot"}, - { "default:steel_ingot", "", "default:steel_ingot" }, - { "default:steel_ingot", "default:steel_ingot", "" }, - }, -}) - -minetest.register_craft({ - output = "basic_materials:chainlink_brass 12", - recipe = { - {"", "basic_materials:brass_ingot", "basic_materials:brass_ingot"}, - { "basic_materials:brass_ingot", "", "basic_materials:brass_ingot" }, - { "basic_materials:brass_ingot", "basic_materials:brass_ingot", "" }, - }, -}) - -minetest.register_craft({ - output = 'basic_materials:chain_steel 2', - recipe = { - {"basic_materials:chainlink_steel"}, - {"basic_materials:chainlink_steel"}, - {"basic_materials:chainlink_steel"} - } -}) - -minetest.register_craft({ - output = 'basic_materials:chain_brass 2', - recipe = { - {"basic_materials:chainlink_brass"}, - {"basic_materials:chainlink_brass"}, - {"basic_materials:chainlink_brass"} - } -}) - -minetest.register_craft( { - output = "basic_materials:gear_steel 6", - recipe = { - { "", "default:steel_ingot", "" }, - { "default:steel_ingot","basic_materials:chainlink_steel", "default:steel_ingot" }, - { "", "default:steel_ingot", "" } - }, -}) - -minetest.register_craft( { - type = "shapeless", - output = "basic_materials:brass_ingot 3", - recipe = { - "default:copper_ingot", - "default:copper_ingot", - "moreores:silver_ingot", - }, -}) - -if not minetest.get_modpath("moreores") then - -- Without moreores, there still should be a way to create brass. - minetest.register_craft( { - output = "basic_materials:brass_ingot 9", - recipe = { - {"default:copper_ingot", "default:tin_ingot", "default:copper_ingot"}, - {"default:gold_ingot", "default:copper_ingot", "default:gold_ingot"}, - {"default:copper_ingot", "default:tin_ingot", "default:copper_ingot"}, - }, - }) -end - -minetest.register_craft( { - type = "shapeless", - output = "basic_materials:brass_ingot 9", - recipe = { "basic_materials:brass_block" }, -}) - -minetest.register_craft( { - output = "basic_materials:brass_block", - recipe = { - { "basic_materials:brass_ingot", "basic_materials:brass_ingot", "basic_materials:brass_ingot" }, - { "basic_materials:brass_ingot", "basic_materials:brass_ingot", "basic_materials:brass_ingot" }, - { "basic_materials:brass_ingot", "basic_materials:brass_ingot", "basic_materials:brass_ingot" }, - }, -}) - --- aliases - -minetest.register_alias("homedecor:copper_wire", "basic_materials:copper_wire") -minetest.register_alias("technic:fine_copper_wire", "basic_materials:copper_wire") -minetest.register_alias("technic:fine_silver_wire", "basic_materials:silver_wire") -minetest.register_alias("technic:fine_gold_wire", "basic_materials:gold_wire") - -minetest.register_alias("homedecor:steel_wire", "basic_materials:steel_wire") - -minetest.register_alias("homedecor:brass_ingot", "basic_materials:brass_ingot") -minetest.register_alias("technic:brass_ingot", "basic_materials:brass_ingot") -minetest.register_alias("technic:brass_block", "basic_materials:brass_block") - -minetest.register_alias("homedecor:copper_strip", "basic_materials:copper_strip") -minetest.register_alias("homedecor:steel_strip", "basic_materials:steel_strip") - -minetest.register_alias_force("glooptest:chainlink", "basic_materials:chainlink_steel") -minetest.register_alias_force("homedecor:chainlink_steel", "basic_materials:chainlink_steel") -minetest.register_alias("homedecor:chainlink_brass", "basic_materials:chainlink_brass") -minetest.register_alias("chains:chain", "basic_materials:chain_steel") -minetest.register_alias("chains:chain_brass", "basic_materials:chain_brass") - -minetest.register_alias("pipeworks:gear", "basic_materials:gear_steel") - -minetest.register_alias("technic:rebar", "basic_materials:steel_bar") - diff --git a/basic_materials/misc.lua b/basic_materials/misc.lua deleted file mode 100644 index 0012897..0000000 --- a/basic_materials/misc.lua +++ /dev/null @@ -1,126 +0,0 @@ --- Translation support -local S = minetest.get_translator("basic_materials") - --- items - -minetest.register_craftitem("basic_materials:oil_extract", { - description = S("Oil extract"), - inventory_image = "basic_materials_oil_extract.png", -}) - -minetest.register_craftitem("basic_materials:paraffin", { - description = S("Unprocessed paraffin"), - inventory_image = "basic_materials_paraffin.png", -}) - -minetest.register_craftitem("basic_materials:terracotta_base", { - description = S("Uncooked Terracotta Base"), - inventory_image = "basic_materials_terracotta_base.png", -}) - -minetest.register_craftitem("basic_materials:wet_cement", { - description = S("Wet Cement"), - inventory_image = "basic_materials_wet_cement.png", -}) - --- nodes - -minetest.register_node("basic_materials:cement_block", { - description = S("Cement"), - tiles = {"basic_materials_cement_block.png"}, - is_ground_content = true, - groups = {cracky=2}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("basic_materials:concrete_block", { - description = S("Concrete Block"), - tiles = {"basic_materials_concrete_block.png",}, - groups = {cracky=1, level=2, concrete=1}, - sounds = default.node_sound_stone_defaults(), -}) - --- crafts - -minetest.register_craft({ - type = "shapeless", - output = "basic_materials:oil_extract 2", - recipe = { - "group:leaves", - "group:leaves", - "group:leaves", - "group:leaves", - "group:leaves", - "group:leaves" - } -}) - -minetest.register_craft({ - type = "cooking", - output = "basic_materials:paraffin", - recipe = "basic_materials:oil_extract", -}) - -minetest.register_craft({ - type = "fuel", - recipe = "basic_materials:oil_extract", - burntime = 30, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "basic_materials:paraffin", - burntime = 30, -}) - -minetest.register_craft( { - type = "shapeless", - output = "basic_materials:terracotta_base 8", - recipe = { - "bucket:bucket_water", - "default:clay_lump", - "default:gravel", - }, - replacements = { {"bucket:bucket_water", "bucket:bucket_empty"}, }, -}) - -minetest.register_craft({ - type = "shapeless", - output = "basic_materials:wet_cement 3", - recipe = { - "default:dirt", - "dye:dark_grey", - "dye:dark_grey", - "dye:dark_grey", - "bucket:bucket_water" - }, - replacements = {{'bucket:bucket_water', 'bucket:bucket_empty'},}, -}) - -minetest.register_craft({ - type = "cooking", - output = "basic_materials:cement_block", - recipe = "basic_materials:wet_cement", - cooktime = 8 -}) - -minetest.register_craft({ - output = 'basic_materials:concrete_block 6', - recipe = { - {'group:sand', 'basic_materials:wet_cement', 'default:gravel'}, - {'basic_materials:steel_bar', 'basic_materials:wet_cement', 'basic_materials:steel_bar'}, - {'default:gravel', 'basic_materials:wet_cement', 'group:sand'}, - } -}) - --- aliases - -minetest.register_alias("homedecor:oil_extract", "basic_materials:oil_extract") -minetest.register_alias("homedecor:paraffin", "basic_materials:paraffin") -minetest.register_alias("homedecor:plastic_base", "basic_materials:paraffin") -minetest.register_alias("homedecor:terracotta_base", "basic_materials:terracotta_base") - -minetest.register_alias("gloopblocks:wet_cement", "basic_materials:wet_cement") -minetest.register_alias("gloopblocks:cement", "basic_materials:cement_block") - -minetest.register_alias("technic:concrete", "basic_materials:concrete_block") diff --git a/basic_materials/mod.conf b/basic_materials/mod.conf deleted file mode 100644 index 7234bfe..0000000 --- a/basic_materials/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = basic_materials -depends = default -optional_depends = moreores -min_minetest_version = 5.2.0 diff --git a/basic_materials/models/basic_materials_chains.obj b/basic_materials/models/basic_materials_chains.obj deleted file mode 100644 index 78724c9..0000000 --- a/basic_materials/models/basic_materials_chains.obj +++ /dev/null @@ -1,881 +0,0 @@ -# Blender v2.73 (sub 0) OBJ File: 'chains.blend' -# www.blender.org -o Torus.016_Torus -v 0.000000 -0.429978 0.000002 -v 0.000000 -0.401109 0.055211 -v -0.014044 -0.391975 0.048870 -v -0.014044 -0.423304 0.000002 -v -0.009826 -0.379748 0.040970 -v -0.009826 -0.406012 0.000002 -v 0.009826 -0.379748 0.040970 -v 0.009826 -0.406012 0.000002 -v 0.014044 -0.391975 0.048870 -v 0.014044 -0.423304 0.000002 -v 0.000000 -0.316336 0.080195 -v -0.014044 -0.316336 0.069112 -v -0.009826 -0.316336 0.057941 -v 0.009826 -0.316336 0.057941 -v 0.014044 -0.316336 0.069112 -v 0.000000 -0.231564 0.055211 -v -0.014044 -0.240700 0.048870 -v -0.009826 -0.252925 0.040970 -v 0.009826 -0.252925 0.040970 -v 0.014044 -0.240700 0.048870 -v 0.000000 -0.202695 0.000002 -v -0.014044 -0.209368 0.000002 -v -0.009826 -0.226661 0.000002 -v 0.009826 -0.226661 0.000002 -v 0.014044 -0.209368 0.000002 -v 0.000000 -0.231564 -0.055206 -v -0.014044 -0.240700 -0.048868 -v -0.009826 -0.252925 -0.040967 -v 0.009826 -0.252925 -0.040967 -v 0.014044 -0.240700 -0.048865 -v 0.000000 -0.316336 -0.080190 -v -0.014044 -0.316336 -0.069108 -v -0.009826 -0.316336 -0.057936 -v 0.009826 -0.316336 -0.057936 -v 0.014044 -0.316336 -0.069108 -v 0.000000 -0.400361 -0.055206 -v -0.014044 -0.391975 -0.048868 -v -0.009826 -0.379748 -0.040967 -v 0.009826 -0.379748 -0.040967 -v 0.014044 -0.391975 -0.048868 -v 0.000000 -0.262249 0.000002 -v -0.061672 -0.233381 0.000002 -v -0.054590 -0.224245 -0.012569 -v 0.000000 -0.255577 -0.012569 -v -0.045765 -0.212018 -0.008794 -v 0.000000 -0.238285 -0.008794 -v -0.045765 -0.212018 0.008798 -v 0.000000 -0.238285 0.008798 -v -0.054590 -0.224245 0.012574 -v 0.000000 -0.255577 0.012574 -v -0.089582 -0.148609 0.000002 -v -0.077200 -0.148609 -0.012569 -v -0.064722 -0.148609 -0.008794 -v -0.064722 -0.148609 0.008799 -v -0.077200 -0.148609 0.012574 -v -0.061672 -0.063837 0.000002 -v -0.054590 -0.072971 -0.012569 -v -0.045765 -0.085198 -0.008794 -v -0.045765 -0.085198 0.008799 -v -0.054590 -0.072971 0.012574 -v 0.000000 -0.034967 0.000002 -v 0.000000 -0.041641 -0.012569 -v 0.000000 -0.058933 -0.008794 -v 0.000000 -0.058933 0.008799 -v 0.000000 -0.041641 0.012574 -v 0.061672 -0.063837 0.000002 -v 0.054590 -0.072971 -0.012569 -v 0.045765 -0.085198 -0.008794 -v 0.045765 -0.085198 0.008799 -v 0.054590 -0.072971 0.012574 -v 0.089582 -0.148609 0.000002 -v 0.077200 -0.148609 -0.012569 -v 0.064722 -0.148609 -0.008794 -v 0.064722 -0.148609 0.008799 -v 0.077200 -0.148609 0.012574 -v 0.061672 -0.232631 0.000002 -v 0.054590 -0.224245 -0.012569 -v 0.045765 -0.212018 -0.008794 -v 0.045765 -0.212018 0.008798 -v 0.054590 -0.224245 0.012574 -v 0.000000 0.073316 0.000002 -v 0.061672 0.102183 0.000002 -v 0.054590 0.111319 0.012574 -v 0.000000 0.079988 0.012574 -v 0.045765 0.123546 0.008799 -v 0.000000 0.097280 0.008799 -v 0.045765 0.123546 -0.008794 -v 0.000000 0.097280 -0.008794 -v 0.054590 0.111319 -0.012569 -v 0.000000 0.079988 -0.012569 -v 0.089582 0.186956 0.000002 -v 0.077200 0.186956 0.012574 -v 0.064722 0.186956 0.008799 -v 0.064722 0.186956 -0.008794 -v 0.077200 0.186956 -0.012569 -v 0.061672 0.271728 0.000002 -v 0.054590 0.262594 0.012574 -v 0.045765 0.250367 0.008799 -v 0.045765 0.250367 -0.008794 -v 0.054590 0.262594 -0.012569 -v 0.000000 0.300597 0.000002 -v 0.000000 0.293923 0.012574 -v 0.000000 0.276631 0.008799 -v 0.000000 0.276631 -0.008794 -v 0.000000 0.293923 -0.012569 -v -0.061672 0.271728 0.000002 -v -0.054590 0.262594 0.012574 -v -0.045765 0.250367 0.008799 -v -0.045765 0.250367 -0.008794 -v -0.054590 0.262594 -0.012569 -v -0.089582 0.186956 0.000002 -v -0.077200 0.186956 0.012574 -v -0.064722 0.186956 0.008799 -v -0.064722 0.186956 -0.008794 -v -0.077200 0.186956 -0.012569 -v -0.061672 0.102931 0.000002 -v -0.054590 0.111319 0.012574 -v -0.045765 0.123546 0.008799 -v -0.045765 0.123546 -0.008794 -v -0.054590 0.111319 -0.012569 -v 0.000000 -0.095037 0.000002 -v 0.000000 -0.066168 -0.055206 -v 0.014044 -0.057034 -0.048868 -v 0.014044 -0.088363 0.000002 -v 0.009826 -0.044807 -0.040967 -v 0.009826 -0.071071 0.000002 -v -0.009826 -0.044807 -0.040967 -v -0.009826 -0.071071 0.000002 -v -0.014044 -0.057034 -0.048868 -v -0.014044 -0.088363 0.000002 -v 0.000000 0.018605 -0.080190 -v 0.014044 0.018605 -0.069108 -v 0.009826 0.018605 -0.057936 -v -0.009826 0.018605 -0.057936 -v -0.014044 0.018605 -0.069108 -v 0.000000 0.103377 -0.055206 -v 0.014044 0.094243 -0.048868 -v 0.009826 0.082016 -0.040967 -v -0.009826 0.082016 -0.040967 -v -0.014044 0.094243 -0.048868 -v 0.000000 0.132246 0.000002 -v 0.014044 0.125572 0.000002 -v 0.009826 0.108280 0.000002 -v -0.009826 0.108280 0.000002 -v -0.014044 0.125572 0.000002 -v 0.000000 0.103377 0.055211 -v 0.014044 0.094243 0.048870 -v 0.009826 0.082016 0.040970 -v -0.009826 0.082016 0.040970 -v -0.014044 0.094243 0.048870 -v 0.000000 0.018605 0.080195 -v 0.014044 0.018605 0.069112 -v 0.009826 0.018605 0.057941 -v -0.009826 0.018605 0.057941 -v -0.014044 0.018605 0.069112 -v 0.000000 -0.065420 0.055211 -v 0.014044 -0.057032 0.048870 -v 0.009826 -0.044807 0.040970 -v -0.009826 -0.044807 0.040970 -v -0.014044 -0.057032 0.048870 -v 0.000000 -0.598329 0.000002 -v 0.061672 -0.569460 0.000002 -v 0.054590 -0.560326 0.012574 -v 0.000000 -0.591655 0.012574 -v 0.045765 -0.548099 0.008798 -v 0.000000 -0.574363 0.008798 -v 0.045765 -0.548099 -0.008794 -v 0.000000 -0.574363 -0.008794 -v 0.054590 -0.560326 -0.012569 -v 0.000000 -0.591655 -0.012569 -v 0.089582 -0.484687 0.000002 -v 0.077200 -0.484687 0.012574 -v 0.064722 -0.484687 0.008798 -v 0.064722 -0.484687 -0.008794 -v 0.077200 -0.484687 -0.012569 -v 0.061672 -0.399915 0.000002 -v 0.054590 -0.409051 0.012574 -v 0.045765 -0.421278 0.008798 -v 0.045765 -0.421278 -0.008794 -v 0.054590 -0.409051 -0.012569 -v 0.000000 -0.371048 0.000002 -v 0.000000 -0.377719 0.012574 -v 0.000000 -0.395012 0.008798 -v 0.000000 -0.395012 -0.008794 -v 0.000000 -0.377719 -0.012569 -v -0.061672 -0.399915 0.000002 -v -0.054590 -0.409051 0.012574 -v -0.045765 -0.421278 0.008798 -v -0.045765 -0.421278 -0.008794 -v -0.054590 -0.409051 -0.012569 -v -0.089582 -0.484687 0.000002 -v -0.077200 -0.484687 0.012574 -v -0.064722 -0.484687 0.008798 -v -0.064722 -0.484687 -0.008794 -v -0.077200 -0.484687 -0.012569 -v -0.061672 -0.568712 0.000002 -v -0.054590 -0.560326 0.012574 -v -0.045765 -0.548099 0.008798 -v -0.045765 -0.548099 -0.008794 -v -0.054590 -0.560326 -0.012569 -v 0.000000 0.241043 0.000002 -v 0.000000 0.269910 0.055211 -v -0.014044 0.279047 0.048870 -v -0.014044 0.247717 0.000002 -v -0.009826 0.291274 0.040970 -v -0.009826 0.265007 0.000002 -v 0.009826 0.291274 0.040970 -v 0.009826 0.265007 0.000002 -v 0.014044 0.279047 0.048870 -v 0.014044 0.247717 0.000002 -v 0.000000 0.354683 0.080195 -v -0.014044 0.354683 0.069112 -v -0.009826 0.354683 0.057941 -v 0.009826 0.354683 0.057941 -v 0.014044 0.354683 0.069112 -v 0.000000 0.439455 0.055211 -v -0.014044 0.430321 0.048870 -v -0.009826 0.418094 0.040970 -v 0.009826 0.418094 0.040970 -v 0.014044 0.430321 0.048870 -v 0.000000 0.468325 0.000002 -v -0.014044 0.461651 0.000002 -v -0.009826 0.444361 0.000002 -v 0.009826 0.444361 0.000002 -v 0.014044 0.461651 0.000002 -v 0.000000 0.439455 -0.055206 -v -0.014044 0.430321 -0.048868 -v -0.009826 0.418094 -0.040967 -v 0.009826 0.418094 -0.040967 -v 0.014044 0.430321 -0.048868 -v 0.000000 0.354683 -0.080190 -v -0.014044 0.354683 -0.069108 -v -0.009826 0.354683 -0.057936 -v 0.009826 0.354683 -0.057936 -v 0.014044 0.354683 -0.069108 -v 0.000000 0.270661 -0.055206 -v -0.014044 0.279047 -0.048868 -v -0.009826 0.291274 -0.040967 -v 0.009826 0.291274 -0.040967 -v 0.014044 0.279047 -0.048868 -vt 0.187500 0.125000 -vt 0.250000 0.125000 -vt 0.250000 0.187500 -vt 0.187500 0.187500 -vt 0.250000 0.250000 -vt 0.187500 0.250000 -vt 0.250000 0.312500 -vt 0.187500 0.312500 -vt 0.250000 0.375000 -vt 0.187500 0.375000 -vt 0.187500 0.062500 -vt 0.250000 0.062500 -vt 0.312500 0.125000 -vt 0.312500 0.187500 -vt 0.312500 0.250000 -vt 0.312500 0.312500 -vt 0.312500 0.375000 -vt 0.312500 0.062500 -vt 0.375000 0.125000 -vt 0.375000 0.187500 -vt 0.375000 0.250000 -vt 0.375000 0.312500 -vt 0.375000 0.375000 -vt 0.375000 0.062500 -vt 0.437500 0.125000 -vt 0.437500 0.187500 -vt 0.437500 0.250000 -vt 0.437500 0.312500 -vt 0.437500 0.375000 -vt 0.437500 0.062500 -vt 0.500000 0.125000 -vt 0.500000 0.187500 -vt 0.500000 0.250000 -vt 0.500000 0.312500 -vt 0.500000 0.375000 -vt 0.500000 0.062500 -vt -0.000000 0.125000 -vt 0.062500 0.125000 -vt 0.062500 0.187500 -vt -0.000000 0.187500 -vt 0.062500 0.250000 -vt -0.000000 0.250000 -vt 0.062500 0.312500 -vt -0.000000 0.312500 -vt 0.062500 0.375000 -vt -0.000000 0.375000 -vt -0.000000 0.062500 -vt 0.062500 0.062500 -vt 0.125000 0.125000 -vt 0.125000 0.187500 -vt 0.125000 0.250000 -vt 0.125000 0.312500 -vt 0.125000 0.375000 -vt 0.125000 0.062500 -vt 0.750000 0.625000 -vt 0.812500 0.625000 -vt 0.812500 0.687500 -vt 0.750000 0.687500 -vt 0.750000 0.375000 -vt 0.812500 0.375000 -vt 0.812500 0.437500 -vt 0.750000 0.437500 -vt 0.812500 0.500000 -vt 0.750000 0.500000 -vt 0.812500 0.562500 -vt 0.750000 0.562500 -vt 0.875000 0.625000 -vt 0.875000 0.687500 -vt 0.875000 0.375000 -vt 0.875000 0.437500 -vt 0.875000 0.500000 -vt 0.875000 0.562500 -vt 0.937500 0.625000 -vt 0.937500 0.687500 -vt 0.937500 0.375000 -vt 0.937500 0.437500 -vt 0.937500 0.500000 -vt 0.937500 0.562500 -vt 1.000000 0.625000 -vt 1.000000 0.687500 -vt 1.000000 0.375000 -vt 1.000000 0.437500 -vt 1.000000 0.500000 -vt 1.000000 0.562500 -vt 0.500000 0.625000 -vt 0.562500 0.625000 -vt 0.562500 0.687500 -vt 0.500000 0.687500 -vt 0.562500 0.375000 -vt 0.562500 0.437500 -vt 0.500000 0.437500 -vt 0.562500 0.500000 -vt 0.500000 0.500000 -vt 0.562500 0.562500 -vt 0.500000 0.562500 -vt 0.625000 0.625000 -vt 0.625000 0.687500 -vt 0.625000 0.375000 -vt 0.625000 0.437500 -vt 0.625000 0.500000 -vt 0.625000 0.562500 -vt 0.687500 0.625000 -vt 0.687500 0.687500 -vt 0.687500 0.375000 -vt 0.687500 0.437500 -vt 0.687500 0.500000 -vt 0.687500 0.562500 -vt 0.250000 0.625000 -vt 0.312500 0.625000 -vt 0.312500 0.687500 -vt 0.250000 0.687500 -vt 0.312500 0.437500 -vt 0.250000 0.437500 -vt 0.312500 0.500000 -vt 0.250000 0.500000 -vt 0.312500 0.562500 -vt 0.250000 0.562500 -vt 0.375000 0.625000 -vt 0.375000 0.687500 -vt 0.375000 0.437500 -vt 0.375000 0.500000 -vt 0.375000 0.562500 -vt 0.437500 0.625000 -vt 0.437500 0.687500 -vt 0.437500 0.437500 -vt 0.437500 0.500000 -vt 0.437500 0.562500 -vt -0.000000 0.625000 -vt 0.062500 0.625000 -vt 0.062500 0.687500 -vt -0.000000 0.687500 -vt 0.062500 0.437500 -vt -0.000000 0.437500 -vt 0.062500 0.500000 -vt -0.000000 0.500000 -vt 0.062500 0.562500 -vt -0.000000 0.562500 -vt 0.125000 0.625000 -vt 0.125000 0.687500 -vt 0.125000 0.437500 -vt 0.125000 0.500000 -vt 0.125000 0.562500 -vt 0.187500 0.625000 -vt 0.187500 0.687500 -vt 0.187500 0.437500 -vt 0.187500 0.500000 -vt 0.187500 0.562500 -vt 0.687500 0.750000 -vt 0.750000 0.750000 -vt 0.750000 0.812500 -vt 0.687500 0.812500 -vt 0.750000 0.875000 -vt 0.687500 0.875000 -vt 0.750000 0.937500 -vt 0.687500 0.937500 -vt 0.750000 1.000000 -vt 0.687500 1.000000 -vt 0.812500 0.750000 -vt 0.812500 0.812500 -vt 0.812500 0.875000 -vt 0.812500 0.937500 -vt 0.812500 1.000000 -vt 0.875000 0.750000 -vt 0.875000 0.812500 -vt 0.875000 0.875000 -vt 0.875000 0.937500 -vt 0.875000 1.000000 -vt 0.937500 0.750000 -vt 0.937500 0.812500 -vt 0.937500 0.875000 -vt 0.937500 0.937500 -vt 0.937500 1.000000 -vt 1.000000 0.750000 -vt 1.000000 0.812500 -vt 1.000000 0.875000 -vt 1.000000 0.937500 -vt 1.000000 1.000000 -vt 0.500000 0.750000 -vt 0.562500 0.750000 -vt 0.562500 0.812500 -vt 0.500000 0.812500 -vt 0.562500 0.875000 -vt 0.500000 0.875000 -vt 0.562500 0.937500 -vt 0.500000 0.937500 -vt 0.562500 1.000000 -vt 0.500000 1.000000 -vt 0.625000 0.750000 -vt 0.625000 0.812500 -vt 0.625000 0.875000 -vt 0.625000 0.937500 -vt 0.625000 1.000000 -vt 0.750000 0.312500 -vt 0.812500 0.312500 -vt 0.750000 0.062500 -vt 0.812500 0.062500 -vt 0.812500 0.125000 -vt 0.750000 0.125000 -vt 0.812500 0.187500 -vt 0.750000 0.187500 -vt 0.812500 0.250000 -vt 0.750000 0.250000 -vt 0.875000 0.312500 -vt 0.875000 0.062500 -vt 0.875000 0.125000 -vt 0.875000 0.187500 -vt 0.875000 0.250000 -vt 0.937500 0.312500 -vt 0.937500 0.062500 -vt 0.937500 0.125000 -vt 0.937500 0.187500 -vt 0.937500 0.250000 -vt 1.000000 0.312500 -vt 1.000000 0.062500 -vt 1.000000 0.125000 -vt 1.000000 0.187500 -vt 1.000000 0.250000 -vt 0.562500 0.312500 -vt 0.562500 0.062500 -vt 0.562500 0.125000 -vt 0.562500 0.187500 -vt 0.562500 0.250000 -vt 0.625000 0.312500 -vt 0.625000 0.062500 -vt 0.625000 0.125000 -vt 0.625000 0.187500 -vt 0.625000 0.250000 -vt 0.687500 0.312500 -vt 0.687500 0.062500 -vt 0.687500 0.125000 -vt 0.687500 0.187500 -vt 0.687500 0.250000 -vt 0.250000 0.937500 -vt 0.312500 0.937500 -vt 0.312500 1.000000 -vt 0.250000 1.000000 -vt 0.312500 0.750000 -vt 0.250000 0.750000 -vt 0.312500 0.812500 -vt 0.250000 0.812500 -vt 0.312500 0.875000 -vt 0.250000 0.875000 -vt 0.375000 0.937500 -vt 0.375000 1.000000 -vt 0.375000 0.750000 -vt 0.375000 0.812500 -vt 0.375000 0.875000 -vt 0.437500 0.937500 -vt 0.437500 1.000000 -vt 0.437500 0.750000 -vt 0.437500 0.812500 -vt 0.437500 0.875000 -vt 0.000000 0.937500 -vt 0.062500 0.937500 -vt 0.062500 1.000000 -vt 0.000000 1.000000 -vt 0.062500 0.750000 -vt 0.000000 0.750000 -vt 0.062500 0.812500 -vt 0.000000 0.812500 -vt 0.062500 0.875000 -vt 0.000000 0.875000 -vt 0.125000 0.937500 -vt 0.125000 1.000000 -vt 0.125000 0.750000 -vt 0.125000 0.812500 -vt 0.125000 0.875000 -vt 0.187500 0.937500 -vt 0.187500 1.000000 -vt 0.187500 0.750000 -vt 0.187500 0.812500 -vt 0.187500 0.875000 -vn 0.000000 -1.000000 -0.004800 -vn 0.000000 -0.657400 0.753500 -vn -0.898300 -0.248500 0.362300 -vn -0.863600 -0.504100 -0.003400 -vn -0.661500 0.421500 -0.620200 -vn -0.746000 0.665900 0.000000 -vn 0.661500 0.421500 -0.620200 -vn 0.746000 0.665900 0.000000 -vn 0.898300 -0.248500 0.362300 -vn 0.863600 -0.504100 -0.003400 -vn 0.000000 0.000000 1.000000 -vn -0.925200 0.000000 0.379500 -vn -0.617100 0.000000 -0.786900 -vn 0.617100 0.000000 -0.786900 -vn 0.925200 0.000000 0.379500 -vn 0.000000 0.657400 0.753500 -vn -0.898300 0.248400 0.362300 -vn -0.661500 -0.421500 -0.620200 -vn 0.661500 -0.421500 -0.620200 -vn 0.898300 0.248400 0.362300 -vn 0.000000 1.000000 0.000000 -vn -0.866100 0.499800 0.000000 -vn -0.746000 -0.665900 0.000000 -vn 0.746000 -0.665900 0.000000 -vn 0.866100 0.499800 0.000000 -vn 0.000000 0.657400 -0.753500 -vn -0.898300 0.248400 -0.362400 -vn -0.661600 -0.421500 0.620200 -vn 0.661500 -0.421500 0.620200 -vn 0.898300 0.248400 -0.362300 -vn 0.000000 -0.000900 -1.000000 -vn -0.924600 -0.000600 -0.380700 -vn -0.617100 0.000000 0.786900 -vn 0.617100 0.000000 0.786900 -vn 0.924700 -0.000600 -0.380700 -vn 0.000000 -0.650300 -0.759600 -vn -0.895600 -0.254600 -0.364800 -vn -0.661600 0.421500 0.620200 -vn 0.661600 0.421500 0.620200 -vn 0.895600 -0.254600 -0.364800 -vn 0.004900 -1.000000 0.000000 -vn -0.729700 -0.683800 0.000000 -vn -0.324500 -0.256300 -0.910500 -vn 0.003300 -0.475500 -0.879700 -vn 0.578700 0.436200 -0.689100 -vn 0.000000 0.666600 -0.745400 -vn 0.578700 0.436200 0.689100 -vn 0.000000 0.666600 0.745400 -vn -0.324500 -0.256300 0.910500 -vn 0.003300 -0.475500 0.879700 -vn -1.000000 0.000000 0.000000 -vn -0.359600 0.000000 -0.933100 -vn 0.756400 0.000000 -0.654100 -vn 0.756400 0.000000 0.654100 -vn -0.359600 0.000000 0.933100 -vn -0.729700 0.683700 0.000000 -vn -0.324500 0.256300 -0.910500 -vn 0.578700 -0.436200 -0.689100 -vn 0.578700 -0.436200 0.689100 -vn -0.324500 0.256300 0.910500 -vn 0.000000 0.470900 -0.882200 -vn 0.000000 -0.666600 -0.745400 -vn 0.000000 -0.666600 0.745400 -vn 0.000000 0.470900 0.882200 -vn 0.729700 0.683700 0.000000 -vn 0.324500 0.256300 -0.910500 -vn -0.578700 -0.436200 -0.689100 -vn -0.578700 -0.436200 0.689100 -vn 0.324500 0.256300 0.910500 -vn 1.000000 -0.001100 0.000000 -vn 0.361000 -0.000700 -0.932600 -vn -0.756400 0.000000 -0.654100 -vn -0.756400 0.000000 0.654100 -vn 0.361000 -0.000700 0.932600 -vn 0.736100 -0.676800 0.000000 -vn 0.327100 -0.263100 -0.907600 -vn -0.578700 0.436200 -0.689100 -vn -0.578700 0.436200 0.689100 -vn 0.327100 -0.263100 0.907600 -vn -0.004900 -1.000000 0.000000 -vn 0.729700 -0.683800 0.000000 -vn 0.324500 -0.256300 0.910500 -vn -0.003300 -0.475400 0.879700 -vn 0.324500 -0.256300 -0.910500 -vn -0.003300 -0.475400 -0.879700 -vn 1.000000 0.000000 0.000000 -vn 0.359600 0.000000 0.933100 -vn 0.359600 0.000000 -0.933100 -vn -1.000000 -0.001100 0.000000 -vn -0.361000 -0.000700 0.932600 -vn -0.361000 -0.000700 -0.932600 -vn -0.736100 -0.676800 0.000000 -vn -0.327100 -0.263100 0.907600 -vn -0.327100 -0.263100 -0.907600 -vn 0.000000 -1.000000 0.004800 -vn 0.000000 -0.657400 -0.753500 -vn 0.898300 -0.248500 -0.362400 -vn 0.863600 -0.504100 0.003400 -vn -0.898300 -0.248500 -0.362400 -vn -0.863600 -0.504100 0.003400 -vn 0.000000 0.000000 -1.000000 -vn 0.925200 0.000000 -0.379500 -vn -0.925200 0.000000 -0.379500 -vn 0.898300 0.248500 -0.362400 -vn 0.661600 -0.421500 0.620200 -vn -0.898300 0.248500 -0.362400 -vn 0.898300 0.248500 0.362300 -vn -0.898300 0.248500 0.362300 -vn 0.000000 -0.000900 1.000000 -vn 0.924700 -0.000600 0.380700 -vn -0.924700 -0.000600 0.380700 -vn 0.000000 -0.650300 0.759600 -vn 0.895600 -0.254600 0.364700 -vn -0.895600 -0.254600 0.364700 -vn 0.729700 -0.683700 0.000000 -vn 0.729700 0.683800 0.000000 -vn -0.729700 0.683800 0.000000 -vn -0.898300 -0.248400 0.362300 -vn -0.863600 -0.504100 -0.003500 -vn 0.898300 -0.248400 0.362300 -vn 0.863600 -0.504100 -0.003500 -vn -0.661500 -0.421500 0.620200 -vn 0.924600 -0.000600 -0.380700 -vn -0.661500 0.421500 0.620200 -vn 0.661500 0.421500 0.620200 -s 1 -f 1/1/1 2/2/2 3/3/3 4/4/4 -f 4/4/4 3/3/3 5/5/5 6/6/6 -f 6/6/6 5/5/5 7/7/7 8/8/8 -f 8/8/8 7/7/7 9/9/9 10/10/10 -f 1/1/1 10/11/10 9/12/9 2/2/2 -f 2/2/2 11/13/11 12/14/12 3/3/3 -f 3/3/3 12/14/12 13/15/13 5/5/5 -f 5/5/5 13/15/13 14/16/14 7/7/7 -f 7/7/7 14/16/14 15/17/15 9/9/9 -f 9/12/9 15/18/15 11/13/11 2/2/2 -f 11/13/11 16/19/16 17/20/17 12/14/12 -f 12/14/12 17/20/17 18/21/18 13/15/13 -f 13/15/13 18/21/18 19/22/19 14/16/14 -f 14/16/14 19/22/19 20/23/20 15/17/15 -f 15/18/15 20/24/20 16/19/16 11/13/11 -f 16/19/16 21/25/21 22/26/22 17/20/17 -f 17/20/17 22/26/22 23/27/23 18/21/18 -f 18/21/18 23/27/23 24/28/24 19/22/19 -f 19/22/19 24/28/24 25/29/25 20/23/20 -f 20/24/20 25/30/25 21/25/21 16/19/16 -f 21/25/21 26/31/26 27/32/27 22/26/22 -f 22/26/22 27/32/27 28/33/28 23/27/23 -f 23/27/23 28/33/28 29/34/29 24/28/24 -f 24/28/24 29/34/29 30/35/30 25/29/25 -f 25/30/25 30/36/30 26/31/26 21/25/21 -f 26/37/26 31/38/31 32/39/32 27/40/27 -f 27/40/27 32/39/32 33/41/33 28/42/28 -f 28/42/28 33/41/33 34/43/34 29/44/29 -f 29/44/29 34/43/34 35/45/35 30/46/30 -f 30/47/30 35/48/35 31/38/31 26/37/26 -f 31/38/31 36/49/36 37/50/37 32/39/32 -f 32/39/32 37/50/37 38/51/38 33/41/33 -f 33/41/33 38/51/38 39/52/39 34/43/34 -f 34/43/34 39/52/39 40/53/40 35/45/35 -f 35/48/35 40/54/40 36/49/36 31/38/31 -f 36/49/36 1/1/1 4/4/4 37/50/37 -f 37/50/37 4/4/4 6/6/6 38/51/38 -f 38/51/38 6/6/6 8/8/8 39/52/39 -f 39/52/39 8/8/8 10/10/10 40/53/40 -f 1/1/1 36/49/36 40/54/40 10/11/10 -f 41/55/41 42/56/42 43/57/43 44/58/44 -f 44/59/44 43/60/43 45/61/45 46/62/46 -f 46/62/46 45/61/45 47/63/47 48/64/48 -f 48/64/48 47/63/47 49/65/49 50/66/50 -f 41/55/41 50/66/50 49/65/49 42/56/42 -f 42/56/42 51/67/51 52/68/52 43/57/43 -f 43/60/43 52/69/52 53/70/53 45/61/45 -f 45/61/45 53/70/53 54/71/54 47/63/47 -f 47/63/47 54/71/54 55/72/55 49/65/49 -f 49/65/49 55/72/55 51/67/51 42/56/42 -f 51/67/51 56/73/56 57/74/57 52/68/52 -f 52/69/52 57/75/57 58/76/58 53/70/53 -f 53/70/53 58/76/58 59/77/59 54/71/54 -f 54/71/54 59/77/59 60/78/60 55/72/55 -f 55/72/55 60/78/60 56/73/56 51/67/51 -f 56/73/56 61/79/21 62/80/61 57/74/57 -f 57/75/57 62/81/61 63/82/62 58/76/58 -f 58/76/58 63/82/62 64/83/63 59/77/59 -f 59/77/59 64/83/63 65/84/64 60/78/60 -f 60/78/60 65/84/64 61/79/21 56/73/56 -f 61/85/21 66/86/65 67/87/66 62/88/61 -f 62/35/61 67/89/66 68/90/67 63/91/62 -f 63/91/62 68/90/67 69/92/68 64/93/63 -f 64/93/63 69/92/68 70/94/69 65/95/64 -f 65/95/64 70/94/69 66/86/65 61/85/21 -f 66/86/65 71/96/70 72/97/71 67/87/66 -f 67/89/66 72/98/71 73/99/72 68/90/67 -f 68/90/67 73/99/72 74/100/73 69/92/68 -f 69/92/68 74/100/73 75/101/74 70/94/69 -f 70/94/69 75/101/74 71/96/70 66/86/65 -f 71/96/70 76/102/75 77/103/76 72/97/71 -f 72/98/71 77/104/76 78/105/77 73/99/72 -f 73/99/72 78/105/77 79/106/78 74/100/73 -f 74/100/73 79/106/78 80/107/79 75/101/74 -f 75/101/74 80/107/79 76/102/75 71/96/70 -f 76/102/75 41/55/41 44/58/44 77/103/76 -f 77/104/76 44/59/44 46/62/46 78/105/77 -f 78/105/77 46/62/46 48/64/48 79/106/78 -f 79/106/78 48/64/48 50/66/50 80/107/79 -f 41/55/41 76/102/75 80/107/79 50/66/50 -f 81/108/80 82/109/81 83/110/82 84/111/83 -f 84/9/83 83/17/82 85/112/78 86/113/48 -f 86/113/48 85/112/78 87/114/77 88/115/46 -f 88/115/46 87/114/77 89/116/84 90/117/85 -f 81/108/80 90/117/85 89/116/84 82/109/81 -f 82/109/81 91/118/86 92/119/87 83/110/82 -f 83/17/82 92/23/87 93/120/73 85/112/78 -f 85/112/78 93/120/73 94/121/72 87/114/77 -f 87/114/77 94/121/72 95/122/88 89/116/84 -f 89/116/84 95/122/88 91/118/86 82/109/81 -f 91/118/86 96/123/65 97/124/69 92/119/87 -f 92/23/87 97/29/69 98/125/68 93/120/73 -f 93/120/73 98/125/68 99/126/67 94/121/72 -f 94/121/72 99/126/67 100/127/66 95/122/88 -f 95/122/88 100/127/66 96/123/65 91/118/86 -f 96/123/65 101/85/21 102/88/64 97/124/69 -f 97/29/69 102/35/64 103/91/63 98/125/68 -f 98/125/68 103/91/63 104/93/62 99/126/67 -f 99/126/67 104/93/62 105/95/61 100/127/66 -f 100/127/66 105/95/61 101/85/21 96/123/65 -f 101/128/21 106/129/56 107/130/60 102/131/64 -f 102/46/64 107/45/60 108/132/59 103/133/63 -f 103/133/63 108/132/59 109/134/58 104/135/62 -f 104/135/62 109/134/58 110/136/57 105/137/61 -f 105/137/61 110/136/57 106/129/56 101/128/21 -f 106/129/56 111/138/89 112/139/90 107/130/60 -f 107/45/60 112/53/90 113/140/54 108/132/59 -f 108/132/59 113/140/54 114/141/53 109/134/58 -f 109/134/58 114/141/53 115/142/91 110/136/57 -f 110/136/57 115/142/91 111/138/89 106/129/56 -f 111/138/89 116/143/92 117/144/93 112/139/90 -f 112/53/90 117/10/93 118/145/47 113/140/54 -f 113/140/54 118/145/47 119/146/45 114/141/53 -f 114/141/53 119/146/45 120/147/94 115/142/91 -f 115/142/91 120/147/94 116/143/92 111/138/89 -f 116/143/92 81/108/80 84/111/83 117/144/93 -f 117/10/93 84/9/83 86/113/48 118/145/47 -f 118/145/47 86/113/48 88/115/46 119/146/45 -f 119/146/45 88/115/46 90/117/85 120/147/94 -f 81/108/80 116/143/92 120/147/94 90/117/85 -f 121/148/95 122/149/96 123/150/97 124/151/98 -f 124/151/98 123/150/97 125/152/39 126/153/8 -f 126/153/8 125/152/39 127/154/38 128/155/6 -f 128/155/6 127/154/38 129/156/99 130/157/100 -f 121/148/95 130/103/100 129/58/99 122/149/96 -f 122/149/96 131/158/101 132/159/102 123/150/97 -f 123/150/97 132/159/102 133/160/34 125/152/39 -f 125/152/39 133/160/34 134/161/33 127/154/38 -f 127/154/38 134/161/33 135/162/103 129/156/99 -f 129/58/99 135/57/103 131/158/101 122/149/96 -f 131/158/101 136/163/26 137/164/104 132/159/102 -f 132/159/102 137/164/104 138/165/105 133/160/34 -f 133/160/34 138/165/105 139/166/28 134/161/33 -f 134/161/33 139/166/28 140/167/106 135/162/103 -f 135/57/103 140/68/106 136/163/26 131/158/101 -f 136/163/26 141/168/21 142/169/25 137/164/104 -f 137/164/104 142/169/25 143/170/24 138/165/105 -f 138/165/105 143/170/24 144/171/23 139/166/28 -f 139/166/28 144/171/23 145/172/22 140/167/106 -f 140/68/106 145/74/22 141/168/21 136/163/26 -f 141/168/21 146/173/16 147/174/107 142/169/25 -f 142/169/25 147/174/107 148/175/19 143/170/24 -f 143/170/24 148/175/19 149/176/18 144/171/23 -f 144/171/23 149/176/18 150/177/108 145/172/22 -f 145/74/22 150/80/108 146/173/16 141/168/21 -f 146/178/16 151/179/109 152/180/110 147/181/107 -f 147/181/107 152/180/110 153/182/14 148/183/19 -f 148/183/19 153/182/14 154/184/13 149/185/18 -f 149/185/18 154/184/13 155/186/111 150/187/108 -f 150/88/108 155/87/111 151/179/109 146/178/16 -f 151/179/109 156/188/112 157/189/113 152/180/110 -f 152/180/110 157/189/113 158/190/7 153/182/14 -f 153/182/14 158/190/7 159/191/5 154/184/13 -f 154/184/13 159/191/5 160/192/114 155/186/111 -f 155/87/111 160/97/114 156/188/112 151/179/109 -f 156/188/112 121/148/95 124/151/98 157/189/113 -f 157/189/113 124/151/98 126/153/8 158/190/7 -f 158/190/7 126/153/8 128/155/6 159/191/5 -f 159/191/5 128/155/6 130/157/100 160/192/114 -f 121/148/95 156/188/112 160/97/114 130/103/100 -f 161/193/80 162/194/115 163/60/82 164/59/83 -f 164/195/83 163/196/82 165/197/78 166/198/48 -f 166/198/48 165/197/78 167/199/77 168/200/46 -f 168/200/46 167/199/77 169/201/84 170/202/85 -f 161/193/80 170/202/85 169/201/84 162/194/115 -f 162/194/115 171/203/86 172/69/87 163/60/82 -f 163/196/82 172/204/87 173/205/73 165/197/78 -f 165/197/78 173/205/73 174/206/72 167/199/77 -f 167/199/77 174/206/72 175/207/88 169/201/84 -f 169/201/84 175/207/88 171/203/86 162/194/115 -f 171/203/86 176/208/116 177/75/69 172/69/87 -f 172/204/87 177/209/69 178/210/68 173/205/73 -f 173/205/73 178/210/68 179/211/67 174/206/72 -f 174/206/72 179/211/67 180/212/66 175/207/88 -f 175/207/88 180/212/66 176/208/116 171/203/86 -f 176/208/116 181/213/21 182/81/64 177/75/69 -f 177/209/69 182/214/64 183/215/63 178/210/68 -f 178/210/68 183/215/63 184/216/62 179/211/67 -f 179/211/67 184/216/62 185/217/61 180/212/66 -f 180/212/66 185/217/61 181/213/21 176/208/116 -f 181/34/21 186/218/117 187/89/60 182/35/64 -f 182/36/64 187/219/60 188/220/59 183/31/63 -f 183/31/63 188/220/59 189/221/58 184/32/62 -f 184/32/62 189/221/58 190/222/57 185/33/61 -f 185/33/61 190/222/57 186/218/117 181/34/21 -f 186/218/117 191/223/89 192/98/90 187/89/60 -f 187/219/60 192/224/90 193/225/54 188/220/59 -f 188/220/59 193/225/54 194/226/53 189/221/58 -f 189/221/58 194/226/53 195/227/91 190/222/57 -f 190/222/57 195/227/91 191/223/89 186/218/117 -f 191/223/89 196/228/92 197/104/93 192/98/90 -f 192/224/90 197/229/93 198/230/47 193/225/54 -f 193/225/54 198/230/47 199/231/45 194/226/53 -f 194/226/53 199/231/45 200/232/94 195/227/91 -f 195/227/91 200/232/94 196/228/92 191/223/89 -f 196/228/92 161/193/80 164/59/83 197/104/93 -f 197/229/93 164/195/83 166/198/48 198/230/47 -f 198/230/47 166/198/48 168/200/46 199/231/45 -f 199/231/45 168/200/46 170/202/85 200/232/94 -f 161/193/80 196/228/92 200/232/94 170/202/85 -f 201/233/1 202/234/2 203/235/118 204/236/119 -f 204/111/119 203/110/118 205/237/5 206/238/6 -f 206/238/6 205/237/5 207/239/7 208/240/8 -f 208/240/8 207/239/7 209/241/120 210/242/121 -f 201/233/1 210/242/121 209/241/120 202/234/2 -f 202/234/2 211/243/11 212/244/12 203/235/118 -f 203/110/118 212/119/12 213/245/13 205/237/5 -f 205/237/5 213/245/13 214/246/14 207/239/7 -f 207/239/7 214/246/14 215/247/15 209/241/120 -f 209/241/120 215/247/15 211/243/11 202/234/2 -f 211/243/11 216/248/16 217/249/108 212/244/12 -f 212/119/12 217/124/108 218/250/18 213/245/13 -f 213/245/13 218/250/18 219/251/19 214/246/14 -f 214/246/14 219/251/19 220/252/107 215/247/15 -f 215/247/15 220/252/107 216/248/16 211/243/11 -f 216/248/16 221/185/21 222/187/22 217/249/108 -f 217/124/108 222/88/22 223/178/23 218/250/18 -f 218/250/18 223/178/23 224/181/24 219/251/19 -f 219/251/19 224/181/24 225/183/25 220/252/107 -f 220/252/107 225/183/25 221/185/21 216/248/16 -f 221/253/21 226/254/26 227/255/106 222/256/22 -f 222/131/22 227/130/106 228/257/122 223/258/23 -f 223/258/23 228/257/122 229/259/29 224/260/24 -f 224/260/24 229/259/29 230/261/104 225/262/25 -f 225/262/25 230/261/104 226/254/26 221/253/21 -f 226/254/26 231/263/31 232/264/32 227/255/106 -f 227/130/106 232/139/32 233/265/33 228/257/122 -f 228/257/122 233/265/33 234/266/34 229/259/29 -f 229/259/29 234/266/34 235/267/123 230/261/104 -f 230/261/104 235/267/123 231/263/31 226/254/26 -f 231/263/31 236/268/36 237/269/37 232/264/32 -f 232/139/32 237/144/37 238/270/124 233/265/33 -f 233/265/33 238/270/124 239/271/125 234/266/34 -f 234/266/34 239/271/125 240/272/40 235/267/123 -f 235/267/123 240/272/40 236/268/36 231/263/31 -f 236/268/36 201/233/1 204/236/119 237/269/37 -f 237/144/37 204/111/119 206/238/6 238/270/124 -f 238/270/124 206/238/6 208/240/8 239/271/125 -f 239/271/125 208/240/8 210/242/121 240/272/40 -f 201/233/1 236/268/36 240/272/40 210/242/121 diff --git a/basic_materials/plastics.lua b/basic_materials/plastics.lua deleted file mode 100644 index e29af53..0000000 --- a/basic_materials/plastics.lua +++ /dev/null @@ -1,56 +0,0 @@ --- Translation support -local S = minetest.get_translator("basic_materials") - --- items - -minetest.register_craftitem("basic_materials:plastic_sheet", { - description = S("Plastic sheet"), - inventory_image = "basic_materials_plastic_sheet.png", -}) - -minetest.register_craftitem("basic_materials:plastic_strip", { - description = S("Plastic strips"), - groups = { strip = 1 }, - inventory_image = "basic_materials_plastic_strip.png", -}) - -minetest.register_craftitem("basic_materials:empty_spool", { - description = S("Empty wire spool"), - inventory_image = "basic_materials_empty_spool.png" -}) - --- crafts - -minetest.register_craft({ - type = "cooking", - output = "basic_materials:plastic_sheet", - recipe = "basic_materials:paraffin", -}) - -minetest.register_craft({ - type = "fuel", - recipe = "basic_materials:plastic_sheet", - burntime = 30, -}) - -minetest.register_craft( { - output = "basic_materials:plastic_strip 9", - recipe = { - { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" } - }, -}) - -minetest.register_craft( { - output = "basic_materials:empty_spool 3", - recipe = { - { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }, - { "", "basic_materials:plastic_sheet", "" }, - { "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" } - }, -}) - --- aliases - -minetest.register_alias("homedecor:plastic_sheeting", "basic_materials:plastic_sheet") -minetest.register_alias("homedecor:plastic_strips", "basic_materials:plastic_strip") -minetest.register_alias("homedecor:empty_spool", "basic_materials:empty_spool") diff --git a/basic_materials/textures/basic_materials_brass_block.png b/basic_materials/textures/basic_materials_brass_block.png deleted file mode 100644 index c93780002f87ced40ad5cd844688948d20ae8ac9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272 zcmV+r0q_2aP)QAOHgp5C8x(050AB*_x`W!T=5K?%SEV?y&$p{{H{lo9lo84(;v! z`}%WB5`?cueVTx0*^E2e6CAk@9U$q7a6US*<7tZ^V-h$jBzVo87_Qrt>rjZ zLZCMXtGZFQN6*p}qh=|k;^VD83hTEnGx;DPF!Pi6H|b?HelzCZd%O6-zjXF)S*BSI Tw|Pu}wlH|Q`njxgN@xNA6Yo-v diff --git a/basic_materials/textures/basic_materials_cement_block.png b/basic_materials/textures/basic_materials_cement_block.png deleted file mode 100644 index 6d30f477f359e93a71112578baace525ce0f0fdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 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 Y0yypkc?hzDnE(I)07*qoM6N<$g3I$jPXGV_ diff --git a/basic_materials/textures/basic_materials_chainlink_brass.png b/basic_materials/textures/basic_materials_chainlink_brass.png deleted file mode 100644 index 9a1ad87e5c4ec6bedb9fa3fcb8bf9c36b2841a57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VW1=2k^8k@U}4@@yTw<_e> zl@)7JuCE4)GL{7S1v5B2yO9Ru_<6cGhH%KT9(3etHV|MqurTLclfJ;Oh9$Fh@A{^< z;{X3HV+MwRdBQvTS$DXyzI>(N-KXtxU**TObheBA+nWB{sdS{V1)3_Jdt ZY;yS)^B@^VH=qj`JYD@<);T3K0RX*6Kz#rJ diff --git a/basic_materials/textures/basic_materials_concrete_block.png b/basic_materials/textures/basic_materials_concrete_block.png deleted file mode 100644 index 5dd0d660a238c6ca7f0274f260f9afb320b77277..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252 zcmVY`8QRl6>1%B6N=CI;5pv6_`|C`xS z|39tB`Tu28&HpzWTK<37J>~!1O;i6r**fk2mBnrUcXww0JJp-=X?d3G`^9mlXICZ} zm%|Mxwv_z;c245|&#Mdn|J>gA|KH&$|NmWB@&EtrtzZmdgTz2`AT^JsME$R_mH7`h zpvhI?-}-FF{}UqZ{$H6s`C!ZX{nYTeq`B4b~ Y0Jhw^anS{dXaE2J07*qoM6N<$f(d7-Z~y=R diff --git a/basic_materials/textures/basic_materials_copper_wire.png b/basic_materials/textures/basic_materials_copper_wire.png deleted file mode 100644 index 9df9f36635e86c5ea63c1dc3f12887fb3bc22202..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 306 zcmV-20nPr2P)U@EwPwOzp8T|3fHAS9c_ zBxqkZTD_-FGjG9BUV9J`Im_gE-a)``b5RszSq4CoB*byt8v?-NdL?ZcV?-$>N+~hM zblx@(>2cC@xsX#zmy3>h&>kk!8SA@iqF_Me4;ckR06t8OwhgAqIuQ`|V zIit{L90puO0RX#7^QkS`Hssqae-gaqFTDiXg`hN+$~Y4IV+R4_(EldzU{`8NZK>RL zu*cL*KY@tI>h|iaD~O2vH1VLyr+RR6|J13n^Jj9_7u?+FHXlP0<^TWy07*qoM6N<$ Ef~uT@yZ`_I diff --git a/basic_materials/textures/basic_materials_empty_spool.png b/basic_materials/textures/basic_materials_empty_spool.png deleted file mode 100644 index 017a94fd20c34d95fc8342e9df02f0db5e4a64d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b3I)gLo80;o$SbUSV6#bzUdJG zfjgC~{*#=mh1NfC64-Rg>CGzD84+A%SN8|~`8*?WpMgfpa5~kR)YHQlO^dK*b=XraB`4f5$N;C&`1$k|s zef)*gf8GH9tlqubS59wCjXYtw|Ge&-sjcs%u9v!caTa(!^tZpfVcx$fzAL*Q8e9iD Ol)=;0&t;ucLK6VKXII() diff --git a/basic_materials/textures/basic_materials_energy_crystal.png b/basic_materials/textures/basic_materials_energy_crystal.png deleted file mode 100644 index f1c28e80547b2ade2e3ad9d04690351752d0eb1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 817 zcmV-11J3-3P) zZ%mYR0KoB|Cm^E@>ok=dXX3-%c?!pc97GUWbD5fNOj^BY=2}L!nffYOptzAsa_j#B z3tw1nDO-Om=4{18?awf)jpm|%Ti6`CIJoD}@Ao|SJil+W)#eLp_4$Z@!mg#o?5=3w zsU-vA|I%H?99o~anYL2cTCDYf^fB>Y(cN6cL!wk2yA@hXwR5^0e}5R-AAOLvl_BwO zvLky#VupV9PNs(&g6w1qxp(hI4Ypu@+z31C*3({BD6S{-+v_1Q!|!{*q$BCsNAAHs zv6<|-J;>fhvO|xN?`c9G+O&YK#yR48cy8S!?bV9TT6D*9^wS1B9)_+O^qz9`juNf+ z#nCUUUg*D=nk}xy!8M=hy_M2EaxdzWB>8s?f}S+&N<&8&_NQ@=S0gVq__`yK5r32Y zYYX#-QrpcZ1?J%x?(izCixI5TYmk@YSeXdckFDfL;e5FSchtZ+HP5rIM!Wq^Q6R>l z$mv|n?-z@(>^T0bx8S}pmrT%xHC%_Bs3rUT7QE*Ttifiolwn%ss4L6Jy%$?7?2jHk zKlP^Yrd1UE$|CISQXD6Vef18^@g!c4f!!a+{;3jqem-(4itSfnUYPHzfyAirx+B=K z3g=2CHZi1*BUK7>Vj13;f%!uPYG5I%?+!x@M9@1I=Xe;l--y4h0JfDdeNy0l9mbO}R3;HP_UdniK3P_64OQZvU4iYD zA$2{HH2Je7aG;*xr6wlFIvM9E>fr6z+=l&g1m!lPf(>hh5@HrD;rrY(2`tM%vI@i?uA%RjjR~Ru{kPcI9By+@s~dU6S@ozea7Ws00000NkvXXu0mjfutA!B diff --git a/basic_materials/textures/basic_materials_gear_steel.png b/basic_materials/textures/basic_materials_gear_steel.png deleted file mode 100644 index 584f9a51502729fb65198c204230d0100d729b5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5845 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 diff --git a/basic_materials/textures/basic_materials_gold_wire.png b/basic_materials/textures/basic_materials_gold_wire.png deleted file mode 100644 index 781de7b1a9439a5d9180f06a1074b6f767a427c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmV+(0pb3MP)}LrYr3NnDttB9Rl=MN-iv2S^8^AZA-TUKwwOhDdf26HCkQMyvnz zH1iicrMiQN$S9Li>LlRUToeU)o&%7kDO&5n5CAsoxpZZ%6=RGTW5in9d)usD&XaC4 zEtj;-bk7`ihj^CowR|KDuTjyIU=je}b`5)1vj47#X9@6pKA`?waQpBCHz7=}P`?2| z-9XiXb(C)ze-cz5uY&}x@gb;N*m)9+-$5Kf9R2SOTw5V+IZPlTQsnoet{@_EXyQqg kFZJLqdGA%(`!jj#2hL93EOD>hK>z>%07*qoM6N<$f|qX6 z@{*qEs#o=@suPJ}+gEYYz8q@%erhbw%@Y%z2L?Xw`&Ix6fCPq+KnNN5pJyi#FX(u) zqTotUTJ%Da!c>y5y#%-vhd2^9(<3Nn#=Cu6LU6yK2>Vm++p!MIf7n(;bPwu#KH7PM zcER9$E=6<#%Bw0KNp081^|D9wIewfOJRRt0i7n}VAOyib1eL79#eB+5&=9>G-_??b z*CWkr9TH}~T~mZx0<{-KyI{Sv;Ndg>+eBAYT}EeSi8IDvdJK0nJ!5R;y6RO>o{4%!RUSCcpnSb?EjDXgu~oqow_# P00000NkvXXu0mjfbef`4 diff --git a/basic_materials/textures/basic_materials_ic.png b/basic_materials/textures/basic_materials_ic.png deleted file mode 100644 index 4c8889451813f0c8727e0efac36ff761b5f047fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU!KjfKP~P za74IgfWMQMm#dGDPe`zDXlQU$l(V)`Gl7#ae!VaIKe&p=APB*-uL zKVHCaR!*bvb8f^mY(D}5g$--J~2#QIM$&r{Q^96y+6-Y#45 zTFOgP#I;eyQ>IYH*{d?W;OJ$Oz5EG1j`zR2TsArJ`Od^t$-d<+0!^y=VrSeF)*iL! zQ@Ico&!QeEa#z)ud&4?y&S|NNj@L^yPJdGJxO|24kiinYIS+KwDtcC}+P5p=ASdUy vTK3Jkx0#vV3)XFQd7uBqTIGFkor(M*_EfD+S3VsC`h>yL)z4*}Q$iB}YXn`L diff --git a/basic_materials/textures/basic_materials_oil_extract.png b/basic_materials/textures/basic_materials_oil_extract.png deleted file mode 100644 index e34623d0551bbf2334f46393b2a66ade0ca7b8b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1966 zcmV;f2T}NmP))Rd!KV>=4LXXt)b124^d+!s8kw|Fe7L~6^YPd(_)Klv4VXQ`XDIycx03ad|5pJ~IZ~(kls0c)4hflp3Y5<-){$j&g zI$(?)H74_wm_W=RqMdB*SB4sZI7+_koVm-nl~8A5IOkxQp{kFcn4SCZPy#SLJ+mK# zuUhLu=I+NbGmNz$qA~CFdqW4nGsjLgiReh+%)avK7g~^IgA79iV*2EX*}2Du3IJow zA#3Sq5I7XE-{)_@#(;=e6i1(*ed)kZ05Cm0vp-G!BgPo?u6}PQ7-L|vt#OQ?-{15A zJag=1lMR2#F!lw3U3K-l!XaY;M6vhy%-nZ3Hv?2Z4d83W7#L&MOniu_%mM~*`1#qF zKC>wSc>3wty#SuDhTxomF(xm321t^!yr2k$@0>b)W@1wTFg-mpN=)}M(=KKP5ko|f zrfJvZz3)G%d`AEPQS439^xK;X0AuKmg8J6-nz7$6MJ};`RrPZxX6KG<3IL8hd+I|4 z^^GAg8*uJS*H1R9YJ!5gSO8#5LHFfj*B5{%pPFHx%Ga4`R}ffO7a|B7utCtdj0<7I z23!~d!~<81s`@b(hL2TUGFJ+KW14b~j|PnfTsVqwWCSh@!N!8f0LU1iqEOL6;-Sm} z25^{(kJJ)?Q>V{Ngrkio!o~=~umNjr*6bM6+47|5Y9LRfa-k03>O;&l$7R zI+u$WRWC6rh@)tmPyB6l41s+`%rZ0R8jl=^Y4zkNXMj%<5Of?wmE{GMoeL23CUmy2 z!P{NL1oa9+c2ChMR`F0#hzfj?bXw;CwiD4!wF3aaM_0fYboB+|72ao#l6ZLUb7wP$ zeJW+=p`bujchnJp-93V}Ce?i+`AQ3*inNm%YO(dLHq1orG=PZql%3CdeJhu$0-B}6 zK1q;75yYomPOjWfcrP$jwK+XKGg=!4oH~7GLcBLcH5Y~sLEzx5fwNg5#B5-#0W(0v zD7OMc01<)rf;9CINf1RTk|ajE9bg z7EQ@CK!gBD=UyU0v)QB|4C}KCT)w>63sf04@lS6Y0Pq6>8HJ7j2%!l3$GH~u{<5eps>oYj z%b#?=d2jqj!8&_)Np#DCIZEtZ#|2NcXsgUkuica&sQ6&Y;WyD`Vl!5H8GELkH9r;- zDwm`^F_M`^6HOTt>+v}?E2bUlpfofs2Lw>Lj!JUVxM$yxq-m!y!xnH@W}@S5GO zT{_Le*I&i$%fZzRigya$&8pWftaSLuYWe2D+=jogy#2KYR?2=1-pklN)ivBPrXm37 OQU*^~KbLh*2~7a=@>Ny< diff --git a/basic_materials/textures/basic_materials_paraffin.png b/basic_materials/textures/basic_materials_paraffin.png deleted file mode 100644 index 77d2bbd12e37d724d87822457fa22b927a48c18f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 345 zcmV-f0jBjm@zqOr9pf#>1mvib%4#NfwJP zPZ)e+%=#VRlNOX9PL7g<0q_A)q;_`)qPX!U# zSv{nT;*Bx|Y8aR_c*mke6>T6Q2U`i>#6!_T=Ykt5RCo;UgIhoODtluh+q2gXSvwWv rlxFN&(J)=jtZ0kTh2#0x-pREfDC$N*K|~Z4L`Bdur1ORjbfHC|ln#V!@?U;3x!wNy#c})~ zE(_bXeKbvD7eygNnx@ui;WSOQ%F=b6kgKYavMfJCuxW(DFvvKLI`@6AApr6`--jrR zcM2#(Fwe8B>nh8#Xb4Vl@dE5aRDor>Biy!4LvRA1u4}UkiK1v9qKYjXAOeCDfMyRk zNRmX+q>j00000NkvXXu0mjfHCcNh diff --git a/basic_materials/textures/basic_materials_plastic_strip.png b/basic_materials/textures/basic_materials_plastic_strip.png deleted file mode 100644 index 1318dfc04dfb0e80a85e934877e1b3eae6ad43f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar`0iURLBgpuppB@qR4B z>A(KrvCVIeOlocA)$m^7yhq-Jd-w6Xd+WSKW=k??s&cYs#dt9)JlFZe?*Df|dwZkc zJGQhB=?P-{*_3v0x_ngL(DeR*7Mlfw%evOCM`V@kMmH`p`ycT4I@X3iVE9{Sc9lH zdl3~uKiP|*7ZC(Oy^UT~e?l*M6@!SN}?zQjdx~p5WjW$kSxQ5;+H8 zFR@7+<03nvu|ztZtD;=4B1G}XSv5$i30XBDDh5(&5d#O@@cP4;Tj*|OG_yl&^=jQo zwy~_3%VZ0P(n$oP4044AV(}#6yn>XPhp6cAjYklep!!q1{G+|JjC9&q2QXNxHk?Ed z)DsCwgI;JNNC~*IvIeg|f^5D9YAONWSO7!rQ4D)VG3*(GQKX6EG2pgJvZRd&Y2Z*n=Ur7b9Ljy#6qfirx=|rjX5=j|mlHpHOrX zv&}YynIhKLpJ6;mBRa`J(TX@4jAHM=AodTrA5)-vAf@II ziiw~(sUL~4Tl)qNY!)iV`tzMGtWx8poUyDKwRq%Y`{HO=Yz`2cZdRNmDWyN9(gmD4 zbq0YDjbL~Z3@iQ27`2UhtNr}KvbdK{j???YT{yUD%d)e>>@0i< zb6cpYzBOcwIS||rkK;&HRRF|sOcX_@Bo7JJb;Vi>faiI*uDkcPZNqUKbC4z?`U)bV z4?QT$Qj4O%_kDsOAPhqQhGAe?7Up>-O;eI2F{kE;h&D~5ec!9KcHcTpleTTEbzT2Z zLDzMEui$#)cdl?7xAItEbtpxx8002ovPDHLkV1ne^ BX2t*j diff --git a/basic_materials/textures/basic_materials_steel_bar.png b/basic_materials/textures/basic_materials_steel_bar.png deleted file mode 100644 index 0673b6eefcb9a4f1a89fbdb0752f267f30476427..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311 zcmV-70m%M|P)S7)4Je$=eAk(uKaDh$2Nq5G>W!ke^1f3?^34G)+y2)SsozxJoGvY0^#aZWzvY z=iZNjUCVQA*}J`wGM_4kz&h%Xnm#rhNbW);d=P zl!ZMx7Jd+->v|)+>|nL+rp)US0IP6Y=ZZQ9d-C{bU+(;O{sVdPs6OnL;>-X5002ov JPDHLkV1h3Ykc|KU diff --git a/basic_materials/textures/basic_materials_steel_strip.png b/basic_materials/textures/basic_materials_steel_strip.png deleted file mode 100644 index 6384dc8302080b28df9b484c8113e9809e76f64e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326 zcmV-M0lEH(P)p{RH*@l&{j;V`-Lh=Kg3jd&7x*oiH8#cBX9Fr~jQwym-8a!Fq9kHYM%KS0fYf%w~K@}m*} Y0ADb?S;9pEJpcdz07*qoM6N<$g5}4dO8@`> diff --git a/basic_materials/textures/basic_materials_steel_wire.png b/basic_materials/textures/basic_materials_steel_wire.png deleted file mode 100644 index 0c96c8f34b2857f76ef34a0e68d560d7712dc543..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 284 zcmV+%0ptFOP)JC@R=W}rb3>?xXFYS=9VU6sdR1afOp+Lku>gpC5<(z^1Cu=GY{0&*xw)NUt;HBinx+7> zZHxCF@4xtXe`AoK-t9<|7-NnEiirFWgsTu-{{~%xfg7l*F3Y=%2vk*%O+2acdQ}b* iZ0;X=RUZ9JqxB7_@8$Uni6R#O0000 zOGs2v90%av|J-x$%(>T@QD@YdDKgEVA}FjD(ZhlsSVAqL*P;j)xd_?`R*(d>XjKse zErN(z1wB_4H9;5^Q6^UQFk`X_$I+S5dEM9PE?S5X)c4_Eyghk<@IM~zZRPL`oat(P zcdBz8Jg8D=1OZg;eh&o7krn*;XC?%f+)v-Ct2hN%T>G}kgw z$!3uLnZ&CPU$^%5XCGh&2G7p>U!=>pyw<+3KJ(+-73nyVshZ}Li*T$8q?C|m#o`J( ziCGvtiT$mc$u<*ZN2cBk4L7Bd--$#3t|m~(=P{NV#rsr-jZRK4Inv@^49}jZ!r-Be zK8RhbVtu)ixxC`o;KZb^aBY#nFf^s<+)!bJ!;`b+K%6mz zbuME;KTTCEESnpG<`W1A9|HApxKoqh3`mWQi)Ha@YkazN8Ne0}j{&sWj)bl;iiUJF za*jEXT8R2M$aPW9O~4n9z;z|GOa@KSi1Pi@&lmtd+hizufYXwIMo3PYayXrrmMbAu z6?P#9eUcpWrv=91PUCU=7@6VRnnK7o|dVR9?jjdJ;fAxt=bLArhCDo^$7GP!M4W zcoVy!+^XWgbeD?TTm_ 3 then + if force_exit then + minetest.chat_send_player(self.driver, S("[minecart] Recording canceled!")) + elseif dest_pos and player and #self.checkpoints > 3 then -- Remove last checkpoint, because it is potentially too close to the dest_pos table.remove(self.checkpoints) if self.start_pos then @@ -163,6 +165,8 @@ function minecart.recording_junctions(self) self.ctrl = {right = true} elseif ctrl.up or ctrl.down then self.ctrl = nil + elseif ctrl.jump then + return true end end if self.hud_time <= self.timebase then @@ -186,6 +190,8 @@ function minecart.player_ctrl(self) self.ctrl = {left = true} elseif ctrl.right then self.ctrl = {right = true} + elseif ctrl.jump then + return true end end end diff --git a/minecart/storage.lua b/minecart/storage.lua index 54f7a48..1ac383f 100644 --- a/minecart/storage.lua +++ b/minecart/storage.lua @@ -57,8 +57,8 @@ minetest.register_on_mods_loaded(function() -- mark all entity carts as zombified if cart.objID ~= 0 then cart.objID = -1 - minecart.push(1, cart) end + minecart.push(1, cart) end end end diff --git a/safer_lua/environ.lua b/safer_lua/environ.lua index f038f4f..09edbb6 100644 --- a/safer_lua/environ.lua +++ b/safer_lua/environ.lua @@ -61,11 +61,14 @@ local BASE_ENV = { if separator == "" then separator = " " end return safer_lua.Array(unpack(string.split(str, separator, include_empty, max_splits, sep_is_pattern))) end, + split2 = function(str, separator, include_empty, max_splits, sep_is_pattern) + if separator == "" then separator = " " end + return unpack(string.split(str, separator, include_empty, max_splits, sep_is_pattern)) + end, trim = string.trim, }, tonumber = tonumber, tostring = tostring, - unpack = unpack, type = type, ticks = 0, } diff --git a/safer_lua/init.lua b/safer_lua/init.lua index 0dde11d..e607168 100644 --- a/safer_lua/init.lua +++ b/safer_lua/init.lua @@ -15,7 +15,7 @@ safer_lua = {} -- Version for compatibility checks, see readme.md/history -safer_lua.version = 1.0 +safer_lua.version = 1.01 dofile(minetest.get_modpath("safer_lua") .. "/data_struct.lua") dofile(minetest.get_modpath("safer_lua") .. "/scanner.lua") diff --git a/safer_lua/readme.md b/safer_lua/readme.md index e157656..eb6bde8 100644 --- a/safer_lua/readme.md +++ b/safer_lua/readme.md @@ -8,7 +8,7 @@ A subset of the language Lua for safe and secure Lua sandboxes with: - limited posibilities to call functions ### License -Copyright (C) 2018-2020 Joachim Stolberg +Copyright (C) 2018-2021 Joachim Stolberg Code: Licensed under the GNU LGPL version 2.1 or later. See LICENSE.txt @@ -18,3 +18,4 @@ none ### History - 2018-06-24 v0.01 * first draft - 2020-03-14 v1.00 * extracted from TechPack and released +- 2021-11-28 v1.01 * function `string.split2` added, `unpack` removed diff --git a/signs_bot/basis.lua b/signs_bot/basis.lua index 893d413..ef5e1c3 100644 --- a/signs_bot/basis.lua +++ b/signs_bot/basis.lua @@ -199,6 +199,12 @@ function signs_bot.infotext(pos, state) meta:set_string("infotext", S("Robot Box").." "..number..": "..state) end +local function free_start_pos(pos, mem) + local param2 = (minetest.get_node(pos).param2 + 1) % 4 + local robot_pos = lib.next_pos(pos, param2, 1) + return signs_bot.lib.is_air_like(robot_pos) +end + local function reset_robot(pos, mem) mem.robot_param2 = (minetest.get_node(pos).param2 + 1) % 4 mem.robot_pos = lib.next_pos(pos, mem.robot_param2, 1) @@ -208,24 +214,26 @@ end function signs_bot.start_robot(base_pos) local mem = tubelib2.get_mem(base_pos) - mem.steps = nil - mem.script = "cond_move" - local meta = M(base_pos) - signs_bot.reset(base_pos, mem) - mem.running = true - mem.charging = false - mem.error = false - mem.stored_node = nil - if minetest.global_exists("techage") then - mem.capa = mem.capa or 0 -- enable power consumption - else - mem.capa = nil + if free_start_pos(base_pos, mem) then + mem.steps = nil + mem.script = "cond_move" + local meta = M(base_pos) + signs_bot.reset(base_pos, mem) + mem.running = true + mem.charging = false + mem.error = false + mem.stored_node = nil + if minetest.global_exists("techage") then + mem.capa = mem.capa or 0 -- enable power consumption + else + mem.capa = nil + end + meta:set_string("formspec", formspec(base_pos, mem)) + signs_bot.infotext(base_pos, S("running")) + reset_robot(base_pos, mem) + minetest.get_node_timer(base_pos):start(CYCLE_TIME) + return true end - meta:set_string("formspec", formspec(base_pos, mem)) - signs_bot.infotext(base_pos, S("running")) - reset_robot(base_pos, mem) - minetest.get_node_timer(base_pos):start(CYCLE_TIME) - return true end function signs_bot.stop_robot(base_pos, mem) diff --git a/signs_bot/cmd_item.lua b/signs_bot/cmd_item.lua index 4ed7d70..61dde86 100644 --- a/signs_bot/cmd_item.lua +++ b/signs_bot/cmd_item.lua @@ -239,17 +239,19 @@ signs_bot.register_botcommand("drop_items", { end, }) -signs_bot.register_botcommand("punch_cart", { - mod = "item", - params = "", - num_param = 0, - description = S("Punch a rail cart to start it"), - cmnd = function(base_pos, mem) - local punch_dir = minetest.facedir_to_dir(mem.robot_param2) - minecart.punch_cart(mem.robot_pos, mem.robot_param2, 1, punch_dir) - return signs_bot.DONE - end, -}) +if minetest.global_exists("minecart") then + signs_bot.register_botcommand("punch_cart", { + mod = "item", + params = "", + num_param = 0, + description = S("Punch a rail cart to start it"), + cmnd = function(base_pos, mem) + local punch_dir = minetest.facedir_to_dir(mem.robot_param2) + minecart.punch_cart(mem.robot_pos, mem.robot_param2, 1, punch_dir) + return signs_bot.DONE + end, + }) +end -- def is a table with following data: -- { diff --git a/signs_bot/init.lua b/signs_bot/init.lua index 30e9c7c..e02652c 100644 --- a/signs_bot/init.lua +++ b/signs_bot/init.lua @@ -65,7 +65,9 @@ dofile(MP.."/nodes.lua") dofile(MP.."/bot_sensor.lua") dofile(MP.."/node_sensor.lua") dofile(MP.."/crop_sensor.lua") -dofile(MP.."/cart_sensor.lua") +if minetest.global_exists("minecart") then + dofile(MP.."/cart_sensor.lua") +end dofile(MP.."/chest.lua") dofile(MP.."/legacy.lua") dofile(MP.."/techage.lua") diff --git a/signs_bot/signs.lua b/signs_bot/signs.lua index aa20777..2818dd9 100644 --- a/signs_bot/signs.lua +++ b/signs_bot/signs.lua @@ -195,7 +195,7 @@ minetest.register_craft({ } }) -if minetest.get_modpath("minecart") then +if minetest.global_exists("minecart") then register_sign({ name = "sign_add_cart", description = S('Sign "add to cart"'), @@ -273,7 +273,7 @@ if minetest.get_modpath("doc") then }) end -if minetest.get_modpath("doc") and minetest.get_modpath("minecart") then +if minetest.get_modpath("doc") and minetest.global_exists("minecart") then doc.add_entry("signs_bot", "sign_add_cart", { name = S('Sign "add to cart"'), data = { diff --git a/techage/README.md b/techage/README.md index 024dba7..69914bd 100644 --- a/techage/README.md +++ b/techage/README.md @@ -1,6 +1,6 @@ -# Tech Age [techage] (Minetest 5.3+) +# Tech Age [techage] (Minetest 5.4+) -Tech Age, a mod to go through 4 tech ages in search of wealth and power. +Tech Age, a mod to go through 5 tech ages in search of wealth and power. **Tech Age (techage) is the successor to TechPack V2, at first glance similar and yet completely different!** @@ -11,13 +11,12 @@ Tech Age, a mod to go through 4 tech ages in search of wealth and power. Important facts: - techage is not backwards compatible and cannot be installed on a server together with TechPack - techage is significantly more extensive, since additional mods are integrated -- techage represents 4 technological ages: +- techage represents 5 technological ages: - Iron Age (TA1) - simple tools like coal pile, coal burner, gravel sieve, hammer for getting ores and making goods - Steam Age (TA2) - Simple machines that are powered by steam engines and drive axles - Oil Age (TA3) - More modern machines that are powered by electricity. - The electricity is generated by coal & oil power plants. The oil must be explored, extracted and transported. - - Future Age (TA4) - Electricity from renewable energy sources such as sun and wind. - Environmentally friendly electricity storage, intelligent machines and means of transport of the future + - Present (TA4) - Electricity from renewable energy sources such as sun and wind. + - Future (TA5) - Machines to overcome space and time, new sources of energy and other achievements. - Since the levels build on each other, all ages have to be run through one after the other In contrast to TechPack, the resources are more limited and it is much more difficult to pass all levels. @@ -81,6 +80,20 @@ Available worlds will be converted to 'lsqlite3', but there is no way back, so: ### History +**2022-01-03 V1.06** +- TA5 teleport blocks added +- Many improvements + +**2021-12-25 V1.05** +- Support for the mod i3 added (thanks to ghaydn) +- TA5 enabled +- Many improvements + +**2021-12-12 V1.04** +- TA4 Collider added (experimental) +- move, turn, sound, and fly blocks added +- TA5 (future) introduced (TA4 is now the "present") + **2021-10-24 V1.03** - Add TA4 Sequencer for time controlled command sequences - Add TA4 Move Controller for moving blocks diff --git a/techage/basic_machines/autocrafter.lua b/techage/basic_machines/autocrafter.lua index 4f6fd85..5a0e733 100644 --- a/techage/basic_machines/autocrafter.lua +++ b/techage/basic_machines/autocrafter.lua @@ -189,6 +189,17 @@ local function normalize(item_list) return item_list end +local function get_input_from_recipeblock(pos, number, idx) + local own_num = M(pos):get_string("node_number") + local owner = M(pos):get_string("owner") + if techage.check_numbers(number, owner) then + local input = techage.send_single(own_num, number, "input", idx) + if input and type(input) == "string" then + return input + end + end +end + local function on_output_change(pos, inventory, stack) if not stack then inventory:set_list("output", {}) @@ -212,6 +223,47 @@ local function on_output_change(pos, inventory, stack) after_recipe_change(pos, inventory) end +local function determine_recipe_items(pos, input) + if input and type(input) == "string" then + -- Test if "." input + local num, idx = unpack(string.split(input, ".", false, 1)) + if num and idx then + input = get_input_from_recipeblock(pos, num, idx) + end + + if input then + -- ",,..." input + local items = string.split(input, ",", true, 8) + if items and type(items) == "table" and next(items) then + return items + end + end + end +end + +local function on_new_recipe(pos, input) + local items = determine_recipe_items(pos, input) + if items then + input = { + method = "normal", + width = 3, + items = items, + } + local output, _ = minetest.get_craft_result(input) + if output.item:get_name() ~= "" then + local inv = M(pos):get_inventory() + for i = 1, 9 do + inv:set_stack("recipe", i, input.items[i]) + end + after_recipe_change(pos, inv) + end + else + local inv = M(pos):get_inventory() + inv:set_list("recipe", {}) + after_recipe_change(pos, inv) + end +end + local function allow_metadata_inventory_put(pos, listname, index, stack, player) if minetest.is_protected(pos, player:get_player_name()) then @@ -346,6 +398,8 @@ tiles.act = { }, } +local INFO = [[Commands: 'state', 'recipe']] + local tubing = { on_inv_request = function(pos, in_dir, access_type) if access_type == "push" then @@ -378,7 +432,20 @@ local tubing = { end end, on_recv_message = function(pos, src, topic, payload) - return CRD(pos).State:on_receive_message(pos, topic, payload) + if topic == "recipe" and CRD(pos).stage == 4 then + if payload and payload ~= "" then + local inv = M(pos):get_inventory() + on_new_recipe(pos, payload) + return true + else + local inv = M(pos):get_inventory() + return inv:get_stack("output", 1):get_name() + end + elseif topic == "info" and CRD(pos).stage == 4 then + return INFO + else + return CRD(pos).State:on_receive_message(pos, topic, payload) + end end, on_node_load = function(pos) CRD(pos).State:on_node_load(pos) @@ -410,7 +477,7 @@ local node_name_ta2, node_name_ta3, node_name_ta4 = num_items = {0,1,2,4}, power_consumption = {0,4,6,9}, }, - {false, true, true, false}) -- TA2/TA3 + {false, true, true, true}) -- TA2/TA3/TA4 minetest.register_craft({ output = node_name_ta2, @@ -430,9 +497,18 @@ minetest.register_craft({ }, }) +minetest.register_craft({ + output = node_name_ta4, + recipe = { + {"", "default:diamond", ""}, + {"", node_name_ta3, ""}, + {"", "techage:ta4_wlanchip", ""}, + }, +}) + local Cable = techage.ElectricCable local power = networks.power -techage.register_node_for_v1_transition({"techage:ta3_autocrafter_pas"}, function(pos, node) +techage.register_node_for_v1_transition({"techage:ta3_autocrafter_pas", "techage:ta4_autocrafter_pas"}, function(pos, node) power.update_network(pos, nil, Cable) -end) \ No newline at end of file +end) diff --git a/techage/basic_machines/chest.lua b/techage/basic_machines/chest.lua index 36312cc..5d66ffa 100644 --- a/techage/basic_machines/chest.lua +++ b/techage/basic_machines/chest.lua @@ -45,6 +45,7 @@ end local function after_dig_node(pos, oldnode, oldmetadata, digger) techage.remove_node(pos, oldnode, oldmetadata) + techage.del_mem(pos) end local function formspec2() diff --git a/techage/basic_machines/consumer.lua b/techage/basic_machines/consumer.lua index d132ce5..f745a59 100644 --- a/techage/basic_machines/consumer.lua +++ b/techage/basic_machines/consumer.lua @@ -3,14 +3,14 @@ TechAge ======= - Copyright (C) 2019-2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information Consumer node basis functionality. It handles: - - up to 3 stages of nodes (TA2/TA3/TA4) + - up to 4 stages of nodes (TA2/TA3/TA4/TA5) - power consumption - node state handling - registration of passive and active nodes @@ -119,7 +119,7 @@ function techage.register_consumer(base_name, inv_name, tiles, tNode, validState if not node_name_prefix then node_name_prefix = "techage:ta" end - for stage = 2,4 do + for stage = 2,5 do local name_pas = node_name_prefix..stage.."_"..base_name.."_pas" local name_act = node_name_prefix..stage.."_"..base_name.."_act" local name_inv = "TA"..stage.." "..inv_name @@ -178,6 +178,7 @@ function techage.register_consumer(base_name, inv_name, tiles, tNode, validState local node = minetest.get_node(pos) meta:set_int("push_dir", techage.side_to_indir("L", node.param2)) meta:set_int("pull_dir", techage.side_to_indir("R", node.param2)) + meta:set_string("owner", placer:get_player_name()) -- Delete existing node number. Needed for Digtron compatibility. if (meta:contains("node_number")) then meta:set_string("node_number", "") @@ -298,5 +299,5 @@ function techage.register_consumer(base_name, inv_name, tiles, tNode, validState end end end - return names[1], names[2], names[3] + return names[1], names[2], names[3], names[4] end diff --git a/techage/basic_machines/electronic_fab.lua b/techage/basic_machines/electronic_fab.lua index b73318f..96a875b 100644 --- a/techage/basic_machines/electronic_fab.lua +++ b/techage/basic_machines/electronic_fab.lua @@ -32,21 +32,19 @@ local RecipeType = { local function formspec(self, pos, nvm) local rtype = RecipeType[CRD(pos).stage] + local owner = M(pos):get_string("owner") return "size[8.4,8.4]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;src;0,0;2,4;]".. - recipes.formspec(2.2, 0, rtype, nvm).. - "list[context;dst;6.4,0;2,4;]".. - "image_button[3.7,3.3;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[3.7,3.3;1,1;"..self:get_state_tooltip(nvm).."]".. - "list[current_player;main;0.2,4.5;8,4;]".. - "listring[context;dst]".. - "listring[current_player;main]".. - "listring[context;src]".. - "listring[current_player;main]".. - default.get_hotbar_bg(0.2, 4.5) + "list[context;src;0,0;2,4;]".. + recipes.formspec(2.2, 0, rtype, nvm, owner).. + "list[context;dst;6.4,0;2,4;]".. + "image_button[3.7,3.3;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. + "tooltip[3.7,3.3;1,1;"..self:get_state_tooltip(nvm).."]".. + "list[current_player;main;0.2,4.5;8,4;]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0.2, 4.5) end local function allow_metadata_inventory_put(pos, listname, index, stack, player) @@ -261,24 +259,22 @@ minetest.register_craft({ }, }) -if minetest.global_exists("unified_inventory") then - unified_inventory.register_craft_type("ta2_electronic_fab", { - description = S("TA2 Ele Fab"), - icon = 'techage_filling_ta2.png^techage_appl_electronic_fab.png^techage_frame_ta2.png', - width = 2, - height = 2, - }) - unified_inventory.register_craft_type("ta3_electronic_fab", { - description = S("TA3 Ele Fab"), - icon = 'techage_filling_ta3.png^techage_appl_electronic_fab.png^techage_frame_ta3.png', - width = 2, - height = 2, - }) - unified_inventory.register_craft_type("ta4_electronic_fab", { - description = S("TA4 Ele Fab"), - icon = 'techage_filling_ta4.png^techage_appl_electronic_fab.png^techage_frame_ta4.png', - width = 2, - height = 2, - }) -end +techage.recipes.register_craft_type("ta2_electronic_fab", { + description = S("TA2 Ele Fab"), + icon = 'techage_filling_ta2.png^techage_appl_electronic_fab.png^techage_frame_ta2.png', + width = 2, + height = 2, +}) +techage.recipes.register_craft_type("ta3_electronic_fab", { + description = S("TA3 Ele Fab"), + icon = 'techage_filling_ta3.png^techage_appl_electronic_fab.png^techage_frame_ta3.png', + width = 2, + height = 2, +}) +techage.recipes.register_craft_type("ta4_electronic_fab", { + description = S("TA4 Ele Fab"), + icon = 'techage_filling_ta4.png^techage_appl_electronic_fab.png^techage_frame_ta4.png', + width = 2, + height = 2, +}) diff --git a/techage/basic_machines/gravelrinser.lua b/techage/basic_machines/gravelrinser.lua index 1d91dd9..3df776f 100644 --- a/techage/basic_machines/gravelrinser.lua +++ b/techage/basic_machines/gravelrinser.lua @@ -317,22 +317,18 @@ minetest.register_craft({ }) -if minetest.global_exists("unified_inventory") then - unified_inventory.register_craft_type("rinsing", { - description = S("Rinsing"), - icon = "techage_appl_rinser_top.png^techage_frame_ta2_top.png", - width = 2, - height = 2, - }) -end +techage.recipes.register_craft_type("rinsing", { + description = S("Rinsing"), + icon = "techage_appl_rinser_top.png^techage_frame_ta2_top.png", + width = 2, + height = 2, +}) function techage.add_rinser_recipe(recipe) Probability[recipe.output] = recipe.probability - if minetest.global_exists("unified_inventory") then - recipe.items = {recipe.input} - recipe.type = "rinsing" - unified_inventory.register_craft(recipe) - end + recipe.items = {recipe.input} + recipe.type = "rinsing" + techage.recipes.register_craft(recipe) end techage.add_rinser_recipe({input="techage:sieved_gravel", output="techage:usmium_nuggets", probability=30}) diff --git a/techage/basic_machines/gravelsieve.lua b/techage/basic_machines/gravelsieve.lua index 0bd9aa4..3152d3c 100644 --- a/techage/basic_machines/gravelsieve.lua +++ b/techage/basic_machines/gravelsieve.lua @@ -246,38 +246,36 @@ minetest.register_craft({ }, }) -if minetest.global_exists("unified_inventory") then - unified_inventory.register_craft_type("ta2_gravelsieve", { - description = S("TA2 Gravel Sieve"), - icon = 'techage_sieve_sieve_ta1.png', - width = 1, - height = 1, - }) - unified_inventory.register_craft_type("ta3_gravelsieve", { - description = S("TA3 Gravel Sieve"), - icon = 'techage_filling_ta3.png^techage_appl_sieve.png^techage_frame_ta3.png', - width = 1, - height = 1, - }) - unified_inventory.register_craft_type("ta4_gravelsieve", { - description = S("TA4 Gravel Sieve"), - icon = 'techage_filling_ta4.png^techage_appl_sieve.png^techage_frame_ta4.png', - width = 1, - height = 1, - }) - unified_inventory.register_craft({ - output = "techage:sieved_basalt_gravel", - items = {"techage:basalt_gravel"}, - type = "ta2_gravelsieve", - }) - unified_inventory.register_craft({ - output = "techage:sieved_basalt_gravel", - items = {"techage:basalt_gravel"}, - type = "ta3_gravelsieve", - }) - unified_inventory.register_craft({ - output = "techage:sieved_basalt_gravel", - items = {"techage:basalt_gravel"}, - type = "ta4_gravelsieve", - }) -end +techage.recipes.register_craft_type("ta2_gravelsieve", { + description = S("TA2 Gravel Sieve"), + icon = 'techage_sieve_sieve_ta1.png', + width = 1, + height = 1, +}) +techage.recipes.register_craft_type("ta3_gravelsieve", { + description = S("TA3 Gravel Sieve"), + icon = 'techage_filling_ta3.png^techage_appl_sieve.png^techage_frame_ta3.png', + width = 1, + height = 1, +}) +techage.recipes.register_craft_type("ta4_gravelsieve", { + description = S("TA4 Gravel Sieve"), + icon = 'techage_filling_ta4.png^techage_appl_sieve.png^techage_frame_ta4.png', + width = 1, + height = 1, +}) +techage.recipes.register_craft({ + output = "techage:sieved_basalt_gravel", + items = {"techage:basalt_gravel"}, + type = "ta2_gravelsieve", +}) +techage.recipes.register_craft({ + output = "techage:sieved_basalt_gravel", + items = {"techage:basalt_gravel"}, + type = "ta3_gravelsieve", +}) +techage.recipes.register_craft({ + output = "techage:sieved_basalt_gravel", + items = {"techage:basalt_gravel"}, + type = "ta4_gravelsieve", +}) diff --git a/techage/basic_machines/grinder.lua b/techage/basic_machines/grinder.lua index 9cf8dcd..ec20d1a 100644 --- a/techage/basic_machines/grinder.lua +++ b/techage/basic_machines/grinder.lua @@ -351,20 +351,18 @@ minetest.register_craft({ }, }) -if minetest.global_exists("unified_inventory") then - unified_inventory.register_craft_type("grinding", { - description = S("Grinding"), - icon = 'techage_appl_grinder.png', - width = 2, - height = 2, - }) - unified_inventory.register_craft_type("milling", { - description = S("Milling"), - icon = 'techage_mill_inv.png', - width = 2, - height = 2, - }) -end +techage.recipes.register_craft_type("grinding", { + description = S("Grinding"), + icon = 'techage_appl_grinder.png', + width = 2, + height = 2, +}) +techage.recipes.register_craft_type("milling", { + description = S("Milling"), + icon = 'techage_mill_inv.png', + width = 2, + height = 2, +}) function techage.add_grinder_recipe(recipe, ta1_permitted) local name, num = unpack(string.split(recipe.input, " ", false, 1)) @@ -372,20 +370,16 @@ function techage.add_grinder_recipe(recipe, ta1_permitted) if ta1_permitted then RecipesTa1[name] = {input = name,inp_num = tonumber(num) or 1, output = recipe.output} - if minetest.global_exists("unified_inventory") then - recipe.items = {recipe.input} - recipe.type = "milling" - unified_inventory.register_craft(table.copy(recipe)) - end + recipe.items = {recipe.input} + recipe.type = "milling" + techage.recipes.register_craft(table.copy(recipe)) end Recipes[name] = {input = name,inp_num = tonumber(num) or 1, output = recipe.output} - if minetest.global_exists("unified_inventory") then - recipe.items = {recipe.input} - recipe.type = "grinding" - unified_inventory.register_craft(recipe) - end + recipe.items = {recipe.input} + recipe.type = "grinding" + techage.recipes.register_craft(recipe) end end diff --git a/techage/basic_machines/recipeblock.lua b/techage/basic_machines/recipeblock.lua new file mode 100644 index 0000000..3e34cc5 --- /dev/null +++ b/techage/basic_machines/recipeblock.lua @@ -0,0 +1,244 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2021 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA4 Recipe Block for the TA4 Autocrafter +]]-- + +-- for lazy programmers +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local S2P = minetest.string_to_pos +local M = minetest.get_meta +local S = techage.S + +local MAX_RECIPE = 10 + +local function recipes_formspec(x, y, idx) + return "container[" .. x .. "," .. y .. "]" .. + "background[0,0;8,3.2;techage_form_grey.png]" .. + "list[context;input;0.1,0.1;3,3;]" .. + "image[3,1.1;1,1;techage_form_arrow.png]" .. + "list[context;output;3.9,1.1;1,1;]" .. + "button[5.5,1.1;1,1;priv;<<]" .. + "button[6.5,1.1;1,1;next;>>]" .. + "label[5.5,0.5;"..S("Recipe") .. ": " .. idx .. "/" .. MAX_RECIPE .. "]" .. + "container_end[]" +end + +local function formspec(pos, nvm) + return "size[8,7.4]".. + recipes_formspec(0, 0, nvm.recipe_idx or 1) .. + "list[current_player;main;0,3.6;8,4;]" .. + "listring[current_player;main]".. + "listring[context;src]" .. + "listring[current_player;main]".. + "listring[context;dst]" .. + "listring[current_player;main]" +end + +local function determine_new_input(pos, inv) + local output = inv:get_stack("output", 1):get_name() + if output and output ~= "" then + local recipe = minetest.get_craft_recipe(output) + if recipe.items and recipe.type == "normal" then + for i = 1, 9 do + local name = recipe.items[i] + if name then + if minetest.registered_items[name] then + inv:set_stack("input", i, name) + end + end + end + inv:set_stack("output", 1, recipe.output) + end + else + for i = 1, 9 do + inv:set_stack("input", i, nil) + end + end +end + +local function determine_new_output(pos, inv) + local items = {} + for i = 1, 9 do + items[i] = inv:get_stack("input", i):get_name() + end + local input = { + method = "normal", + width = 3, + items = items, + } + local output, _ = minetest.get_craft_result(input) + inv:set_stack("output", 1, output.item) +end + +local function get_recipe(inv) + local items = {} + local last_idx = 0 + for i = 1, 9 do + local name = inv:get_stack("input", i):get_name() + if name ~= "" then + last_idx = i + end + items[i] = name + end + local input = table.concat(items, ",", 1, last_idx) + local stack = inv:get_stack("output", 1) + return { + input = input, + output = stack:get_name() .. " " .. stack:get_count() + } +end + +local function after_recipe_change(pos, inv, listname) + if listname == "input" then + determine_new_output(pos, inv) + else + determine_new_input(pos, inv) + end + local nvm = techage.get_nvm(pos) + nvm.recipes = nvm.recipes or {} + nvm.recipes[nvm.recipe_idx or 1] = get_recipe(inv) +end + +local function update_inventor(pos, inv, idx) + local nvm = techage.get_nvm(pos) + nvm.recipes = nvm.recipes or {} + local recipe = nvm.recipes[idx] + if recipe then + local items = string.split(recipe.input, ",", true) + for i = 1, 9 do + inv:set_stack("input", i, items[i] or "") + end + inv:set_stack("output", 1, recipe.output) + else + for i = 1, 9 do + inv:set_stack("input", i, nil) + end + inv:set_stack("output", 1, nil) + end +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + local inv = M(pos):get_inventory() + local list = inv:get_list(listname) + stack:set_count(1) + inv:set_stack(listname, index, stack) + after_recipe_change(pos, inv, listname) + return 0 +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + local inv = M(pos):get_inventory() + inv:set_stack(listname, index, nil) + after_recipe_change(pos, inv, listname) + return 0 +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + local inv = M(pos):get_inventory() + if from_list == to_list then + minetest.after(0.1, after_recipe_change, pos, inv, from_list) + return 1 + end + return 0 +end + +minetest.register_node("techage:ta4_recipeblock", { + description = S("TA4 Recipe Block"), + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta4.png^techage_frame_ta4_top.png", + "techage_filling_ta4.png^techage_frame_ta4_top.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_recipeblock.png", + }, + + on_construct = function(pos) + local inv = M(pos):get_inventory() + inv:set_size('input', 9) + inv:set_size('output', 1) + end, + + after_place_node = function(pos, placer, itemstack) + local nvm = techage.get_nvm(pos) + local number = techage.add_node(pos, "techage:ta4_chest") + M(pos):set_string("owner", placer:get_player_name()) + M(pos):set_string("node_number", number) + M(pos):set_string("formspec", formspec(pos, nvm)) + M(pos):set_string("infotext", S("TA4 Recipe Block") .. " " .. number) + end, + + on_receive_fields = function(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + + local nvm = techage.get_nvm(pos) + nvm.recipe_idx = nvm.recipe_idx or 1 + if fields.next == ">>" then + nvm.recipe_idx = techage.in_range(nvm.recipe_idx + 1, 1, MAX_RECIPE) + elseif fields.priv == "<<" then + nvm.recipe_idx = techage.in_range(nvm.recipe_idx - 1, 1, MAX_RECIPE) + end + local inv = M(pos):get_inventory() + update_inventor(pos, inv, nvm.recipe_idx or 1) + M(pos):set_string("formspec", formspec(pos, nvm)) + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + techage.remove_node(pos, oldnode, oldmetadata) + techage.del_mem(pos) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +techage.register_node({"techage:ta4_recipeblock"}, { + on_recv_message = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == "input" and payload and payload ~= "" then + nvm.recipes = nvm.recipes or {} + local recipe = nvm.recipes[tonumber(payload) or 1] + if recipe then + return recipe.input + end + else + return "unsupported" + end + end, +}) + +minetest.register_craft({ + output = "techage:ta4_recipeblock", + recipe = { + {"techage:ta4_carbon_fiber", "dye:blue", "techage:aluminum"}, + {"", "basic_materials:ic", ""}, + {"default:steel_ingot", "techage:ta4_wlanchip", "default:steel_ingot"}, + }, +}) + diff --git a/techage/basic_machines/recycler.lua b/techage/basic_machines/recycler.lua index ce85b3f..f2adfc2 100644 --- a/techage/basic_machines/recycler.lua +++ b/techage/basic_machines/recycler.lua @@ -26,40 +26,44 @@ local CYCLE_TIME = 8 local Recipes = {} local SpecialItems = { - ["techage:sieved_gravel"] = "default:sand", - ["basic_materials:heating_element"] = "default:copper_ingot", - ["techage:ta4_wlanchip"] = "", - ["techage:basalt_cobble"] = "default:sand", - ["default:stone"] = "techage:sieved_gravel", - ["default:wood"] = "default:stick 5", - ["basic_materials:concrete_block"] = "techage:sieved_gravel", - ["dye:green"] = "", - ["dye:red"] = "", - ["dye:white"] = "", - ["dye:blue"] = "", - ["dye:brown"] = "", + ["techage:sieved_gravel"] = "default:sand", + ["basic_materials:heating_element"] = "default:copper_ingot", + ["techage:ta4_wlanchip"] = "", + ["techage:basalt_cobble"] = "default:sand", + ["default:stone"] = "techage:sieved_gravel", + ["default:wood"] = "default:stick 5", + ["basic_materials:concrete_block"] = "techage:sieved_gravel", + ["dye:green"] = "", + ["dye:red"] = "", + ["dye:white"] = "", + ["dye:blue"] = "", + ["dye:brown"] = "", ["dye:cyan"] = "", ["dye:yellow"] = "", ["dye:grey"] = "", ["dye:orange"] = "", - ["dye:black"] = "", - ["techage:basalt_glass_thin"] = "", - ["group:stone"] = "techage:sieved_gravel", - ["basic_materials:plastic_sheet"] = "", - ["group:wood"] = "default:stick 5", - ["techage:basalt_glass"] = "", - ["default:junglewood"] = "default:stick 5", - ["techage:ta4_silicon_wafer"] = "", - ["default:cobble"] = "techage:sieved_gravel", - ["default:pick_diamond"] = "default:stick", - ["techage:hammer_steel"] = "default:stick", - ["default:paper"] = "", - ["stairs:slab_basalt_glass2"] = "", - ["techage:basalt_stone"] = "techage:sieved_gravel", - ["techage:ta4_ramchip"] = "", + ["dye:black"] = "", + ["techage:basalt_glass_thin"] = "", + ["group:stone"] = "techage:sieved_gravel", + ["basic_materials:plastic_sheet"] = "", + ["group:wood"] = "default:stick 5", + ["techage:basalt_glass"] = "", + ["default:junglewood"] = "default:stick 5", + ["techage:ta4_silicon_wafer"] = "", + ["default:cobble"] = "techage:sieved_gravel", + ["default:pick_diamond"] = "default:stick", + ["techage:hammer_steel"] = "default:stick", + ["default:paper"] = "", + ["stairs:slab_basalt_glass2"] = "", + ["techage:basalt_stone"] = "techage:sieved_gravel", + ["techage:ta4_ramchip"] = "", ["protector:chest"] = "default:chest", ["techage:ta4_rotor_blade"] = "", ["techage:ta4_carbon_fiber"] = "", + ["techage:ta4_round_ceramic"] = "", + ["techage:ta4_furnace_ceramic"] = "", + ["techage:ta5_aichip"] = "", + ["techage:ta4_leds"] = "", } local function formspec(self, pos, nvm) diff --git a/techage/basic_machines/ta5_chest.lua b/techage/basic_machines/ta5_chest.lua new file mode 100644 index 0000000..222525d --- /dev/null +++ b/techage/basic_machines/ta5_chest.lua @@ -0,0 +1,185 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2022 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA5 Hyperloop Chest + +]]-- + +-- for lazy programmers +local S2P = minetest.string_to_pos +local P2S = minetest.pos_to_string +local M = minetest.get_meta +local S = techage.S + +local TA4_INV_SIZE = 32 +local EX_POINTS = 20 + +local hyperloop = techage.hyperloop +local remote_pos = techage.hyperloop.remote_pos +local shared_inv = techage.shared_inv +local menu = techage.menu + +local function formspec(pos) + local ndef = minetest.registered_nodes["techage:ta5_hl_chest"] + local status = M(pos):get_string("conn_status") + if hyperloop.is_client(pos) or hyperloop.is_server(pos) then + local title = ndef.description .. " " .. status + return "size[8,9]".. + "box[0,-0.1;7.8,0.5;#c6e8ff]" .. + "label[0.2,-0.1;" .. minetest.colorize( "#000000", title) .. "]" .. + "list[context;main;0,1;8,4;]".. + "list[current_player;main;0,5.3;8,4;]".. + "listring[context;main]".. + "listring[current_player;main]" + else + return menu.generate_formspec(pos, ndef, hyperloop.SUBMENU) + end +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + shared_inv.before_inv_access(pos, listname) + local inv = minetest.get_inventory({type="node", pos=pos}) + if inv:room_for_item(listname, stack) then + return stack:get_count() + end + return 0 +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + shared_inv.before_inv_access(pos, listname) + local inv = minetest.get_inventory({type="node", pos=pos}) + if inv:contains_item(listname, stack) then + return stack:get_count() + end + return 0 +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + if shared_inv.before_inv_access(pos, "main") then + return 0 + end + return count +end + +minetest.register_node("techage:ta5_hl_chest", { + description = S("TA5 Hyperloop Chest"), + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta4.png^techage_frame_ta5_top.png", + "techage_filling_ta4.png^techage_frame_ta5.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_chest_back_ta4.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_chest_back_ta4.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_chest_back_ta4.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_chest_front_ta4.png", + }, + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size('main', 32) + local number = techage.add_node(pos, "techage:ta5_hl_chest") + meta:set_string("node_number", number) + meta:set_string("owner", placer:get_player_name()) + meta:set_string("formspec", formspec(pos)) + meta:set_string("infotext", S("TA5 Hyperloop Chest").." "..number) + hyperloop.after_place_node(pos, placer, "chest") + end, + on_receive_fields = function(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + if techage.get_expoints(player) >= EX_POINTS then + if techage.menu.eval_input(pos, hyperloop.SUBMENU, fields) then + hyperloop.after_formspec(pos, fields) + shared_inv.on_rightclick(pos, player, "main") + M(pos):set_string("formspec", formspec(pos)) + end + end + end, + on_timer = shared_inv.node_timer, + on_rightclick = function(pos, node, clicker) + shared_inv.on_rightclick(pos, clicker, "main") + M(pos):set_string("formspec", formspec(pos)) + end, + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + shared_inv.before_inv_access(pos, "main") + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("main") + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + techage.remove_node(pos, oldnode, oldmetadata) + hyperloop.after_dig_node(pos, oldnode, oldmetadata, digger) + techage.del_mem(pos) + end, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + on_metadata_inventory_put = shared_inv.after_inv_access, + on_metadata_inventory_take = shared_inv.after_inv_access, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +techage.register_node({"techage:ta5_hl_chest"}, { + on_inv_request = function(pos, in_dir, access_type) + pos = remote_pos(pos) + local meta = minetest.get_meta(pos) + return meta:get_inventory(), "main" + end, + on_pull_item = function(pos, in_dir, num, item_name) + pos = remote_pos(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return techage.get_items(pos, inv, "main", num) + end, + on_push_item = function(pos, in_dir, stack) + if techage.hyperloop.is_paired(pos) then + pos = remote_pos(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return techage.put_items(inv, "main", stack) + end + return false + end, + on_unpull_item = function(pos, in_dir, stack) + pos = remote_pos(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return techage.put_items(inv, "main", stack) + end, + on_recv_message = function(pos, src, topic, payload) + if topic == "state" then + pos = remote_pos(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return techage.get_inv_state(inv, "main") + else + return "unsupported" + end + end, +}) + + +minetest.register_craft({ + type = "shapeless", + output = "techage:ta5_hl_chest", + recipe = {"techage:chest_ta4", "techage:ta5_aichip"} +}) diff --git a/techage/basis/assemble.lua b/techage/basis/assemble.lua index 8437c1f..b176495 100644 --- a/techage/basis/assemble.lua +++ b/techage/basis/assemble.lua @@ -124,3 +124,118 @@ function techage.assemble.remove(pos, AssemblyPlan, player_name) remove(pos, node.param2, AssemblyPlan, #AssemblyPlan) nvm.assemble_build = false end + +-------------------------------------------------------------------------------- +-- Assembly functions based on nodes from node inventory +-------------------------------------------------------------------------------- +local function play_sound(pos, sound) + minetest.sound_play(sound, { + pos = pos, + gain = 1, + max_hear_distance = 10, + }) +end + +local function build_inv(pos, inv, param2, AssemblyPlan, player_name, idx) + local item = AssemblyPlan[idx] + if item ~= nil then + local y, path, fd_offs, node_name = item[1], item[2], item[3], item[4] + local pos1 = dest_pos(pos, param2, path, y) + if not minetest.is_protected(pos1, player_name) then + local node = minetest.get_node(pos1) + if techage.is_air_like(node.name) then + local stack = inv:remove_item("src", ItemStack(node_name)) + if stack:get_count() == 1 then + minetest.add_node(pos1, {name=node_name, param2=(param2 + fd_offs) % 4}) + play_sound(pos, "default_place_node_hard") + local ndef = minetest.registered_nodes[node_name] + if ndef and ndef.after_place_node then + local placer = minetest.get_player_by_name(player_name) + ndef.after_place_node(pos1, placer, ItemStack(node_name)) + end + end + end + end + minetest.after(0.5, build_inv, pos, inv, param2, AssemblyPlan, player_name, idx + 1) + else + local nvm = techage.get_nvm(pos) + nvm.assemble_locked = false + end +end + +local function remove_inv(pos, inv, param2, AssemblyPlan, player_name, idx) + local item = AssemblyPlan[idx] + if item ~= nil then + local y, path, fd_offs, node_name = item[1], item[2], item[3], item[4] + local pos1 = dest_pos(pos, param2, path, y) + if not minetest.is_protected(pos1, player_name) then + local stack = ItemStack(node_name) + if inv:room_for_item("src", stack) then + local node = minetest.get_node(pos1) + if node.name == node_name then + minetest.remove_node(pos1) + inv:add_item("src", stack) + play_sound(pos, "default_dig_cracky") + local ndef = minetest.registered_nodes[node_name] + if ndef and ndef.after_dig_node then + local digger = minetest.get_player_by_name(player_name) + ndef.after_dig_node(pos1, pos, ItemStack(node_name), {}, digger) + end + end + end + end + minetest.after(0.5, remove_inv, pos, inv, param2, AssemblyPlan, player_name, idx - 1) + else + local nvm = techage.get_nvm(pos) + nvm.assemble_locked = false + end +end + +function techage.assemble.build_inv(pos, inv, AssemblyPlan, player_name) + -- check protection + if minetest.is_protected(pos, player_name) then + return + end + local nvm = techage.get_nvm(pos) + if nvm.assemble_locked then + return + end + local node = minetest.get_node(pos) + nvm.assemble_locked = true + build_inv(pos, inv, node.param2, AssemblyPlan, player_name, 1) +end + +function techage.assemble.remove_inv(pos, inv, AssemblyPlan, player_name) + -- check protection + if minetest.is_protected(pos, player_name) then + return + end + local nvm = techage.get_nvm(pos) + if nvm.assemble_locked then + return + end + local node = minetest.get_node(pos) + nvm.assemble_locked = true + remove_inv(pos, inv, node.param2, AssemblyPlan, player_name, #AssemblyPlan) +end + +function techage.assemble.count_items(AssemblyPlan) + local t = {} + for _, item in ipairs(AssemblyPlan) do + local node_name = item[4] + local ndef = minetest.registered_nodes[node_name] + local name = ndef.description + if not t[name] then + t[name] = 1 + else + t[name] = t[name] + 1 + end + end + return t +end + +-- Determine the destination position based on the given route +-- param2, and a route table like : {0,3} +-- 0 = forward, 1 = right, 2 = backward, 3 = left +-- techage.assemble.get_pos(pos, param2, route, y_offs) +techage.assemble.get_pos = dest_pos diff --git a/techage/basis/command.lua b/techage/basis/command.lua index f09fe94..1cd93fb 100644 --- a/techage/basis/command.lua +++ b/techage/basis/command.lua @@ -262,6 +262,28 @@ function techage.repair_number(pos) end end +-- Like techage.add_node, but use the old number again +function techage.unpack_node(pos, name, number) + if item_handling_node(name) then + Tube:after_place_node(pos) + end + local key = minetest.hash_node_position(pos) + NumbersToBeRecycled[key] = nil + if number then + backend.set_nodepos(number, pos) + end +end + +-- Like techage.remove_node but don't store the number for this position +function techage.pack_node(pos, oldnode, number) + if number then + NodeInfoCache[number] = nil + end + if oldnode and item_handling_node(oldnode.name) then + Tube:after_dig_node(pos) + end +end + ------------------------------------------------------------------- -- Node register function @@ -544,3 +566,62 @@ function techage.get_inv_state(inv, listname) end return state end + +minetest.register_chatcommand("ta_send", { + description = minetest.formspec_escape( + "Send a techage command to the block with the number given: /ta_send []"), + func = function(name, param) + local num, cmnd, payload = param:match('^([0-9]+)%s+(%w+)%s*(.*)$') + + if num and cmnd then + if techage.not_protected(num, name) then + local resp = techage.send_single("0", num, cmnd, payload) + if type(resp) == "string" then + return true, resp + else + return true, dump(resp) + end + else + return false, "Destination block is protected" + end + end + return false, "Syntax: /ta_send []" + end +}) + +minetest.register_chatcommand("expoints", { + privs = { + server = true + }, + func = function(name, param) + local player_name, points = param:match("^(%S+)%s*(%d*)$") + if player_name then + local player = minetest.get_player_by_name(player_name) + if player then + if points and points ~= "" then + if techage.set_expoints(player, tonumber(points)) then + return true, "The player "..player_name.." now has "..points.." experience points." + end + else + points = techage.get_expoints(player) + return true, "The player "..player_name.." has "..points.." experience points." + end + else + return false, "Unknown player "..player_name + end + end + return false, "Syntax error! Syntax: /expoints []" + end +}) + +minetest.register_chatcommand("my_expoints", { + func = function(name, param) + local player = minetest.get_player_by_name(name) + if player then + local points = techage.get_expoints(player) + if points then + return true, "You have "..points.." experience points." + end + end + end +}) diff --git a/techage/basis/counting.lua b/techage/basis/counting.lua index 265b048..33db84d 100644 --- a/techage/basis/counting.lua +++ b/techage/basis/counting.lua @@ -34,6 +34,10 @@ function techage.counting_hit() end end +function techage.counting_add(player_name, points) + PlayerPoints[player_name] = (PlayerPoints[player_name] or 0) + points +end + local function output() for name, val in pairs(PlayerPoints) do if val > MAX_POINTS then diff --git a/techage/basis/fly_lib.lua b/techage/basis/fly_lib.lua new file mode 100644 index 0000000..8cc8d19 --- /dev/null +++ b/techage/basis/fly_lib.lua @@ -0,0 +1,733 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2020-2021 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + Block fly/move library + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local S2P = minetest.string_to_pos +local S = techage.S + +local flylib = {} + +local function lvect_add_vec(lvect1, offs) + if not lvect1 or not offs then return end + + local lvect2 = {} + for _, v in ipairs(lvect1) do + lvect2[#lvect2 + 1] = vector.add(v, offs) + end + return lvect2 +end + +local function lvect_add(lvect1, lvect2) + if not lvect1 or not lvect2 then return end + + local lvect3 = {} + for i, v in ipairs(lvect1) do + lvect3[#lvect3 + 1] = vector.add(v, lvect2[i]) + end + return lvect3 +end + +local function lvect_subtract(lvect1, lvect2) + if not lvect1 or not lvect2 then return end + + local lvect3 = {} + for i, v in ipairs(lvect1) do + lvect3[#lvect3 + 1] = vector.subtract(v, lvect2[i]) + end + return lvect3 +end + +-- yaw in radiant +local function rotate(v, yaw) + local sinyaw = math.sin(yaw) + local cosyaw = math.cos(yaw) + return {x = v.x * cosyaw - v.z * sinyaw, y = v.y, z = v.x * sinyaw + v.z * cosyaw} +end + +------------------------------------------------------------------------------- +-- to_path function for the fly/move path +------------------------------------------------------------------------------- + +local function strsplit(text) + text = text:gsub("\r\n", "\n") + text = text:gsub("\r", "\n") + return string.split(text, "\n", true) +end + +local function trim(s) + return (s:gsub("^%s*(.-)%s*$", "%1")) +end + +function flylib.distance(v) + return math.abs(v.x) + math.abs(v.y) + math.abs(v.z) +end + +function flylib.to_vector(s) + local x,y,z = unpack(string.split(s, ",")) + if x and y and z then + return { + x=tonumber(x) or 0, + y=tonumber(y) or 0, + z=tonumber(z) or 0, + } + end +end + +function flylib.to_path(s, max_dist) + local tPath + local dist = 0 + + for _, line in ipairs(strsplit(s)) do + line = trim(line) + line = string.split(line, "--", true, 1)[1] or "" + if line ~= "" then + local v = flylib.to_vector(line) + if v then + dist = dist + flylib.distance(v) + if not max_dist or dist <= max_dist then + tPath = tPath or {} + tPath[#tPath + 1] = v + else + return tPath, S("Error: Max. length of the flight route exceeded !!") + end + else + return tPath, S("Error: Invalid path !!") + end + end + end + return tPath +end + +local function next_path_pos(pos, lpath, idx) + local offs = lpath[idx] + if offs then + return vector.add(pos, offs) + end +end + +local function reverse_path(lpath) + local lres = {} + for i = #lpath, 1, -1 do + lres[#lres + 1] = vector.multiply(lpath[i], -1) + end + return lres +end + +local function dest_offset(lpath) + local offs = {x=0, y=0, z=0} + for i = 1,#lpath do + offs = vector.add(offs, lpath[i]) + end + return offs +end + +------------------------------------------------------------------------------- +-- Entity / Move / Attach / Detach +------------------------------------------------------------------------------- +local MIN_SPEED = 0.4 +local MAX_SPEED = 8 +local CORNER_SPEED = 4 +local SimpleNodes = techage.logic.SimpleNodes + +local function calc_speed(v) + return math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z) +end + +-- Only the ID ist stored, not the object +local function get_object_id(object) + for id, entity in pairs(minetest.luaentities) do + if entity.object == object then + return id + end + end +end + +-- determine exact position of attached entities +local function obj_pos(obj) + local _, _, pos = obj:get_attach() + if pos then + pos = vector.divide(pos, 29) + return vector.add(obj:get_pos(), pos) + end +end + +-- Check access conflicts with other mods +local function lock_player(player) + local meta = player:get_meta() + if meta:get_int("player_physics_locked") == 0 then + meta:set_int("player_physics_locked", 1) + meta:set_string("player_physics_locked_by", "ta_flylib") + return true + end + return false +end + +local function unlock_player(player) + local meta = player:get_meta() + if meta:get_int("player_physics_locked") == 1 then + if meta:get_string("player_physics_locked_by") == "ta_flylib" then + meta:set_int("player_physics_locked", 0) + meta:set_string("player_physics_locked_by", "") + return true + end + end + return false +end + +local function detach_player(player) + local pos = obj_pos(player) + if pos then + player:set_detach() + player:set_properties({visual_size = {x=1, y=1}}) + player:set_pos(pos) + end + -- TODO: move to save position +end + +-- Attach player/mob to given parent object (block) +local function attach_single_object(parent, obj, dir) + local self = parent:get_luaentity() + local res = obj:get_attach() + if not res then -- not already attached + local yaw + if obj:is_player() then + yaw = obj:get_look_horizontal() + else + yaw = obj:get_rotation().y + end + -- store for later use + local offs = table.copy(dir) + -- Calc entity rotation, which is relative to the parent's rotation + local rot = parent:get_rotation() + if self.param2 >= 20 then + dir = rotate(dir, 2 * math.pi - rot.y) + dir.y = -dir.y + dir.x = -dir.x + rot.y = rot.y - yaw + elseif self.param2 < 4 then + dir = rotate(dir, 2 * math.pi - rot.y) + rot.y = rot.y - yaw + end + dir = vector.multiply(dir, 29) + obj:set_attach(parent, "", dir, vector.multiply(rot, 180 / math.pi)) + obj:set_properties({visual_size = {x=2.9, y=2.9}}) + if obj:is_player() then + if lock_player(obj) then + table.insert(self.players, {name = obj:get_player_name(), offs = offs}) + end + else + table.insert(self.entities, {objID = get_object_id(obj), offs = offs}) + end + end +end + +-- Attach all objects around to the parent object +-- offs is the search/attach position offset +local function attach_objects(pos, offs, parent, yoffs) + local pos1 = vector.add(pos, offs) + for _, obj in pairs(minetest.get_objects_inside_radius(pos1, 0.9)) do + local dir = vector.subtract(obj:get_pos(), pos) + local entity = obj:get_luaentity() + if entity then + if entity.name == "__builtin:item" then -- dropped items + --obj:set_attach(objref, "", {x=0, y=0, z=0}, {x=0, y=0, z=0}, true) -- hier kracht es + elseif entity.name ~= "techage:move_item" then + dir.y = dir.y + yoffs + attach_single_object(parent, obj, dir) + end + elseif obj:is_player() then + attach_single_object(parent, obj, dir) + end + end +end + +-- Detach all attached objects from the parent object +local function detach_objects(pos, self) + for _, item in ipairs(self.entities or {}) do + local entity = minetest.luaentities[item.objID] + if entity then + local obj = entity.object + obj:set_detach() + obj:set_properties({visual_size = {x=1, y=1}}) + local pos1 = vector.add(pos, item.offs) + pos1.y = pos1.y - (self.yoffs or 0) + obj:set_pos(pos1) + end + end + for _, item in ipairs(self.players or {}) do + local obj = minetest.get_player_by_name(item.name) + if obj then + obj:set_detach() + obj:set_properties({visual_size = {x=1, y=1}}) + local pos1 = vector.add(pos, item.offs) + pos1.y = pos1.y + 0.1 + obj:set_pos(pos1) + unlock_player(obj) + end + end + self.entities = {} + self.players = {} +end + +local function entity_to_node(pos, obj) + local self = obj:get_luaentity() + if self then + local name = self.item_name or "air" + local param2 = self.param2 or 0 + local metadata = self.metadata or {} + detach_objects(pos, self) + if self.base_pos then + local nvm = techage.get_nvm(self.base_pos) + nvm.running = nil + end + obj:remove() + + local node = minetest.get_node(pos) + local ndef1 = minetest.registered_nodes[name] + local ndef2 = minetest.registered_nodes[node.name] + if ndef1 and ndef2 then + if ndef2.buildable_to then + local meta = M(pos) + minetest.set_node(pos, {name=name, param2=param2}) + meta:from_table(metadata) + meta:set_string("ta_move_block", "") + return + end + local meta = M(pos) + if not meta:contains("ta_move_block") then + meta:set_string("ta_move_block", minetest.serialize({name=name, param2=param2})) + return + end + minetest.add_item(pos, ItemStack(name)) + elseif ndef1 then + minetest.add_item(pos, ItemStack(name)) + end + end +end + +local function node_to_entity(start_pos) + local meta = M(start_pos) + local node, metadata + + if meta:contains("ta_move_block") then + -- Move-block stored as metadata + node = minetest.deserialize(meta:get_string("ta_move_block")) + metadata = {} + meta:set_string("ta_move_block", "") + else + -- Block with other metadata + node = minetest.get_node(start_pos) + metadata = meta:to_table() + minetest.remove_node(start_pos) + end + local obj = minetest.add_entity(start_pos, "techage:move_item") + if obj then + local self = obj:get_luaentity() + local rot = techage.facedir_to_rotation(node.param2) + obj:set_rotation(rot) + obj:set_properties({wield_item=node.name}) + obj:set_armor_groups({immortal=1}) + + -- To be able to revert to node + self.item_name = node.name + self.param2 = node.param2 + self.metadata = metadata or {} + + -- Prepare for attachments + self.players = {} + self.entities = {} + -- Prepare for path walk + self.path_idx = 1 + return obj + end +end + +-- move block direction +local function determine_dir(pos1, pos2) + local vdist = vector.subtract(pos2, pos1) + local ndist = vector.length(vdist) + if ndist > 0 then + return vector.divide(vdist, ndist) + end + return {x=0, y=0, z=0} +end + +local function move_entity(obj, dest_pos, dir, is_corner) + local self = obj:get_luaentity() + self.dest_pos = dest_pos + self.dir = dir + if is_corner then + local vel = vector.multiply(dir, math.min(CORNER_SPEED, self.max_speed)) + obj:set_velocity(vel) + end + local acc = vector.multiply(dir, self.max_speed / 2) + obj:set_acceleration(acc) +end + +local function moveon_entity(obj, self, pos1) + local pos2 = next_path_pos(pos1, self.lpath, self.path_idx) + if pos2 then + self.path_idx = self.path_idx + 1 + local dir = determine_dir(pos1, pos2) + move_entity(obj, pos2, dir, true) + return true + end +end + +-- Handover the entity to the next movecontroller +local function handover_to(obj, self, pos1) + local info = techage.get_node_info(self.handover) + if info and info.name == "techage:ta4_movecontroller" then + local meta = M(info.pos) + if self.move2to1 then + self.handover = meta:contains("handoverA") and meta:get_string("handoverA") + else + self.handover = meta:contains("handoverB") and meta:get_string("handoverB") + end + + self.lpath = flylib.to_path(meta:get_string("path")) + if pos1 and self.lpath then + self.path_idx = 2 + if self.move2to1 then + self.lpath[1] = vector.multiply(self.lpath[1], - 1) + end + local pos2 = next_path_pos(pos1, self.lpath, 1) + local dir = determine_dir(pos1, pos2) + --print("handover_to", P2S(pos1), P2S(pos2), P2S(dir), P2S(info.pos), meta:get_string("path")) + if not self.handover then + local nvm = techage.get_nvm(info.pos) + nvm.lpos1 = nvm.lpos1 or {} + if self.move2to1 then + nvm.lpos1[self.pos1_idx] = pos2 + + else + nvm.lpos1[self.pos1_idx] = pos1 + end + end + move_entity(obj, pos2, dir) + return true + end + end +end + +minetest.register_entity("techage:move_item", { + initial_properties = { + pointable = true, + makes_footstep_sound = true, + static_save = true, + collide_with_objects = false, + physical = false, + visual = "wielditem", + wield_item = "default:dirt", + visual_size = {x=0.67, y=0.67, z=0.67}, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + + get_staticdata = function(self) + return minetest.serialize({ + item_name = self.item_name, + param2 = self.param2, + metadata = self.metadata, + move2to1 = self.move2to1, + handover = self.handover, + path_idx = self.path_idx, + pos1_idx = self.pos1_idx, + lpath = self.lpath, + start_pos = self.start_pos, + base_pos = self.base_pos, + max_speed = self.max_speed, + dest_pos = self.dest_pos, + dir = self.dir, + respawn = true, + }) + end, + + on_activate = function(self, staticdata) + if staticdata then + local tbl = minetest.deserialize(staticdata) or {} + self.item_name = tbl.item_name or "air" + self.param2 = tbl.param2 or 0 + self.metadata = tbl.metadata or {} + self.move2to1 = tbl.move2to1 or false + self.handover = tbl.handover + self.path_idx = tbl.path_idx or 1 + self.pos1_idx = tbl.pos1_idx or 1 + self.lpath = tbl.lpath or {} + self.max_speed = tbl.max_speed or MAX_SPEED + self.dest_pos = tbl.dest_pos or self.object:get_pos() + self.start_pos = tbl.start_pos or self.object:get_pos() + self.base_pos = tbl.base_pos + self.dir = tbl.dir or {x=0, y=0, z=0} + self.object:set_properties({wield_item = self.item}) + --print("tbl.respawn", tbl.respawn) + if tbl.respawn then + entity_to_node(self.start_pos, self.object) + end + end + end, + + on_step = function(self, dtime, moveresult) + local stop_obj = function(obj, self) + local dest_pos = self.dest_pos + obj:move_to(self.dest_pos, true) + obj:set_acceleration({x=0, y=0, z=0}) + obj:set_velocity({x=0, y=0, z=0}) + self.dest_pos = nil + self.old_dist = nil + self.ttl = 2 + return dest_pos + end + + if self.dest_pos then + local obj = self.object + local pos = obj:get_pos() + local dist = vector.distance(pos, self.dest_pos) + local speed = calc_speed(obj:get_velocity()) + self.old_dist = self.old_dist or dist + + -- Landing + if self.lpath and self.lpath[self.path_idx] then + if dist < 1 or dist > self.old_dist then + local dest_pos = stop_obj(obj, self) + if not moveon_entity(obj, self, dest_pos) then + minetest.after(0.5, entity_to_node, dest_pos, obj) + end + return + end + elseif self.handover and dist < 0.2 or dist > self.old_dist then + local dest_pos = stop_obj(obj, self) + if not handover_to(obj, self, dest_pos) then + minetest.after(0.5, entity_to_node, dest_pos, obj) + end + return + else + if dist < 0.05 or dist > self.old_dist then + local dest_pos = stop_obj(obj, self) + minetest.after(0.5, entity_to_node, dest_pos, obj) + return + end + end + + self.old_dist = dist + + -- Braking or limit max speed + if self.handover then + if speed > (dist * 4) or speed > self.max_speed then + speed = math.min(speed, math.max(dist * 4, MIN_SPEED)) + local vel = vector.multiply(self.dir,speed) + obj:set_velocity(vel) + obj:set_acceleration({x=0, y=0, z=0}) + end + else + if speed > (dist * 2) or speed > self.max_speed then + speed = math.min(speed, math.max(dist * 2, MIN_SPEED)) + local vel = vector.multiply(self.dir,speed) + obj:set_velocity(vel) + obj:set_acceleration({x=0, y=0, z=0}) + end + end + + elseif self.ttl then + self.ttl = self.ttl - dtime + if self.ttl < 0 then + local obj = self.object + local pos = obj:get_pos() + entity_to_node(pos, obj) + end + end + end, +}) + +local function is_valid_dest(pos) + local node = minetest.get_node(pos) + local ndef = minetest.registered_nodes[node.name] + if ndef and ndef.buildable_to then + return true + end + if not M(pos):contains("ta_move_block") then + return true + end + return false +end + +local function is_simple_node(pos) + -- special handling + local name = minetest.get_node(pos).name + if SimpleNodes[name] ~= nil then + return SimpleNodes[name] + end + + local ndef = minetest.registered_nodes[name] + if not ndef or name == "air" or name == "ignore" then return false end + -- don't remove nodes with some intelligence or undiggable nodes + if ndef.drop == "" then return false end + if ndef.diggable == false then return false end + if ndef.after_dig_node then return false end + + return true +end + +local function move_node(pos, pos1_idx, start_pos, lpath, max_speed, height, move2to1, handover, cpos) + local pos2 = next_path_pos(start_pos, lpath, 1) + --print("move_node", P2S(pos), P2S(start_pos), lpath, max_speed, height, move2to1, P2S(pos2)) + -- optional for non-player objects + local yoffs = M(pos):get_float("offset") + + if pos2 then + local dir = determine_dir(start_pos, pos2) + local obj = node_to_entity(start_pos) + + if obj then + local offs = {x=0, y=height or 1, z=0} + attach_objects(start_pos, offs, obj, yoffs) + if dir.y == 0 then + if (dir.x ~= 0 and dir.z == 0) or (dir.x == 0 and dir.z ~= 0) then + attach_objects(start_pos, dir, obj, yoffs) + end + end + local self = obj:get_luaentity() + self.path_idx = 2 + self.pos1_idx = pos1_idx + self.lpath = lpath + self.max_speed = max_speed + self.start_pos = start_pos + self.base_pos = pos + self.move2to1 = move2to1 + self.handover = handover + self.yoffs = yoffs + --print("move_node", P2S(start_pos), P2S(pos2), P2S(dir), P2S(pos)) + move_entity(obj, pos2, dir) + end + end +end + +local function move_nodes(pos, meta, nvm, lpath, max_speed, height, move2to1, handover) + --print("move_nodes", dump(nvm), dump(lpath), max_speed, height, move2to1, handover) + local owner = meta:get_string("owner") + techage.counting_add(owner, #nvm.lpos1 * #lpath) + + for idx = 1, #nvm.lpos1 do + local pos1 = nvm.lpos1[idx] + local pos2 = nvm.lpos2[idx] + + if move2to1 then + pos1, pos2 = pos2, pos1 + end + + --print("move_nodes", P2S(pos1), P2S(pos2)) + if not minetest.is_protected(pos1, owner) and not minetest.is_protected(pos2, owner) then + if is_simple_node(pos1) and is_valid_dest(pos2) then + move_node(pos, idx, pos1, lpath, max_speed, height, move2to1, handover) + else + if not is_simple_node(pos1) then + meta:set_string("status", S("No valid node at the start position")) + else + meta:set_string("status", S("No valid destination position")) + end + end + else + if minetest.is_protected(pos1, owner) then + meta:set_string("status", S("Start position is protected")) + else + meta:set_string("status", S("Destination position is protected")) + end + return false + end + end + return true +end + +function flylib.move_to_other_pos(pos, move2to1) + local meta = M(pos) + local nvm = techage.get_nvm(pos) + local lpath, err = flylib.to_path(meta:get_string("path")) or {} + local max_speed = meta:contains("max_speed") and meta:get_int("max_speed") or MAX_SPEED + local height = meta:contains("height") and meta:get_float("height") or 1 + local handover + + if err then return false end + + height = techage.in_range(height, 0, 1) + max_speed = techage.in_range(max_speed, MIN_SPEED, MAX_SPEED) + nvm.lpos1 = nvm.lpos1 or {} + + local offs = dest_offset(lpath) + if move2to1 then + lpath = reverse_path(lpath) + end + -- calc destination positions + nvm.lpos2 = lvect_add_vec(nvm.lpos1, offs) + + if move2to1 then + handover = meta:contains("handoverA") and meta:get_string("handoverA") + else + handover = meta:contains("handoverB") and meta:get_string("handoverB") + end + return move_nodes(pos, meta, nvm, lpath, max_speed, height, move2to1, handover) +end + +-- rot is one of "l", "r", "2l", "2r" +-- cpos is the center pos (optional) +function flylib.rotate_nodes(pos, posses1, rot) + local meta = M(pos) + local owner = meta:get_string("owner") + local cpos = meta:contains("center") and flylib.to_vector(meta:get_string("center")) + local posses2 = techage.rotate_around_center(posses1, rot, cpos) + local param2 + local nodes2 = {} + + techage.counting_add(owner, #posses1 * 2) + + for i, pos1 in ipairs(posses1) do + local node = techage.get_node_lvm(pos1) + if rot == "l" then + param2 = techage.param2_turn_left(node.param2) + elseif rot == "r" then + param2 = techage.param2_turn_right(node.param2) + else + param2 = techage.param2_turn_left(techage.param2_turn_left(node.param2)) + end + if not minetest.is_protected(pos1, owner) and is_simple_node(pos1) then + minetest.remove_node(pos1) + nodes2[#nodes2 + 1] = {pos = posses2[i], name = node.name, param2 = param2} + end + end + for _,item in ipairs(nodes2) do + if not minetest.is_protected(item.pos, owner) and is_valid_dest(item.pos) then + minetest.add_node(item.pos, {name = item.name, param2 = item.param2}) + end + end + return posses2 +end + + +minetest.register_on_joinplayer(function(player) + unlock_player(player) +end) + +minetest.register_on_leaveplayer(function(player) + if unlock_player(player) then + detach_player(player) + end +end) + +minetest.register_on_dieplayer(function(player) + if unlock_player(player) then + detach_player(player) + end +end) + +return flylib diff --git a/techage/basis/hyperloop.lua b/techage/basis/hyperloop.lua new file mode 100644 index 0000000..d5e1c64 --- /dev/null +++ b/techage/basis/hyperloop.lua @@ -0,0 +1,235 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2022 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + For chests and tanks with hyperloop support + +]]-- + +-- for lazy programmers +local S2P = minetest.string_to_pos +local P2S = minetest.pos_to_string +local M = minetest.get_meta +local N = techage.get_node_lvm +local S = techage.S + +-- Will be initialized when mods are loaded +local Stations = nil +local Tube = nil +local HYPERLOOP = nil + +techage.hyperloop = {} + +--[[ + + tStations["(x,y,z)"] = { + conn = {dir = "(200,0,20)", ...}, + name = , -- chest/tank + owner = "singleplayer", + conn_name = , + single = true/nil, + } + +]]-- + +minetest.register_on_mods_loaded(function() + if minetest.global_exists("hyperloop") then + Stations = hyperloop.Stations + Tube = hyperloop.Tube + HYPERLOOP = true + Tube:add_secondary_node_names({"techage:ta5_hl_chest", "techage:ta5_hl_tank"}) + end +end) + +local function get_remote_pos(pos, rmt_name) + local owner = M(pos):get_string("owner") + for key,item in pairs(Stations:get_node_table(pos)) do + if item.owner == owner and item.conn_name == rmt_name then + return S2P(key) + end + end +end + +local function get_free_server_list(pos, owner) + local tbl = {M(pos):get_string("remote_name")} + for key,item in pairs(Stations:get_node_table(pos)) do + if item.single and item.owner == owner then + if M(pos):get_string("node_type") == M(S2P(key)):get_string("node_type") then + tbl[#tbl+1] = item.conn_name + end + end + end + tbl[#tbl+1] = "" + return tbl +end + +local function on_lose_connection(pos, node_type) + local name = techage.get_node_lvm(pos).name + local ndef = minetest.registered_nodes[name] + if ndef and ndef.on_lose_connection then + ndef.on_lose_connection(pos, node_type) + end +end + +local function on_dropdown(pos) + local owner = M(pos):get_string("owner") + return table.concat(get_free_server_list(pos, owner), ",") +end + +local function update_node_data(pos, state, conn_name, remote_name, rmt_pos) + local meta = M(pos) + local nvm = techage.get_nvm(pos) + + if state == "server_connected" then + Stations:update(pos, {conn_name=conn_name, single="nil"}) + meta:set_string("status", "server") + meta:set_string("conn_name", conn_name) + meta:set_string("remote_name", "") + meta:set_string("conn_status", S("connected to") .. " " .. P2S(rmt_pos)) + nvm.rmt_pos = rmt_pos + elseif state == "client_connected" then + Stations:update(pos, {conn_name="nil", single="nil"}) + meta:set_string("status", "client") + meta:set_string("conn_name", "") + meta:set_string("remote_name", remote_name) + meta:set_string("conn_status", S("connected to") .. " " .. P2S(rmt_pos)) + nvm.rmt_pos = rmt_pos + elseif state == "server_not_connected" then + Stations:update(pos, {conn_name=conn_name, single=true}) + meta:set_string("status", "server") + meta:set_string("conn_name", conn_name) + meta:set_string("remote_name", "") + meta:set_string("conn_status", S("not connected")) + nvm.rmt_pos = nil + on_lose_connection(pos, "server") + elseif state == "client_not_connected" then + Stations:update(pos, {conn_name="nil", single=nil}) + meta:set_string("status", "not connected") + meta:set_string("conn_name", "") + meta:set_string("remote_name", "") + meta:set_string("conn_status", S("not connected")) + nvm.rmt_pos = nil + on_lose_connection(pos, "client") + end +end + +techage.hyperloop.SUBMENU = { + { + type = "label", + label = S("Enter a block name or select an existing one"), + tooltip = "", + name = "l1", + }, + { + type = "ascii", + name = "conn_name", + label = S("Block name"), + tooltip = S("Connection name for this block"), + default = "", + }, + { + type = "dropdown", + choices = "", + on_dropdown = on_dropdown, + name = "remote_name", + label = S("Remote name"), + tooltip = S("Connection name of the remote block"), + }, +} + +function techage.hyperloop.is_client(pos) + if HYPERLOOP then + local nvm = techage.get_nvm(pos) + if Stations:get(nvm.rmt_pos) then + if M(pos):get_string("status") == "client" then + return true + end + end + end +end + +function techage.hyperloop.is_server(pos) + if HYPERLOOP then + if M(pos):get_string("status") == "server" then + return true + end + end +end + +function techage.hyperloop.is_paired(pos) + if HYPERLOOP then + local nvm = techage.get_nvm(pos) + if Stations:get(nvm.rmt_pos) then + if M(pos):get_string("status") ~= "not connected" then + return true + end + end + end +end + +function techage.hyperloop.remote_pos(pos) + if HYPERLOOP then + local nvm = techage.get_nvm(pos) + if Stations:get(nvm.rmt_pos) then + if M(pos):contains("remote_name") then + return nvm.rmt_pos + end + end + end + return pos +end + +function techage.hyperloop.after_place_node(pos, placer, node_type) + if HYPERLOOP then + Stations:set(pos, node_type, {owner=placer:get_player_name()}) + M(pos):set_string("node_type", node_type) + Tube:after_place_node(pos) + end +end + +function techage.hyperloop.after_dig_node(pos, oldnode, oldmetadata, digger) + if HYPERLOOP then + local conn_name = oldmetadata.fields.conn_name + local remote_name = oldmetadata.fields.remote_name + local loc_pos, rmt_pos = pos, techage.get_nvm(pos).rmt_pos + + -- Close connections + if remote_name and rmt_pos then -- Connected client + update_node_data(rmt_pos, "server_not_connected", remote_name, "") + elseif conn_name and rmt_pos then -- Connected server + update_node_data(rmt_pos, "client_not_connected", "", conn_name) + end + + Tube:after_dig_node(pos) + Stations:delete(pos) + end +end + +function techage.hyperloop.after_formspec(pos, fields) + if HYPERLOOP and fields.save or fields.key_enter_field then + local meta = M(pos) + local conn_name = meta:get_string("conn_name") + local remote_name = meta:get_string("remote_name") + local status = meta:contains("status") and meta:get_string("status") or "not connected" + local loc_pos, rmt_pos = pos, techage.get_nvm(pos).rmt_pos + + if status == "not connected" then + if fields.remote_name ~= "" then -- Client + local rmt_pos = get_remote_pos(pos, fields.remote_name) + if rmt_pos then + update_node_data(loc_pos, "client_connected", "", fields.remote_name, rmt_pos) + update_node_data(rmt_pos, "server_connected", fields.remote_name, "", loc_pos) + end + elseif fields.conn_name ~= "" then -- Server + update_node_data(loc_pos, "server_not_connected", fields.conn_name, "") + end + end + end +end + diff --git a/techage/basis/laser_lib.lua b/techage/basis/laser_lib.lua index 802b3c3..135fe61 100644 --- a/techage/basis/laser_lib.lua +++ b/techage/basis/laser_lib.lua @@ -42,7 +42,7 @@ local function get_positions(pos, mem, dir) return true -- no new values end --- return both both laser entities the pos and length +-- return for both laser entities the pos and length local function get_laser_length_and_pos(pos1, pos2, dir) local dist = vector.distance(pos1, pos2) @@ -133,5 +133,14 @@ function techage.renew_laser(pos, force) return res end +function techage.add_laser(pos, pos1, pos2) + local dir = vector.direction(pos1, pos2) + local param2 = minetest.dir_to_facedir(dir) + local size, pos3, pos4 = get_laser_length_and_pos(pos1, pos2, dir) + if size then + add_laser(pos, pos3, pos4, size, param2) + end +end + -- techage.del_laser(pos) techage.del_laser = del_laser diff --git a/techage/basis/lib.lua b/techage/basis/lib.lua index fda1525..6b83c27 100644 --- a/techage/basis/lib.lua +++ b/techage/basis/lib.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -27,6 +27,117 @@ local Input = { 20,21,22,23, -- 6 } +-- Input data to turn a "facedir" block to the right/left +local ROTATION = { + {5,14,11,16}, -- x+ + {7,12,9,18}, -- x- + {0,1,2,3}, -- y+ + {22,21,20,23}, -- y- + {6,15,8,17}, -- z+ + {4,13,10,19}, -- z- +} + +local FACEDIR_TO_ROT = {[0] = + {x=0.000000, y=0.000000, z=0.000000}, + {x=0.000000, y=4.712389, z=0.000000}, + {x=0.000000, y=3.141593, z=0.000000}, + {x=0.000000, y=1.570796, z=0.000000}, + {x=4.712389, y=0.000000, z=0.000000}, + {x=3.141593, y=1.570796, z=1.570796}, + {x=1.570796, y=4.712389, z=4.712389}, + {x=3.141593, y=4.712389, z=4.712389}, + {x=1.570796, y=0.000000, z=0.000000}, + {x=0.000000, y=4.712389, z=1.570796}, + {x=4.712389, y=1.570796, z=4.712389}, + {x=0.000000, y=1.570796, z=4.712389}, + {x=0.000000, y=0.000000, z=1.570796}, + {x=4.712389, y=0.000000, z=1.570796}, + {x=0.000000, y=3.141593, z=4.712389}, + {x=1.570796, y=3.141593, z=4.712389}, + {x=0.000000, y=0.000000, z=4.712389}, + {x=1.570796, y=0.000000, z=4.712389}, + {x=0.000000, y=3.141593, z=1.570796}, + {x=4.712389, y=0.000000, z=4.712389}, + {x=0.000000, y=0.000000, z=3.141593}, + {x=0.000000, y=1.570796, z=3.141593}, + {x=0.000000, y=3.141593, z=3.141593}, + {x=0.000000, y=4.712389, z=3.141593}, +} + +local RotationViaYAxis = {} + +for _,row in ipairs(ROTATION) do + for i = 1,4 do + local val = row[i] + local left = row[i == 1 and 4 or i - 1] + local right = row[i == 4 and 1 or i + 1] + RotationViaYAxis[val] = {left, right} + end +end + +function techage.facedir_to_rotation(facedir) + return FACEDIR_TO_ROT[facedir] +end + +function techage.param2_turn_left(param2) + return (RotationViaYAxis[param2] or RotationViaYAxis[0])[1] +end + +function techage.param2_turn_right(param2) + return (RotationViaYAxis[param2] or RotationViaYAxis[0])[2] +end + +------------------------------------------------------------------------------- +-- Rotate nodes around the center +------------------------------------------------------------------------------- +function techage.positions_center(lpos) + local c = {x=0, y=0, z=0} + for _,v in ipairs(lpos) do + c = vector.add(c, v) + end + c = vector.divide(c, #lpos) + c = vector.round(c) + c.y = 0 + return c +end + +function techage.rotate_around_axis(v, c, turn) + local dx, dz = v.x - c.x, v.z - c.z + if turn == "l" then + return { + x = c.x - dz, + y = v.y, + z = c.z + dx, + } + elseif turn == "r" then + return { + x = c.x + dz, + y = v.y, + z = c.z - dx, + } + elseif turn == "" then + return v + else -- turn 180 degree + return { + x = c.x - dx, + y = v.y, + z = c.z - dz, + } + end +end + +-- Function returns a list ẃith the new node positions +-- turn is one of "l", "r", "2l", "2r" +-- cpos is the center pos (optional) +function techage.rotate_around_center(nodes1, turn, cpos) + cpos = cpos or techage.positions_center(nodes1) + local nodes2 = {} + for _,pos in ipairs(nodes1) do + nodes2[#nodes2 + 1] = techage.rotate_around_axis(pos, cpos, turn) + end + return nodes2 +end + -- allowed for digging local RegisteredNodesToBeDug = {} @@ -330,6 +441,14 @@ function techage.mydump(o, indent, nested, level) return "{"..table.concat(t, ", ").."}" end +function techage.vector_dump(posses) + local t = {} + for _,pos in ipairs(posses) do + t[#t + 1] = minetest.pos_to_string(pos) + end + return table.concat(t, " ") +end + -- title bar help (width is the fornmspec width) function techage.question_mark_help(width, tooltip) local x = width- 0.6 @@ -343,3 +462,88 @@ function techage.wrench_tooltip(x, y) "tooltip["..x..","..y..";0.5,0.5;"..tooltip..";#0C3D32;#FFFFFF]" end +------------------------------------------------------------------------------- +-- Terminal history buffer +------------------------------------------------------------------------------- +local BUFFER_DEPTH = 10 + +function techage.historybuffer_add(pos, s) + local mem = techage.get_mem(pos) + mem.hisbuf = mem.hisbuf or {} + + if #s > 2 then + table.insert(mem.hisbuf, s) + if #mem.hisbuf > BUFFER_DEPTH then + table.remove(mem.hisbuf, 1) + end + mem.hisbuf_idx = #mem.hisbuf + 1 + end +end + +function techage.historybuffer_priv(pos) + local mem = techage.get_mem(pos) + mem.hisbuf = mem.hisbuf or {} + mem.hisbuf_idx = mem.hisbuf_idx or 1 + + mem.hisbuf_idx = math.max(1, mem.hisbuf_idx - 1) + return mem.hisbuf[mem.hisbuf_idx] +end + +function techage.historybuffer_next(pos) + local mem = techage.get_mem(pos) + mem.hisbuf = mem.hisbuf or {} + mem.hisbuf_idx = mem.hisbuf_idx or 1 + + mem.hisbuf_idx = math.min(#mem.hisbuf, mem.hisbuf_idx + 1) + return mem.hisbuf[mem.hisbuf_idx] +end + +------------------------------------------------------------------------------- +-- Player TA5 Experience Points +------------------------------------------------------------------------------- +function techage.get_expoints(player) + if player and player.get_meta then + local meta = player:get_meta() + if meta then + return meta:get_int("techage_ex_points") + end + end +end + +-- Can only be used from one collider +function techage.add_expoint(player, number) + if player and player.get_meta then + local meta = player:get_meta() + if meta then + if not meta:contains("techage_collider_number") then + meta:set_string("techage_collider_number", number) + end + if meta:get_string("techage_collider_number") == number then + meta:set_int("techage_ex_points", meta:get_int("techage_ex_points") + 1) + return true + else + minetest.chat_send_player(player:get_player_name(), "[techage] More than one collider is not allowed!") + return false + end + end + end +end + +function techage.on_remove_collider(player) + if player and player.get_meta then + local meta = player:get_meta() + if meta then + meta:set_string("techage_collider_number", "") + end + end +end + +function techage.set_expoints(player, ex_points) + if player and player.get_meta then + local meta = player:get_meta() + if meta then + meta:set_int("techage_ex_points", ex_points) + return true + end + end +end diff --git a/techage/basis/liquid_lib.lua b/techage/basis/liquid_lib.lua index bf1c395..967f560 100644 --- a/techage/basis/liquid_lib.lua +++ b/techage/basis/liquid_lib.lua @@ -30,8 +30,8 @@ local function help(x, y) "tooltip["..x..","..y..";0.5,0.5;"..tooltip..";#0C3D32;#FFFFFF]" end -function techage.liquid.formspec(pos, nvm) - local title = S("Liquid Tank") +function techage.liquid.formspec(pos, nvm, title) + title = title or S("Liquid Tank") local itemname = "techage:liquid" if nvm.liquid and nvm.liquid.amount and nvm.liquid.amount > 0 and nvm.liquid.name then itemname = nvm.liquid.name.." "..nvm.liquid.amount @@ -41,19 +41,19 @@ function techage.liquid.formspec(pos, nvm) local meta = M(pos) local public = dump((meta:get_int("public") or 0) == 1) local keep_assignment = dump((meta:get_int("keep_assignment") or 0) == 1) - return "size[5,3.5]".. - "box[0,-0.1;4.8,0.5;#c6e8ff]".. - "label[1.5,-0.1;"..minetest.colorize("#000000", title).."]".. - help(4.4, -0.1).. - techage.item_image(2, 1, itemname).. + return "size[8,3.5]".. + "box[0,-0.1;7.8,0.5;#c6e8ff]".. + "label[0.2,-0.1;"..minetest.colorize("#000000", title).."]".. + help(7.4, -0.1).. + techage.item_image(3.5, 1, itemname).. "checkbox[0.1,2.5;public;"..S("Allow public access to the tank")..";"..public.."]".. "checkbox[0.1,3;keep_assignment;"..S("keep assignment")..";"..keep_assignment.."]" else - return "size[4,2]".. - "box[0,-0.1;3.8,0.5;#c6e8ff]".. - "label[1,-0.1;"..minetest.colorize("#000000", title).."]".. - help(3.4, -0.1).. - techage.item_image(1.5, 1, itemname) + return "size[8,2]".. + "box[0,-0.1;7.8,0.5;#c6e8ff]".. + "label[0.2,-0.1;"..minetest.colorize("#000000", title).."]".. + help(7.4, -0.1).. + techage.item_image(3.5, 1, itemname) end end diff --git a/techage/basis/mark_lib.lua b/techage/basis/mark_lib.lua new file mode 100644 index 0000000..8cc52ce --- /dev/null +++ b/techage/basis/mark_lib.lua @@ -0,0 +1,122 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2020-2021 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + Block marker lib for door/move/fly controller + +]]-- + +local marker = {} + +local MarkedNodes = {} -- t[player] = {{entity, pos},...} +local MaxNumber = {} +local CurrentPos -- to mark punched entities + +local function unmark_position(name, pos) + pos = vector.round(pos) + for idx,item in ipairs(MarkedNodes[name] or {}) do + if vector.equals(pos, item.pos) then + item.entity:remove() + table.remove(MarkedNodes[name], idx) + CurrentPos = pos + return + end + end +end + +function marker.unmark_all(name) + for _,item in ipairs(MarkedNodes[name] or {}) do + item.entity:remove() + end + MarkedNodes[name] = nil +end + +local function mark_position(name, pos) + pos = vector.round(pos) + if not CurrentPos or not vector.equals(pos, CurrentPos) then -- entity not punched? + if #MarkedNodes[name] < MaxNumber[name] then + local entity = minetest.add_entity(pos, "techage:block_marker") + if entity ~= nil then + entity:get_luaentity().player_name = name + table.insert(MarkedNodes[name], {pos = pos, entity = entity}) + end + CurrentPos = nil + return true + end + end + CurrentPos = nil +end + +function marker.get_poslist(name) + local idx = 0 + local lst = {} + for _,item in ipairs(MarkedNodes[name] or {}) do + table.insert(lst, item.pos) + idx = idx + 1 + if idx >= 16 then break end + end + return lst +end + +minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) + if puncher and puncher:is_player() then + local name = puncher:get_player_name() + + if not MarkedNodes[name] then + return + end + + mark_position(name, pointed_thing.under) + end +end) + +function marker.start(name, max_num) + MaxNumber[name] = max_num or 99 + MarkedNodes[name] = {} +end + +function marker.stop(name) + MarkedNodes[name] = nil + MaxNumber[name] = nil +end + +minetest.register_entity(":techage:block_marker", { + initial_properties = { + visual = "cube", + textures = { + "techage_cube_mark.png", + "techage_cube_mark.png", + "techage_cube_mark.png", + "techage_cube_mark.png", + "techage_cube_mark.png", + "techage_cube_mark.png", + }, + --use_texture_alpha = true, + physical = false, + visual_size = {x=1.1, y=1.1}, + collisionbox = {-0.55,-0.55,-0.55, 0.55,0.55,0.55}, + glow = 8, + }, + on_step = function(self, dtime) + self.ttl = (self.ttl or 2400) - 1 + if self.ttl <= 0 then + local pos = self.object:get_pos() + unmark_position(self.player_name, pos) + end + end, + on_punch = function(self, hitter) + local pos = self.object:get_pos() + local name = hitter:get_player_name() + if name == self.player_name then + unmark_position(name, pos) + end + end, +}) + +return marker \ No newline at end of file diff --git a/techage/basis/node_states.lua b/techage/basis/node_states.lua index 9e76c89..ea4a29d 100644 --- a/techage/basis/node_states.lua +++ b/techage/basis/node_states.lua @@ -174,6 +174,7 @@ function NodeStates:new(attr) cycle_time = attr.cycle_time, -- for running state standby_ticks = attr.standby_ticks, -- for standby state -- optional + countdown_ticks = attr.countdown_ticks or 1, node_name_passive = attr.node_name_passive, node_name_active = attr.node_name_active, infotext_name = attr.infotext_name, @@ -254,7 +255,7 @@ function NodeStates:start(pos, nvm) if self.start_node then self.start_node(pos, nvm, state) end - nvm.techage_countdown = 1 + nvm.techage_countdown = self.countdown_ticks if self.node_name_active then swap_node(pos, self.node_name_active) end diff --git a/techage/basis/oggfiles.lua b/techage/basis/oggfiles.lua new file mode 100644 index 0000000..ffe7c82 --- /dev/null +++ b/techage/basis/oggfiles.lua @@ -0,0 +1,103 @@ +techage.OggFileList = { + "autobahn_motor", -- ./mods/autobahn/sounds + "signs_bot_ping", -- ./mods/signs_bot/sounds + "signs_bot_go_away", -- ./mods/signs_bot/sounds + "signs_bot_step", -- ./mods/signs_bot/sounds + "signs_bot_pong", -- ./mods/signs_bot/sounds + "signs_bot_error", -- ./mods/signs_bot/sounds + "normal2", -- ./mods/hyperloop/sounds + "up2", -- ./mods/hyperloop/sounds + "down2", -- ./mods/hyperloop/sounds + "ele_norm", -- ./mods/hyperloop/sounds + "door", -- ./mods/hyperloop/sounds + "hyperloop_crowbar", -- ./mods/hyperloop/sounds + "ele_door", -- ./mods/hyperloop/sounds + "techage_watermill", -- ./mods/techage/sounds + "techage_button", -- ./mods/techage/sounds + "techage_steamengine", -- ./mods/techage/sounds + "techage_generator", -- ./mods/techage/sounds + "techage_gasflare", -- ./mods/techage/sounds + "techage_explore", -- ./mods/techage/sounds + "techage_mill", -- ./mods/techage/sounds + "techage_reactor", -- ./mods/techage/sounds + "techage_valve", -- ./mods/techage/sounds + "techage_oildrill", -- ./mods/techage/sounds + "techage_turbine", -- ./mods/techage/sounds + "techage_booster", -- ./mods/techage/sounds + "techage_quarry", -- ./mods/techage/sounds + "techage_reboiler", -- ./mods/techage/sounds + "jetpack_loop", -- ./mods/jetpack/sounds + "paperflip1", -- ./mods/unified_inventory/sounds + "teleport", -- ./mods/unified_inventory/sounds + "electricity", -- ./mods/unified_inventory/sounds + "owl", -- ./mods/unified_inventory/sounds + "click", -- ./mods/unified_inventory/sounds + "birds", -- ./mods/unified_inventory/sounds + "paperflip2", -- ./mods/unified_inventory/sounds + "dingdong", -- ./mods/unified_inventory/sounds + "trash", -- ./mods/unified_inventory/sounds + "trash_all", -- ./mods/unified_inventory/sounds + "ta4_jetpack", -- ./mods/ta4_jetpack/sounds + "ta4_jetpack_alarm", -- ./mods/ta4_jetpack/sounds + "ta4_jetpack_on", -- ./mods/ta4_jetpack/sounds + "player_damage", -- ./games/minetest_game/mods/player_api/sounds + "env_sounds_water", -- ./games/minetest_game/mods/env_sounds/sounds + "env_sounds_lava", -- ./games/minetest_game/mods/env_sounds/sounds + "doors_door_close", -- ./games/minetest_game/mods/doors/sounds + "doors_steel_door_close", -- ./games/minetest_game/mods/doors/sounds + "doors_door_open", -- ./games/minetest_game/mods/doors/sounds + "doors_fencegate_close", -- ./games/minetest_game/mods/doors/sounds + "doors_glass_door_close", -- ./games/minetest_game/mods/doors/sounds + "doors_fencegate_open", -- ./games/minetest_game/mods/doors/sounds + "doors_glass_door_open", -- ./games/minetest_game/mods/doors/sounds + "doors_steel_door_open", -- ./games/minetest_game/mods/doors/sounds + "fire_flint_and_steel", -- ./games/minetest_game/mods/fire/sounds + "fire_large", -- ./games/minetest_game/mods/fire/sounds + "fire_fire", -- ./games/minetest_game/mods/fire/sounds + "fire_extinguish_flame", -- ./games/minetest_game/mods/fire/sounds + "fire_small", -- ./games/minetest_game/mods/fire/sounds + "tnt_ignite", -- ./games/minetest_game/mods/tnt/sounds + "tnt_gunpowder_burning", -- ./games/minetest_game/mods/tnt/sounds + "tnt_explode", -- ./games/minetest_game/mods/tnt/sounds + "carts_cart_new", -- ./games/minetest_game/mods/carts/sounds + "carts_cart_moving", -- ./games/minetest_game/mods/carts/sounds + "xpanes_steel_bar_door_open", -- ./games/minetest_game/mods/xpanes/sounds + "xpanes_steel_bar_door_close", -- ./games/minetest_game/mods/xpanes/sounds + "default_break_glass", -- ./games/minetest_game/mods/default/sounds + "default_dig_dig_immediate", -- ./games/minetest_game/mods/default/sounds + "default_dig_cracky", -- ./games/minetest_game/mods/default/sounds + "default_dig_choppy", -- ./games/minetest_game/mods/default/sounds + "default_water_footstep", -- ./games/minetest_game/mods/default/sounds + "player_damage", -- ./games/minetest_game/mods/default/sounds + "default_gravel_footstep", -- ./games/minetest_game/mods/default/sounds + "default_dig_metal", -- ./games/minetest_game/mods/default/sounds + "default_gravel_dug", -- ./games/minetest_game/mods/default/sounds + "default_hard_footstep", -- ./games/minetest_game/mods/default/sounds + "default_sand_footstep", -- ./games/minetest_game/mods/default/sounds + "default_grass_footstep", -- ./games/minetest_game/mods/default/sounds + "default_chest_close", -- ./games/minetest_game/mods/default/sounds + "default_cool_lava", -- ./games/minetest_game/mods/default/sounds + "default_place_node_hard", -- ./games/minetest_game/mods/default/sounds + "default_ice_dug", -- ./games/minetest_game/mods/default/sounds + "default_dig_crumbly", -- ./games/minetest_game/mods/default/sounds + "default_tool_breaks", -- ./games/minetest_game/mods/default/sounds + "default_ice_footstep", -- ./games/minetest_game/mods/default/sounds + "default_dig_cracky", -- ./games/minetest_game/mods/default/sounds + "default_chest_open", -- ./games/minetest_game/mods/default/sounds + "default_gravel_dig", -- ./games/minetest_game/mods/default/sounds + "default_dig_oddly_breakable_by_hand", -- ./games/minetest_game/mods/default/sounds + "default_dug_metal", -- ./games/minetest_game/mods/default/sounds + "default_dirt_footstep", -- ./games/minetest_game/mods/default/sounds + "default_dig_choppy", -- ./games/minetest_game/mods/default/sounds + "default_glass_footstep", -- ./games/minetest_game/mods/default/sounds + "default_snow_footstep", -- ./games/minetest_game/mods/default/sounds + "default_place_node", -- ./games/minetest_game/mods/default/sounds + "default_dig_snappy", -- ./games/minetest_game/mods/default/sounds + "default_dug_node", -- ./games/minetest_game/mods/default/sounds + "default_metal_footstep", -- ./games/minetest_game/mods/default/sounds + "default_ice_dig", -- ./games/minetest_game/mods/default/sounds + "default_place_node_metal", -- ./games/minetest_game/mods/default/sounds + "default_wood_footstep", -- ./games/minetest_game/mods/default/sounds + "default_furnace_active", -- ./games/minetest_game/mods/default/sounds + "default_item_smoke", -- ./games/minetest_game/mods/default/sounds +} diff --git a/techage/basis/recipe_lib.lua b/techage/basis/recipe_lib.lua index 95ecddc..76306d3 100644 --- a/techage/basis/recipe_lib.lua +++ b/techage/basis/recipe_lib.lua @@ -22,6 +22,19 @@ local range = techage.in_range techage.recipes = {} +local GROUP_ITEMS = { + stone = "default:cobble", + wood = "default:wood", + book = "default:book", + sand = "default:sand", + leaves = "default:leaves", + stick = "default:stick", + tree = "default:tree", + vessel = "vessels:glass_bottle", + wool = "wool:white", +} + + local RECIPE = { output = {name = "", num = 0}, waste = {name = "", num = 0}, @@ -33,6 +46,22 @@ local RECIPE = { }, } +local function filter_recipes_based_on_points(recipes, owner) + local ex_points = 0 + if owner then + local player = minetest.get_player_by_name(owner) + ex_points = techage.get_expoints(player) or 0 + end + + local tbl = {} + for _,item in ipairs(recipes) do + if ex_points >= (item.ex_points or 0) then + tbl[#tbl + 1] = item + end + end + return tbl +end + -- Formspec local function input_string(recipe) @@ -80,24 +109,24 @@ function techage.recipes.add(rtype, recipe) name, num = unpack(string.split(recipe.output, " ")) item.output = {name = name or "", num = tonumber(num) or 0} item.catalyst = recipe.catalyst + item.ex_points = recipe.ex_points or 0 Recipes[rtype][#Recipes[rtype]+1] = item output = name - if minetest.global_exists("unified_inventory") then - unified_inventory.register_craft({ - output = recipe.output, - items = recipe.input, - type = rtype, - }) - end + techage.recipes.register_craft({ + output = recipe.output, + items = recipe.input, + type = rtype, + }) NormalizedRecipes[output] = { output = recipe.output, items = recipe.input, } end -function techage.recipes.formspec(x, y, rtype, nvm) +function techage.recipes.formspec(x, y, rtype, nvm, owner) local recipes = Recipes[rtype] or {} + recipes = filter_recipes_based_on_points(recipes, owner) nvm.recipe_idx = range(nvm.recipe_idx or 1, 1, #recipes) local idx = nvm.recipe_idx local recipe = recipes[idx] or RECIPE @@ -137,3 +166,114 @@ function techage.recipes.get_recipe(name) return NormalizedRecipes[name] end + +function techage.recipes.get_default_group_item_name(item_name) + if item_name and item_name:sub(1, 6) == "group:" then + local default_name = GROUP_ITEMS[item_name:sub(7)] + if default_name then + return default_name + end + end + return item_name +end + +function techage.recipes.add_group_item(group, default_item_name) + GROUP_ITEMS[group] = default_item_name +end + +------------------------------------------------------------------------------- +-- Borrowed from ghaydn +------------------------------------------------------------------------------- +local has_i3 = minetest.get_modpath("i3") +local has_ui = minetest.get_modpath("unified_inventory") +local has_cg = minetest.get_modpath("craftguide") + +local function format_i3(input) + local output = {} + for _, entry in ipairs(input) do + local secondput = "" + if type(entry) == "table" then + for _, secondtry in ipairs(entry) do + secondput = secondput..secondtry.."," + end + table.insert(output, secondput) + else + table.insert(output, entry) + end + end + return output +end + +techage.recipes.register_craft_type = function(name, def) + if has_cg then + local cg_def = { + description = def.description, + icon = def.icon, + } + craftguide.register_craft_type(name, cg_def) + end + if has_i3 then + local i3_def = { + description = def.description, + icon = def.icon, + width = def.width or 3, + height = def.height or 3, + dynamic_display_size = def.dynamic_display_size or nil, + uses_crafting_grid = def.uses_crafting_grid, + } + i3.register_craft_type(name, i3_def) + end + if has_ui then + local ui_def = { + description = def.description, + icon = def.icon, + width = def.width or 3, + height = def.height or 3, + dynamic_display_size = def.dynamic_display_size or nil, + uses_crafting_grid = def.uses_crafting_grid, + } + unified_inventory.register_craft_type(name, ui_def) + end +end + +techage.recipes.register_craft = function(def) + if not def.items then + if def.input then + def.items = table.copy(def.input) + elseif def.recipe then + def.items = table.copy(def.recipe) + end + end + if not def.result then + if def.output then def.result = def.output end + end + + if has_cg then + local cg_def = { + result = def.result, + type = def.type, + items = def.items, + } + craftguide.register_craft(cg_def) + end + if has_i3 then + + local i3_def = { + result = def.result, + type = def.type, + items = format_i3(def.items), + width = def.width or 3, + } + i3.register_craft(i3_def) + end + if has_ui then + local ui_def = { + output = def.result, + type = def.type, + items = def.items, + width = def.width or 3, + height = def.height or 3, + } + unified_inventory.register_craft(ui_def) + end +end diff --git a/techage/basis/shared_inv.lua b/techage/basis/shared_inv.lua new file mode 100644 index 0000000..3f375af --- /dev/null +++ b/techage/basis/shared_inv.lua @@ -0,0 +1,69 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2022 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + Library for shared inventories + +]]-- + +-- for lazy programmers +local S2P = minetest.string_to_pos +local P2S = minetest.pos_to_string +local M = minetest.get_meta +local S = techage.S + +techage.shared_inv = {} + +local hyperloop = techage.hyperloop +local remote_pos = techage.hyperloop.remote_pos + +local function copy_inventory_list(from_pos, to_pos, listname) + local inv1 = minetest.get_inventory({type="node", pos=from_pos}) + local inv2 = minetest.get_inventory({type="node", pos=to_pos}) + inv2:set_list(listname, inv1:get_list(listname)) +end + +function techage.shared_inv.node_timer(pos, elapsed) + local rmt_pos = remote_pos(pos) + if techage.is_activeformspec(pos) then + copy_inventory_list(rmt_pos, pos, "main") + return true + end + return false +end + +-- Synchronize the client inventory with the server one +function techage.shared_inv.before_inv_access(pos, listname) + if hyperloop.is_client(pos) then + local rmt_pos = remote_pos(pos) + copy_inventory_list(rmt_pos, pos, listname) + return true + end + return false +end + +-- Synchronize the client inventory with the server one +function techage.shared_inv.after_inv_access(pos, listname) + if hyperloop.is_client(pos) then + local rmt_pos = remote_pos(pos) + copy_inventory_list(pos, rmt_pos, listname) + return true + end + return false +end + +function techage.shared_inv.on_rightclick(pos, clicker, listname) + if hyperloop.is_client(pos) then + local rmt_pos = remote_pos(pos) + copy_inventory_list(rmt_pos, pos, listname) + techage.set_activeformspec(pos, clicker) + minetest.get_node_timer(pos):start(2) + end +end + diff --git a/techage/basis/shared_tank.lua b/techage/basis/shared_tank.lua new file mode 100644 index 0000000..5d0b1fe --- /dev/null +++ b/techage/basis/shared_tank.lua @@ -0,0 +1,105 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2022 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + Library for shared inventories + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local NDEF = function(pos) return minetest.registered_nodes[techage.get_node_lvm(pos).name] or {} end + +techage.shared_tank = {} + +local liquid = networks.liquid +local hyperloop = techage.hyperloop +local remote_pos = techage.hyperloop.remote_pos +local menu = techage.menu + +local function formspec(pos) + local ndef = NDEF(pos) + local status = M(pos):get_string("conn_status") + if hyperloop.is_client(pos) or hyperloop.is_server(pos) then + local title = ndef.description .. " " .. status + local nvm = techage.get_nvm(remote_pos(pos)) + return techage.liquid.formspec(pos, nvm, title) + else + return menu.generate_formspec(pos, ndef, hyperloop.SUBMENU) + end +end + +function techage.shared_tank.node_timer(pos) + if techage.is_activeformspec(pos) then + M(pos):set_string("formspec", formspec(pos)) + return true + end + return false +end + +function techage.shared_tank.on_rightclick(pos, node, clicker) + --if hyperloop.is_client(pos) then + techage.set_activeformspec(pos, clicker) + minetest.get_node_timer(pos):start(2) + --end + M(pos):set_string("formspec", formspec(pos)) +end + +function techage.shared_tank.can_dig(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + pos = remote_pos(pos) + return techage.liquid.is_empty(pos) +end + +function techage.shared_tank.peek_liquid(pos, indir) + pos = remote_pos(pos) + local nvm = techage.get_nvm(pos) + return liquid.srv_peek(nvm) +end + +function techage.shared_tank.take_liquid(pos, indir, name, amount) + pos = remote_pos(pos) + local nvm = techage.get_nvm(pos) + amount, name = liquid.srv_take(nvm, name, amount) + if techage.is_activeformspec(pos) then + M(pos):set_string("formspec", formspec(pos)) + end + return amount, name +end + +function techage.shared_tank.put_liquid(pos, indir, name, amount) + pos = remote_pos(pos) + -- check if it is not powder + local ndef = minetest.registered_craftitems[name] or {} + if not ndef.groups or ndef.groups.powder ~= 1 then + local nvm = techage.get_nvm(pos) + local ndef = NDEF(pos) + local leftover = liquid.srv_put(nvm, name, amount, ndef.liquid.capa) + if techage.is_activeformspec(pos) then + M(pos):set_string("formspec", formspec(pos)) + end + return leftover + end + return amount +end + +function techage.shared_tank.untake_liquid(pos, indir, name, amount) + pos = remote_pos(pos) + local nvm = techage.get_nvm(pos) + local ndef = NDEF(pos) + local leftover = liquid.srv_put(nvm, name, amount, ndef.liquid.capa) + if techage.is_activeformspec(pos) then + M(pos):set_string("formspec", formspec(pos)) + end + return leftover +end + +techage.shared_tank.formspec = formspec \ No newline at end of file diff --git a/techage/tools/submenu.lua b/techage/basis/submenu.lua similarity index 84% rename from techage/tools/submenu.lua rename to techage/basis/submenu.lua index a06ad7d..f7011db 100644 --- a/techage/tools/submenu.lua +++ b/techage/basis/submenu.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -13,7 +13,7 @@ local S = techage.S -local menu = {} +techage.menu = {} local function index(list, x) for idx, v in ipairs(list) do @@ -48,7 +48,9 @@ local function generate_formspec_substring(pos, meta, form_def, player_name) local offs = (i - 1) * 0.9 - 0.2 tbl[#tbl+1] = "label[0," .. offs .. ";" .. minetest.formspec_escape(elem.label) .. ":]" tbl[#tbl+1] = "tooltip[0," .. offs .. ";4,1;" .. elem.tooltip .. "]" - if elem.type == "number" then + if elem.type == "label" then + -- none + elseif elem.type == "number" then local val = elem.default if meta:contains(elem.name) then val = meta:get_int(elem.name) @@ -91,7 +93,7 @@ local function generate_formspec_substring(pos, meta, form_def, player_name) elseif elem.type == "const" then tbl[#tbl+1] = "label[4.75," .. offs .. ";" .. elem.value .. "]" elseif elem.type == "output" then - local val = nvm[elem.name] or "" + local val = nvm[elem.name] or meta:get_string(elem.name) or "" if tonumber(val) then val = techage.round(val) end @@ -104,6 +106,15 @@ local function generate_formspec_substring(pos, meta, form_def, player_name) val = meta:get_string(elem.name) or "" end tbl[#tbl+1] = "label[4.75," .. offs .. ";" .. val .. "]" + elseif elem.on_dropdown then -- block provides a specific list of choice elements + local val = elem.default + if meta:contains(elem.name) then + val = meta:get_string(elem.name) or "" + end + local choices = elem.on_dropdown(pos) + local l = choices:split(",") + local idx = index(l, val) or 1 + tbl[#tbl+1] = "dropdown[4.72," .. (offs) .. ";5.5,1.4;" .. elem.name .. ";" .. choices .. ";" .. idx .. "]" else local val = elem.default if meta:contains(elem.name) then @@ -112,7 +123,7 @@ local function generate_formspec_substring(pos, meta, form_def, player_name) local idx = index(l, val) or 1 tbl[#tbl+1] = "dropdown[4.72," .. (offs) .. ";5.5,1.4;" .. elem.name .. ";" .. elem.choices .. ";" .. idx .. "]" end - elseif elem.type == "items" then + elseif elem.type == "items" then -- inventory tbl[#tbl+1] = "list[detached:" .. minetest.formspec_escape(player_name) .. "_techage_wrench_menu;cfg;4.75," .. offs .. ";" .. elem.size .. ",1;]" player_inv_needed = true end @@ -193,7 +204,7 @@ local function evaluate_data(pos, meta, form_def, fields, player_name) if fields[elem.name] ~= nil then meta:set_string(elem.name, fields[elem.name]) end - elseif elem.type == "items" then + elseif elem.type == "items" and player_name then local inv_name = minetest.formspec_escape(player_name) .. "_techage_wrench_menu" local dinv = minetest.get_inventory({type = "detached", name = inv_name}) local ninv = minetest.get_inventory({type = "node", pos = pos}) @@ -208,25 +219,26 @@ local function evaluate_data(pos, meta, form_def, fields, player_name) return res end -function menu.generate_formspec(pos, ndef, form_def, player_name) +function techage.menu.generate_formspec(pos, ndef, form_def, player_name) local meta = minetest.get_meta(pos) local number = techage.get_node_number(pos) local mem = techage.get_mem(pos) mem.star = ((mem.star or 0) + 1) % 2 local star = mem.star == 1 and "*" or "" - local inv_name = minetest.formspec_escape(player_name) .. "_techage_wrench_menu" - minetest.create_detached_inventory(inv_name, { - allow_put = allow_put, - allow_take = allow_take}) - local dinv = minetest.get_inventory({type = "detached", name = inv_name}) - local ninv = minetest.get_inventory({type = "node", pos = pos}) - if dinv and ninv then - dinv:set_size('cfg', ninv:get_size("cfg")) - for i = 1, ninv:get_size("cfg") do - dinv:set_stack("cfg", i, ninv:get_stack("cfg", i)) + if player_name then + local inv_name = minetest.formspec_escape(player_name) .. "_techage_wrench_menu" + minetest.create_detached_inventory(inv_name, { + allow_put = allow_put, + allow_take = allow_take}) + local dinv = minetest.get_inventory({type = "detached", name = inv_name}) + local ninv = minetest.get_inventory({type = "node", pos = pos}) + if dinv and ninv then + dinv:set_size('cfg', ninv:get_size("cfg")) + for i = 1, ninv:get_size("cfg") do + dinv:set_stack("cfg", i, ninv:get_stack("cfg", i)) + end end end - if meta and number and ndef and form_def then local title = ndef.description .. " (" .. number .. ")" local player_inv_needed, text = generate_formspec_substring(pos, meta, form_def, player_name) @@ -275,13 +287,10 @@ function menu.generate_formspec(pos, ndef, form_def, player_name) return "" end -function menu.eval_input(pos, form_def, fields, player_name) - --print(dump(fields)) - if fields.save then +function techage.menu.eval_input(pos, form_def, fields, player_name) + if fields.save or fields.key_enter_field then local meta = minetest.get_meta(pos) evaluate_data(pos, meta, form_def, fields, player_name) end - return fields.refresh or fields.save + return fields.refresh or fields.save or fields.key_enter_field end - -return menu diff --git a/techage/basis/teleport.lua b/techage/basis/teleport.lua new file mode 100644 index 0000000..4184c33 --- /dev/null +++ b/techage/basis/teleport.lua @@ -0,0 +1,167 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2022 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + For tupe/pipe blocks with teleport support + +]]-- + +-- for lazy programmers +local S2P = minetest.string_to_pos +local P2S = minetest.pos_to_string +local NDEF = function(pos) return minetest.registered_nodes[techage.get_node_lvm(pos).name] or {} end +local M = minetest.get_meta +local S = techage.S +local menu = techage.menu + +techage.teleport = {} + +local PairingList = {} -- {owner = {node_type = {channel = pos}}} + +local function get_pairing_table1(meta) + local owner = meta:get_string("owner") + local node_type = meta:get_string("tele_node_type") + PairingList[owner] = PairingList[owner] or {} + PairingList[owner][node_type] = PairingList[owner][node_type] or {} + return PairingList[owner][node_type] +end + +local function get_pairing_table2(oldmetadata) + local owner = oldmetadata.fields.owner + local node_type = oldmetadata.fields.tele_node_type + PairingList[owner] = PairingList[owner] or {} + PairingList[owner][node_type] = PairingList[owner][node_type] or {} + return PairingList[owner][node_type] +end + +local function get_free_server_list(pos) + local tbl = {""} + for name, pos in pairs(get_pairing_table1(M(pos))) do + table.insert(tbl, name) + end + return table.concat(tbl, ",") +end + +local TELE_MENU = { + { + type = "label", + label = S("Enter a block name or select an existing one"), + tooltip = "", + name = "l1", + }, + { + type = "ascii", + name = "conn_name", + label = S("Block name"), + tooltip = S("Connection name for this block"), + default = "", + }, + { + type = "dropdown", + choices = "", + on_dropdown = get_free_server_list, + name = "remote_name", + label = S("Remote name"), + tooltip = S("Connection name of the remote block"), + }, + { + type = "output", + label = S("Status"), + tooltip = S("Connection status"), + name = "status", + default = "", + }, +} + +function techage.teleport.formspec(pos) + local ndef = NDEF(pos) + return menu.generate_formspec(pos, ndef, TELE_MENU) +end + +local function store_connection(pos, peer_pos) + local meta = M(pos) + local status = S("connected to") .. " " .. P2S(peer_pos) + meta:set_string("tele_status", status) + meta:set_string("tele_peer_pos", P2S(peer_pos)) + meta:set_string("formspec", "") +end + +function techage.teleport.prepare_pairing(pos, node_type, status) + local meta = M(pos) + if node_type then + meta:set_string("tele_node_type", node_type) + end + status = status or S("not connected") + meta:set_string("tele_status", status) + meta:set_string("tele_peer_pos", "") + meta:set_string("formspec", techage.teleport.formspec(pos)) +end + +function techage.teleport.stop_pairing(pos, oldmetadata) + -- disconnect peer node + if oldmetadata and oldmetadata.fields then + if oldmetadata.fields.tele_peer_pos then + local peer_pos = S2P(oldmetadata.fields.tele_peer_pos) + local meta = M(peer_pos) + if meta:get_string("conn_name") ~= "" then -- Server + local tbl = get_pairing_table1(meta) + tbl[meta:get_string("conn_name")] = peer_pos + techage.teleport.prepare_pairing(peer_pos, nil, S("server not connected")) + else + techage.teleport.prepare_pairing(peer_pos) + end + elseif oldmetadata.fields.conn_name then + local tbl = get_pairing_table2(oldmetadata) + tbl[oldmetadata.fields.conn_name] = nil + end + end +end + +function techage.teleport.is_connected(pos) + return M(pos):get_string("tele_peer_pos") ~= "" +end + +function techage.teleport.get_remote_pos(pos) + local s = M(pos):get_string("tele_peer_pos") + if s ~= "" then + return S2P(s) + end +end + +function techage.teleport.after_formspec(pos, player, fields, max_dist, ex_points) + if techage.get_expoints(player) >= ex_points then + if techage.menu.eval_input(pos, TELE_MENU, fields) then + if not techage.teleport.is_connected(pos) then + local meta = M(pos) + if fields.remote_name ~= "" then -- Client + local tbl = get_pairing_table1(meta) + local peer_pos = tbl[fields.remote_name] + if peer_pos then + if vector.distance(pos, peer_pos) <= max_dist then + tbl[fields.remote_name] = nil + store_connection(pos, peer_pos) + store_connection(peer_pos, pos) + M(pos):set_string("status", S("Connected")) + else + M(pos):set_string("status", S("Distance > @1 blocks", max_dist)) + meta:set_string("formspec", techage.teleport.formspec(pos)) + end + end + elseif fields.conn_name ~= "" then -- Server + local tbl = get_pairing_table1(meta) + tbl[fields.conn_name] = pos + techage.teleport.prepare_pairing(pos, nil, S("server not connected")) + end + end + end + else + M(pos):set_string("status", S("Ex-points missing (@1 < @2)", techage.get_expoints(player), ex_points)) + M(pos):set_string("formspec", techage.teleport.formspec(pos)) + end +end diff --git a/techage/chemistry/ta4_doser.lua b/techage/chemistry/ta4_doser.lua index eafdda8..886e8b3 100644 --- a/techage/chemistry/ta4_doser.lua +++ b/techage/chemistry/ta4_doser.lua @@ -362,14 +362,12 @@ techage.register_node({"techage:ta4_doser", "techage:ta4_doser_on"}, { end, }) -if minetest.global_exists("unified_inventory") then - unified_inventory.register_craft_type("ta4_doser", { - description = S("TA4 Reactor"), - icon = 'techage_reactor_filler_plan.png', - width = 2, - height = 2, - }) -end +techage.recipes.register_craft_type("ta4_doser", { + description = S("TA4 Reactor"), + icon = 'techage_reactor_filler_plan.png', + width = 2, + height = 2, +}) minetest.register_craft({ output = "techage:ta4_doser", diff --git a/techage/collider/cooler.lua b/techage/collider/cooler.lua new file mode 100644 index 0000000..4161b08 --- /dev/null +++ b/techage/collider/cooler.lua @@ -0,0 +1,91 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2021 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA4 Cooler as part of the Collider + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S + +local Pipe = techage.LiquidPipe + +minetest.register_node("techage:ta4_collider_cooler", { + description = S("TA4 Collider Cooler"), + tiles = { + -- up, down, right, left, back, front + { + image = "techage_appl_cooler4.png^techage_frame4_ta4_top.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 0.4, + }, + }, + { + image = "techage_appl_cooler4.png^techage_frame4_ta4_top.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 0.4, + }, + }, + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_pipe.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_pipe.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_cooler.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_cooler.png", + }, + drawtype = "nodebox", + paramtype2 = "facedir", + groups = {cracky = 1}, + on_rotate = screwdriver.disallow, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), + networks = { + pipe2 = {}, + }, + + after_place_node = function(pos, placer, itemstack) + Pipe:after_place_node(pos) + end, + + after_dig_node = function(pos, oldnode) + Pipe:after_dig_node(pos) + techage.del_mem(pos) + end, +}) + +Pipe:add_secondary_node_names({"techage:ta4_collider_cooler"}) +Pipe:set_valid_sides("techage:ta4_collider_cooler", {"R", "L"}) + +techage.register_node({"techage:ta4_collider_cooler"}, { + on_transfer = function(pos, in_dir, topic, payload) + if topic == "cooler" then + return true + else + return false + end + end, +}) + +minetest.register_craft({ + output = "techage:ta4_collider_cooler", + recipe = { + {'', 'dye:blue', ''}, + {'', 'techage:cooler', ''}, + {'', 'techage:aluminum', ''}, + }, +}) + diff --git a/techage/collider/detector.lua b/techage/collider/detector.lua new file mode 100644 index 0000000..6a38a27 --- /dev/null +++ b/techage/collider/detector.lua @@ -0,0 +1,414 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2021 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA4 Detector as part of the Collider + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S +local S2P = minetest.string_to_pos +local P2S = minetest.pos_to_string +local getpos = techage.assemble.get_pos + +local CYCLE_TIME = 2 +local TNO_MAGNETS = 22 +local PROBABILITY = 180 -- check every 20 s => 20 * 180 * 50% = 30 min + +local TIME_SLOTS = 10 +local Schedule = {[0] = + -- Route: 0 = forward, 1 = right, 2 = backward, 3 = left + -- Gas left/right + {name = "techage:ta4_collider_pipe_inlet", yoffs = 1, route = {3,3,3,2}, check = techage.gas_inlet_check}, + {name = "techage:ta4_collider_pipe_inlet", yoffs = 1, route = {1,1,1,2}, check = techage.gas_inlet_check}, + -- Power left/right + {name = "techage:ta4_collider_cable_inlet", yoffs = 2, route = {3,3,3}, check = techage.power_inlet_check}, + {name = "techage:ta4_collider_cable_inlet", yoffs = 2, route = {1,1,1}, check = techage.power_inlet_check}, + -- Cooler + {name = "techage:ta4_collider_pipe_inlet", yoffs = 0, route = {0}, check = techage.cooler_check}, + {name = "techage:ta4_collider_pipe_inlet", yoffs = 2, route = {0}, check = techage.cooler_check}, + -- Air outlet + {name = "techage:ta4_collider_pipe_outlet", yoffs = 2, route = {}, check = techage.air_outlet_check}, + -- All nodes + {name = "shell", yoffs = 0, route = {}, check = nil}, +} + +local function play_sound(pos) + minetest.sound_play("techage_hum", { + pos = pos, + gain = 0.5, + max_hear_distance = 10, + }) +end + +local function terminal_message(pos, msg) + local term_num = M(pos):contains("term_num") and M(pos):get_string("term_num") + local own_num = M(pos):get_string("node_number") + + if term_num and own_num then + techage.send_single(own_num, term_num, "text", msg) + end +end + +local function experience_points(pos) + if math.random(PROBABILITY) == 1 then + local owner = M(pos):get_string("owner") + local own_num = M(pos):get_string("node_number") + local player = minetest.get_player_by_name(owner) + if player then + if techage.add_expoint(player, own_num) then + terminal_message(pos, "Experience point reached!") + end + end + end +end + +local function check_shell(pos, param2) + local pos1 = getpos(pos, param2, {3,3,3,2}, 0) + local pos2 = getpos(pos, param2, {1,1,1,0}, 2) + local _, tbl = minetest.find_nodes_in_area(pos1, pos2, {"techage:ta4_detector_magnet", "techage:ta4_colliderblock", "default:obsidian_glass"}) + if tbl["techage:ta4_detector_magnet"] < 16 then + return false, "Magnet missing" + elseif tbl["techage:ta4_colliderblock"] < 31 then + return false, "Steel block missing" + elseif tbl["default:obsidian_glass"] < 1 then + return false, "Obsidian glass missing" + end + return true +end + +local function check_state(pos) + -- Cyclically check all connections + local param2 = minetest.get_node(pos).param2 + local nvm = techage.get_nvm(pos) + nvm.ticks = (nvm.ticks or 0) + 1 + local idx = nvm.ticks % TIME_SLOTS + local item = Schedule[idx] + + if idx == 1 then + nvm.result = true + end + + if item then + if item.name == "shell" then + local res, err = check_shell(pos, param2) + if not res then + nvm.result = false + nvm.runnning = false + terminal_message(pos, (err or "unknown") .. "!!!") + return nvm.result + end + else + local pos2 = getpos(pos, param2, item.route, item.yoffs) + local nvm2 = techage.get_nvm(pos2) + local meta2 = M(pos2) + local node2 = minetest.get_node(pos2) + if item.name == node2.name then + local res, err = item.check(pos2, node2, meta2, nvm2) + --print("check_state", idx, res, err) + if not res then + nvm.result = false + nvm.runnning = false + terminal_message(pos, (err or "unknown") .. "!!!") + return nvm.result + end + else + nvm.result = false + nvm.runnning = false + terminal_message(pos, "Detector defect!!!") + end + end + elseif idx == #Schedule + 1 then + return nvm.result + end +end + +local function add_laser(pos) + local param2 = minetest.get_node(pos).param2 + local pos1 = getpos(pos, param2, {3,3}, 1) + local pos2 = getpos(pos, param2, {1,1,1}, 1) + techage.del_laser(pos) + techage.add_laser(pos, pos1, pos2) +end + +local function create_task(pos, task) + local mem = techage.get_mem(pos) + if not mem.co then + mem.co = coroutine.create(task) + end + + local _, err = coroutine.resume(mem.co, pos) + if err then + mem.co = nil + --print(err) + return + end + minetest.after(0.4, create_task, pos) +end + +-- Call on_cyclic_check of all magents so that the magnets don't need a FLB. +local function magnet_on_cyclic_check(pos, nvm) + local ndef = minetest.registered_nodes["techage:ta4_magnet"] + for idx,pos2 in ipairs(nvm.magnet_positions or {}) do + local res = ndef.on_cyclic_check(pos2) + if res == -2 then + terminal_message(pos, "Magnet #" .. idx .. " defect!!!") + return false + elseif res == -1 then + terminal_message(pos, "Vacuum defect!!!") + techage.air_outlet_reset({x=pos.x, y=pos.y + 2, z=pos.z}) + return false + end + end + return true +end + +minetest.register_node("techage:ta4_detector_core", { + description = S("TA4 Collider Detector Core"), + tiles = { + -- up, down, right, left, back, front + "default_steel_block.png", + "default_steel_block.png", + "default_steel_block.png^techage_collider_detector_core.png", + "default_steel_block.png^techage_collider_detector_core.png", + "default_steel_block.png^techage_collider_detector_core.png", + "default_steel_block.png^techage_collider_detector_core.png", + }, + drawtype = "nodebox", + paramtype2 = "facedir", + groups = {cracky = 1}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), + + after_place_node = function(pos, placer, itemstack) + local nvm = techage.get_nvm(pos) + local meta = M(pos) + local own_num = techage.add_node(pos, "techage:ta4_detector_core") + meta:set_string("node_number", own_num) + meta:set_string("owner", placer:get_player_name()) + M({x=pos.x, y=pos.y - 1, z=pos.z}):set_string("infotext", S("TA4 Collider Detector") .. " " .. own_num) + minetest.get_node_timer(pos):start(CYCLE_TIME) + end, + + on_timer = function(pos, elapsed) + local nvm = techage.get_nvm(pos) + if not magnet_on_cyclic_check(pos, nvm) then + techage.del_laser(pos) + if nvm.running then + terminal_message(pos, "Detector stopped.") + nvm.running = false + end + nvm.magnet_positions = nil + elseif nvm.running then + local res = check_state(pos) + if res == true then + experience_points(pos) + add_laser(pos) + if nvm.ticks <= TIME_SLOTS then -- only once + terminal_message(pos, "Detector running.") + end + elseif res == false then + techage.del_laser(pos) + nvm.running = false + nvm.magnet_positions = nil + terminal_message(pos, "Detector stopped.") + end + if nvm.running then + play_sound(pos) + end + end + return true + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + techage.on_remove_collider(digger) + techage.remove_node(pos, oldnode, oldmetadata) + techage.del_mem(pos) + end, +}) + +local function check_expr(own_num, term_num, text, expr) + techage.send_single(own_num, term_num, "text", text .. "..." .. (expr and "ok" or "error!!!")) + return expr +end + +local function start_task(pos) + local term_num = M(pos):contains("term_num") and M(pos):get_string("term_num") + local param2 = minetest.get_node(pos).param2 + local pos2 = getpos(pos, param2, {3,3,3}, 1) + local own_num = M(pos):get_string("node_number") + local nvm = techage.get_nvm(pos) + nvm.magnet_positions = {} + + if term_num and param2 and pos2 then + techage.send_single(own_num, term_num, "text", "#### Start ####") + + coroutine.yield() + local resp = techage.tube_inlet_command(pos2, "enumerate", 1) + if not check_expr(own_num, term_num, "- Check number of magnets", resp == TNO_MAGNETS) then + nvm.locked = false + return + end + + coroutine.yield() + techage.send_single(own_num, term_num, "text", "- Check position of magnets...") + resp = techage.tube_inlet_command(pos2, "distance") + if resp ~= true then + techage.send_single(own_num, term_num, "append", "#" .. resp .. " defect!!!") + nvm.locked = false + return + end + techage.send_single(own_num, term_num, "append", "ok") + + coroutine.yield() + techage.send_single(own_num, term_num, "text", "- Start magnets...") + local t = {} + for num = 1, TNO_MAGNETS do + local resp = techage.tube_inlet_command(pos2, "pos", num) + if not resp or type(resp) ~= "table" then + techage.send_single(own_num, term_num, "append", "#" .. num .. " defect!!!") + nvm.magnet_positions = nil + nvm.locked = false + return + else + t[#t + 1] = resp + end + coroutine.yield() + end + nvm.magnet_positions = t + techage.send_single(own_num, term_num, "append", "ok") + + coroutine.yield() + techage.send_single(own_num, term_num, "text", "- Check magnets...") + -- The check will be performed by the timer, so wait 5 sec. + for i = 1,14 do + coroutine.yield() + end + if nvm.magnet_positions then + techage.send_single(own_num, term_num, "append", "ok") + else + nvm.locked = false + return + end + + coroutine.yield() + techage.send_single(own_num, term_num, "text", "- Check detector...") + for _,item in ipairs(Schedule)do + if item.name == "shell" then + local res, err = check_shell(pos, param2) + if not res then + techage.send_single(own_num, term_num, "append", err .. "!!!") + nvm.magnet_positions = nil + nvm.locked = false + return + end + else + local pos2 = getpos(pos, param2, item.route, item.yoffs) + local nvm2 = techage.get_nvm(pos2) + local meta2 = M(pos2) + local node2 = minetest.get_node(pos2) + if item.name == node2.name then + local res, err = item.check(pos2, node2, meta2, nvm2) + if not res then + techage.send_single(own_num, term_num, "append", err .. "!!!") + nvm.magnet_positions = nil + nvm.locked = false + return + end + else + techage.send_single(own_num, term_num, "append", "defect!!!") + nvm.magnet_positions = nil + nvm.locked = false + return + end + coroutine.yield() + end + end + techage.send_single(own_num, term_num, "append", "ok") + + coroutine.yield() + techage.send_single(own_num, term_num, "text", "Collider started.") + nvm.ticks = 0 + nvm.running = true + end +end + +local function test_magnet(pos, payload) + local term_num = M(pos):contains("term_num") and M(pos):get_string("term_num") + local param2 = minetest.get_node(pos).param2 + local pos2 = getpos(pos, param2, {3,3,3}, 1) + local own_num = M(pos):get_string("node_number") + local magnet_num = tonumber(payload) + local res, err = techage.tube_inlet_command(pos2, "test", magnet_num) + if res then + techage.send_single(own_num, term_num, "text", "magnet #" .. magnet_num .. ": ok") + else + techage.send_single(own_num, term_num, "text", "magnet #" .. magnet_num .. ": " .. (err or "unknown error") .. "!!!") + end +end + +techage.register_node({"techage:ta4_detector_core"}, { + on_recv_message = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == "connect" then + M(pos):set_string("term_num", src) + return true + elseif topic == "start" then + -- Worker block + nvm.locked = true + create_task(pos, start_task) + return true + elseif topic == "stop" then + nvm.running = false + techage.del_laser(pos) + nvm.locked = false + return "Detector stopped." + elseif topic == "status" then + if nvm.running == true then + return "running" + elseif nvm.result == false then + return "fault" + else + return "stopped" + end + elseif topic == "test"then + if payload and tonumber(payload) then + test_magnet(pos, payload) + return true + else + return "Invalid magnet number" + end + elseif topic == "points" then + local owner = M(pos):get_string("owner") + local player = minetest.get_player_by_name(owner) + if player then + local points = techage.get_expoints(player) + return "Ex. Points = " .. points + end + else + return "unsupported" + end + end, + on_node_load = function(pos) + minetest.get_node_timer(pos):start(CYCLE_TIME) + end, +}) + + +minetest.register_craft({ + output = "techage:ta4_detector_core", + recipe = { + {'techage:aluminum', 'basic_materials:heating_element', 'default:steel_ingot'}, + {'default:diamond', 'techage:ta4_wlanchip', 'techage:electric_cableS'}, + {'default:steel_ingot', '', 'techage:aluminum'}, + }, +}) + diff --git a/techage/collider/inlets.lua b/techage/collider/inlets.lua new file mode 100644 index 0000000..10bd185 --- /dev/null +++ b/techage/collider/inlets.lua @@ -0,0 +1,364 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2021 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA4 Tube/Pipe Inputs/Outputs as part of the Collider + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S + +local PWR_NEEDED = 15 +local CYCLE_TIME = 2 +local GAS_CAPA = 20 +local AIR_CAPA = 1000 + +local VTube = techage.VTube +local Pipe = techage.LiquidPipe +local Cable = techage.ElectricCable +local power = networks.power +local liquid = networks.liquid + +-------------------------------------------------------------------------------- +-- Tube Input +-------------------------------------------------------------------------------- +minetest.register_node("techage:ta4_collider_tube_inlet", { + description = S("TA4 Collider Tube Input"), + tiles = { + -- up, down, right, left, back, front + "default_steel_block.png", + "default_steel_block.png", + "default_steel_block.png", + "default_steel_block.png", + "default_steel_block.png", + "default_steel_block.png^techage_collider_tube_open.png", + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-4/8, -4/8, -4/8, -1/8, 4/8, 4/8}, + { 1/8, -4/8, -4/8, 4/8, 4/8, 4/8}, + {-4/8, 1/8, -4/8, 4/8, 4/8, 4/8}, + {-4/8, -4/8, -4/8, 4/8, -1/8, 4/8}, + }, + }, + selection_box = { + type = "fixed", + fixed = {-4/8, -4/8, -4/8, 4/8, 4/8, 4/8}, + }, + paramtype2 = "facedir", + groups = {cracky = 1}, + on_rotate = screwdriver.disallow, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), + + after_place_node = function(pos, placer, itemstack) + VTube:after_place_node(pos) + end, + + after_dig_node = function(pos, oldnode) + VTube:after_dig_node(pos) + techage.del_mem(pos) + end, +}) + +VTube:add_secondary_node_names({"techage:ta4_collider_tube_inlet"}) +VTube:set_valid_sides("techage:ta4_collider_tube_inlet", {"F"}) + +-- Called from the detector via tube ring +techage.register_node({"techage:ta4_collider_tube_inlet"}, { + on_transfer = function(pos, in_dir, topic, payload) + if topic == "distance" then + return pos + elseif topic == "enumerate" and payload then + return payload - 1 + elseif topic == "check" then + local nvm = techage.get_nvm(pos) + nvm.check_received = true + return true + end + end, +}) + +-- Used by the detector to check the tube connection +function techage.tube_inlet_command(pos, command, payload) + if command == "distance" then + local pos2 = techage.transfer(pos, "F", command, payload, VTube, {"techage:ta4_magnet"}) + if type(pos2) == "table" then + local dist = math.abs(pos.x - pos2.x) + math.abs(pos.z - pos2.z) + if pos.y == pos2.y and dist == VTube.max_tube_length + 1 then + return true + end + return 0 + else + return pos2 + end + end + return techage.transfer(pos, "F", command, payload, VTube, {"techage:ta4_magnet"}) +end + +minetest.register_craft({ + output = "techage:ta4_collider_tube_inlet", + recipe = { + {'', '', ''}, + {'techage:ta4_vtubeS', 'techage:ta4_colliderblock', ''}, + {'', '', ''}, + }, +}) + +-------------------------------------------------------------------------------- +-- Pipe Input (gas) +-------------------------------------------------------------------------------- +minetest.register_node("techage:ta4_collider_pipe_inlet", { + description = S("TA4 Collider Pipe Input"), + tiles = { + -- up, down, right, left, back, front + "default_steel_block.png", + "default_steel_block.png", + "default_steel_block.png", + "default_steel_block.png", + "default_steel_block.png", + "default_steel_block.png^techage_appl_hole_pipe.png", + }, + drawtype = "nodebox", + paramtype2 = "facedir", + groups = {cracky = 1}, + on_rotate = screwdriver.disallow, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), + networks = { + pipe2 = {}, + }, + + after_place_node = function(pos, placer, itemstack) + local nvm = techage.get_nvm(pos) + Pipe:after_place_node(pos) + nvm.liquid = {} + end, + + after_dig_node = function(pos, oldnode) + Pipe:after_dig_node(pos) + techage.del_mem(pos) + end, +}) + +liquid.register_nodes({"techage:ta4_collider_pipe_inlet"}, Pipe, "tank", {"F"}, { + capa = GAS_CAPA, + peek = function(pos, indir) + local nvm = techage.get_nvm(pos) + return liquid.srv_peek(nvm) + end, + put = function(pos, indir, name, amount) + local nvm = techage.get_nvm(pos) + return liquid.srv_put(nvm, name, amount, GAS_CAPA) + end, + take = function(pos, indir, name, amount) + local nvm = techage.get_nvm(pos) + return liquid.srv_take(nvm, name, amount) + end, + untake = function(pos, indir, name, amount) + local nvm = techage.get_nvm(pos) + liquid.srv_put(nvm, name, amount, GAS_CAPA) + end, +}) + +techage.register_node({"techage:ta4_collider_pipe_inlet"}, { + on_transfer = function(pos, in_dir, topic, payload) + -- called from heatexchanger + if topic == "detector" then + local nvm = techage.get_nvm(pos) + nvm.detector_received = true + return true + end + end, +}) + +-- Used by the detector to check for gas pressure +function techage.gas_inlet_check(pos, node, meta, nvm) + nvm.liquid = nvm.liquid or {} + if nvm.liquid.amount == GAS_CAPA and nvm.liquid.name == "techage:isobutane" then + return true + end + return false, "no gas" +end + +-- Used by the detector to check for cooler connection +function techage.cooler_check(pos, node, meta, nvm) + if nvm.detector_received then + nvm.detector_received = nil + return true + end + return false, "Cooler defect" +end + +minetest.register_craft({ + output = "techage:ta4_collider_pipe_inlet", + recipe = { + {'', '', ''}, + {'techage:ta3_pipeS', 'techage:ta4_colliderblock', ''}, + {'', '', ''}, + }, +}) + + +-------------------------------------------------------------------------------- +-- Pipe Output (air) +-------------------------------------------------------------------------------- +local function init_air(nvm) + nvm.liquid = { + amount = AIR_CAPA, + name = "air", + } + return nvm.liquid +end + +minetest.register_node("techage:ta4_collider_pipe_outlet", { + description = S("TA4 Collider Pipe Output"), + tiles = { + -- up, down, right, left, back, front + "default_steel_block.png^techage_appl_hole_pipe.png", + "default_steel_block.png", + "default_steel_block.png", + "default_steel_block.png", + "default_steel_block.png", + "default_steel_block.png", + }, + drawtype = "nodebox", + paramtype2 = "facedir", + groups = {cracky = 1}, + on_rotate = screwdriver.disallow, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), + networks = { + pipe2 = {}, + }, + + after_place_node = function(pos, placer, itemstack) + local nvm = techage.get_nvm(pos) + init_air(nvm) + Pipe:after_place_node(pos) + end, + + after_dig_node = function(pos, oldnode) + Pipe:after_dig_node(pos) + techage.del_mem(pos) + end, +}) + +liquid.register_nodes({"techage:ta4_collider_pipe_outlet"}, Pipe, "tank", {"U"}, { + capa = AIR_CAPA, + peek = function(pos, indir) + local nvm = techage.get_nvm(pos) + return liquid.srv_peek(nvm) + end, + put = function(pos, indir, name, amount) + local nvm = techage.get_nvm(pos) + return liquid.srv_put(nvm, name, amount, AIR_CAPA) + end, + take = function(pos, indir, name, amount) + local nvm = techage.get_nvm(pos) + return liquid.srv_take(nvm, name, amount) + end, + untake = function(pos, indir, name, amount) + local nvm = techage.get_nvm(pos) + liquid.srv_put(nvm, name, amount, AIR_CAPA) + end, +}) + +-- Used by the detector to check the vacuum +function techage.air_outlet_check(pos, node, meta, nvm) + nvm.liquid = nvm.liquid or {} + if nvm.liquid.amount == 0 then + return true + end + return false, "no vacuum" +end + +function techage.air_outlet_reset(pos) + local nvm = techage.get_nvm(pos) + init_air(nvm) +end + +minetest.register_craft({ + output = "techage:ta4_collider_pipe_outlet", + recipe = { + {'', 'techage:ta3_pipeS', ''}, + {'', 'techage:ta4_colliderblock', ''}, + {'', '', ''}, + }, +}) + +-------------------------------------------------------------------------------- +-- Cable Input (power) +-------------------------------------------------------------------------------- +minetest.register_node("techage:ta4_collider_cable_inlet", { + description = S("TA4 Collider Cable Input"), + tiles = { + -- up, down, right, left, back, front + "default_steel_block.png", + "default_steel_block.png", + "default_steel_block.png", + "default_steel_block.png", + "default_steel_block.png", + "default_steel_block.png^techage_appl_hole_electric.png", + }, + drawtype = "nodebox", + paramtype2 = "facedir", + groups = {cracky = 1}, + on_rotate = screwdriver.disallow, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), + networks = { + pipe2 = {}, + }, + + after_place_node = function(pos, placer, itemstack) + Cable:after_place_node(pos) + minetest.get_node_timer(pos):start(CYCLE_TIME) + end, + + on_timer = function(pos, elapsed) + local nvm = techage.get_nvm(pos) + nvm.consumed = power.consume_power(pos, Cable, nil, PWR_NEEDED) + return true + end, + + after_dig_node = function(pos, oldnode) + Cable:after_dig_node(pos) + techage.del_mem(pos) + end, +}) + +-- Used by the detector to check for power +function techage.power_inlet_check(pos, node, meta, nvm) + if nvm.consumed == PWR_NEEDED then + return true + end + return false, "no power" +end + +power.register_nodes({"techage:ta4_collider_cable_inlet"}, Cable, "con", {"F"}) + +techage.register_node({"techage:ta4_collider_cable_inlet"}, { + on_node_load = function(pos) + minetest.get_node_timer(pos):start(CYCLE_TIME) + end, +}) + +minetest.register_craft({ + output = "techage:ta4_collider_cable_inlet", + recipe = { + {'', '', ''}, + {'techage:electric_cableS', 'techage:ta4_colliderblock', ''}, + {'', '', ''}, + }, +}) diff --git a/techage/collider/magnet.lua b/techage/collider/magnet.lua new file mode 100644 index 0000000..b7314f3 --- /dev/null +++ b/techage/collider/magnet.lua @@ -0,0 +1,305 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2021 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA4 Magnet as part of the Collider + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S +local S2P = minetest.string_to_pos +local P2S = minetest.pos_to_string + +local PWR_NEEDED = 5 +local CYCLE_TIME = 2 +local CAPACITY = 10 + +local Cable = techage.ElectricCable +local Pipe = techage.LiquidPipe +local VTube = techage.VTube +local power = networks.power +local liquid = networks.liquid + +minetest.register_node("techage:ta4_colliderblock", { + description = S("TA4 Collider Steel Block"), + tiles = { + "default_steel_block.png", + }, + paramtype2 = "facedir", + groups = {cracky = 1}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techage:ta4_detector_magnet", { + description = S("TA4 Collider Detector Magnet"), + tiles = { + -- up, down, right, left, back, front + "techage_collider_magnet.png^techage_collider_magnet_appl.png", + "techage_collider_magnet.png^techage_collider_magnet_appl.png", + "techage_collider_magnet.png", + "techage_collider_magnet.png", + "techage_collider_magnet.png^techage_collider_magnet_appl.png", + "techage_collider_magnet.png^techage_collider_magnet_appl.png", + }, + drawtype = "nodebox", + paramtype2 = "facedir", + groups = {cracky = 1}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techage:ta4_magnet", { + description = S("TA4 Collider Magnet"), + inventory_image = minetest.inventorycube( + "techage_collider_magnet.png^techage_appl_hole_electric.png", + "techage_collider_magnet.png^techage_appl_hole_pipe.png", + "techage_collider_magnet.png^techage_collider_magnet_tube.png"), + tiles = { + -- up, down, right, left, back, front + "techage_collider_magnet.png^techage_appl_hole_electric.png", + "techage_collider_magnet.png", + "techage_collider_magnet.png^techage_collider_magnet_tube.png", + "techage_collider_magnet.png^techage_collider_magnet_tube.png", + "techage_collider_magnet.png^techage_collider_magnet_appl.png^techage_appl_hole_pipe.png^techage_collider_magnet_sign.png", + "techage_collider_magnet.png^techage_collider_magnet_appl.png^techage_appl_hole_pipe.png^techage_collider_magnet_sign.png", + }, + drawtype = "nodebox", + use_texture_alpha = techage.CLIP, + node_box = { + type = "fixed", + fixed = { + {-11/16, -11/16, -11/16, 11/16, 11/16, -2/16}, + {-11/16, -11/16, 2/16, 11/16, 11/16, 11/16}, + {-11/16, 2/16, -11/16, 11/16, 11/16, 11/16}, + {-11/16, -11/16, -11/16, 11/16, -2/16, 11/16}, + }, + }, + selection_box = { + type = "fixed", + fixed = {-4/8, -4/8, -4/8, 4/8, 4/8, 4/8}, + }, + collision_box = { + type = "fixed", + fixed = {-11/16, -11/16, -11/16, 11/16, 11/16, 11/16}, + }, + wield_scale = {x = 0.8, y = 0.8, z = 0.8}, + paramtype2 = "facedir", + groups = {cracky = 1}, + on_rotate = screwdriver.disallow, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), + + after_place_node = function(pos, placer, itemstack) + if pos.y > techage.collider_min_depth then + minetest.remove_node(pos) + minetest.add_item(pos, ItemStack("techage:ta4_magnet")) + return + end + local nvm = techage.get_nvm(pos) + nvm.liquid = {} + Pipe:after_place_node(pos) + Cable:after_place_node(pos) + VTube:after_place_node(pos) + M(pos):set_string("infotext", S("TA4 Collider Magnet") .. " #0") + end, + + -- To be called by the detector + on_cyclic_check = function(pos) + local nvm = techage.get_nvm(pos) + nvm.liquid = nvm.liquid or {} + nvm.consumed = power.consume_power(pos, Cable, 6, PWR_NEEDED) + if nvm.tube_damage then + nvm.tube_damage = nil + return -1 + elseif nvm.liquid.amount == CAPACITY and + nvm.liquid.name == "techage:isobutane" and + nvm.consumed == PWR_NEEDED then + return 0 + end + return -2 + end, + + tubelib2_on_update2 = function(pos, outdir, tlib2, node) + if tlib2.tube_type == "vtube" then + local nvm = techage.get_nvm(pos) + nvm.tube_damage = true + elseif tlib2.tube_type == "pipe2" then + local nvm = techage.get_nvm(pos) + nvm.liquid = nvm.liquid or {} + nvm.liquid.amount = 0 + end + end, + + after_dig_node = function(pos, oldnode) + Pipe:after_dig_node(pos) + Cable:after_dig_node(pos) + VTube:after_dig_node(pos) + techage.del_mem(pos) + end, +}) + +power.register_nodes({"techage:ta4_magnet"}, Cable, "con", {"U"}) +liquid.register_nodes({"techage:ta4_magnet"}, Pipe, "tank", {"F", "B"}, { + capa = CAPACITY, + peek = function(pos, indir) + local nvm = techage.get_nvm(pos) + return liquid.srv_peek(nvm) + end, + put = function(pos, indir, name, amount) + local nvm = techage.get_nvm(pos) + return liquid.srv_put(nvm, name, amount, CAPACITY) + end, + take = function(pos, indir, name, amount) + local nvm = techage.get_nvm(pos) + return liquid.srv_take(nvm, name, amount) + end, + untake = function(pos, indir, name, amount) + local nvm = techage.get_nvm(pos) + liquid.srv_put(nvm, name, amount, CAPACITY) + end, +}) + +VTube:add_secondary_node_names({"techage:ta4_magnet"}) +VTube:set_valid_sides("techage:ta4_magnet", {"R", "L"}) + +local function send_to_next(pos, in_dir, topic, payload) + return techage.transfer(pos, in_dir, topic, payload, VTube, + {"techage:ta4_magnet", "techage:ta4_collider_tube_inlet"}) +end + +--[[ +Commands +-------- + +distance : Check distance between all magnets. + Returns pos of next magnet or the number of the defect magnet. +enumerate : Give each magnet a unique number (1...n) +pos : Read the position +test : Test all magnet attributs. + Returns true or false, err +]]-- +techage.register_node({"techage:ta4_magnet"}, { + on_transfer = function(pos, in_dir, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == "distance" then + local pos2 = send_to_next(pos, in_dir, topic, payload) + if type(pos2) == "table" then + local dist = math.abs(pos.x - pos2.x) + math.abs(pos.z - pos2.z) + if pos.y == pos2.y and dist == VTube.max_tube_length + 1 then + return pos + end + return nvm.number or 0 + else + return pos2 + end + elseif topic == "enumerate" and payload then + payload = tonumber(payload) or 1 + nvm.number = payload + M(pos):set_string("infotext", S("TA4 Collider Magnet") .. " #" .. payload) + return send_to_next(pos, in_dir, topic, payload + 1) + elseif topic == "pos" then + if payload and tonumber(payload) == nvm.number then + nvm.tube_damage = nil + return pos + else + return send_to_next(pos, in_dir, topic, payload) + end + elseif topic == "test" then + if payload and tonumber(payload) == nvm.number then + if not nvm.liquid or not nvm.liquid.amount or nvm.liquid.amount < CAPACITY then + return false, "no gas" + elseif nvm.liquid.name ~= "techage:isobutane" then + return false, "wrong gas" + elseif nvm.consumed ~= PWR_NEEDED then + return false, "no power" + elseif nvm.tube_damage then + nvm.tube_damage = nil + return false, "no vacuum" + end + return true + else + return send_to_next(pos, in_dir, topic, payload) + end + end + end, +}) + +minetest.register_node("techage:ta4_magnet_base", { + description = S("TA4 Collider Magnet Base"), + tiles = { + -- up, down, right, left, back, front + "default_steel_block.png", + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-6/16, -8/16, -6/16, 6/16, 5/16, 6/16}, + }, + }, + paramtype2 = "facedir", + groups = {cracky = 1}, + is_ground_content = false, + paramtype = "light", + use_texture_alpha = techage.CLIP, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_craft({ + output = "techage:ta4_colliderblock", + recipe = { + {'techage:aluminum', '', 'default:steel_ingot'}, + {'', '', ''}, + {'default:steel_ingot', '', 'techage:aluminum'}, + }, +}) + + +minetest.register_craft({ + output = "techage:ta4_detector_magnet 2", + recipe = { + {'default:steel_ingot', '', 'techage:aluminum'}, + {'dye:red', 'basic_materials:gold_wire', 'dye:brown'}, + {'techage:aluminum', '', 'default:steel_ingot'}, + }, +}) + +minetest.register_craft({ + output = "techage:ta4_magnet", + recipe = { + {'techage:ta3_pipeS', '', 'techage:electric_cableS'}, + {'techage:ta4_round_ceramic', 'techage:ta4_detector_magnet', 'techage:ta4_round_ceramic'}, + {'', '', ''}, + }, +}) + +minetest.register_craft({ + output = "techage:ta4_magnet_base 4", + recipe = { + {'techage:aluminum', 'default:steel_ingot', ''}, + {'techage:aluminum', 'default:steel_ingot', ''}, + {'techage:aluminum', 'default:steel_ingot', ''}, + }, +}) + +minetest.register_lbm({ + label = "Repair Magnets", + name = "techage:magnets", + nodenames = {"techage:ta4_magnet", "techage:ta4_collider_pipe_inlet"}, + run_at_every_load = false, + action = function(pos, node) + local nvm = techage.get_nvm(pos) + if nvm.liquid and nvm.liquid.name == "techage:hydrogen" then + nvm.liquid.name = "techage:isobutane" + end + end, +}) \ No newline at end of file diff --git a/techage/collider/terminal.lua b/techage/collider/terminal.lua new file mode 100644 index 0000000..3d1c7ea --- /dev/null +++ b/techage/collider/terminal.lua @@ -0,0 +1,208 @@ +--[[ + + Techage + ======= + + Copyright (C) 2020-2021 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA4 Terminal + +]]-- + +local M = minetest.get_meta +local S = techage.S + +local STR_LEN = 80 +local HELP = [[#### TA4 Terminal #### + +Send commands to the connected machine +and output text messages from the +machine. + +Commands can have up to 80 characters. +Local commands: +- clear = clear screen +- help = this message +- pub = switch to public use +- priv = switch to private use +- connect = connect the machine + +All other commands are machine dependent. +]] + +local function get_string(meta, num, default) + local s = meta:get_string("bttn_text"..num) + if not s or s == "" then + return default + end + return s +end + +local function formspec2(mem) + mem.command = mem.command or "" + mem.output = mem.output or "" + local output = minetest.formspec_escape(mem.output) + output = output:gsub("\n", ",") + local command = minetest.formspec_escape(mem.command) + local bttn_text1 = get_string(meta, 1, "User1") + local bttn_text2 = get_string(meta, 2, "User2") + local bttn_text3 = get_string(meta, 3, "User3") + local bttn_text4 = get_string(meta, 4, "User4") + local bttn_text5 = get_string(meta, 5, "User5") + local bttn_text6 = get_string(meta, 6, "User6") + local bttn_text7 = get_string(meta, 7, "User7") + local bttn_text8 = get_string(meta, 8, "User8") + local bttn_text9 = get_string(meta, 9, "User9") + return "size[10,8]".. + "style_type[table,field;font=mono]".. + "button[0,0;3.3,1;bttn1;"..bttn_text1.."]button[3.3,0;3.3,1;bttn2;"..bttn_text2.."]button[6.6,0;3.3,1;bttn3;"..bttn_text3.."]".. + "button[0,0.8;3.3,1;bttn4;"..bttn_text4.."]button[3.3,0.8;3.3,1;bttn5;"..bttn_text5.."]button[6.6,0.8;3.3,1;bttn6;"..bttn_text6.."]".. + "button[0,1.6;3.3,1;bttn7;"..bttn_text7.."]button[3.3,1.6;3.3,1;bttn8;"..bttn_text8.."]button[6.6,1.6;3.3,1;bttn9;"..bttn_text9.."]".. + "table[0,2.5;9.8,4.7;output;"..output..";200]".. + "field[0.4,7.7;7.6,1;cmnd;;"..mem.command.."]" .. + "field_close_on_enter[cmnd;false]".. + "button[7.9,7.4;2,1;enter;"..S("Enter").."]" +end + +local function output(pos, text) + local mem = techage.get_mem(pos) + mem.output = mem.output .. "\n" .. (text or "") + mem.output = mem.output:sub(-500,-1) + M(pos):set_string("formspec", formspec2(mem)) +end + +local function command(pos, mem, player) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + + if mem.command == "clear" then + mem.output = "" + mem.command = "" + meta:set_string("formspec", formspec2(mem)) + elseif mem.command == "" then + output(pos, ">") + mem.command = "" + meta:set_string("formspec", formspec2(mem)) + elseif mem.command == "help" then + local meta = minetest.get_meta(pos) + mem.output = HELP + mem.command = "" + meta:set_string("formspec", formspec2(mem)) + elseif mem.command == "pub" and owner == player then + meta:set_int("public", 1) + output(pos, "> "..mem.command) + mem.command = "" + output(pos, "Switched to public use!") + elseif mem.command == "priv" and owner == player then + meta:set_int("public", 0) + output(pos, "> "..mem.command) + mem.command = "" + output(pos, "Switched to private use!") + elseif meta:get_int("public") == 1 or owner == player then + if mem.command == "clear" then + mem.output = + mem.command = "" + meta:set_string("formspec", formspec2(mem)) + end + end +end + +minetest.register_node("techage:ta4_terminal", { + description = "TA4 Collider Terminal", + tiles = { + -- up, down, right, left, back, front + 'techage_terminal1_top.png', + 'techage_terminal1_bottom.png', + 'techage_terminal1_side.png', + 'techage_terminal1_side.png', + 'techage_terminal1_bottom.png', + "techage_terminal1_front.png", + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-12/32, -16/32, -8/32, 12/32, -14/32, 12/32}, + {-12/32, -14/32, 12/32, 12/32, 6/32, 14/32}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-12/32, -16/32, -8/32, 12/32, -14/32, 12/32}, + {-12/32, -14/32, 12/32, 12/32, 6/32, 14/32}, + }, + }, + + after_place_node = function(pos, placer) + local number = techage.add_node(pos, minetest.get_node(pos).name) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", formspec1()) + meta:set_string("owner", placer:get_player_name()) + meta:set_string("infotext", S("TA4 Collider Terminal") .. ": " .. S("not connected") + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + local mem = techage.get_mem(pos) + if fields.number and fields.number ~= "" then + local owner = meta:get_string("owner") + if techage.check_numbers(fields.number, owner) then + local own_number = meta:get_string("own_number") + if techage.send_single(own_number, fields.number, "connect") == true then + meta:set_string("number", fields.number) + meta:set_string("infotext", S("TA4 Collider Terminal") .. ": " .. S("connected with") .. " " .. fields.number) + meta:set_string("formspec", formspec2(mem)) + end + end + elseif (fields.enter or fields.key_enter_field) and fields.cmnd then + mem.command = string.sub(fields.cmnd, 1, STR_LEN) + command(pos, mem, player:get_player_name()) + elseif fields.key_up then + mem.command = pdp13.historybuffer_priv(pos) + meta:set_string("formspec", formspec2(mem)) + elseif fields.key_down then + mem.command = pdp13.historybuffer_next(pos) + meta:set_string("formspec", formspec2(mem)) + end + end, + + after_dig_node = function(pos, oldnode, oldmetadata) + techage.remove_node(pos, oldnode, oldmetadata) + end, + + paramtype = "light", + use_texture_alpha = techage.CLIP, + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_craft({ + output = "techage:ta4_terminal", + recipe = { + {"", "techage:ta4_display", ""}, + {"dye:black", "techage:ta4_wlanchip", "default:copper_ingot"}, + {"", "techage:aluminum", ""}, + }, +}) + +techage.register_node({"techage:ta4_terminal"}, { + on_recv_message = function(pos, src, topic, payload) + if topic == "term" then + output(pos, payload) + return true + elseif topic == "clear" then + local mem = techage.get_mem(pos) + mem.output = "" + mem.command = "" + M(pos):set_string("formspec", formspec2(mem)) + return true + end + end, +}) diff --git a/techage/collider/vacuumtube.lua b/techage/collider/vacuumtube.lua new file mode 100644 index 0000000..ad5b2be --- /dev/null +++ b/techage/collider/vacuumtube.lua @@ -0,0 +1,130 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2021 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA4 Vacuum Tube as part of the Collider + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S + +local VTube = tubelib2.Tube:new({ + dirs_to_check = {1,2,3,4}, + max_tube_length = 5, + tube_type = "vtube", + show_infotext = false, + primary_node_names = {"techage:ta4_vtubeS", "techage:ta4_vtubeA"}, + secondary_node_names = {"techage:ta4_magnet"}, + after_place_tube = function(pos, param2, tube_type, num_tubes) + minetest.swap_node(pos, {name = "techage:ta4_vtube"..tube_type, param2 = param2}) + end, +}) + +techage.VTube = VTube + +minetest.register_node("techage:ta4_vtubeS", { + description = S("TA4 Vacuum Tube"), + drawtype = "nodebox", + tiles = { + -- up, down, right, left, back, front + "techage_collider_tube.png^[transformR90", + "techage_collider_tube.png^[transformR90", + "techage_collider_tube.png", + "techage_collider_tube.png", + 'techage_collider_tube_open.png', + 'techage_collider_tube_open.png', + }, + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, -6/16, 8/16, 8/16}, + { 6/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + {-8/16, 6/16, -8/16, 8/16, 8/16, 8/16}, + {-8/16, -8/16, -8/16, 8/16, -6/16, 8/16}, + }, + }, + selection_box = { + type = "fixed", + fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + }, + + after_place_node = function(pos, placer, itemstack, pointed_thing) + if not VTube:after_place_tube(pos, placer, pointed_thing) then + minetest.remove_node(pos) + return true + end + return false + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + VTube:after_dig_tube(pos, oldnode, oldmetadata) + end, + + paramtype2 = "facedir", -- important! + on_rotate = screwdriver.disallow, -- important! + paramtype = "light", + use_texture_alpha = techage.CLIP, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techage:ta4_vtubeA", { + description = S("TA4 Vacuum Tube"), + drawtype = "nodebox", + tiles = { + -- up, down, right, left, back, front + "techage_collider_tube.png^[transformR90", + 'techage_collider_tube.png^techage_collider_tube_open.png', + "techage_collider_tube.png", + "techage_collider_tube.png", + "techage_collider_tube.png^[transformR90", + 'techage_collider_tube.png^techage_collider_tube_open.png', + }, + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, -6/16, 8/16, 8/16}, + { 6/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + {-8/16, 6/16, -8/16, 8/16, 8/16, 8/16}, + {-8/16, -8/16, 6/16, 8/16, 8/16, 8/16}, + {-8/16, -8/16, -8/16, 8/16, -6/16, -6/16}, + }, + }, + selection_box = { + type = "fixed", + fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + }, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + VTube:after_dig_tube(pos, oldnode, oldmetadata) + end, + + paramtype2 = "facedir", -- important! + on_rotate = screwdriver.disallow, -- important! + paramtype = "light", + use_texture_alpha = techage.CLIP, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 1, not_in_creative_inventory=1}, + drop = "techage:ta4_vtubeS", + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_craft({ + output = "techage:ta4_vtubeS 4", + recipe = { + {'', 'default:steel_ingot', ''}, + {'techage:aluminum', 'dye:blue', 'techage:aluminum'}, + {'', 'default:steel_ingot', ''}, + }, +}) diff --git a/techage/collider/worker.lua b/techage/collider/worker.lua new file mode 100644 index 0000000..dba2139 --- /dev/null +++ b/techage/collider/worker.lua @@ -0,0 +1,210 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2021 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA4 Detector Worlker as part of the Collider + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S + +local AssemblyPlan = { + -- y-offs, path, facedir-offs, name + -- 0 = forward, 1 = right, 2 = backward, 3 = left + + -- level 1 + -- left/right + { 1, {3,3,3,2}, 0, "techage:ta4_colliderblock"}, + { 1, {3,3,3}, 0, "techage:ta4_colliderblock"}, + { 1, {3,3,3,0}, 0, "techage:ta4_colliderblock"}, + { 1, {1,1,1,2}, 0, "techage:ta4_colliderblock"}, + { 1, {1,1,1}, 0, "techage:ta4_colliderblock"}, + { 1, {1,1,1,0}, 0, "techage:ta4_colliderblock"}, + -- front + { 1, {3,3,2}, 0, "techage:ta4_colliderblock"}, + { 1, {3,2}, 0, "techage:ta4_colliderblock"}, + { 1, {2}, 0, "techage:ta4_colliderblock"}, + { 1, {1,2}, 0, "techage:ta4_colliderblock"}, + { 1, {1,1,2}, 0, "techage:ta4_colliderblock"}, + -- back + { 1, {3,3,0}, 0, "techage:ta4_colliderblock"}, + { 1, {3,0}, 0, "techage:ta4_colliderblock"}, + { 1, {0}, 2, "techage:ta4_collider_pipe_inlet"}, + { 1, {1,0}, 0, "techage:ta4_colliderblock"}, + { 1, {1,1,0}, 0, "techage:ta4_colliderblock"}, + -- middle + { 1, {3,3}, 0, "techage:ta4_detector_magnet"}, + { 1, {3}, 0, "techage:ta4_detector_magnet"}, + { 1, {1}, 0, "techage:ta4_detector_magnet"}, + { 1, {1,1}, 0, "techage:ta4_detector_magnet"}, + + -- level 2 + -- left/right + { 2, {3,3,3,2}, 1, "techage:ta4_collider_pipe_inlet"}, + { 2, {3,3,3}, 1, "techage:ta4_collider_tube_inlet"}, + { 2, {3,3,3,0}, 0, "techage:ta4_colliderblock"}, + { 2, {1,1,1,2}, 3, "techage:ta4_collider_pipe_inlet"}, + { 2, {1,1,1}, 3, "techage:ta4_collider_tube_inlet"}, + { 2, {1,1,1,0}, 0, "techage:ta4_colliderblock"}, + -- front + { 2, {3,3,2}, 0, "techage:ta4_detector_magnet"}, + { 2, {3,2}, 0, "techage:ta4_detector_magnet"}, + { 2, {2}, 0, "default:obsidian_glass"}, + { 2, {1,2}, 0, "techage:ta4_detector_magnet"}, + { 2, {1,1,2}, 0, "techage:ta4_detector_magnet"}, + -- back + { 2, {3,3,0}, 0, "techage:ta4_detector_magnet"}, + { 2, {3,0}, 0, "techage:ta4_detector_magnet"}, + { 2, {0}, 0, "techage:ta4_colliderblock"}, + { 2, {1,0}, 0, "techage:ta4_detector_magnet"}, + { 2, {1,1,0}, 0, "techage:ta4_detector_magnet"}, + + -- level 3 + -- left/right + { 3, {3,3,3,2}, 0, "techage:ta4_colliderblock"}, + { 3, {3,3,3}, 1, "techage:ta4_collider_cable_inlet"}, + { 3, {3,3,3,0}, 0, "techage:ta4_colliderblock"}, + { 3, {1,1,1,2}, 0, "techage:ta4_colliderblock"}, + { 3, {1,1,1}, 3, "techage:ta4_collider_cable_inlet"}, + { 3, {1,1,1,0}, 0, "techage:ta4_colliderblock"}, + -- front + { 3, {3,3,2}, 0, "techage:ta4_colliderblock"}, + { 3, {3,2}, 0, "techage:ta4_colliderblock"}, + { 3, {2}, 0, "techage:ta4_colliderblock"}, + { 3, {1,2}, 0, "techage:ta4_colliderblock"}, + { 3, {1,1,2}, 0, "techage:ta4_colliderblock"}, + -- back + { 3, {3,3,0}, 0, "techage:ta4_colliderblock"}, + { 3, {3,0}, 0, "techage:ta4_colliderblock"}, + { 3, {0}, 2, "techage:ta4_collider_pipe_inlet"}, + { 3, {1,0}, 0, "techage:ta4_colliderblock"}, + { 3, {1,1,0}, 0, "techage:ta4_colliderblock"}, + -- middle + { 3, {3,3}, 0, "techage:ta4_detector_magnet"}, + { 3, {3}, 0, "techage:ta4_detector_magnet"}, + { 3, {}, 0, "techage:ta4_collider_pipe_outlet"}, + { 3, {1}, 0, "techage:ta4_detector_magnet"}, + { 3, {1,1}, 0, "techage:ta4_detector_magnet"}, + + -- Core block + { 1, {}, 0, "techage:ta4_detector_core"}, +} + +local t = {} +for name, cnt in pairs(techage.assemble.count_items(AssemblyPlan)) do + t[#t + 1] = " - " .. cnt .. " " .. name +end +local LABEL = table.concat(t, "\n") + +local function build(pos, player_name) + minetest.chat_send_player(player_name, S("[TA4] Detector is being built!")) + local inv = M(pos):get_inventory() + techage.assemble.build_inv(pos, inv, AssemblyPlan, player_name) +end + +local function remove(pos, player_name) + minetest.chat_send_player(player_name, S("[TA4] Detector is being removed!")) + local inv = M(pos):get_inventory() + techage.assemble.remove_inv(pos, inv, AssemblyPlan, player_name) +end + + +local function formspec() + return "size[8,8.2]".. + "list[context;src;5,0;3,3;]".. + "label[0.2,-0.2;" .. S("Item list") .. ":\n" .. LABEL .. "]" .. + "button_exit[0,3.5;4,1;build;" .. S("Build detector") .. "]" .. + "button_exit[4,3.5;4,1;remove;" .. S("Remove detector") .. "]" .. + "list[current_player;main;0,4.5;8,4;]".. + "listring[context;src]".. + "listring[current_player;main]" +end + +minetest.register_node("techage:ta4_collider_detector_worker", { + description = S("TA4 Collider Detector Worker"), + tiles = { + -- up, down, right, left, back, front + "default_steel_block.png^techage_collider_detector_appl.png^techage_collider_detector_banner.png", + "default_steel_block.png^techage_collider_detector_banner.png", + "default_steel_block.png^techage_collider_detector_banner.png", + "default_steel_block.png^techage_collider_detector_banner.png", + "default_steel_block.png^techage_collider_detector_banner.png", + "default_steel_block.png^techage_collider_detector_appl.png^techage_collider_detector_banner.png", + }, + drawtype = "nodebox", + paramtype2 = "facedir", + groups = {cracky = 1}, + on_rotate = screwdriver.disallow, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), + + after_place_node = function(pos, placer, itemstack) + if pos.y > (techage.collider_min_depth - 2) then + minetest.remove_node(pos) + minetest.add_item(pos, ItemStack("techage:ta4_collider_detector_worker")) + return + end + local inv = M(pos):get_inventory() + inv:set_size("src", 9) + M(pos):set_string("formspec", formspec()) + end, + + on_receive_fields = function(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + + local nvm = techage.get_nvm(pos) + if fields.build then + if not nvm.assemble_locked then + build(pos, player:get_player_name()) + end + elseif fields.remove then + if not nvm.assemble_locked then + local nvm = techage.get_nvm({x=pos.x, y=pos.y + 1, z=pos.z}) + if not nvm.locked then + remove(pos, player:get_player_name()) + end + end + end + end, + + after_dig_node = function(pos, oldnode) + techage.del_mem(pos) + end, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local nvm = techage.get_nvm(pos) + if nvm.assemble_locked or nvm.assemble_build then + minetest.after(30, function(pos) + local nvm = techage.get_nvm(pos) + nvm.assemble_locked = false + end, pos) + return false + end + local inv = M(pos):get_inventory() + return inv:is_empty("src") + end, +}) + + +minetest.register_craft({ + output = "techage:ta4_collider_detector_worker", + recipe = { + {'techage:aluminum', 'default:chest', 'default:steel_ingot'}, + {'', 'basic_materials:gear_steel', ''}, + {'default:steel_ingot', 'default:mese_crystal', 'techage:aluminum'}, + }, +}) + diff --git a/techage/doc/guide.lua b/techage/doc/guide.lua index c409678..b65e121 100644 --- a/techage/doc/guide.lua +++ b/techage/doc/guide.lua @@ -13,6 +13,8 @@ local function tooltip(item) local img, name = item[1], item[2] if img == "" then -- larger image for the plan? return "", name + elseif img == "10x10" then -- huge image for the plan? + return "10x10", name end local ndef = minetest.registered_nodes[name] if ndef and ndef.description then @@ -41,6 +43,9 @@ local function plan(images) elseif img == "" then img = tooltip -- use tooltip for bigger image tbl[#tbl+1] = "image["..x_offs..","..y_offs..";2.2,2.2;"..img.."]" + elseif img == "10x10" then + img = tooltip -- use tooltip for bigger image + tbl[#tbl+1] = "image["..x_offs..","..y_offs..";10,10;"..img.."]" elseif string.find(img, ":") then tbl[#tbl+1] = "item_image["..x_offs..","..y_offs..";1,1;"..img.."]" else diff --git a/techage/doc/items.lua b/techage/doc/items.lua index bf4dc37..a2e822e 100644 --- a/techage/doc/items.lua +++ b/techage/doc/items.lua @@ -54,8 +54,8 @@ techage.Items = { ta2_forceload = "techage:forceload", ta2_driveaxle = "techage:axle", ta2_generator = "techage:ta2_generator_off", - ta2_winch = "techage:ta2_winch", - ta2_weight_chest = "techage:ta2_weight_chest", + ta2_winch = "techage:ta2_winch", + ta2_weight_chest = "techage:ta2_weight_chest", --------------------- techage_ta3 = "techage_ta3.png", techage_ta31 = "techage_ta3b.png", @@ -126,6 +126,7 @@ techage.Items = { ta3_injector = "techage:ta3_injector_pas", ---------------------------- techage_ta4 = "techage_ta4.png", + techage_ta4c = "techage_ta4c.png", ta4_windturbine = "techage:ta4_wind_turbine", ta4_pillar = "techage:pillar", ta4_blinklamp = "techage:rotor_signal_lamp_off", @@ -191,11 +192,22 @@ techage.Items = { ta4_electricmeter = "techage:ta4_electricmeter", ta4_transformer = "techage:ta4_transformer", power_reduction = "techage_power_reduction.png", + ta4_button_2x = "techage:ta4_button_2x", ta4_button_4x = "techage:ta4_button_4x", ta4_sequencer = "techage:ta4_sequencer", ta4_movecontroller = "techage:ta4_movecontroller", + ta4_turncontroller = "techage:ta4_turncontroller", + ta4_signallamp_2x = "techage:ta4_signallamp_2x", + ta4_signallamp_4x = "techage:ta4_signallamp_4x", + ta4_terminal = "techage:terminal3", + ta4_autocrafter = "techage:ta4_autocrafter_pas", + ta4_recipeblock = "techage:ta4_recipeblock", + ---------------------------- + ta5_flycontroller = "techage:ta5_flycontroller", + ta5_aichip = "techage:ta5_aichip", + ta5_tele_pipe = "techage:ta5_tele_pipe", + ta5_tele_tube = "techage:ta5_tele_tube", - --ta4_ "", } function techage.add_manual_items(table_with_items) diff --git a/techage/doc/manual_DE.lua b/techage/doc/manual_DE.lua index 4fc8946..78d1df5 100644 --- a/techage/doc/manual_DE.lua +++ b/techage/doc/manual_DE.lua @@ -117,6 +117,7 @@ techage.manual_DE.aTitel = { "3,Tür/Tor Blöcke / Door/Gate Blocks", "3,TA3 Tür Controller / Door Controller", "3,TA3 Tür Controller II / Door Controller II", + "3,TA3 Sound Block", "3,TA3 Mesecons Umsetzer / TA3 Mesecons Converter", "2,Detektoren", "3,TA3 Detektor / Detector", @@ -138,7 +139,7 @@ techage.manual_DE.aTitel = { "3,TechAge Programmer", "3,TechAge Kelle / Trowel", "3,TA3 Bohrgestängezange / TA3 Drill Pipe Wrench", - "1,TA4: Zukunft", + "1,TA4: Gegenwart", "2,Windkraftanlage", "3,TA4 Windkraftanlage / Wind Turbine", "3,TA4 Windkraftanlagengondel / Wind Turbine Nacelle", @@ -183,12 +184,17 @@ techage.manual_DE.aTitel = { "3,TA4 Lua Controller Terminal", "2,TA4 Logik-/Schalt-Module", "3,TA4 Taster/Schalter / Button/Switch", + "3,TA4 2x Taster / 2x Button", "3,TA4 4x Taster / 4x Button", + "3,TA4 2x Signallampe / 2x Signal Lamp", + "3,TA4 4x Signallampe / 4x Signal Lamp", "3,TA4 Spieler Detektor / Player Detector", "3,TA4 Zustandssammler / State Collector", "3,TA4 Detektor / Detector", - "3,TA4 Move Controller", "3,TA4 Sequenzer", + "2,Move/Dreh-Controller", + "3,TA4 Move Controller", + "3,TA4 Drehcontroller / Turn Controller", "2,TA4 Lampen", "3,TA4 LED Pflanzenlampe / TA4 LED Grow Light", "3,TA4 LED Straßenlampe / TA4 LED Street Lamp", @@ -197,7 +203,13 @@ techage.manual_DE.aTitel = { "3,Fundament-Ebene", "3,Schotter-Ebene", "3,Einfüll-Ebene", + "2,TA4 Teilchenbeschleuniger / Collider", + "3,Detektor", + "3,Steuerung / TA4 Terminal", + "3,Aufbau", "2,Weitere TA4 Blöcke", + "3,TA4 Rezept Block", + "3,TA4 Autocrafter", "3,TA4 Tank / TA4 Tank", "3,TA4 Pumpe / TA4 Pump", "3,TA4 Ofenheizung / furnace heater", @@ -215,10 +227,27 @@ techage.manual_DE.aTitel = { "3,TA4 Elektronikfabrik / Electronic Fab", "3,TA4 Injektor / Injector", "3,TA4 Recycler", + "1,TA5: Zukunft", + "2,Energiequellen", + "3,TA5 Fusionsreaktor (geplant)", + "2,Energiespeicher", + "3,TA5 Hybrid-Speicher (geplant)", + "2,Logik Blöcke", + "2,Transport und Verkehr", + "3,TA5 Flug Controller", + "3,TA5 Hyperloop Kiste / TA5 Hyperloop Chest", + "3,TA5 Hyperloop Tank / TA5 Hyperloop Tank", + "3,Hyperloop Teleport Blöcke (geplant)", + "3,TA5 Container (geplant)", + "3,TA5 Teleport Block Gegenstände / TA5 Teleport Block Items", + "3,TA5 Teleport Block Flüssigkeiten / TA5 Teleport Block Liquids", + "3,TA5-Raumgleiter (geplant)", + "2,Weitere TA5 Blöcke/Items", + "3,TA5 KI Chip / TA5 AI Chip", } techage.manual_DE.aText = { - "Tech Age ist eine Technik-Mod mit 4 Entwicklungsstufen:\n".. + "Tech Age ist eine Technik-Mod mit 5 Entwicklungsstufen:\n".. "\n".. "TA1: Eisenzeitalter (Iron Age) \n".. "Benutze Werkzeuge und Hilfsmittel wie Köhler\\, Kohlebrenner\\, Kiessieb\\, Hammer\\, Hopper um notwendige Erze und Metalle zu schürfen und zu verarbeiten.\n".. @@ -229,9 +258,12 @@ techage.manual_DE.aText = { "TA3: Ölzeitalter (Oil Age)\n".. "Suche und fördere Öl\\, baute Schienenwege zur Ölbeförderung. Ein Kraftwerk liefert den notwendigen Strom für deine Maschinen. Elektrisches Licht erhellt deine Industrieanlagen.\n".. "\n".. - "TA4: Zukunft (Future Age)\n".. + "TA4: Gegenwart (Present)\n".. "Regenerative Energiequellen wie Wind\\, Sonne und Biokraft helfen dir\\, das Ölzeitalter zu verlassen. Mit modernen Technologien und intelligenten Maschinen machst du dich auf in die Zukunft.\n".. "\n".. + "TA5: Zukunft (Future)\n".. + "Maschinen zur Überwindung von Raum und Zeit\\, neue Energiequellen und andere Errungenschaften prägen dein Leben.\n".. + "\n".. "Hinweis: Mit Klicken auf die Pluszeichen kommst du in die Unterkapitel dieser Anleitung.\n".. "\n".. "\n".. @@ -1113,6 +1145,16 @@ techage.manual_DE.aText = { "\n".. "\n".. "\n", + "Mir dem Sound Block können veschiedene Sounds/Laute abgespielt werden. Es sind alle Sounds der Mods Techage\\, Signs Bot\\, Hyperloop\\, Unified Inventory\\, TA4 Jetpack und Minetest Game verfügbar.\n".. + "\n".. + "Die Sounds können über das Menü und über ein Kommando ausgewählt und abgespielt werden.\n".. + "\n".. + " - Kommando 'on' zum Abspielen eines Sounds\n".. + " - Kommando 'sound ' zur Auswahl eines Sounds über den Index\n".. + " - Kommando 'gain ' zum Einstellen der Lautstärke über den '' Wert (0 bis 1.0).\n".. + "\n".. + "\n".. + "\n", "Der Mesecons Umsetzer dient zur Umwandlung von Techage on/off Kommandos in Mesecons Signale und umgekehrt.\n".. "Dazu müssen eine oder mehrere Knotennummern eingegeben und der Konverter mit Mesecons Blöcken \n".. "über Mesecons Leitungen verbunden werden. Den Mesecons Umsetzer kann man auch mit dem Programmer konfigurieren.\n".. @@ -1436,7 +1478,8 @@ techage.manual_DE.aText = { "Beim Cracken werden lange Kette von Kohlenwasserstoffen unter Verwendung eines Katalysator in kurze Ketten gebrochen.\n".. "Als Katalysator dient Gibbsitpulver (wird nicht verbraucht). Damit kann Bitumen in Schweröl\\, Schweröl in Naphtha und Naphtha in Benzin umgewandelt werden.\n".. "\n".. - "Bei der Hydrierung werden einem Molekül Paare von Wasserstoffatomen hinzugefügt\\, um kurzkettige Kohlenwasserstoffe in lange umzuwandeln. Hier wird Eisenpulver als Katalysator benötigt (wird nicht verbraucht). Damit kann Benzin in Naphtha\\, \n".. + "Bei der Hydrierung werden einem Molekül Paare von Wasserstoffatomen hinzugefügt\\, um kurzkettige Kohlenwasserstoffe in lange umzuwandeln.\n".. + "Hier wird Eisenpulver als Katalysator benötigt (wird nicht verbraucht). Damit kann Propangas in Isobutan\\, Isobutan in Benzin\\, Benzin in Naphtha\\,\n".. "Naphtha in Schweröl und Schweröl in Bitumen umgewandelt werden.\n".. "\n".. "\n".. @@ -1562,10 +1605,32 @@ techage.manual_DE.aText = { "\n".. "\n".. "\n", + "Dieser Block hat zwei Taster\\, die über das Schraubenschlüssel-Menü individuell konfiguriert werden können. Für beide Taster kann die Beschriftung und die Zielblockadresse konfiguriert werden. Zusätzlich kann für beide Taster das Kommando konfiguriert werden\\, welches gesendet werden soll.\n".. + "\n".. + "\n".. + "\n", "Dieser Block hat vier Taster\\, die über das Schraubenschlüssel-Menü individuell konfiguriert werden können. Für jeden Taster kann die Beschriftung und die Zielblockadresse konfiguriert werden. Zusätzlich kann für jeden Taster das Kommando konfiguriert werden\\, welches gesendet werden soll.\n".. "\n".. "\n".. "\n", + "Dieser Block hat zwei Lampen\\, die individuell angesteuert werden können. Jede Lampe kann die Farben \"rot\"\\, \"grün\" und \"orange\" anzeigen. Über das Schraubenschlüssel-Menü kann für beide Lampen die Beschriftung konfiguriert werden. Die Lampen können über folgende Kommandos angesteuert werden:\n".. + "\n".. + " - Lampe 1 auf rot schalten: '$send_cmnd(1234\\, \"red\"\\, 1)'\n".. + " - Lampe 2 auf grün schalten: '$send_cmnd(1234\\, \"green\"\\, 2)'\n".. + " - Lampe 1 auf orange schalten: '$send_cmnd(1234\\, \"amber\"\\, 1)'\n".. + " - Lampe 2 aus schalten: '$send_cmnd(1234\\, \"off\"\\, 2)'\n".. + "\n".. + "\n".. + "\n", + "Dieser Block hat vier Lampen\\, die individuell angesteuert werden können. Jede Lampe kann die Farben \"rot\"\\, \"grün\" und \"orange\" anzeigen. Über das Schraubenschlüssel-Menü kann für alle Lampen die Beschriftung konfiguriert werden. Die Lampen können über folgende Kommandos angesteuert werden:\n".. + "\n".. + " - Lampe 1 auf rot schalten: '$send_cmnd(1234\\, \"red\"\\, 1)'\n".. + " - Lampe 2 auf grün schalten: '$send_cmnd(1234\\, \"green\"\\, 2)'\n".. + " - Lampe 3 auf orange schalten: '$send_cmnd(1234\\, \"amber\"\\, 3)'\n".. + " - Lampe 4 aus schalten: '$send_cmnd(1234\\, \"off\"\\, 4)'\n".. + "\n".. + "\n".. + "\n", "Beim TA4 Spieler Detektor hat sich nur das Aussehen geändert. Die Funktionalität ist gleich wie beim TA3 Spieler Detektor.\n".. "\n".. "\n".. @@ -1579,26 +1644,6 @@ techage.manual_DE.aText = { "\n".. "\n".. "\n", - "Der TA4 Move Controller ist ähnlich zum \"Door Controller 2\"\\, aber die ausgewählten Blöcke werden nicht entfernt\\, sondern können bewegt werden.\n".. - "Da die bewegten Blöcke Spieler und Mobs mitnehmen können\\, die auf dem Block stehen\\, können damit Fahrstühle und ähnliche Transportsysteme gebaut werden.\n".. - "\n".. - "Anleitung:\n".. - "\n".. - " - Controller setzen und die Blöcke\\, die bewegt werden sollen\\, über das Menü an-trainieren (Es können bis zu 16 Blöcke an-trainiert werden)\n".. - " - die \"Flugstrecke\" muss über eine x\\,y\\,z Angabe (relativ) eingegeben werden (die maximale Distanz beträgt 100 m)\n".. - " - mit den Menü-Tasten \"Bewege A-B\" sowie \"Bewege B-A\" kann die Bewegung getestet werden\n".. - " - man kann auch durch Wände oder andere Blöcke fliegen\n".. - " - auch die Zielposition für die Blöcke kann belegt sein. Die Blöcke werden in diesem Falle \"unsichtbar\" gespeichert. Dies ist für Schiebetüren und ähnliches gedacht\n".. - " - Über das Gabelschlüssel-Menü kann im Controller auch ein \"handover\" programmiert werden. Durch Eingabe einer Blocknummer werden die Blöcke dann an den nächsten Move Controller übergeben. So lassen sich auch zusammenhängende Bewegungen über mehrere Move Controller realisieren.\n".. - "\n".. - "Der Move Controller unterstützt folgende techage Kommandos:\n".. - "\n".. - " - 'a2b' Bewege Block von A nach B\n".. - " - 'b2a' Bewege Block von B nach A\n".. - " - 'move' Bewege Block auf die andere Seite\n".. - "\n".. - "\n".. - "\n", "über den TA4 Sequenzer können ganze Abläufe programmiert werden. Hier ein Beispiel:\n".. "\n".. " -- this is a comment\n".. @@ -1623,6 +1668,47 @@ techage.manual_DE.aText = { "\n".. "\n".. "\n", + "", + "Der TA4 Move Controller ist ähnlich zum \"Door Controller 2\"\\, aber die ausgewählten Blöcke werden nicht entfernt\\, sondern können bewegt werden.\n".. + "Da die bewegten Blöcke Spieler und Mobs mitnehmen können\\, die auf dem Block stehen\\, können damit Fahrstühle und ähnliche Transportsysteme gebaut werden.\n".. + "\n".. + "Anleitung:\n".. + "\n".. + " - Controller setzen und die Blöcke\\, die bewegt werden sollen\\, über das Menü an-trainieren (Es können bis zu 16 Blöcke an-trainiert werden)\n".. + " - die \"Flugstrecke\" muss über eine x\\,y\\,z Angabe (relativ) eingegeben werden (die maximale Distanz beträgt 100 m)\n".. + " - mit den Menü-Tasten \"Bewege A-B\" sowie \"Bewege B-A\" kann die Bewegung getestet werden\n".. + " - man kann auch durch Wände oder andere Blöcke fliegen\n".. + " - auch die Zielposition für die Blöcke kann belegt sein. Die Blöcke werden in diesem Falle \"unsichtbar\" gespeichert. Dies ist für Schiebetüren und ähnliches gedacht\n".. + " - Über das Gabelschlüssel-Menü kann im Controller auch ein \"handover\" programmiert werden. Durch Eingabe einer Blocknummer werden die Blöcke dann an den nächsten Move Controller übergeben. So lassen sich auch zusammenhängende Bewegungen über mehrere Move Controller realisieren.\n".. + "\n".. + "Der Move Controller unterstützt folgende techage Kommandos:\n".. + "\n".. + " - 'a2b' Bewege Block von A nach B\n".. + " - 'b2a' Bewege Block von B nach A\n".. + " - 'move' Bewege Block auf die andere Seite\n".. + "\n".. + "*Wichtige Hinweise:*\n".. + "\n".. + " - Sofern mehrere Blöcke bewegt werden sollen\\, muss der Block\\, der die Spieler/Mobs mitnehmen soll\\, beim Antrainieren als erstes angeklickt werden.\n".. + " - Hat der Block\\, der die Spieler/Mobs mitnehmen soll\\, eine reduzierte Höhe\\, so muss die Höhe im Controller über das Schraubenschlüsselmenü eingestellt werden (bspw. Höhe = 0.5). Ansonsten wird der Spieler/Mob nicht \"gefunden\" und damit nicht mitgenommen.\n".. + "\n".. + "\n".. + "\n", + "Der TA4 Drehcontroller ist ähnlich zum Move Controller\"\\, aber die ausgewählten Blöcke werden nicht bewegt\\, sondern um ihr Zentrum nach rechts oder links gedreht.\n".. + "\n".. + "Anleitung:\n".. + "\n".. + " - Controller setzen und die Blöcke\\, die bewegt werden sollen\\, über das Menü an-trainieren (Es können bis zu 16 Blöcke an-trainiert werden)\n".. + " - mit den Menü-Tasten \"Drehe links\" sowie \"Drehe rechts\" kann die Bewegung getestet werden\n".. + "\n".. + "Der Drehcontroller unterstützt folgende techage Kommandos:\n".. + "\n".. + " - 'left' Drehe nach links\n".. + " - 'right' Drehe nach rechts\n".. + " - 'uturn' Drehe um 180 Grad\n".. + "\n".. + "\n".. + "\n", "TA4 beinhaltet eine Reihe von leistungsstarken Lampen\\, die eine bessere Ausleuchtung ermöglichen oder Spezialaufgaben übernehmen.\n".. "\n", "Die TA4 LED Pflanzenlampe ermöglicht ein schnelles und kräftiges Wachstum aller Pflanzen aus der 'farming' Mod. Die Lampe beleuchtet ein 3x3 großes Feld\\, so dass sich damit auch Pflanzen unter Tage anbauen lassen.\n".. @@ -1675,7 +1761,99 @@ techage.manual_DE.aText = { "\n".. "\n".. "\n", + "Der Teilchenbeschleuniger ist eine Forschungsanlage\\, bei der Grundlagenforschung betrieben wird. Hier können Erfahrungspunkte (experience points) gesammelt werden\\, welche für TA5 (Future Age) benötigt werden.\n".. + "\n".. + "Der Teilchenbeschleuniger muss wie sein Original am CERN in Genf unterirdisch aufgebaut werden. Die Standardeinstellung ist hier Y <= -28. Der Wert kann aber per Konfiguration vom Server Personal geändert werden. Ab besten nachfragen\\, oder mit dem \"TA4 Collider Detector Worker\" Block ausprobieren.\n".. + "\n".. + "Pro Spieler kann nur ein Teilchenbeschleuniger betrieben werden. Es macht also keinen Sinn\\, zwei oder mehrere Teilchenbeschleuniger aufzubauen. Erfahrungspunkte werden dem Spieler gutgeschrieben\\, dem der Teilchenbeschleuniger gehört. Die Erfahrungspunkte können nicht übertragen werden.\n".. + "\n".. + "Ein Teilchenbeschleuniger besteht aus einem \"Ring\" aus Röhren und Magneten sowie dem Detektor mit Kühlanlage. \n".. + "\n".. + " - Der Detektor ist das Herz der Anlage. Hier finden die wissenschaftlichen Experimente statt. Der Detektor ist 3x3x7 Blöcke groß.\n".. + " - Die TA4 Collider Detector Magnete (22 Stück) müssen über jeweils 5 Blöcken der TA4 Vakuumröhre miteinander verbunden werden. Jeder Magnet benötigt zusätzlich Strom und einen Gasanschluss für die Kühlung. Das ganze bildet (wie rechts im Plan abgebildet) ein Quadrat mit einer Kantenlänge von 37 Metern.\n".. + " - Zusätzlich wird eine Kühlung benötigt\\, welche zusätzlich beim Detektor aufgebaut werden muss. Für die Kühlung wird Isobutan benötigt.\n".. + " - Die Anlage benötigt einiges an Strom. Daher ist eine eigene Stromversorgung sinnvoll.\n".. + "\n".. + "Der Plan zeigt die Anlage von oben:\n".. + "\n".. + " - der graue Block ist der Detektor mit dem Worker-Block in der Mitte\n".. + " - die roten Blöcke sind die Magnete\\, das blaue die Vakuumröhren\n".. + "\n".. + "\n".. + "\n", + "Der Detektor wird mit Hilfe des \"TA4 Collider Detector Worker\" Blocks automatisch aufgebaut (ähnlich wie beim Bohrturm). Alle dazu notwendigen Materialien müssen zuvor in den Worker-Block gelegt werden. Auf dem Worker-Block ist der Detektor symbolisch dargestellt. Der Detektor wird über dem Worker-Block in Querrichtung errichtet.\n".. + "\n".. + "Der Detektor kann mit Hilfe des Worker-Blocks auch wieder abgebaut werden.\n".. + "\n".. + "Auf den beiden Stirnseiten des Detektors befinden sich die Anschlüsse für Strom\\, Gas und Vakuumröhre. Oben muss eine TA4 Pumpe angeschlossen werden\\, um die Röhre leer zu saugen / das Vakuum zu erzeugen.\n".. + "\n".. + "Auf der Rückseite des Detektors muss das Kühlsystem angeschlossen werden. Im Plan rechts ist das Kühlsystem abgebildet. Hier wird neben dem TA4 Wärmetauscher des Energiespeichers (welcher hier zur Kühlung genutzt wird)\\, auch ein TA4 Kühlerblock benötigt. \n".. + "\n".. + "Hinweis: Der Pfeil des Wärmetauschers muss vom Detektor weg zeigen. Auch der Wärmetauscher muss mit Strom versorgt werden.\n".. + "\n".. + "\n".. + "\n", + "Der Teilchenbeschleuniger wird über ein TA4 Terminal gesteuert (nicht über das TA4 Lua Controller Terminal).\n".. + "\n".. + "Dieses Terminal muss mit dem Detektor verbunden werden. Die Nummer des Detektors wird als Infotext am Worker-Block angezeigt.\n".. + "\n".. + "Das Terminal unterstützt folgende Kommandos:\n".. + "\n".. + " - 'connect ' (verbinden mit dem Detektor)\n".. + " - 'start' (starten des Detektors)\n".. + " - 'stop' (stoppen des Detektors)\n".. + " - 'test ' (überprüfen eines Magneten)\n".. + " - 'points' (abfragen der bereits erreichten Erfahrungspunkte)\n".. + "\n".. + "Tritt beim 'start' an einem Magneten ein Fehler auf\\, so wird die Nummer des Magneten ausgegeben. Über das 'test' Kommando können weitere Informationen zum Fehler des Magneten angefordert werden.\n".. + "\n".. + "\n".. + "\n", + "Für den Teilchenbeschleunigers wird außer den Blöcken für den Bau folgendes benötigt:\n".. + "\n".. + " - Strom (145 ku)\n".. + " - TA4 Tank mit mindestens 250 Einheiten Isobutan\n".. + "\n".. + "Beim Aufbau des Teilchenbeschleunigers empfiehlt sich folgende Reihenfolge:\n".. + "\n".. + " - Einen Forceload Block setzen. Nur der Detektor mit der Kühlanlage muss sich im Bereich des Forceload Blockes befinden.\n".. + " - Den Worker-Block setzen\\, mit Items füllen und den Detektor über das Menü aufbauen\n".. + " - Den Ring mit Röhren und Magneten aufbauen\n".. + " - Alle Magnete und den Detektor mit Stromkabel verbinden\n".. + " - Alle Magnete und den Detektor mit den gelben Röhren verbinden und das Isobutan mit einer Pumpe in das Röhrensystem pumpen.\n".. + " - Eine TA4 Pumpe als Vakuumpumpe auf dem Detektor installieren und einschalten (es wird kein zusätzlicher Tank benötigt). Geht die Pumpe in den \"standby\"\\, ist das Vakuum hergestellt. Dies dauert einige Sekunden\n".. + " - den Kühler (Wärmetauscher) aufbauen und mit dem Stromkabel verbinden\n".. + " - Das TA4 Terminal vor den Detektor setzen und über 'connect ' mit dem Detektor verbinden\n".. + " - Die Stromversorgung einschalten/herstellen\n".. + " - den Kühler (Wärmetauscher) einschalten\n".. + " - den Detektor über 'start' am TA4 Terminal einschalten. Der Detektor geht nach einigen Prüfschritten in den Normalbetrieb oder gibt einen Fehler aus.\n".. + " - Der Teilchenbeschleunigers muss im Dauerbetrieb laufen und liefert dann nach und nach Erfahrungspunkte. Für 10 Punkte muss der Teilchenbeschleuniger schon einige Stunden laufen.\n".. + "\n".. + "\n".. + "\n", "", + "Im Rezept Block können bis zu 10 Rezepte gespeichert werden. Diese Rezepte können dann über ein TA4 Autocrafter Kommando abgerufen werden. Dies ermöglicht eine Rezept-Konfiguration des Autocrafters über ein Kommando. Die Rezepte des Rezept Blocks können auch direkt per Kommando abgefragt werden.\n".. + "\n".. + "'input ' liest ein Rezept aus dem TA4 Rezeptblock. '' ist die Nummer des Rezepts. Der Block gibt eine Liste von Rezept-Zutaten zurück. \n".. + "\n".. + "Beispiel: '$send_cmnd(1234\\, \"input\"\\, 1)'\n".. + "\n".. + "\n".. + "\n", + "Die Funktion entspricht der von TA3. \n".. + "\n".. + "Die Verarbeitungsleistung beträgt 4 Items alle 4 s. Der Autocrafter benötigt hierfür 9 ku Strom.\n".. + "\n".. + "Zusätzlich unterstützt der TA4 Autocrafter die Auswahl unterschiedlicher Rezepte über folgende Kommandos:\n".. + "\n".. + "'recipe .' schaltet den Autocrafter auf ein Rezept des TA4 Rezept Blocks um. '' ist die Nummer des Rezept Blocks\\, '' die Rezept-Nummer. Beispiel: '$send_cmnd(1234\\, \"recipe\"\\, 5467.1)'\n".. + "\n".. + "Alternativ kann ein Rezept auch über die Zutatenliste ausgewählt werden\\, wie bspw.:\n".. + "'$send_cmnd(1234\\, \"recipe\"\\, \"default:coal_lump\\,\\,\\,default:stick\")'\n".. + "Hier müssen alle technische Namen eines Rezeptes durch Kommas getrennt angegeben werden. Siehe auch das Kommando 'input' beim TA4 Rezept Block.\n".. + "\n".. + "\n".. + "\n", "Siehe TA3 Tank.\n".. "\n".. "In einen TA4 Tank passen 2000 Einheiten oder 200 Fässer einer Flüssigkeit.\n".. @@ -1684,7 +1862,7 @@ techage.manual_DE.aText = { "\n", "Siehe TA3 Pumpe.\n".. "\n".. - "Die TA4 Pumpe pumpt 8 Einheiten Flüssigkeit alle zwei Sekunden.\n".. + "Die TA4 Pumpe pumpt 8 Einheiten Flüssigkeit alle zwei Sekunden. Zusätzlich unterstützt die Pumpe das Kommando 'flowrate'. Damit kann die Gesamtdurchflussmenge durch die Pumpe abgefragt werden.\n".. "\n".. "\n".. "\n", @@ -1799,6 +1977,81 @@ techage.manual_DE.aText = { "\n".. "\n".. "\n", + "Maschinen zur Überwindung von Raum und Zeit\\, neue Energiequellen und andere Errungenschaften prägen dein Leben. \n".. + "\n".. + "Für die Herstellung und Nutzung von TA5 Maschinen und Blöcken sind Erfahrungspunkte (experience points) notwendig. Diese können nur über den Teilchenbeschleuniger aus TA4 erarbeitet werden.\n".. + "\n".. + "\n".. + "\n", + "", + "", + "", + "", + "", + "", + "Der TA5 Flug Controller ist ähnlich zum TA4 Move Controller. Im Gegensatz zum TA4 Move Controller können hier mehrere Bewegungen zu einer Flugstrecke kombiniert werden. Diese Flugstrecke kann im Eingabefeld über mehrere x\\,y\\,z Angaben definiert werden (eine Bewegung pro Zeile). Über \"Speichern\" wird die Flugstrecke geprüft und gespeichert. Bei einem Fehler wird eine Fehlermeldung ausgegeben.\n".. + "\n".. + "Mit der Taste \"Test\" wird die Flugstrecke mit den absoluten Koordinaten zur Überprüfung im Chat ausgegeben.\n".. + "\n".. + "Die maximale Distanz für die gesammte Flugstrecke beträgt 500 m.\n".. + "\n".. + "Die Nutzung des TA5 Flug Controllers benötigt 40 Erfahrungspunkte.\n".. + "\n".. + "\n".. + "\n", + "Die TA5 Hyperloop Kiste erlaubt den Transport von Gegenständen über ein Hyperloop Netzwerk.\n".. + "\n".. + "Die TA5 Hyperloop Kiste muss man dazu auf eine Hyperloop Junction stellen. Die Kiste besitzt ein spezielles Menü\\, mit dem man das Pairing von zwei Kisten durchführen kann. Dinge\\, die in der Kiste sind\\, werden zur Gegenstelle teleportiert. Die Kiste kann auch mit einem Schieber gefüllt/geleert werden.\n".. + "\n".. + "Für das Pairing musst du zuerst auf der einen Seite einen Namen für die Kiste eingeben\\, dann kannst du bei der anderen Kiste diesen Namen auswählen und so die beiden Blöcke verbinden.\n".. + "\n".. + "Die Nutzung der TA5 Hyperloop Kiste benötigt 20 Erfahrungspunkte.\n".. + "\n".. + "\n".. + "\n", + "Der TA5 Hyperloop Tank erlaubt den Transport von Flüssigkeiten über ein Hyperloop Netzwerk.\n".. + "\n".. + "Den TA5 Hyperloop Tank muss man dazu auf eine Hyperloop Junction stellen. Der Tank besitzt ein spezielles Menü\\, mit dem man das Pairing von zwei Tanks durchführen kann. Flüssigkeiten\\, die in dem Tank sind\\, werden zur Gegenstelle teleportiert. Der Tank kann auch mit einer Pumpe gefüllt/geleert werden.\n".. + "\n".. + "Für das Pairing musst du zuerst auf der einen Seite einen Namen für den Tank eingeben\\, dann kannst du bei dem anderen Tank diesen Namen auswählen und so die beiden Blöcke verbinden.\n".. + "\n".. + "Die Nutzung des TA5 Hyperloop Tanks benötigt 20 Erfahrungspunkte.\n".. + "\n".. + "\n".. + "\n", + "Die Hyperloop Teleport Blöcke erlauben den Aufbau von Hyperloop Netzwerk ohne Hyperloop-Röhren.\n".. + "\n".. + "Die Nutzung der Hyperloop Teleport Blöcke benötigt 120 Erfahrungspunkte.\n".. + "\n", + "Der TA5 Container erlaubt Techage Anlagen ein- und an einer anderen Stelle wieder auszupacken.\n".. + "\n".. + "Für die Nutzung des TA5 Containers werden 80 Erfahrungspunkte benötigt.\n".. + "\n", + "Teleportblöcke erlauben den Item-Transport ohne Röhren bis zu einer Entfernung von 200 Blöcken.\n".. + "Für das Pairing musst du zuerst auf der einen Seite einen Namen für den Block eingeben\\, dann kannst du bei dem anderen Block diesen Namen auswählen und so die beiden Blöcke verbinden.\n".. + "\n".. + "Teleportblöcke benötigen jeweils 12 ku Strom.\n".. + "\n".. + "Für die Nutzung der Teleportblöcke werden 60 Erfahrungspunkte benötigt.\n".. + "\n".. + "\n".. + "\n", + "Teleportblöcke erlauben den Flüssigkeiten-Transport ohne Leitungen bis zu einer Entfernung von 200 Blöcken.\n".. + "Für das Pairing musst du zuerst auf der einen Seite einen Namen für den Block eingeben\\, dann kannst du bei dem anderen Block diesen Namen auswählen und so die beiden Blöcke verbinden.\n".. + "\n".. + "Teleportblöcke benötigen jeweils 12 ku Strom.\n".. + "\n".. + "Für die Nutzung der Teleportblöcke werden 60 Erfahrungspunkte benötigt.\n".. + "\n".. + "\n".. + "\n", + "Dank einem Spezialantrieb für Lichtgeschwindigkeit können mit dem Raumgleiter auch große Entfernungen sehr schnell überwunden werden.\n".. + "\n", + "", + "Der TA5 KI Chip wird teilweise zur Herstellung von TA5 Blöcken benötigt. Der TA5 KI Chip kann nur auf der TA4 Elektronik Fab hergestellt werden. Dazu werden 10 Erfahrungspunkte benötigt.\n".. + "\n".. + "\n".. + "\n", } techage.manual_DE.aItemName = { @@ -1918,6 +2171,7 @@ techage.manual_DE.aItemName = { "ta3_doorblock", "ta3_doorcontroller", "ta3_doorcontroller", + "ta3_soundblock", "ta3_mesecons_converter", "ta3_nodedetector", "ta3_detector", @@ -1984,13 +2238,18 @@ techage.manual_DE.aItemName = { "ta4_terminal", "", "ta4_button", + "ta4_button_2x", "ta4_button_4x", + "ta4_signallamp_2x", + "ta4_signallamp_4x", "ta4_playerdetector", "ta4_collector", "ta4_detector", - "ta4_movecontroller", "ta4_sequencer", "", + "ta4_movecontroller", + "ta4_turncontroller", + "", "ta4_growlight", "ta4_streetlamp", "ta4_industriallamp", @@ -1999,6 +2258,12 @@ techage.manual_DE.aItemName = { "", "", "", + "", + "ta4_terminal", + "techage_ta4c", + "", + "ta4_recipeblock", + "ta4_autocrafter", "ta4_tank", "ta4_pump", "ta4_furnaceheater", @@ -2016,6 +2281,23 @@ techage.manual_DE.aItemName = { "ta4_electronicfab", "ta4_injector", "ta4_recycler", + "techage_ta5", + "", + "", + "", + "", + "", + "", + "ta5_flycontroller", + "ta4_chest", + "ta4_tank", + "", + "", + "ta5_tele_tube", + "ta5_tele_pipe", + "", + "", + "ta5_aichip", } techage.manual_DE.aPlanTable = { @@ -2157,6 +2439,7 @@ techage.manual_DE.aPlanTable = { "", "", "", + "", "ta4_windturbine", "", "", @@ -2212,9 +2495,37 @@ techage.manual_DE.aPlanTable = { "", "", "", + "", + "", + "", + "", + "", "ta4_liquid_filter_base", "ta4_liquid_filter_gravel", "ta4_liquid_filter_top", + "techage_collider_plan", + "ta4_cooler", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", "", "", "", diff --git a/techage/doc/manual_EN.lua b/techage/doc/manual_EN.lua index 9a8d062..37b4a12 100644 --- a/techage/doc/manual_EN.lua +++ b/techage/doc/manual_EN.lua @@ -117,6 +117,7 @@ techage.manual_EN.aTitel = { "3,Door/Gate Blocks", "3,TA3 Door Controller", "3,TA3 Door Controller II", + "3,TA3 Sound Block", "3,TA3 Mesecons Converter", "2,Detectors", "3,TA3 Detector", @@ -138,7 +139,7 @@ techage.manual_EN.aTitel = { "3,TechAge Programmer", "3,TechAge Trowel / Trowel", "3,TA3 drill pipe wrench", - "1,TA4: Future", + "1,TA4: Present", "2,Wind Turbine", "3,TA4 Wind Turbine", "3,TA4 Wind Turbine Nacelle", @@ -183,12 +184,17 @@ techage.manual_EN.aTitel = { "3,TA4 Lua Controller Terminal", "2,TA4 Logic/Switching Modules", "3,TA4 Button/Switch", + "3,TA4 2x Button", "3,TA4 4x Button", + "3,TA4 2x Signal Lamp", + "3,TA4 4x Signal Lamp", "3,TA4 Player Detector", "3,TA4 State Collector", "3,TA4 Detector", - "3,TA4 Move Controller", "3,TA4 Sequencer", + "2,Move/Turn Controller", + "3,TA4 Move Controller", + "3,TA4 Turn Controller", "2,TA4 Lamps", "3,TA4 LED Grow Light", "3,TA4 Street Lamp", @@ -197,7 +203,13 @@ techage.manual_EN.aTitel = { "3,Base Layer", "3,Gravel Layer", "3,Filling Layer", + "2,TA4 Collider (Particle Accelerator)", + "3,Detector", + "3,Control / TA4 Terminal", + "3,Construction", "2,More TA4 Blocks", + "3,TA4 Recipe Block", + "3,TA4 Autocrafter", "3,TA4 Tank", "3,TA4 Pump", "3,TA4 Furnace Heater", @@ -215,10 +227,26 @@ techage.manual_EN.aTitel = { "3,TA4 Electronic Fab", "3,TA4 Injector", "3,TA4 Recycler", + "1,TA5: Future", + "2,Energy Sources", + "3,TA5 Fusion Reactor (planned)", + "2,Energy Storage", + "3,TA5 Hybrid Storage (planned)", + "2,Logic blocks", + "2,Transport and Traffic", + "3,TA5 Flight Controller", + "3,TA5 Hyperloop Chest", + "3,TA5 Hyperloop Tank", + "3,Hyperloop Teleport Blocks (planned)", + "3,TA5 Container (planned)", + "3,TA5 Teleport Block Items", + "3,TA5 Teleport Block Liquids", + "2,More TA5 Blocks / Items", + "3,TA5 AI Chip", } techage.manual_EN.aText = { - "Tech Age is a technology mod with 4 development stages:\n".. + "Tech Age is a technology mod with 5 development stages:\n".. "\n".. "TA1: Iron Age\n".. "Use tools and aids such as coal burners\\, coal burners\\, gravel sieves\\, hammers and hoppers to mine and process the necessary ores and metals.\n".. @@ -229,9 +257,12 @@ techage.manual_EN.aText = { "TA3: Oil Age\n".. "Find and extract oil\\, built railways for oil transportation. A power plant provides the necessary electricity for your machines. Electric light illuminates your industrial plants.\n".. "\n".. - "TA4: Future Age\n".. + "TA4: Present\n".. "Renewable energy sources such as wind\\, sun and biofuels help you to leave the oil age. With modern technologies and intelligent machines you set out into the future.\n".. "\n".. + "TA5: Future\n".. + "Machines to overcome space and time\\, new sources of energy and other achievements shape your life.\n".. + "\n".. "Note: With a click on the plus sign you get into the subchapters of this manual.\n".. "\n".. "\n".. @@ -1112,6 +1143,16 @@ techage.manual_EN.aText = { "\n".. "\n".. "\n", + "Different sounds can be played with the sound block. All sounds of the Mods Techage\\, Signs Bot\\, Hyperloop\\, Unified Inventory\\, TA4 Jetpack and Minetest Game are available.\n".. + "\n".. + "The sounds can be selected and played via the menu and via command.\n".. + "\n".. + " - Command 'on' to play a sound\n".. + " - Command 'sound ' to select a sound via the index\n".. + " - Command 'gain ' to adjust the volume via the '' value (0 to 1.0).\n".. + "\n".. + "\n".. + "\n", "The Mesecons converter is used to convert Techage on/off commands into Mesecons signals and vice versa.\n".. "To do this\\, one or more node numbers must be entered and the converter with Mesecons blocks\n".. "has to be connected via Mesecons cables. The Mesecons converter can also be configured with the programmer.\n".. @@ -1434,9 +1475,9 @@ techage.manual_EN.aText = { "Cracking breaks long chains of hydrocarbons into short chains using a catalyst.\n".. "Gibbsite powder serves as a catalyst (is not consumed). It can be used to convert bitumen into fueloil\\, fueloil into naphtha and naphtha into gasoline.\n".. "\n".. - "In hydrogenation\\, pairs of hydrogen atoms are added to a molecule to convert short-chain hydrocarbons into long ones. \n".. - "Here iron powder is required as a catalyst (is not consumed). It can be used to convert gasoline into naphtha\\,\n".. - "naphtha into fueloil\\, and fueloil into bitumen.\n".. + "In hydrogenation\\, pairs of hydrogen atoms are added to a molecule to convert short-chain hydrocarbons into long ones.\n".. + "Here iron powder is required as a catalyst (is not consumed). It can be used to convert gas (propane) into isobutane\\,\n".. + "isobutane into gasoline\\, gasoline into naphtha\\, naphtha into fueloil\\, and fueloil into bitumen.\n".. "\n".. "\n".. "\n", @@ -1560,10 +1601,32 @@ techage.manual_EN.aText = { "\n".. "\n".. "\n", + "This block has two buttons that can be individually configured using the wrench menu. The labeling and the target block address can be configured for each button. In addition\\, the command that is to be sent can be configured for each button. \n".. + "\n".. + "\n".. + "\n", "This block has four buttons that can be individually configured using the wrench menu. The labeling and the target block address can be configured for each button. In addition\\, the command that is to be sent can be configured for each button. \n".. "\n".. "\n".. "\n", + "This block has two lamps that can be controlled individually. Each lamp can display the colors \"red\"\\, \"green\" and \"amber\". The labeling for both lamps can be configured via the wrench menu. The lamps can be controlled using the following commands:\n".. + "\n".. + " - Switch lamp 1 to red: '$send_cmnd(1234\\, \"red\"\\, 1)'\n".. + " - Switch lamp 2 to green: '$send_cmnd(1234\\, \"green \"\\, 2)'\n".. + " - Switch lamp 1 to orange: '$send_cmnd(1234\\, \"amber\"\\, 1)'\n".. + " - Switch lamp 2 off: '$send_cmnd(1234\\, \"off\"\\, 2)'\n".. + "\n".. + "\n".. + "\n", + "This block has four lamps that can be controlled individually. Each lamp can display the colors \"red\"\\, \"green\" and \"amber\". The labeling for all lamps can be configured via the wrench menu. The lamps can be controlled using the following commands:\n".. + "\n".. + " - Switch lamp 1 to red: '$send_cmnd(1234\\, \"red\"\\, 1)'\n".. + " - Switch lamp 2 to green: '$send_cmnd(1234\\, \"green \"\\, 2)'\n".. + " - Switch lamp 3 to orange: '$send_cmnd(1234\\, \"amber\"\\, 3)'\n".. + " - Switch lamp 4 off: '$send_cmnd(1234\\, \"off\"\\, 4)'\n".. + "\n".. + "\n".. + "\n", "Only the appearance of the TA4 player detector has changed. The functionality is the same as with the TA3 player detector.\n".. "\n".. "\n".. @@ -1577,26 +1640,6 @@ techage.manual_EN.aText = { "\n".. "\n".. "\n", - "The TA4 Move Controller is similar to \"Door Controller 2\"\\, but the selected blocks are not removed\\, but can be moved.\n".. - "Since the moving blocks can take players and mobs standing on the block with them\\, elevators and similar transport systems can be built with them.\n".. - "\n".. - "Instructions:\n".. - "\n".. - " - Set the controller and train the blocks to be moved via the menu (up to 16 blocks can be trained)\n".. - " - the \"flight route\" must be entered via an x\\, y\\, z specification (relative) (the maximum distance is 100 m)\n".. - " - The movement can be tested with the menu buttons \"Move A-B\" and \"Move B-A\"\n".. - " - you can also fly through walls or other blocks\n".. - " - The target position for the blocks can also be occupied. In this case\\, the blocks are saved \"invisibly\". This is intended for sliding doors and the like\n".. - " - A \"handover\" can also be programmed in the controller via the open-ended wrench menu. By entering a block number\\, the blocks are then transferred to the next move controller. In this way\\, connected movements can also be implemented using several Move Controllers.\n".. - "\n".. - "The Move Controller supports the following techage commands:\n".. - "\n".. - " - 'a2b' Move block from A to B.\n".. - " - 'b2a' Move block from B to A.\n".. - " - 'move' Move block to the other side\n".. - "\n".. - "\n".. - "\n", "Entire processes can be programmed using the TA4 sequencer. Here's an example:\n".. "\n".. " -- this is a comment\n".. @@ -1621,6 +1664,47 @@ techage.manual_EN.aText = { "\n".. "\n".. "\n", + "", + "The TA4 Move Controller is similar to \"Door Controller 2\"\\, but the selected blocks are not removed\\, but can be moved.\n".. + "Since the moving blocks can take players and mobs standing on the block with them\\, elevators and similar transport systems can be built with them.\n".. + "\n".. + "Instructions:\n".. + "\n".. + " - Set the controller and train the blocks to be moved via the menu (up to 16 blocks can be trained)\n".. + " - the \"flight route\" must be entered via an x\\, y\\, z specification (relative) (the maximum distance is 100 m)\n".. + " - The movement can be tested with the menu buttons \"Move A-B\" and \"Move B-A\"\n".. + " - you can also fly through walls or other blocks\n".. + " - The target position for the blocks can also be occupied. In this case\\, the blocks are saved \"invisibly\". This is intended for sliding doors and the like\n".. + " - A \"handover\" can also be programmed in the controller via the open-ended wrench menu. By entering a block number\\, the blocks are then transferred to the next move controller. In this way\\, connected movements can also be implemented using several Move Controllers.\n".. + "\n".. + "The Move Controller supports the following techage commands:\n".. + "\n".. + " - 'a2b' Move block from A to B.\n".. + " - 'b2a' Move block from B to A.\n".. + " - 'move' Move block to the other side\n".. + "\n".. + "*Important instructions:*\n".. + "\n".. + " - If several blocks are to be moved\\, the block that is to take the players/mobs must be clicked first when training.\n".. + " - If the block that is supposed to take the players/mobs has a reduced height\\, the height must be set in the controller using the open-ended wrench menu (e.g. height = 0.5). Otherwise the player/mob will not be \"found\" and will not be taken away.\n".. + "\n".. + "\n".. + "\n", + "The TA4 turn controller is similar to the \"Move Controller\"\\, but the selected blocks are not moved\\, but rotated around their center to the right or left.\n".. + "\n".. + "Instructions:\n".. + "\n".. + " - Set the controller and train the blocks to be moved via the menu (up to 16 blocks can be trained)\n".. + " - The movement can be tested with the menu buttons \"Turn left\" and \"Turn right\"\n".. + "\n".. + "The turn controller supports the following techage commands:\n".. + "\n".. + " - 'left' Turn left\n".. + " - 'right' Turn right\n".. + " - 'uturn' Turn 180 degrees\n".. + "\n".. + "\n".. + "\n", "TA4 contains a series of powerful lamps that enable better illumination or take on special tasks.\n".. "\n", "The TA4 LED grow light enables fast and vigorous growth of all plants from the 'farming' mod. The lamp illuminates a 3x3 field\\, so that plants can also be grown underground.\n".. @@ -1673,7 +1757,99 @@ techage.manual_EN.aText = { "\n".. "\n".. "\n", + "The Collider is a research facility that conducts basic research. Experience points can be collected here\\, which are required for TA5 (Future Age).\n".. + "\n".. + "Like its original at CERN in Geneva\\, the collider must be built underground. The standard setting here is Y <= -28. The value can\\, however\\, be changed by the server personnel via configuration. Please ask or try the \"TA4 Collider Detector Worker\" block.\n".. + "\n".. + "Only one collider can be operated per player. So it makes no sense to set up two or more colliders. Experience points are credited to the player who owns the collider. The experience points cannot be transferred.\n".. + "\n".. + "A collider consists of a \"ring\" made of tubes and magnets as well as a detector with a cooling system.\n".. + "\n".. + " - The detector is the heart of the system. This is where the scientific experiments take place. The detector is 3x3x7 blocks in size.\n".. + " - The TA4 Collider Detector magnets (22 pieces) must be connected to each other via 5 blocks of the TA4 vacuum tube. Each magnet also requires electricity and a gas connection for cooling. The whole thing forms (as shown in the plan on the right) a square with an edge length of 37 meters.\n".. + " - In addition\\, cooling is required\\, which must also be installed at the detector. Isobutane is required for cooling.\n".. + " - The system requires quite a bit of electricity. Therefore\\, it makes sense to have your own power supply.\n".. + "\n".. + "The plan shows the facility from above:\n".. + "\n".. + " - the gray block is the detector with the worker block in the middle\n".. + " - the red blocks are the magnets\\, the blue the vacuum tubes\n".. + "\n".. + "\n".. + "\n", + "The detector is set up automatically with the help of the \"TA4 Collider Detector Worker\" block (similar to the derrick). All of the materials required for this must first be placed in the worker block. The detector is shown symbolically on the worker block. The detector is set up across the worker block.\n".. + "\n".. + "The detector can also be dismantled again with the help of the worker block.\n".. + "\n".. + "The connections for electricity\\, gas and vacuum tubes are located on the two front sides of the detector. A TA4 pump must be connected at the top in order to suck the tube empty / to create the vacuum.\n".. + "\n".. + "The cooling system must be connected to the rear of the detector. The cooling system is shown in the plan on the right. In addition to the TA4 heat exchanger of the energy storage unit (which is used here for cooling)\\, a TA4 cooler block is also required.\n".. + "\n".. + "Note: The arrow on the heat exchanger must point away from the detector. The heat exchanger must also be supplied with electricity.\n".. + "\n".. + "\n".. + "\n", + "The collider is controlled via a TA4 terminal (not via the TA4 Lua controller terminal).\n".. + "\n".. + "This terminal must be connected to the detector. The number of the detector is displayed as info text on the worker block.\n".. + "\n".. + "The terminal supports the following commands:\n".. + "\n".. + " - 'connect ' (connect to the detector)\n".. + " - 'start' (starting the detector)\n".. + " - 'stop' (stop the detector)\n".. + " - 'test ' (checking a magnet)\n".. + " - 'points' (query of the experience points already achieved)\n".. + "\n".. + "If an error occurs on a magnet during the 'start'\\, the number of the magnet is output. The 'test' command can be used to request further information on the magnet error.\n".. + "\n".. + "\n".. + "\n", + "In addition to the building blocks\\, the following is required for the collider:\n".. + "\n".. + " - electricity (145 ku)\n".. + " - TA4 tank with at least 250 units of isobutane\n".. + "\n".. + "The following sequence is recommended when setting up the collider:\n".. + "\n".. + " - Put a forceload block. Only the detector with the cooling system has to be in the area of ​​the forceload block.\n".. + " - Set the worker block\\, fill it with items and set up the detector via the menu\n".. + " - Build the ring with tubes and magnets\n".. + " - Connect all magnets and the detector with power cables\n".. + " - Connect all magnets and the detector with the yellow tubes and pump the isobutane into the tube system with a pump\n".. + " - Install a TA4 pump as a vacuum pump on the detector and switch it on (no additional tank is required). If the pump goes into \"standby\"\\, the vacuum is established. This will take a few seconds\n".. + " - assemble the cooler (heat exchanger) and connect it to the power cable\n".. + " - Place the TA4 terminal in front of the detector and connect it to the detector via 'connect '\n".. + " - Switch on / connect the power supply\n".. + " - switch on the cooler (heat exchanger)\n".. + " - Switch on the detector via 'start' on the TA4 terminal. After a few test steps\\, the detector goes into normal operation or outputs an error.\n".. + " - The collider has to run continuously and then gradually delivers experience points. For 10 points\\, the collider has to run for a few hours\n".. + "\n".. + "\n".. + "\n", "", + "Up to 10 recipes can be saved in the recipe block. These recipes can then be called up via a TA4 Autocrafter command. This enables the autocrafter's recipe to be configured using a command. The recipes in the recipe block can also be queried directly using a command.\n".. + "\n".. + "'input ' reads a recipe from the TA4 recipe block. '' is the number of the recipe. The block returns a list of recipe ingredients.\n".. + "\n".. + "Example: '$send_cmnd(1234\\, \"input\"\\, 1)'\n".. + "\n".. + " \n".. + "\n", + "The function corresponds to that of TA3.\n".. + "\n".. + "The processing power is 4 items every 4 s. The autocrafter requires 9 ku of electricity for this.\n".. + "\n".. + "In addition\\, the TA4 Autocrafter supports the selection of different recipes using the following commands:\n".. + "\n".. + "'recipe .' switches the autocrafter to a recipe from the TA4 Recipe Block. '' is the number of the recipe block\\, '' the recipe number. Example: '$send_cmnd(1234\\, \"recipe\"\\, 5467.1)'\n".. + "\n".. + "Alternatively\\, a recipe can also be selected via the list of ingredients\\, such as:\n".. + "'$send_cmnd(1234\\, \"recipe\"\\, \"default:coal_lump\\,\\,\\,default:stick\")'\n".. + "All technical names of a recipe must be specified here\\, separated by commas. See also the command 'input' in the TA4 recipe block.\n".. + "\n".. + " \n".. + "\n", "See TA3 tank.\n".. "\n".. "A TA4 tank can hold 2000 units or 200 barrels of liquid.\n".. @@ -1682,7 +1858,7 @@ techage.manual_EN.aText = { "\n", "See TA3 pump.\n".. "\n".. - "The TA4 pump pumps 8 units of liquid every two seconds.\n".. + "The TA4 pump pumps 8 units of liquid every two seconds. The pump also supports the 'flowrate' command. This means that the total flow rate through the pump can be queried. \n".. "\n".. "\n".. "\n", @@ -1798,6 +1974,79 @@ techage.manual_EN.aText = { "\n".. " \n".. "\n", + "Machines to overcome space and time\\, new sources of energy and other achievements shape your life.\n".. + "\n".. + "Experience points are required for the manufacture and use of TA5 machines and blocks. These can only be worked out using the collider from TA4.\n".. + "\n".. + "\n".. + "\n", + "", + "", + "", + "", + "", + "", + "The TA5 Flight Controller is similar to the TA4 Move Controller. In contrast to the TA4 Move Controller\\, several movements can be combined into one flight route. This flight route can be defined in the input field using several x\\,y\\,z entries (one movement per line). The flight route is checked and saved via \"Save\". In the event of an error\\, an error message is issued.\n".. + "\n".. + "With the \"Test\" button\\, the flight route with the absolute coordinates is output for checking in the chat.\n".. + "\n".. + "The maximum distance for the entire flight distance is 500 m.\n".. + "\n".. + "The use of the TA5 Flight Controller requires 40 experience points.\n".. + "\n".. + "\n".. + "\n", + "The TA5 Hyperloop Chest allows objects to be transported over a Hyperloop network.\n".. + "\n".. + "The TA5 Hyperloop Chest has to be placed on a Hyperloop Junction. The chest has a special menu\\, with which you can pair two chests. Things that are in the chest are teleported to the remote station. The chest can also be filled/emptied with a pusher.\n".. + "\n".. + "For pairing you first have to enter a name for the chest on one side\\, then you can select this name for the other chest and thus connect the two blocks.\n".. + "\n".. + "The use of the TA5 Hyperloop Chest requires 20 experience points.\n".. + "\n".. + "\n".. + "\n", + "The TA5 Hyperloop Tank allows liquids to be transported over a Hyperloop network.\n".. + "\n".. + "The TA5 Hyperloop Tank has to be placed on a Hyperloop Junction.The tank has a special menu\\, with which you can pair two tanks. Liquids in the tank will be teleported to the remote station. The tank can also be filled/emptied with a pump.\n".. + "\n".. + "For pairing you first have to enter a name for the tank on one side\\, then you can select this name for the other tank and thus connect the two blocks.\n".. + "\n".. + "The use of the TA5 Hyperloop Tank requires 20 experience points.\n".. + "\n".. + "\n".. + "\n", + "The Hyperloop Teleport Blocks allow the construction of a Hyperloop network without Hyperloop tubes.\n".. + "\n".. + "The use of the Hyperloop Teleport Blocks requires 120 experience points.\n".. + "\n", + "The TA5 container allows Techage systems to be packed and unpacked at another location.\n".. + "\n".. + "80 experience points are required to use the TA5 container.\n".. + "\n", + "Teleport blocks allow items to be transported without tubes up to a distance of 200 blocks.\n".. + "For pairing you first have to enter a name for the block on one side\\, then you can select this name for the other block and thus connect the two blocks.\n".. + "\n".. + "Teleport blocks each require 12 ku of electricity.\n".. + "\n".. + "60 experience points are required to use the Teleport blocks.\n".. + "\n".. + "\n".. + "\n", + "Teleport blocks allow liquids to be transported without pipes up to a distance of 200 blocks.\n".. + "For pairing you first have to enter a name for the block on one side\\, then you can select this name for the other block and thus connect the two blocks.\n".. + "\n".. + "Teleport blocks each require 12 ku of electricity.\n".. + "\n".. + "60 experience points are required to use the Teleport blocks.\n".. + "\n".. + "\n".. + "\n", + "", + "The TA5 AI Chip is partly required for the production of TA5 blocks. The TA5 AI Chip can only be manufactured at the TA4 Electronics Fab. This requires 10 experience points.\n".. + "\n".. + "\n".. + "\n", } techage.manual_EN.aItemName = { @@ -1917,6 +2166,7 @@ techage.manual_EN.aItemName = { "ta3_doorblock", "ta3_doorcontroller", "ta3_doorcontroller", + "ta3_soundblock", "ta3_mesecons_converter", "ta3_nodedetector", "ta3_detector", @@ -1983,13 +2233,18 @@ techage.manual_EN.aItemName = { "ta4_terminal", "", "ta4_button", + "ta4_button_2x", "ta4_button_4x", + "ta4_signallamp_2x", + "ta4_signallamp_4x", "ta4_playerdetector", "ta4_collector", "ta4_detector", - "ta4_movecontroller", "ta4_sequencer", "", + "ta4_movecontroller", + "ta4_turncontroller", + "", "ta4_growlight", "ta4_streetlamp", "ta4_industriallamp", @@ -1998,6 +2253,12 @@ techage.manual_EN.aItemName = { "", "", "", + "", + "ta4_terminal", + "techage_ta4c", + "", + "ta4_recipeblock", + "ta4_autocrafter", "ta4_tank", "ta4_pump", "ta4_furnaceheater", @@ -2015,6 +2276,22 @@ techage.manual_EN.aItemName = { "ta4_electronicfab", "ta4_injector", "ta4_recycler", + "techage_ta5", + "", + "", + "", + "", + "", + "", + "ta5_flycontroller", + "ta4_chest", + "ta4_tank", + "", + "", + "ta5_tele_tube", + "ta5_tele_pipe", + "", + "ta5_aichip", } techage.manual_EN.aPlanTable = { @@ -2156,6 +2433,7 @@ techage.manual_EN.aPlanTable = { "", "", "", + "", "ta4_windturbine", "", "", @@ -2211,9 +2489,36 @@ techage.manual_EN.aPlanTable = { "", "", "", + "", + "", + "", + "", + "", "ta4_liquid_filter_base", "ta4_liquid_filter_gravel", "ta4_liquid_filter_top", + "techage_collider_plan", + "ta4_cooler", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", "", "", "", diff --git a/techage/doc/plans.lua b/techage/doc/plans.lua index 4eb7b64..b2c50f4 100644 --- a/techage/doc/plans.lua +++ b/techage/doc/plans.lua @@ -24,6 +24,7 @@ local IMG41 = {"", "techage_ta4_tes.png"} local IMG42 = {"", "techage_ta4_solar.png"} local IMG43 = {"", "techage_reactor_inv.png"} local IMG44 = {"", "techage_ta4_filter.png"} +local IMG45 = {"10x10", "techage_collider_plan.png"} local TOP_V = {"top_view", ""} local SIDEV = {"side_view", ""} @@ -462,6 +463,36 @@ techage.ConstructionPlans["ta4_liquid_filter_top"] = { {false, CONCR, CONCR, CONCR, CONCR, CONCR}, } +-- +-- TA4 Collider +-- +local STEEL = {"default_steel_block.png", "techage:ta4_colliderblock"} +local COOL4 = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_cooler.png", "techage:ta4_collider_cooler"} + +techage.ConstructionPlans["techage_collider_plan"] = { + {IMG45, false, false, false}, + {false, false, false, false}, + {false, false, false, false}, + {false, false, false, false}, + {false, false, false, false}, + {false, false, false, false}, +} + +-- +-- TA4 Detector Cooler +-- +local STEEL = {"default_steel_block.png", "techage:ta4_colliderblock"} +local COOL4 = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_cooler.png", "techage:ta4_collider_cooler"} + +techage.ConstructionPlans["ta4_cooler"] = { + {false, false, false, SIDEV, false, false, false, false, false}, + {false, false, false, false, false, false, false, false, false}, + {false, STEEL, PIPEH, HEXR1, PIPEH, COOL4, PN270, false, false}, + {false, STEEL, false, HEXR2, false, false, PIPEV, false, false}, + {false, STEEL, PIPEH, HEXR3, PIPEH, PIPEH, PN180, false, false}, + {false, false, false, false, false, false, false, false, false}, +} + function techage.add_manual_plans(table_with_plans) for name, tbl in pairs(table_with_plans) do techage.ConstructionPlans[name] = tbl diff --git a/techage/energy_storage/heatexchanger1.lua b/techage/energy_storage/heatexchanger1.lua index 78f562b..198f587 100644 --- a/techage/energy_storage/heatexchanger1.lua +++ b/techage/energy_storage/heatexchanger1.lua @@ -25,12 +25,12 @@ local power = networks.power local function turbine_cmnd(pos, topic, payload) return techage.transfer(pos, "R", topic, payload, Pipe, - {"techage:ta4_turbine", "techage:ta4_turbine_on"}) + {"techage:ta4_turbine", "techage:ta4_turbine_on", "techage:ta4_collider_cooler"}) end local function inlet_cmnd(pos, topic, payload) return techage.transfer(pos, "L", topic, payload, Pipe, - {"techage:ta4_pipe_inlet"}) + {"techage:ta4_pipe_inlet", "techage:ta4_collider_pipe_inlet"}) end minetest.register_node("techage:heatexchanger1", { @@ -83,7 +83,7 @@ techage.register_node({"techage:heatexchanger1"}, { on_transfer = function(pos, indir, topic, payload) local nvm = techage.get_nvm(pos) -- used by heatexchanger2 - if topic == "diameter" or topic == "volume" or topic == "window" then + if topic == "diameter" or topic == "volume" or topic == "window" or topic == "detector" then return inlet_cmnd(pos, topic, payload) else return turbine_cmnd(pos, topic, payload) diff --git a/techage/energy_storage/heatexchanger2.lua b/techage/energy_storage/heatexchanger2.lua index 591acc8..d914355 100644 --- a/techage/energy_storage/heatexchanger2.lua +++ b/techage/energy_storage/heatexchanger2.lua @@ -9,6 +9,7 @@ See LICENSE.txt for more information TA4 Heat Exchanger2 (middle part) + (alternatively used as cooler for the TA4 collider) ]]-- @@ -31,6 +32,7 @@ local PWR_CAPA = { [9] = GRVL_CAPA * 7 * 7 * 7, -- 286 kuh } local DOWN = 5 +local PWR_NEEDED = 5 local function heatexchanger1_cmnd(pos, topic, payload) return techage.transfer({x = pos.x, y = pos.y - 1, z = pos.z}, @@ -75,7 +77,25 @@ local function stop_sound(pos) end end +local function cooler_formspec(self, pos, nvm) + return "size[4,2]".. + "box[0,-0.1;3.8,0.5;#c6e8ff]" .. + "label[0.2,-0.1;" .. minetest.colorize( "#000000", S("TA4 Heat Exchanger")) .. "]" .. + "image_button[1.5,1;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. + "tooltip[1.5,1;1,1;"..self:get_state_tooltip(nvm).."]" +end + local function can_start(pos, nvm) + -- Used as cooler for the collider? + if heatexchanger1_cmnd(pos, "detector") then + if power.power_available(pos, Cable, DOWN) then + nvm.used_as_cooler = true + return true + else + return S("No power") + end + end + -- Used as heat exchanger local netID = networks.determine_netID(pos, Cable, DOWN) if heatexchanger1_cmnd(pos, "netID") ~= netID then return S("Power network connection error") @@ -97,21 +117,32 @@ local function can_start(pos, nvm) end local function start_node(pos, nvm) - nvm.win_pos = heatexchanger1_cmnd(pos, "window") - power.start_storage_calc(pos, Cable, DOWN) - play_sound(pos) - heatexchanger1_cmnd(pos, "start") + if nvm.used_as_cooler then + play_sound(pos) + else + nvm.win_pos = heatexchanger1_cmnd(pos, "window") + power.start_storage_calc(pos, Cable, DOWN) + play_sound(pos) + heatexchanger1_cmnd(pos, "start") + end end local function stop_node(pos, nvm) - power.start_storage_calc(pos, Cable, DOWN) - stop_sound(pos) - heatexchanger1_cmnd(pos, "stop") + if nvm.used_as_cooler then + stop_sound(pos) + else + power.start_storage_calc(pos, Cable, DOWN) + stop_sound(pos) + heatexchanger1_cmnd(pos, "stop") + end end local function formspec(self, pos, nvm) local data + if nvm.used_as_cooler then + return cooler_formspec(self, pos, nvm) + end if techage.is_running(nvm) then data = power.get_network_data(pos, Cable, DOWN) end @@ -135,11 +166,9 @@ local function check_TES_integrity(pos, nvm) end if (nvm.ticks % 30) == 0 then -- every minute return heatexchanger1_cmnd(pos, "volume") - end - if (nvm.ticks % 30) == 10 then -- every minute - return heatexchanger3_cmnd(pos, "diameter") ~= nil or S("inlet/pipe error") - end - if (nvm.ticks % 30) == 20 then -- every minute + elseif (nvm.ticks % 30) == 10 then -- every minute + return heatexchanger1_cmnd(pos, "diameter") ~= nil or S("inlet/pipe error") + elseif (nvm.ticks % 30) == 20 then -- every minute return heatexchanger3_cmnd(pos, "diameter") ~= nil or S("inlet/pipe error") end local netID = networks.determine_netID(pos, Cable, DOWN) @@ -166,8 +195,38 @@ local State = techage.NodeStates:new({ formspec_func = formspec, }) +local function cooler_timer(pos, nvm) + local err = false + if power.consume_power(pos, Cable, DOWN, PWR_NEEDED) ~= PWR_NEEDED then + State:fault(pos, nvm, "No power") + stop_sound(pos) + return true + end + + -- Cyclically check pipe connections + nvm.ticks = (nvm.ticks or 0) + 1 + if (nvm.ticks % 5) == 0 then -- every 10 s + err = heatexchanger1_cmnd(pos, "detector") ~= true + elseif (nvm.ticks % 5) == 1 then -- every 10 s + err = heatexchanger3_cmnd(pos, "detector") ~= true + elseif (nvm.ticks % 5) == 2 then -- every 10 s + err = heatexchanger1_cmnd(pos, "cooler") ~= true + elseif (nvm.ticks % 5) == 3 then -- every 10 s + err = heatexchanger3_cmnd(pos, "cooler") ~= true + end + if err then + State:fault(pos, nvm, "Pipe connection error") + stop_sound(pos) + end + return true +end + local function node_timer(pos, elapsed) local nvm = techage.get_nvm(pos) + if nvm.used_as_cooler then + cooler_timer(pos, nvm) + return true + end local res = check_TES_integrity(pos, nvm) if res ~= true then State:fault(pos, nvm, res) @@ -304,26 +363,10 @@ techage.register_node({"techage:heatexchanger2"}, { else stop_sound(pos) end - -- convert to v1 - if not nvm.capa_max then - local pos1 = {x = pos.x, y = pos.y - 1, z = pos.z} - local nvm1 = techage.get_nvm(pos1) - nvm.capa_max = nvm1.capa_max or 1 - nvm.capa = nvm1.capa or 0 - - local own_num = techage.add_node(pos, "techage:heatexchanger2") - State:node_init(pos, nvm, own_num) - if nvm1.running then - State:start(pos, nvm) - end - M(pos):set_string("owner", M(pos1):get_string("owner")) - M(pos):set_string("infotext", S("TA4 Heat Exchanger")..": "..own_num) - - M(pos1):set_string("node_number", "") - M(pos1):set_string("infotext", "") - techage.del_mem(pos1) - Cable:after_place_node(pos) - Cable:after_place_node(pos1) + -- Attempt to restart the system as the heat exchanger goes into error state + -- when parts of the storage block are unloaded. + if nvm.techage_state == techage.FAULT then + start_node(pos, nvm) end end, }) diff --git a/techage/energy_storage/heatexchanger3.lua b/techage/energy_storage/heatexchanger3.lua index 0fa9688..70f3713 100644 --- a/techage/energy_storage/heatexchanger3.lua +++ b/techage/energy_storage/heatexchanger3.lua @@ -42,9 +42,14 @@ local function after_dig_node(pos, oldnode) Pipe:after_dig_node(pos) end +local function cooler_cmnd(pos, topic, payload) + return techage.transfer(pos, "R", topic, payload, Pipe, + {"techage:ta4_collider_cooler"}) +end + local function inlet_cmnd(pos, topic, payload) return techage.transfer(pos, "L", topic, payload, Pipe, - {"techage:ta4_pipe_inlet"}) + {"techage:ta4_pipe_inlet", "techage:ta4_collider_pipe_inlet"}) end minetest.register_node("techage:heatexchanger3", { @@ -77,7 +82,11 @@ Pipe:add_secondary_node_names({"techage:heatexchanger3"}) -- command interface, used by heatexchanger2 techage.register_node({"techage:heatexchanger3"}, { on_transfer = function(pos, indir, topic, payload) - return inlet_cmnd(pos, topic, payload) + if topic == "cooler" then + return cooler_cmnd(pos, topic, payload) + else + return inlet_cmnd(pos, topic, payload) + end end, }) diff --git a/techage/furnace/cooking.lua b/techage/furnace/cooking.lua index 4583407..8e07c09 100644 --- a/techage/furnace/cooking.lua +++ b/techage/furnace/cooking.lua @@ -192,14 +192,12 @@ function techage.furnace.reset_cooking(nvm) end -if minetest.global_exists("unified_inventory") then - unified_inventory.register_craft_type("ta3_melting", { - description = S("TA3 Melting"), - icon = "techage_concrete.png^techage_appl_furnace.png^techage_frame_ta3.png", - width = 2, - height = 2, - }) -end +techage.recipes.register_craft_type("ta3_melting", { + description = S("TA3 Melting"), + icon = "techage_concrete.png^techage_appl_furnace.png^techage_frame_ta3.png", + width = 2, + height = 2, +}) function techage.furnace.register_recipe(recipe) local words = string.split(recipe.output, " ") @@ -224,9 +222,7 @@ function techage.furnace.register_recipe(recipe) end end - if minetest.global_exists("unified_inventory") then - recipe.items = recipe.recipe - recipe.type = "ta3_melting" - unified_inventory.register_craft(recipe) - end + recipe.items = recipe.recipe + recipe.type = "ta3_melting" + techage.recipes.register_craft(recipe) end \ No newline at end of file diff --git a/techage/icta_controller/commands.lua b/techage/icta_controller/commands.lua index d5b5522..74354c6 100644 --- a/techage/icta_controller/commands.lua +++ b/techage/icta_controller/commands.lua @@ -456,7 +456,7 @@ techage.icta_register_condition("signaltower", { }) techage.icta_register_action("signaltower", { - title = "send Signal Tower command", + title = "TA4 Signal Tower", formspec = { { type = "numbers", @@ -487,6 +487,45 @@ techage.icta_register_action("signaltower", { end, }) +techage.icta_register_action("signallamp", { + title = "TA4 Signal Lamp", + formspec = { + { + type = "numbers", + name = "number", + label = "Signal Tower number", + default = "", + }, + { + type = "textlist", + name = "payload", + label = "lamp number", + choices = "1,2,3,4", + default = "1", + }, + { + type = "textlist", + name = "value", + label = "lamp color", + choices = "off,green,amber,red", + default = "red", + }, + { + type = "label", + name = "lbl", + label = "Turn on/off a Signal Tower lamp.", + }, + }, + button = function(data, environ) + return 'tower('..techage.fmt_number(data.number)..","..data.payload..","..data.value..')' + end, + code = function(data, environ) + return function(env, output, idx) + techage.send_multi(environ.number, data.number, data.value, tonumber(data.payload)) + end + end, +}) + techage.icta_register_action("switch", { title = "turn block on/off", formspec = { @@ -657,6 +696,98 @@ techage.icta_register_action("door", { end, }) +techage.icta_register_action("move", { + title = "TA4 Move Controller", + formspec = { + { + type = "number", + name = "number", + label = "block number", + default = "", + }, + { + type = "textlist", + name = "cmnd", + label = "command", + choices = "a2b,b2a,move", + default = "a2b", + }, + }, + button = function(data, environ) -- default button label + return 'move('..techage.fmt_number(data.number)..","..data.cmnd..')' + end, + code = function(data, environ) + return function(env, output, idx) + return techage.send_single(environ.number, data.number, data.cmnd) + end + end, +}) + +techage.icta_register_action("turn", { + title = "TA4 Turn Controller", + formspec = { + { + type = "number", + name = "number", + label = "block number", + default = "", + }, + { + type = "textlist", + name = "cmnd", + label = "command", + choices = "left,right,uturn", + default = "left", + }, + }, + button = function(data, environ) -- default button label + return 'move('..techage.fmt_number(data.number)..","..data.cmnd..')' + end, + code = function(data, environ) + return function(env, output, idx) + return techage.send_single(environ.number, data.number, data.cmnd) + end + end, +}) + +techage.icta_register_action("goto", { + title = "TA4 Sequencer", + formspec = { + { + type = "number", + name = "number", + label = "block number", + default = "", + }, + { + type = "textlist", + name = "cmnd", + label = "command", + choices = "goto,stop", + default = "left", + }, + { + type = "number", + name = "slot", + label = "time slot", + default = "1", + }, + { + type = "label", + name = "lbl", + label = "The 'stop' command needs no time slot.", + }, + }, + button = function(data, environ) -- default button label + return data.cmnd..'('..techage.fmt_number(data.number)..","..data.slot..')' + end, + code = function(data, environ) + return function(env, output, idx) + return techage.send_single(environ.number, data.number, data.cmnd, tonumber(data.slot or "1") or 1) + end + end, +}) + function techage.icta_player_detect(own_num, number, name) local state = techage.send_single(own_num, number, "name", nil) if state ~= "" then diff --git a/techage/init.lua b/techage/init.lua index a53ea37..61dfbd1 100644 --- a/techage/init.lua +++ b/techage/init.lua @@ -13,7 +13,7 @@ techage = {} -- Version for compatibility checks, see readme.md/history -techage.version = 1.03 +techage.version = 1.06 if minetest.global_exists("tubelib") then minetest.log("error", "[techage] Techage can't be used together with the mod tubelib!") @@ -33,12 +33,15 @@ elseif minetest.global_exists("minecart") and minecart.version < 1.08 then elseif minetest.global_exists("lcdlib") and lcdlib.version < 1.01 then minetest.log("error", "[techage] Techage requires lcdlib version 1.01 or newer!") return -elseif minetest.global_exists("safer_lua") and safer_lua.version < 1.0 then - minetest.log("error", "[techage] Techage requires safer_lua version 1.0 or newer!") +elseif minetest.global_exists("safer_lua") and safer_lua.version < 1.01 then + minetest.log("error", "[techage] Techage requires safer_lua version 1.01 or newer!") return elseif minetest.global_exists("networks") and networks.version < 0.10 then minetest.log("error", "[techage] Techage requires networks version 0.10 or newer!") return +elseif minetest.global_exists("hyperloop") and hyperloop.version < 2.07 then + minetest.log("error", "[techage] Techage requires hyperloop version 2.07 or newer!") + return end -- Test MT 5.4 new string mode @@ -52,6 +55,7 @@ techage.max_num_forceload_blocks = tonumber(minetest.settings:get("techage_max_n techage.basalt_stone_enabled = minetest.settings:get_bool("techage_basalt_stone_enabled") ~= false techage.ore_rarity = tonumber(minetest.settings:get("techage_ore_rarity")) or 1 techage.modified_recipes_enabled = minetest.settings:get_bool("techage_modified_recipes_enabled") ~= false +techage.collider_min_depth = tonumber(minetest.settings:get("techage_collider_min_depth")) or -28 -- allow to load marshal and sqlite3 techage.IE = minetest.request_insecure_environment() @@ -94,6 +98,12 @@ dofile(MP.."/basis/formspec_update.lua") dofile(MP.."/basis/windturbine_lib.lua") dofile(MP.."/basis/laser_lib.lua") dofile(MP.."/basis/legacy.lua") +dofile(MP.."/basis/hyperloop.lua") +dofile(MP.."/basis/oggfiles.lua") +dofile(MP.."/basis/submenu.lua") +dofile(MP.."/basis/shared_inv.lua") +dofile(MP.."/basis/shared_tank.lua") +dofile(MP.."/basis/teleport.lua") -- Main doc dofile(MP.."/doc/manual_DE.lua") @@ -183,6 +193,8 @@ dofile(MP.."/basic_machines/ta4_injector.lua") dofile(MP.."/basic_machines/itemsource.lua") dofile(MP.."/basic_machines/recycler.lua") dofile(MP.."/basic_machines/concentrator.lua") +dofile(MP.."/basic_machines/recipeblock.lua") +dofile(MP.."/basic_machines/ta5_chest.lua") -- Liquids II dofile(MP.."/liquids/tank.lua") @@ -191,6 +203,7 @@ dofile(MP.."/liquids/silo.lua") dofile(MP.."/liquids/pump.lua") dofile(MP.."/liquids/waterpump.lua") dofile(MP.."/liquids/waterinlet.lua") +dofile(MP.."/liquids/ta5_tank.lua") -- Coal power station dofile(MP.."/coal_power_station/firebox.lua") @@ -270,18 +283,28 @@ dofile(MP.."/logic/lua_logic.lua") -- old dofile(MP.."/logic/logic_block.lua") -- new dofile(MP.."/logic/node_detector.lua") dofile(MP.."/logic/player_detector.lua") +dofile(MP.."/logic/mba_detector.lua") dofile(MP.."/logic/cart_detector.lua") -dofile(MP.."/logic/gateblock.lua") -dofile(MP.."/logic/doorblock.lua") -dofile(MP.."/logic/doorcontroller.lua") -- old -dofile(MP.."/logic/doorcontroller2.lua") -- new dofile(MP.."/logic/collector.lua") +dofile(MP.."/logic/button_2x.lua") dofile(MP.."/logic/button_4x.lua") -dofile(MP.."/logic/movecontroller.lua") +dofile(MP.."/logic/signallamp_2x.lua") +dofile(MP.."/logic/signallamp_4x.lua") if minetest.global_exists("mesecon") then dofile(MP.."/logic/mesecons_converter.lua") end +-- move_controller +dofile(MP.."/move_controller/gateblock.lua") +dofile(MP.."/move_controller/doorblock.lua") +dofile(MP.."/move_controller/doorcontroller.lua") -- old +dofile(MP.."/move_controller/doorcontroller2.lua") -- new +dofile(MP.."/move_controller/movecontroller.lua") +dofile(MP.."/move_controller/turncontroller.lua") +dofile(MP.."/move_controller/flycontroller.lua") +dofile(MP.."/move_controller/soundblock.lua") + + -- Test dofile(MP.."/recipe_checker.lua") dofile(MP.."/.test/sink.lua") @@ -363,6 +386,17 @@ dofile(MP.."/items/moreblocks.lua") dofile(MP.."/carts/tank_cart.lua") dofile(MP.."/carts/chest_cart.lua") +-- Collider +dofile(MP.."/collider/vacuumtube.lua") +dofile(MP.."/collider/magnet.lua") +dofile(MP.."/collider/inlets.lua") +dofile(MP.."/collider/cooler.lua") +dofile(MP.."/collider/detector.lua") +dofile(MP.."/collider/worker.lua") + +dofile(MP.."/teleport/teleport_tube.lua") +dofile(MP.."/teleport/teleport_pipe.lua") + -- Prevent other mods from using IE techage.IE = nil diff --git a/techage/iron_age/meltingpot.lua b/techage/iron_age/meltingpot.lua index 9ae4bac..5a286e6 100644 --- a/techage/iron_age/meltingpot.lua +++ b/techage/iron_age/meltingpot.lua @@ -475,25 +475,23 @@ minetest.register_craft({ }, }) -if minetest.global_exists("unified_inventory") then - unified_inventory.register_craft_type("melting", { - description = S("TA1 Melting"), - icon = "default_cobble.png^techage_meltingpot.png", - width = 2, - height = 2, - }) - unified_inventory.register_craft_type("burning", { - description = S("TA1 Burning"), - icon = "techage_smoke.png", - width = 1, - height = 1, - }) - unified_inventory.register_craft({ - output = "techage:charcoal", - items = {"group:wood"}, - type = "burning", - }) -end +techage.recipes.register_craft_type("melting", { + description = S("TA1 Melting"), + icon = "default_cobble.png^techage_meltingpot.png", + width = 2, + height = 2, +}) +techage.recipes.register_craft_type("burning", { + description = S("TA1 Burning"), + icon = "techage_smoke.png", + width = 1, + height = 1, +}) +techage.recipes.register_craft({ + output = "techage:charcoal", + items = {"group:wood"}, + type = "burning", +}) function techage.ironage_register_recipe(recipe) local key = recipe_key(recipe.recipe) @@ -509,10 +507,8 @@ function techage.ironage_register_recipe(recipe) } NumRecipes = NumRecipes + 1 - if minetest.global_exists("unified_inventory") then - recipe.items = recipe.recipe - recipe.type = "melting" - unified_inventory.register_craft(recipe) - end + recipe.items = recipe.recipe + recipe.type = "melting" + techage.recipes.register_craft(recipe) end diff --git a/techage/items/ceramic.lua b/techage/items/ceramic.lua index 62aa79b..357fb00 100644 --- a/techage/items/ceramic.lua +++ b/techage/items/ceramic.lua @@ -52,4 +52,18 @@ techage.furnace.register_recipe({ "techage:ta4_ceramic_material", }, time = 16, +}) + +minetest.register_craftitem("techage:ta4_round_ceramic", { + description = S("TA4 Round Ceramic"), + inventory_image = "techage_round_ceramic.png", +}) + +techage.furnace.register_recipe({ + output = "techage:ta4_round_ceramic 2", + recipe = { + "techage:ta4_ceramic_material", "techage:ta4_ceramic_material", + "techage:ta4_ceramic_material", "techage:ta4_ceramic_material", + }, + time = 16, }) \ No newline at end of file diff --git a/techage/items/cracking.lua b/techage/items/cracking.lua index 0773d3f..3555de7 100644 --- a/techage/items/cracking.lua +++ b/techage/items/cracking.lua @@ -15,7 +15,8 @@ In hydrogenation, pairs of hydrogen atoms are added to a molecule to convert short-chain hydrocarbons into long ones. Here iron powder is required as a catalyst (is not consumed). - It can be used to convert gasoline into naphtha, naphtha into fueloil, and fueloil into bitumen. + It can be used to convert gas (propan) into isobutane, isobutane into gasoline, gasoline into naphtha, + naphtha into fueloil, and fueloil into bitumen. ]]-- @@ -46,9 +47,27 @@ techage.recipes.add("ta4_doser", { -- Hydrogenate techage.recipes.add("ta4_doser", { - output = "techage:bitumen 1", + output = "techage:isobutane 1", input = { - "techage:fueloil 1", + "techage:gas 1", + "techage:hydrogen 1", + }, + catalyst = "techage:iron_powder", +}) + +techage.recipes.add("ta4_doser", { + output = "techage:gasoline 1", + input = { + "techage:isobutane 1", + "techage:hydrogen 1", + }, + catalyst = "techage:iron_powder", +}) + +techage.recipes.add("ta4_doser", { + output = "techage:naphtha 1", + input = { + "techage:gasoline 1", "techage:hydrogen 1", }, catalyst = "techage:iron_powder", @@ -64,9 +83,9 @@ techage.recipes.add("ta4_doser", { }) techage.recipes.add("ta4_doser", { - output = "techage:naphtha 1", + output = "techage:bitumen 1", input = { - "techage:gasoline 1", + "techage:fueloil 1", "techage:hydrogen 1", }, catalyst = "techage:iron_powder", diff --git a/techage/items/electronic.lua b/techage/items/electronic.lua index 7c4000e..49f7a33 100644 --- a/techage/items/electronic.lua +++ b/techage/items/electronic.lua @@ -39,6 +39,10 @@ minetest.register_craftitem("techage:ta4_leds", { inventory_image = "techage_leds.png", }) +minetest.register_craftitem("techage:ta5_aichip", { + description = S("TA5 AI Chip"), + inventory_image = "techage_aichip.png", +}) techage.recipes.add("ta2_electronic_fab", { output = "techage:vacuum_tube 2", @@ -74,3 +78,9 @@ techage.recipes.add("ta4_electronic_fab", { output = "techage:ta4_leds 8", input = {"basic_materials:plastic_sheet 4", "basic_materials:copper_wire 1", "techage:ta4_silicon_wafer 1"} }) + +techage.recipes.add("ta4_electronic_fab", { + output = "techage:ta5_aichip 2", + input = {"techage:ta4_leds 8", "basic_materials:copper_wire 1", "basic_materials:gold_wire 1", "techage:ta4_silicon_wafer 1"}, + ex_points = 10, +}) diff --git a/techage/items/petroleum.lua b/techage/items/petroleum.lua index a0e8753..ba82b95 100644 --- a/techage/items/petroleum.lua +++ b/techage/items/petroleum.lua @@ -8,7 +8,7 @@ AGPL v3 See LICENSE.txt for more information - TA3 Petroleum types: bitumen, fueloil, naphtha, gasoline, gas + TA3 Petroleum types: bitumen, fueloil, naphtha, gasoline, isobutane, gas (propan) ]]-- @@ -39,6 +39,12 @@ minetest.register_craftitem("techage:gasoline", { groups = {ta_liquid = 1}, }) +minetest.register_craftitem("techage:isobutane", { + description = S("TA4 Isobutane"), + inventory_image = "techage_isobutane_inv.png", + groups = {ta_liquid = 1}, +}) + minetest.register_craftitem("techage:gas", { description = S("TA3 Propane"), inventory_image = "techage_gas_inv.png", @@ -57,6 +63,18 @@ minetest.register_craftitem("techage:ta3_cylinder_large_gas", { stack_max = 1, }) +minetest.register_craftitem("techage:ta4_cylinder_small_isobutane", { + description = S("Isobutane Cylinder Small"), + inventory_image = "techage_gas_cylinder_small.png^[colorize:#18d618:120", + stack_max = 1, +}) + +minetest.register_craftitem("techage:ta4_cylinder_large_isobutane", { + description = S("Isobutane Cylinder Large"), + inventory_image = "techage_gas_cylinder_large.png^[colorize:#18d618:120", + stack_max = 1, +}) + minetest.register_craftitem("techage:ta3_barrel_bitumen", { description = S("TA3 Bitumen Barrel"), inventory_image = "techage_barrel_inv.png^[colorize:#000000:120", @@ -113,6 +131,12 @@ minetest.register_craft({ burntime = 30, }) +minetest.register_craft({ + type = "fuel", + recipe = "techage:isobutane", + burntime = 40, +}) + minetest.register_craft({ type = "fuel", recipe = "techage:gasoline", @@ -138,6 +162,7 @@ techage.register_liquid("techage:ta3_barrel_fueloil", "techage:ta3_barrel_empty" techage.register_liquid("techage:ta3_barrel_naphtha", "techage:ta3_barrel_empty", 10, "techage:naphtha") techage.register_liquid("techage:ta3_barrel_gasoline", "techage:ta3_barrel_empty", 10, "techage:gasoline") techage.register_liquid("techage:ta3_cylinder_large_gas", "techage:ta3_cylinder_large", 6, "techage:gas") +techage.register_liquid("techage:ta4_cylinder_large_isobutane", "techage:ta3_cylinder_large", 6, "techage:isobutane") techage.register_liquid("techage:ta3_canister_oil", "techage:ta3_canister_empty", 1, "techage:oil_source") techage.register_liquid("techage:ta3_canister_bitumen", "techage:ta3_canister_empty", 1, "techage:bitumen") @@ -145,4 +170,5 @@ techage.register_liquid("techage:ta3_canister_fueloil", "techage:ta3_canister_em techage.register_liquid("techage:ta3_canister_naphtha", "techage:ta3_canister_empty", 1, "techage:naphtha") techage.register_liquid("techage:ta3_canister_gasoline", "techage:ta3_canister_empty", 1, "techage:gasoline") techage.register_liquid("techage:ta3_cylinder_small_gas", "techage:ta3_cylinder_small", 1, "techage:gas") +techage.register_liquid("techage:ta4_cylinder_small_isobutane", "techage:ta3_cylinder_small", 1, "techage:isobutane") diff --git a/techage/liquids/pump.lua b/techage/liquids/pump.lua index 54dc680..9f25800 100644 --- a/techage/liquids/pump.lua +++ b/techage/liquids/pump.lua @@ -25,6 +25,13 @@ local COUNTDOWN_TICKS = 4 local CYCLE_TIME = 2 local CAPA = 4 +local WRENCH_MENU = {{ + type = "output", + name = "flowrate", + label = S("Total flow rate"), + tooltip = S("Total flow rate in liquid units"), +}} + local State3 = techage.NodeStates:new({ node_name_passive = "techage:t3_pump", node_name_active = "techage:t3_pump_on", @@ -49,16 +56,24 @@ local function pumping(pos, nvm, state, capa) if taken > 0 then local leftover = liquid.put(pos, Pipe, outdir, name, taken, mem.dbg_cycles > 0) if leftover and leftover > 0 then + -- air needs no tank + if name == "air" then + state:keep_running(pos, nvm, COUNTDOWN_TICKS) + return 0 + end liquid.untake(pos, Pipe, Flip[outdir], name, leftover) if leftover == taken then state:blocked(pos, nvm) - return + return 0 end + state:keep_running(pos, nvm, COUNTDOWN_TICKS) + return taken - leftover end state:keep_running(pos, nvm, COUNTDOWN_TICKS) - return + return taken end state:idle(pos, nvm) + return 0 end local function after_place_node3(pos, placer) @@ -85,7 +100,7 @@ end local function node_timer4(pos, elapsed) local nvm = techage.get_nvm(pos) - pumping(pos, nvm, State4, CAPA * 2) + nvm.flowrate = (nvm.flowrate or 0) + pumping(pos, nvm, State4, CAPA * 2) return State4:is_active(nvm) end @@ -235,6 +250,7 @@ minetest.register_node("techage:t4_pump", { groups = {cracky=2}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), + ta4_formspec = WRENCH_MENU, }) minetest.register_node("techage:t4_pump_on", { @@ -261,7 +277,12 @@ techage.register_node({"techage:t3_pump", "techage:t3_pump_on"}, { techage.register_node({"techage:t4_pump", "techage:t4_pump_on"}, { on_recv_message = function(pos, src, topic, payload) - return State4:on_receive_message(pos, topic, payload) + if topic == "flowrate" then + local nvm = techage.get_nvm(pos) + return nvm.flowrate or 0 + else + return State4:on_receive_message(pos, topic, payload) + end end, }) diff --git a/techage/liquids/ta5_tank.lua b/techage/liquids/ta5_tank.lua new file mode 100644 index 0000000..6f64416 --- /dev/null +++ b/techage/liquids/ta5_tank.lua @@ -0,0 +1,105 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2022 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA5 Hyperloop Tank + +]]-- + +-- for lazy programmers +local S2P = minetest.string_to_pos +local P2S = minetest.pos_to_string +local M = minetest.get_meta +local S = techage.S + +local Pipe = techage.LiquidPipe +local liquid = networks.liquid +local hyperloop = techage.hyperloop +local remote_pos = techage.hyperloop.remote_pos +local shared_tank = techage.shared_tank +local menu = techage.menu + +local CAPACITY = 1000 +local EX_POINTS = 20 + +minetest.register_node("techage:ta5_hl_tank", { + description = S("TA5 Hyperloop Tank"), + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta4.png^techage_frame_ta5_top.png", + "techage_filling_ta4.png^techage_frame_ta5.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_tank.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_tank.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_tank.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_tank.png", + }, + + after_place_node = function(pos, placer) + local meta = M(pos) + local nvm = techage.get_nvm(pos) + nvm.liquid = {} + local number = techage.add_node(pos, "techage:ta5_hl_tank") + meta:set_string("node_number", number) + meta:set_string("owner", placer:get_player_name()) + meta:set_string("formspec", shared_tank.formspec(pos)) + meta:set_string("infotext", S("TA5 Hyperloop Tank").." "..number) + Pipe:after_place_node(pos) + hyperloop.after_place_node(pos, placer, "tank") + end, + on_receive_fields = function(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + if techage.get_expoints(player) >= EX_POINTS then + if techage.menu.eval_input(pos, hyperloop.SUBMENU, fields) then + hyperloop.after_formspec(pos, fields) + shared_tank.on_rightclick(pos, nil, player) + M(pos):set_string("formspec", shared_tank.formspec(pos)) + end + end + end, + on_timer = shared_tank.node_timer, + on_rightclick = shared_tank.on_rightclick, + on_punch = function(pos, node, puncher) + return techage.liquid.on_punch(remote_pos(pos), node, puncher) + end, + can_dig = shared_tank.can_dig, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + Pipe:after_dig_node(pos) + hyperloop.after_dig_node(pos, oldnode, oldmetadata, digger) + techage.remove_node(pos, oldnode, oldmetadata) + techage.del_mem(pos) + end, + paramtype2 = "facedir", + on_rotate = screwdriver.disallow, + groups = {cracky=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +liquid.register_nodes({"techage:ta5_hl_tank"}, + Pipe, "tank", nil, { + capa = CAPACITY, + peek = shared_tank.peek_liquid, + put = shared_tank.put_liquid, + take = shared_tank.take_liquid, + untake = shared_tank.untake_liquid, + } +) + +techage.register_node({"techage:ta5_hl_tank"}, techage.liquid.recv_message) + +minetest.register_craft({ + output = "techage:ta5_hl_tank", + recipe = { + {"", "techage:ta5_aichip", ""}, + {"", "techage:ta4_tank", ""}, + {"", "", ""}, + }, +}) diff --git a/techage/liquids/tank.lua b/techage/liquids/tank.lua index 51dc523..fbd149b 100644 --- a/techage/liquids/tank.lua +++ b/techage/liquids/tank.lua @@ -295,4 +295,4 @@ minetest.register_lbm({ --tubelib2.del_mem(pos) end end, -}) \ No newline at end of file +}) diff --git a/techage/locale/techage.de.tr b/techage/locale/techage.de.tr index b81fdd3..fda454e 100644 --- a/techage/locale/techage.de.tr +++ b/techage/locale/techage.de.tr @@ -110,12 +110,13 @@ TA3 Booster=TA3 Gebläse ### button.lua ### Access:=Zugriff: +Command to be sent=Zu sendender Befehl TA3 Button/Switch=TA3 Taster/Schalter TA4 Button/Switch=TA4 Schalter/Taster ### button.lua ### +### button_2x.lua ### ### button_4x.lua ### -### signallamp_4x.lua ### Command=Kommando @@ -141,27 +142,32 @@ Insert destination node number(s)=Gebe Zielnummer(n) ein Save=Speichern -### button.lua ### -### signallamp_4x.lua ### +### button_2x.lua ### -Command to be sent=Zu sendender Befehl +TA4 2x Button=TA4 2x Taster +### button_2x.lua ### ### button_4x.lua ### -Command to be sent (ignored for switches)=Zu sendender Befehl (wird für Schalter ignoriert) -Label=Beschriftung -Label for the button=Beschriftung für die Taste -Momentary button or on/off switch=Taster oder Ein-/Ausschalter -TA4 4x Button=TA4 4x Taster -Type=Typ - -### button_4x.lua ### -### signallamp_4x.lua ### - Access=Zugriff Button protection=Tastenschutz +Command to be sent (ignored for switches)=Zu sendender Befehl (wird für Schalter ignoriert) Destination block number=Zielblocknummer +Label for the button=Beschriftung für die Taste +Momentary button or on/off switch=Taster oder Ein-/Ausschalter Number=Nummer +Type=Typ + +### button_2x.lua ### +### button_4x.lua ### +### signallamp_2x.lua ### +### signallamp_4x.lua ### + +Label=Beschriftung + +### button_4x.lua ### + +TA4 4x Button=TA4 4x Taster ### cart_detector.lua ### @@ -190,6 +196,7 @@ Cement Powder=Zement Pulver TA4 Ceramic Material=TA4 Keramik Material TA4 Furnace Ceramic=TA4 Ofen Keramik +TA4 Round Ceramic=TA4 Rund-Keramik ### charcoalpile.lua ### @@ -232,6 +239,7 @@ TA3 Melting=TA3 Schmelzen ### cooler.lua ### TA3 Cooler=TA3 Kühler +TA4 Collider Cooler=TA4 Collider Kühler ### counting.lua ### @@ -247,19 +255,26 @@ TA2 Cylinder=TA2 Zylinder ### detector.lua ### +TA4 Collider Detector=TA4 Collider Detektor +TA4 Collider Detector Core=TA4 Collider Detektorkern +TA4 Detector=TA4 Detektor + +### detector.lua ### +### logic_block.lua ### +### tele.lua ### + +Blocking Time=Sperrzeit + +### detector.lua ### +### tele.lua ### + Configured Items=Konfigurierte Gegenstände Items which generate an 'on' command.@nIf empty, all passed items generate an 'on' command.=Items, die einen 'on'-Kommando generieren.@nWenn leer, generieren alle übergebenen Items einen 'on'-Befehl. On Time=ON Zeit TA3 Detector=TA3 Detektor -TA4 Detector=TA4 Detektor The time after the 'off' command@nuntil the next 'on' command is accepted.=Die Zeit nach dem 'off' Kommando,@nbis das nächste 'on' Kommando akzeptiert wird. The time between the 'on' and 'off' commands.=Die Zeit zwischen den 'on' und 'off' Kommandos. -### detector.lua ### -### logic_block.lua ### - -Blocking Time=Sperrzeit - ### display.lua ### Display no: =Display Nr. @@ -303,7 +318,9 @@ TA3 Door Controller II=TA3 Tür Controller II with door sound=mit Türgeräusch ### doorcontroller2.lua ### +### flycontroller.lua ### ### movecontroller.lua ### +### turncontroller.lua ### Done=Fertig Record=Aufzeichnen @@ -365,6 +382,7 @@ TA3 Vacuum Tube=TA3 Vakuumröhre TA4 LEDs=TA4 LEDs TA4 RAM Chip=RAM Chip TA4 WLAN Chip=TA4 WLAN Chip +TA5 AI Chip=TA5 KI Chip WLAN Chip=WLAN Chip ### electronic_fab.lua ### @@ -403,6 +421,49 @@ TA3 Power Station Firebox=TA3 Kraftwerks-Feuerbox Firebox=Feuerkasten +### fly_lib.lua ### + +Destination position is protected=Zielposition ist geschützt +Error: Max. length of the flight route exceeded !!=Fehler: Max. Flugstreckenlänge überschritten !! +No valid destination position=Keine gültige Zielposition +No valid node at the start position=Kein gültiger Block an der Startposition +Start position is protected=Startposition ist geschützt + +### fly_lib.lua ### +### flycontroller.lua ### + +Error: Invalid path !!=Fehler: Ungültiger Pfad !! + +### flycontroller.lua ### + +Error: Recording is missing !!=Fehler: Aufzeichnung fehlt !! +Flight route (A to B)=Flug Route (A nach B) +Move=Bewege +See chat output=Siehe chat Ausgabe +TA5 Fly Controller=TA5 Flug Controller +Test=Test +[TA4 Fly Controller] Invalid path!=[TA5 Flug Controller] Ungültiger Pfad! +[TA4 Fly Controller] Recording is missing!=[TA5 Flug Controller] Aufzeichnung fehlt! + +### flycontroller.lua ### +### logic_block.lua ### +### lua_logic.lua ### +### movecontroller.lua ### + +Store=Speichern + +### flycontroller.lua ### +### movecontroller.lua ### + +Click on all blocks that shall be moved=Klicke auf alle Blöcke, die verschoben werden sollen +Maximum Speed=Maximalgeschwindigkeit +Maximum speed for moving blocks=Maximale Geschwindigkeit für bewegliche Blöcke +Move A-B=Bewege A-B +Move B-A=Bewege B-A +Move block height=Move Block Höhe +Stored=Gespeichert +Value in the range of 0.0 to 1.0=Wert im Bereich von 0.0 bis 1.0 + ### flywheel.lua ### Flywheel=Schwungrad @@ -532,11 +593,12 @@ TA4 Heat Exchanger 1=TA4 Wärmetauscher 1 ### heatexchanger2.lua ### +No power=Kein Strom Power network connection error=Stromnetz Verbindungsfehler TA4 Heat Exchanger=TA4 Wärmetauscher TA4 Heat Exchanger 2=TA4 Wärmetauscher 2 did you check the plan?=hast du den Plan geprüft? -inlet/pipe error=Einlass/Röhrenfehler +inlet/pipe error=Einlass/Leitungsfehler wrong storage diameter=Falscher Wärmespeicher-Durchmesser ### heatexchanger3.lua ### @@ -549,6 +611,23 @@ Hydrogen Cylinder Large=Wasserstoffflasche groß Hydrogen Cylinder Small=Wasserstoffflasche klein TA4 Hydrogen=TA4 Wasserstoff +### hyperloop.lua ### +### sensorchest.lua ### +### teleport.lua ### +### terminal.lua ### + +not connected=nicht verbunden + +### hyperloop.lua ### +### teleport.lua ### + +Block name=Blockname +Connection name for this block=Verbindungsname für diesen Block +Connection name of the remote block=Verbindungsname des entfernten Blocks +Enter a block name or select an existing one=Gebe einen Blocknamen ein oder wähle einen vorhandenen aus +Remote name=Name entfernter Block +connected to=verbunden mit + ### industriallamp1.lua ### TA Industrial Lamp 1=TA Industrielampe 1 @@ -567,12 +646,19 @@ TA4 LED Industrial Lamp=TA4 LED Industrielampe ### inlet.lua ### -TA4 Pipe Inlet=TA4 Rohrzulauf +TA4 Pipe Inlet=TA4 Leitungszulauf one window maximum=maximal ein Fenster wrong diameter (should be 5, 7, or 9)=falscher Durchmesser (sollte 5, 7, oder 9 sein) wrong number of gravel nodes=falsche Anzahl von Kiesblöcken wrong number of shell nodes=falsche Anzahl von Blöcken bei der Hülle +### inlets.lua ### + +TA4 Collider Cable Input=TA4 Collider Kabelausgang +TA4 Collider Pipe Input=TA4 Collider Leitungseingang +TA4 Collider Pipe Output=TA4 Collider Leitungsausgang +TA4 Collider Tube Input=TA4 Collider Rohreneingang + ### inverter.lua ### Inverter=Wechselrichter @@ -609,6 +695,7 @@ Block has an@nadditional wrench menu=Block besitzt ein@nzusätzliches@nSchrauben ### lib.lua ### ### sensorchest.lua ### +### terminal.lua ### connected with=verbunden mit @@ -666,12 +753,6 @@ Syntax=Syntax TA3 Logic Block=TA3 Logikblock Update=Update -### logic_block.lua ### -### lua_logic.lua ### -### movecontroller.lua ### - -Store=Speichern - ### logic_block.lua ### ### sequencer2.lua ### @@ -683,6 +764,17 @@ Lye=Lauge Lye Barrel=Lauge Fass Lye Canister=Lauge Kanister +### magnet.lua ### + +TA4 Collider Detector Magnet=TA4 Collider Detektormagnet +TA4 Collider Magnet=TA4 Collider Magnet +TA4 Collider Magnet Base=TA4 Collider Magnetfuß +TA4 Collider Steel Block=TA4 Collider Stahlblock + +### mba_detector.lua ### + +TA4 Mapblock Active Detector=TA4 Aktiver Mapblock Detektor + ### meltingpot.lua ### Heat=Hitze @@ -736,25 +828,15 @@ TA4 Streetlamp Solar Cell=TA4 Straßenlampen-Solarzelle ### movecontroller.lua ### -Click on all blocks that shall be moved=Klicke auf alle Blöcke, die verschoben werden sollen -Destination position is protected=Zielposition ist geschützt -Error: Distance > 100 m !!=Fehler: Distanz > 100 m !! +Error: Invalid distance !!=Fehler: Ungültige Entfernung !! Handover to A=Übergabe an A Handover to B=Übergabe an B -Maximum Speed=Maximalgeschwindigkeit -Maximum speed for the moving block.=Maximale Geschwindigkeit für den beweglichen Block. -Move A-B=Bewege A-B -Move B-A=Bewege B-A -Move block height=Move Block Höhe Move distance (A to B)=Entfernung (A nach B) -No valid destination position=Keine gültige Zielposition -No valid node at the start position=Kein gültiger Block an der Startposition -Number of the next movecontroller.=Nummer des nächsten Move Controllers. -Number of the previous movecontroller.=Nummer des vorherigen Move Controllers. -Position list error=Positionslistenfehler -Start position is protected=Startposition ist geschützt +Number of the next movecontroller=Nummer des nächsten Move Controllers +Number of the previous movecontroller=Nummer des vorhergehenden Move Controllers +Object offset=Objekt Offset TA4 Move Controller=TA4 Move Controller -Value in the range of 0.0 to 1.0=Wert im Bereich von 0.0 bis 1.0 +Y-offset for non-player objects like vehicles (-0.5 to 0.5)=Y-Offset für Nicht-Spieler Objekte wie Fahrzeuge (-0.5 bis 0.5) ### node_detector.lua ### @@ -781,6 +863,8 @@ TA3 Power Station Oil Burner=TA3 Kraftwerks-Ölbrenner ### petroleum.lua ### +Isobutane Cylinder Large=Isobutangasflasche groß +Isobutane Cylinder Small=Isobutangasflasche klein Propane Cylinder Large=Propangasflasche groß Propane Cylinder Small=Propangasflasche klein TA3 Bitumen=TA3 Bitumen @@ -796,6 +880,7 @@ TA3 Naphtha=TA3 Naphtha TA3 Naphtha Barrel=TA3 Naphtha-Fass TA3 Naphtha Canister=TA3 Naphtha-Kanister TA3 Propane=TA3 Propan +TA4 Isobutane=TA4 Isobutan ### pillar.lua ### @@ -803,7 +888,7 @@ TA4 Pillar=TA4 Säule ### pipe_wall_entry.lua ### -TA3 Pipe Wall Entry=TA3 Rohr/Wanddurchbruch +TA3 Pipe Wall Entry=TA3 Leitungs/Wanddurchbruch ### pipe_wrench.lua ### @@ -882,6 +967,8 @@ Allow to dig/place Techage power lines nearby power poles=Erlaubt TODO TA3 Pump=TA3 Pumpe TA4 Pump=TA4 Pumpe +Total flow rate=Gesamtdurchfluss +Total flow rate in liquid units=Gesamtdurchfluss in Flüssigkeitseinheiten ### pumpjack.lua ### @@ -912,6 +999,7 @@ inventory full=Inventar ist voll TA3 Oil Reboiler=TA3 Aufkocher ### recipe_lib.lua ### +### recipeblock.lua ### Recipe=Rezept @@ -920,6 +1008,10 @@ Recipe=Rezept Catalyst=Katalysator +### recipeblock.lua ### + +TA4 Recipe Block=TA4 Rezept Block + ### recipes.lua ### Flint and Iron=Flint and Iron @@ -961,7 +1053,6 @@ TA4 Wind Turbine Nacelle=TA4 Windkraftanlagengondel Allow public chest access=Erlaube öffentlichen Zugriff TA4 Sensor Chest=Sensorkiste -not connected=nicht verbunden ### sequencer.lua ### @@ -1004,9 +1095,18 @@ TA4 Wind Turbine Signal Lamp=TA4 Windkraftanlagenlampe TechAge Signal Lamp=TechAge Signallampe TechAge Signal Lamp (can be colored)=TechAge Signallampe (kann gefärbt werden) +### signallamp_2x.lua ### + +TA4 2x Signal Lamp=TA4 2x Signallampe + +### signallamp_2x.lua ### ### signallamp_4x.lua ### -TA4 4x Signal Lamp= +Label for the lamp=Bezeichner der Lampe + +### signallamp_4x.lua ### + +TA4 4x Signal Lamp=TA4 4x Signallampe ### silicon.lua ### @@ -1039,6 +1139,11 @@ light=Licht power=Strom +### soundblock.lua ### + +Play=Abspielen +TA3 Sound Block=TA3 Sound Block + ### source.lua ### Axle Power Source=Achsenkraftquelle @@ -1148,6 +1253,14 @@ on=an no power=kein Strom +### ta5_chest.lua ### + +TA5 Hyperloop Chest=TA5 Hyperloop Kiste + +### ta5_tank.lua ### + +TA5 Hyperloop Tank=TA5 Hyperloop Tank + ### tank.lua ### Oil Tank=Öltank @@ -1158,12 +1271,34 @@ TA4 Tank=TA4 Tank TA Tank Cart=TA Tankwagen +### teleport.lua ### + +Connected=Verbunden +Connection status=Verbindungsstatus +Distance > @1 blocks=Abstand > @1 Blöcke +Ex-points missing (@1 < @2)=Erf.-Punkte fehlen (@1 < @2) +Status=Status +server not connected=Server nicht verbunden + +### teleport_pipe.lua ### + +TA5 Teleport Block Liquids=TA5 Teleport Block Flüssigkeiten + +### teleport_pipe.lua ### +### teleport_tube.lua ### + +Remote block error=Fehler entfernter Block + +### teleport_tube.lua ### + +TA5 Teleport Block Items=TA5 Teleport Block Gegenstände + ### terminal.lua ### -Switched to private use!=Zur privaten Nutzung umgeschaltet -Switched to public use!=Zur öffentlichen Nutzung umgeschaltet Syntax error, try help=Syntax Fehler, nutze help TA3 Terminal=TA3 Terminal +TA4 Collider Terminal=TA4 Collider Terminal +TA4 Terminal=TA4 Terminal commands like: help=Kommandos wie: help ### timer.lua ### @@ -1194,7 +1329,7 @@ TechAge Trowel=TechAge Kelle ### tube_wall_entry.lua ### -Tube Wall Entry=Tube Wanddurchbruch +Tube Wall Entry=Röhrenwanddurchbruch ### tubes.lua ### @@ -1209,11 +1344,22 @@ TA4 Tube=TA4 Röhre TA3 Turbine=TA3 Turbine TA4 Turbine=TA4 Turbine +### turncontroller.lua ### + +Click on all blocks that shall be turned=Klicke auf all Blöcke, die gedreht werden sollen +TA4 Turn Controller=TA4 Dreh Controller +Turn left=Drehe links +Turn right=Drehe rechts + ### usmium.lua ### Usmium Nuggets=Usmium Nuggets Usmium Powder=Usmium Pulver +### vacuumtube.lua ### + +TA4 Vacuum Tube=TA4 Vakuumröhre + ### valve.lua ### TA Valve=TA Ventil @@ -1248,7 +1394,11 @@ This is not the surface of the ocean!=Das ist nicht die Meeresoberfläche! biome and no ocean!=Biom und keine Meer (ocean)! is a suitable place for a wind turbine!=ist ein geeigneter Ort für eine Windkraftanlage! +### worker.lua ### -##### not used anymore ##### - -[techage] The limit for commands per minute has been exceeded.=[techage] Das Limit für Befehle pro Minute wurde überschritten. +Build detector=Baue Detektor +Item list=Teileliste +Remove detector=Entferne Detektor +TA4 Collider Detector Worker=TA4 Collider Detektor Worker +[TA4] Detector is being built!=[TA4] Detektor wird gebaut! +[TA4] Detector is being removed!=[TA4] Detektor wird entfernt! diff --git a/techage/locale/template.txt b/techage/locale/template.txt index ead7e30..6a51b06 100644 --- a/techage/locale/template.txt +++ b/techage/locale/template.txt @@ -110,12 +110,13 @@ TA3 Booster= ### button.lua ### Access:= +Command to be sent= TA3 Button/Switch= TA4 Button/Switch= ### button.lua ### +### button_2x.lua ### ### button_4x.lua ### -### signallamp_4x.lua ### Command= @@ -141,27 +142,32 @@ Insert destination node number(s)= Save= -### button.lua ### -### signallamp_4x.lua ### +### button_2x.lua ### -Command to be sent= +TA4 2x Button= +### button_2x.lua ### ### button_4x.lua ### -Command to be sent (ignored for switches)= -Label= -Label for the button= -Momentary button or on/off switch= -TA4 4x Button= -Type= - -### button_4x.lua ### -### signallamp_4x.lua ### - Access= Button protection= +Command to be sent (ignored for switches)= Destination block number= +Label for the button= +Momentary button or on/off switch= Number= +Type= + +### button_2x.lua ### +### button_4x.lua ### +### signallamp_2x.lua ### +### signallamp_4x.lua ### + +Label= + +### button_4x.lua ### + +TA4 4x Button= ### cart_detector.lua ### @@ -190,6 +196,7 @@ Cement Powder= TA4 Ceramic Material= TA4 Furnace Ceramic= +TA4 Round Ceramic= ### charcoalpile.lua ### @@ -232,6 +239,7 @@ TA3 Melting= ### cooler.lua ### TA3 Cooler= +TA4 Collider Cooler= ### counting.lua ### @@ -247,19 +255,26 @@ TA2 Cylinder= ### detector.lua ### +TA4 Collider Detector= +TA4 Collider Detector Core= +TA4 Detector= + +### detector.lua ### +### logic_block.lua ### +### tele.lua ### + +Blocking Time= + +### detector.lua ### +### tele.lua ### + Configured Items= Items which generate an 'on' command.@nIf empty, all passed items generate an 'on' command.= On Time= TA3 Detector= -TA4 Detector= The time after the 'off' command@nuntil the next 'on' command is accepted.= The time between the 'on' and 'off' commands.= -### detector.lua ### -### logic_block.lua ### - -Blocking Time= - ### display.lua ### Display no: = @@ -303,7 +318,9 @@ TA3 Door Controller II= with door sound= ### doorcontroller2.lua ### +### flycontroller.lua ### ### movecontroller.lua ### +### turncontroller.lua ### Done= Record= @@ -365,6 +382,7 @@ TA3 Vacuum Tube= TA4 LEDs= TA4 RAM Chip= TA4 WLAN Chip= +TA5 AI Chip= WLAN Chip= ### electronic_fab.lua ### @@ -403,6 +421,49 @@ TA3 Power Station Firebox= Firebox= +### fly_lib.lua ### + +Destination position is protected= +Error: Max. length of the flight route exceeded !!= +No valid destination position= +No valid node at the start position= +Start position is protected= + +### fly_lib.lua ### +### flycontroller.lua ### + +Error: Invalid path !!= + +### flycontroller.lua ### + +Error: Recording is missing !!= +Flight route (A to B)= +Move= +See chat output= +TA5 Fly Controller= +Test= +[TA4 Fly Controller] Invalid path!= +[TA4 Fly Controller] Recording is missing!= + +### flycontroller.lua ### +### logic_block.lua ### +### lua_logic.lua ### +### movecontroller.lua ### + +Store= + +### flycontroller.lua ### +### movecontroller.lua ### + +Click on all blocks that shall be moved= +Maximum Speed= +Maximum speed for moving blocks= +Move A-B= +Move B-A= +Move block height= +Stored= +Value in the range of 0.0 to 1.0= + ### flywheel.lua ### Flywheel= @@ -532,6 +593,7 @@ TA4 Heat Exchanger 1= ### heatexchanger2.lua ### +No power= Power network connection error= TA4 Heat Exchanger= TA4 Heat Exchanger 2= @@ -549,6 +611,23 @@ Hydrogen Cylinder Large= Hydrogen Cylinder Small= TA4 Hydrogen= +### hyperloop.lua ### +### sensorchest.lua ### +### teleport.lua ### +### terminal.lua ### + +not connected= + +### hyperloop.lua ### +### teleport.lua ### + +Block name= +Connection name for this block= +Connection name of the remote block= +Enter a block name or select an existing one= +Remote name= +connected to= + ### industriallamp1.lua ### TA Industrial Lamp 1= @@ -573,6 +652,13 @@ wrong diameter (should be 5, 7, or 9)= wrong number of gravel nodes= wrong number of shell nodes= +### inlets.lua ### + +TA4 Collider Cable Input= +TA4 Collider Pipe Input= +TA4 Collider Pipe Output= +TA4 Collider Tube Input= + ### inverter.lua ### Inverter= @@ -609,6 +695,7 @@ Block has an@nadditional wrench menu= ### lib.lua ### ### sensorchest.lua ### +### terminal.lua ### connected with= @@ -666,12 +753,6 @@ Syntax= TA3 Logic Block= Update= -### logic_block.lua ### -### lua_logic.lua ### -### movecontroller.lua ### - -Store= - ### logic_block.lua ### ### sequencer2.lua ### @@ -683,6 +764,17 @@ Lye= Lye Barrel= Lye Canister= +### magnet.lua ### + +TA4 Collider Detector Magnet= +TA4 Collider Magnet= +TA4 Collider Magnet Base= +TA4 Collider Steel Block= + +### mba_detector.lua ### + +TA4 Mapblock Active Detector= + ### meltingpot.lua ### Heat= @@ -736,25 +828,15 @@ TA4 Streetlamp Solar Cell= ### movecontroller.lua ### -Click on all blocks that shall be moved= -Destination position is protected= -Error: Distance > 100 m !!= +Error: Invalid distance !!= Handover to A= Handover to B= -Maximum Speed= -Maximum speed for the moving block.= -Move A-B= -Move B-A= -Move block height= Move distance (A to B)= -No valid destination position= -No valid node at the start position= -Number of the next movecontroller.= -Number of the previous movecontroller.= -Position list error= -Start position is protected= +Number of the next movecontroller= +Number of the previous movecontroller= +Object offset= TA4 Move Controller= -Value in the range of 0.0 to 1.0= +Y-offset for non-player objects like vehicles (-0.5 to 0.5)= ### node_detector.lua ### @@ -781,6 +863,8 @@ TA3 Power Station Oil Burner= ### petroleum.lua ### +Isobutane Cylinder Large= +Isobutane Cylinder Small= Propane Cylinder Large= Propane Cylinder Small= TA3 Bitumen= @@ -796,6 +880,7 @@ TA3 Naphtha= TA3 Naphtha Barrel= TA3 Naphtha Canister= TA3 Propane= +TA4 Isobutane= ### pillar.lua ### @@ -882,6 +967,8 @@ Allow to dig/place Techage power lines nearby power poles= TA3 Pump= TA4 Pump= +Total flow rate= +Total flow rate in liquid units= ### pumpjack.lua ### @@ -912,6 +999,7 @@ inventory full= TA3 Oil Reboiler= ### recipe_lib.lua ### +### recipeblock.lua ### Recipe= @@ -920,6 +1008,10 @@ Recipe= Catalyst= +### recipeblock.lua ### + +TA4 Recipe Block= + ### recipes.lua ### Flint and Iron= @@ -961,7 +1053,6 @@ TA4 Wind Turbine Nacelle= Allow public chest access= TA4 Sensor Chest= -not connected= ### sequencer.lua ### @@ -1004,6 +1095,15 @@ TA4 Wind Turbine Signal Lamp= TechAge Signal Lamp= TechAge Signal Lamp (can be colored)= +### signallamp_2x.lua ### + +TA4 2x Signal Lamp= + +### signallamp_2x.lua ### +### signallamp_4x.lua ### + +Label for the lamp= + ### signallamp_4x.lua ### TA4 4x Signal Lamp= @@ -1039,6 +1139,11 @@ light= power= +### soundblock.lua ### + +Play= +TA3 Sound Block= + ### source.lua ### Axle Power Source= @@ -1148,6 +1253,14 @@ on= no power= +### ta5_chest.lua ### + +TA5 Hyperloop Chest= + +### ta5_tank.lua ### + +TA5 Hyperloop Tank= + ### tank.lua ### Oil Tank= @@ -1158,12 +1271,34 @@ TA4 Tank= TA Tank Cart= +### teleport.lua ### + +Connected= +Connection status= +Distance > @1 blocks= +Ex-points missing (@1 < @2)= +Status= +server not connected= + +### teleport_pipe.lua ### + +TA5 Teleport Block Liquids= + +### teleport_pipe.lua ### +### teleport_tube.lua ### + +Remote block error= + +### teleport_tube.lua ### + +TA5 Teleport Block Items= + ### terminal.lua ### -Switched to private use!= -Switched to public use!= Syntax error, try help= TA3 Terminal= +TA4 Collider Terminal= +TA4 Terminal= commands like: help= ### timer.lua ### @@ -1209,11 +1344,22 @@ TA4 Tube= TA3 Turbine= TA4 Turbine= +### turncontroller.lua ### + +Click on all blocks that shall be turned= +TA4 Turn Controller= +Turn left= +Turn right= + ### usmium.lua ### Usmium Nuggets= Usmium Powder= +### vacuumtube.lua ### + +TA4 Vacuum Tube= + ### valve.lua ### TA Valve= @@ -1247,3 +1393,12 @@ This is not the surface of the ocean!= [TA4 Wind Turbine]= biome and no ocean!= is a suitable place for a wind turbine!= + +### worker.lua ### + +Build detector= +Item list= +Remove detector= +TA4 Collider Detector Worker= +[TA4] Detector is being built!= +[TA4] Detector is being removed!= diff --git a/techage/logic/button_2x.lua b/techage/logic/button_2x.lua new file mode 100644 index 0000000..3d46904 --- /dev/null +++ b/techage/logic/button_2x.lua @@ -0,0 +1,252 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2017-2021 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA4 Logic twofold button + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S + +local function get_button_num(pos, clicker, pointed_thing) + -- use the node behind the button to get better results + if clicker and pointed_thing then + local offs = vector.subtract(pointed_thing.under, pointed_thing.above) + pointed_thing.under = vector.add(pointed_thing.under, offs) + pointed_thing.above = vector.add(pointed_thing.above, offs) + local pos1 = minetest.pointed_thing_to_face_pos(clicker, pointed_thing) + local y = pos1.y - pos.y + + if y > 0.03 then + return 1 + elseif y < -0.03 then + return 2 + end + end +end + +local WRENCH_MENU = { + { + type = "dropdown", + choices = "button,switch", + name = "type", + label = S("Type"), + tooltip = S("Momentary button or on/off switch"), + default = "1", + }, + { + type = "ascii", + name = "label1", + label = S("Label") .. " 1", + tooltip = S("Label for the button"), + default = "1", + }, + { + type = "numbers", + name = "dest_number1", + label = S("Number") .. " 1", + tooltip = S("Destination block number"), + default = "", + }, + { + type = "ascii", + name = "command1", + label = S("Command") .. " 1", + tooltip = S("Command to be sent (ignored for switches)"), + default = "1", + }, + { + type = "ascii", + name = "label2", + label = S("Label") .. " 2", + tooltip = S("Label for the button"), + default = "1", + }, + { + type = "numbers", + name = "dest_number2", + label = S("Number") .. " 2", + tooltip = S("Destination block number"), + default = "", + }, + { + type = "ascii", + name = "command2", + label = S("Command") .. " 2", + tooltip = S("Command to be sent (ignored for switches)"), + default = "2", + }, + { + type = "dropdown", + choices = "private,protected,public", + name = "access", + label = S("Access"), + tooltip = S("Button protection"), + default = "8", + }, +} + +local function send_cmnd(pos, num, cmd) + local meta = M(pos) + local own_num = meta:get_string("node_number") + local dest = meta:get_string("dest_number" .. num) + local command, payload = cmd, nil + if not cmd then + local s = meta:get_string("command" .. num) + command, payload = unpack(string.split(s, " ", false, 1)) + end + local owner = meta:get_string("owner") + if techage.check_numbers(dest, owner) then + techage.send_multi(own_num, dest, command, payload) + end +end + +local function button_update(pos, objref) + local meta = M(pos) + pos = vector.round(pos) + local nvm = techage.get_nvm(pos) + nvm.button = nvm.button or {} + local tbl = {" ", " ", meta:get_string("label1"), " ", meta:get_string("label2")} + local text = "< " .. table.concat(tbl, "\n< ") + local texture = lcdlib.make_multiline_texture("default", text, 96, 96, 7, "top", "#000", 6) + + if nvm.button[1] then + texture = texture .. "^techage_smartline_button_4x_on2.png" + end + if nvm.button[2] then + texture = texture .. "^techage_smartline_button_4x_on3.png" + end + objref:set_properties({ textures = {texture}, visual_size = {x=1, y=1} }) +end + +local function switch_off(pos, num) + local nvm = techage.get_nvm(pos) + nvm.button = nvm.button or {} + nvm.button[num] = nil + lcdlib.update_entities(pos) +end + +local function switch_on(pos, num) + local nvm = techage.get_nvm(pos) + nvm.button = nvm.button or {} + nvm.button[num] = true + lcdlib.update_entities(pos) +end + +local lcd_box = {-8/16, -4/16, 7.75/16, 8/16, 4/16, 8/16} + +local function can_access(pos, player) + local meta = M(pos) + local playername = player:get_player_name() + local access = meta:get_string("access") + local owner = meta:get_string("owner") + local protected = minetest.is_protected(pos, playername) + + if access == "private" and playername ~= owner then + return false + elseif access == "protected" and protected then + return false + end + return true +end + +minetest.register_node("techage:ta4_button_2x", { + description = S("TA4 2x Button"), + inventory_image = 'techage_smartline_button_2x.png', + tiles = {'techage_smartline_button_2x.png'}, + drawtype = "nodebox", + paramtype = "light", + use_texture_alpha = "clip", + sunlight_propagates = true, + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = lcd_box, + }, + light_source = 6, + + display_entities = { + ["techage:display_entity"] = { depth = 0.48, + on_display_update = button_update}, + }, + + after_place_node = function(pos, placer) + local number = techage.add_node(pos, "techage:ta4_button_2x") + local meta = minetest.get_meta(pos) + meta:set_string("node_number", number) + meta:set_string("owner", placer:get_player_name()) + meta:set_string("infotext", "TA4 2x Button " .. number) + meta:set_string("type", "button") + meta:set_string("label1", "B1") + meta:set_string("label2", "B2") + lcdlib.update_entities(pos) + end, + + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if clicker and clicker:is_player() then + -- Check access settings + if not can_access(pos, clicker) then + return + end + + local num = get_button_num(pos, clicker, pointed_thing) + if num then + local typ = M(pos):get_string("type") + if typ == "switch" then + local nvm = techage.get_nvm(pos) + nvm.button = nvm.button or {} + if nvm.button[num] then + switch_off(pos, num) + send_cmnd(pos, num, "off") + else + switch_on(pos, num) + send_cmnd(pos, num, "on") + end + else + switch_on(pos, num) + send_cmnd(pos, num) + minetest.after(0.5, switch_off, pos, num) + end + minetest.sound_play("techage_button", { + pos = pos, + gain = 0.5, + max_hear_distance = 5, + }) + end + end + end, + + ta_after_formspec = function(pos, fields, playername) + lcdlib.update_entities(pos) + end, + + after_dig_node = function(pos, oldnode, oldmetadata) + techage.remove_node(pos, oldnode, oldmetadata) + end, + + ta3_formspec = WRENCH_MENU, + on_place = lcdlib.on_place, + on_construct = lcdlib.on_construct, + on_destruct = lcdlib.on_destruct, + on_rotate = lcdlib.on_rotate, + groups = {cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft({ + output = "techage:ta4_button_2x", + recipe = { + {"", "", ""}, + {"", "techage:ta4_button_off", "techage:ta4_button_off"}, + {"", "", ""}, + }, +}) diff --git a/techage/logic/button_4x.lua b/techage/logic/button_4x.lua index 56ef4ea..7377265 100644 --- a/techage/logic/button_4x.lua +++ b/techage/logic/button_4x.lua @@ -195,6 +195,21 @@ end local lcd_box = {-8/16, -8/16, 7.75/16, 8/16, 8/16, 8/16} +local function can_access(pos, player) + local meta = M(pos) + local playername = player:get_player_name() + local access = meta:get_string("access") + local owner = meta:get_string("owner") + local protected = minetest.is_protected(pos, playername) + + if access == "private" and playername ~= owner then + return false + elseif access == "protected" and protected then + return false + end + return true +end + minetest.register_node("techage:ta4_button_4x", { description = S("TA4 4x Button"), inventory_image = 'techage_smartline_button_4x.png', @@ -231,17 +246,11 @@ minetest.register_node("techage:ta4_button_4x", { on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) if clicker and clicker:is_player() then - local playername = clicker:get_player_name() - if minetest.is_protected(pos, playername) then + -- Check access settings + if not can_access(pos, clicker) then return end - -- Check node settings in addition - local access = M(pos):get_string("access") - local owner = M(pos):get_string("owner") - if access == "private" and playername ~= owner then - return - end - + local num = get_button_num(pos, clicker, pointed_thing) if num then local typ = M(pos):get_string("type") diff --git a/techage/logic/lib.lua b/techage/logic/lib.lua index 86a99fe..1d21911 100644 --- a/techage/logic/lib.lua +++ b/techage/logic/lib.lua @@ -102,4 +102,4 @@ function techage.logic.set_numbers(pos, numbers, player_name, descr) return true end return false -end \ No newline at end of file +end diff --git a/techage/logic/mba_detector.lua b/techage/logic/mba_detector.lua new file mode 100644 index 0000000..8947676 --- /dev/null +++ b/techage/logic/mba_detector.lua @@ -0,0 +1,100 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2017-2020 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA4 Mapblock Active Detector + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S + +local logic = techage.logic + +minetest.register_node("techage:ta4_mbadetector", { + description = "TA4 Mapblock Active Detector", + inventory_image = 'techage_smartline_mba_detector_inv.png', + tiles = { + -- up, down, right, left, back, front + "techage_smartline.png", + "techage_smartline.png", + "techage_smartline.png", + "techage_smartline.png", + "techage_smartline.png", + "techage_smartline.png^techage_smartline_mba_detector.png", + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, + }, + }, + + after_place_node = function(pos, placer) + local meta = M(pos) + logic.after_place_node(pos, placer, "techage:ta4_mbadetector", S("TA4 Mapblock Active Detector")) + logic.infotext(meta, S("TA4 Mapblock Active Detector")) + minetest.get_node_timer(pos):start(1) + end, + + on_timer = function(pos, elapsed) + local mem = techage.get_mem(pos) + mem.gametime = minetest.get_gametime() + return true + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + techage.remove_node(pos, oldnode, oldmetadata) + techage.del_mem(pos) + end, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_craft({ + output = "techage:ta4_mbadetector", + recipe = { + {"", "group:wood", "default:mese_crystal"}, + {"", "techage:vacuum_tube", "default:copper_ingot"}, + {"", "group:wood", ""}, + }, +}) + +techage.register_node({"techage:ta4_mbadetector"}, { + on_recv_message = function(pos, src, topic, payload) + if topic == "state" then + if minetest.compare_block_status then + if minetest.compare_block_status(pos, "active") then + return "on" + else + return "off" + end + else + local mem = techage.get_mem(pos) + local res = mem.gametime and mem.gametime > (minetest.get_gametime() - 2) + return res and "on" or "off" + end + else + return "unsupported" + end + end, + on_node_load = function(pos) + minetest.get_node_timer(pos):start(1) + end, + } +) + diff --git a/techage/logic/movecontroller.lua b/techage/logic/movecontroller.lua deleted file mode 100644 index 55939ee..0000000 --- a/techage/logic/movecontroller.lua +++ /dev/null @@ -1,812 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Move Controller - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos -local S = techage.S - -------------------------------------------------------------------------------- --- Entity / Move / Attach / Detach -------------------------------------------------------------------------------- -local MIN_SPEED = 0.4 -local MAX_SPEED = 8 - -local function to_vector(s) - local x,y,z = unpack(string.split(s, ",")) - if x and y and z then - return { - x=tonumber(x) or 0, - y=tonumber(y) or 0, - z=tonumber(z) or 0, - } - end - return {x=0, y=0, z=0} -end - --- Only the ID ist stored, not the object -local function get_object_id(object) - for id, entity in pairs(minetest.luaentities) do - if entity.object == object then - return id - end - end -end - --- determine exact position of attached entities -local function obj_pos(obj) - local _, _, pos = obj:get_attach() - pos = vector.divide(pos, 29) - return vector.add(obj:get_pos(), pos) -end - --- Check access conflicts with other mods -local function lock_player(player) - local meta = player:get_meta() - if meta:get_int("player_physics_locked") == 0 then - meta:set_int("player_physics_locked", 1) - meta:set_string("player_physics_locked_by", "ta_movecontroller") - return true - end - return false -end - -local function unlock_player(player) - local meta = player:get_meta() - if meta:get_int("player_physics_locked") == 1 then - if meta:get_string("player_physics_locked_by") == "ta_movecontroller" then - meta:set_int("player_physics_locked", 0) - meta:set_string("player_physics_locked_by", "") - return true - end - end - return false -end - -local function detach_player(player) - local pos = obj_pos(player) - player:set_detach() - player:set_properties({visual_size = {x=1, y=1}}) - player:set_pos(pos) - -- TODO: move to save position -end - - --- Attach player/mob to given parent object (block) -local function attach_single_object(parent, obj, dir) - local self = parent:get_luaentity() - local rot = obj:get_rotation() - local res = obj:get_attach() - if not res then - local offs = table.copy(dir) - dir = vector.multiply(dir, 29) - obj:set_attach(parent, "", dir, rot, true) - obj:set_properties({visual_size = {x=2.9, y=2.9}}) - if obj:is_player() then - if lock_player(obj) then - table.insert(self.players, {name = obj:get_player_name(), offs = offs}) - end - else - table.insert(self.entities, {objID = get_object_id(obj), offs = offs}) - end - end -end - --- Attach all objects around to the parent object --- offs is the search/attach position offset -local function attach_objects(pos, offs, parent) - local pos1 = vector.add(pos, offs) - for _, obj in pairs(minetest.get_objects_inside_radius(pos1, 0.9)) do - local dir = vector.subtract(obj:get_pos(), pos) - local entity = obj:get_luaentity() - if entity then - if entity.name == "__builtin:item" then -- dropped items - --obj:set_attach(objref, "", {x=0, y=0, z=0}, {x=0, y=0, z=0}, true) -- hier kracht es - elseif entity.name ~= "techage:move_item" then - attach_single_object(parent, obj, dir) - end - elseif obj:is_player() then - attach_single_object(parent, obj, dir) - end - end -end - --- Detach all attached objects from the parent object -local function detach_objects(pos, self) - for _, item in ipairs(self.entities or {}) do - local entity = minetest.luaentities[item.objID] - if entity then - local obj = entity.object - obj:set_detach() - obj:set_properties({visual_size = {x=1, y=1}}) - local pos1 = vector.add(pos, item.offs) - obj:set_pos(pos1) - end - end - for _, item in ipairs(self.players or {}) do - local obj = minetest.get_player_by_name(item.name) - if obj then - obj:set_detach() - obj:set_properties({visual_size = {x=1, y=1}}) - local pos1 = vector.add(pos, item.offs) - obj:set_pos(pos1) - unlock_player(obj) - end - end - self.entities = {} - self.players = {} -end - -local function entity_to_node(pos, obj) - local self = obj:get_luaentity() - if self then - local name = self.item or "air" - local metadata = self.metadata or {} - local rot = obj:get_rotation() - detach_objects(pos, self) - obj:remove() - - pos = vector.round(pos) - local dir = minetest.yaw_to_dir(rot.y or 0) - local param2 = minetest.dir_to_facedir(dir) or 0 - local node = minetest.get_node(pos) - local ndef1 = minetest.registered_nodes[name] - local ndef2 = minetest.registered_nodes[node.name] - if ndef1 and ndef2 then - if ndef2.buildable_to then - local meta = M(pos) - minetest.set_node(pos, {name=name, param2=param2}) - meta:from_table(metadata) - meta:set_string("ta_move_block", "") - return - end - local meta = M(pos) - if not meta:contains("ta_move_block") then - meta:set_string("ta_move_block", minetest.serialize({name=name, param2=param2})) - return - end - minetest.add_item(pos, ItemStack(name)) - elseif ndef1 then - minetest.add_item(pos, ItemStack(name)) - end - end -end - -local function node_to_entity(pos, handover) - local meta = M(pos) - local node, metadata - - if meta:contains("ta_move_block") then - node = minetest.deserialize(meta:get_string("ta_move_block")) - metadata = {} - meta:set_string("ta_move_block", "") - else - node = minetest.get_node(pos) - meta:set_string("ta_move_block", "") - metadata = meta:to_table() - minetest.remove_node(pos) - end - local dir = minetest.facedir_to_dir(node.param2) - local yaw = minetest.dir_to_yaw(dir) - local obj = minetest.add_entity(pos, "techage:move_item") - if obj then - local self = obj:get_luaentity() - obj:set_rotation({x=0, y=yaw, z=0}) - obj:set_properties({wield_item=node.name}) - obj:set_armor_groups({immortal=1}) - self.item = node.name - self.metadata = metadata or {} - self.handover = handover - self.start_pos = table.copy(pos) - return obj - end -end - -local function capture_entity(pos) - local l = minetest.get_objects_in_area(pos, pos) - for _, obj in ipairs(l) do - local self = obj:get_luaentity() - if self and self.name == "techage:move_item" then - return obj - end - end -end - --- move block direction -local function determine_dir(pos1, pos2) - local vdist = vector.subtract(pos2, pos1) - local ndist = vector.length(vdist) - return vector.divide(vdist, ndist) -end - -local function move_entity(obj, pos2, dir, max_speed) - local self = obj:get_luaentity() - self.max_speed = max_speed - self.dest_pos = table.copy(pos2) - self.dir = dir - local acc = vector.multiply(dir, max_speed / 2) - obj:set_acceleration(acc) -end - --- Handover the entity to the next movecontroller -local function handover_to(pos, self) - local info = techage.get_node_info(self.handover) - if info and info.name == "techage:ta4_movecontroller" then - local mem = techage.get_mem(info.pos) - if not mem.entities_are_there then - mem.entities_are_there = true - -- copy move direction - --print("techage.get_nvm(pos).pos_2to1", techage.get_nvm(pos).pos_2to1) - techage.get_nvm(info.pos).pos_2to1 = techage.get_nvm(pos).pos_2to1 - minetest.after(0.2, techage.send_single, "0", self.handover, "handover") - end - return true - end -end - -minetest.register_entity("techage:move_item", { - initial_properties = { - pointable = true, - makes_footstep_sound = true, - static_save = true, - collide_with_objects = false, - physical = false, - visual = "wielditem", - wield_item = "default:dirt", - visual_size = {x=0.67, y=0.67, z=0.67}, - selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, - }, - - get_staticdata = function(self) - return minetest.serialize({ - item = self.item, - max_speed = self.max_speed, - dest_pos = self.dest_pos, - start_pos = self.start_pos, - dir = self.dir, - metadata = self.metadata, - respawn = true, - }) - end, - - on_activate = function(self, staticdata) - if staticdata then - local tbl = minetest.deserialize(staticdata) or {} - self.item = tbl.item or "air" - self.max_speed = tbl.max_speed or MAX_SPEED - self.dest_pos = tbl.dest_pos or self.object:get_pos() - self.start_pos = tbl.start_pos or self.object:get_pos() - self.dir = tbl.dir or {x=0, y=0, z=0} - self.metadata = tbl.metadata or {} - self.object:set_properties({wield_item = self.item}) - if tbl.respawn then - entity_to_node(self.start_pos, self.object) - end - end - end, - - on_step = function(self, dtime, moveresult) - if self.dest_pos then - local obj = self.object - local pos = obj:get_pos() - local dist = vector.distance(pos, self.dest_pos) - local speed = vector.length(obj:get_velocity()) - - -- Landing - if dist < 0.05 then - obj:move_to(self.dest_pos, true) - obj:set_acceleration({x=0, y=0, z=0}) - obj:set_velocity({x=0, y=0, z=0}) - self.dest_pos = nil - if not self.handover or not handover_to(pos, self) then - minetest.after(0.5, entity_to_node, pos, obj) - end - self.ttl = 2 - return - end - - -- Braking or limit max speed - if speed > (dist * 2) or speed > self.max_speed then - local speed = math.min(speed, math.max(dist * 2, MIN_SPEED)) - local vel = vector.multiply(self.dir,speed) - obj:set_velocity(vel) - obj:set_acceleration({x=0, y=0, z=0}) - end - elseif self.ttl then - self.ttl = self.ttl - dtime - if self.ttl < 0 then - local obj = self.object - local pos = obj:get_pos() - entity_to_node(pos, obj) - end - end - end, - -}) - -------------------------------------------------------------------------------- --- Marker / Record -------------------------------------------------------------------------------- -local MarkedNodes = {} -- t[player] = {{entity, pos},...} -local CurrentPos -- to mark punched entities -local SimpleNodes = techage.logic.SimpleNodes - -local function is_valid_dest(pos) - local node = minetest.get_node(pos) - local ndef = minetest.registered_nodes[node.name] - if ndef and ndef.buildable_to then - return true - end - if not M(pos):contains("ta_move_block") then - return true - end - return false -end - -local function is_simple_node(pos) - -- special handling - local name = minetest.get_node(pos).name - if SimpleNodes[name] ~= nil then - return SimpleNodes[name] - end - - local ndef = minetest.registered_nodes[name] - if not ndef or name == "air" or name == "ignore" then return false end - -- don't remove nodes with some intelligence or undiggable nodes - if ndef.drop == "" then return false end - if ndef.diggable == false then return false end - if ndef.after_dig_node then return false end - - return true -end - -local function table_add(tbl, offs) - if not tbl or not offs then return end - - local tbl2 = {} - for _, v in ipairs(tbl) do - tbl2[#tbl2 + 1] = vector.add(v, offs) - end - return tbl2 -end - -local function unmark_position(name, pos) - pos = vector.round(pos) - for idx,item in ipairs(MarkedNodes[name] or {}) do - if vector.equals(pos, item.pos) then - item.entity:remove() - table.remove(MarkedNodes[name], idx) - CurrentPos = pos - return - end - end -end - -local function unmark_all(name) - for _,item in ipairs(MarkedNodes[name] or {}) do - item.entity:remove() - end - MarkedNodes[name] = nil -end - -local function mark_position(name, pos) - MarkedNodes[name] = MarkedNodes[name] or {} - pos = vector.round(pos) - if not CurrentPos or not vector.equals(pos, CurrentPos) then -- entity not punched? - local entity = minetest.add_entity(pos, "techage:moveblock_marker") - if entity ~= nil then - entity:get_luaentity().player_name = name - table.insert(MarkedNodes[name], {pos = pos, entity = entity}) - end - CurrentPos = nil - return true - end - CurrentPos = nil -end - -local function get_poslist(name) - local idx = 0 - local lst = {} - for _,item in ipairs(MarkedNodes[name] or {}) do - table.insert(lst, item.pos) - idx = idx + 1 - if idx >= 16 then break end - end - return lst -end - -minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) - if puncher and puncher:is_player() then - local name = puncher:get_player_name() - - if not MarkedNodes[name] then - return - end - - mark_position(name, pointed_thing.under) - end -end) - - -minetest.register_entity(":techage:moveblock_marker", { - initial_properties = { - visual = "cube", - textures = { - "techage_cube_mark.png", - "techage_cube_mark.png", - "techage_cube_mark.png", - "techage_cube_mark.png", - "techage_cube_mark.png", - "techage_cube_mark.png", - }, - --use_texture_alpha = true, - physical = false, - visual_size = {x=1.1, y=1.1}, - collisionbox = {-0.55,-0.55,-0.55, 0.55,0.55,0.55}, - glow = 8, - }, - on_step = function(self, dtime) - self.ttl = (self.ttl or 2400) - 1 - if self.ttl <= 0 then - local pos = self.object:get_pos() - unmark_position(self.player_name, pos) - end - end, - on_punch = function(self, hitter) - local pos = self.object:get_pos() - local name = hitter:get_player_name() - if name == self.player_name then - unmark_position(name, pos) - end - end, -}) - -------------------------------------------------------------------------------- --- TA4 Move Controller -------------------------------------------------------------------------------- -local WRENCH_MENU = { - { - type = "dropdown", - choices = "0.5,1,2,4,6,8", - name = "max_speed", - label = S("Maximum Speed"), - tooltip = S("Maximum speed for the moving block."), - default = "8", - }, - { - type = "number", - name = "handoverB", - label = S("Handover to B"), - tooltip = S("Number of the next movecontroller."), - default = "", - }, - { - type = "number", - name = "handoverA", - label = S("Handover to A"), - tooltip = S("Number of the previous movecontroller."), - default = "", - }, - { - type = "float", - name = "height", - label = S("Move block height"), - tooltip = S("Value in the range of 0.0 to 1.0"), - default = "1.0", - }, -} - -local function formspec(nvm, meta) - local status = meta:get_string("status") - local distance = meta:contains("distance") and meta:get_string("distance") or "0,3,0" - return "size[8,5]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "box[0,-0.1;7.2,0.5;#c6e8ff]" .. - "label[0.2,-0.1;" .. minetest.colorize( "#000000", S("TA4 Move Controller")) .. "]" .. - techage.wrench_image(7.4, -0.05) .. - "button[0.1,0.8;3.8,1;record;" .. S("Record") .. "]" .. - "button[4.1,0.8;3.8,1;ready;" .. S("Done") .. "]" .. - "field[0.4,2.5;3.8,1;distance;" .. S("Move distance (A to B)") .. ";" .. distance .. "]" .. - "button[4.1,2.2;3.8,1;store;" .. S("Store") .. "]" .. - "button[0.1,3.3;3.8,1;moveAB;" .. S("Move A-B") .. "]" .. - "button[4.1,3.3;3.8,1;moveBA;" .. S("Move B-A") .. "]" .. - "label[0.3,4.3;" .. status .. "]" -end - -local function move_node(pos, pos1, pos2, max_speed, handover, height) - local meta = M(pos) - local dir = determine_dir(pos1, pos2) - local obj = node_to_entity(pos1, handover) - local self = obj:get_luaentity() - self.players = {} - self.entities = {} - - if obj then - local offs = {x=0, y=height or 1, z=0} - attach_objects(pos1, offs, obj) - if dir.y == 0 then - if (dir.x ~= 0 and dir.z == 0) or (dir.x == 0 and dir.z ~= 0) then - attach_objects(pos1, dir, obj) - end - end - move_entity(obj, pos2, dir, max_speed) - end -end - -local function move_nodes(pos, lpos1, lpos2, handover) - local meta = M(pos) - local owner = meta:get_string("owner") - local max_speed = meta:contains("max_speed") and meta:get_int("max_speed") or MAX_SPEED - local height = meta:contains("height") and meta:get_float("height") or 1 - height = techage.in_range(height, 0, 1) - - if #lpos1 == #lpos2 then - for idx = 1, #lpos1 do - local pos1 = lpos1[idx] - local pos2 = lpos2[idx] - if not minetest.is_protected(pos1, owner) and not minetest.is_protected(pos2, owner) then - if is_simple_node(pos1) and is_valid_dest(pos2) then - move_node(pos, pos1, pos2, max_speed, handover, height) - else - if not is_simple_node(pos1) then - meta:set_string("status", S("No valid node at the start position")) - else - meta:set_string("status", S("No valid destination position")) - end - end - else - if minetest.is_protected(pos1, owner) then - meta:set_string("status", S("Start position is protected")) - else - meta:set_string("status", S("Destination position is protected")) - end - return false - end - end - else - meta:set_string("status", S("Position list error")) - return false - end - local info = techage.get_node_info(handover) - if info and info.name == "techage:ta4_movecontroller" then - local mem = techage.get_mem(info.pos) - mem.num_entities = #lpos1 - end - return true -end - -local function moveon_nodes(pos, lpos1, lpos2, handover) - local meta = M(pos) - local owner = meta:get_string("owner") - local max_speed = meta:contains("max_speed") and meta:get_int("max_speed") or MAX_SPEED - - if #lpos1 == #lpos2 then - for idx = 1, #lpos1 do - local pos1 = lpos1[idx] - local pos2 = lpos2[idx] - if not minetest.is_protected(pos1, owner) and not minetest.is_protected(pos2, owner) then - if is_valid_dest(pos2) then - local dir = determine_dir(pos1, pos2) - local obj = capture_entity(pos1) - if obj then - obj:get_luaentity().handover = handover - move_entity(obj, pos2, dir, max_speed) - end - else - if not is_simple_node(pos1) then - meta:set_string("status", S("No valid node at the start position")) - else - meta:set_string("status", S("No valid destination position")) - end - end - else - if minetest.is_protected(pos1, owner) then - meta:set_string("status", S("Start position is protected")) - else - meta:set_string("status", S("Destination position is protected")) - end - return false - end - end - else - meta:set_string("status", S("Position list error")) - return false - end - local info = techage.get_node_info(handover) - if info and info.name == "techage:ta4_movecontroller" then - local mem = techage.get_mem(info.pos) - mem.num_entities = #lpos1 - end - return true -end - -local function move_to_other_pos(pos) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - - if nvm.pos_2to1 then - local lpos1 = nvm.lpos1 or {} - local lpos2 = nvm.lpos2 or {} - nvm.pos_2to1 = false - local handover = meta:contains("handoverA") and meta:get_string("handoverA") - return move_nodes(pos, lpos2, lpos1, handover) - else - local lpos1 = nvm.lpos1 or {} - local lpos2 = nvm.lpos2 or {} - nvm.pos_2to1 = true - local handover = meta:contains("handoverB") and meta:get_string("handoverB") - return move_nodes(pos, lpos1, lpos2, handover) - end -end - -local function takeover(pos) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local mem = techage.get_mem(pos) - mem.entities_are_there = nil - - if nvm.pos_2to1 then - local lpos1 = nvm.lpos1 or {} - local lpos2 = nvm.lpos2 or {} - nvm.pos_2to1 = false - local handover = meta:contains("handoverA") and meta:get_string("handoverA") - return moveon_nodes(pos, lpos2, lpos1, handover) - else - local lpos1 = nvm.lpos1 or {} - local lpos2 = nvm.lpos2 or {} - nvm.pos_2to1 = true - local handover = meta:contains("handoverB") and meta:get_string("handoverB") - return moveon_nodes(pos, lpos1, lpos2, handover) - end -end - -minetest.register_node("techage:ta4_movecontroller", { - description = S("TA4 Move Controller"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_movecontroller.png", - }, - - after_place_node = function(pos, placer, itemstack) - local meta = M(pos) - techage.logic.after_place_node(pos, placer, "techage:ta4_movecontroller", S("TA4 Move Controller")) - techage.logic.infotext(meta, S("TA4 Move Controller")) - local nvm = techage.get_nvm(pos) - meta:set_string("formspec", formspec(nvm, meta)) - end, - - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local meta = M(pos) - local nvm = techage.get_nvm(pos) - - if fields.record then - nvm.lpos1 = nil - nvm.lpos2 = nil - nvm.pos_2to1 = false - meta:set_string("status", S("Recording...")) - local name = player:get_player_name() - minetest.chat_send_player(name, S("Click on all blocks that shall be moved")) - MarkedNodes[name] = {} - meta:set_string("formspec", formspec(nvm, meta)) - elseif fields.ready then - local name = player:get_player_name() - local pos_list = get_poslist(name) - local text = #pos_list.." "..S("block positions are stored.") - meta:set_string("status", text) - meta:set_string("distance", fields.distance) - nvm.lpos1 = pos_list - nvm.lpos2 = table_add(pos_list, to_vector(fields.distance)) - nvm.pos_2to1 = false - unmark_all(name) - meta:set_string("formspec", formspec(nvm, meta)) - elseif fields.store then - local dist = to_vector(fields.distance) - local l = math.hypot(dist.x, math.hypot(dist.y, dist.z)) - if l <= 100 then - meta:set_string("distance", fields.distance) - nvm.lpos2 = table_add(nvm.lpos1, to_vector(fields.distance)) - nvm.pos_2to1 = false - else - meta:set_string("status", S("Error: Distance > 100 m !!")) - end - meta:set_string("formspec", formspec(nvm, meta)) - elseif fields.moveAB then - meta:set_string("status", "") - nvm.pos_2to1 = false - if move_to_other_pos(pos) then - meta:set_string("formspec", formspec(nvm, meta)) - local name = player:get_player_name() - MarkedNodes[name] = nil - end - elseif fields.moveBA then - meta:set_string("status", "") - nvm.pos_2to1 = true - if move_to_other_pos(pos) then - meta:set_string("formspec", formspec(nvm, meta)) - local name = player:get_player_name() - MarkedNodes[name] = nil - end - end - end, - - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local name = digger:get_player_name() - unmark_all(name) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - ta4_formspec = WRENCH_MENU, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -local INFO = [[Commands: 'a2b', 'b2a', 'move']] - -techage.register_node({"techage:ta4_movecontroller"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "info" then - return INFO - elseif topic == "a2b" then - local nvm = techage.get_nvm(pos) - nvm.pos_2to1 = false - return move_to_other_pos(pos) - elseif topic == "b2a" then - local nvm = techage.get_nvm(pos) - nvm.pos_2to1 = true - return move_to_other_pos(pos) - elseif topic == "move" then - return move_to_other_pos(pos) - elseif topic == "handover" then - return takeover(pos) - end - return false - end, -}) - -minetest.register_craft({ - output = "techage:ta4_movecontroller", - recipe = { - {"default:steel_ingot", "dye:blue", "default:steel_ingot"}, - {"default:mese_crystal_fragment", "techage:ta4_wlanchip", "default:mese_crystal_fragment"}, - {"group:wood", "basic_materials:gear_steel", "group:wood"}, - }, -}) - -minetest.register_on_joinplayer(function(player) - unlock_player(player) -end) - -minetest.register_on_leaveplayer(function(player) - if unlock_player(player) then - detach_player(player) - end -end) - -minetest.register_on_dieplayer(function(player) - if unlock_player(player) then - detach_player(player) - end -end) diff --git a/techage/logic/sequencer2.lua b/techage/logic/sequencer2.lua index 0b717c7..fe407fe 100644 --- a/techage/logic/sequencer2.lua +++ b/techage/logic/sequencer2.lua @@ -95,7 +95,7 @@ local function compile(s, tRes) return exception(tRes, i, "Order error!") end start_idx = start_idx or idx - if old_idx ~= 0 and not tCode[old_idx].next_idx then + if old_idx ~= 0 and tCode[old_idx] and not tCode[old_idx].next_idx then tCode[old_idx].next_idx = idx end if cmnd1 == "send" then @@ -215,15 +215,12 @@ local function on_receive_fields(pos, formname, fields, player) local mem = techage.get_mem(pos) nvm.running = nvm.running or false - print(1, dump(fields)) if fields.stop then nvm.running = false minetest.get_node_timer(pos):stop() logic.infotext(meta, S("TA4 Sequencer"), S("stopped")) elseif not nvm.running then - print(2) if fields.tab == "2" then - print(3) meta:set_string("formspec", formspec_help(meta)) return elseif fields.tab == "1" then diff --git a/techage/logic/signallamp_2x.lua b/techage/logic/signallamp_2x.lua new file mode 100644 index 0000000..58ef893 --- /dev/null +++ b/techage/logic/signallamp_2x.lua @@ -0,0 +1,151 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2017-2021 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA4 Logic twofold signal lamp + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S + +local OFF = 0 +local RED = 1 +local GREEN = 2 +local AMBER = 3 + +local WRENCH_MENU = { + { + type = "ascii", + name = "label1", + label = S("Label") .. " 1", + tooltip = S("Label for the lamp"), + default = "1", + }, + { + type = "ascii", + name = "label2", + label = S("Label") .. " 2", + tooltip = S("Label for the lamp"), + default = "2", + }, +} + +local function lamp_update(pos, objref) + local meta = M(pos) + pos = vector.round(pos) + local nvm = techage.get_nvm(pos) + nvm.lamp = nvm.lamp or {} + local tbl = {" ", " ", meta:get_string("label1"), " ", meta:get_string("label2")} + local text = "< " .. table.concat(tbl, "\n< ") + local texture = lcdlib.make_multiline_texture("default", text, 96, 96, 7, "top", "#000", 6) + + if nvm.lamp[1] == RED then + texture = texture .. "^techage_smartline_signal_red2.png" + elseif nvm.lamp[1] == GREEN then + texture = texture .. "^techage_smartline_signal_green2.png" + elseif nvm.lamp[1] == AMBER then + texture = texture .. "^techage_smartline_signal_amber2.png" + end + + if nvm.lamp[2] == RED then + texture = texture .. "^techage_smartline_signal_red3.png" + elseif nvm.lamp[2] == GREEN then + texture = texture .. "^techage_smartline_signal_green3.png" + elseif nvm.lamp[2] == AMBER then + texture = texture .. "^techage_smartline_signal_amber3.png" + end + + objref:set_properties({ textures = {texture}, visual_size = {x=1, y=1} }) +end + +local lcd_box = {-8/16, -4/16, 7.75/16, 8/16, 4/16, 8/16} + +minetest.register_node("techage:ta4_signallamp_2x", { + description = S("TA4 2x Signal Lamp"), + inventory_image = 'techage_smartline_signal_2x.png^techage_smartline_signal_green2.png^techage_smartline_signal_amber3.png', + tiles = {'techage_smartline_signal_2x.png'}, + drawtype = "nodebox", + paramtype = "light", + use_texture_alpha = "clip", + sunlight_propagates = true, + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = lcd_box, + }, + light_source = 6, + + display_entities = { + ["techage:display_entity"] = { depth = 0.48, + on_display_update = lamp_update}, + }, + + after_place_node = function(pos, placer) + local number = techage.add_node(pos, "techage:ta4_signallamp_2x") + local meta = minetest.get_meta(pos) + meta:set_string("node_number", number) + meta:set_string("owner", placer:get_player_name()) + meta:set_string("infotext", S("TA4 2x Signal Lamp") .. " " .. number) + local nvm = techage.get_nvm(pos) + nvm.lamp = {} + lcdlib.update_entities(pos) + end, + + after_dig_node = function(pos, oldnode, oldmetadata) + techage.remove_node(pos, oldnode, oldmetadata) + end, + + ta_after_formspec = function(pos, fields, playername) + lcdlib.update_entities(pos) + end, + + ta3_formspec = WRENCH_MENU, + on_place = lcdlib.on_place, + on_construct = lcdlib.on_construct, + on_destruct = lcdlib.on_destruct, + on_rotate = lcdlib.on_rotate, + groups = {cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_glass_defaults(), +}) + +techage.register_node({"techage:ta4_signallamp_2x"}, { + on_recv_message = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + nvm.lamp = nvm.lamp or {} + if topic == "green" then + local num = math.min(tonumber(payload) or 0, 2) + nvm.lamp[num] = GREEN + lcdlib.update_entities(pos) + elseif topic == "amber" then + local num = math.min(tonumber(payload) or 0, 2) + nvm.lamp[num] = AMBER + lcdlib.update_entities(pos) + elseif topic == "red" then + local num = math.min(tonumber(payload) or 0, 2) + nvm.lamp[num] = RED + lcdlib.update_entities(pos) + elseif topic == "off" then + local num = math.min(tonumber(payload) or 0, 2) + nvm.lamp[num] = OFF + lcdlib.update_entities(pos) + end + end, +}) + +minetest.register_craft({ + output = "techage:ta4_signallamp_2x", + recipe = { + {"", "techage:aluminum", "dye:blue"}, + {"", "default:glass", "techage:ta4_wlanchip"}, + {"", "techage:ta4_leds", "techage:ta4_leds"}, + }, +}) diff --git a/techage/logic/signallamp_4x.lua b/techage/logic/signallamp_4x.lua new file mode 100644 index 0000000..8edf379 --- /dev/null +++ b/techage/logic/signallamp_4x.lua @@ -0,0 +1,182 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2017-2021 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA4 Logic fourfold signal lamp + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S + +local OFF = 0 +local RED = 1 +local GREEN = 2 +local AMBER = 3 + +local WRENCH_MENU = { + { + type = "ascii", + name = "label1", + label = S("Label") .. " 1", + tooltip = S("Label for the lamp"), + default = "1", + }, + { + type = "ascii", + name = "label2", + label = S("Label") .. " 2", + tooltip = S("Label for the lamp"), + default = "2", + }, + { + type = "ascii", + name = "label3", + label = S("Label") .. " 3", + tooltip = S("Label for the lamp"), + default = "3", + }, + { + type = "ascii", + name = "label4", + label = S("Label") .. " 4", + tooltip = S("Label for the lamp"), + default = "4", + }, +} + +local function lamp_update(pos, objref) + local meta = M(pos) + pos = vector.round(pos) + local nvm = techage.get_nvm(pos) + nvm.lamp = nvm.lamp or {} + local tbl = {meta:get_string("label1"), " ", meta:get_string("label2"), " ", meta:get_string("label3"), " ", meta:get_string("label4")} + local text = "< " .. table.concat(tbl, "\n< ") + local texture = lcdlib.make_multiline_texture("default", text, 96, 96, 7, "top", "#000", 6) + + if nvm.lamp[1] == RED then + texture = texture .. "^techage_smartline_signal_red1.png" + elseif nvm.lamp[1] == GREEN then + texture = texture .. "^techage_smartline_signal_green1.png" + elseif nvm.lamp[1] == AMBER then + texture = texture .. "^techage_smartline_signal_amber1.png" + end + + if nvm.lamp[2] == RED then + texture = texture .. "^techage_smartline_signal_red2.png" + elseif nvm.lamp[2] == GREEN then + texture = texture .. "^techage_smartline_signal_green2.png" + elseif nvm.lamp[2] == AMBER then + texture = texture .. "^techage_smartline_signal_amber2.png" + end + + if nvm.lamp[3] == RED then + texture = texture .. "^techage_smartline_signal_red3.png" + elseif nvm.lamp[3] == GREEN then + texture = texture .. "^techage_smartline_signal_green3.png" + elseif nvm.lamp[3] == AMBER then + texture = texture .. "^techage_smartline_signal_amber3.png" + end + + if nvm.lamp[4] == RED then + texture = texture .. "^techage_smartline_signal_red4.png" + elseif nvm.lamp[4] == GREEN then + texture = texture .. "^techage_smartline_signal_green4.png" + elseif nvm.lamp[4] == AMBER then + texture = texture .. "^techage_smartline_signal_amber4.png" + end + + objref:set_properties({ textures = {texture}, visual_size = {x=1, y=1} }) +end + +local lcd_box = {-8/16, -8/16, 7.75/16, 8/16, 8/16, 8/16} + +minetest.register_node("techage:ta4_signallamp_4x", { + description = S("TA4 4x Signal Lamp"), + inventory_image = 'techage_smartline_signal_4x.png^techage_smartline_signal_off1.png^techage_smartline_signal_green2.png^techage_smartline_signal_amber3.png^techage_smartline_signal_red4.png', + tiles = {'techage_smartline_signal_4x.png'}, + drawtype = "nodebox", + paramtype = "light", + use_texture_alpha = "clip", + sunlight_propagates = true, + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = lcd_box, + }, + light_source = 6, + + display_entities = { + ["techage:display_entity"] = { depth = 0.48, + on_display_update = lamp_update}, + }, + + after_place_node = function(pos, placer) + local number = techage.add_node(pos, "techage:ta4_signallamp_4x") + local meta = minetest.get_meta(pos) + meta:set_string("node_number", number) + meta:set_string("owner", placer:get_player_name()) + meta:set_string("infotext", S("TA4 4x Signal Lamp") .. " " .. number) + local nvm = techage.get_nvm(pos) + nvm.text = {"1", "", "2", "", "3", "", "4"} + nvm.lamp = {} + lcdlib.update_entities(pos) + end, + + after_dig_node = function(pos, oldnode, oldmetadata) + techage.remove_node(pos, oldnode, oldmetadata) + end, + + ta_after_formspec = function(pos, fields, playername) + lcdlib.update_entities(pos) + end, + + ta3_formspec = WRENCH_MENU, + on_place = lcdlib.on_place, + on_construct = lcdlib.on_construct, + on_destruct = lcdlib.on_destruct, + on_rotate = lcdlib.on_rotate, + groups = {cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_glass_defaults(), +}) + +techage.register_node({"techage:ta4_signallamp_4x"}, { + on_recv_message = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + nvm.lamp = nvm.lamp or {} + if topic == "green" then + local num = math.min(tonumber(payload) or 0, 4) + nvm.lamp[num] = GREEN + lcdlib.update_entities(pos) + elseif topic == "amber" then + local num = math.min(tonumber(payload) or 0, 4) + nvm.lamp[num] = AMBER + lcdlib.update_entities(pos) + elseif topic == "red" then + local num = math.min(tonumber(payload) or 0, 4) + nvm.lamp[num] = RED + lcdlib.update_entities(pos) + elseif topic == "off" then + local num = math.min(tonumber(payload) or 0, 4) + nvm.lamp[num] = OFF + lcdlib.update_entities(pos) + end + end, +}) + +minetest.register_craft({ + output = "techage:ta4_signallamp_4x", + recipe = { + {"", "techage:ta4_signallamp_2x", ""}, + {"", "techage:ta4_signallamp_2x", ""}, + {"", "", ""}, + }, +}) diff --git a/techage/logic/terminal.lua b/techage/logic/terminal.lua index 7bf483f..cf63084 100644 --- a/techage/logic/terminal.lua +++ b/techage/logic/terminal.lua @@ -3,7 +3,7 @@ Terminal ======== - Copyright (C) 2018-2020 Joachim Stolberg + Copyright (C) 2018-2021 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -15,22 +15,36 @@ local M = minetest.get_meta local S = techage.S -local HELP_TA3 = "Syntax:\n".. -" cmd \n".. -"\n".. -"like: cmd 181 on\n".. -"or: cmd 4573 state\n".. -"\n".. -"Local commands:\n".. -"- clear = clear screen\n".. -"- help = this message\n".. -"- pub = switch to public use of buttons\n".. -"- priv = switch to private use of buttons\n".. -"To program a user button with a command:\n".. -" set \n".. -"e.g.: set 1 ON cmd 123 on" +local HELP_TA3 = [[ #### TA3 Terminal #### +Send commands to machines and output the results. +Local commands: +- Clear screen with 'clear' +- Output this message with 'help' +- Switch to public use of buttons with 'pub' +- Switch to private use of buttons with 'priv' +- Program a user button with + 'set ' + Example: 'set 1 ON cmd 1234 on' +- send a command with 'cmd ' + Example: 'cmd 1234 on']] -local CMNDS_TA3 = S("Syntax error, try help") +local HELP_TA4 = [[ #### TA4 Terminal #### +Send commands to machines and output the results. +Local commands: +- Clear screen with 'clear' +- Output this message with 'help' +- Switch to public use of buttons with 'pub' +- Switch to private use of buttons with 'priv' +- Program a user button with + 'set ' + Example: 'set 1 ON cmd 1234 on' +- send a command with 'cmd ' + Example: 'cmd 1234 on' +- Connect to a machine with 'connect ' +If connected, compact commands like 'status' +are possible.]] + +local SYNTAX_ERR = S("Syntax error, try help") local function get_string(meta, num, default) local s = meta:get_string("bttn_text"..num) @@ -54,24 +68,28 @@ local function formspec2(meta) local bttn_text7 = get_string(meta, 7, "User7") local bttn_text8 = get_string(meta, 8, "User8") local bttn_text9 = get_string(meta, 9, "User9") - return "size[10,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "style_type[table,field;font=mono]".. - "button[0,0;3.3,1;bttn1;"..bttn_text1.."]button[3.3,0;3.3,1;bttn2;"..bttn_text2.."]button[6.6,0;3.3,1;bttn3;"..bttn_text3.."]".. - "button[0,0.8;3.3,1;bttn4;"..bttn_text4.."]button[3.3,0.8;3.3,1;bttn5;"..bttn_text5.."]button[6.6,0.8;3.3,1;bttn6;"..bttn_text6.."]".. - "button[0,1.6;3.3,1;bttn7;"..bttn_text7.."]button[3.3,1.6;3.3,1;bttn8;"..bttn_text8.."]button[6.6,1.6;3.3,1;bttn9;"..bttn_text9.."]".. - "table[0,2.5;9.8,4.7;output;"..output..";200]".. - "field[0.4,7.7;7.6,1;cmnd;;"..command.."]" .. + return "size[10,8.5]".. + --"style_type[table,field;font=mono]".. + "button[0,-0.2;3.3,1;bttn1;"..bttn_text1.."]button[3.3,-0.2;3.3,1;bttn2;"..bttn_text2.."]button[6.6,-0.2;3.3,1;bttn3;"..bttn_text3.."]".. + "button[0,0.6;3.3,1;bttn4;"..bttn_text4.."]button[3.3,0.6;3.3,1;bttn5;"..bttn_text5.."]button[6.6,0.6;3.3,1;bttn6;"..bttn_text6.."]".. + "button[0,1.4;3.3,1;bttn7;"..bttn_text7.."]button[3.3,1.4;3.3,1;bttn8;"..bttn_text8.."]button[6.6,1.4;3.3,1;bttn9;"..bttn_text9.."]".. + "table[0,2.3;9.8,5.6;output;"..output..";200]".. + "field[0.4,8.2;7.6,1;cmnd;;"..command.."]" .. "field_close_on_enter[cmnd;false]".. - "button[7.9,7.4;2,1;ok;"..S("Enter").."]" + "button[7.9,7.9;2,1;ok;"..S("Enter").."]" end local function output(pos, text) local meta = minetest.get_meta(pos) text = meta:get_string("output") .. "\n" .. (text or "") - text = text:sub(-500,-1) + text = text:sub(-1000,-1) + meta:set_string("output", text) + meta:set_string("formspec", formspec2(meta)) +end + +local function append(pos, text) + local meta = minetest.get_meta(pos) + text = meta:get_string("output") .. (text or "") meta:set_string("output", text) meta:set_string("formspec", formspec2(meta)) end @@ -84,37 +102,146 @@ local function get_line_text(pos, num) return line:gsub("^[%s$]*(.-)%s*$", "%1") end +local function server_debug(pos, command, player) + local cmnd, payload = command:match('^pipe%s+([%w_]+)%s*(.*)$') + if cmnd then + if not minetest.check_player_privs(player, "server") then + output(pos, "server privs missing") + return + end + local resp = techage.transfer( + pos, + "B", -- outdir + cmnd, -- topic + payload, -- payload + techage.LiquidPipe, -- network + nil) -- valid nodes + output(pos, dump(resp)) + return true + end + + cmnd, payload = command:match('^axle%s+([%w_]+)%s*(.*)$') + if cmnd then + if not minetest.check_player_privs(player, "server") then + output(pos, "server privs missing") + return + end + local resp = techage.transfer( + pos, + "B", -- outdir + cmnd, -- topic + payload, -- payload + techage.TA1Axle, -- network + nil) -- valid nodes + output(pos, dump(resp)) + return true + end + + cmnd, payload = command:match('^vtube%s+([%w_]+)%s*(.*)$') + if cmnd then + if not minetest.check_player_privs(player, "server") then + output(pos, "server privs missing") + return + end + local resp = techage.transfer( + pos, + "B", -- outdir + cmnd, -- topic + payload, -- payload + techage.VTube, -- network + nil) -- valid nodes + output(pos, dump(resp)) + return true + end +end -local function command(pos, command, player) +local function command(pos, command, player, is_ta4) local meta = minetest.get_meta(pos) local owner = meta:get_string("owner") or "" - if command then - command = command:sub(1,80) - command = string.trim(command) - - if command == "clear" then - meta:set_string("output", "") - meta:set_string("formspec", formspec2(meta)) - elseif command == "help" then - local meta = minetest.get_meta(pos) - meta:set_string("output", HELP_TA3) - meta:set_string("formspec", formspec2(meta)) - elseif command == "pub" then - meta:set_int("public", 1) - output(pos, player..":$ "..command) - output(pos, S("Switched to public use!")) - elseif command == "priv" then - meta:set_int("public", 0) - output(pos, player..":$ "..command) - output(pos, S("Switched to private use!")) + command = command:sub(1,80) + command = string.trim(command) + local cmnd, data = command:match('^(%w+)%s*(.*)$') + + if cmnd == "clear" then + meta:set_string("output", "") + meta:set_string("formspec", formspec2(meta)) + elseif cmnd == "" then + output(pos, "$") + elseif cmnd == "help" then + if is_ta4 then + output(pos, HELP_TA4) else - output(pos, "$ "..command) + output(pos, HELP_TA3) + end + elseif cmnd == "pub" then + meta:set_int("public", 1) + output(pos, "$ "..command) + output(pos, "Switched to public buttons!") + elseif cmnd == "priv" then + meta:set_int("public", 0) + output(pos, "$ "..command) + output(pos, "Switched to private buttons!") + elseif cmnd == "connect" and data then + output(pos, "$ "..command) + if techage.not_protected(data, owner, owner) then local own_num = meta:get_string("node_number") - local num, cmnd, payload = command:match('^cmd%s+([0-9]+)%s+(%w+)%s*(.*)$') - if num and cmnd then - if techage.not_protected(num, owner, owner) then - local resp = techage.send_single(own_num, num, cmnd, payload) + local resp = techage.send_single(own_num, data, cmnd) + if resp then + meta:set_string("connected_to", data) + output(pos, "Connected.") + else + meta:set_string("connected_to", "") + output(pos, "Not connected!") + end + else + output(pos, "Protection error!") + end + else + output(pos, "$ "..command) + local own_num = meta:get_string("node_number") + local connected_to = meta:contains("connected_to") and meta:get_string("connected_to") + local bttn_num, label, num, cmnd, payload + + num, cmnd, payload = command:match('^cmd%s+([0-9]+)%s+(%w+)%s*(.*)$') + if num and cmnd then + if techage.not_protected(num, owner, owner) then + local resp = techage.send_single(own_num, num, cmnd, payload) + if type(resp) == "string" then + output(pos, resp) + else + output(pos, dump(resp)) + end + end + return + end + + num, cmnd = command:match('^turn%s+([0-9]+)%s+([onf]+)$') + if num and (cmnd == "on" or cmnd == "off") then + if techage.not_protected(num, owner, owner) then + local resp = techage.send_single(own_num, num, cmnd) + output(pos, dump(resp)) + end + return + end + + bttn_num, label, cmnd = command:match('^set%s+([1-9])%s+([%w_]+)%s+(.+)$') + if bttn_num and label and cmnd then + meta:set_string("bttn_text"..bttn_num, label) + meta:set_string("bttn_cmnd"..bttn_num, cmnd) + meta:set_string("formspec", formspec2(meta)) + return + end + + if server_debug(pos, command, player) then + return + end + + if connected_to then + local cmnd, payload = command:match('^(%w+)%s*(.*)$') + if cmnd then + local resp = techage.send_single(own_num, connected_to, cmnd, payload) + if resp ~= true then if type(resp) == "string" then output(pos, resp) else @@ -123,59 +250,10 @@ local function command(pos, command, player) end return end - num, cmnd = command:match('^turn%s+([0-9]+)%s+([onf]+)$') - if num and (cmnd == "on" or cmnd == "off") then - if techage.not_protected(num, owner, owner) then - local resp = techage.send_single(own_num, num, cmnd) - output(pos, dump(resp)) - end - return - end - local bttn_num, label, cmnd = command:match('^set%s+([1-9])%s+([%w_]+)%s+(.+)$') - if bttn_num and label and cmnd then - meta:set_string("bttn_text"..bttn_num, label) - meta:set_string("bttn_cmnd"..bttn_num, cmnd) - meta:set_string("formspec", formspec2(meta)) - return - end - - local cmnd, payload = command:match('^pipe%s+([%w_]+)%s*(.*)$') - if cmnd then - if not minetest.check_player_privs(player, "server") then - output(pos, "server privs missing") - return - end - local resp = techage.transfer( - pos, - "B", -- outdir - cmnd, -- topic - payload, -- payload - techage.LiquidPipe, -- network - nil) -- valid nodes - output(pos, dump(resp)) - return - end - - local cmnd, payload = command:match('^axle%s+([%w_]+)%s*(.*)$') - if cmnd then - if not minetest.check_player_privs(player, "server") then - output(pos, "server privs missing") - return - end - local resp = techage.transfer( - pos, - "B", -- outdir - cmnd, -- topic - payload, -- payload - techage.TA1Axle, -- network - nil) -- valid nodes - output(pos, dump(resp)) - return - end - - if command ~= "" then - output(pos, CMNDS_TA3) - end + end + + if command ~= "" then + output(pos, SYNTAX_ERR) end end end @@ -186,9 +264,9 @@ local function send_cmnd(pos, meta, num) command(pos, cmnd, owner) end -local function register_terminal(num, tiles, node_box, selection_box) - minetest.register_node("techage:terminal"..num, { - description = S("TA3 Terminal"), +local function register_terminal(name, description, tiles, node_box, selection_box) + minetest.register_node("techage:"..name, { + description = description, tiles = tiles, drawtype = "nodebox", node_box = node_box, @@ -201,7 +279,7 @@ local function register_terminal(num, tiles, node_box, selection_box) meta:set_string("command", S("commands like: help")) meta:set_string("formspec", formspec2(meta)) meta:set_string("owner", placer:get_player_name()) - meta:set_string("infotext", S("TA3 Terminal") .. " " .. number) + meta:set_string("infotext", description .. " " .. number) end, on_receive_fields = function(pos, formname, fields, player) @@ -216,11 +294,21 @@ local function register_terminal(num, tiles, node_box, selection_box) meta:set_string("command", s) meta:set_string("formspec", formspec2(meta)) return - elseif (fields.key_enter == "true" or fields.ok) and fields.cmnd ~= "" then - command(pos, fields.cmnd, player:get_player_name()) + elseif (fields.ok or fields.key_enter_field) and fields.cmnd then + local is_ta4 = string.find(description, "TA4") + command(pos, fields.cmnd, player:get_player_name(), is_ta4) + techage.historybuffer_add(pos, fields.cmnd) meta:set_string("command", "") meta:set_string("formspec", formspec2(meta)) return + elseif fields.key_up then + meta:set_string("command", techage.historybuffer_priv(pos)) + meta:set_string("formspec", formspec2(meta)) + return + elseif fields.key_down then + meta:set_string("command", techage.historybuffer_next(pos)) + meta:set_string("formspec", formspec2(meta)) + return end end if public or not protected then @@ -251,7 +339,7 @@ local function register_terminal(num, tiles, node_box, selection_box) }) end -register_terminal("2", { +register_terminal("terminal2", S("TA3 Terminal"), { -- up, down, right, left, back, front 'techage_terminal2_top.png', 'techage_terminal2_side.png', @@ -277,7 +365,33 @@ register_terminal("2", { fixed = { {-12/32, -16/32, -4/32, 12/32, 6/32, 16/32}, }, - }) + } +) + +register_terminal("terminal3", S("TA4 Terminal"), { + -- up, down, right, left, back, front + 'techage_terminal1_top.png', + 'techage_terminal1_bottom.png', + 'techage_terminal1_side.png', + 'techage_terminal1_side.png', + 'techage_terminal1_bottom.png', + "techage_terminal1_front.png", + }, + { + type = "fixed", + fixed = { + {-12/32, -16/32, -8/32, 12/32, -14/32, 12/32}, + {-12/32, -14/32, 12/32, 12/32, 6/32, 14/32}, + }, + }, + { + type = "fixed", + fixed = { + {-12/32, -16/32, -8/32, 12/32, -14/32, 12/32}, + {-12/32, -14/32, 12/32, 12/32, 6/32, 14/32}, + }, + } +) minetest.register_craft({ output = "techage:terminal2", @@ -288,6 +402,15 @@ minetest.register_craft({ }, }) +minetest.register_craft({ + output = "techage:terminal3", + recipe = { + {"techage:basalt_glass_thin", "", ""}, + {"techage:ta4_leds", "", ""}, + {"techage:aluminum", "techage:ta4_wlanchip", "techage:ta4_ramchip"}, + }, +}) + techage.register_node({"techage:terminal2"}, { on_recv_message = function(pos, src, topic, payload) output(pos, "src="..src..", cmd="..dump(topic)..", data="..dump(payload)) @@ -302,3 +425,16 @@ techage.register_node({"techage:terminal2"}, { end end, }) + +techage.register_node({"techage:terminal3"}, { + on_recv_message = function(pos, src, topic, payload) + if topic == "text" then + output(pos, payload) + elseif topic == "append" then + append(pos, payload) + else + output(pos, "src="..src..", cmd="..dump(topic)..", data="..dump(payload)) + end + return true + end, +}) diff --git a/techage/manuals/QSG.md b/techage/manuals/QSG.md index 445ae89..d2933aa 100644 --- a/techage/manuals/QSG.md +++ b/techage/manuals/QSG.md @@ -3,12 +3,13 @@ The Techage Modpack is an extensive collection of technical mods with many machines and systems, which unfortunately cannot be set up intuitively. Therefore, there is this Quick Start Guide and further manuals for the different mods. -Techage represents four technological ages: +Techage represents five technological ages: - Iron Age (TA1) - Simple tools like coal pile, coal burner, gravel sieve, hammer for getting ores and making goods - Steam Age (TA2) - Simple machines that are powered by steam engines and drive axles - Oil Age (TA3) - More modern machines that are powered by electricity -- Future Age (TA4) - Electricity from renewable energy sources such as sun and wind +- Present (TA4) - Electricity from renewable energy sources such as sun and wind +- Future (TA5) - Machines to overcome space and time, new sources of energy and other achievements shape your life Since the levels build on each other, all ages have to be run through one after the other. @@ -61,7 +62,7 @@ Since the levels build on each other, all ages have to be run through one after -## Future Age (TA4) +## Present (TA4) 1. Build solar and wind plants to get renewable energy 2. Build a Thermal Energy Storage to store the energy @@ -72,9 +73,14 @@ Since the levels build on each other, all ages have to be run through one after +## Future (TA5) + +tbd. + + ## Power Consumption -t| TechAge Machine | TA2 [ku] | TA3 [ku] | TA4 [ku] | +| TechAge Machine | TA2 [ku] | TA3 [ku] | TA4 [ku] | | ------------------------------ | -------- | -------- | --------- | | Autocrafter | 4 | 6 | (9) | | Electronic Fab | 8 | 12 | 12 | diff --git a/techage/manuals/manual_DE.md b/techage/manuals/manual_DE.md index 6a4995a..97cf0e0 100644 --- a/techage/manuals/manual_DE.md +++ b/techage/manuals/manual_DE.md @@ -1,6 +1,6 @@ # Tech Age Mod -Tech Age ist eine Technik-Mod mit 4 Entwicklungsstufen: +Tech Age ist eine Technik-Mod mit 5 Entwicklungsstufen: TA1: Eisenzeitalter (Iron Age) Benutze Werkzeuge und Hilfsmittel wie Köhler, Kohlebrenner, Kiessieb, Hammer, Hopper um notwendige Erze und Metalle zu schürfen und zu verarbeiten. @@ -11,9 +11,13 @@ Baue eine Dampfmaschine mit Antriebsachsen und betreibe damit deine ersten Masch TA3: Ölzeitalter (Oil Age) Suche und fördere Öl, baute Schienenwege zur Ölbeförderung. Ein Kraftwerk liefert den notwendigen Strom für deine Maschinen. Elektrisches Licht erhellt deine Industrieanlagen. -TA4: Zukunft (Future Age) +TA4: Gegenwart (Present) Regenerative Energiequellen wie Wind, Sonne und Biokraft helfen dir, das Ölzeitalter zu verlassen. Mit modernen Technologien und intelligenten Maschinen machst du dich auf in die Zukunft. +TA5: Zukunft (Future) +Maschinen zur Überwindung von Raum und Zeit, neue Energiequellen und andere Errungenschaften prägen dein Leben. + + Hinweis: Mit Klicken auf die Pluszeichen kommst du in die Unterkapitel dieser Anleitung. [techage_ta4|image] diff --git a/techage/manuals/manual_EN.md b/techage/manuals/manual_EN.md index e346d95..3dd5743 100644 --- a/techage/manuals/manual_EN.md +++ b/techage/manuals/manual_EN.md @@ -1,6 +1,6 @@ # Tech Age Mod -Tech Age is a technology mod with 4 development stages: +Tech Age is a technology mod with 5 development stages: TA1: Iron Age Use tools and aids such as coal burners, coal burners, gravel sieves, hammers and hoppers to mine and process the necessary ores and metals. @@ -11,9 +11,13 @@ Build a steam engine with drive axles and use it to operate your first ore proce TA3: Oil Age Find and extract oil, built railways for oil transportation. A power plant provides the necessary electricity for your machines. Electric light illuminates your industrial plants. -TA4: Future Age +TA4: Present Renewable energy sources such as wind, sun and biofuels help you to leave the oil age. With modern technologies and intelligent machines you set out into the future. +TA5: Future +Machines to overcome space and time, new sources of energy and other achievements shape your life. + + Note: With a click on the plus sign you get into the subchapters of this manual. [techage_ta4|image] diff --git a/techage/manuals/manual_ta3_DE.md b/techage/manuals/manual_ta3_DE.md index 1f49a38..6916f56 100644 --- a/techage/manuals/manual_ta3_DE.md +++ b/techage/manuals/manual_ta3_DE.md @@ -671,6 +671,18 @@ Damit lassen sich auch ausfahrbare Treppen und ähnliches simulieren. [ta3_doorcontroller|image] +### TA3 Sound Block + +Mir dem Sound Block können veschiedene Sounds/Laute abgespielt werden. Es sind alle Sounds der Mods Techage, Signs Bot, Hyperloop, Unified Inventory, TA4 Jetpack und Minetest Game verfügbar. + +Die Sounds können über das Menü und über ein Kommando ausgewählt und abgespielt werden. + +- Kommando `on` zum Abspielen eines Sounds +- Kommando `sound ` zur Auswahl eines Sounds über den Index +- Kommando `gain ` zum Einstellen der Lautstärke über den `` Wert (0 bis 1.0). + +[ta3_soundblock|image] + ### TA3 Mesecons Umsetzer / TA3 Mesecons Converter Der Mesecons Umsetzer dient zur Umwandlung von Techage on/off Kommandos in Mesecons Signale und umgekehrt. diff --git a/techage/manuals/manual_ta3_EN.md b/techage/manuals/manual_ta3_EN.md index 983fa7b..82b6f81 100644 --- a/techage/manuals/manual_ta3_EN.md +++ b/techage/manuals/manual_ta3_EN.md @@ -664,6 +664,17 @@ This can also be used to simulate extendable stairs and the like. [ta3_doorcontroller|image] +### TA3 Sound Block + +Different sounds can be played with the sound block. All sounds of the Mods Techage, Signs Bot, Hyperloop, Unified Inventory, TA4 Jetpack and Minetest Game are available. + +The sounds can be selected and played via the menu and via command. + +- Command `on` to play a sound +- Command `sound ` to select a sound via the index +- Command `gain ` to adjust the volume via the `` value (0 to 1.0). + +[ta3_soundblock|image] ### TA3 Mesecons Converter diff --git a/techage/manuals/manual_ta4_DE.md b/techage/manuals/manual_ta4_DE.md index 6ee4f31..15e33cf 100644 --- a/techage/manuals/manual_ta4_DE.md +++ b/techage/manuals/manual_ta4_DE.md @@ -1,4 +1,4 @@ -# TA4: Zukunft +# TA4: Gegenwart Regenerative Energiequellen wie Wind, Sonne und Biokraft helfen dir, das Ölzeitalter zu verlassen. Mit modernen Technologien und intelligenten Maschinen machst du dich auf in die Zukunft. @@ -294,7 +294,8 @@ Hinweis 2: Tanks oder Silos mit verschiedenen Inhalten dürfen nicht zu einem Le Beim Cracken werden lange Kette von Kohlenwasserstoffen unter Verwendung eines Katalysator in kurze Ketten gebrochen. Als Katalysator dient Gibbsitpulver (wird nicht verbraucht). Damit kann Bitumen in Schweröl, Schweröl in Naphtha und Naphtha in Benzin umgewandelt werden. -Bei der Hydrierung werden einem Molekül Paare von Wasserstoffatomen hinzugefügt, um kurzkettige Kohlenwasserstoffe in lange umzuwandeln. Hier wird Eisenpulver als Katalysator benötigt (wird nicht verbraucht). Damit kann Benzin in Naphtha, +Bei der Hydrierung werden einem Molekül Paare von Wasserstoffatomen hinzugefügt, um kurzkettige Kohlenwasserstoffe in lange umzuwandeln. +Hier wird Eisenpulver als Katalysator benötigt (wird nicht verbraucht). Damit kann Propangas in Isobutan, Isobutan in Benzin, Benzin in Naphtha, Naphtha in Schweröl und Schweröl in Bitumen umgewandelt werden. [ta4_reactor|plan] @@ -470,12 +471,40 @@ Beim TA4 Taster/Schalter hat sich nur das Aussehen geändert. Die Funktionalitä [ta4_button|image] +### TA4 2x Taster / 2x Button + +Dieser Block hat zwei Taster, die über das Schraubenschlüssel-Menü individuell konfiguriert werden können. Für beide Taster kann die Beschriftung und die Zielblockadresse konfiguriert werden. Zusätzlich kann für beide Taster das Kommando konfiguriert werden, welches gesendet werden soll. + +[ta4_button_2x|image] + ### TA4 4x Taster / 4x Button Dieser Block hat vier Taster, die über das Schraubenschlüssel-Menü individuell konfiguriert werden können. Für jeden Taster kann die Beschriftung und die Zielblockadresse konfiguriert werden. Zusätzlich kann für jeden Taster das Kommando konfiguriert werden, welches gesendet werden soll. [ta4_button_4x|image] +### TA4 2x Signallampe / 2x Signal Lamp + +Dieser Block hat zwei Lampen, die individuell angesteuert werden können. Jede Lampe kann die Farben "rot", "grün" und "orange" anzeigen. Über das Schraubenschlüssel-Menü kann für beide Lampen die Beschriftung konfiguriert werden. Die Lampen können über folgende Kommandos angesteuert werden: + +- Lampe 1 auf rot schalten: `$send_cmnd(1234, "red", 1)` +- Lampe 2 auf grün schalten: `$send_cmnd(1234, "green", 2)` +- Lampe 1 auf orange schalten: `$send_cmnd(1234, "amber", 1)` +- Lampe 2 aus schalten: `$send_cmnd(1234, "off", 2)` + +[ta4_signallamp_2x|image] + +### TA4 4x Signallampe / 4x Signal Lamp + +Dieser Block hat vier Lampen, die individuell angesteuert werden können. Jede Lampe kann die Farben "rot", "grün" und "orange" anzeigen. Über das Schraubenschlüssel-Menü kann für alle Lampen die Beschriftung konfiguriert werden. Die Lampen können über folgende Kommandos angesteuert werden: + +- Lampe 1 auf rot schalten: `$send_cmnd(1234, "red", 1)` +- Lampe 2 auf grün schalten: `$send_cmnd(1234, "green", 2)` +- Lampe 3 auf orange schalten: `$send_cmnd(1234, "amber", 3)` +- Lampe 4 aus schalten: `$send_cmnd(1234, "off", 4)` + +[ta4_signallamp_4x|image] + ### TA4 Spieler Detektor / Player Detector Beim TA4 Spieler Detektor hat sich nur das Aussehen geändert. Die Funktionalität ist gleich wie beim TA3 Spieler Detektor. @@ -495,28 +524,6 @@ Diesen Zähler kann man über das Kommando 'count' abfragen und über 'reset' zu [ta4_detector|image] -### TA4 Move Controller - -Der TA4 Move Controller ist ähnlich zum "Door Controller 2", aber die ausgewählten Blöcke werden nicht entfernt, sondern können bewegt werden. -Da die bewegten Blöcke Spieler und Mobs mitnehmen können, die auf dem Block stehen, können damit Fahrstühle und ähnliche Transportsysteme gebaut werden. - -Anleitung: - -- Controller setzen und die Blöcke, die bewegt werden sollen, über das Menü an-trainieren (Es können bis zu 16 Blöcke an-trainiert werden) -- die "Flugstrecke" muss über eine x,y,z Angabe (relativ) eingegeben werden (die maximale Distanz beträgt 100 m) -- mit den Menü-Tasten "Bewege A-B" sowie "Bewege B-A" kann die Bewegung getestet werden -- man kann auch durch Wände oder andere Blöcke fliegen -- auch die Zielposition für die Blöcke kann belegt sein. Die Blöcke werden in diesem Falle "unsichtbar" gespeichert. Dies ist für Schiebetüren und ähnliches gedacht -- Über das Gabelschlüssel-Menü kann im Controller auch ein "handover" programmiert werden. Durch Eingabe einer Blocknummer werden die Blöcke dann an den nächsten Move Controller übergeben. So lassen sich auch zusammenhängende Bewegungen über mehrere Move Controller realisieren. - -Der Move Controller unterstützt folgende techage Kommandos: - -- `a2b` Bewege Block von A nach B -- `b2a` Bewege Block von B nach A -- `move` Bewege Block auf die andere Seite - -[ta4_movecontroller|image] - ### TA4 Sequenzer @@ -550,6 +557,56 @@ Das `goto` Kommando wird nur angenommen, wenn der Sequenzer gestoppt ist. + +## Move/Dreh-Controller + +### TA4 Move Controller + +Der TA4 Move Controller ist ähnlich zum "Door Controller 2", aber die ausgewählten Blöcke werden nicht entfernt, sondern können bewegt werden. +Da die bewegten Blöcke Spieler und Mobs mitnehmen können, die auf dem Block stehen, können damit Fahrstühle und ähnliche Transportsysteme gebaut werden. + +Anleitung: + +- Controller setzen und die Blöcke, die bewegt werden sollen, über das Menü an-trainieren (Es können bis zu 16 Blöcke an-trainiert werden) +- die "Flugstrecke" muss über eine x,y,z Angabe (relativ) eingegeben werden (die maximale Distanz beträgt 100 m) +- mit den Menü-Tasten "Bewege A-B" sowie "Bewege B-A" kann die Bewegung getestet werden +- man kann auch durch Wände oder andere Blöcke fliegen +- auch die Zielposition für die Blöcke kann belegt sein. Die Blöcke werden in diesem Falle "unsichtbar" gespeichert. Dies ist für Schiebetüren und ähnliches gedacht +- Über das Gabelschlüssel-Menü kann im Controller auch ein "handover" programmiert werden. Durch Eingabe einer Blocknummer werden die Blöcke dann an den nächsten Move Controller übergeben. So lassen sich auch zusammenhängende Bewegungen über mehrere Move Controller realisieren. + +Der Move Controller unterstützt folgende techage Kommandos: + +- `a2b` Bewege Block von A nach B +- `b2a` Bewege Block von B nach A +- `move` Bewege Block auf die andere Seite + +**Wichtige Hinweise:** + +- Sofern mehrere Blöcke bewegt werden sollen, muss der Block, der die Spieler/Mobs mitnehmen soll, beim Antrainieren als erstes angeklickt werden. +- Hat der Block, der die Spieler/Mobs mitnehmen soll, eine reduzierte Höhe, so muss die Höhe im Controller über das Schraubenschlüsselmenü eingestellt werden (bspw. Höhe = 0.5). Ansonsten wird der Spieler/Mob nicht "gefunden" und damit nicht mitgenommen. + +[ta4_movecontroller|image] + +### TA4 Drehcontroller / Turn Controller + +Der TA4 Drehcontroller ist ähnlich zum Move Controller", aber die ausgewählten Blöcke werden nicht bewegt, sondern um ihr Zentrum nach rechts oder links gedreht. + +Anleitung: + +- Controller setzen und die Blöcke, die bewegt werden sollen, über das Menü an-trainieren (Es können bis zu 16 Blöcke an-trainiert werden) +- mit den Menü-Tasten "Drehe links" sowie "Drehe rechts" kann die Bewegung getestet werden + +Der Drehcontroller unterstützt folgende techage Kommandos: + +- `left` Drehe nach links +- `right` Drehe nach rechts +- `uturn` Drehe um 180 Grad + +[ta4_turncontroller|image] + + + + ## TA4 Lampen TA4 beinhaltet eine Reihe von leistungsstarken Lampen, die eine bessere Ausleuchtung ermöglichen oder Spezialaufgaben übernehmen. @@ -623,9 +680,117 @@ In den Einfüllstutzen muss Rotschlamm mittels einer Pumpe geleitet werden. +## TA4 Teilchenbeschleuniger / Collider + +Der Teilchenbeschleuniger ist eine Forschungsanlage, bei der Grundlagenforschung betrieben wird. Hier können Erfahrungspunkte (experience points) gesammelt werden, welche für TA5 (Future Age) benötigt werden. + +Der Teilchenbeschleuniger muss wie sein Original am CERN in Genf unterirdisch aufgebaut werden. Die Standardeinstellung ist hier Y <= -28. Der Wert kann aber per Konfiguration vom Server Personal geändert werden. Ab besten nachfragen, oder mit dem "TA4 Collider Detector Worker" Block ausprobieren. + +Pro Spieler kann nur ein Teilchenbeschleuniger betrieben werden. Es macht also keinen Sinn, zwei oder mehrere Teilchenbeschleuniger aufzubauen. Erfahrungspunkte werden dem Spieler gutgeschrieben, dem der Teilchenbeschleuniger gehört. Die Erfahrungspunkte können nicht übertragen werden. + +Ein Teilchenbeschleuniger besteht aus einem "Ring" aus Röhren und Magneten sowie dem Detektor mit Kühlanlage. + +- Der Detektor ist das Herz der Anlage. Hier finden die wissenschaftlichen Experimente statt. Der Detektor ist 3x3x7 Blöcke groß. +- Die TA4 Collider Detector Magnete (22 Stück) müssen über jeweils 5 Blöcken der TA4 Vakuumröhre miteinander verbunden werden. Jeder Magnet benötigt zusätzlich Strom und einen Gasanschluss für die Kühlung. Das ganze bildet (wie rechts im Plan abgebildet) ein Quadrat mit einer Kantenlänge von 37 Metern. +- Zusätzlich wird eine Kühlung benötigt, welche zusätzlich beim Detektor aufgebaut werden muss. Für die Kühlung wird Isobutan benötigt. +- Die Anlage benötigt einiges an Strom. Daher ist eine eigene Stromversorgung sinnvoll. + +Der Plan zeigt die Anlage von oben: + +- der graue Block ist der Detektor mit dem Worker-Block in der Mitte +- die roten Blöcke sind die Magnete, das blaue die Vakuumröhren + +[techage_collider_plan|plan] + +### Detektor + +Der Detektor wird mit Hilfe des "TA4 Collider Detector Worker" Blocks automatisch aufgebaut (ähnlich wie beim Bohrturm). Alle dazu notwendigen Materialien müssen zuvor in den Worker-Block gelegt werden. Auf dem Worker-Block ist der Detektor symbolisch dargestellt. Der Detektor wird über dem Worker-Block in Querrichtung errichtet. + +Der Detektor kann mit Hilfe des Worker-Blocks auch wieder abgebaut werden. + +Auf den beiden Stirnseiten des Detektors befinden sich die Anschlüsse für Strom, Gas und Vakuumröhre. Oben muss eine TA4 Pumpe angeschlossen werden, um die Röhre leer zu saugen / das Vakuum zu erzeugen. + +Auf der Rückseite des Detektors muss das Kühlsystem angeschlossen werden. Im Plan rechts ist das Kühlsystem abgebildet. Hier wird neben dem TA4 Wärmetauscher des Energiespeichers (welcher hier zur Kühlung genutzt wird), auch ein TA4 Kühlerblock benötigt. + +Hinweis: Der Pfeil des Wärmetauschers muss vom Detektor weg zeigen. Auch der Wärmetauscher muss mit Strom versorgt werden. + +[ta4_cooler|plan] + +### Steuerung / TA4 Terminal + +Der Teilchenbeschleuniger wird über ein TA4 Terminal gesteuert (nicht über das TA4 Lua Controller Terminal). + +Dieses Terminal muss mit dem Detektor verbunden werden. Die Nummer des Detektors wird als Infotext am Worker-Block angezeigt. + +Das Terminal unterstützt folgende Kommandos: + +- `connect ` (verbinden mit dem Detektor) +- `start` (starten des Detektors) +- `stop` (stoppen des Detektors) +- `test ` (überprüfen eines Magneten) +- `points` (abfragen der bereits erreichten Erfahrungspunkte) + +Tritt beim `start` an einem Magneten ein Fehler auf, so wird die Nummer des Magneten ausgegeben. Über das `test` Kommando können weitere Informationen zum Fehler des Magneten angefordert werden. + +[ta4_terminal|image] + + + +### Aufbau + +Für den Teilchenbeschleunigers wird außer den Blöcken für den Bau folgendes benötigt: + +- Strom (145 ku) +- TA4 Tank mit mindestens 250 Einheiten Isobutan + +Beim Aufbau des Teilchenbeschleunigers empfiehlt sich folgende Reihenfolge: + +- Einen Forceload Block setzen. Nur der Detektor mit der Kühlanlage muss sich im Bereich des Forceload Blockes befinden. +- Den Worker-Block setzen, mit Items füllen und den Detektor über das Menü aufbauen +- Den Ring mit Röhren und Magneten aufbauen +- Alle Magnete und den Detektor mit Stromkabel verbinden +- Alle Magnete und den Detektor mit den gelben Röhren verbinden und das Isobutan mit einer Pumpe in das Röhrensystem pumpen. +- Eine TA4 Pumpe als Vakuumpumpe auf dem Detektor installieren und einschalten (es wird kein zusätzlicher Tank benötigt). Geht die Pumpe in den "standby", ist das Vakuum hergestellt. Dies dauert einige Sekunden +- den Kühler (Wärmetauscher) aufbauen und mit dem Stromkabel verbinden +- Das TA4 Terminal vor den Detektor setzen und über `connect ` mit dem Detektor verbinden +- Die Stromversorgung einschalten/herstellen +- den Kühler (Wärmetauscher) einschalten +- den Detektor über `start` am TA4 Terminal einschalten. Der Detektor geht nach einigen Prüfschritten in den Normalbetrieb oder gibt einen Fehler aus. +- Der Teilchenbeschleunigers muss im Dauerbetrieb laufen und liefert dann nach und nach Erfahrungspunkte. Für 10 Punkte muss der Teilchenbeschleuniger schon einige Stunden laufen. + +[techage_ta4c|image] + + + ## Weitere TA4 Blöcke +### TA4 Rezept Block + +Im Rezept Block können bis zu 10 Rezepte gespeichert werden. Diese Rezepte können dann über ein TA4 Autocrafter Kommando abgerufen werden. Dies ermöglicht eine Rezept-Konfiguration des Autocrafters über ein Kommando. Die Rezepte des Rezept Blocks können auch direkt per Kommando abgefragt werden. + +`input ` liest ein Rezept aus dem TA4 Rezeptblock. `` ist die Nummer des Rezepts. Der Block gibt eine Liste von Rezept-Zutaten zurück. + +Beispiel: `$send_cmnd(1234, "input", 1)` + +[ta4_recipeblock|image] + +### TA4 Autocrafter + +Die Funktion entspricht der von TA3. + +Die Verarbeitungsleistung beträgt 4 Items alle 4 s. Der Autocrafter benötigt hierfür 9 ku Strom. + +Zusätzlich unterstützt der TA4 Autocrafter die Auswahl unterschiedlicher Rezepte über folgende Kommandos: + +`recipe .` schaltet den Autocrafter auf ein Rezept des TA4 Rezept Blocks um. `` ist die Nummer des Rezept Blocks, `` die Rezept-Nummer. Beispiel: `$send_cmnd(1234, "recipe", 5467.1)` + +Alternativ kann ein Rezept auch über die Zutatenliste ausgewählt werden, wie bspw.: +`$send_cmnd(1234, "recipe", "default:coal_lump,,,default:stick")` +Hier müssen alle technische Namen eines Rezeptes durch Kommas getrennt angegeben werden. Siehe auch das Kommando `input` beim TA4 Rezept Block. + +[ta4_autocrafter|image] + ### TA4 Tank / TA4 Tank Siehe TA3 Tank. @@ -638,7 +803,7 @@ In einen TA4 Tank passen 2000 Einheiten oder 200 Fässer einer Flüssigkeit. Siehe TA3 Pumpe. -Die TA4 Pumpe pumpt 8 Einheiten Flüssigkeit alle zwei Sekunden. +Die TA4 Pumpe pumpt 8 Einheiten Flüssigkeit alle zwei Sekunden. Zusätzlich unterstützt die Pumpe das Kommando `flowrate`. Damit kann die Gesamtdurchflussmenge durch die Pumpe abgefragt werden. [ta4_pump|image] diff --git a/techage/manuals/manual_ta4_EN.md b/techage/manuals/manual_ta4_EN.md index 388cd30..d242b3c 100644 --- a/techage/manuals/manual_ta4_EN.md +++ b/techage/manuals/manual_ta4_EN.md @@ -1,4 +1,4 @@ -# TA4: Future +# TA4: Present Renewable energy sources such as wind, sun and biofuels help you to leave the oil age. With modern technologies and intelligent machines you set out into the future. @@ -287,9 +287,9 @@ Note 2: Tanks or silos with different contents must not be connected to a pipe s Cracking breaks long chains of hydrocarbons into short chains using a catalyst. Gibbsite powder serves as a catalyst (is not consumed). It can be used to convert bitumen into fueloil, fueloil into naphtha and naphtha into gasoline. -In hydrogenation, pairs of hydrogen atoms are added to a molecule to convert short-chain hydrocarbons into long ones. -Here iron powder is required as a catalyst (is not consumed). It can be used to convert gasoline into naphtha, -naphtha into fueloil, and fueloil into bitumen. +In hydrogenation, pairs of hydrogen atoms are added to a molecule to convert short-chain hydrocarbons into long ones. +Here iron powder is required as a catalyst (is not consumed). It can be used to convert gas (propane) into isobutane, +isobutane into gasoline, gasoline into naphtha, naphtha into fueloil, and fueloil into bitumen. [ta4_reactor|plan] @@ -463,12 +463,41 @@ Only the appearance of the TA4 button/switch has changed. The functionality is t [ta4_button|image] +### TA4 2x Button + +This block has two buttons that can be individually configured using the wrench menu. The labeling and the target block address can be configured for each button. In addition, the command that is to be sent can be configured for each button. + +[ta4_button_2x|image] + + ### TA4 4x Button This block has four buttons that can be individually configured using the wrench menu. The labeling and the target block address can be configured for each button. In addition, the command that is to be sent can be configured for each button. [ta4_button_4x|image] +### TA4 2x Signal Lamp + +This block has two lamps that can be controlled individually. Each lamp can display the colors "red", "green" and "amber". The labeling for both lamps can be configured via the wrench menu. The lamps can be controlled using the following commands: + +- Switch lamp 1 to red: `$send_cmnd(1234, "red", 1)` +- Switch lamp 2 to green: `$send_cmnd(1234, "green ", 2)` +- Switch lamp 1 to orange: `$send_cmnd(1234, "amber", 1)` +- Switch lamp 2 off: `$send_cmnd(1234, "off", 2)` + +[ta4_signallamp_2x|image] + +### TA4 4x Signal Lamp + +This block has four lamps that can be controlled individually. Each lamp can display the colors "red", "green" and "amber". The labeling for all lamps can be configured via the wrench menu. The lamps can be controlled using the following commands: + +- Switch lamp 1 to red: `$send_cmnd(1234, "red", 1)` +- Switch lamp 2 to green: `$send_cmnd(1234, "green ", 2)` +- Switch lamp 3 to orange: `$send_cmnd(1234, "amber", 3)` +- Switch lamp 4 off: `$send_cmnd(1234, "off", 4)` + +[ta4_signallamp_4x|image] + ### TA4 Player Detector Only the appearance of the TA4 player detector has changed. The functionality is the same as with the TA3 player detector. @@ -488,28 +517,6 @@ This counter can be queried with the 'count' command and reset with 'reset'. [ta4_detector|image] -### TA4 Move Controller - -The TA4 Move Controller is similar to "Door Controller 2", but the selected blocks are not removed, but can be moved. -Since the moving blocks can take players and mobs standing on the block with them, elevators and similar transport systems can be built with them. - -Instructions: - -- Set the controller and train the blocks to be moved via the menu (up to 16 blocks can be trained) -- the "flight route" must be entered via an x, y, z specification (relative) (the maximum distance is 100 m) -- The movement can be tested with the menu buttons "Move A-B" and "Move B-A" -- you can also fly through walls or other blocks -- The target position for the blocks can also be occupied. In this case, the blocks are saved "invisibly". This is intended for sliding doors and the like -- A "handover" can also be programmed in the controller via the open-ended wrench menu. By entering a block number, the blocks are then transferred to the next move controller. In this way, connected movements can also be implemented using several Move Controllers. - -The Move Controller supports the following techage commands: - -- `a2b` Move block from A to B. -- `b2a` Move block from B to A. -- `move` Move block to the other side - -[ta4_movecontroller|image] - ### TA4 Sequencer Entire processes can be programmed using the TA4 sequencer. Here's an example: @@ -542,6 +549,54 @@ The `goto` command is only accepted when the sequencer is stopped. +## Move/Turn Controller + +### TA4 Move Controller + +The TA4 Move Controller is similar to "Door Controller 2", but the selected blocks are not removed, but can be moved. +Since the moving blocks can take players and mobs standing on the block with them, elevators and similar transport systems can be built with them. + +Instructions: + +- Set the controller and train the blocks to be moved via the menu (up to 16 blocks can be trained) +- the "flight route" must be entered via an x, y, z specification (relative) (the maximum distance is 100 m) +- The movement can be tested with the menu buttons "Move A-B" and "Move B-A" +- you can also fly through walls or other blocks +- The target position for the blocks can also be occupied. In this case, the blocks are saved "invisibly". This is intended for sliding doors and the like +- A "handover" can also be programmed in the controller via the open-ended wrench menu. By entering a block number, the blocks are then transferred to the next move controller. In this way, connected movements can also be implemented using several Move Controllers. + +The Move Controller supports the following techage commands: + +- `a2b` Move block from A to B. +- `b2a` Move block from B to A. +- `move` Move block to the other side + +**Important instructions:** + +- If several blocks are to be moved, the block that is to take the players/mobs must be clicked first when training. +- If the block that is supposed to take the players/mobs has a reduced height, the height must be set in the controller using the open-ended wrench menu (e.g. height = 0.5). Otherwise the player/mob will not be "found" and will not be taken away. + +[ta4_movecontroller|image] + +### TA4 Turn Controller + +The TA4 turn controller is similar to the "Move Controller", but the selected blocks are not moved, but rotated around their center to the right or left. + +Instructions: + +- Set the controller and train the blocks to be moved via the menu (up to 16 blocks can be trained) +- The movement can be tested with the menu buttons "Turn left" and "Turn right" + +The turn controller supports the following techage commands: + +- `left` Turn left +- `right` Turn right +- `uturn` Turn 180 degrees + +[ta4_turncontroller|image] + + + ## TA4 Lamps @@ -617,8 +672,117 @@ The red mud must be pumped into the filler pipe. +## TA4 Collider (Particle Accelerator) + +The Collider is a research facility that conducts basic research. Experience points can be collected here, which are required for TA5 (Future Age). + +Like its original at CERN in Geneva, the collider must be built underground. The standard setting here is Y <= -28. The value can, however, be changed by the server personnel via configuration. Please ask or try the "TA4 Collider Detector Worker" block. + +Only one collider can be operated per player. So it makes no sense to set up two or more colliders. Experience points are credited to the player who owns the collider. The experience points cannot be transferred. + +A collider consists of a "ring" made of tubes and magnets as well as a detector with a cooling system. + +- The detector is the heart of the system. This is where the scientific experiments take place. The detector is 3x3x7 blocks in size. +- The TA4 Collider Detector magnets (22 pieces) must be connected to each other via 5 blocks of the TA4 vacuum tube. Each magnet also requires electricity and a gas connection for cooling. The whole thing forms (as shown in the plan on the right) a square with an edge length of 37 meters. +- In addition, cooling is required, which must also be installed at the detector. Isobutane is required for cooling. +- The system requires quite a bit of electricity. Therefore, it makes sense to have your own power supply. + +The plan shows the facility from above: + +- the gray block is the detector with the worker block in the middle +- the red blocks are the magnets, the blue the vacuum tubes + +[techage_collider_plan|plan] + +### Detector + +The detector is set up automatically with the help of the "TA4 Collider Detector Worker" block (similar to the derrick). All of the materials required for this must first be placed in the worker block. The detector is shown symbolically on the worker block. The detector is set up across the worker block. + +The detector can also be dismantled again with the help of the worker block. + +The connections for electricity, gas and vacuum tubes are located on the two front sides of the detector. A TA4 pump must be connected at the top in order to suck the tube empty / to create the vacuum. + +The cooling system must be connected to the rear of the detector. The cooling system is shown in the plan on the right. In addition to the TA4 heat exchanger of the energy storage unit (which is used here for cooling), a TA4 cooler block is also required. + +Note: The arrow on the heat exchanger must point away from the detector. The heat exchanger must also be supplied with electricity. + +[ta4_cooler|plan] + +### Control / TA4 Terminal + +The collider is controlled via a TA4 terminal (not via the TA4 Lua controller terminal). + +This terminal must be connected to the detector. The number of the detector is displayed as info text on the worker block. + +The terminal supports the following commands: + +- `connect ` (connect to the detector) +- `start` (starting the detector) +- `stop` (stop the detector) +- `test ` (checking a magnet) +- `points` (query of the experience points already achieved) + +If an error occurs on a magnet during the `start`, the number of the magnet is output. The `test` command can be used to request further information on the magnet error. + +[ta4_terminal|image] + + + +### Construction + +In addition to the building blocks, the following is required for the collider: + +- electricity (145 ku) +- TA4 tank with at least 250 units of isobutane + +The following sequence is recommended when setting up the collider: + +- Put a forceload block. Only the detector with the cooling system has to be in the area of ​​the forceload block. +- Set the worker block, fill it with items and set up the detector via the menu +- Build the ring with tubes and magnets +- Connect all magnets and the detector with power cables +- Connect all magnets and the detector with the yellow tubes and pump the isobutane into the tube system with a pump +- Install a TA4 pump as a vacuum pump on the detector and switch it on (no additional tank is required). If the pump goes into "standby", the vacuum is established. This will take a few seconds +- assemble the cooler (heat exchanger) and connect it to the power cable +- Place the TA4 terminal in front of the detector and connect it to the detector via `connect ` +- Switch on / connect the power supply +- switch on the cooler (heat exchanger) +- Switch on the detector via `start` on the TA4 terminal. After a few test steps, the detector goes into normal operation or outputs an error. +- The collider has to run continuously and then gradually delivers experience points. For 10 points, the collider has to run for a few hours + +[techage_ta4c|image] + + + + ## More TA4 Blocks +### TA4 Recipe Block + +Up to 10 recipes can be saved in the recipe block. These recipes can then be called up via a TA4 Autocrafter command. This enables the autocrafter's recipe to be configured using a command. The recipes in the recipe block can also be queried directly using a command. + +`input ` reads a recipe from the TA4 recipe block. `` is the number of the recipe. The block returns a list of recipe ingredients. + +Example: `$send_cmnd(1234, "input", 1)` + +[ta4_recipeblock|image] + +### TA4 Autocrafter + +The function corresponds to that of TA3. + +The processing power is 4 items every 4 s. The autocrafter requires 9 ku of electricity for this. + +In addition, the TA4 Autocrafter supports the selection of different recipes using the following commands: + +`recipe .` switches the autocrafter to a recipe from the TA4 Recipe Block. `` is the number of the recipe block, `` the recipe number. Example: `$send_cmnd(1234, "recipe", 5467.1)` + +Alternatively, a recipe can also be selected via the list of ingredients, such as: +`$send_cmnd(1234, "recipe", "default:coal_lump,,,default:stick")` +All technical names of a recipe must be specified here, separated by commas. See also the command `input` in the TA4 recipe block. + +[ta4_autocrafter|image] + ### TA4 Tank See TA3 tank. @@ -631,7 +795,7 @@ A TA4 tank can hold 2000 units or 200 barrels of liquid. See TA3 pump. -The TA4 pump pumps 8 units of liquid every two seconds. +The TA4 pump pumps 8 units of liquid every two seconds. The pump also supports the `flowrate` command. This means that the total flow rate through the pump can be queried. [ta4_pump|image] diff --git a/techage/manuals/manual_ta5_DE.md b/techage/manuals/manual_ta5_DE.md new file mode 100644 index 0000000..8fe44f1 --- /dev/null +++ b/techage/manuals/manual_ta5_DE.md @@ -0,0 +1,101 @@ +# TA5: Zukunft + +Maschinen zur Überwindung von Raum und Zeit, neue Energiequellen und andere Errungenschaften prägen dein Leben. + +Für die Herstellung und Nutzung von TA5 Maschinen und Blöcken sind Erfahrungspunkte (experience points) notwendig. Diese können nur über den Teilchenbeschleuniger aus TA4 erarbeitet werden. + +[techage_ta5|image] + +## Energiequellen + +### TA5 Fusionsreaktor (geplant) + +## Energiespeicher + +### TA5 Hybrid-Speicher (geplant) + +## Logik Blöcke + +## Transport und Verkehr + +### TA5 Flug Controller + +Der TA5 Flug Controller ist ähnlich zum TA4 Move Controller. Im Gegensatz zum TA4 Move Controller können hier mehrere Bewegungen zu einer Flugstrecke kombiniert werden. Diese Flugstrecke kann im Eingabefeld über mehrere x,y,z Angaben definiert werden (eine Bewegung pro Zeile). Über "Speichern" wird die Flugstrecke geprüft und gespeichert. Bei einem Fehler wird eine Fehlermeldung ausgegeben. + +Mit der Taste "Test" wird die Flugstrecke mit den absoluten Koordinaten zur Überprüfung im Chat ausgegeben. + +Die maximale Distanz für die gesammte Flugstrecke beträgt 500 m. + +Die Nutzung des TA5 Flug Controllers benötigt 40 Erfahrungspunkte. + +[ta5_flycontroller|image] + +### TA5 Hyperloop Kiste / TA5 Hyperloop Chest + +Die TA5 Hyperloop Kiste erlaubt den Transport von Gegenständen über ein Hyperloop Netzwerk. + +Die TA5 Hyperloop Kiste muss man dazu auf eine Hyperloop Junction stellen. Die Kiste besitzt ein spezielles Menü, mit dem man das Pairing von zwei Kisten durchführen kann. Dinge, die in der Kiste sind, werden zur Gegenstelle teleportiert. Die Kiste kann auch mit einem Schieber gefüllt/geleert werden. + +Für das Pairing musst du zuerst auf der einen Seite einen Namen für die Kiste eingeben, dann kannst du bei der anderen Kiste diesen Namen auswählen und so die beiden Blöcke verbinden. + +Die Nutzung der TA5 Hyperloop Kiste benötigt 20 Erfahrungspunkte. + +[ta4_chest|image] + +### TA5 Hyperloop Tank / TA5 Hyperloop Tank + +Der TA5 Hyperloop Tank erlaubt den Transport von Flüssigkeiten über ein Hyperloop Netzwerk. + +Den TA5 Hyperloop Tank muss man dazu auf eine Hyperloop Junction stellen. Der Tank besitzt ein spezielles Menü, mit dem man das Pairing von zwei Tanks durchführen kann. Flüssigkeiten, die in dem Tank sind, werden zur Gegenstelle teleportiert. Der Tank kann auch mit einer Pumpe gefüllt/geleert werden. + +Für das Pairing musst du zuerst auf der einen Seite einen Namen für den Tank eingeben, dann kannst du bei dem anderen Tank diesen Namen auswählen und so die beiden Blöcke verbinden. + +Die Nutzung des TA5 Hyperloop Tanks benötigt 20 Erfahrungspunkte. + +[ta4_tank|image] + +### Hyperloop Teleport Blöcke (geplant) + +Die Hyperloop Teleport Blöcke erlauben den Aufbau von Hyperloop Netzwerk ohne Hyperloop-Röhren. + +Die Nutzung der Hyperloop Teleport Blöcke benötigt 120 Erfahrungspunkte. + +### TA5 Container (geplant) + +Der TA5 Container erlaubt Techage Anlagen ein- und an einer anderen Stelle wieder auszupacken. + +Für die Nutzung des TA5 Containers werden 80 Erfahrungspunkte benötigt. + +### TA5 Teleport Block Gegenstände / TA5 Teleport Block Items + +Teleportblöcke erlauben den Item-Transport ohne Röhren bis zu einer Entfernung von 200 Blöcken. +Für das Pairing musst du zuerst auf der einen Seite einen Namen für den Block eingeben, dann kannst du bei dem anderen Block diesen Namen auswählen und so die beiden Blöcke verbinden. + +Teleportblöcke benötigen jeweils 12 ku Strom. + +Für die Nutzung der Teleportblöcke werden 60 Erfahrungspunkte benötigt. + +[ta5_tele_tube|image] + +### TA5 Teleport Block Flüssigkeiten / TA5 Teleport Block Liquids + +Teleportblöcke erlauben den Flüssigkeiten-Transport ohne Leitungen bis zu einer Entfernung von 200 Blöcken. +Für das Pairing musst du zuerst auf der einen Seite einen Namen für den Block eingeben, dann kannst du bei dem anderen Block diesen Namen auswählen und so die beiden Blöcke verbinden. + +Teleportblöcke benötigen jeweils 12 ku Strom. + +Für die Nutzung der Teleportblöcke werden 60 Erfahrungspunkte benötigt. + +[ta5_tele_pipe|image] + +### TA5-Raumgleiter (geplant) + +Dank einem Spezialantrieb für Lichtgeschwindigkeit können mit dem Raumgleiter auch große Entfernungen sehr schnell überwunden werden. + +## Weitere TA5 Blöcke/Items + +### TA5 KI Chip / TA5 AI Chip + +Der TA5 KI Chip wird teilweise zur Herstellung von TA5 Blöcken benötigt. Der TA5 KI Chip kann nur auf der TA4 Elektronik Fab hergestellt werden. Dazu werden 10 Erfahrungspunkte benötigt. + +[ta5_aichip|image] \ No newline at end of file diff --git a/techage/manuals/manual_ta5_EN.md b/techage/manuals/manual_ta5_EN.md new file mode 100644 index 0000000..5877f5b --- /dev/null +++ b/techage/manuals/manual_ta5_EN.md @@ -0,0 +1,97 @@ +# TA5: Future + +Machines to overcome space and time, new sources of energy and other achievements shape your life. + +Experience points are required for the manufacture and use of TA5 machines and blocks. These can only be worked out using the collider from TA4. + +[techage_ta5|image] + +## Energy Sources + +### TA5 Fusion Reactor (planned) + +## Energy Storage + +### TA5 Hybrid Storage (planned) + +## Logic blocks + +## Transport and Traffic + +### TA5 Flight Controller + +The TA5 Flight Controller is similar to the TA4 Move Controller. In contrast to the TA4 Move Controller, several movements can be combined into one flight route. This flight route can be defined in the input field using several x,y,z entries (one movement per line). The flight route is checked and saved via "Save". In the event of an error, an error message is issued. + +With the "Test" button, the flight route with the absolute coordinates is output for checking in the chat. + +The maximum distance for the entire flight distance is 500 m. + +The use of the TA5 Flight Controller requires 40 experience points. + +[ta5_flycontroller|image] + +### TA5 Hyperloop Chest + +The TA5 Hyperloop Chest allows objects to be transported over a Hyperloop network. + +The TA5 Hyperloop Chest has to be placed on a Hyperloop Junction. The chest has a special menu, with which you can pair two chests. Things that are in the chest are teleported to the remote station. The chest can also be filled/emptied with a pusher. + +For pairing you first have to enter a name for the chest on one side, then you can select this name for the other chest and thus connect the two blocks. + +The use of the TA5 Hyperloop Chest requires 20 experience points. + +[ta4_chest|image] + +### TA5 Hyperloop Tank + +The TA5 Hyperloop Tank allows liquids to be transported over a Hyperloop network. + +The TA5 Hyperloop Tank has to be placed on a Hyperloop Junction.The tank has a special menu, with which you can pair two tanks. Liquids in the tank will be teleported to the remote station. The tank can also be filled/emptied with a pump. + +For pairing you first have to enter a name for the tank on one side, then you can select this name for the other tank and thus connect the two blocks. + +The use of the TA5 Hyperloop Tank requires 20 experience points. + +[ta4_tank|image] + +### Hyperloop Teleport Blocks (planned) + +The Hyperloop Teleport Blocks allow the construction of a Hyperloop network without Hyperloop tubes. + +The use of the Hyperloop Teleport Blocks requires 120 experience points. + +### TA5 Container (planned) + +The TA5 container allows Techage systems to be packed and unpacked at another location. + +80 experience points are required to use the TA5 container. + +### TA5 Teleport Block Items + +Teleport blocks allow items to be transported without tubes up to a distance of 200 blocks. +For pairing you first have to enter a name for the block on one side, then you can select this name for the other block and thus connect the two blocks. + +Teleport blocks each require 12 ku of electricity. + +60 experience points are required to use the Teleport blocks. + +[ta5_tele_tube|image] + +### TA5 Teleport Block Liquids + +Teleport blocks allow liquids to be transported without pipes up to a distance of 200 blocks. +For pairing you first have to enter a name for the block on one side, then you can select this name for the other block and thus connect the two blocks. + +Teleport blocks each require 12 ku of electricity. + +60 experience points are required to use the Teleport blocks. + +[ta5_tele_pipe|image] + +## More TA5 Blocks / Items + +### TA5 AI Chip + +The TA5 AI Chip is partly required for the production of TA5 blocks. The TA5 AI Chip can only be manufactured at the TA4 Electronics Fab. This requires 10 experience points. + +[ta5_aichip|image] \ No newline at end of file diff --git a/techage/manuals/markdown2formspec.py b/techage/manuals/markdown2formspec.py index 76c7cb4..86bb605 100644 --- a/techage/manuals/markdown2formspec.py +++ b/techage/manuals/markdown2formspec.py @@ -247,6 +247,7 @@ parse_md_file("./manual_ta1_DE.md", mod, manual) parse_md_file("./manual_ta2_DE.md", mod, manual) parse_md_file("./manual_ta3_DE.md", mod, manual) parse_md_file("./manual_ta4_DE.md", mod, manual) +parse_md_file("./manual_ta5_DE.md", mod, manual) gen_lua_file("../doc/manual_DE.lua") gen_toc_md_file("./toc_DE.md", "Inhaltsverzeichnis") @@ -259,6 +260,7 @@ parse_md_file("./manual_ta1_EN.md", mod, manual) parse_md_file("./manual_ta2_EN.md", mod, manual) parse_md_file("./manual_ta3_EN.md", mod, manual) parse_md_file("./manual_ta4_EN.md", mod, manual) +parse_md_file("./manual_ta5_EN.md", mod, manual) gen_lua_file("../doc/manual_EN.lua") gen_toc_md_file("./toc_EN.md", "Table of Contents") diff --git a/techage/manuals/ta4_lua_controller_EN.md b/techage/manuals/ta4_lua_controller_EN.md index b50b953..51bf2a7 100644 --- a/techage/manuals/ta4_lua_controller_EN.md +++ b/techage/manuals/ta4_lua_controller_EN.md @@ -134,7 +134,8 @@ SaferLua directly supports the following standard functions: - string.rep - string.sub - string.upper -- string.split +- string.split (result is an Array) +- string.split2 (result are multiple returns like the Lua function unpack) - string.trim For own function definitions, the menu tab 'func' can be used. Here you write your functions like: @@ -366,12 +367,14 @@ Please note, that this is not a technical distinction, only a logical. | "depth" | number | Read the current depth value of a quarry block (1..80) | | "load" | number | Read the load value in percent (0..100) of a tank, silo, accu, or battery block, or from the Signs Bot Box. Silo and tank return two values: The percentage value and the absolute value in units.
Example: percent, absolute = $send_cmnd("223", "load") | | "delivered" | number | Read the current delivered power value of a generator block. A power consuming block (accu) provides a negative value | +| "flowrate" | Total flow rate in liquid units | Only for TA4 Pumps | | "action" | player-name, action-string | Only for Sensor Chests | | "stacks" | Array with up to 4 Stores with the inventory content (see example) | Only for Sensor Chests | | "count" | number | Read the item counter of the TA4 Item Detector block | | "count" | number of items | Read the total amount of TA4 chest items. An optional number as `add_data` is used to address only one inventory slot (1..8, from left to right). | | "itemstring" | item string of the given slot | Specific command for the TA4 8x2000 Chest to read the item type (technical name) of one chest slot, specified via `add_data` (1..8).
Example: s = $send_cmnd("223", "itemstring", 1) | | "output" | recipe output string,
e.g.: "default:glass" | Only for the Industrial Furnace. If no recipe is active, the command returns "unknown" | +| "input" | `` | Read a recipe from the TA4 Recipe Block. `` is the number of the recipe. The block return a list of recipe items. | @@ -385,19 +388,25 @@ Please note, that this is not a technical distinction, only a logical. | -------------------------------- | ------------ | ------------------------------------------------------------ | | "on", "off" | nil | turn a node on/off (machine, lamp,...) | | "red, "amber", "green", "off" | nil | set Signal Tower color | -| "port" | `=on/off` | Enable/disable a Distributor filter slot..
Example: `yellow=on`
colors: "red", "green", "blue", "yellow" | +| "red, "amber", "green", "off" | lamp number (1..4) | Set the signal lamp color. Valid for "TA4 2x Signal Lamp" and "TA4 4x Signal Lamp" | +| "port" | string
`=on/off` | Enable/disable a Distributor filter slot..
Example: `"yellow=on"`
colors: red, green, blue, yellow | | "text" | text string | Text to be used for the Sensor Chest menu | | "reset" | nil | Reset the item counter of the TA4 Item Detector block | | "pull" | item string | Start the TA4 pusher to pull/push items.
Example: `default:dirt 8` | | "config" | item string | Configure the TA4 pusher.
Example: `wool:blue` | | "exchange" | inventory slot number | place/remove/exchange an block by means of the TA3 Door Controller II (techage:ta3_doorcontroller2) | - - - -* `$display(num, row, text)` Send a text string to the display with number _num_. _row_ is the display row, a value from 1 to 5, or 0 to add the text string at the bottom (scroll screen mode). _text_ is the string to be displayed. If the first char of the string is a blank, the text will be horizontally centered. -* `$clear_screen(num)` Clear the screen of the display with number _num_. -* `$position(num)` Returns the position as string "'(x,y,z)" of the device with the given _num_. - +| "a2b" | nil | TA4 Move Controller command to move the block(s) from position A to B | +| "b2a" | nil | TA4 Move Controller command to move the block(s) from position B to A | +| "move" | nil | TA4 Move Controller command to move the block(s) to the opposite position | +| "left" | nil | TA4 Turn Controller command to turn the block(s) to the left | +| "right" | nil | TA4 Turn Controller command to turn the block(s) to the right | +| "uturn" | nil | TA4 Turn Controller command to turn the block(s) 180 degrees | +| "recipe" | `,,...` | Set the TA4 Autocrafter recipe.
Example for the torch recipe: `default:coal_lump,,,default:stick`
Hint: Empty fields may only be left out at the end of the item list! | +| "recipe" | `.` | Set the TA4 Autocrafter recipe with a recipe from a TA4 Recipe Block.
`` is the TA4 Recipe Block number
`` is the number of the recipe in the TA4 Recipe Block | +| "goto" | `` | Start command for the TA4 Sequencer. `` is the time slot like `[1]` where the execution starts. | +| "stop" | nil | Stop command for the TA4 Sequencer. | +| "gain" | volume | Set volume of the sound block (`volume` is a value between 0 and 1.0) | +| "sound" | index | Select sound sample of the sound block | ### Server and Terminal Functions @@ -414,25 +423,27 @@ In contrast the Controller can send text strings to the terminal. - `$get_term()` - Read a text command received from the Terminal - `$put_term(num, text)` - Send a text string to the Terminal. _num_ is the number of the Terminal. - -### Further Functions +### Communication between Lua Controllers Messages are used to transport data between Controllers. Messages can contain arbitrary data. Incoming messages are stored in order (up to 10) and can be read one after the other. + * `$get_msg([raw])` - Read a received message. The function returns the sender number and the message. (see example "Emails"). If the _raw_ parameter is not set or false, the message is guaranteed to be a string. * `$send_msg(num, msg)` - Send a message to another Controller. _num_ is the destination number. (see example "Emails") -* `$chat(text)` - Send yourself a chat message. _text_ is a text string. +### Further Functions +* `$chat(text)` - Send yourself a chat message. _text_ is a text string. * `$door(pos, text)` - Open/Close a door at position "pos". Example: `$door("123,7,-1200", "close")`. Hint: Use the Techage Info Tool to determine the door position. - * `$item_description("default:apple")` Get the description (item name) for a specified itemstring, e. g. determined via the TA4 8x2000 Chest command `itemstring`: `str = $send_cmnd("223", "itemstring", 1)` `descr = $item_description(str)` - +* `$display(num, row, text)` Send a text string to the display with number _num_. _row_ is the display row, a value from 1 to 5, or 0 to add the text string at the bottom (scroll screen mode). _text_ is the string to be displayed. If the first char of the string is a blank, the text will be horizontally centered. +* `$clear_screen(num)` Clear the screen of the display with number _num_. +* `$position(num)` Returns the position as string "'(x,y,z)" of the device with the given _num_. ## Example Scripts @@ -662,7 +673,7 @@ loop() code: -- read from Terminal and send the message s = $get_term() if s then - name,text = unpack(string.split(s, ":", false, 1)) + name,text = string.split2(s, ":", false, 1) num = $server_read(SERVER, name) if num then $send_msg(num, text) diff --git a/techage/manuals/ta4_lua_controller_EN.pdf b/techage/manuals/ta4_lua_controller_EN.pdf index 73fca672f0b741fa56562d3f1a4f5cfd8c684a66..c030a4bde48fb58e2a75f2f18e423e0c10514f4d 100644 GIT binary patch delta 220052 zcma&Mb97}-@GlxW6HlB>Y}>Y-iEY~_wr$(ClZkEHwv)M;@9*CC?s|W{wRW%S`c!q* z*?p?3wO8lR<{!~xH)$9c8Q2-vm>8IusOag*z8?x0IvHCdVSOj#U*y7^jP#5Q|F22| z4DdD-FiXN2bjS}DdR|@_V;dt|0}B{N#)LdLfrMTd4q&!~H<(a(j{i%>{4JA7*np+` zmchY=fUq$nBz+SOh6FtLAW#;1mW1N}C~E@kk6=(12Bw6TAKy3wdjcQAH_ynFF!GNw zF(fD;{-f*(YlxwsEX*tk#z-NcEG&!-*GR#@pbqcV32rFbfF@giL z%m~rP*MZdQU+z1O8u;t;>D#y0c3l7h{?zuh=i2ctR*BEgPmYr4?csO3&1?NBhp&yH zH=un8O)1@Bz|?CPI$tZqkY>lz=Of3R+cYK}hmPas`I6^G1PlkOZambd#%6M0^13$WbT*X=Y|KO?vO~RvEf)1I!ad90}Qs; zhuVkD!pB*sePW!o9LUeLWa>syw~ydzXNzSvmfzn~07>z-MP61RRE~7l#UZZmEU7Uj zk`b)eecKsj3MgUdrq4}ZSY-acL5{Vt__XJ`nCD4yq}!i4->`h-T-U};02$h8%$T)3;AAT0<`5G$)#fWb-*k zl0puev35|A<3XRdxQLP~TA53(mph~{Id+kN3V=@d`WT+TXYOv@Vvmg*PcPwxfpV#y94`G!UsE;Unbtqn>W zz?-ZGh$56G?i?A(T36kJ2TB!J|=1OA0pAN(G zc=?G`(y$mXTbMK6@WIwf;!B2SR1cOf0OnoPVC$MN&4`R?2;aJC58j(T{|CI>zaJj@ zqHVmMw!nYm-|=goC|}wmTy??secl*+IhQBX9b{;;?)71LiL)NW-Ny-(pCJ!Q{Io!$ zakQW%g9Wk)27c+HGzleNmg;QATm;KE6Fvsp7l}i3+r^rWY(sUF;W$TtbBMYq0c0~^ z>#9A}DdPR;a1Jo<*!peCsw+T5(i=7Xtrjg$GFugiL3P8 zsTicg1sHFF0=R{ARzC%2M|MAn+S5rxcyPC!nH}69#Ska2i_T{xOl#c)#t`d=XzX^YXTQmX~}T3^fD$}_WeF45Xm){U-8G3oLK=w~K# zH!h>5`P;tpGflGOVn%wV?Ws!o4?Ov)q@`s0vDYQ>qGoVDX?t1PAOI%^nn&4sleWV( zWXG(_6pIMA>r~gD>OYORfXl&dla=~jT&pWuNP2%-I(qb2Y7EuoJ~Q8v>UQt1vi5Vn z9$8y8Idjn5D7;%^#1YNa)WKe0D!r9jBt);J8HEnJUTNb zcW|C!f&fm5j10tXdNUn^_7OWhiVB2+=upAeik>l|V&{w=qG_kRA)@yM5K}3Ijyf|r z^H%$h+d1cLxLXD*jE*krYUMd*G^@dG>Xkb0&(=0SHReECbmlZ#0cN^b)^vmA3A4tO z9~~-GrJuv=L;y!Mr7%QINo6`Sp!*!!&cc|=N>W%wcx>91WvDrn4 zP80e z__z%;v;$E7xCNgsOjj!fmNlb++I9@OI2aT{S8wg;*_k2h21HE9FPcK%|L*rn&RlVq z=9N-kprJndiRBC%(HIi}c{{gM*$VbhE9W-g1$&ofvsq5{< zcM0pr$p3uB{m;LM`9Ee~X)r&MKbA^6aANAI?0P7VXltU{VxZVbau5xNz5A$0Xxz|T z{naFi-HMDegzA>}6lX#BrX1N;`x-?j3%@Uzz>P%~9NQkgLH|1{DRlg_ zW{jY80Go5!H!#dhSeHcuHj6#LHD{14XO&#fDsDx{pC4qokb`GTWG5zgctn6+f!y4XW8f7bfDf)%Qg!uX z3`Fr%ePL)u6)%(Q&g*ms3QX|YaWau;rlw^w=q;H?YOpL38>na|WG=c245~u0YOD9H zI3>>)DOQpV`((!qY-HdaOBH70cya)MIYOm)I0VB$f*gh@cK!Mz{&9X_XvoJN4kX%d zR?ZkRE?zq>-%9SOAk8aX7%O4V>Gs1|uB|QmigK*(d3D6!1UK@?^{ia;m~0`TAXzJX zdqc`@zWQ=l!STe2C)bs)fYsH)5TBmczl=xt((&S}`wBD1)Kf}4DF#4NSYF6dIF`3M z%EdCGNaxjZjt{JCsSU zrFVrD%$R{y%yJ(jLIeb|? z8G#B(ePUhwax5hmGC)yE zOb`3XxX4CVE5!WT+i$)-+xmD`$uh-VspW5=^gdEHh zpRISMi!S#Ez2_eAlQ9^lAYg51VpnRvqv#+4?Xd4!++lPOKtMap@=jfLgaTy_E!fFe zu$_@eTVGraV-9{k-F^*bG8`6^^8jn6j~I+y5o0cI12{)o%-6`+x4m9an`6?5zkTk4 zBGFz|E@8MowwgJjJGcIRGOn7wkSf|JCg?v?oO4N-r(>Z`-(GjcO~?H&$6~AP3Ypq+ zyXXsr0Okd_E|ZZzJ6bpTLBQQ-`#d4r(d|5O`NdJB=_ z@H=vp)L46zi3Apo$Naau?@g`cR6T@Is+rGy07^5TsYj4p?CskO^SV4BIn!}6d}fli zkvj33`RF7xvr-Pk9twNu#T1X+Simbw5XmGmN_+9eO{ys_)Sx;-VN&VE!tuov?$A0| zNd74Y#XI11Cq76aXS`0C&F`982G0{C($9M%%^Y5_u|W{Oq+p5UFMitl22(QwYhRrz z0-g{%$jv3@iTfhrQ+7oDnICM&P#fA28I`(;&pc1h_D{Jd zTA?L&!z}T)ZY?&i_1Rcub_4$I&Db5|@A;KLVxB)_Gaul4Lb7~#!4WY;JZmfRu!;QJ zQbx>zU{u5lD^y||iEOg1?=y1^@&!Eea*te+$f7QEvl`$@V|>DG>$ zr~D4aD&@5Jt5}6_7Nh^2!`b9s3Y@+yKh)J-ip4+fn#)&0HrSQ8pJB|?bE;|ft2ajV z3aB{gbz2vKc5|5V#wPN8b?wQc#?(LC#fIj+A;ybWQ$%W*L1i|PQEj#{<_W<4+}O{5 zUZtHqu6*V`s8AYcqBbkmjt~}>$U|@_=B&*UWT2HCLiL5%i zGq2O=Cor+N=X8|x-ag^^yqJ*#Nm~VGd{?WOG&&isL9R~)NTaQkHsKsURisdzO`KEo zz&VutwC9xzHH~P+`F3(D3M-vy2`jDrD;nQ*W#NiK&8#00W>G&n`e;NN z^CYRbyjkH{8g;zheP{2psONSSb_vuS${ zF(=UF^0(t7io8ev%*i^`9W2GCAxqFEu`BSx3XJ^&buCTLN+r$>;;eQOMB zU9^w;ySDcBdtr=Go24#A!Y7-lLQkXugRaN+qz3+)XZS6s3T6-jHpUEAmVBz{Sl39` zroNWqcz`Ds#X4A|v3fhnGLbTyTeQ z&i?a~O9;fs_bW>`ZmPxp6HuZ_-28$UBFK23;0uTf!ifJ(Jo1I zx%lcg_n-hXQA(?{PE<2}Z~BH@FiyYF>CwO2L6`?%azZ%aP0`w*0XU~#9UI!#B11l!Caf-m@Zwp zVo={uKS6R>250nE%NcV@QzBKR4xu=v3^6A5dyHSQg9t=@RUw&Cp4W&1ltSim0m1lJ z(NYFwe85BW`~xHhzTme~));@16U76@*5v9*Gk)~rX668D^YEL271a~VKsNZ5o~tW| zF96NS-LK2nsIR{LhbV04IDZS_-?y>ChYlXYP#tWBayR^L|JCLYZG8$0xtZ$i-Ni6D zap`xL!OHJ#$g^WP{EbS6-T9sca*;N6uj$+|O~b`LXPgE1E>vc_-5W_X$=Z+%g7*Z$ zp1|j`YvLUHsg8OE)fGzOsV9c#FvTb90HCE1{w=$e!g|Jakj6Zqo5)52n=&pd_9VrY znv7Ut$<#Elm6xkv;W3mLnuD-RIGIiPE}e}W=|1>;6+MD^7bHSrI&WyMm*r9mtCu7l z7Q|#ilVBUsIwSHIEt|O@Tugk3+jb*ZnBS=qQ%La*gJWqSiKBR&(GQBbiM;sb2><~& zS|1DlF_#k`>j-)51VK;}XRdHE$F~;_VkPHP#t_ut31FL+3H?->cr5&3 zz(kMa06{7^)hj%LnF_@LigGm`_{x~(l{V2Wok|yw2d5BX4)3iW7Che@sn1ype`AXb zBBoytR^smf2}wMWG`cfp$_@sg)gJUPZG9I8!{;C}Q{3XC#Jrey+H!0mc;k07?)`Anz zq%@MEdttBRX_y26Br)ttt!mC_@5Ir6UeMSc#CrFUk(@?9h04{pbX|wAaZ<(YB*de8 z#b@m#AftPI?~yF2?8BM>N#ZvWqp-XzggZ)Iwu5Ayxz`__Y;}2ss9uk?~Uj1+^mHLZL`GvFZu2m9`w-SXal&*gKYZu@Vk% zjFX%2Ug6C{DP83V%VEm<&|*6awt@4CDGE*~2$|vA^*#dcBNXy}WEg%*J@B#--LZq7 z91yZnGPnNhn9E^+|J@>B{>+pT?+|7Iw8CZ?OK}#RU|$llzK#X%4$fWwS&HP3B2W0Z zyVPxmT=*Z3%BDRjiW)s89bK~3ZfpCu^2tx%=bsldx~|@SZr7}T^ze)pjBpIrN?ks-s%b|-I`NyG)F-R4rNEIck%+#>WRHMa^IRrIw!^q?I z-SrG2<_dzZ7h7&yu4c>K)+V~A<+bqI*g_6w#&OkyZF}#n|LhIK(c7=Bn_pXZu>j#Hhn~0v zzxvnsAA+l^7fqMD56c(2->_%AbPOpZZYa^H6cTR+SYqQLO$j+8BU}5_T{~xK46CyK z+wtsq+r%>aC7R;aMYwC~SuuW!zr8oVWP-0h$=jdqO{|bJ+txWzeRWp?n*lYxvD;dLLLNNf<&CGV}~-dIvVWi8IPf`&e5&A}yT}buL0CgTFV`;J2_^ z{{ujgh1c^B74)lk{i}HI3L4*xydi@MyGYIRbuH2noUPj0AMb$%OXWaWf~$%_IU%BZ z%UJu>crt2wRCkv#AUTpYt;GOKhC*6oicw@ZeoE-FJ*g2jJ^8K zo_E)(hG*m$eo=3SK_IFueHGUyeB@sc_mFdWr{>mv75Beoz?|DsR`!(rW8MM(aY_KC zwD*h~|L)K0ycxx--z8t9TKX+~2Sw|Y4%Q~{AdEmj3RvoJ25fr3XqX^=jL%Nyp1!4m zSeY=Ec9dK)bpJ?YU)c>r$^XVW`^st|O6oJR$pR@21C;dPWrNt*(dKrP#RHUfzZn*G zw51(o7Z`cKcQp;9gX1rR?_A3lo`~j&?xOeaN^;sKhg28NyL(GK%RQnJPP^8gTADUq z@mUR8fY&Fun5Vx^@2$mTKA-#R zd|!Cy`<2rlFZ;Ts(q(I}Y6*%Rb&tn0De#S8NnXumsqKr=X0v3RAsDg%|JJ z4;2B@kL?9n=ILa#s#VAE%T#;VSfqVQAm?mNJ;UuNZ~7gyI(m##w& zMd!Nf?`_n5CLFeODT#U0vovM>j@qip#~&5tm!t@UAw)EPUoUyH_m=Vm*f_M^=rN>B znsRnMvR{8K6W{P!v^jz*nKXPv!IHbSPR{{$DgrfOa!seCU|Mq^IhYOewA47Thn6qx z-&mfoPxJPDw2~sqE@jxz<-n1|YdWJ>_>oEO@4*t>C>|6gtlA%sJPu|EU=}hMD5~$6 zp6{t$+c&S5?`4$>sg6C4P}_LFlF(ToiYlx^)v}ZFvpz7X6tmUf7LZ#hQPR(x7vTV7 z1k~BfWmvWv#5a{LT z6`3bP5V3yqN?_EOPp9BM=@I!mK6wVB`0kNSP1p4~?IZEyA&V9T3L`s6g+JxhJvKN! zdVncYB~kDbsKf&%XCTam;<%73%tAn@(L~aCY00(#(5%MC&|&AVnmc z++hF>TNXhP9OJOx0`wI3j)DAgvM7&QK8cVP>3$5}^!Ak|MY)VQ@yoFV*5g+bvO08F zf1%DZ=9~7zvj_{PKNXe2hN4jR)ahj4G1Kw*xWviishGWrsYJ_9?ssJ;;8`P}h6Fj(#I?m2pgj{*H16z`-at1S!>vfJG;l0@c& zPQMKg-3Oy;gc4)HQ<6Nl3`9x7q7KYu zYH{|_X&S^ej-xL$^Jv5j{H@EoceY~=7dnr$q;+q`1qqn%-7%*3W;rCl&#%3goN-cr z5S~QHDPMp-G31f{Y;tBzuu=8&H-$*v(|#cxvPvQruepYaeEnMg?j@MM%yP13 z#)X%ZCE-ZA-)^Gj445vt1~m} zZVXV~Q;HV5YKH;6CoJ6n(~wS*u(H$5-LvO->DvoS|mT9;s z_|Mr4?6;A}qu^_j!kLh(8)Ib2D%V+3BXNFN{1YWt4toyX)IcM(ra|{Gp9_8@R8L`; zsi!79i~UfXoQ^yL!BMbGNcR9c&8|G2)VfJ|iIpR9miY93bf;(qPiAJ*8z7PATXIF<|F-~ zVMc0cRgex^>y*Tgs*5;Qqzt8tIQ7qu5jspEpEQJNx=Ys`T2;gw94`txLKMW61Qqbq zWECulv~tMR^%){Yo*9n%etrCdn1Ogf`acWVdJdFLh|(54;^4}_&ujgZu`#|Vao7oS z?6r#|wos&gT>fcy!FtH80Ay(piSz<#u!Nl;z2Zt2*;SN@MBKi{klCsokrRJ+l2jp& z<3)EV`VdvE($X(2^|WejsB-OMJ#hb3nGd`^VihlvKH}3vy}1?>!c+Q_=3q)V zkW8%Y+$Jsaalv?)UhzDNG!^V9TsLM}%xD<%Xn9~E44N-JhOcVb!l=A~lo<8D4=J|v!0+A_cGn+}gkcq$q6HW@eMHgDE zC--oPlVAhn_M+54fFpc`aq_^7)wb{*z`HmnM4Fn7k6yP1f#$=OEA|Tsh1D+E-#HA!=wIkDe?ktIHLTY+Lsf601 z-{vHF*cuWi$*S?^wq_(^qk>e>8?%z(JxQt#^3{#;Gc;8Pt;xjS10co3q67ZUa_;`Z@Slayuq~+L`N1{mkU!mQ&T= z4Hx_WD(kny=jucFH3Rnp=MNtb z=Ki^Re~7&sttkvq!+WSbNW)8R#0C&M6@`#oof7O~dx)P%B1o;w3-zmci0=gBeFslS zpzTRsq|Vl*pb}eq=7~OZHlD_Bap9XuaZPF2LUvUWV&PJtLb+m^LXG0z#3p8th4v=Q zg%>@<7Fi?_1ZPE9RJY|!Krfe;K3v)n!(M0cl42O_PhS*68fI{)Xx*vm+cz0@d z%ATj0J>u7OCoC$a1j?=OmFi~Dfi4l86qX1^0`z6DN4Qv5PCzFp@+*w7iC~uzjfh7m z;8z;cJ;5!LlBkj_Q-KW)BLWB4d)2}=Sr0BxL8rMFKsDmcCmp%378cCeSS+u`l^&mJEO zt=no?YvR!Rivu%59@hPEu&W_7Xq{oS^R_wBe$_ScUp%Ndmc&-ZQD9fxRu6xBrIrw#MlK7pZxpRdJ@OrZ=`^6iTSw=>Jf5dh9b;q5;um2*$QAM322beq+ z#^ok4Z#@SyBe!BJbzV=V?s?ZiC^{{Y+KFLZTMA)8N6vMGd63;)Fj>tAgW)scLRz`& zS{%OL6~+O8`RYRYN^V4U07B$9^8`E|%nPVl05k9bqZ0%n7^kRRwhKmZ%Ge>By=QTv zwgt6#(YFN(^UiT;tm{sqsKDw%z^$z3ocPPP^Y-{5t}6+mT`F^8yKkqP@uK}~g$j3j z9olAiuES}}PjMvz9F^3>=B+5W@l=D9s>F25MSQ&zta-Dwl1f>vXu*)USE0EANb?vsqQ$rSJjDn5t!jN*RD~ z*2?E-)}{5?Aq_DYu@n^RM$g&lO0B{ua`4vLu*fZ&#ef-pZ9SZ{Bl;uhal~9R$YO#86N7eTJ3k~-tT4!c4~B4FDgD$QE!raeSUv~f z27HLu0QMqD20(J0baZF9z}FP1bRWh+OugK)ffc@8$~wb{v-$LV4v|b`li~KOVtj~? zTv8fmS-XRU&FaX*6s3}{gVUZ$8qLD^a`*yk(@8d^wlS8X%P4a|riHtTYT9OD)Tg{> zQ<=O8Aq2W%GvB%?#Sc|@RY~>a4 zK=~#jQ$Z$v{~*$NBe+Y>x#rSKmFA_wBKH#p7p|8ja`X*E5ug+n`@Xg+14O7?(9pCz z8Yo&NDlo!yApfNa@LlWRDBbk+I^Hvd;)$~?Ve5OLuiZbAHKbWx6UZ^Tx}P`b7mEnT z41nh|rbcN9*yA=?2tzw2%*b71MhtI>WF7CJ?*frBst2cdOQMHP9Y8FpiDSZ=XSdL#o6|RGL?4_27}ZnOSLiz|m)R-S&Dkyb#=n0+K*qP<>4ZMv z{mF^p%eTi4C3vy#L|68m=zPBu-2ws6+jpYd{7!VB#wQ2?--!;G{em&5yb4VbrDwhd zf9fOY^DVRW+2_+vOR2|)eeB!zY>_S>j{ADe^vhb!G`Vq2il!re^dKO``((v~6SKrq zBz%@)Z0B2cQmvbF+oa3K+`LG8;N|Tw%e818mt6enY3hMfu zB{v&7sl}}VagDqvb=gYX?KsEmR0%zcRn1H@F*Kl&MsmjWLg#^r3jOUd3w5WTl+mL@ z1wjzh+0Wi6eIS*IM#wi`f zb>AOJq?6$(FpAC%;hG+{WPS*E)K8vc@#G<=O7-v-boh8fUlr-<&dhE!POVo~Ww3H| zHMDGJ?4O_nGdkk%jL7;^uLD2S;@z37a{PKLKV)vN%Od>lldat5OtHW0rR?K2kj4z+ zQw7(!6Djv*Cnb4{VpZWj|QuiYfChd@raxz_<0)}73)Wo`nVjjg|1j= z4qF9e*ok7mE1q2n(>TdhAvjfnCns`Z*x604-34Wsfvm@sOEueHH=l2IeC-?LSf40| z{I;xRv-efO3G#ecfSRl25Y#gg2G7;qzu|R7DMY~6wA5pTwqtl*X87rpPgD;_CCf?! zt)>7geWbM>^Q*^U2e};WA0NKkw4P5di_HT&xVXcKjb@BdmyCk=dF=1am}R4!Nb7F2 zgUPu`D?_ye&0trdG<{TcQT8OwfmMUay-6!~)s**MED&t>fJKb#Fd89oE5p0NB_GH+ z<}qNOpc*h*lRaR|hH#*P21+7K<-=c=I2yvi&{$%uoRtBc&MOL`*4*d@QZtfP`*r`1 zd3a~-!@-^CmEiVosQTLtZXJmmL31LE3)8tt`WeIrEPFT)oNN#s2qcc6U&)Wt*^<2C zglZlLKs0R_^FWp`K!W>sH)cRv;`ogRvOtf2 zcWObMZPSs}NL-gySfAMv#4(U+Ms(6*v*+w`rSyYzBGBi`fk;kExqhH89(`u;6#boa z7eSA zmis+p8lE)p3H}yc*!l4X8t#Rc;@aO75OCb_Q7t=m{?0W$U-q~tfwghDjf#C&0ps;} zit#ihmlcgPKR(a!m9=7k&C0h^voY-0?HV2uoDd919-B4h`l^5FFP~C&cR_BUC|=m_ zN+!RxVmTG?v<~Cglh>@NdhmlFNVezgjo48sVkdDHigr0+bA&;&by~pnbvBHOZa1{m z;0_WIh2edA=Q>##-%12owZkzx;0m%$ zE#Cp!S?`axTq~uyUAzWwo)^{|DqLE>UNJC82V6cbo(s&Kq;}Ov_sTy(svWz&v}ljE z%Jdm|p0FJ!BB=h(jgN(RcdG<%d*I$hI4ov0*ATzO#q*}A$%k^YbiYTUdv5qD4W{2dD!81 z*O=yV`)TIkmB%|{2Uc4hO`ZF3{o6@RjvH2TiGhFa#b#eI`X=%>#In+d-M*rc7t?D= ze(Qvo7E#PKKP%+4-cq5;#ou!Xl~xTgrAa$%Wxj*D;Tk2OxdbTpYp1}a3=6=(HZGs9atCrt7vlX+Or98k;om3uy@?Gaw>e<`PX7{ZUpm(nT^l+rkqa$FL9L49=vto6VtHwcN!-AIRA8y9+j!i zAQIkr-Wo{psyO>jn^d31b6`Hes?IvTnedqRzE*&2**!W2Vb8w!H5UI+6(uZ`Vz(t& z_OL?rJl~^|?AIAK{p@ER*~Qg44?i!F|4v#r(s;)h)cjjnf1!&UEcJa zGrQ|c7*oJD+NSl8%PlH3Uq=){Hd;`^IxVjtJw8&&F8vTw)yG1!)D%1bmTk(a!)^A8 zxgn~~*aSP^15wt>Fw!)77nOKO9geRmYSvt1eKFc%;Z#mBf1`>!Ndt1cL4kO9ex$D#tb$a{C66C670)9EQY@=M`f==eTG6 z1dv}8-k)X_azogSGH^sylE$ySIF9fb`T^&2*fhsRt|#M8J3(;YA4C$YQz(h9QYe{E3(I&h1L6Mjc;wQ8U)CJCWkW=bfOQ zBnjP__UJ7voV}O}$g(|2vSZykP@IsukZ>emg<~3A3v9~)sV4&(_zx}>oI^nt(EBB2 z^I{tFUNMbG36tUvHlf;0#X~Q0Q#cj%n+>eURUAnsgpm?Ndxjf`DyvZG*mQkvOGt)Z zaMnW6OSLMipc<^zrn*OM(q1`JHb^COBK=xq{q#TA0=KY+3o(BbQ6@zidPD^-{~inv z@nLprR^ssh5cSQwFdO~WF(*AKuz%!gU`3sVlM%^)9Q0W{hGU6D%F<+pF_I@E?CV$! zaORjoRPyQq$TV_Bo+^`X zqcoBd=_mBP22!zyiRPmdhKV-LVuO&)ilewG(`0!ATu{mhvJ6R4&8SBW5lU8x57BLd z7K~2ehicVfylIfJSevjc0%l!=Ykt>g7UcaXU@I_eQY>)nBjvaH!JXMOnvQ?6&?S5F zsp=kyvWPO2K-u_5d!{(|yj#pHRF5>$sHsHcQ%(BIB5a38lm*~qvwXg)cY0|}x0MP% zR3TynaD_*aZcqB5cgcB$k+*HLERu$BzJ_XY{enU_k@1pHiJ1L@QUjFvic&+M^_qZ_ zz;a8*D{pxu*Qso|E9aHHy!%vV66%_0_e!VV`8p_^^HSIs#(TJTqSVdpjm0Na%`53w ziMIuL`ZpHN%wHAgB~S%5Eu z*3WuDF`UG6SX*C$<8na}lEj0=+Cb(%^~B)t6B^djg6tO?Cb#EUUtP&9wMR@B_$T$m zg+!2x4z|mM1lsQ2uj-3Y<#Pk7>I;b|V}>`Si!h_B3yK^R&#~dLY$({y`Ht~Z%H!l^ zz+g61(Z-$A1%=A0X5VoFn{G)M&n@?r2gltYQ={pfFh<1gD2m)v_6W-8YBxZTQ!u3a zzUW{z5BQ_RiZ`Vym8p^D2i9pTq$`X$H8y5GgPY^DZ7pSHo^^wriQ4aA=hLwn*nlBX zVLyLp`!b=$BED&2v4?V1Bs-QzvlEWBhR0vgKFR$kMQ+lrY%*W>F zm{@6}#D+W-FQtfd2-Z$RGN+@U@ogNrSO%f31xYO1&OPalp`zP0Rb9dFh#f4W$K>CQ zgR+@}J0#{mmFI*rA4Kg4X%M<5b)tOA6!YILoM&dMjxdnRiQ#Y;Ng>iG@CFpD0fG7z zLkl-wIQD0kLY5NKVeEAglY?ROQ$&93Nd3PLgfkVBsOON#T-BR2@99Kqr!}K$$pOH8ei;hUi8$j?6Xq* znSHO1RltVekh5VnQqBYo9TjQg2Z$l7JWz1h$dd*H)TeHdP@fvc!(fQ_uEv{cG8ayY zsN$Q!iwfeSYz2a&thk}T2;|<8qNc_;egi6oJ?LA37UcRjq{^5g^RpUkGc+L>u4-Id zh@}(I)QGbDJ6IR0kV7L5jewqds338Qu zPij}2XuJKnR1@IRYYdeppwqPrsz3Aj{?v+BWa(?`8>lb0F;e&c4E}RWSpyd_6Qr*_ z%*m^AX5$q;W9$`P8)Sgg94&{$u0$<+=f<6W^zq3>|u+stC9pPTnm>t88|i2 zY*Xu}!w?Imw|`@WE7JPZ+9|x(ht~{+pD}^!NAzM48q;0z{HHWp#m{S6T+gOp7`N-! zsXBS>&bWu!DM;o&$SdqW*L+=5t_qaQX#LkuP*Wddvkb!kf3D-`Hr@BsJ&4@ml0&Xc zYD9;XDQ5keI8V-09pPY9kRf6$PzEMYV}QRu3hGrcwD1K)8$SNbZz|H?Q@=1^8YZ;D z$|N*mVi&3Igp;kCp2mrY(bnZqEu$LVJ4t8%?({l}=*cughTSpxO)6Fsfyp<#YGun8hN-i2ODO=H=ImKB} z86YQ>BsA@IHE8c`${2-wkA5@7Ai^HT&F=$ICViX=9-5<`NZrl$^20~gGrHHs4p5m+ z6@Bgi&uK_?)M*^@uQGxByInSlkzw`Im#xGpV@WeIeZzad?sUU!HfqOVXN`}>E1Qd0 zwI3~j@;(}6cZSQauC`F0k}j!ewHx7@JA!>vC*c@$^=aXlTKL(71Q62vVKJE4inh$Q zJC``MTj7{#c6Qm8Q9Q#SNGFEhWL5(YFT_bXM;)^8ZEES3t!PENkyB1a}MW!9#GDMFN4~ zPJ#w^cNriM2tk880fM``ySoP`xLfdlll$I1??30;sp_h)s?YY!8R_Ziek3aGTa6gK zvP`Wf2e?g3`v!J~uVCMGZ^a#8H`=#&mg%dWiQaUTW!yX>rJIm|(zsK-WW0=g)!1B%cB62PaFYp}i8jM6(f3 z_1~bP4i2Yu3})x<6n%SL{nb3&BDJ5qXaTz)D z!sc$W88uF=p%*}!%DH4Dmx4^FT+}C!MVCmDHUatdE}~^A{4PJy*8APTX7BgnecNT3 znk}h(wKQ9-Ov76-)$zA{ZCYjSjB>+O&*1=2HHvjzs~=I!N|M#R@u z*f`8R`KYa9d=WCHI{lUg#mI#y50(rs+~<|Z*?5#V?VAj-*8IBcHI=&rBKpUNvF%na z+%`hON=VP*!+GBO)C(Aw-fml^@WRSAoWjz^*1$#xS_x_N#8(=e9GF&DB?Cq~K7(dchf1^v2!j9*0{NJBU^Jm{`@^<0{eWod72Lfom%MeR9k8Sa9`1A(R zaPT;Fr$o+v-+8u z0kzcy;0JoUe4C&^r_@ojH%4mlYW`YbXNyH7-I!(;%l+!H6ST}_U!(}XS8$J$8fiZN zNr@oB$3dLMD!$fqD;k*4s~b;pCHg)+cZ^oRj{Lgf*EC^pYf90Gh3+ODgGqmQ57b25 zmgb|@fs!*C+7<31(J1D$k+}(Gc;A<+Goa3vsKSoHCI=(@<=ylj(~sKm38uSTgabE=ovOD20}vdnyp!VM@$<&MTMyq!r;LuHKau`(7^#gsrEw{}qWGJaj$#hy7V5-C2ZdY_DIV&{-QOwxG`*5Yqt^sv zDHYU|*lf_#i5B4uK^tnrFY!J>wO-)$X^m_R43%A3AvE11$ryFQQn5HBnQEdK+KS}EZ>DI?;gDG z61V~JOW4xBD8h9lY3U3NF5cA1&!Pk{g_WXza1p;C#(ax7KhE_d4gL{&AEd!-gBLm> z+;HuzXeV`J5!Cq8?D2~8mn#2+lb6eQPss`)S|Jr$a;^+->zuks_=(GA{aK5l289=A3t29Ya3J4l4$K6E$rE^M@H(pr#_ID?NGK&t3aK}OY9s6nEr6EF--(Nnl zyVB#PMT%&Wo4XiS;{sCZ2oi(LO{0XC^z_+|MC#{7rdY*0rIw}kvZ^2%c9FhPkUuN$VgzRR1zz3X7ir58O_7RLE)I*ew z2YcOBs|<7sZ@GL$rM0w{U+&(xa}?H&|mP#se^>yUb|+puSzJak%?ZcJ}PA^6B}{NOtvJDB_My~0r#{S zP0yFTo?VRYTmWVg;iL+(_N4;y*=5zKBxHqCDiv+y1Y~Ta_Qa6U1C&;?3tg5Zh)9Cq z!vmD`8RFP-6OSJQXKDw)NXenQYyMY;^e^{Oxpz441+HF@DX;Z^5>$JIi0fuhFzMyT zc>ChQp5c2lCL0yS<XYsQ^nv8mXF) z>bdFgYEAUd6@>`Z^-mm&DOr;%n$Bn36i?gFn6CF93MoX1?`IZ=65a;6)hP-y!U=D= z6LQYpA6|!zEk|Tk zXeG^&bnS0o<&aMhGYMEYo?EhMUtOY25`7=Hi*I?bdfU5x750V)BN7YSQx4*Jc)B69 z*!5-^ZF%c%+H{Ruw|>t~AXil~#JTrR`?D-D|L02_#_(35BsVqhhsO+lM4$KMh1y7C zR@rA>q<*}DJJQ3A4oUVDn+9mY&ep?kI&22}NAcvh|exxmw#&j!UA2^EhJ z+!&Ql!vH5IkBA86{|v)+Pd(Drjojw5^(oVL$bhr%sg+ZK1b}p_raTllpuX+Lrk^v- z{L>x)${Z2KJ+-;CV;L;Ul!4)uEF0~tewy>dTD`KU^Jig<#~rt_<1zP)vOPIQk*Cv( zA$|SP1NU&MKxUEsF~PIV#!D8{T|4LvQ6h> z+vdGonIqPc&1mrB#hd3#22tPJi=owLRriP6HoZen{wrCL$gbnllQ(5^*$-{$E5HH1 z9W2wMnE?4Bi?HvVn++%Ck@x9U{V1o9@7?V-Ma1Ua8Q;5zO^iN=-8M}oAm+&fH~>Pf zfYnQ2jGBgNXW{miv~=!KYqUvp?xG>RO7}T3GUMrDyDy`9(>bq?IZcebtTTEDNn>3z zSiFv62wQ4NUo~`}>yWA8Cl7A%P{yTxfyAphA7LrC+xw@AC+4@Nu=^I}IDYkQBQ zO@)S0s!zg;qX1CY6^^KjHyl%szz}YXt^mER%?p5BIZdI2kR+kJQLx1Bex#EZ^ zi%?CU4pnX;?K=dIEN@^VnolMASI+J=VpH-az9OrNVGn!UghSf*vR3`bD3WHaz%lB{ zRUOvZ&p*=h=7eaqaSN8WYI7HiJvsTsqb=wI^omrDW_@M|YMR!mCK?qr@rm9QG1Qs( z%&gM)3Ep*`6Q4+O)KHfJ&df;q7mt!QDMiU2#{O_K4l?tEgHMYB-=6`*`LZXp-_6Y> z->%1274R`Dn3xHazU^TW=3CaZkD;noOtw!^YcUn^U96TrO656*%}!*o$;wNrD`+!+ z#vZ=b-<96yxwX2z|0A}mbfYh)S>odkSJADza5ih1_K1-<#=+?oaC+f-NhCZNc8x4b z9wW15Wx?aGR#>AUz00({5$gCeFW01?;$K+H>bbf)N%dU~h zHi3Xgr{mWt$*hzJSRgNDx;&PlX(`;{ ze0GPSPPPYXhosGlU*G~nEIMse=wYc)@QCGYpoW#`408359+zX73ahUX5;Op-XaNI{ zPS;QTt&fyhX1{c^%po-Tq!Rr0B$Bt6jA0o>f3X7iXBAmH5`yr2a0oCDp%Zi$aGB$! zLa2CSQg06zqmj8fF^Iu_QlLz1C1*pGlu%?Yao1?8NuYle&ukiLVb63PX#sW!Ur;r% zzbVJA?1~8vhmN#%1`xV-FPOH?YF9LUtGZdC*m>EqI{LX6)KbQ+?w(=IbTLYzq%)D% z(FKT|+GD%cBY{{Ue&77osEwC)kXgmAquDSCI^Tlqu|Yb4>;1m6$wN&t2lm(m^+=pL z@SvCA&bRaH)S!AKEY@TuI>daY6rC3xf9XOxfjeu|Lg+6u4puXmg|sR!YE9d5g~l;3 z;n(~@LRevpNZokVeRzSNP!^3)AnY#yG5bt1()`bGuh*cQd{`jFfHf%P_e|mMl!P+l zJ`^@;iIo$5Qo1eDXQR{6jZdK~ zbRQ-J%@L}y>ISaYMst`wi(*Q4ZL-i?2h?k5EK0n*oR-=JoO8o z7z99sKpXgNwi#UI9SEVe!CwH+n%Kc$0e?qnreJ>EE(0xi%4afgDMx|NmYVGPDsi!a zhm?2W%O;%;XJ=;8a58qXb)Q2_DW7d6exH2pX1&ZyQcdNI38&68@9vcDhV}ZkZ@g7b zJ!dON1D1+@o4WWhBsw3Z_?!hjW^2~nGl1gt9~2wzd?X-K>5O+zbCSsdyFkO^9C^BR zr~cD}W4deKfs!PHD0k0OmZ;wAZxBlE6@_OoeLI{M<6h9hPH+7Ut2(8(CNc=q=Sc?+N-xk`iyuFiWqf_G=v@YewAtORX(yH%?1%5Df+ z+8Vq?*a|i-kos7C2vEgnv=)|GtsTQba6k-rgM?Yz3)i%w{ElIF%-Tl7VxR_&erJI0`1iHUbcFyCqdGt z$jeBHIVSKI-G7j`*=Rs4aumVwwDON(Cik6Tz5FRd2s|C;s607`Z_j{f^;% z0;Zl??Tb%LRWqmQaMTS$oqI;~aohN{y_({$Q4T8KTvrv(zcm2%1pwD?R?^s%h#)5< zQeX8Vs;7EEaI+tS+^C7d_R-w{5sp&m^ z{f5bH(!^xOg2wLb#!>va>xt8cE1x$X{nn(XsF6jFv7Oz~YyRX|eAlI%awgA>${SH| zoQTe7Cydt#YlCm1lab)A`t>zfgcvIY zY@rpMjWA=Xr~Vt%by*s0NAWFxSflU@CBOMZ((t!M(v^I!GC%~t;t(tkstkUQPjsHV zSWZ<|uuw0~b4JbK|9U#lYRuR(__o)yy>>eK;1iECI*tM_UW~So*i`0-M+Abdy70n} z4g545dE*H*#r@G0LU)vWSi`h2zm(?j&Ig(gu&LYF?gs^hA=@3X*nBeOYZp-@Cc zd+3)&TX&i6L@xt|2om^yMk4i&DWJMO;ML~m8-dUR^TlGT!pSB0N%pB?t9V|D@i!fU zW2;ulMfu;mtxws1B^Tl!+pCDVV1FrqZg%J&bFo0qi;np$zd`py^GGjDbzV|G(&ZWs z&-V!b=21_TV#ak}{7++_N*a>r!9|GdJcZqb(--ez?9C%UtbN^*XXygL)kKwR@$=2C zA@%5y$CG&KNA`BvRK&%vPI2H3ou4EQeaYAOgdkk@NK#q2Cr3^VoJLkzLGkS z8`F*68}?0IYmjCi9PiYxu5k8Y*Ma#sJkX}6M%8K3(`-X8xUQ8d=$n^}-9I(Uf1n$^ z$QkW!2<6!TgaXs}G#3<7gUfMu))&8C*i&r?=?FTMR)+J{h5D7m4(7aPRA&I<6o$J! z>ghI`^$)_$mU~hbYOr@oU^i!aA$)d)iOZCS-5zsCTiS;7qf5r09o9_QIvgm}`GM>T_6=ld)rTvY!d2jifKWZEe+R@n@CKlo2$?0m(x$W#BE} z$~F4a9c9WOaakb#wP5{~$zm}C_V3BB}OoWI))uW5Q;|%$oxn63Pb7Xp7M=#;3Q&N$&<)Q@k zy|xQpC0bfRP}l*E_4^q78pv{e6}NkF)n8G(>?_76tDB)5CbY`JH#&*o4dY%QPfT`x zJ=enh@#Bz-e64>m@_-|w*%O`7P(x~VqP4Vk3@by*TR4*wxoUJfvfyCVNR2P|_xI?T zgu*0#98zqVedsg(YMP;NRi#3~o(dxv6!(FAq(`{)%XF?lr#5a0pV!hoD(Yymb(c17 z>5Rt>QSH7^j11pYSQTB%5%_mbYx#>jx+RC%9MsVjvt1`*y3`TrX5~P1vq#Tl&RUjQfvhuYOA9nDK%Hl*5UE zpjaR*cqDkhzs}$QqY~jG-J$~}h!hEg2G%wt7o!AWAuT+O-bNt7LqPr@C?ymN$#6&s)>2SEN-S3_ zBr^C;2*eQKe_Vn{)wYTnsQcL4!4H!!*B&5g`aC-c3%4c?fBj7tsLuc89sZa9^5mgX z@Grmo{2S5kt8X``r@r8oH}-qL%e6;H^J;pF-Bz{COUJwT_I>Bd+5! z{IV$cMsa~^tmkp+_mhR|b9FrcInHpsadUIJPVxH}&w1+MyjxlrdB6e@`S&JTqa`T{2hf~@2Z zpAThvn1A>Uh?r2@_&Q~vtn;)qCj`tpk(V{ zkN_`IrUGbE95g8him+;#phU_{10DWK9|rKnK(Gujeh7#b3c4O3ZoOrPcZQUU-U{!l zhK*ef6c=|>9CcHGHzGl2(m`7?JXVDWFp^0Kpz zY@bD%yQHb?pedU6J=hK>qa&PvQ;7r>NJmX)r%ls9_xWFWNz1pd3l~TW7DyxW2~l1# zhy^1SlfNpj2k5)^R2Qv0^UKXSn2B>Q1&gH9X0n53vXf?L+V`=IuRMWf;bU%LTfdl~ z&pl-2o(c^yZs1_WmGzA5tNJNVzSy#5-^X)3#{5fzcEOT9zu8SEL^u&_!qbMG8*f{K z_Wbt9F`J$pC;c;`@1D(bH)lGleW+D^nXQpxJ`@t3fZe4vp$|p-DaMy=A9V)`f<44@|!Wha|EyTYyM0T6*+Ryf?5KEatj zzx_=RkVy$;0I5-&aQlW?KJXnXVS(`AkzNQ+^l?t~p-%Mq?HWNZZ}0hyFhD4s7%$3u zBX5XB5x6o`E8NyWne9{F%~RfJmJfu}e;lBScMVY*h5-TMwrLjzRCw^97k)cN{TFAW z7Y;kO?(4Vizi$aoz0o{GRytrN&ug~w&=-nNA{-4d3jY#Dlij!0dxY0z$INV97@or4m@S4b_QE5zXcpMA;=Jdi&2J+RnpMSdox$OE6bBMo6ysM&7 zz#F9Z^Fx8OhbH1U(4?rt!ylk)B}y*_K`#bQF9uXE20vlEc5)PB%opXsl~uvEnJdAa zdTi6`J83wr)XRBYO&%$=XmEl)41OYbPzsbn8~{)06+@=1l0jT1JO~cl4l>3xF~j^> z6!%uy8#nV0ZCG(3r{lLEn&%PK+RGX0pu#MA>I{Ss$eKZK;o2c5QlJQEIR@URH_ zGx$OAAnf2DX2{}{beS#IT1c_zsP1N3?Sfs9RigMb@z^Bs*dTE{=-<|Qd`x}&x$X4#}2ZOcypH*jwhj|tR|J_ zIph#5%Ak4rZo%d}ER(#yI~&3v>F@Fd!Y2tX!$IA`dSM>|(_xm%IU?B|ER%ICliye` zrioCBIb+i#@Y<I*==A6L|AoDiJfqDLk_M;;RcSvxmv3>4btsUcP-47*4e&dS z`vkrUuEY%v2$5L$Dgo~PL7T{U*!^R;`v*(+5734Z$YJ+n2aO2pF9-7VA7>^QqR&Wh zDqG>cq2&6P!QjV-C;2ZU9t8?5#tW=qh#n&k5!Amr8%mF1LWN;MhtXF9thiI69G2ms z!fM6|hJ<3mc(7VwRl@S5(_n0>c2m)zZz>Q=L5ZbK1snp)aQmDP{p(}CU`Kz!_SRwx zz(kemC+>B6EQO}Zbk#?F!H)XU5^b1@?f4~IziV0gIoL?@9dU0O7p(i9m1zBa4|cN} zsjvm1+aw!gk}VzZa>PeGSL`i2nhZus3YOqyM@u^t)%@P~$W-P#3BDOF}L!UV8GRet?1 z0v0HK&K95lnUu|ip2CVzWq(0n-`nEH z>3Yu1x@DC*Fo%S~N5irfCU{E>zTHRQTe#6HoB4a$4+KO{$@+E&=Khf05@*opr+Ir1 z9x;>X7e z1^brr%r!&-|90t#+U!^Ho~Pg)9mV7F?CQ0fBa@l8-YVAKS9#v?eKwvAcX`K&u4i7m zy#^HE_5wiN34gM-o6J}`F=)y>pK()FSZ5LxJD;i3<sQ@P&;HCTVTBiY}rJ zW-1ozHCzQHqaDk!bg^>8;skb!t+jq?qT4FDfLhW~4w0!%(e(9l^Fwo@+|J4MMFQ{K z0Im*eA?NdUPexkKA$aejyvlXx<&EMbPu!)jya%R&#~9-%h8@5{1c-JZSO z<#T~%X$G&jyy@$SOQ#r>1&1j`16dQZQGqXNc}OpX638 z^AMYD*v^jMg-I&6ImCwY8ACw)S|0N{e3G1pGZ+Nh25 zy`CIvCoeMz$%zY}&gmr*-D;72MFY`@`>SF7pN+Y3w57z;s2x5vxQKt5~TpZ-setyxMQQUa)*rxcjvo&+7z@}xMe<=ZQl_> zfXb&l-aRtwrYFKaTCghGE=P|t-^#hri^o7aFiZCw_2p}iA&dIxy9_PYHCuBJj0Pr6 z#9lev+v&+^{3u1cu|UYjxO94yAuw1p4b0tV88pEPphFUUfMyKUyq}~|B_Ad}(+%w+pCt|L?Equ9Plf{kuDcWMw zEq)JO72AUTyk_9eMHQP|+%+NRv2Ap6rOS1CNc8fs`C)JD&GiMhmWv&~^z-EQvqA}x z@Y$@A7+k{U;SFj7GJ2H4y-ERakU01$ztIYAoMF3p)P7V#ea}ZH7IqCjR+d z!0ET$Fs~Cm8ENw*2!4Rdnvl(brb&Ox;)-;i5QN6~%GOxFGW@kETX& zs+z-W?w3t7;S;8yYV8xiI>URQHRggVM%#P!VSs=xMS2Lnu-Md>t|oQ8aK#+eq!yyf zSTv`C7}OlbrPVLl$y$!})9 zvp3WAI>yOzEB?a6$4LPL)wkyBdc0&KGFLXqynUO(?)WIrW@SB4Q1fAeik|1_`mGu# z<*MRilG7_u@+M{1MG@PsL>#c^i-HT%>-JveNzy^`L-)8MmRM=1uj4Qooah65a=)Pj z)iJYxQj)D1(WAAQSc$Tkb}!{cD>?Hk-Iz+u=C2Ts^4Se7mH)MzQqtnRFjO3zJ;px2UwxcJ{4 zG3S22lckPZ!;hbQ!TW;|IGFRipo(p)d2;v4xr*ZvZ6D~icuhsbl#=>I>}i$`);S#A zHZ$>&L^&l4hU#Sue*ZteZtY$-fx)C>eChtyY8kpi% zg#b?cK0!ol?Ikz8K5>=hcj`(3RMaxG^nO7_}X1z@&cA8@=Y8q8_MP_!< zQoyzA)uH@PZZDG0Uo}cqHgZG``)|$EKd45@UQzqHzb%v_5v7kSl50|iEV1)5&0t(~ z$?I>$w=QgHh(ia*#NTrn?V1T>@1bLCI=Z=P%-`=8*F^R#)R5F%_?1%ZFzQBj{Y>pl zJGd%vU|q~B=fB|Hv3vE!&R$6)3WDT@i2#gL%Rag8WU}LHkE|Y(>S;uo-!7$P_@?&w zS;6e~>V-cN9>N`;RK|)T$0}En8Uz$MddH0km{whx+Qq$oaqFdDeVR)gylr)1WpaD? zQV~m>(y*IaNxiAP5!CeX+Ov|PaWKbwznfWxY`5IFhj}WMNl&Oi*W_v-ErZfY236yc zC3%=i@`o?8l)e1M7mv%TG@>hwBA_Gf;xWzQI$Z$wn8va9xc7KD%W9xOaW40QGtX@& z+UHB^&UF&0?^8;SLp{a2tUn*Ib!6{Tq_i7F0;UM9ec;Wq zj<8da=U7IKtq9C2g}-s`sUd!(rTHot=_I?+yB^JcDJ5mOe!}xTYN9Nf1oT)aQI0|bW_r^1}Crh`kL zmL-0^lF4H3n^V`Q6dJr$h@~#FAP*w1C@RnK!1FY=8>`5F8n04qs6n4UY}-P1jY#tF z!HP|(;8Gl!c8q9Ree3{$wF-%vxKH!k@@_#BEtieUT%(6hE#8t?d)`K?X4_`-&Md1$TgZj{fm#~RN0j(5R*@%)m9$GsAxs15|FwloUpCnX0vO|biq zB(-r5REY@iF}#-p2UZ1#?v*k^(u8y5+~i;F9(I^DejGJKDNwe2@(p^$;(Tp}!x%d# zt!nD!87;2pw!1&ZKdDY(Ju#CJoG7>rA1WT%Fg2t48bw$@QB!`9;gVs+m<(68U0?YJ z{DY}Bw=hFqVJ5JR)gt`y*|K*1IJK?Gk(-j)hl_cxUHGPCf_snAHxo&tO4Z9AZ&HZo9j?yl?j}Tk>#foy# zPhON9odduu@N|dMd1iTKer-WfD==`Wbf98Y<)Ux2J(nmdcs`V&_jGhZ4pg8zZyVNd z4&0Ccd!9K(k$0Nj4-rQWRpv#Jq7M&CvB=M5F4sJLqU2xjsN9@!glt+q#Z69Au;tx^ zv9-FbdGA2eeC>mp-Fh(F7P&{sPk|DF`^O0@W8k{*{XlVGv=r&BkWJ--du~g8-A${C zXnVj3;Y$k~?~!cJ`)g(PvXbyIO&=@FBbVu)!6$~lZ{*%pW8L+?u?-uYx^Wfx_6j{ zvm#<+79ufXBqQTs%i=CZW~aru;du={4+}uRXE$uGf}OK zyvlQ0ax+Ukv+cq(Ji-Yfp0xhP}J zBkurn^)xt!T~-A7p<#x0fq4A;MeE5d_>CStGa?cfV&Ua??93MwJfwmKCNoyCmEh!1 z0WC&}%p`7)DP)q6Sv;OXjVOf0DiyC$jjP`Yp(|~|U-SI^ApMF78qvSky%vNgp$LUs z>IjzNl2p6ETed(hL~=?#X&mqKx7KeZ>1e&pu)j;KZzW;>BcD z=5b}G_$=>U-UzQyW`LF#Soun59tT-f=+ht^0eSf;;1@K8j{5BTHd#ppJrV)MBkY^0 zas?fU=fHDc!hxCl&h5dJew&{eua5HkkJBet}4%k=D-hAojPx z7;F16BVX%le%n-jbbU`w>Gg(la#_c5*uA~daM^%}qw}2wCqacCVO8=SNA3?#lJ*}f zf_`ui6sU}!#3I33R4pQ(^sNsp=@N+a`!xs=U|NEZe&+!N(-MB(2V)d`^pp4iu76;M z(|KY6mkRZ}c9m2F4frk)c=%aYg=6yA4zM+W-+%cP^r|03Z!*H#|G`kvGoFB-So^&WvmTI%7ji{>YhGQkm*#MjtER_ynwx>sQaKF4jDY`{ z%EiZxn|lWh*J@(hhkdmXiG)|`Rh0z~p-Zhe?S3)H3az`u*^fg_PoD&W@||xuUIEnn z-SAkVDp`c*JIO4Nu?Cuy=NfJg7UWm2!d_X>Ccm*^o-k$NdN|G#XZBJ0*n0U9cYJ4= zAiU^OA9r?kE`g)8#**aw>|{FQV>NJNZ87Aq6t3AfhAkRx;;6wnTCduy%#LAie6^~H z#-979>NT7#(SwtyL0$S@Z1LF4aVz~;TDTCZkL$TG4b3*0!M6dr-BJQvgH@RYd>Tkw zi?88l=+C9@!PUV)1ReCDEp27)UCR&`glRNWL8tRhsvO*9CcLIEF|f(p^ymP;QFQFZ zCD}9|W@zylyX$wZot1#)3Y!FBdDMdat-)}O0`W`1i^_}{Qc#arL9tayOq_d=1~*`&S^wbgdx; z5kna`v}_>PPY>icWc>!#eGE!AC{+AZIGIGl2E|xp<9G__o>XuyuZiRURcU*#niu*r zC?}Vz%(2k92=QL^)ok%mr(hwj;d(0kV=b*{hbd0fy$_?qf)&Mo;y(zSm5dAI(57W- z_9I)Uj9VD@fMak{HfD1txr<<{?&=D}stVgY?!o zZAfjwwN*W~{7g)R;NCnP_^AMT)i$-EKOl@WicS3K2iUk+R38*En2csqB2(kIWg$QG zj<&J=GW#d_(mQ~$(Nb>H2?J;6Pv{2n0Y+z3br9S5BTUu?v*p-Qu@rBWi7i4Vozqjw zCn&M?z9W61jZ`Hw41D*^gIz0;S;e6l(%Jc80##JzGRtmW{*Nx;%CLaiL>?KeTaBLL zqg_tl+=?uoDS?~lhfVbX%qNcwNldN`C>uQVLzVfshH^k&A5{y-N(-BMBvcz}=Tc$j z3a|6-7v$w+ZF^9)usxLvoDS4-@zDQUYjk`$BJ0Ap>QXZM8bh~U0Z1ub=;*_@egSDB zkfv&9?**~Fx=A_!E-mL-J5Ozn^nXto?OwYru+E{DB{Ue{ybD{{8-8jGslYNeJEJ{j zr7MQK{U192SLujZG1GdtWUBR!WG!aJR7-Lljd>ScYR~7(3^Ddob}--18zO>8{XeDT zkT`PCKm1eTp+9e+KN0@{kcJhAG{*1IP%YpxC;tP9%t^1zN%Z_ngnVaAHBXS5Cz6`y zf0YbF?r0ZQP6(4Qi0QSztUiKTBRDQKKMh>ygi5L!<+(Q?uzQiCnH{!e4f*7X`NA4T2!PG!%W81uy*I7&xyJl0C#P+xVcNFwa9mG6 zJ5L<`LZkS{)uL|+Ha&NTT-ae8;~Xnr8s5*Yw`VHk<~Y=T47ooJ^$rg6jSTbk`-hPK zRRY6&qgHOkJa>Y}cd=)5cpoo?dG648?!Y{?8i7-HRD5@00XvAuKsrTMHbv$?{8JKk zcW-ug5&vN#*oldykH=416o$Zm+kZ;iXX(|o3A?q4o6}twg8yw1|0%F7;%R@@QL~j_ zq~1n$8ybbr`_tC)i?NDx*R?AD7(RvHqyA*?n&_;bJj>r78v{5;d}m9Jb$;$8HO^zy zXVb65ex?hYE}f7Eb{vZl9+C&H|3~nF+V~)C^@^y7DTw~@7n`n@O-n*ZkH5v{tzlG{ zup{qZ3EaWp!CX9jf!9rS+5 z;$dkhZ!kJdyb%58=27_!!6g@(uf9-X#kg^InXdX-*{1b63b2$70IKXG@qczs6qydl ztq#un{I)d)-9N=_fkQ7SB?zSfz7j0a@4L{1+yPH5JPGN;)p7r~VWp^8yoCYP5Ze`O=~ zq@W}XF|OQ|_g_)$4$bbkd)omYB+`Ci%y)W5;tT)Ko0V{m_kh-GWE3S27*2m4*1j** zgsrr}Zy<(-RYm4^H>qd%Vv4$CxY3ZriNQS9JM$}2h@RN>GBPe_c_vnMtc0-rO@Xa@?N*@u|W6C<`H4Xw+z zi|&Viaub+JmF*R?{Deq`mFFC<3upQc=KPPjf`;eyfgfX{`2HN$oi3}t{8X0RdXrS) zFczKrM}4*`s@?(`>)I_%g~ou_68(10-$zojWpbC|;amPO@c?7xelJAm|N2~Up-|*Z zU?c{@<_=LM23G*$d4xj4xH%$uLF{4X`68B`Gt^hA1H;Eamaso!;VjUWn6jpP;EZwo z)hKBga}MuVNxLHo&aKGm455Lss8@H>&nU%Uk}Srmxd(!ypK)Q9AxQf|*g-ocL(f$a zm{qRl9HLYvoN~o25(6$0u&ac$LGi(Cl*DKWG{g&njnTlG4Z7kbgKA}x{L()#{rmsehr|DiW%&iuJ`N{Ag292y$0KLwfd z*Bryts0k#RBw?L&WL!kwd^lLd#E<;S8cVeyFqpq+XcPnqmTB>*o?IpuXV6(ocykQ6 z|GdTSHpxs(4&w|l`(Wo7uo!Wd|8ZK2RuSRf7ME546B02J)R3t`gQFONgWn7h7C5*> zRfk3op&daBgE^)%jv{b%zrrf!<2mZ`sKO@|O*MY!tc413 zsSgQYy2=aH&rjqiI3UdQBb~V>ha6f>vlP!nZ#sc~iN1l|Y&EN?fxcVEL60;5GloPXj6?c1Y!L5lH2`5+?@MuNhpKD*0w$Aa+BGo0PKSa6gepfX{U_s&PLp-k5J> zw0`$4n?{%qiz;YRTtbuDXQ7dj9$!@SaLKu>(AAR;4SL`Rr(x*e5@2+=n&l@nJGbb6<2E&7I8gtI!+=o+ArMYTjYmMt~}H*=?1ip znwjWsPyQYv$XI2fpX}x?&LD?6VTnajvN2cY_GBkVO}Ff(Vp(~A%_crWF!1;>0E)@S z$gtsIku~VNZOUs0o_7a*?Ioj#F4%ag>M8KA?SMy6rE`pVJbSrO%Mz#xYbuJEc(7Kh zuhP<`j+Ge`ids`sSM@%Ud3=gFZ3o(`)u=ts(ym;Y-4rLiUsi2sdIxmX2+zk6%#CMr zFSj<65%t-iI+G3AgR)DUg(Vqep*r$htdj!^wmb6TRz=BUy8lQnn9dwC4@m6T%pUm< z%8@M!bSk7H2kL0RCR)cAZ0)j=pU0?noDj}iW z7ll$(&9*V7EvJjLXN$ZSBC2}VwSLFlkd$o79?z<&^Wg848~tp1({1|?E*M~j5U`&% zjA6_k6}tcQ)*PMX<}h%AK7nk(s2?k9T?!p=sCiLS#b*rMQJp?0A{l6*k?f{Nu`u-V z3tWe^4kQOj`{3QfO&Up(T7s?O$knUZg|q#PX5i<@y}sXlWFtuQvsvVG?HyIytT z*tEFXUfQ!`PI>JIH0{NRi3cS>mx7a0=C@8P!IVd|-+=;jt zOWMr|QR7dyLT0q3G^?Ja#>PG$NpcnlYx2j@{lz%*&$UO|>FC9wRkV6jHvXkzypnDk zD49wNNI{i0dJ>RAvjA%*aYQ3Z)p7b}o4HB(eBTGl-FDKmrAiZ2GT{A@#5RwY(x#Y| zA}Z1wU2P?VqOz%u=v<3|mM1q{+(Qbb;F^-q!L7R(Yqvl)a52L^GkTr?9B&2z3+dVk z*&nJkr23B3iY>w7D3m0V^;u?ISp*qMhCbpBl82z=4%aGg1?V0MbV;XE97rX_4a~;nW2wTS)4{z3l{PsYn za=9TFLKL%58iPVeb8fJC0uSrK3i-C^LgCHYP^4Bpi0P88h+2Gy!85mkI#9Oq&5LYy zRkY)yfSu<@4CLQ&p9u+Vgv8%>{e$e7dM;r2l*!p?rr*Ds&+?h@HW))+sO^B`s|wPEt=qR1p%osCR7F#Ap}dnlU$MA zI#0yPIxnJzmOkfDi-MneqJ)j|T;`sZrXCJZ(y%iYTWK}W_7F~py-p_+*ZY-(jFG+K zLd?^AQtSDo+d+ch;n6z)ipR&zv(cxwPW}EAOCHEPfrb|FnA9I(J}dzB zifS;`!9fM7F1Y>BkrneI`m2UxXPil!hpl*Bi_qT0#~sCL>$e^1*@f33-|<3&OsYEY zq-KTeHH|;zUZv)&<$ThN9+}es=A~8QQtaZB?zBz!ecksB2~Z*AW(x@p2y1G{QGZ2G zUWH-Y8*k?3P--_&RV;3f)9c~Qo>^*vktKUG*Py?aGX0~(aETg`xI66GXo7jFM;Yi| zl*Z(es_`0n;H;rvI6IH*cqqTIE5QV|1nSnFy@d2B9`$+_JaCVj7hTy%a{@Ny_Ep~6 zVQew_!HN4{9Rn*G;-|4v<$7jLweU7-)C&fyR`_>}Ll%#t&an6S9akHOkg)d2k^F`mtZ(gn!Ya8ArqPF~(TvpVsozT8@ zRR7HGeW%GoFR6`Hin`;5?ta|HJ`5TDvt|#u7TAV-t)E)Y6Xq%UPxQitlmbgzycIE8 zc2lbJSn3+bk^V)?eF_*bFmEr3(XD08I+kmCzRR+?(MvKo8^5r@YO=n}#^Jlt@GEDu z%B||CQfzCq2V#Dm>bV8vrQ*ag@l`IaH@gdmFpDmhwN1?hb+|{gQRzzjTPi$&LdmPY zy$CycIy&WkDe<#8wcQtG4lmQpeA}ya=0+(YOyov;W$qrP zlQns)!pz4T@pEXs+ivvy8h`0?Tw7qVyWiFCW)Y@|U(d!QL$C4{n_OA92bHAk4R>z2 zJRM9GS)TD*&|)FHi?-N^vNKOFH<+eVhE3S}aoUWlMZGP`mpg1*LFmsf+ADN-?EVc6TpS`c$4#CIUd;+%Z;N_PK!VQUP^swk-5h7) zU-E~Jptp409Tp6te`D_yHm>YV=@%MS=N!u~lfg^RZUWZ&WkgCYm)eu)j|hJU*A1QA zzp{Sk5Q|=kenC;k*4~yAal%6!XXf-J><{eYx>s#xwYZqjMkd4aX~g zIjGzI?gacte)=fS_~x`eHRtVo{CA0~ZriCngS**(LzL_NxfanDEnm0O`j9dri&6vM zcC`;5L7W20k6GU>RBQNmGr7$&xQ7M~U|e~Gcwk*wrXOGb;M!isxjHoUoUIX0K6G@p zS4|!vPQ~7bwUcX<@+1ty2n(nR&~v#XWFtTIy#kCjYCKQSwqO1Hckb{1d%CZDM*Y;Q zH2Pt^CJo(YaDq$nJ5<*xJEb<9{ew*9b9)S7b717mIvC`i-u6Ab33MRr*At4 zuLLXakjIAFx2F+pITdBkDgGsMeGjkjF%LLi=b0~U5!>+gFU1lMs{60Tk`8(s1Go5h zw}3F-^Z2me<&p42&>2%5<`Z!@5Yn4N&u`MyZ96(doXQ)p`UYzTo!-uwDqG`_Iq86~ zvQ^m^1^JoZC*yKwNmd_FBA)vua6=<+qUjyG-a&We6EmB0@JRQTEckb;+fahc_8t;W z=-U_I1hr;ZBBpQYbKd2hRV2s22~Ers15m!51PhH%P(rZ;E__h3tR5fs9j%{*XI-3)A*duFSBs_bTH?2+TUkR&woIa%nRu-#X@A-TU7Kq?C4NXM1m;>`g*j zT<_G+|1qX>;RADjUwSh*oo}@0Qb_3PK*`;Zh~BfTBk&Q(mEPPeKV#bYlhTfJ_&!=u z+A*&|j?1G*^tDzplIc{PiHC!a=iRoe=i@O^=GO6P{vCD`N79PXiN}A)Nkmx^P~SOD zIQ;r|3}2J;?48vPuH!SZ0wBdbV@XT3@0RN`vs#$ff8*LLvFR~`&U^g=36W~rNC^E` zoG^2On816I2*Q*wcas18s_A-~_mhnw0rM;`MH>zTK4IjH`dfQz(q5-;DQLC77?@iwFP}8-(#Ghqb+H{YkUujT-jW;402;HWtZh{(c?0xG+DyK~{(jp6{+?$}FemY@Rrh8=omVa^Vs;bb z$gjR6Zi%X+u4>=}jAvc77bS9jmo!Xn7zVrzHfOev)0JOyn%T}h$B*n?Y|V6JVwepr z-WAVSkzKSXj`q&GY<@G2YtORhZ4b@=Ek!aWwcJTs$duCQ1Bkj>GA>g~3mI3!$kFe+ z?aAG2GR8%5xDYS5n=`A6p?=Xt!;h5K{1>7}2LO9zOifL+>M)wucFvh&`MqQMNPb?o)bSk!b>LPd*7kQ3gPpAc+OCkvR!GdZkGpLecdU$y7#lM z9?5iVkA++dQ0sr zLq;q428?rsBN|*S$QIrEAyZ|usJRw)mI>tJ&Bgf|6d&uhwoOdvFHGYt%s{89=(yT4 zigDZF0;=>`Gqf14og^c6h)>(~Unj-5;qgt>JOP|SK>H##r+SS*S!bQo*1G4oqv=m= zU0Qnp54bLfBSxa?Zs0E8YUchs7VCVJZR*1fv7$QG*sqOV@d2O>v35A321}z|pflhO` zFDKCh!pG^3VKbdzhuF?clxo7-S%)9%EWgmw$3q0L?YaE#G1r=%lvbrdvfWX z6LOii2q>2SVKvT#Lam(^{-*~zYXCBZSBq*+yn@Q`yK-6-RPB_A#ryN{u!kdk!$OYG z8o|1#huD=eX6KvULyMCrNije?F5?nK0!Oe3u%fnFWG#}dOJv6dHYE^HiEF+Is`|0p zA!_bZcqAsP+N`~3WmmAmt3P#Q2B)SxB1SqMW>NxpBqvidEb`3$kUU^;tF1S?<_Hi| zZ<5b=s2+(3Ub<;-P-ntE2Rk!P$4S6_DE_p{yGC3mj?%G`ean^vjH9)C8SAsjujDKN zLYu0y^hcG13!0;rD1IAx+G^_CKedfEr(#*VHc=$4Ve#M7D%d~ffDj3-k1GOkA(huM zqfJ_QWV`MvkLlQ#Uhf}|j)Jkki6vNhaqrYboW;;yd8Edj@Hc>hf|A^XOk34>8N!A< zD#Q@4A8e3K5`#h{q*u6-%IT~kHRT_$wkscqu33<4H^WU)9E*awasr|XIo3y!DQ>_s zC0)z3!?jW{4tc(G$WfX3F_=^0s07F-IZ)1bPE*Y@fu>?_8-bRBcv!XCUC}SR=NVirg zS=OxmhasFX53v~(fLQ>)9^r^wCwa621%hUbn1Yt|n}cqiLST=n{UBTx7mrt@h37@x zro<$hw59$mP5_?V!2k?*zaCJ6nVzn@kR-jwOko^Gk{3Bjaw4TO{w_f`Kjbcfl_(nj zsZnw6crKJZUCEdITzP^*aY#g0AYeuJAlM`p5ro%d0F7!)g~Yn-Ly{WKr$EgX)#mM2 zE`mZ&$@?E`CHl5j?8cdq|F5+I|Ib{znduU~?Gn=wYx}pktLF}43ZolR3bZu5BbM<< zYt*V_f~rLalqjaYwI$*>!|*)*Fb|DnHpKuPmr>$3kd|ZOKak1J(E!>znB$**yE+rh z20Ft(f_M>u{GL^Oww4C*AVJP~b>rU{ZxV2n2%_KvE@{uU9e=bt$E@y@! zm(!UG(t1?oPlsEosKk^9-IUnn2>&zkWm4pyLWQQ9k9ob>;BqM+s{Z$ad~w9Qor=&% zUhq5$rwtHC@t$^T-)3(<#DE|#>1RL^{!UqZ5MX??kD2u{p6l6Y$j>`d3D_lY;v&|Y%#(K!A!(>RaI(|*b_ybSezc0jqyNo3*6huFzKt1P)TD+US3Js@TMFX)3wKL z32GKahg=NVShW``{?Myy7D{GReKD3tc8%UCMxEq4#KW@(zwSBe+3fxi)HR*Th9Zu# z3)GvL=d#lrvMHl?A7iFn4ftnKY^u!}418)e51lg7^{?4oSFJ?Q#;@{(a$wFyRDmE2 zvrbD9MP?k)Q;+pus%UwYAgH6=nD?AZXLKdWGV1=k_+SL*d^NJf*Hmr{(vg<{F^pap z)MCcCrEO}E)DTk86XGM>hN?KwcK=0INskyv0=1BIKu8^8LMcg-R`gTgKsqHyA5ggc zB(Vr%=U}mP`GtK<3^wT^B@pUwFym$prxD!Xkcx1PeLhk2^YPyt^LUrLA(y1rpsl`L z`-3-==zUpv-cu&5FeN*#@AMSIQXtwc)TEOpni_^m!hyHevbCnWYzFNTqZxIhWrHbi zGn($WY`T?J$H(7v`=vsa5gS(ydZ0OGpndm)XDHjxbyuGGy@+|TngbsViL5mm6nJsHPTp(a{whz8VT z1|M=*e1<%k!unGSV$M&$+Rs-z zH;7@OjYpfKB4MG0@f#rel06S9eIio)^1midf%U z_cm7d<1@gfQn=~2({!x)!qgQ#E3!Twk9n7sHYXfXlBDiXcXW$|5U_3;Ai10lF3S*J zz}TvI$jhzM{?TRCLNbFcf3lr}O&)sIR+F?f;@(!{8qUPq56dph6e)BXSvS70+#VFU zfMGoHEh%O6ME67wLo1BmVtN`mD|{+VAnALeD(`zTN%vqX@8x9Lc%+GW?pA0${6k#J z9C7ajztDpu0s^oX6SBN^D9nyqCzfPAV2anIRL~c)YJWmu!HVCF+(ZF4Cz6-@|m% zq*`0sezes@6K$qVvxkX?)%3O@BuuIa9o5+rp{F^K?)2nP@*_CkxWK=6+|1U(I7z_! zDp&UhD(tP}c<{94_FHV^7OhrocdRIfNzy7zTWtJ;Xw{&`gIl7>8p}%)C!}^S($#`V zVk=!+_Uy4!+^vQ+&+OQRN!e*#TLv>qQ%P!@F5QfU&19H2wcIka0R^SKuJhzB7(?>6 zr<9ah3w#lJU8#Due;D#U)6kpELc)fY@vo+UI!C)nV!|Lbe2gGn=_Zu|QY#BZ4$M)fp#sw?xW``t@-9vU@N+Yb`g64J;8k}vx_(6TBnDqeI%Cwm-C0al+YakQ zfzhki9|xl*Wd=Bvf1}(n9gM8S(d|ukUMp~6Js^|F^4-t(Xi;>UI*e)jmA0&zcD#fD z2v)dm6pTFWC@SF;%0M2^(uo3DW}l*jD9bS3uyhmJ^fANb^7QZuz&Eb6Ukr}wjo^1> zzedooaVHD&dIK)p97#}!bv_FyK=H|fK)8HLJZwV-(;Ul>#WkE0r8}HcIXd#JtdiaG z)VnaDaUjdy@!Sx8d$}*qSS|cMx?&2vQ#QB7@`E$cJJRitlMoHLrW^%$lMR|U zV%<`kMen#pMQaLoWg!|hmpYKwQZU{_7hyLHr}bqnIH12ECcHM3Ds@RNbd@T;@R2+? z=Ck1lmOcf#G$QUJYsJ?xS7OFf9ZPS97V1i12`i->F+7`_>?b*oU*#imIv{aQV|Fn1 zP$GRg~8Z^;hm<~*rMuq{djN6qdd+EljHn>a2ey=NR$lh_i8rx34ZomqBo$EvK zq8?-?@Cq1~Fp>x}3Bel=&0~Eq&%n3vh!~gLwPFpZZe>R1>4J2lZtgb%n=}%@9em&= z5O)66*EHYpZa?r!Zpmns({99mVxCjK^Dzu#$7JV!v#QSJ7f zf;fzL`K)ku1)FI)GkmgupWUc?h$WNMH8`=te#S2^)y3<#u}Vm*s0UUZsD&WX_U$21 z)?v2Itz$)~h6Z|k;a;Ms< z^loUs`4WX?wh$527ieu6(b$%R=WY0W1WSokyw{2Rk%>O+)%F8Wm<*YRh0WwQlF|Ba zM-bb%OUY=^!YDj_=?+o0whIjF7HZONgVRKTPSY?{jFxX;OWY%5zwzI%le$_^N_-HQ z+rL6s2Svd=e;<(2@_f8dgP9r)D!8HGCi0theqEQ}}{|U#|Fo_K`DNUY)Ac zdid|>`{&imKV#wX%fanz14#~>#sc?~8;p|zNNK8=`iwR93%~hBhN_%AD$#hzzx?>0 zTPrG|cn#m7<1<}XZG*X&==kq!x{Xxv>%LC348+{ehzksp- zU#<{0S9K%Z&IN4^H;yDBD(W>1J<0AwXNcKvu8?0V2uuHDrpn*2OOj3H5N-UW1s|Mt z=XyKIxVa3qy$l(BX$;j>WPaKVzsmWgA5}@DDZ(G-=PON3Xz=6w#|V9ibyfn^She~G z3H87ev+V&;vKpq@*zoFNHP-4HN90;%*ao` zukHP@tz}|+k$4b1HbY$CRUY^aec|^UsH_l=j{?%jWJM1>j5hq*hcd-GOmV%WmpL8v zI6$LA6nyNJqS-SaS^@Lgp#OM>nwvB;9+THY>){VDMMWv{jvFfUre?n|SZoU2&J#kY zV;0dD%^TneFSrTNF%K6gNT%^%9^PaNd{g(i|G5un$~Df>7kK{lpPvV}@Sj}a84i4G zi(=&;T)!Fvnz_|`sWQC{_^{sj@!cDKL`I zb3{D=Gm&+l0mL*Xf@@3CsaOpLc4tXb6LPR`Y&GHN!%sgP&lcyS9s+X*JzB@oNmpZ| zjH2|ICqCaeA&k7{T$}dc!JHr+=yrbIn*@Es$50Fk=-XaRQWlTjc5PQtvxE0l^+AcY zxn^xs8p^=_{LiF0MUQi50tsgh2GpF$xCGs2;ql=F^Ntu2EXEU;l1EG835aKbrKl&cc_ItMqG&o zoRMj5u7BIk76y`8D}jLm!{czwMw{gl!=QB=W;ImnG+#U)!!*XcvN9>J?*+^f?itzU zY+;=}P_EkS`iJXtd1Fz24X_Xqb$n-X{$IN8=vp z6BWK65R5)dhw*~ROLGfNB8}n&EJjY;o2i?a$$R0>TTH@c*RCsKu|jZAl|m5eSp}oU zrdRf5D0UR_Y+$6hn&C%GglLFurb^47jcK&&nG73kqopA^D4Gnf)cuXB8z*Y0qQww3 zi^6r&XLivvX>RJRhO(Z(grQY2;S@|^HH*Sy(}z7EHS;ka_wyDSJJ{UI+e+Z|6!5)*J2jY_Fg({!+uUY&v}VgZ8e}JUg%1>V8IxH36|Y zG=Px5;gp;FE;F=fbBuceFd~Z_er)wTj*G^_Ovb>H6Fl5&Nc%oD8>Hh|dwo-p%r+R) zKJfgPn~rN;c7=l>(_lO~#dk~_l#OfcCe@ysX~Mx++y>M4+$!5gQbrh8J$Y<4(f~^l z`5a~G7gU$PQ7^iURM0$PA6EAu6ZylZVl;JDF5In`$K`Ksq5E(vfH_Aqg9%7VPh$`k zMOm3yUI#Hw3cziBcS?1@RFJ-iy@zOX)+wD#2ur2+k=lHmO^#~Tw^A<8(lb~ z6_t9uynws*Ws3k=b?AaEo#qRII7FxAiUC@@7GfXlm$_M(7=5`A9kaJG3>JB00xgH$ z-xsnH*APzgAO5(%sv}ev?;p@~31m}Pxh-`Vq`#8{oqP3p)5$41b>0*g&G8Qr**+TG zB`1DwWgGE%Q`#qHuElH;-6bh`Bd8@|3NhC8yrsW&$$*8wi72XbPVNg+!<>T%O;mBri zqfijpc~*g@tsz4qHB*Fv&T+)zd5U~oGIyp0-h3nzx2DFqK60r?;}C+Cr}6YSiFbsC zy!sF{dw_92x@+gKBwOjQ|E2*aKF*T79r$W3E1B=q!3bh&Ncl;<+C_0kXf@^|3zdRB zDy!{%4437A$mYdDZahN$?C&Uk3%0QlS960gM`i|Q(F8cH%2CAgH_Fv|wKumEq*&km zq94KAv4t8aAwG^o{W#4p(xnulX*KkxYHFiXxPUfJOYkIhDD(N!ax6{-jZ){Mu^z8f z<6TQ}Mzr5`4&HUn{@Q~p$M3zSoOG%#gfGJ;SCN()Ttn*0#;_;MD!`o*nMX4mUw2Dx)&J3-P}3@|6KeIMonM8$ti-&oa!ngaDB&@-tW(EwOpV%|&+QulJZKX* z%OV@$zCM}3Mt%xMQtp<(4EGrq4By$Z=Ga3mYf3+vM|TymxTw2hC4Oksv=PtywY20o z$L*$I(4<|A$XDs3-@#7@2K$f7zm80+tR&@SvwsGoziXfGK%M#lUT=v_1fR0EEt!QA zZ)$W@Mb?#5Ymns*`;UiAv*J`hbxl-<$?s>0`Y-B_ruNMxuV1Epj(-SJB2QCkK>z$X`PSq{2FFhK~F2n zTpwan4G3m!37*INTUr4urlXzdmTVh#X7YJHYYT~_^Vk(uk8NSte;!YOV5}GFQ#BrS zX6mkV^2%)WCsuL&(Bs8SyUc6S=PCXg6r{dyX_l>uK%Buy~Vro&%{&%gR?` zsJF&Og)>d~Cmg0X^GP=#dDnDKoOrIk-jUKaCK}=btb=0-WN8hwsySGrDdq9abc>c_ zoDMe6u=d^-#@uCO6Xu-((zMsvvJRgiXq}hg#IJczTdwl7WL~ySPCd_u*msfZ4?9+(K;ePJc%Hsvfq3@kGjSk-stz_F*A!}qA z()-l~%RVD;s`GdDm9bQ;@)aMy5qD+-@m})#){l$Je#-7=w8bw0<`fE#xyD`k@2;^04dOExcEDe8ZuJtIKyRy&UA(FQ) zXO6NjcPU8ksOmG9L5X|Vr97p;`i>7y$<`V3$wLtD4i+W><)wGkS5N0vcCJxh(5tkT zT9f2oZN{r+>0IwnC)tR@J!dw~Iyb*qSyqew7>+V8EKR=xPo!)6u?(HZ9{5xrM`@`L zcbNu`EcbXr`**1h=^;JrUH6#=NY6aqe^M&j1XDTMq3pTkFQq5#mc>5r8~-vBAw^Ko zK7sxAFd}gRoRt7R{GO5K2=era$?#>*<9YTiN_Ts;=9jabw;J<^-Kg!qJ~K_-XEkY` zpE_qdck0enTSKK59wFAa#9v3cXFI(pu&u=r&fboT)Sf}x|G>}LU7s7==eX56?W+mX zdg?cIHW96ChjUh1rj#u1Xc(tf1u_rA>W-xxqs?Um2Zcvg*F$8a78yjJu+i zPxQwKl0xU-K5v^6gcJX9tqd z9>vUr+?6}5UfFm73FUOa-a*oQ4eR6kc5@(NbjZ-v;{t<+XqSZGD*P8 zQ2~2#+D=) z?BL~SDMR)me5kMI*1&-U9SM*?qb0v-e)J^Sx~!+-cU#UnzBv zEo_Uw{XR3l*e_rH_jJ-0`yBc1z4f$z_uLgjzSOgCf3e+Qw3dv&T~hH_1nhI2d0f5D zGb(v|*;?)owvM+`oOJ(mXC|Vr2x< zTJ$!|6?#zrQ(*fAh|2WFod>^S!3D0K>e+ zB=m%Ng*IRKa$Wv=n~OpX&u+H#J>A`C;<$xRGz9?Km*3xs%!<@+=t6@n{X8kIZvD|d z4{*2?Fa!NrkKh3PVyArkA)Rt{{bSPGpXk?|d#C@|OJ^y>0Ts6|$TWJ2m+NS-B^06z zCpCi_j92m#T_RC3`FQ~&lv?OeC>*K zR+wGQ*2sU{vDY#L^=-hI{sp9fpH2yOx62E`$65Z>E0wK1R@dC$$}}= zw3cNZFRi?W08-gi{q5%zPUBm8I|TyAEe6-DA>6%HuVzM=RGkU>^aug<)-jf28oHC% z4HC0CBo;inZjFcl)2M_)+SFh9<(1T80$8@H$tUobdoHTBAy12#S_X?IP>;g(7}l|H z748%07Q`mfO=-2Vv78ML87?c*GGXWPx@+ei#prG`Kr!!~@f~2PmAN4qm13Es@d1Fl zW~JB34IzpXlp-k$`=`u^<^9-&-X4!8Y*au*OaL1%;u81bXK@ikw@bYU$0XN4(p|)l z@FYf$_}#UEZsm-Wqy0P1zTu@sC+TLqVH;gUR_>k(o9ES*P(p>47XELolASua3ku__ zM>9Sd5DA9OOpE>(pBDSCZNE@lx<)d0@L83r3>SxYOA%H}3eJ!usLFmaj%aT95AGqU zITlln2@qJ)-BOg%tN;@ziXE}OezmWG=m3{|Oi|E(@EX`Ry=hCq=tRc1vC5K87CHF-HfNPoiA z0MA$SFGRs5^m79kH}dl8ttIr?T>RZWj}accx;H1qG5nLLPR94&n}XxNe&~hQ0?SaY z4$%llVqxp%#2;B;pkJmw=0SSU??QfGVYT=@jaOyz1|Kc|*kjxT3hl!^UcoRvyFPpu z{IZPcUI{pN+3TOP!H;Xa7|9~O;32+70nuyMH6jhW?K>h3jWOc?S(m$;mZn!($5`vZEH(r%tuJZPBFsr7O?>Yte;v$ahQTr)Tthq0mHoV&|6iLM} z6>UPUL47+9xgxAuN?s)jNF;``Srf>>MTJ$J`McL;KZ#U)>2l3IYGV>Kf@-CMpEoNt(MA*-;)4XDlOeJ&;@5!k6j*8vJR4gX2$`eE z+89J*vCMxLlqk7OdSj^+OiW}qVamfMKD>{|-o(blIo>$hpT;`GtTUnfPEaheV{9(| z3TpW zv~h4YqWb8~bUo zU~OCCLe~m21MK)C*x|>6r;(NHx zde?+L6W=`Y)qtyD%JASRT4vVq{oOl1zM__IZrGJ%-LOqf7UaID8MDU92v z@}XKw^UZ7P7NQn4_o?avz6JU)x!RWt1O%IDCDr?i*ui;>KPzqO!7+*@KbON=zWDOqoPv;pskr{uq2$}5g*?9KRbj;|F zH>gpCH<`bMmQyD0x?Be&x?u-$!fOZay0iy5#k|h@_px7`pkRAWvR(aV(R(Y;3(Ytv^`1YNr&!E>0d?;Iqhh|LN76Du|Iz3(1yy}6hhP9TRruRJ6qA>xQ8 z!vrJ}PbDNo;%5A@w12NDvWp;%&*TcBBFD&KoE?YLJ>n<4+_R0&l)5vG^2sr6^5HW% zrE|6kry#Y-rjR0uA#))OSL59-R}b&5^G7la69Xcc{PG#uJsx|?jQqMcgS_}P9>qZH z`9H>l+m#XGC!frb0tvj6ZDN1mbbsJI2Ee@N$Vr+S#g$I?!9t7PRx-5&57gQHi}pwD zuxu!}M?uvb3p%|c2(D#)1XNI|DTQ$gct@^NpA&TF(;Mvc9 zpfP`jXRvTNfokS4vBb)g?H)sGdy<7avIQiV1_#>Cojx!j#)^oBBP|AzAO`{|N7JOU)qqx=MH=`S-1vtW|h z-KR*@+h>r$xBPeZfAj2bC;@bDC;}D$QL!hG56HfuEJ0n!E7&*k&yI+`p|JU^+5b%4@#ruJOJxVpWw1KG45a2ipjA&h`3Yy*`H?oe`3YAhKZA1rch4iu{2(^l zIX~Jj<$q{Dk^gt`JwnO{w12x;tR*1SV;ITN`~iI#Ty?JTME+V!UchVjNZw9C#_sU; zIf!_9pk=q6W3h&f_p1Ab(m!+h8RSsw2@r)?ujl+|CTlR}0PN#e1(r?NYFz;#wLbPy zo9{uvz6(D!Wa&`0QDqWlWTgKjOFZtAkyuo&6y z|8x_@?i9AGzqx0W&5fSP;Q7%cG)mS|s!>sDgY0%;v@WHftCR9M=k{C1+^Ac%sI^dq z7x3NJU$Oxlyc{F{ViVhr`C5CmE!M^;E{QaH&zj6BzOYZX7dPpmq{5Vt^$bLkY9t)k zA-l?!sN1?`Ep&Q&)U7F1wAEcrhni3=;bo{?rP@x5{bjRaHnhe=G3#KT ztp!rSRue)hSC3_=&ojQad%O7SnHK-E(wRU4WKAm0KQkIu1)6Qx&fThxRNnN;IsGqI zZCWR^Cd=#^ziZbUR!@VZ*|ZrWL7OrgL<6*@pbN@3)R5k7-OVk|n%PTil2UZ3BNPQnA2L(QTJ#b*C`14l z7=q>vDyLz^fpyb|%sR6aT7o98DUG`s*38u)7Tsv_J&RM;x-8l#HbP4noiol*2J7+- zS)&?B*T`SR1hPHfXm7=X=|xxmebI0*A3XL7E3vCVm9lJX7rHqch7FC5^)G8aD>EY# ztE4hw=UimcTe+A@$8a$72yc}qj?dprJ?pt)$Duf=v83^b^Xfia1s@Z`_$bTrZTr(# zB|Mj|KEh=sG?MZglbZdFIRBlB7I{?-&aKqljd)ZuUu;v$g2{H3M$JiyqF1MWm}rV<6NNr3(&n=;~3$krCX8J(wU*9&7POz24A-<`R}YCsFw-Y$ZiWX zVDD6(IaCx14)gf_cZ`(!$$FEy1;a>m8r!OjkL6g&2Wn(&Tt2ZbLosnB<1qminwrL( zE|jX3zL)5ARI4cO|67H`R7I{d3L)_S&0Gr0&_=}m(|O)5N|_ALAJ-K zQ(iU^;(S>~nYkOv!})UkODi{UYPoOd?ZW-=8zoa_<6>c6gpD)0ry#pHcnD5adqB1) z(mOlUaoUGwgLzc;!ohPdJD{rVCQKZ+WrJgel^xz@Kl`L}KRaMd)o(A`BNc`6G@K%n z`)P1LkNQcZm}l{8EWL>3A2r|qV(guRD{Z28(TQ!_nb@|IiLD*mnQ-ErWMbR4HL-2m zwr$*ezjN-bbN;(kU2FIIRPR=;w`+B;x1WWGN=8dgM-_2YZ&t7%98$sSYaq|ZV4wjM z1KGgtqP0Y>6;R0;Tuzhvp|!dq234Wb&0vxvfhk82*6@&DI+3W;5GLcO_OQhHdEn0W z`inkGGCzC%>4fK_KnYemn-V{sTh}u!#?1TmlZ|9Va{BdKD%E^T7@e9sKC2~Bc7H35 z^adzdjkL0L)@7bMcsPg#qPPJ~pr?&izImfC9@$#iL|~=Ic-qC*exHw#kx6tJs6JJR zWsvSXn?=>TF?#)gKQ2dfpnq@0;X79jw;-a)RCJ%~(tGpja~x6h>+c5%;T!D7I3f)V z?c2R>J1Q!Chr*n0I{fyZu+WMAy(PGwApTvveU_CVXF4TMaD5jQrICsV!1ZOdbQq@V z8omh}`8gcG_ba1Zm_sQhBq1E!ya0oz#nwP2AxyILI2!^xGOxEMQqY_OpMZ-|!J>Go z$7GyioKb8Io=^maw*&=ix$D0I7D!Hdg9i@%&1ik%xM{MPBk?2MG4CaJb}F}fj`LMZ zdoR=H^eEM5HG0MC`z@&l&hVxeAjHcxO$6C`$)G1GXn2;`%QSwnU>AK}avBvP!Kerz40m32U5#u2L$&lAjFUiZ$8V*1 z|Dm4;X~DKKkJ0`W%bWw%t+|N7^>v&PqpPiTdEw5bUPh?xA6(9u1{Z0+7qn6 zjznH7?V$fTAK`!ktlL4G!JRXaHUl+0HS;%);uIUVnNH}bm`NxS{s_Y>N4GFe)L7Ok zG~g|7?{yWCYkzkIiXhbd6G#^P1#xpdj#iFNXJG9X$12ja*enNogUu8#{ZdOkKUHvh zi&k2ZJXuiZS{EmchnQ}J_h9nR+b7=T?ZP*Wp>{;S*GEWhsb|;suL_5*4^(l2I$m-6 zdM`EeJbQL%Xw{2s?2McM+O5uAD$P@%iU=!jalqxGSCIh#D4cCq}_Zg)kQVUlcpr;`ZQ+b(z>Y>X`krYf@93bE-AG%Oj#Qw{Zf~lBp z1~Zz1A!F7DD1~W!QEO^BWvx9IG+bn*Vwg`DZ+6FdQ~ui1 zmq3p>Uvh#e5A#o(t5688Sj=Lbo5J5h%1IlIqtj8k$Byg3{UQUks{ViS6!;DY2_D84 zJHFp=Wri}!VZtJ=)9B1qe?V2H%Bn1-mD(j2u<%!Ki#8f*d@G4v5wHleC{)f$`1GUrngiz}!VS0L!+K>&d7+g%4 z1YTaNcaZvG$VT9QcIugOvq2+8Yi4~M0!0&>2B1dO%)%_i_^9UcmaT?=*a;AqfS;Bb z%A}gK1Rr>cLq`HWn|p;{c3h^(?+OPAT~jzCf;8V3thrSzwZ`vt;4-Q3%GTM?q7hWf zGehEMh50HeI~-=53lhUYwTV9EBsURdAsUHNV4eAy*a?nY4QOg2!$EbLsdByxthG>0 zr-sw8G+WFum9>{@|f<`!PRO;@Y4_W5^a;Ltq@6qifRKFS+; z85B2+N5hf}Ub{{2UVNvNN8Gwg7g~C!WJ<1b(rZjkHwXIJ>7Y;PRqLpJk80QQGBJF& zPW8)LW=a{8L3^}cyfQTuHxZA)YA>x>eWm3%mm%RVB^*976E+&-Q)djil+)4!$ zwvvMZR!u=i)%SaD04+cZ$DN>XP~GoI($?cOqZd3mXb=?;dWhAEBdht})5hLas;TcP z9dA1ms(^-dA&8GTw?;OWmo)d9G{}2i)uQuV z)MVaY7$Mz=hueXrffSoEd`d0|Xg4T~w^Q9eH*)m#~@SV^QMoG5P>3t74Jut;NjNNkNF zb*cLq-G_#i$^d**o7@9SX=w|J z{vu%|3+}^(VcA7f%d020w1NLmXIa|dm{i|1o|KZb)qC~bI|&mA$Cr%I3I#U-hwodV6diu@qJ20~meOUEM1M%n z9D-T^ab-eecDM1*`&lGo16tEJQNysU$XX|(Y`Es6;r7dxQzoG$0HVR z_mp>0ys>J2^kR+Dt`v1@P;;z#x*C1rUE#pt(brrQEh0?PvyUWIh(=1a_&=P#)N=4* zF>EO6V5;XsVRTNd@V(SrV;(ZbjGZM3lW^%@(hjs45( zJ~S8iJJ(WMz8o|$+@pn_sArD57Cb~gQPksXCz}$Q9UAnU`zt1NKZadJehx-OWiHcU2@@^O(wnj_cOn~r zkjNqSvVvWc=1<4TG*D`6sfIu(iJq|Tzmm}`N=hV5PztTv$tGy!ga)kSg+^H(AhVz;sz9Nssibd8@3x?5`6cZ|DUW-K zsMqk5;N4}#L|PuzGH+0r7_Xw$`P;&*q+GgHgKw7sVxEjq`6h-juyp#qme;! z%oi{#%pD`GbCbq$2Jv0{yoBXEnr=2K3%{qY@@i+j@@ttH*f@gtiD;LTq6bj4Jq6UK zBL{cgiV8WncCd>pIk1n@q9Ga&jr}gz)Vm`G2VK#kJi?9~=A-p*YFSA@+B=h8Q_^m@ z9$E#gtbdZmr}*KXu?12s zF6I_-=|{FaVwKhXcT%fT5zMUe*G(mhaB#gmY;DPzb~)4_yI_)kgGZARMgM&vcKw-*Wv7H*hS zm_MRr!2i304%iUN;6S{<%1E_wAeYTWBikOwuIaaz!47Hg+&nHtlZOLm-<2DDJG=f`qXlqT-q%zYfx4MYh2!#@}V2)<}xc+m>3-ucuQPMZBM@F zGk!RiX2Of-{ZD+AYQ@o(!)DKT^BjSarg9{n!}`1uSbl;%6qe|>0vRKR zG!&Cc^%|s<-q~o1$ExG@RqTDbMcbR+)O$&Zk47j424XhiRSvP|P@Hl`3FvB-OfC*a z>zs3LO$w2xEs+x*B{Qjn-`q6 z(vZ&j+o@+fVq61(h0t=yixgu}TI(kpo)8BdpHRj<3?fAES_5-oKjta30UxkA4L;(F z&fl4u4j+hP?XI{f>$OL)M%y`5tP#DX1e6{E$ZT&_HSw=)oVZ>IfA)HeT}tLxyrdlq8!sT z#%xR81N>#5QFnp4#;fG1?>3h^ub`Yap1>L}-$2%$K71$NeEgjwzgu}lNEcg2gs{k@ z3kJR4sbLU?DDnJ+}=de=0+#Q5*He2X-Y*McFBmQTI0NMKpCT1wQeH)sC@c6cku*f@b>ZJ z*h7$OLvIS&rraF7d65+qaE9Y|F?9fvd4_|51N<&G@$~oRAw-}f7Nw}U31xb)Sz;S+ zkBB6WQo5%;Jiy-$iy+V(l?CFq3Nh?S*Vde)LH-F$$eKU@zHNaObnO%er0OA}c57w!ddhE=&bcXBc{Yar^K)> z)>2dL(IR*|C%|%hR8#3;nTJo>+X+0q$lFUnv&+|M4t4a)*IE8f>K*1%fI7V8q;tsT ztN@pw=F9*H8~uAwU967oMRCTObYiSVVl0msIGGqYrx-ZT7`P^31{>>5f#VUgtHt*3 zfngO~5Lb|_jMUCPUe{V$Js%B`FbD*4Z4S>LnBt$OCr35O2(CT0NR+$*W05VdV$Sdi zG1Jc1!8avdf;?sou5T`i2juOzy^PlZ4tql~C&3%Z_< z)hCJ0mN-xVztrSsgHNj>b{ZfLvk~}`7BfYkn@)3>`OdO5Zm$eqc$&sJNiUf}i_3Vz zwxn~bMN;WKMRww)*C7QISh}yz)t1j@k0e0SXZ9u}j`rfLQD2U+HhQ<}nnw-MK|9uh z3boPxVB8E&JCkf5ZtMa=|M;|ldE1P5`p}h_Cz)0Un+}GoSb)8!-sUf#O(DQC4wd{ZUlqjj<*7rp4_*DvAt-88w&|eIDU5#$g zq`m5!Z%R6Tie00!W(NA)*o3Kf=+Cvw;8r&hqSB1$+47TX#dWND47Y1q3eXnU z|9Z5tww0!5Sy0g5TE;#PwqaY$NyYk;A;~UIM3P=U5rE)1p32u9&=+MS!j^m+-@Ni7 z%Y0r?B;<5>MOO?QPIGFo$jP?m!+z0fD624TVq+kdTR%#>?vNhP4ij9O|J_=4VW@5O(4uqt979=Ml(H@;9cwE^h=^2S6{Dar%y~q@#^(7asVL@`v@azCRGu2dwl#u5u!16aAb+A#&xWFgw&CHwmcwv{MtKM6y<$D3BsbTA@^)@fnzL{ z41E1|`UC<$l5C3`h9x*!&7A6m>sD4xmb-`QS1@FS&RHmj`O2uJcF%)~@E+CYcCOE} zmE@Etmj0Xxd>udS$z*2H5WE}L_RL{?bqyMS?Vf~sKFue1p04wEyq?uYH_(79fOKAI z4bjT34>bbl#-y(5IjS6+D)YA19^V|+JMno6iH3p7cA`)pZO2-X(Qye#e4^sSmkVOo zhRl6OOK*s|n(99t!>ftT+N^ahBOXLbOR~cD?;F?=Yhet$kLNQx*6&2LEIb7kPSUMW zo0+#?smkXxmcZ#?Ko;WzHnf%`yNv`LmvvnzFlclX0vt7T9n~rX?9c8m*atXk_*2iq z7nJ}kzF;dhsZ{Y7}xA_SX7Inso-E0m8EUqehs8ns2tPkck2&%nwH+25JAi65i)73|JiDH zT3Au*c?KSWyPbEYGD?JnIjt54EBoaPc0l*dmSvh03i6Up`$P)rl+NTt@hlmD?>{^6 z`9K~^#-?E1GP?(Q47I(7LUJ4U$GH)kijk3Ck0YCKj?obdTOOM&;VrH!2d`25jBiOIfn1!Fpb#UC{WCB z^5I0ixVo+-Ep*8#Fjm$ovG~UYw9#=6efhTR14RX*{l8j^ylN|#!s@vntFbCo_ZXS2 z#aZ$PVU_RbXTl=MA()iTktIcx;rE{^KQx`ptdOwPi;w2n$6G3m->4SO&peu@AT$9u zbM-sYwg?*(1(y^u7eaC1i<`&NB0!C!im|6Eq5&$+eGdoR8Par^c{dblJp=xcNZ6t? z`AfZ;Mv()*!}2OqcM+zy?GLsGFRe;uxL+ACL(nyJJNn6xtt8+6bw7;?BDbF$WtySg z65YcWUaSj1yQB12m*wi8taWB>BZ-#aeH^w0@i0v|a*G0olTn7sX?(-|+(7rWnD_nE zqJoh?x%B-T!M}uDx`Z=4hcCH1Lqkr2ACN20FXFFc_U>K;)5W}B>GJ@=&ceq~6~5Vc zbCSjaVd`0?Ed&DHHto63e}OpG`0(mJIcE6U1$s57&^YNWNtS^-w4#fy8ugtnI) zX>Rhbth4f*A=$1LX>J3JKRQjASC?Hww7@t40CUxA4Lq$*9o^HC*MjZs3_*U-`&eyP z+AF|{V6lHk`Babsw34X2bnhoe=Y7ue5Ttq(!=u;z-KN~iM^DT@IUw`G-y4Bd?YuJnJ7jm*M)AOjCPFKzf-crw^Dri|xK8ePi zWk)9TEx!&}OY|iH$~3c#eR*$pLieCg{gl^| zxoc&TK;ELG7&>-4YT#ExSGwaT-Z!BE)W@sE0ukUR7FOa|^?pY4G7kK|oaA!`SenvQ1ZV;$kr;SzcgPaObTCt)F7N37DFvL}F+YN%NP zLyqW^swvk}*-#z}8splzN2w4gG{wrlm8HbFg!W>*Xuh-_8aS=2ts3L3CmrrqQ{ma46v@{fb3t!$uo`3ToM|)0a$4s z-n0zBeW>|lgQF*dBYXeME*RHOj^&s1|MdXp`boL`(kw8Zw=7q4H>O-cihlNvdiE|? zad)O{a~he^5FMVex)s0!#5;YLEBOu(SOv>XpF8=DOyy2q-xv zl}(BNkf348Wabt5&V_`U=N$ft*~FKj!p+-%ca}{9k15J))UT1xRKc~yeHb>DN70sJ z_H<9DSBO3syn-VlwhB<(8To=Xg%NTSUvyvZM3XfkL$IcHCQi6|`vEB1@M zCD_Kx8FE8*#xQG3U7Mfpz_yEQrlE^L2_hTP%a8cohxi8S)DLLHWM;h2mpyxc_w(z^ z6-VHjJRGbB+5ea)AzF1unzse?aSe32Fwn zNb&>tc=VXO@k9A2HW_C4GXXAXhaPKUcJ+Alg*!>W?6^{xr6wM`)Hg_4T9a15v~2?5 zn#d@`4tlU4ENtFpkHIb1f*mEnV*N=yXlOf6H2_f^3oJmLrxN#1;S}{R{U4m45%K@) z!GZCxOmS&E_FOZEO~PK-nwZLqPaJsD(FLCirU~{UXPQzJoE}(dZCYW@#f8x!`2bf% zB<_DL#m#SW|Js>2S7UQZGQwVLI#&w&e+!Bj-qWQ0H`M<%DqtkJT4027voFkK%G~^~ z2umGCAS8EHvmBdR_{$vZ&y$)MJX_fU1|5APOt+L(nSp=pXeX0#dz9Ogii@od>jLXI zBbJ)gBEgl%gw+zO7wTU_s1jMZ&hD>nZ!g@&^!45Wp$+dt7U1mdTLL~UACCB+Fg~R3 z1$)p?@BLf$M8GeHx9gitXVyuitRv9qm{arpzij)ST!&Yu*jI$te<3?w{^o^vl;DOYMfbH=XIm0XDdO`zhJMk@y6I{E z(;1OJTYH@&);r|>W@T_D(u8_{|4eslZNnzA@#x?Cjx&T}#_;$j@oe=dnGNw&v`vyM3;Wji;fDdf<#Y zDt_W{LIb2dl)Vg2VHJCVbV6;P%81O1x-M*}OM3As$YKpLf%A8qAV(nj6Bs!goi}#V zg{oU>Ok+Ht!%%`i9kI2-HKosF%BIvudRipzGBNzOU)rg^LTJ%F!$b($@yYDvk|6@? z&Q!s^CN#n$-&q519yXxU0=lr?kWoCGu6Oy_3knz!85|$5?~#QxDvC>|EHc6)`P43> zyJ-AG_bS(sKVpaIJ>p&;Ya9gQj@GZ!ENpU*S2p$nAj>@V0z1Cj zz&7~kb?M?rOo+4(AG{&Q!fkDd1li_y^}>p?jUjqQdfq|9Wujq(KvZNc!bm`>K+CtR zg$LA6d>v+?`&+OQ9OXLj^Nz3TtD27es;-2nP=AEk;q|?0mus9tE9rL)E)?}|#v9k6 zjZLY+y-T8T?<)~qlQEb0&1&~mot({w^`gGG%TDnfe0t@2>4E+;c)+>zz0}TU|8vf# zwQDG8`ozMZGBv6^(W!_3LAlavdsVz?3ldPRzo|&l>rLwgCRs|tN1b-3%-DxNo`G`z zym#PJ3Yot)6+CUhXC%U_i~pB7+9%xGL3wK}uMXy(%-d<49s(ZB*kbjGDtGZTwYcBh8?H4GJ%DA_~GJc&1~cU49Lws3ZE@dJ{B!!EL`pzoL#)?RPm@8=eJnp^8N=UTF({N%o) z>P8r`f1h84qvM&;sahijXb+v-Ir@_m^#zfgaonAdzmLAWWr zLbX>ufJYwgT;Z6F9!UBQyaPw+XNUvFrI&7}l!=Y|(x16WitK%*fjIGHBfzVv_sV+k zQ@U4&i5de)FNz1U@#zblw?JlO@}v?q(u46UVKgYI2zf2iCRP3e{h zFYnYi1v84rn4?#Jw<1PA543xRo5O@B-N@e-{@#?SG5y<>|1Ot&WwyIC#pwkBKDK-T zC&<&*(QUkblSP6uPMEu~vJE`@kh&R8lmI22SUrz%KIg{%=Pe@8_Lt3qcEMb#TMCY% z=T(dqWL`pB-pvq>FTdNEhK;vxsW3$v0b*6O;N?8CnhmP(oAR(HgJxnC-GYNJZP&Jt zkb0X3f~}@#a`Q*W>yLbyifG2?=C(MNXg>vNQTm*fgnGQ+41x^M^9DeX5N);`Q;ivG z8g#`m(BJuWLJz?RV01#^Ma?-oVA|5x572Ci;Vu|Hwa~L>V~NTL;VRPXPh)b?_n3)W zY@)<72N)goe|&{@6U8NnA@}x*TtKv4Ti~@lk)kC{#=(hlJSxD!B{eK(OxBQ(R;URu zZtU=KFvlK^&PYlVYSe&h9%;gu!9&UEkAWP@FS5oZ?K1S0?=>)`?+w)Xe1OtQqa2U| zqe2j^zoSJU4jA4OY&6mX{-~4LcEF)C2nbjzXjj?09PDSx1HV)$EO#=!eF_{kksPE9 z)Y;2K;{n_c5*`hjkr$o7Xo&TkSwz&pYo<^|s3$qM15nGtGwip@{V$ zP!h;x06H(RFh?RA<(dE0YREPX%*;^cKXGf&dUO@X{7Ga^s5VPcC}Ws*QcGmN!zk1Z zUk=E;aQ3e-tr#GO7Lru%Q6Qabb!rc7mt%}An@WzjEV+kE4hVEyqL}<|{U5nzf-_JX z>sq`Ph-_|baSAwO&;-k2oCp*WDn$wE!bi`}l2IAB{XE#=RfyspOOfd z*;g$NgnLz6a4YrTdCRy=<5jq;OY+-wPB!{-K??GUKt_N&iIT%=#2kAiZnhHVGm$Sl z3V*7JZW?@O6tB~8-QYhqg$ZFXd=WV_*%Aah)h}WyBf<#-f*C*SK4x1Rn!F6R`1Uq; zcY3}FqOlE{d5xh604r2-Wjtbw2Ni7n7aPqP>{2kT>Ksk~B7VeM>Nhn&rw6~t=C3B+E95j>~+*mj`GtNqK49TWDTsAFK;{7 z;2A1crbzZ>MN^M$;wYA=`f$Q@=;HqvJG#*ZH|C}*=*wFrCl~$u3pK&e0@V=@_t8=0 z@HB}70*dYEJ1#2mitL0$EVKx(ZcyfHRn|VR~e(9WA{2SnIU*JXA zZl<5<8gSTIN#v}k(OZWy+VyHdb{<}(S;|(4&`|DMT}q0OD6s)GYb6Lh0|&vj&>^*t zi&Z*5O&n=$SRm|T5;~~%uR&g$T%&z{Nh;8c##U;N2j6nq86!`4K#wN0ja36Q@iA8! z$!iH1!e$5J3rS?`?Q2^fc3guDorDMb9+6#h5E2%NB%g-XK&;#nX&Fa?utreLb`7!y zYJ8VNt6Uox28&T(SY9|Iiu+^&YhK{^vaa9Y}#rr zchPk@yLMAonvSI;T4~jQTJ$4oc1_9N0-GHu3=Kzlnu{LC;8b16G-MRs#$rm4+yXp% zbecc3TWGFoRsCK(I4|J&6yG9h(2gAYdRGy|#V)Gy!d%a*>JdTwB!k1cON`3)D*r0b z<^NTsTkd_qdlN=grU>A_PuMQ#B%cane{F#mM`b6J+VerSY!D?8%Bf>t0One_vLOST z3;TTtMJbtTRSzB3@lnndRh;&F$VJI&9}ltrrj5jtv`9Y1tVA7qa_A_UvlFL7C6Y1s7qWO2o#M->FKRy7QxLnGb?Kw@8iccViScG zty;0;#|Fu1&HJiQEnZe?1zF^S#1;S@|851JZztL-aVn+0DqCJ}ubpNv7YHgj?(Rsi zv4e#P9G}kLP)!iH1S>hx81Fk?p20XEMdY@oX~^xEf;G%u&s$aN_Gq@kP&6Ghdp>`r%Z?w(ZK!7ldsMF* zjZPky6I`&%?=Mllw=WMj&=ORpBHyUZ06PX@flF2P>w(+uJBjiKrfX_3svBTO@#%aX zYZ^yyJJJy;N4uO3)8Zu~3B1}EUcv?^lO40}2M~AjAq$*2=T;<{4s!@e^h3|#=CeYD zkFZhC4Q6M}7KDuFl~ZQ&PlEeqv&vwLwyy4fFA~jOHzAZ`t)Fd+pLCnLlMUM{KYsu} z!A=$;#FLw(KnRoHQNRg-tStZM9&Q=EZc(eJv{lGB-n8jX+=}Oi1OYLETj!T#N6k;my!QH?0-rY_ z=&thADE6)^-1cIQ8kG$;q1wx(k98mSM?={@4IjF|#R7iiiNMtwA0NlY&RpDnG16WR zhrVnd`q5Eb(QZVb`+0}b%KKK`B@Q}XB8R-%dr~3w$*G%f zDUkuJQjh8^$mMz+wsF<3&m?DqbXv-`hykrnX^Ot5J_EY}V>N~$ZwKoEZq^+9L))+s z0z_V5BUdsZEtH3drkkIhjk^%T>wEnkyKihO{ed+{HAsap0U$$WYM0NmO{BV!FDH}Z z0}CTkGUXLstll_{0akoWCB-o`* zxb#4=rd_L)<`YCVoOZN#3ttBPM5L}sp6Wr5H;r_|`mmS)Lj=~A! zGSSlPDzFt^q4e&GSwlnd7I(pUrE}GkW-VPOi2%L#$E}`d#qa{5cBB$>*fk!IMD?!fcyFgd_K$PCUJ&ydqZ-#gl zBqT#u$g|}8YlXKBnF?ZOGG!N)ZW_O&wct`w0vlJ`EWNwBH4zs z8!rQ^)%n#pL~Zf}0A1Egc5Jgn8j=lYb5xi^aoE~o0KVJr9m>P0BQdrz9-UK1X)6%z zA9~?t!biQRJslA}yI*CI+{U5LZ;%h&#}{36?D6t=-C@A_nw0wJ<&??$#*rcL>Y7>m zJSdR=NXB%xCuv$VgS3$PThQkpn~$tHOtjzU?eiIzp=eJtSkg3kP7k=o?~GX>M)Cdi ztWxi@L4o4axpw*KdvY2JbplKITLVjdjno}$gIN$jES_&Cm<=3Pla3=58n>Sa8t@}-l=z*b&@;z0=eIdNbIm-g})d64ja z*tQcriHkX6iVaihIETcWa-kkDBRqdXoI@N7wniO5D>IFqNu0T=<1xs^{7q4mgYKa_ z%TLK%DxKCoj?fKk^+ba^ffIU4JjLz=3~Z_d>HFCe&O?80HWx^l?E@V{$wYe^rl?UsHd1 zqSL$R*OtZ6VJAg#dZ!CL?$)09vJbAA|NH#7*y{}s>m`)K;^5R-MQ*y?bsv%bDgE5J zXf*V9Lc-aXZ_-flM#1Apcd zA0a2G;!3+SGEQY)w@Q(LcL@ds*+cv`VKeA@DKs}tNBqA8;@8oRjfU2=YbTQ7I!#SDGP-^&PoMgU3^bO~LP9M`xW;JLRea#;@St!eh(3>UNM^ zJKP*7k)0jjF*wL_us7|H6$CVq6~7`AIIN&h?T0!cAgjtck*MN&1iQgtmO%fF(^2;g z4a`k4d-M&RPs3^80}G^*sUihyQ>{{-?=|{0@7Trvo@s*H10bJ6^|9ws4StG~&3?8R zc8-WnM;zE=6)TDa>X43*CroiQ>;$S`lpv(i-5rpr*=y_U&S2;=ZV`6koJ(x6&ShOy zIhk(-&q;1ov!X98n~(c|nz_CgjMKfQ^4wh%+p7;MoK$QxPkrT%;_2~7U=u~4-Os0F zs=2%${Qe~YBP#c!kJ%(;G%6N3mt*mh;1wKuvcbk15$CT7a1;jnLI91A?4n^32X7WS zC1reY?3Zx}Nsv*4H3Yl2P83ODhmY(_O^N&0-Ru|Jx*qkE!k~xHQczD6o!20D! zVmwYSUAv&QXI>hInX zL(E{=xEI(s8qR#kM0W{9nmZli<&OVDZpRidyMLJ462`fOgT{aCdQYZC(9Qc zJky%UMEl6vK`tNn>ayq3LTzS{6v#T$*LExq{?9JOAD9!1J{e%!huuk;~D zU)f(pL%FR$US3lwm|}!WKX_Pk6lMFG>O`sjcLJ*gkUQEa*w!+*Ws!5TCET9*Zm21@ zrQ`k#WqWodDa;g<&UCC|e4RnmRJ<9U$jW81XjHEdvQ_ynL+bqRxLaOu^jzY80FBR! zJ4gHWZHDm(`=ev9fGX5Q``B*t(fYa%SE9ivFm@$YYzh^GLhbNEM_CQ-q;L`$< zb=meyu&o)ES{jP2`|U-$+3nf>c;9yFyaDgCblp$uTh*@I_fHu# zNd{mEk)vvzn~2LKZkdZ=pimF0i0Q5kqIwf>=mECOTKOZeElT|wSAw@D2$-lm$Z7tR zWj!VE)Ruwf@aiN#x%0?v#K6ZHAxXMEO$g&OSDD%|JE8<8i6vR7o!Ovs3_dMRzHlx3 zvpY)+Rj9WuoC0)Qaff}8Hx~R}`e%2QGw8V%IY`HJsE{PH1`p2GvxHj_T35Jz)lVMo zbv=&GfXac0z8x$z!+b|33s3y!o2jwPz?fwbAN+r>n%#Mk&H0#PuLGR9whr{>I1!Vu~KX=Fc z38UP_p4X;ZUR67vO<%1az#IKbpdXK+lfckEoDxwsyx-O{X2zOw_;N(sUf0)WFt6bI zg+kNTC&~KPeHUkiKK}f;-BxYjSEp^|vvX5d?j{O2?#dRx`R4M`1If?2tqu;`5vnf> z2i_qeVAU?#T~HOvxpeASBxhjsVQk*(;MCNr)A7Q{$~?Qpm8}5=*uOe6FA-xkq}29< zOp|w|5hh@Dq%o3sQNHK`H}%eBjS|^wY-O2U-V-sV&*-!}38E_NIDZ~rA-VVW#`&S{m-E(keV|sQ&HY z{aEVbR*|g$PXi zUDD#njDa_D^dAVrQu>=WM(}r#`@P779J5J%jU%rbLF#Ml8bqsw|<$F z(e2on1%m}7=-t?HoZb)z5P0;(^f6~H^`GP)2H-GYpVs%RlFAD+zwsJ5u)wFft zDSLf~)(*LIfp*umDfl^cF%+$#rW>iU0WS!0I{UR%g7@Cpn2z5hCm8511&8#K@Ub2+ z&R|kQ^8u>tiOr??^W*#kp>DlFKDqw}R8X)}DY}jQ)Q<|)l>%154=5h+ReZ^f0zi>< z3l=^bXIykgnE_XtgE|a#qs_0rk)-}>bsxdY>GQZHNIYBbNjp0%M_m4<5Uu*u*y@ND z2p?yB!6!l^Uy!y_m3=P^q6FBtQ1$jxSLS!hn=+X-;(LeYu+>aG$4(Rup0@h)^M`G7+L$c z{tmMZ7p->eMWZk;4$kspT&D4On=;H@XOP&&nw7s}cFZ&+Wh_m8?W+_88u_{MY~d+P zIa6GYBLtyL{whqTT_qE24@ew(w^3v+Gp4j{z{0+^!MG>1h$b(Xbqoj#EW9x<=lczyLwQB)pp9!0Fmp#_((6@S6DR z!7T1NHzGfgtpc`#h18XvZywAdg<-YRl^hpaCHfW-6UD8oS23(t^5+(zRQVP)R3jG4 zgSsofO06og%V66ifvq1ntT&KXZr6XHn4w!CQHvF8{OfOH91i@N*_izVq*OxyY)XD! zFr8B*EI?EvL#n2YaHY!_9_G6R46GF&VMsc1WB|%qG|o}1aEgE%qw6KuJaX+(#=sD6 z`(ddGOiQUCcV0?v$2NuY{wf=JcMO&3%^*H%aDYxeWGW$gqe(BQS4{U0FV#TgVHiEa zAVQ;Qkt~43*~5x86&c~kDA>F4tH0)m_$KPAHSj(|w=ZcpxV_Zh7Mq(C^D!wMgR8}8 zm>OpS*-S*#j4EHCt?TXN^_UcGgN$3CR;J zQ6L^YAYPTQ@`On}=HME$*R z*XjsiGezh-{7KXzeMDVMVXr?wB}kYc}Oi1;yc6@hG8*_yxUM2l^Xw`>snYQN0EgQlv~p zAtQ>4b@GM9*tu0Ek^9K2QV9FcnKt0;PHFSfu*+1D=fIT9xou>(ImZl^ZYowSdX@p1-xo1^;zW#|^FcV2wX#pp}*ez#aw(tXGo5 z9mY(^u|QQM@Yk-kx`zD>x{?4=tZUU$#E853cy(xr{^(u}i({5xU;VdOoS{X#K&a_S z=-rT1tz1i(H_KYZ)^Fo2k74Akg0a-`OdAg{n(YU9C63K`@cQZCD7MunvjAij<3=}n zeU(eIi51%C&m^Z6h2J_7AIBr(fK}OgFFkT6ca=ivH>DyIgI9rZpdZCoicWEs>W;xj zQ<7C6M^)sIhWx=D(d=?sYam03tJo^~NS=x!3~ljRaF5(4Mk`C7KVu|~i4bkF9@EM; zhtKa$y-uH_M(V9T!pheDQ6Y<9r#Q`)+Ig*Q! z0kD56t$G;9*3pld$F`3@7E67adFpu-nVYI|QPk(r#c^xrVkziI$tphN2nO|^DiM%E zifY5aXKYDZY`-tA2B9}n7O+*;MlM!r(PS@r74j}lN_JIBmIPEBl>o^r!x2&e=BgK( z*=qE-NMD5145PW=QK4p_S2P=MA8P6v*>cWZq+p-dcRyS08TR$b(S!kig1 zi3RQ9;y)k9G+|oPLV)^MV6R3!4DV@mn+Xe@=dBX?E~8|5ljh}Ob9oEKyO+*c04mzj z>hJHByh$;YlS2f`Aj;fccduDKV;>4sn5WJVsy=@gT#apq{$|gX#N2Dn_GYj03^(Sv z35J?i-7w7Tc6NX9T&sr z!8EvMc3+gA#tW#h1=#qiKFx^;m!^Y<78v{XPEDA53Qj|2^7@8Pgsp$}8H*Vs%w1zM zV{6Iw8B0OP2MvW(^%?gk?J$cB?J(z^U1KxJhu(lVmbKpP(F%-S!wT;G)G|LdA)OeW zQ=DMKw!9Q5v;lI7R%kzx(L+pQ&p5Nq=7B^~wn>rFGq7Qxg(5OzXBY9naH|u}K;%ab zpW((Yk|tg!K+hTHuq`LR^KfvW|BZ^2Tg$DM(q#BAXYcl3g?_bCIHM9B}cig{|qOCsTk67E7zyjuscHo<{T@&daMlT!=Ak z(2=YNT7YV}ArQwUy{A2UJmM!QA)*&zyDMr`IkP`tsBfFi#J-01l$CC@kBf;bV{W! z_Wxn(EraTKo;Fb2-6goYyF+kycL?r!u!CE0cL?t8?(VJ!f&>lj1i1YE_g3Ba%k1n_ zZ_iHE_EtYV&vcgoFS0opr7}0?N*NMy!R0deiELW>tHxyn4`l=|FU(?A&fz@91#ZQm zVVQ|YwENCj79pfj5skR!g2)J#3U3<72;BYb^-yU;if0(|!Ncm^^fyVG@An3m?*ilb z>=?1}q47xwRbhxoeojN0n;s9eEGW(2G^m;;+^~(oa0veaqAoq_AnGF`jNLTY?C4qY z#>KY?tWJN~hs2kC9F$YmM0}ZtG1AzL%UYq!^_8G7F}xh3GHM7*y2Snp+QTWjN9X?J zyR+n3BZ>CGzbVb~sZlCjf!}9Gi55KygqSn4OTAJ{#7dh2HBK^{KR+Lfg&2_Y=iZ9C zbl(!57?Od{u$Wh8z{g?2!@4N1DEWOu2uemrrEc)MTBRtjn@*;2YHZ&8Hfj*B+kcJu zoPLtMc*v4F(@YePN%O>ng$%EomqItV5G812qN;V?SA6m}BF)(&(boo?#ZggmRD%;V zJ2E+a6VMfgl3hZG{V3p=6S?SAF0!LvMU6nYTJ{IojjJow| zHnCkXaePuce59+B1Ul<%kK$JQij1q%5LE$u+wB%;?~$sRX3J??o~olQ5v?F6fKYay z7*4J)cG{&ZyjmXrFWBVi(>#fIEZRSnSH#vds`s?u)gLK2Y_$uuE#gP>dR33Zn-3>V zzz49@xCgA%LYE3M$8+CGyz`>U{>z!&i~u{q0#pq2(XMaE3~O}nFto#2Wrtw(L$6p_ zSDnI=KYFW`$vh46#n*!5++JfZ4{vh(Q-Ii4%gJK=9 z`*K3il&6+iH*2da+;JvG0jDKi&}A%6D$ReIp9FK1JaCBHcT;&{&OpQUD?T zZ|<^O$>PHA5ry{xk2Bhl6F9V0MDAl~9mSPs4d{f8vVEsRIRWyfc4Bf%o14}Mu~E+|4Z1THHWPVS!}*7ToraChw&-m2*G8dkt>2c&SgwfYOZzN&3`?;riT zbE;XV2vbFw8h)T~@E|?H1^LapowSPACQxL_FgM6$gslPUAqcvvsOOwF(85j4YyFW-Ug z3a=fcxbt<-4xzd&-ZabyMjEaVE5!wW8rX^mcz)z;GR=(fgS912B~aa06I8t&Yf#LtU4c&?9_1-%MA(g-?|G2ddYc%N(ruPcAe=P z7fYy&eZvk8)Zf{Qt@IIUCo}E5LFeu#1c{A#oj;uUJY!9S^SXX`^Lfwgx!w{CxC{Es zINNUI_55H>`4KJ!%Cf`nU!P%8%cOt;l;2l zwhRR<$FQZ$6FVF-gN?InA~3visfWM4 zuOnyj!=@{=7&94-Kp?gzzG8NeWzb<6*cghuo5OJ@-8^%Kj4dQysQ+E(>&WYyd{f{9 zIk(QRZtmz&)o>USx5iDfFxW5FW{@=$Y%;Tu>dMjuyUB|NJSRqo-XdSmB$+SMAA-ES z=I1&xqG1J(OniL!ajx&qIZWHii6;ktQ9T@Wht(g0(dhV=vAt?GER3Q%+?om|xA{X24N*XA;XyDx4)2|JB)(@FqwKNJ=BCxWCWHuGa)G9(>}Zt`<&&2)@d%C8{ED zY8kw$&GRm;9^+$^*QqNImLmftcCWxsg-Cl~i=P7T)749y1F+Ooer3QFos7pTdA$Eb zW!*hh7V~@4WaM>T9$7r^(qV3^74EU&G0bI%RnBMV0sZma7{%63f9i=rq>Sf~XntXd z@P)GkPQlk*|LP#y)V+DiA>4n7j0{pPrDoq5S-#+KYBmQGxmCq`W#n1m>QM?7>#3|g zoxwy}Qa}mzlY|c8Jcd-F>w>{w-a5-lMh@pBq*+_xq7gvHKYaTdQ2dE>7UnTC@gWt; z;FL*OPY0X&r0_a=->&OZipGYGqUc!DWC0F5v^!@+bXm)$ruIBw#$DTp8!>dOZ4!@E zy6VV)!XcXbrdT*qzjsy`e&Q}{tA_tEgWuchSkA@Y(N`PA=11Up^NN~Yk ztUd&yb{D>;EeQ#^9;jD>gxNNOJ+@@B*X*5)7>I7>QLw>N4>8X3jX(}K z(Y_Vc9Lmy=R9=IyA*CnEFOkH)rp!*vyQy1OktRJ|5bTNz*=ul*6CDZB! zZV@8QVIADy885FrDVIt|^U$EKp^5WhKZ;`?wk+|)237_AT-_@2R#h|HCJR|icxjSUahz;?%-BY} zJ^wr$mpVViG6U5Ua$MRL|1fz6Z1K1LX!r4*3)<^*2J?^rvnc8K7ytmg#ZSk6K3!s> zk~F@-FKdfdQai8`7PpTqNg4Iqu*Ng(#T~znG|3NJ0*Pj_ne+I>vF^%R6o;DR!)gG? zBi+Jn(u4;615{VOo2Ub##ntHxU8*&QF^rtlP2<)5(Q;`TjY^qlaK!UlbJmdsNHp{K zaV$1nF~m=n(vtgw74(5hg~;pw7VGEe`uMtB^YdPR;EW%N? z>o340O(RLz4(We$VIkWY4)rA>{4zW|C;P z=Ni<=32TFP0{TEpbn7D79|{k%E6dcp1>Xr(SiACRAv0X;?uJ9h1j33iU2{!YT_ef2 ze}cH~VFaNZN&>axkI+*!O?dUTbd3xfPrNn7d+5n{d+2Nyarv2zDmg2-=8AB}Idwkr#8>auc z`y)m&{z$r-!UfGcdA%B9{i<=h=UIIf;yrVq-BM#{9dp2Dq}id~+e~DH4st zTDZx>b=zh;zK_YNFb|J-E%Q*0M@c<8N!;4)9TbB~U_rgiH5_0B{%G8l+KJ!auO9yd zcUmtWPB$Hd!bM{7(zMc>k{_jMNlbJ078!K0O0}40|kc*9%@Bi|p z{`zmlF?A&F`1+3oaI^X*wRM9*LfTev&6y)+pjvNnuvQ{ZKY#5jAxJ?{WMq2ql^r_5 zOEXot)lFI?xtPM>h8%LFhkV}Yoa6(&JM(=N=O~EAKAw-((m%ar0f5Vrlx~r2%USoe z&f34Kx2=M}yUz46;Ky7#@SP?8Q(`W~YSPXDaIiSWqTMf&vi*3!y%xMy4Eyoo^!e`u z_w&Vx<@0&&=*H>u33|>cD$ii4aS!?P{0Ly*A@uKa$;~QZQs<6>$;0sE^GTZS{ic~I zI&EdXu{t=7|MCbz%Lfm-`46H=3W7>AE*KUx?It3SchyJ~85&FyoC`~o7MJwIZI`~q zIwB`e;1tRsm(A7|=tIGj;v*XT&yzl^U#gB`z3&@OY2#_^t$TZ7)$9{fQNN$IQNNT+ z*`#w7jq2@?o8^A&!HBwL?c~pl^m7AzjJ@ro+O!V#-%@4E73|ta(DqnfwMa;33#&^* zWs{*m!m*#nlLo1{tPL*|8lzh`8WP*GpiJ>Zq&Rw?VN5awJ^nuILjNRJ(R~B=UZAMDnSS>rNlvH=o>d zr4%2_(0n{*9N_;_W?2#Y@pNqY3#i)h`EUbF|9ro_Grr7I^o>QWyYCZ6z3bZrv>zVb z|4Dn@dI9R!N&ajR)ecw*l}g({98|A)glOjzS-9E;vM3_H;l3V=7>#4*YnTZTmmFDb zwmptdy)w4^9V=p*qe|C%yn5jmicdp*t!~!*%^eRN#}^v>8F&N~)Qs+T5Xx$vBoMvM(t)V0fYM?QrNx0zr|$6T z$bvgp`cY33PihaLUuma-6jTwdlY?>oNNICmsk8%?7II0{dNVcEmt5yX5g;(R>5~GT z@;77p`CimWjz7XudI>fs`&;IvGVSe5?YQJCL-hokgh?xCUl#NjStPqG>Iaq*V89EJQ8;`~9=JrtIaddryc~+FS`LE+6mejCSeK6f z$fc-I5Bn_y8rOA}Ys0?28n>+gQ{`3+A8{z_m8}7ev1gYmGE`2|k`$gkrHNEdl!)w( z%x=Daw9W^}dCMgUdA$6Y!?51Kq%M^aSYTh^`Q%XWEL76yl@TZZxF;y~`ZTMaa;azU z_>K=x%CXhdsc!A*`ts0J`PwZbSHFEYJ5W{^x0FUChnp@GVEOlOHvzAJByhKx$E{9q zco8tFQ6J<=Da<1)pj)4m6O3pxRV(-I<}jQ;D!an|rBz^&~91JP{2J z?^hMoV}-nepyhbtQ|b8oBI#Gd2N{X3`(A8F&^9yePhtHGv zfO~0?*CLYlg>8}-BbXK-sT&T*bx%wI^Y>1Tr>oxN7xKopxShl^Hc2%xd!e-=R1yl) zCD>-g@}zsKQi;8^Fb(a~+P;7BV3*lvzf z&3~$l-P!Bg*?rVR<_?>`Fa@ojt|6CZ%ipZwonFbJ{R2IgJmlvBS$}0EKV8aWtBhm! zGX=q%J8zVy!?fd?qQlw4dX(Y|Dl17E72czm+{%(Ii2^NpJrt!kpsEFQh5H@k?Qm3{ zsrsdveOUruyT2R4hsc?uwJ*X3_6N+(D&IVGx}ERLoP+pKnLIHQHqdJzrc8uVWZ_q+ zGIViwYadST70|$e9VIG!Vg^tge=(utNqa~$F`@$rUw4g-z8gQF;b8-zN*ujg$5&Wp zX^nssQf0M=Wanvd*HlCScdw1wul?U5)gU%8N)yXPzMUw!Op41fgeI1rY_(&+y#Iy6 zFaPmZ$Fn>)SUK7iCrN4MzG0m5IQR8Am33Q(P7q9+S;saMm?(KPXzNPbi}==RRhuBB zY&>SU<*6}l)RacE5@d7B~u3z_Dn73Cp-#g4%Uvgh0YQ8wp+T`@}LSh>9L zVxuPWqHS-Ioht3Z5epNg{lUrngm}H~M|3a9dgSzgz~hy7f&a$0@k#(981vn=WV_&Y zdX(CBdafo%lmJiVlxq3Ur(1%=E(tJQAHxhe5Lz*%ZgHtyff25{P3q$VkvNVEj?N27Q!zq7^y zoDUnG)YUP=uOcm4qr6NiKnXhoz!W$RJlue`fI%W{41k(Cxw-NC1NDpgdQgKeXq+-h zoP@Oh4O^&Q7T)^ZlQqAnZ9&;t*pAlDSX7Sa?cOMOfGUjO5;0k+foU1NIOkTlC3{cq z%rGS8akyF=Ws%Z(D=A8cN|`lT%}BamX>+@&gkZwMeB~{h@HT1wcZV9fkTY`wuufE> zacQ#{LTe*@xO`FHZpK#T*Jd1TaJYLFRTP|}0dj?|yuWt`_o1^xGD6moFSG~O1o9od zgHVJ5XD_oovt+HYad7HM4=ATv!3uEs0FtSx1m)Byg6<99da^UByCpI;a=(Y+I~gtmA#O_(>@G!+NN+BOUo=@b1=XCRh*foCmoK+g_1Ut%bMb zGbYrbR2B9g$m8Z_RB(cNifTEU8PkGoMQwvwFhEfil3`KOk-Sx!s`2r;6ZIFk#;~iu zSl}>1XgcGu#S(0}0|0s8IX}k=#5W;?ciST6-^Pno<-bqfL4(yMPO-HZAlI5f&}fS# zh$siG`#ht+J2}(3M}(itdzUK}K*Mv?X#`F*1^k><(T09$6RLR8qHIr|ME#Rv$iWx= zeS1w92Oh|6bjY4gEaWB}up;x4eIWDNtM_dJGvIeq)8vK8vuF))i!aVVn?Q-UjMvqW zWq;hGCz3)t?=EL(yu~my(M}*Dv1+Cx{OW`Lu8B-k=P%;CNUwgH-TlXg8OpYlh{M_Z zaCU{PlIc9y<7lWby>(GA(1rsmRg&(u5)p)}w(>2x01k8Y_mb z+qxqjmcs*zw{zKoDakJwAx>_dH34EbuMCN!{AJaB5736vW%l&qZCOO1D1&I|}V4m{CYSYK z#IBKM5yjtc_{gL0Rv@t@O z_&LUu=Xvrb&0y8REXa-$s`gb0z%Qg|2Uqcs3Ne;Ty_A0(Y_TH%2 zr%8gbm}<&F$aYcgBp1W<<#ly2q+yW4q@8e6q?(gl!CXn19|xPUDLa@1%-hz=cTe3EgX;8co4o;o)FVjtc7HGbe9YI@**c+vWE{7@9K zfP=>scpsFMw-Su`=RK?ld|H7BI7fM6#X@oTON>I)GT=ml{+=Yt+)ptXN)0Sk31a*P zNAy+d%BM`hyp8MTNf2>b9Rzl>piJb~toadRKw(tV_=r?gvVYzon~C~w6<(LY-Y`qm z@p2^4GH>k+P5~fjH`7`D4RdAQxgatxI0lS-cC&{QTu*_U5*2S?>UYa9FiwQCLWE z66|lXM+7;JC#1aPXHz*{z;pNKSDw)jfBtz7-1l@(yxXb>pzNgydD;~J7cWwa$#V>?H#Z({)U4$%!^M!MY2-%0*QYpqRUs)Zvp85 z53vxDthB8pj*|IEn50wD{;?OuJ{1tlx@W(@9yK%PxeeL8-D{0f5fn5*B!rN`&cMV- zvJ?Z?d@tlwTHRx7iLjrcjK6Fog9%x}%v@B^bWR~SD+X6QnVo3C-ozeWP74^?>Hjo_ z$jQf_H$$Gf6nK&e0a5NB$=hJN7F|P-#A zDrt@{4YNU?edHhJQ4X?M|9CK8(Q2vCLZLdY!CqpyZdYI`Vm%;MO_DD)y=M&Sz-fZd5`TnON{`8AVGfvHX_ z8-jsRa+dSL;i*>OsLTcY{FbKz9pK+(Wko>~$a|zVI8?_87s7D4C71v(*z=}&Cjb+1 zd35i-UYX1bw>_Y=AuM%dt4Q|SK4?n6f-a=QW4P3gi?ifvR%>zjqBmLpQzkpod#Vq^#99wUNl~SW^CGQlM zVAU4YF&Is6Nz_`V%G8jv_3yQ~L(NqnF4lZjqnns+H!URzYTf*(d^<_u)#{8#>iJr_ z358D`4>iLQVV-Xvk6Kj~kCk02kN=wA6*V>e6;Op*^4f>^6_2+#T56M;2 zAC`Ps^h!K>Cb40mre`oiL0vEM?glJ45zS0*9~~!ddSRfK&mFwH32*_w*G0M|7Dah9 zs)KrOqk(!LC=tk?I_{X>zWie;4lFDevRXamq79Fx-ecT=I;02{z`gs^nYaH(*>8!y zY#`cqd^_4^$8QNK6%ZDCS^GTnh}sDT{R`Ed`k(?_F(Jk==SV~)nvF<_`Ukv!d-LEq zS`<9$+CsBFH4!%dzaOX?nz9{24w31!C>NrKuX>lT8z}y)2b!3ue^KewU!xQd%@B8#u^)Hkq(B?p$^(osIzbXzz8Ya{>g1f)Th($`yEA}= zxF~*?+6X+kzpu;qr z`6K|qbDh#b$`JM<0hJ&EWVP7Y8ur=j0&`Sc)?ke!;fI%df zs{}@BB7}6IkJwP&f&T&GI|UMegCBOd1V*O$fM+WewJk5fC->*lDGA-wBdllcTku8q zQyMwZ5stuSnEM7!LObHI(Eu1wld}y%u5CwIZvEjPsUE+DnN}5c5;^#=4GcQO(VNv3 z7Va;Pny_%{S{@QAv67!*gobuMx*u{yCa=v?CO5d;6Pmp`Ald>UXpv@BXqDw84!mt~ z<-Pskc_CI0of0oQd+DZ&1Xm0{kXrQ7kV>vt^hLY}P>rf`h zA7Y|(>Oyn4bWjl_B4hf6ty{)sP#1id?b-hajY__tQE|13mH*{CNTsG0R9vG9`j-pV zU6oPat)8g^Otu{NLH0K0asbqE_vqnX*G#*dy|}FYyf^M4k)`+*H{(~kpWin} zDvemwG=53uBqYr1k(Ws-vVn#4HO!t%4uUq3{ah@V?penwUVTnL!|CF}Ws*AxQN_%o zpJ2A(n7r2NAfY{eU?EX3`$~@A3$7`-T9IE0xMC z75;-0IjJOShX*6vAWc3H|TCtMnI42Ks+;2jB+; z;^3#dGNM*}i-~LZ4?5iL9pGTw(OsraUjSCpVLgWh|q6-NKDQ1J}GI=nrCr^AwWI`hlMZV-QzNa};TO zD(}|U4pcVlMjpnYB7Q1hTEQ?Ng@W@02Y-Q#9}r(D_Hr=&fFEaj|J?DAWxh(-1)@05 z*$@kBupy+A3RTs%3sHLO{9?zF*w;83T2X_obOaNi=C0Rf^*`jRED#QP1w5|c-_yM2 z05=EutcutiFZXMPf@(|6bm(WU#L%Tuon$A<@|_9~W=;+6YIf!grR%xxQDG4#dH_kS zwnMXs7&}XE4XWto-(e ztFAkX>YN(?`r`!zfFv}gVMIZD%o)@Juu0v0PlFdX1N3;fEWe(y4Zn~ZC%9-0U>{eCWYEe;+I z+We|LbVUD>puI3gGJ+{nx6ONwzX$3NWpuQ|a|g$QyuHXLs{ z&rY*Cqj$6Q|GIL}^?Gs|^dP$pyGDITSO>hF*wB6E2o@ietfMn`unF8hswo!Y7j@K7 z9$(R3LPq!&y(a>ybMJUv=St)t*agH%!{^C;w;IDuklIQDS9NhA*jSB$+TfY_16nVf zk-MFe>!p0szrjEApniZNM2#%#5yz3xgG|tEzk;Kb1|@ms5GeqfSDra@Pa*ZNEQ7se z_MXuSOT{uN@Vzp2axD!py*P!I&Nhfu8{I0h{+`$H6w4+Xqc!V(ekywii1OqyYPmrE zg^OVn9hwqFNu){Ep%h)Wj-J2C!mJ^ci#8e^Rooyais`%W=(pO5Gx8diY1U zcWnD!gY7&JGdy9A7t?P7SnjBINVtxu^pvB* z*+CM`(~Q1C{_uv|9;GSuWQOY%6lT)|P_#4Q&}EG6V+M(sbA^Dms_(qHcm3~=dZr3^ z_+h@&DAp(h@&gCXK&Vq%o+D?I!lWFntMq~VUFVcwV`@HQ#UmhUw^3^CK>i6KjeZdQ zebQ;P*zV8j9tBNbpaN5&7v+ir(wPMsXlOz+@j_)pLsI9m8Dm+c*(E!Ij5H##nE7i9~5?a;Uhhn^2!14Mpy@| z8}!HjZ0UIY2k4fFlDLDY8N+rt1#Ns|0~vfQgW98{w05o;Bp z3+(A*LWE0a>V2(iVVEL925v070ky@7|Ee2uC`i+u0raRh+$XIjetBrSo>;$qMZ;| z{M0{ixT!yE;&SklSZ2`qDoYl>9TmMYI^c#KR2W|DJy2~|kM)F^J+!x}gn8JD9#>U; z-G-k6oW$U^*1_ix?U#0LyRCV4wCAe8k9#H@XN@eg9oLSRJ11HL4A1=zw|=E#0wpQi ze0&!%LQZ4bU^!N@U_w^8p$|y@qQ(_AA~2VzAz$)vq8VtmVCU#P*nWKGVkO>_zDr+8 z{DZ^5X>bf8hZya6`0{(3mpN6xvtGvXe~6+t5LO>W7MW4jU=^L(gUul7t;(P`%$a6U zAWbDsxRyq)+gL?Mik*w+{lWz30eQ#;Mm?(AzvDABwHFgSee7d6SJ#&C^-Ab#W*ta{ zLq$)4vD>63(p#7@%_MS^2JK@cC}@`OjY_-gQD({tB+VcddQq)-QB9-0Bx&y$%xaqv z5iWGR)^=LuI;~fBZ2`!t&1nQ#SY25`wj1&|N@Kq4zD)K%|L$IJ!PGI`0>xNI92;Bm z?em(i?<3du{_>x=az)pBzN>CdeE*2o{`NyJ7GRr z|FQ~KNwfP3TV-6lkPlg~00kLHI27QzCs{Y9B*Wo7fdZBpCS~nzUtK#r*J;)P6cv+I ziE#MG=+1H0fnGJY@Cl=@TPNe+918bW!b8K8H~7?-xnG^LV-AI8GT|W$PCko_a&PhQ zCU8W8@lgs> z*Bvh~1`-vq(1pwGrdh#tu7hd4{rI2whM-uR>cldqRPHf26rP<1bnahFbPfy$;7W`J zbV|S%YHJ!6V8632=zkAgXwukRfR|)z>Jkr`&F^CxvJi>+z8;tPy`OsUYhC>uQS+&8 zMY8;N4D_ zveeYA^~0qeoO(+MYi#h#l{U(@L#eq{+x|w}3V65-M?KrZufnTOWS;$<_>~orVjDPf zDVf=}gvu4@-MyjNPZEzh4Nm35a5z;WWLTEh&)Jt3_gxVU1-6S69b zheS`b)5O;d!N^aUFDY&8YCQAzf;q=c)P<)+rbCfi1(NX^P*U@_iTlCBfM`qQKuU}1 zz=iaA$j|cPV2%ozkOSl!SQ<@DXfLgjtYaXJKdHa;=YlV)NN?bPB0hD0DH5ir|M@Fx zC)pGbG^s`I4@R;_{+4YJE+S6JUwx(5%^z6byI_?-l-dG=t#?`eTYx26@} zDgw-evGa`_JkF)6hd3>k&GAmtlB8fx>Gmsn66E$1BGBA4VW+!(ee1EC$fz33;n0!5 z#46QLOHmW)Rq6YrM$OaMGO3Szal7G!ql54oI>qCqv?3l5IE;yB%Xt~RV1O?v{E~b_Rg(C{NH?wkcGc$g!lu4 zhjL{;K9;0GGh+p!;mRYRBJ>wOB%!y0_R~c#SGHP|?00LW(Xmn~hO5?Y$*oWCXh;-n z<+uB1zMz2Aq7|6!Dzaje^k|^-73At<2Gvn4av;5t^|!M zI_mEtooHwNVye%9>RYBvN=8@86WaD6YfG@BZvK*+?1wyS4g4>D%3YwfxiO^TOif@2 z`L3FZ?^yr-S#$Gs=~<9~h5a9thQ*s^{@8&{NaV3_RzbH2s9KuKgaJ&i@e|8#e(vFXyhsSR3*U?+-_~ z#YAtTlelX_1lQ@k|M|U;UgPV-L>O91+hieM`WIrbp4M>?^b?UtwsKk8CBm(~=FAkZ zxbEhU{cYnxQ2*=XTRU**qs@fzrJ0|pn*q->uVZK-(0c79Sm0Z56o{NWCQoyA`?t#U zMeQU}R5c#WEm&h0@Hs$F|G zi4$e_zDDW2V3xFilE&xKC`DH3b6WMnCI^dOBjr$GVTXa^p^i4cmu^jZzqKoyEolVi z@|Vt!$$IdLItUxpc=+3uu+awI-8Mvor68Bx6jz_}1qMxV%DfTbA^q)`SQ<9El0v|>q^BEmXUm`Y9L(&|`*A0m1r2H&Z$ zb7Un6zBxsT@K#jPw>QzR2!3|8OPmYj*(wJKT)^O}$K(C1kVeYYDr>Nut6J(rRj69R z6RcA*U(4zkx^!APj2A8{iDt6v(Kjs$g}+aFMEuvGaRN(T43QxQUNLp1yEOj5t>1p~I~-{(*5Vj8q^vE4#bATGXGX0CfYSrg(K${)2UiU$E}{3)X3V!MdU^Shos` zt11g^rIrXYM!1ivR9T5|S^XcX>m8_kBw9TBV^co~!-K39H1ZucTq%m#euJsFQL z4UD@4c#F>8Uo~*%lCwJD4$Q_d#Oo%gCLS9x!T$ejB=1BmtN1${lqim23_18DU+c$1 zy*=NZr$(xOfs?fW0kn#=jS`qMBcHn$+|Qoa^jxG0h~yBzT!?k;x6D2Xb);9}@2{+y zK0t-Pzq}|`yeQr|O|@McmqHDxFi;7Tfmme^ih_d|EY0Cm#L<6fLp9t{(OFoZwM7)Y zWzziPlrcT^z-Y6td}14x$no5LETSD74cO@E%CLN>^my#rk~>)vHd9w%Y<1{_$d ztzT{N@*R~_E*~~$QWJVK{fiIM1)fb>aic%lko-)^#odY+mZ|-T%ne!@EqjDWvl3n$ z1sJE(#Zu*bJG3m!4R+!HeJ*(riewBykyHLzg_3eU3p;D0y)l!gI!88?_P`*8yL>$}Cny%TwAvB9$?GT*mD0QC9cPicZf|$SJLs zR;@&o*Mumu0eZP_(2l9vedNZ46F#_w=5h|P`PO#iL31v6_s)l&R7lb|D@$a#3L4wk z9_sWl@Uv(2|B&LiqbtTN0>WQUTSEx3W#Pjj%*IgnBT8XjM=d~kn{k5YrC+iMGVMVA zu&vd%;CyicXmh5WN89_n%(88G|Y8B6x43&apjUw|o2mM-lw}urnV>rMK9`c?#v#E1~ArfucN+baFcdEVd&cc#X8MESo449 zD%=q1iEGRHJwi5#1NWonA(^(CA!2q#!8fSjP|~WV(CKOwFi(U8aJ7}22ud|RT%Vu9 zM(Vz3r`~H(YZlo*5ufq0y%j}|DZk-8(ZNUTm?#Z`dk+BZ2D_BHsk^qP?I61MxHhb; zjFSJuhBIE|xoZYEM}7QIqPpx17zOOMmtTf&xm#U%0V%$uTf|O6F~G3a4YsG>IOzcQ zlc@GClv>k7jt&L7z6;^aI?HU{i^7gYEfqwf?t3C6`yd2=m(^-I2W z^rPEv4#2lI=dCBV-l`LQ0Gu8>o*{2L{)0~ zjLazo5nsrC83}JC+J$BnA)_z(qv29WQ+Y)i^7t+v+YXxIb?6l+;q(c zvzpT-+~8YFh*wKz36oR2SFiE4S6BX2jf`UyaQ2CABn-(u=mDz6kF)2PqJrNEX)kpo z1DB(xC(PEbZMRSZKa*!|m+2V%Q$J-7Zx0v=GwsQ_Y$I`m3TO5*v7qdDzSE^B<{^vE zjk01uzeAi3y}+-Yxc#EHHnjmdutg-vXAWoIEN`B_$#X_PR`P}IeIZKgV6()s5YOTS zV!`cL&Xb5W<*8K+CH)&P-CoZQZD_;dJiBIN;I${TWn_l6mEm#xE7|$ zMS(HD7=BA}7siVj_-W7GPXj6|z8f$>%4^yPoRzN&%uO=_@7D2w_WluoM>vfd!@(-@ z=q1e%v;0p$3yp@(hLSCqg_)};s-8hFp>7)afrSv82 zdiQ zlX}{zNquOOhLU{Ub6_gq^y|!5$6f$f{?|GLnR@7_R=yUO-%b)pa|vrQEA&WY?olwc zO8)g&04tucN^yRP3X<-vBO^H4zf#)HmqP0kr{#EG1`|u#>Ts~ssruH#M!c)vU;GqW z3`}&^BQ=E#u+&$VVA$$!u|T@00SN}uv+3Kj*nBxNnEwbW%?}>@zt)>=gtM!}8=ES` zJ(if41#h#APDEFuIex*n#{|AH%DR$kLy^G_=34pvhaxs^}JdvIs% zjaiNdoz2kYD#PB@p=xE#mW9MhL2oH*mxUmkLdSnu>XrO|eFq?PzE)4x8<6Coh$!;D zYw6Tv=TB)0x5?5ggQ(S6M7&RS1&L=!<}0|j*n5AM(lTn-w!%A@fxy*O#K}cd2F0~G z0Hy}^YfCl4{fy>H4$~bjFbQ6ZQk05#``mP+acsVv{!Mf@(wY;YppjS!?3!ujAG>M8 z&|kol8gyy(lnM~6tBNs+U6JjiE3w7A^8O=ZQ{qat@=6w=ETtm}lU?Ak0%Jm{>=fcNpI^t`RMD-V#yQlFxu#(lm^ zh5_q;J!SgnSnjt3E z@?v-ftb2SCT+odp2HCNcd8w86(TnGTe#kzc5K_Wlau>?zW1E>`Tm?AHP@tmYG$pt)s#2BdO=$J4yKLp=kBUf|u>dw{Jnm(<1(q{5N$HL{dv08nFemS|X z0`{U+lTYNg;Y(JN+&ixsuA0|(YguvMB0LqdP1qs^6CHeP;Wf;V*e_RtG}*?i?#v~! zllN<2UA5CAGEJ~ve=pXgNlvb&N38zx8;HW{4iE%gzrPIj%2Ed(%9b@E%|-`b7oZKW zcTM^s?wRLY^$2C9c3)@{bz^p^eW}+^wx2N~c0w>2_Mb(d^UYTecO9!c7Ms_qUg7od zcx#Dq;5MVfpf18=_(L8AB(L4=Gss&Q^v-8k_3&@!Vq^Hpt2@ZN+`cC7pu0&?T->RIsYmIGZYDT zx2+kP(Ai-+@m>a?t(cnc(J5D3T;*8V)9YqmZ;J>U;Z6EBm%t+b zl$prpm-4`~a0+0WM^vCoc=U7_uIY4iPR zZ1h^R;j3t}IEx6xO7u;W+2CT(Wak^HBE}Ew@`JH;cUfU0i1c?mKE36y2Q}Sdb1z0P zJ9Vx^0ilnmfxo1=4;ew)aY+xICJaE_N52v~VB+iBOu?(%)#D+3(qoSe*ztXQ!JT8& zz#d%W^A{&hLNwXCB+m&0?3rkJO~%3DT;apXO%4D<2xur+n8w0BM0DC zlrlJLi!I-&b}_U^1b4OkkkY>zNLm}x(+;u|G+`w)SXXvgAGOe+ZnYZ-%bu&T1B#of zl`?2Mey3N%s^Gdtqta>el*3q$7_zP#*5}h(H5F?#-H4E|zyGPq@UY`(k91JNju2dK z3kwj$CBhej#L$%@$6c$`y%;b_gPkbnVek5!Kyh;Px|ZDB7CrXfh=5*7Yz8@UF=NMj z@HTUG`*r-+3To0^z0N!XFnnfr3xvVh8h}ZCcO@iQ{NZ)2np)R5A-Yg*!_%`)0>Xn} zCk{48?fmG8-6&tBqxKalPq^{5;yXOc0NK*u>9X%NHa`sm`TF0-!NCq$U3S8x&OVTR zDUuJTQt*Xx5_&Q!`!M!~!FBG%lRNfk(%YxLJ1yOtEVGNf9dk6r+0^+ z4eXNZxG)k<`}5?UE#tDOf87@?e)qbjd&xePn((?lI`3&59nj~igzYgK`?{`FZo!B` z^jNCu_H?LL8>REPAPJvtCN25_#AKv`%xAr=+JCIAEXIwC1W)Ux7vcwV6JkQ=-1cQ zyKm0eL0v7fJ~SK?vZiQt{qa!%!p=?;MK=eTS_cWFJB`y8T58USGID&TnKFRm;Vn^S zObML-(nCIbHAonb+kz2<#mtYK%M;Hgtt3tam&qoDDTx@Lt^W%|k%{q#xlG^*baEgy z%z7n3{-vm{N*S)boozXv`&y2g15@QmrXlt4uA>+ypndj&v4~&u%`c1NGABrB(z1=Y zl@lCLt?A7U`kmzGEdq@#!S$g9zagyJ>b5xK)Pav`Y0x4>(MBo~21ui!*8RX%4mM1MD<^xK*2BwgKWqFnb znzt?2M?ZAWf7n7rl`@W)5iW0Ql5ZO#p~kPwiO{x=*BhyC8wZbc-jWj@#<+7n8Fp%? zPYE)G-*^P5Xz(*uxtw*c5LC=hI~RY;9mcE-3)gEmvuS(`i}?E&%>r^(bK z%glHQ%H7bMkf(%-j|6xtQzCq-zb5?eE%NZPgl3mu5 z3s;t1f)^vIR#i|G0%ddoWj~@;QA((16|Ie5edFwImi_B`_ud0ilmF-2)?s7utH*4c zo3^)a`A^>NR{O2CT`HH9wuvW%3UA|fk&fg@4PRUpUu^7qX4rSPh=7W=D8PGp@fZk^ z4$K89T6^=aG(sO-mH}6*8@sHDKdrh5Ae(r1Q6=NR9N-7hX=vo2}mw@$)pUla^!ScU3%WTYFoMkR{4%Yv)VP^eL z8=pE*bpmEiRt63hR_6cR2QxP-0~Z$yJM%yF!PuFT@#;bGlG_kL@qye-EFAyEQ`Xao zA#btuy)oGt7Z)f@Bt+Ai? zEx}`gz>m}8$xo+eB2P-)j7jF_-ij*T`R+@R(h&nan4>|xt4rY9^$g?3^vzYU{bhk zk**3E!_zWlo~$8JEi%H>^p#8}hp`KlC-Jkk#gV`Y2^v?Uvi8g#iJ`-QTrMlgx1*H< z;G-DjRg&nPFl%u>UOAly%OCw!eqpxer9xDcoCCe4u+S~9D%d_Twrm;RBuTbVSI!Gb zPKF04^sw*xE?6>uCH3~2Nxj=!wN)tFjg`s%^0Rs|voZjNCXUEqu8o7lH#q$pURXr9 zu2_0`pbYmt5f@Ini6iHeghk443dp_rhII4qdjoripEK?1QX%vay z*YUA|vBNWMTW8sz(SH==&|tdHhOsS`!8F71P&r2s9d2{X#=k?&2#T|^2J$sWHQgZl zA5z{{oAcyHSSI-e+E!D!E0Pxd>II4|2H-Lq{OyL(1Wyo0>A7vdBRiYBc~fr2&h@n0 z(1LQ$uD!p&sPmS1&BZzSC5Np+Mq#NdAc%8J9GXOIIRbs_YJ^DkA+r!XHOt8^mlYSpxUSh^v_ZDFu$2!K;j^ z_a$)8sgu_ENV2s+Fyn%9MEbQLSj)KA)qopWSdADn!=8Nyl|nytPy9iInRs+!Y4z>< zYp0IRm0w|!CA9X~-+9vpIcj&dtD zQ|nClY|FBF1M$hTm}z!sLMK2m052Uwo1BJBiFt>uY=^YBL{pFwSJ9P#5SAL z(JU(mJsZiA_le#v@P2tdeiRhnk|Eg5@_c?~+?%Vm-w$@0J~=yNRQPPQ)p>3joBVuN zt^5PWjr#e|y+;laa3_XRFn^ZwWEpRD8SmpP{_YSyPc0>1(&oD0`_V$1zB)V#nP*vl zL|R1IY>2_o{-)p73#_?(ChAs#;aNEX4uSUh{M~&N1I~T|sb@B`h%I-uba|;vfWEJ6 zhPxe4vlhu8;W?YmtAf!Fr|yE$uS}T=9Y}Vh_Z-)BpL&HKKBn#KYtstSsw{Y#BOfud=fd-2K^Y%v7!T7$R(5f02Gh1`n02O9_@l?6w^^oC)<8o;*` z0mof`kvy94Qi0X!wB4g79fuW|g~{cS>A^mRE3spVYgnn-tO5wSId7Qi&n zSE-vSRB^00e#+G%gE0vjAR1%R(;SC5H~F4xlDn$%K?cQ)E92{uBuZ|>S3_PZ9+dlL-$*;W5St8 zmLdu|K%9}N!QeTC61hm;hIfQN{IP%4{~cnt1n-@Igd@yRp@fe;u9eIKk$*HJ0YRbE zC{~Z6I~9QuI5h&*1Y{d4fzW)BTXHZ@2}We+Tp*D@WSQs;J1{g9n+Jr9tyOIxWr5h6 z2533%UpvO4S6g8zN#BMAB82_@`ns555)x<2m*htAaqmF&6AHn4f&)xp09Jr1J$Ta` z&!-;N5otuE*obIK(HcuH9|r9= zB2w1T>QF;;i6c{0St{##N5>wEN}$8v;^r&$)xahP*05L`#WKCsjsO*plW&<1*9e(g zsmYi?cguz`=ktZ1fjASBiyLE|Kb&(Cq>%5*Pi|)(29oo7=SVH;|?~Mc))< zfL09zrI=Hy*z454!I^l~BR4BB~I z)A<*=#dcqu$w=$_&T=mo3Flw=amo?Y{C+K0Gol%^Y;u?lX|rVMw1RSHEr7X5rBkW# z{+5Tiv&^!&@~8;|vB<6$U~1Rh; zTQ5wdc`7U$3gr&8VWu}KQpzFYKA*m}a9xIxXAhTAH@hl?t#BobtzYCcKJt3tzAyyD z#IxzITG_bdIh6QEAZIUU?JiRr39~bKfBE$?GS35F8SP(AI!FR7dUg^2xbe+;S^AWu z5=b9`xcaVpE&rvNI@q6dVh(E!{V)kjXSl5h^W!>lb1IloX_C@nFw1=%m5IBT(wbLttk_`HI)1U)UgD9*cQyp3xThp~Z_~bqU?RG@%xTuO zoFe;0)#XO>WHUrv!HomR=4v7jJpC47ISV`t4}~|Nm`oM_)0z3r=Ua);s`QJDJ`3CW zOG?7q=#$0hg3S^LuH%?S7)VlC6J24UyKrUw*KbY&og@T08+Od$$k=fc4A-crJ z_UD8t$Ns+eT^L)G32bP5AcBOxSFG}4NvJ!us6-P0G;AbHtMFqsZzO^5qHA&YU9|YC z9Jdw940-nAq~bVC!6T_Km>fiq@>kF@OvMlkGtCT)Q0`9I*}1Bw~)K0*x#SYs#><{Z=CZy`Gvv4y+_rR|$JpqTAOGaijwP8IV-(;}C&#H%e) zllcA`K;nc23&f-IQDlF(MG?3-hH8^?k*dsEj-%Spr!l!1ff)8+!jb%CoOO0|7R=~1 zCc_z?G~EC&))n$w8<|1wSQodrjz(NP!`4Ikn?pRX#j>Gf6-Q^Tuv1HwHZHd&5Pu*F>M*6+X#@7gPG}7yf%FfTqWDESPb+JAE z&SBV1CKAvW%Oq2WXcU&qEeH#5I1z|!;!lC?e{5lw7d%};?5fZ!Mh+Zq_ zT+LrC_3H}A%jxN5wmXd;MPNwl0fkPwz#>BTv8G%X(|v$5Ulj(F@uNsejo_jQFz7b1 zGzu;0_jLXDa8pyk<0F%O*%AxV->&;1RVilsZ)HADbrq@=7&NxDf&{nviHfw!Y8p$w zD>Wv*j8eq(5Huu~Tpco!(?xN)F09B*gDrkbRw!P?3lQ9^`L}-Wm(JIq(+cZ~ z=A~8BVzw$!rA@0qSCr`dU0X>7^ytJ;z{0zV!o$JVum!xVGm)8^a*JL#4W+oPBWi{g zfXDIB4~jQhVNKLVi}u6O^F2>f5Q)bQWYElFmaN`vtx@a0n(gG6q+cNs-}H#%d02y_ zM65Z2PIR2u?x)_4COtMZ{fTAUt6q{Mcfg1iBo(up@$GL+8g2HeKs7OT7 zS^J;8CmDf;!hhIEbw60Gv)4elJZVx41oxG%WX z0)-nSyK8{LuJYY2K%?zc=gm=DCP=S<%xWD)j^C(xE z<&|QNqjDMaU_}2X3$cbDK97>}uBn0+>34RW_F@EtXjdwa&K@#$y*otK+9P_Q>o(V& zOi%UCZYc#)$dTMc;HT?VflRhq`Tx7>-O?G61=S9Ka(}51AqFuwj*Fc!SEIIzBiKr< zCZjXXF3$^0^>xVU`W=GICzu*yec}7(YrT86je~9#S78XXuHAZQ0i`bU$c%szE42DP z4HU1?ZrimA)wXtXL;$zKa9d(3%l+!u~M>!eX_$5%=&rOhVN+|{_^bIGN(fqGq5AWxm7A+Si? zz{64j8ogJTDpv(%pf3pLV2<;K>HQ_ExTD7EMJz&`MP6o!>YJnLkn*B7;0MHgx zH;Ub^H_mf%R*>fU*k)GrG51d150oEE%y9L+*w1(lD%xL=@3?psM9ScaJhVGImMDAW z?GnUvknW$Y%4hUF$i+aexOkU8QG}+8YSpi^TdXwGJa+9di)*Y~G2MOM>s0=Go3W%49lAdKUz&o#`|C`?--G~DHL@hOv4$76(I z>PevT_G45bZ@XO@y;FV#9|*jaE@YQUOICE$RUbdcvfMd4A!?=D*t@0*9p+oZVBS0Ijh8SRkm5D?%`DD1jYHTKi8lEmeB5pQ!xMY( zO9(lkjB8&S?K7mnCGsd{l`d<9AcTC$7(O?RKz4p)gbvMd+=Ew47YO=goPQ4O3WKye z^1*b6gjxg6vwiw8gf=yTX+j|_SgzHDSOh+fsiK~A0z_y z=AtD6K-~FoA*Muu_3V8d=Xn(%8=;M63|Ec3xDefa)5NK?Ed;q=z2#Lr)zjF>&jWOx zIq7L`edyIo8R`A~lQC6s{Nj$;HAz23u=A)zMDo-URsf(u%wB345&)KbFXnY@H*O(2x=kcw1bp@EsD(4rH} zl%H&@c0%NI+)@z4U@78gv$xMkcEf9AeBCgSfN?S?4q?M;6_+|Uyb$bv-b&nBnEXIv{MzcPwfIbc$Api)(fMYF&wTwOQgO9Q*mZ?@U;*tcl_?&9uA>$ciGBX(kXC zBpT!DAb5Qa8XVsew`K-)_m$`sXY%7Z<~!n4gy$ve;YVRUzxyenlO!oolawh5n)Q$z z@GP4qYGd=>f7YawX~r74k1-sKiZt<3K~%2`lK?>okYIng5Fx@E@h=gfgKb3xh-B-h zljrwolshvW@ytPPMWxWvo(mj|c3X;8O6kNAItO(}E$N1U#?NAA*r9c!oU5#h){--E zDVY*rqx5rAfuPvRCV@=Rhsnwt*Yw^aALP>*hW=FV16f#%RhdgS&Tb@a;iQ(mtP10E zQ30YhQ1^KD*GJw7c~f#o5_eRGys~w+M8}p9V&D0RR;Ix~B*vCeXkH|_D`UK~{J=-NUI?o~Ik)NJDXzh@Md88e zKn*|9Ec@OW-5?LZslZI4A-yuIQMWmBrv@%~rUf`Z;=moo&CZr*%qs5TnL%abdOh03 zxqZ9q#GmhvVhY-hNMV57qCf0-!JF_x;7oTzj}*w4`GS9v!Omj;DS6E3h6X-%K<#!e zHal{swAVnIG1t|Y-L(ik>bGa<>p&c~XLTBL_(xoD}b<-M9G zAaM65z<0lT+UgESm4GH(6T7Lyfn(0A$txd1u-kCh>Y4OuMfVGFp$4(%zJd_ox-w;M ztuq1A)k68-n_CAu>eF4TTV$I2jtGX)@bofrI1@pkT4 z;_91ct`E3#{{Y!e_l9Dt(mkoRN~>qQ!OQ0sMMV#E=$2d{>OlO?Jm}q(QA}lU=oCIZ zQPS>08M--$>S66j>Pejxkfgc75pt+eY3-+DZ9@1V9gpFj+XN46qD#D4A@+zjV!{?c z4#)KtLMy}pEA@S|)oF+ZE^58pn}#SuWpYS9m7FHn15aw&H`|1l?O-E_i{F^+8hF;z zrVbq~EjM;{m%#2Ai3UEY1i+p8BS02XjdY5Iiu5f41fUeC2`C6G1-z$#OF-*4e@&q$ zp8HQ>Xy1RP(CNmnkiX~gg&?csa-c4i>P%MUh?5|pM;M{IDg^Jk?^b(|Cu;4s14-*&YQ&E`tw*Jd1Hfp3va1bkD(}> zuX)3HYxRAOLcW|tbCn^ubc&O!KL8vIuk+SWJ^dwoKHH4ia5T_n)W?2x8t6k5gI5!8 z76rqA9@z}r2&lG{1bi$GM^(c7j#U4~ANATPX}{)XlrU{+RLlZuf7m%IcB@PuI18Wt zs(1RziPSM9pZe%hVF~K+JKay*iwr*OFsmAAp+ zA0mMKAksT8kJp;u{p7NDEzrcX;1O|cKej*rs$;+9ax>YyG#a}-1v{{xP-bee?P@te zL){ZF>j`YR+QW%en+4v8bwI~2)HEhA0-h92I+#XNgAr|z6CqA8N!WHH@DH?jW%jbi zanR##DHIT|@q1_@yD7Eh?k|ylG+0DN{v~_@Q$NF}uU91rNe(_j2Ac3kGs&n3M}u`R z^9Z8q&yZ;B{F){}ISCkZL%IlNQxbieU=OBn!dHVhrS1ET|C`lpbB=^Wf$;AlWfzT3 z^O&^>W;^$0YOAu#sGAb4nFkb?o63))PYY8m<4 zczr3~4gOs_JLu$)cU__?iW&*Q{q|FWKX*fBcR`l0xBVUL6u`6TOTr{V0fByd-?Cs; zh(xqcOr>ia-*m*{qpTg-H-mC8hq;dwzI{fwjMH~^l+dqTB=374c2n)aRCh@wPRT9F zj?RLwEwwFUtBxUVHZhW#n_1QFIA5PQ3z%SVkS6&msbyTR=uR^*d8D&bmA)$6SM7!B zh8qw@mNc$@L*NGA7qAjn)bL~6tO1<{y}n=Grom>cx*nGb*5Y?+|I8@+NNLhY8l<*4 zWm~Ww21<}G@U)owV1+djbiDk_J(S5F64^@7tvdRhGuBs^Q&+|~$ z(9Zb1_@wJV=NuLr~CmBT&!{9id=XxFyB`um@gi(EaTKrLvI%?^d^hqOWL}DQj7o$NQ__ zshau9P^KtqI7H$=(<02WMDag-1RO}Z2AIfTM)Zbd*A`!Av9O^Bh-HKz;00QrTr;!Q z^F%W(r~-?RlOSzudNI_jFF^Um{dg3-IND2}E#9%YDu^x$?@u`gU&f0XRKL6f@#UTR zFYo9s+6)*(>6VR>#jBS}$(ug29XC|Ub66H+!s~Ht)ws@uU_4iUCsN<*3+Jo#?QJqB z&l34~xKG$j7kj!9@N-2iyyMcagD^H_Tt938zU_e6sH}DgOy2c0!OPLm5yHv6RM^fa z@(?NWz*`1=ZnBGMO(cLCVENzOUA6@icT}yWpS4G{WrGSM3WEoq2SCB|K_I|*!s9YI z5V09`9B&AC*xfg$!OIEqK)<{v`8z0qzBGIP`mJk1r zALGdD+$;m}-$|{_#MCc!SwqM|jyxM;_aN5=Y&;qbBUejLrw0A6W`CB4A_Y&yY=%=m5FTHrjqm8_i%0 z#``W9Dwkm2q=#y^#_h0;Ma_wO9omN-mA%C^?#Fa)Us0n!pN#EF$aM{b#6R{ux@sk)Tc}551sUp_qD`!xW(|%`46YgU5@6fFwCL?Z z&db2=8j&!X>~h$|odECuVk$FaN+X4RxXy8{(B zz1918AN|=g-{mNI^>xguZ{Lo^pU~rD^YT^gIdq$j+6 z<@1Vgdeja}vCS;9?^@UTQNs84hNYyf_}a2@RFsHsHINE=ix&8DeGL#S3gqJdI72{M zk&KCto>bw1AI-S7s$jiXbi>E`I){$G@{&r#$Kq$j{v*d)8?wi0Bg;0ZmyC$y`Fc@$ zUe>+cQ>X9X^-{!5Fl)5cFNB5CP(yLYH;#~fm zr)ut+r3Khlii; z^$z}kRmJtA@0c1436C>5pCOTORvTA*Dp+@(438XP%k`tWh)@i4BKT>>=J{OI#)E+g zi_pH_SPk6EoxR1F40kfClR&|JD+FruBQ^*+IMUU&1A z-akb5_>~G@flm)=@T-La*YxSYS?CMC?4FWwEq&%AUOLLTR&m$6$&PftOTHvDD_O=@ zX}1V6ti<(idwJ!Lo#(4>48=pl>@;c$T?JuU&wE(m==L2{bnz|TK&AP6Tf&^>PjHi! zzSe((j6j(aY7j&cCP85dI9NFt*txhk|F_Tq2Rp}C>=73;+dok~XkP*d|E)y8%>8eK z5;Hdw12ZcV2h0D8IbvaEVqoQFV){282#uZf|I#pEVfshIfC9+&)%L$*gI1&W8c}?* zs-~Pl#@b~d{6RLxS0<$}hoQM@0t^YdCqBVTa^0z=^ek(nTpy!XcQY*2B7W!%m+p{= zM@he4Z4z%C{)y9_07UD13L*)9+&rBAQ8i9)Sg;}-mMGX_I7}y~PwOvUD-YTHczysr z3c`Q>V)0BI#VIRP^lJHz;hoo^YQ-jE#OlTws-IcSJ3FFGeu5ICr>ia~lr)eF+=x(H_i$MiNmI~G0W0~iYZ^;Uodn+<7 zfEpCn7o+K&lu+-Sed0K?uvM|4P&WmPvq(>cE)s5#hFp#-u4mH(^*v8#{)G=K-R?Fs z;e{1e=b}j4_zhMi?&x6I7;-qPNzsZ#2l_iN`VS80T!e{(7{&fl?|aB90K(s?KRG{X z>kZVx{%Rd^ROFG#d(`cqhho~CsHQOET?$ zUxFFS@#{DbGohEF<%q@-qcX>iSqYq2F2a&p+a~Bo-nntvj~SuBZG7@yW#XXEJ7ajq z^v`xPWzr4#(8`#S_VjDJh2K*$hzh0$W2( zK*&dua%dtF;qd9a#(>u))BrfABY%DUy?yb2O(@p0jyNhR8V(juRYE|Jtdzfn3`1V< zK9DX$Kr{y_YqRrRUwSH>P~a2dSZR1B7HO}yc>9*o9*EvMB8ZUn34DJzcBTP|a^G?> z_>oi-`l1g5*OG`Kl7e)#IAD!d6?d_n9PG8tdrR>4$ImX=D~@62@oG_CW?2!@VsPg@ ztU^f(+;?7@AHlG3ncm+nOngTMOtUUt=t%h$VdYQ3dTB4+_gu+iXXJeqRVj1=!8~_& z1H}=yYk_i!fmaoNC16DxPabSTcxj#30L4buO2j?ceaKH&Ro8OLE5U&W)#r3~NmtUC zXJ4fg)VLx#^LX$}$h5cH!VqR@cBzsUq=8QIt*R$%yjnPL3RpFos)=KMF+cn$b58r* z>$5^VHoyu4E~z6?l=)#deX1)PAlGq=u7p=4cc$0ws{$Q5(B;%3QtZg*AIte_%LZU^ z=nNnH)hM>RZxTK@HqV1w^d}<3pj204x8PonjUhdLOZf+lV`#X7h`JKSH#_kXGGvAq zjXxH;vf{bcjh2yJ7Wb%8HKOHt%!&`w*kNrJk^OMfOEPe{DF1X(W(1E+Pkb)I_Q0fB ztiJ7;2uv^#H_6uv9hBr)X;x!H?8lF~rjgj)H^zv%UC-C}Z6$@2PZztP-Aw+@6Drm! z_&Xi`cP<%AaX60@TVW}sNkd8){E6|@4)}`GOEQ*+N8GcL$l@RoagPoS=T^-7gs`@>m~=$C zK)&cG>!rws=42#ZE};s%%zP4yr+@U8#PskP%<=RqT|WESxLE**?WQ7y0%GtcfzUso z2h>9W*&|v!#(_ej>I)l;u}z_aBC;Edy5yHwjKz<%ZpoSArSu&R10u&YfvYo35t^ph z~Tm_-`BCmsqULwzlFKLi5=qUDb?p9RRaE+D+?2RP?1Ff#i2E9Vy zpA<>2s(bP`HZ=>XA%#xf3dEDelr86uktC7rv}UFBT*>GKMlWUyNLow(7Zz#I_ zUqkWz{~L2d;X}00kSud>jXvqeQICyAQkJ zcZk3zh#_vpQ}aRQNKx02b|x{QT!3dyalyO?a$i16kq?)hM=I2VwKoEi{2 zj;KcM%YhPnQ?bCBWZWGxbs{dcziU{Vi@rt}ix@U#>in&J73KIuKYp&stRnjY$frsO zXByut)y2IvOvjlr3T$H?#2g%a(_1OIF9rpxY~@P^vkJdoO4xSzriW)UMu$jr9i-Pk z40*3Ba=NT$;9XQrQE+j7 zSCNW>KLNmVEzaazU~GGWk15i;igTk>iI1&{-!V|81jWeX(4v%c|4H2WyjiySMopP{ z$vRk&#PkT%Gn2|-i~080If$nW(RDFESP?oTNuu+o%5yInz`!Y{Zz*Qq7ecFR zo(i zV{+6ey5|Hs);<0;;bL_Y1&oY4*;;?XMAOPQAr%8J(N+6P=fu~c4q9Rf)=tJJrU-Z< zDjXw{%QVD7;$!0A&n=vC;%m*}!mB~{H9pIp?L7@w$ex1C$4pA+3u@X?K9)jT{Dv8*@;x-c2x;(9u6>sp{eb$jhGbQXHeH@HP8B%nqz(^;*7YpMDs zR~O;1`he5G_g^+=TZ7>CE9Uan)``R7a{3x)H;U}}2C>U0yPx8JSx>2iFaK&d%#iu-dGa}9RYfmBxoztch zgeSTSf>K@x&L(#~udvS$A-^NlK8rr>s{xVN2R6yS9do|qqu4UQV0s4~Pehwr7iRGm zH)2lw5OUqZD`ChLP;(GV|EOa?&;dO(Y$r`gbt_lc9s1a|>ItxA+*CB`iZO-SJz6D6 zoO^ACK!APyK^gKjwyGMgePZ!)t;=j30_4RTk%ME?_I)}XKdWrrtqD}0&$`U> z8-8F4b>jO~l^rLlX^Y)DHTx8E4Aac!$oG*0d`KA>po)fnr&?{q))udZ%>n^~L5#Rq z>Ul;ilL}FS>fvDh2C7Rtj1_ z2F$CJ>4xcDW#O0TIrg_deUZfe{+t8Ycj&SYt}DGgbUaz%Muo>^53APgQl!V;+{-e( zeS=djB@{0AJ@Z%iRfZMet_dvk4cGpBl6b-cjW9aTBpvYid;)$L$kz2@Q3 z4%%x<}YjCiku+L?1Qe3h3`ueX`c4Lq`usjWojX!Jap$lRRTkUA1A#lsWy4dvngx;&g!)>W4@ePvp6n?LNps^>k}gx zF*<@O5xG(Czj)8Qw$Ds6%6ghps-UygB&J%$dV6u*9vf2(x2Uv=MY{X*=ZbBX1$n%U zx!_*E-Q+U3G%07Pdl9g@a>0zv>(Pz39B<~gUeG1_!n}SY-uOD?JbQ1X`btz*V#UY6 z)}O7P^Bd0cMyl>g{f)e}LnJXL~N!~+Wrc{%U^4W7J+NnQ38uZ;q zjd||8z>@RV2m_i-iaEOtWy-A9vj0##Ymv`qtv&#p;)0*|GF z&J{$l-Z^xb7`Q$Aj$%q_`ef;)z{CuH>Zt6Gpr=iFWVK;eW`R32AkKoA;8~+%9 z)`P{DiSYm-B|8a0^pBSKnJo)$2~CXuw4K>y4pPgVMM&6z6d;+7c0#{(@SkaTT;b>& zuRfO>Al$S#WKMP=ZogS)(FP}4F^xrl%;uiC$4#7^BnEXyV;cNn48K_>qnIDpIc6m108mCP{lcim} z%t(0d*<0ql|1dby#&Z93cV^VGnxQVPk=YH$V|W>*t-=c|P?R;Q*=HK@l>~Kl32b_C z>z>PU+jw)rzDaB7&~Gc3nGIl+f#X-&eaSOe7Mi-AKbyaV--7h^cMH`uY|@YRy(}zA z4yXd2#4)0@8o^lz++71c?W!)RI%g{E+&K3$7y@G`C^v4uu0;n&?MI#`?9^23u6*w4 zdbO9AN_gMVJC*rNxm7~)5RQz+O0G)c32N_z#5zeIFeZYci(XI>Pp||_!Br>a*v75# zEirP7x4N0@?y(5XHuev4!t3{^_#%_i-;s6u7JY-Bjrf& zMREF~O|dZl7a+pM#=ykQ%>FNx3W}YT>kAM`cEA6Rm?J(5GshR`!NT=lK*$%Y!okkM zoM41XgT~JGAEws-tL4bTk&J=_MhWC%=lpLNWW5rv1)=j%<*BuM;si*RO;tTY;kC{o zL_~aUr$h$%^YueWN{ZCc*PX9+P(UEe*$EZNoJ@&K+&4G>I@=`_I05GCi#=Sx=>)?9 z0sMHozk8LUVRo-*xG}#`qIMtUHlNgvGFF^8y(RkOdEW&p9Da)6@JsGTs+p8`=*PkO zGEL>Kf{x6`0%_x zDbctly}TW36tg_YW)djlqjqI}&;>pd2mXH6_(rnPbLsUo?=VTx>UhNqO9K2Dd!7Z# z6A5GlGtmIO3O|icX}?!*&l%?Qpzu7nwmPh2bZrF*<4E|{LtaOjdv{yLiWgcYgfhVF zi&DUnPG;3KC+F1*D33E)Szk>f0~lQ>aLwPAEvJfc!o9LTA8NcCdf!F;9x~yRX{cDLOC@Kq;Y&j|_k}eFt<^Aamefk- zk-P=o@!r*uIsCF>yGM`}SEhsL!loa&?|gs?3O9FT{~9=jn@1?7c%{S$DELNm&_Yn` zQxIkSCHVaG^ll{v5H;v67d?o*)bOKN2MptC{{{gH+#SZCN01n;Kh;{^h(`~4Jw~Ir zSIL zf3ixcD6Y5auDKHi?nyqQ!zcs}ZdBGuEk8vu_veC#cZkpoW}UA$WY_Y2^|q_WKP5I; zF85PQKEyi;K52jVZfR>zNq4J{_QWJfrxr&rn)Z;H1?BFWUMpX##GT5a=vvV&3#H&H z?;>hB-qgRk*8cbyFc)uxW|^Y^X7s;u%wu@KiwVVJEkt;}dn8Z!rv+ltqPk|UnaP_4 z64A!PB10TX(rDI*C`-z0rxH{DKXknXP+ZH_Hp~nJcXxLSgA)ku5P}9LA-KEC;O;iK zOK^9B2ZB4nJ;B`}kZ+QE?z!i@fBjW6dw2IZYxVSLXnTN2Jj((Gnww z#e`tdGP4~4dJVmZKK zpkzO)oK*fC2YeYWwGG_dL_BUBtdxp7n#-@d%~eVOJVfX%y__!6bQRV8OrP{dX>(fxhp8X%R2ru>b-VyQbRs-;tQv=lR+ z?oPWXpV}cUBBI}g8Tl&^WnAw)ZSRWjj|XZ8d3Y=uDaTU zLwj(U#(cbtE<<30qr9}^u^QP`!(+dQx(e1?)nNG!^mq{mWett~WV|d>vrwJtDh#xb zCl7wWX-ubYp^_i0$KkL8c@(~t6zR4L)3WPRO!MmHq->8~Lr-HHun#b^Gm%1{zy7|+BKQGekJm~G^u{#m^A_0jM<5VeS=Vw@7z!z2eaT3!6p z);^qtpu|qNCXl?6z7GBUPoaGwIz)v|_MP3D43RlnBRRwv#egYJIjJ1%g<9Kouu{5_ zKq$o-na*v}9dF24f`)kFM$y}}oUtSO#I{>{v1mZ3{WscAf!d1Uou&S&njXI{%kLU@Y(QVp$G0=CMuuWP`w$ zOMOCjK$EP`qFc;&)DARvuS(~82*O7;A{(MN4lmRal{Y<;KZ`C&pGnnCxi%$ahSA+^ zX&`m(f5i75nd$#z+1L-mgwn6Y(%fHR1PQyI$xe({4VD~G$74Y1RKEfne|pCg57Nie z(HEr%0>6qc!SVQg*%v(<81X>9sy@4XM50Hc#88i|^PTL`a_?u^`;@R*5l9{|zmffl zmxQ9h=ZEc2Q+DboIQ=}wEdv`7i9`no+&C(BdLdT~!4EiZAB&M}ed`1w1poXvc=Cs< z2`*cA%u%$aAVP+DNw78Qoje6Q7ad*IB7fIj#eKNNu=|e?vR3S}R=DMm@3vt|tFpWB z7C~xGpfI=0{`Ia3nw|bUw@|Dq7uBK6nm~qF0fhahD7qnS1g}6Il6RREz^F}I`?eht zyKllJs7=gG4mjy-QH@)!wG_6uBpMDk7AEzUBKVQK=G|LSVPH|2$ZRZjU1vv5qqH0+ zMbm5NmL(XMC82Z$FBfax_Mwd?<|A|@)jbH&F}}yuDM@BM?^iU=HGY#4%mfWM2PSp{ zpY5`iuyiJeS`IUT!CJFBJqsG-?&H0pC8lD9Gb#saM}GMZMNPpLkZTvP;&*=*BdSF^YPBT8ZWcKV z-owowH%Sz4$1yKsbe8cQUu|iT2ZL8c_0#Gr&h_K2#K8WZp{cHL2d);AXFuDfbGZ&) zOJ8onPg8Q4Q%5}-wG^U%CwJe${SlLs>P8r!B2oKeWUC!?)oA%OupK#)Ov`%m!;|Y{ zQkKHBToYWzZHwQC4iJYgqOFojykle9zG_}MmXrRD=Aa7?2Wv|yx7juf=f!E;f{+du zVk`|Ns;j^sdt%HGGOcNWi;f?yxZR*#fY{zHm*q-jbIZ{h^Df7k%AS!m0bGHAJF zs$Z6>O4pSo^}0PtTqZ#&#ezVlRLZYo)04h6;KCH~U6moB zig&52j!-S~khcwjUtnQ#_WW$gLbPq@!}Ix3!|7q8_T{e0LK(N2W*gsoy6;+0zo zzW1L<3uik&#as;BGYo~lb@Uf?WIh;&9q>>E>$ok_%zIJV5sh+#s9DLvJG2=FJ?VLI z`aQc$8AnRmmNp%okk&popW<7dY|yYa+SPa&()-RZsd|arm8J6mFXw$%qGH}JGQK41 z;M_>t7p?x7_}sGEgWpv5D1skG!K5vSy{xKugTt?l*n3S|@;SK52<^?i2wYI>cY z@p$e9N^2EKvo6d4KI+G)#NWgSNJ|OYgS$vwci;6hX*SSB!K%*rmIuoSmYM7jdUCyb z*|T2dQxVj9!y`bx;<6ieC_MjqtNj$oeiUmrdP&{e+P%xwrxu`lh8d7J8uMjrO-ly% zo5MIttkjs5*Rp`KkOW*FyAp4B5c?^=fNgWt;LD%dXzZ?3r}ka;fh+#+wi^;tpyR)Z z#^hIywduFFgY9YS?4xVwWk9Je)T8EuJPFriQO9YeERkRF}F0?p(^QI^sJCc86 z-Bc*}hCorfVu>^IIk86EmitV$CMI)k6<_SOlkb?9nBVa_`peTX$kfpym@ul@aCtlq$jqnrRjWeA+?|Quo3`XkDi!A}WfzWtZ6}xsDkF9i z9(zo>uXktTmzQYpe{%Y7W0*37PsNPZL43BMdJ35Wce-@qG9DpK9V^r0evdBegJ*CJ!zDdbUSX8HlJiS?KPt- zZ#u|nRYJbajhrQjy|#o=So89fY>o)N zAjNjfMgGO3TOPqv(?ublIn6TiW?zpl(sSEu#^dEptZ?g z8yLJM4E{VeZqGB-ReKwQXx*KQ>%3Q(>8nJrbg@rjAe&UXJD7hr8pLN#)f&c470qDT zY=21YAV#&hokCPxQNmu2HTfc9lBhjQHc6*N4rP*Im(l+1&PSC6Kfmh6kP<&@QlU>o zYgR!avGL|<0q^LpkaV`UyNL|13RsNGGZsbgU ziimPi80>JFIQ5>oY8H^q;eh1f8U}6>e1`dm?ChD_7dY%J)$qvvnnYyUUh!D4 zg}JPHt`GBzLLz0Kq>tFCiJtkY!B*y8Aa#H&P9#z+zCM*UGM;m?`aw8)@bI=qoLA?a zE6seuDRe54{?}BZh0gUj6grcL$!w9w!geU59^U}R@Z~df>dZ=JwlOw*=zeeaD>C&v zJ`AOw2H}?@hz*=uwURy_-6r z8($g*rIO}vW8bk^%2l)zG7l3{_fmvm_nFOLpzI^}eQmz0X1~2ZUHj+-rZ;$b?uFAk zK8x_ovXL&)#kw{k61sbF%PbVy!K5p!CVbm8 zM32|&oS_ARGMW+PRP-90k0hyV`jWzL>pvReU>nk-2p_}b7A4Cz*c)ol%7152r|iSE z=(&VlG>37bEDPqsA?CQG7OmzF?^7(+roHgn6E&b@c+*^l1cZTg0&5?A6}_CK#-uXh z346>o?^6dFx1k+UfZLMLk9Szq+lieaZ(G#;i&sy>JV4neh@X-f_s-_G#f!2 zJsuG1Hivv|*|xWKin!wuOu>S}5fKEvl(xu8A5haG7VC!eKPApwBKaiN z7q;as3|=PJRG+{!D}3E-da7u@Jx?YLC?ADKm6imxs8m2g6www&jE~2MwpR*vS5_lT zqCX?9xYpyq11#GRX#*e|V$1c?0YKOCL?_m98W@i;jgfp@{S5AC+>;T+bE8qydOzS} zyclJbji{8|!wszuVEkaFL7bJWFY#(xN7n4)i|Kem)01?Gej2!SOV%*GY2IyvU}svl zxR`$Q>G&4lzN{@3nYq*yTH)gmop`@wTZ;SIzU#x0)b>=+g>N4bw5Ske6yp%JgN~Cl_n=yS+JSIOoHYz_G-Jkr4 zWJn)c2LG-IA4pr0xzH3vw#B!=Ps8_Ulp+_tL7OgqVNnm9ZY7JrD|{QlVoG-q)0eAk z@~+^7H60lS%83kaO`-vsu3S$HE17{8#>;|fgNfw4%oZRWISIch#f@l#85U#}5}o^9 zQ^D$k&*HD`-E;e=?xbiwvrRt9)K> zPNs{4$2%2Ym_5b7T5Z0I>4BcJLV;6heaal83z9GCdK$J=`1!qrWR%{Zm{ghDmlxc^ zR*-rbfjn%)Ra3~&ViQax{c8=LuqZ6wtp8HskBn)zVSg+P@IDW_n>UbwI!j10SM4<$Nf|{4;5}T~N zFyE+s0}%8cexiv?0F`?RA2|pbb3cR2KwoLoqP}hlzUwqn6iidai%oS#-c{rwR(#dk z?DWb$cQ}|uWe71WU7&}>0yss8|I{Q){xt@Lg_%vDG5>8zLGL*e8QSJ@W!s`-T+lnU zIabVQ|5!W}{9GAJJngSXK%#_tjujyeN*zNzHdvI49h6AU(F-7_=c?oj6z(ywVgW2A z@i7oq^1Z0*2PCy3b=p^NFEyX3vW3Cz8X*ZMMfk}iMe{O*xhd&sMZ8%uQe!!?er@t8 z_%3Cvng@Q82(#Mtou72g#!OM&?cKgz${W%ueOOD`kXP-S0dOYaQ*VaF@%o|Ia?ovU zY1(!;cemIyI0O;_uzPs7MuRfIDbt>tjy>9KiJ?M$EWjT}a71UMm$zFfX^Po{4Oa(W zjvJlLRt%*$ZNJcgZ!&7vgg%Tbx#uD$j7EG6UthlrA!ve~SrrX$4=Gg9TU2e)*5UHA z(oNUZ1x0pZy0Q+{WL{-tv|$162zT%*@CjZSEO62Vy!g0cQ1nW45bqT#n714yywc#Q zS6d7>xsv)rL}5y3t^OP*CXci~9uEGk9$n;^NeJ7?1Uo?OVses-1HH2UgVfSNg`{a9 zV!htfd4*lvUiWar7oB~S*8~s|=0=^a;H-1Waa@(1Ob{K>o38`IP! zzL$}3_Sv~3x2bmo}%KB`D-QDQ{ zY(Rx83AmgzcVt;}o~Z4a@8X8$6DyHE(<?zsfo~|}cip}z}N2xK6R4nOhOwOYt6%w#JoQ0QB%!Lw@6NA0nhqxaQzq# z{NM`>mJ{))Wl9gxxxvVkzELGGTN*CNlh@sgk^tb*tAoz%zK2ETE{omSQd&&D2XlW%@Wm2qR-3 zWkpS`yWbZj!kh%n;d=D*$h7D8>9KB@84(@l{5}A zzpfR0honA7R({nFZDF_>WcFwELX`Z7;4ga=tKsSBRKYn3gbRs90``G5(ERs*Y^mnS zsfc~pTW!SD;-@3mA5hQCLC@Kc#KIFxqE-(O7JEhm;=jR?9AS=54V8b1xYs+Rwr1sItCS_9e5$=vl`Dwl%~{25k&y<0M1s>m)>XZ)+^!oK4yz%SMVSL1h{Q zx0BQ6#$uub%`0I&JMG|b!(`KNELHrl9(>zyi(Nykm$}%K`&kr zp|b7IQa2j2ZuEbPV9@O}J$12r&N2mnAidFZH(=>qZNzr3AqWHy;evgMHON}p#}i`( z>(H03IOHE$@IFO$VJ)FjG?6%aR`wXa4tDfn;lL&FF+?8@K>C5A9@4uoe`1Q^T8Y4P z8>2x^Uhc>h$uRL)Ta`4K8p_rSscWWrHf&y!aS?Y^XW)kZrS&3Ox|+AeQx8MWe1#Od z>0RG)-}DdF3T{U5)dv`FZcY&PbPW?oHAq<|*m#chRWoU+n|YtNIzR8vfR;|_w>gjt zKJ+{q+gPa&`*w#emTqV(vVtQj+9(!gLurkghLmtvEM!ruUT)#p9}%Q58~Tpu>4hJp zY8m`Fb;H=CddWUT*rA74!%&UZ89MBQL|1=xFizgy`Z^^9rk7bF(=Dl_rO3tZF1~6yCA66(#_hcoeWy6 za`Y}z_>d}nEt1!E#ClxbSL((+ZTEn%*Zkt1Ff2g|z6H6BZyC~LK{N-CW!y74iCLZy z4Uq?fFUEau@**}V7;A?|pWk7ZQxV3zZ9*HfZef0n3WkxPp{N&(S_;vNz5-=ihf;eu z>)%8P4`7{4wujcw4{%OT2~Dz{@?(sSX4%OjG!v^fY4$ghp`8-I58(M|QY;^(@^D#Q zKMFg3XAWU(x*bj~5k_Mz6O3coUK9PcF*u(5g3lz}8{<`Gvx5J=QAv^E$_0A&P6R3O zx@KnnDwsN0f2vBqYFWBPIFx+_Ttk{3_B2eI?tCeDiPpK0HptW>yBVW?-|=0@J5nvv z{B*Lfx;8U6C2e_Lm0erOuOU;=#!6d=#?7;M;7k7Y{5{!2r&6V_>j}&Sa^r(G{{Wz< zpZ$=?gsPr;o(7usDXIv)x8sw2|^vW5>`J<+Q- zaDOQ2QBzoQbs||6VfZLd)4p28zjeC3tref?_b}C6>T2gfS&3=RIzXQ{hkE#k2c-)g z$L(8qTy|U6sj53;PHW>mN0J^^#zzN}&T zU@${dXk03}7^TspbCR0pnVlh4#?Q{%!h*M;v_w-P+6e zIl>f_E2UZqy|sN3@0?tL(T+i^9u7YuybKDFUBHZyK^_w^@pZFH%Vv_ex1Q4GvrosY zET3aVK^nYA*YRTFNcGhhCaaT%pUq$QjKCFbGe>!!ZUbE0f{r^2+=#ZGh)2e_%fD{5 z8nPQ*QkIT$ZKiW*kfR6f5SL-f&iLSHbou z&$e=52Tfm|y44-k-Lco%)|UG45Gl{cjOYi@U&8J62X6#*GHT^%E3ZC8g1VOH&mU%z?X+c4dJJZ?l;S}4-hip z=vDuNQ}CB)Y!{?};e_zqeNF_Sk)v|^e96u|F))~p zy%em7-70D)lF^+Q^f4DoYi}hy*15`A3>UQLlXX3}GNM8hhy!PmwYctQfe_E@iFP(_s>Mdd7$&D75b3VazRpnhE}4sH$_`jP4OA;RmG*R z=uJ&sv{y%p9e*d5u|XK@C??*H*k_DOO2O|*%{V3bf@PQELs%;>1bQc#ZxB4H!+znN zcQuFo>aGe_&3|t#R8xTIYs%1k54yp|T$CV{Dg;%C3)&a@vBP3f9gC=eIrKg)bgl8K z_fJyF=ni7+UA4J!Ci5v>$@?6ASNAUJi6xs(BG6PJ(m(6O`xOwWtRWYC8x!!$JL=}6 z+#R2OyVSP?cau%Q;iyj`N=(kmcY)R=6aKAZ7<>rKHw^+ci2FPU27(Ap@~?#ue!znT zoj$}*%{hHI*$@7?eCk!R4=(ylUiNZ=Y?X(1t9lJfDlLIs3AZF(^&!=KG2yu8QLXATfP!*UO?UDOkl{el9%~fEauHfbeBfOW^}MN%Q>mFgmp8}|edd*S zaJKfn)dJ=ndC5={$8A)OsMm%R7fFqy(wCQWQv+BF_45A7>~!7}cRW(l>jGWHvcy6L z@L`W#>qb}ZM3lr&$h(?9M+u~rf58VQU&j6?&5sLmjs?d62J!N7{cDX|cR7ZH5A{#F zoj)UXDT^}h*Wy*7W}Zn5*>v15w*JMxFp|D-xZuWb$aa z*nz#k-fVMH=}lQFIN7#lNl_CVFl^!S_|zv!Uhc{Ls|pzz5wDMvDJ{h5i7-~+EfN1ZmC1g38^<@V&W zJ_{`=_ReO63z^Q}$qXA0Dn$(^wAqCV?f_v@Ua`rKVNc}`U8x%=c~6-(Ggy?77h=nv;xrA(xz-fi|3qfPd`szJSm^$o#R zv6gt{xsthBAfk$oHYQr_U=u<^(}0gdrcQWPf+W150kLBgHn=Lhs-Gqc!=sSSc_T){ zZD<{tuvY_zUZ<}7zOV)kRg=gkbXGW2V$7(g9MCs3m0SB3W8l60gqS!lDYcIWQ;0w& zr7ll=tXEOmY>?AU+4f6reA5m8baS%9hnB^XS$_EyZ&;sM8S^rD>m5qY=y$xZKBvpi zs>oo>P!W=s$(V~QrIPJPU_l7vCq z8-n!ImZj9=n_fci%}`lTD}OZsS(rua`MfKK$K`C)hy55@QSCRrxl5lVnSvf$* z+6+pIP8o?a+?p31XNPfR(~xn$Qet`e>fs<58Rh#`zJWP6)?!Nor%M5#bwL z=_yk4y7V24OJ8FzBPmH0TL!;|jW1kTug|1Cwc_B#_AnY)Sh2wiBH_PvAuOXmha)!CH3AYdMWNMWa81P!R1`G zOVfjRPhV)_mN(;?1b&D6X_~mKb}^-|DLxr)y84CmS)PxXlOMiRrXc!jW_>Gm>BziZdWTf#YuMpUvz5m#g~8i^fs;R5sOSf<+d``YUS zLIBu656wh6{*Rk%|KVt00E@!;)uZ4zjVuFP01VCfiaZGJ>bF z(uNc4(O{(@I`hUpMV@3QzY$x!b}hdlGs1jqil~B&zvK< zp!iJ==WxI#+i~_1A5I9bWZq?T166*eLep#8tXeRd$9*8OvRD9mJzXw;`)+S}+rfS@ zs{Q%pH_Y&oV|2w!Z#)DXi$-=LgKaq8ELM!*?R3lQB8yj62IKZlW;H6M3hxqJp4M1b z*seXH37(($uQ=P_U3?zn9F^R#<$JEjVwyZ(|JPyn=E!OO58dg;B5fYQaU{< z;}Gx~9=7b_DI4yZa~t+G%fYRw;rqh%_U_`k^^E&fb$U6wm%t56Ghj&c7V9ZXyxdG`V|9c~@wj;jhyoi&_o(Y8Y19;3a=v(FHtesu$EiPBf*u zWXxEfhL*dy-idTIuj~NE0YEP9=87Kx-amz%T>#FX!u=kA?N5R606_7lAa@9O`KRD{ z^w*=(V*v1X3#9S{u!ACDXX|WY>+D1+zy;yB1mKeKBfnHObc8lhg1C4nIVe?yh5!3D zwg5N8{sw>xnfw8;fNWd>P_YDfD4`!H5%NoE0bWW0UI^d{!2S=We1Dii9?t+M*#94P z{Qrj?m4E;x^z$EfAPx@7-{1e%K+qcKH+w!>4$j}L&^p&&ckbVJedL#a8w28iyu1Y9 zLnto*D2V@+3$f~jBZ2tc0O0<%0F9c156Xw{Zz=rH8voxl0ccI&w@iMPKZ;O-pl5pg z5e@oF1<)TA{v{d&QMm@-lY{>MaRh;Q{%tur4lk57?|UZ$qYSkA2bO=y zfo>51br>GR@(O^0^IseP>nac@=-(pH;5j)dL7bcrH0}uiPAZYghLdezcGT-m=OL#sIrLMq#enrN^ z!_UqG&7y!B3su_O#L(EpkU-?-v6eg{F{dRw^4u5ka7N%gaVC;DAi60vjNdvOso-0y?lC$j#Xd&4gJ5kaGVC zRj8Wkb{e)8Ms~&~lu+0HM;v6`7>L(Qf(2wG1#)vkYSUqN;JN<{QIJV_>QGU)-E-AwWlr~rf@SpiWYBp5)l=2#GL3%~%y2CDu45%E_a`+J1p=4(#n0ybeo zax?y6Q58J*AJZWYng5l?|HqVOs3|-EAP>i%gq~(!Ibb({{*U$lmILhz|3(gaR?@jN z9B#9_0??iaVqf_mVG{@-=owB>O2}~)R8W*IEHXry9f%F&;r!dYOh}v&oGhgL0f^d+ zZ3Y~IN{4nmXgX0doCR^dLJD6=VN?3YIlpV-mU~4D z$3R8ZanfysjYt?rm+FU(9)U=9RNMvj; zO(rAzJxh0$4BPbQS_Z|b7r0|i!{xN~HrwfB5q#2`3$ntN_Ow$UrqgB^3#A=Hjgh+frq19R zm=FEaAOKEe2? zcfw|uB?>#FY#&JYye~U^crFwUj&r~MdY$?6G=k8>rJL+bZ~^|d=W`7iZ#P*#@EFFQ zss5lZuZ^gYXQsT|*Rii*xD@ZZ+HgP--IqjIsYH4uLXoN(N|Bd*R@OgKr-*2#Rn@>D zBSW2q?j>WEpo}e4PZfqU(hI=9-@8%g1z7JeX5vg)?wmLgYE3;cE7fQ?Z z5I~@ZtXfgFs>Bo1(&4?2hV4d^hmm1#u{EaTtNfdL8$$PgP;Z zp4^vkQS`1$tlX(or!NRC2gA%%%Q0$w@O{h^arCv)z`0aS+5_wH>Zg3BDC4(+Hxf&N)hQIlq8tg z3M(W+XR{m{eAHs`e()BOWb70VEK&vA^tT>c*L?Q*{82$udbnu#t47Yi_V6wXn8?vW zS*}Ej#p+>S-GD|8SNIFF!tpu`yUg>&)(2T5TISr~Jz;)T#9&c` zJr*E7beNmUZmi9I-bdp+XsY9#t+Hprd*g^nw>I^uA}eyfF^pNdiTQ`!XW`aW+eBop zz9lWB)-rP)Mka4&WF#}ROg~qNk_O$zko)DYhYByTWg8cZ#EGVqg~S9FFu_li)-f`0 z*vM@{uRkJkiOc8WviJ{t8VFc5;&PBSf@QWgEG<@~Q?pgcbad!)Wzy{lZlto2cTV48 zRpCIEF=I*-8>=q-;3Z)Z^ddqboBS2rbLYC-uI$?Tdn$z9BIlZRxJp)@1#(NBTv{IY zjLB1cS*q%{NI@!nh63Coieq4OI_`^GgE9Wz^vY30jrrl^nL~*eD$>+sxMUFQ4)kc! z3+c&R0Q1KP#$dviBm@5M;ABm-;v*S0)TWBU+;vqph?9tI&*7LPJ1|M2tr=;GHhxa; z@h_1FC6)Y8S0(SGpQPVnV!D0k?UW_T>iN)&OBcl@$vk_ZMG(StggFHkRv6~NOg0hX z@noW%fb==m7s8cEINPWTr6(2iP8yTX%|(e-0(!+k{uu2>Xv~U5tgC{`EyK8#tLv;? zRqfRCY>knQCN_dn>@rwDM}s^Vo=s8zvGOm#gGtT-gP{oaN&#mtH%ig0Ru57sYEACO zk;XivCG#kT^3UarY=U6*gkhpD1za2rcy1%ceOD(ii^{qbuYyP#8w{n*MI=%aLbmL0 z?T=8%66|Ltb5Vm;DQ#pM#6WW&BxVP^FkZmSTYk=jpIo~1L^S6B!P9V5hlY1oV2PI! z=fQ9+^htRFYo|zi`w^`x;b-Lel;dBZdW)j&!AcMGySF2~IFg-39UGuN9c&hvT~55?A;7$vno71km%wBD$QieeoDpXhTNH|^V+hAm4*`!PxOr) zqZuApZ%EH=#4<`|2U#XCP|*aafWBTvCiAzZ_C_*xFaik}^+M_8SKvyjrB*drf^@no z;xP18i5+{FZJ)pimdsINMXL{?Q;Z<|W*690(Qn@n@K;t7AF4n6;z8i;1sr=42s3yl zROnw;wKrk3jmxknt-E*NTWLP#9=fsK_Z*5WJ{>{y{FX)WQ7Osdze7R@ zvU65D*QxZ9X$YI?e|K(jo*;}?9qj)4ar=7v8tnX8K9&`HrPNY$c%m=}woE&V{uH~@ z&)``9YVXndVcD$uXzz9TI@|b{V)85zRYLv{k2Zjl1HSWyr@xU$h>;6S+G3h-!v4gS zS+vWYb*FbnY%QMVdvjCY`Sxs)yQf*x6Ryn9F~`P9dq;(SNLplrj`;>3oLNz%p4Aq4 z1({eI?rp-rp*5U`eHpmXTKoxe6pKO$A`4z=wbL0@Fb?t5XpqYnAGBl47-Q6MC9K<^ z`O%T%pHyNwgfk5T@&E@jM=mSgtAP@1RAvP=DkZsBwhvM=^ySyYqb--iYp%Np3^ghZ!*(^wIXLvzhbupsf^tSVR*u3k8n0N;+aOj zIY%U}^5z`mG`2mlJT;!7dz<)hn~@=RW1T4&=-rJA8d2eF+9lc$fHQe0a3X6J{)P%o zvF>TI0VA%>-y$s{f`j?PF#3_)uekRY%WBrpr1n7qKX!NS>sQ%JC>cs@Gqm_^9Ubzz zj8)_~v^ZNU!m23VLPlS_!H6Ls+;C4ZIjSu(i=M+t;~?-9IVnu|<;xsHGa1C2)SD9o zCyU{}6+R9?=h_T$uM8Qk(U93H36>LbggGZB0B3)Kkx9_w3?CYkOHO>DuM@;1Eu$yQ z{@oI*RlvrTVoF;&T_DPmfQPU;dJQ&92Ha zKR?E^*{07yz0rUifYp5r5-jUAwdz95N2T=nb)8W2{jR<`acFoMUOvRf;mMPka?Ht{ z1q_B`TSE=@mmDBvz|QuB8QJF-;^xHLBzj-;fK{#4>fpGO6ym-5cM2_1TF^AELPLOwyJ#$Z2iM(;$nj6ZU7gJ5@e# z;9!rVB}5H^jklLh%&kU50U8o^Qjga3D}%A$TrwjPjl6-P!G&?Ko9UlY=Dh^R7iM}X_?7zMOAj>wbQ`TSl86>G&i zp$QpGDfSjIjC2szjx)kqN(3wkJ zz`_|!JubZcgpnR+y?JgxOpV_H6>|#XcttI4>4ZyuB>VH@TepoBDIWp>_+t+G!1E6W3R zGwO3%>=>0_?%JQ*N}rp@^dIThZo9$D6QyRt-c+~uCEx5=w3^TB&Azr7?JC?9nyyT} zs;s3i*&1WW_N;%%v#{Y)vdYZXa0;rLjEO88#5?%l-i;o_z{+wkm0%yOr}%Os_5u%! zcmSDVW~#{4;kzY%&ed7ptlN((edD(d*L$D)4CN{5w4)Rh6=iE8t>u{wx3EjVL23NX zERZ7Bqq+-;;oc6CtP1m73p{j6+&SfRYx+IK*7+pwu|5}zL_`-}U3u3v$$Tyx$jsRM zU4J@*=4+2I2U3G3%Wbab{XydQUUEFAM-w)<6X1lgrn#xS;H`GsCeV(&pG(~>>yc;wd|E$0>7lD1UVHybCO$t^CWu)!O zx(%>9Cj@E5>3M-QxN{hJy&;dT@*OYx`* zgV?PpU2PfdRF_{h?%ex@U%`ZAL>Y52Ax9Imh!7tAACgf^V<(f%&znzOdcwEoZ1iN` zS`B;}tRBa!5L{2(&mgqPT4%!x`Yx~@_Y?$n0?sEICI7uFHx$pxdzeM8~L$N5XJG>!jH7&Jw%3!zfScka9)w)h!~w+}`uaykePeeK&A_u4?fklI7m0MgLrgPah;JvU^MXDlrytQb<{ zFSn2Mf@z>I+&d+Z-`!OGVzMv^PQqbGS)q!qnUysr2b-5RvVhh7r+qB(7e%Dlx+unU zY;r@F*feZcuY&wTO$Tq&;xPlQ)T%~!e!E!$y*9~wn=lLY)@?A-Dx&~}r?ZklC;r5R zkxF#`Pns-R6!fL9V?Du++69{S*Y_A=HN zo2$_Doykxz+O_3Qdhv7c6C27`0Ey}rV(pS*+eJ-yEv6+AxCEh?lrZS&$gd%A^yo-P znZvTb#eqf|&;Glyv7xPjn3%7yMg)L<}ct;_4A$ahDJeo3^l_V&z`h zY=o`-EeRA8+RS_%bcYR}CUkvZEVd5QI%S4!78ePc@BE_d5ZAMuoI zW=14;H0E0_b%a#sT#|$j_C~C=b@O5X_iiHCN!e6A;)UGxiBC>r8oxaEd)|VTq9DRF zDdjJZeZUt(CD{*O60;N|9vUAE1P!x$*r@bhR~mTS7NDGF-TO)Fyx1N>wwV)VM3zNz z$W&sWUzGBy8~x({Ws4a_x56`WFF5a;xXo1KRq?t-gLz~|p_d=#-nd-fvENvNZPLK_ zH92Uq@v84-S6hP{OMSuN8bh}IyE*Prbp~Vs-9vEsoYTSj-oTKr!PG3{H`UFlGM2MWIB zmOjVl@HJSy`=N{_YHjl62=$NxFj};+M@NCk2n$MkC9wSTo5GK-;Y)M(sP7)77DlOH zrAzR_{M)zSma>C;A~#!|oBkWY2x0Hm$I|nz7PIe_1sNwkE;MrMYeXxckBT<>ALa{t z+rA{<9O@{DUn&yAGkUN%>LGK#9_y-&wk#$I!ktnm$p(S%=%sVem_xSd=*L zFG@42rZ9m?W2zLarLWx1DTA;01`eMlnm>DFvYfK@Z+NC4>Fs;iKa4^qI7+D3x%`a4 zah$J*h{Jl!x32s1>9U`D_f%$Oexf%I=9szNA$jQ8EP!j5SO+TIy}FkCWHo(t(iLn! z3>fT-S(8U8bABX2CIXbK39?RY^JZv`_lHXyd7^}+H_xyMVhb9DT2YXX8w+J^irFCM z@g|>6$|_OICX5Jee#MfZ?Q~Lq{dklQHpwT1n20!RGy+S$4pkqiO>nqHi(Ia}^|Bk( z^UBuI*S_=qe{7vqR9wy0wF8X>ch}$qcXxMp2<|SyY24i!cZcB61P|^KAh^2)hX4V7 z-n{4hN4|5zP1V>nR@K_ogZ<1k7h_`~*mNUmOD`infp(V;X@SPZRvvlLts{U3TA&Vt zWpZH4guE;-Vqhj1{OM_gz3{%=qf^{h+*_qHdKD-xP}1cdGGfAiY}ZhBAHD7|jMj{K z$#!@Nx$QB70fb~scK6}NNN3(-_mWtxk7|gnIeXDDg{_XQq+`Hw*Ah>E22~LjR@^l{ z9}hR+aLH$7etL8p5XZdmJMce#<-5NA_`M*f#eJ}--DE>CZYv{XbSahDOqvjWz0kFx zRjs}co#>fFg}=Uo)uv1lJQVr>75n9D@*&^Uxv0|TW1zkR&euAVhp}!Q*OMIk0~G(e z%b`K&#ta4d1>~e9!u9cS2ht_Jdv~~@Ih1uJw$jdc{uFW)>cnv46j&U`x|IwlT+VSj z#m%LD3a!i@KAy5}W?R(QxAIdOg%ye>Fh@m8De3nQ&# zJQ;6@qFs}Y8~N77enp&o>7Evn?q2)tRImdqj|YO09bCUS1zpc@m~I>-f?<@}HM_f< z6zU@MM3ov|4MlWaTc<>fHv%<%!7fz=sUoqiu4J)KkeHJB8F+Emw(b&OLQMFBNt+$4 z<)O6g-)waeUMNX*jwnM$F*Hyppiu7qVGm->m|@h7y;sI~p)``Q_`RX4SDo}rT%Y%A z0>FGC*WrvFQ~gF!s&UD5yso~S$e(Pyf+SFC_^(alcb3!6O*s-N_|Dn_dvF z2q_)s(Hd~Eak}seQtyfB!RS7&gAR%p0&MQRHwGRU7Q`1>EZk>JyT9p zMDsDq?{jakHgKtzQYlp3P-~=>P?YRzpQ!%sJ3%M(lL7M9 zFv%D_C6#LaN~Wuu+5#^aud56_ICIL;+o3%Xjw#a0Nk6*cB|eY1i#@ONf;TiQ$tso#Kzodh{j2ytR?huPJw&4bIU!8OYE{vma?6*Sh}w_RTe|Dy02|bnb5&r zK`C!`x#dGnTFcFkmYYBc+rcRjo!?vzGM$2d1Z$9-|DZdZf72bN-~R*=Zv+3tJAe2G z3W#M7k=B!2vO#@{AcLrdPBI-8<%n7Kjug zE-L-rngZLeyb1Q5k2C|8DPF_o9S0kGqRsniN5kKJ^4gjQqlb~9=MD)R^3}7FJhu2w6L{@75aqrnX6D)XucFCh>1euYH&qIT2PyUT# zA6|s`L9Oohwh~%^%Ik0b!lstwjo7}6#c-*_2>9X@X;SAx&l0v7G#Lu%_td;-XOX#) zvc)M^4Hz?_haIRJ$xJ-?iyC?wcV(9|vuJ&VNpt4KsdUaFl8@<&7)0d`QG=dmrfWWluobLUMBap)#=lfM_5l1OOJ8dlJ$I8N`YR_!khYL3<;=|H;2V z5Jmu8(DWG;3V?-^8~k>-CJ>NZ%zrZ<{SC;{|B2DK{u`rlvHambVE!#gIh;3y?ED21 z>n{%Z2GZU@@?RiLg%pHi(fvVn+<(~W9{@TDdJ7B_ zd_fJcgMj2_{TmL3(gOM+(7FE)W(67R127@jz)l|l?-4+5`u~1x7~FsM;oq1ZH^<*0 zz2UY$Bv+0bAPvdQ`S-DPa05aisJZ_KX662G%*xFLw&DfsAwY103bOt_GLpY{k^8?h zg`4LeOLBwXb`ci>B>z_01v*&-5P=({0rCGcPk8=2Pk30sma+gmG*D^QzXyo^CMEdK zGvfgT>H)C+hORt+a-|=10||`_VrYI_m8b^_38ae*NdlURfg%TaEdr21I|hJE&`AE< z=pWWxYWTL#)I9$qf&Lb2{M%;oaDd<7<=eA4oBnaGm@Iz_kN$lU7btN6Kn=n9=K=)3 z@ogta$iD;>?t+FO2@_ygn#0j$h# zO*t|Fd(eL;)Y{RKrh7G=v!XB-L&ATT)-Rz4J-5iNi5R0DgU{- ztjuiSv3$U1bddGJ+baK*3w%L;8~Cr8pvwxVKi2~)B=g^?2F7d#;Qh7kAMeaRp`(B; zTL6`RE&hK~?rq+GJ(8IV%+m_cLj*zm`sd;~Zct4yf9s?`FOUBUocpi$wE|=^2nd6G zlZgEFzJhi>LlJ-(h5)|*E8*T$9sji&3k!H^7*K`;!a;@l*G2dRgY|E%)xVD8O|0=J z;{p}{=#X!+j6biH^dbNRTET!q1i$4u7=rr$3$p&j^jTT{i|M~vmi{?c$Tz(bnJpv< zkc*X-CUgS~6fihy0Zxk?$fs*?oG3nx#O-DYih@(lltmwCc!UYxJ%eF&4mRroFvrmXQ9p~b9mi(+vY-_f)Ylel;`xCldEiR z!l@w?cYK)F%dp>-ay`6<8vw#T6F0M23SC@kp1XyhLxr?)Bn;{0NrYX4Mn%c&YpJtz80y0$qh1bB=G$@vfsZL1wf9;dq@Qq( z8}6p&{oY+xO8qR}1!{&|4B0e6`GvIPyIV0VM`;#PE(YPF!XpuB(Q2i{;~8*Py6qZ} zhk+13GUDrMC**ONInj7b_dq;9?cGfLOio?r`=VtdI~DQ^D2zfoNpj-8T#em0lE3ht ze~6VmR3)l>vl22CIijW4rb4)qQC0yBp`-bsf)-lUIQ4^OG`uhKrK(CIOj0FQy{!87 zR#6*5tL*!4*h@qBYyp|?a-0zS`^`r}3s6L_VIq#LjTM1<|jTBym{va-B&hY$V z8WgvI@{zp~4%loGsLBm)DaePn>Ysq|%T3|Z$;%ANyoIsC&o8-2InH#R64AC*7C?C9 zP?Kg(wBIUz^S_ooDvt{C&D&rqE5-b1LHmh7)C*rWbWF_?sf0T=Ax<-Tf_8}DN0aVM zf2Emeth$;&muNwiu|2?Gdb&=up7LX)YF85Xs~S_bFR&r$!yXRJ2$Zdi&Ve8$xTPPS zpib7L&jT)w+|T*;v$Q)@FLd<=*?0AFerS-!FPTd$$XWt?c*^>^g35xnX1_~unI>7J z2}x5i1Bg0;RLyr$KkoXf{A9QAb?PjIM>7H$``uAeq0a~P^6h^Wtqvb<*dl|Eg?Qyjp1Sw5gYv@da zNN6OD2V-< zkzQbfI*SgK4J@JTZ^yh+!iLh1rgXBBa+F1MA0H**-lL$p$>(n(v#W+O#lT=Hqd^8~ zi#%B2QRzaEVvCC5v%Xu0Cqd2E4cx*{q4}8rVFG0fpUO{ftsG`_<$ttc|~xCh6^o-1X>vEO2dV*!zsKoZ8s8UE$1{mNkpx&h%Y4DLW-b7P%@k|WAvT6_MJ;f`lfg@- zUr3jmasrsi5cR6RHGPkP8x!^BqzG{Xl98Ji`cAy5n%?a)?{e_Qyx8@>{ZAUEVUFL5 z#pLiK)OQOn+E|iCerxnfPY4>qv6wb3s%=E!Z;=}N@}$Um zGOh@im%5-55mG8^RMcKPtWI{X2$O^`R8PjhgRm{a!0Y_N#aQD9lLWttph%b)VAVyi zOw^j<1Ag@Fv8f^vvx$ zS2eU@oX7V+g!1$+6Br|(vW*#*H)>%yNN-so;fyyxoWfJwy#iiVgp`GHU4;JDd}%;s zBE84G`fxjo>4$2!qu#fc-6rW-n%q(qhYR_zi8xmmI}w7-Z%yJ)1>38+v*;DO{mbGlC1VDXVKsej%qaE-n{! z4%j6nORg@%AIX=(jCL3u`G9v;O~UooSP?ER9de^l(MrQn-$eA7vQw9+`92=H`26|> zrH43R*(*hI>gHo-F^;?8>nyXT=T*csV)^3sctrVS%1p4${vgg+;c8pXoTr~|n7z4IjpDd1MJ0Ts?Ffpp`c z<&{#A^f{*P?#Jh5$J%G7>+`I8cELxho!p5zsbkh=2%(7cq3Da};}7md-lETN)SE9C zP;>EHgid)Siorm{n{uh)N-^yo81kYWuj-vToL!?S2##1gl=de|J&P8+>-XH!IqM9q ztQ!?Qatq9N;TG-QXWb;!fI^AJU+dgbHlz-%Z?TH3I@2rd zYDc1yz^dqET&fZdQHS73T`ulfLUOrYqL6 zNdzqC0}}7g{GNJjZXbaa)X;@m7y-3{`J@ngq29j|f)CKn;@F%8Fs$QOb{G={i2X=W z)jq&_c7756v9ZlMdRb~sVn8!H&IHq*9V28CR5)=AY6!yf;~gdn2{e3Mp1hS!e&o7s zU!opddv*X~8Rjc$cVA{Ka4}TcWb%|=ZJ-#mj>>Dhl1e&}ta`qjtB&qiA916dEC{sx z&V9%Tbr+NB6m|Q6*UFV60CQDW1W|y?S5-s|HrypPI?JIy&Z! zn3^6=vrC%DgGMGlgw2p4jL$d%P5Pr)+y?j+6JPwr%K^I8#w1g-6GCPw!VZHU;+qFfUMTI^Q10!~L(LTg3M)W%z z9^vT}u2*z2S_6CZ=6j(?12c0NcAzBRnz27sI!oM+{^mFg1b;4__w)5$7P6hD(Bp5a zNh?p_=Eild|LM#i5zxzx=O@_dY?b=Q#7a-DV29;k;Pw>=yGftdb$2kc-LTwe`!IG8 zHmx?})AQo=^k?s50LRWNx0!I?uaRrGaE>u^o1SC+{^M#wOYz}1C5Ysxg>4y{hjtFb zX>j{;0|Q&SbGXKo!SsB~5lFL|luEI{>lYLdLjqVhkXxJ(U55Ma7%Ge*6)#5C9AR+N z*dMmN#J$;h+lG10>*i+`#^IXVUZuwIoJN&0H&uh?9o!~cQMNLoIVW5?rnT&RBn zhYsf1?}mX_6-U3C>k+Ds=U?i^Xs0JlHyOq^>&4Xxqdb^ryyetWbfzvW>QKIIH+zPU zU`OL+6orjg@LeG$8?V)_Xzlj+Cz9E0nb;{xUh)0TWTe=kA#{)_yHKPzw&=6r7k%E! zl;to!|2CAm^ZM;*0_cB9*|PVQ9OWz;`2C=qq~nn+2e@$s&9=hXuLJ#F9 zSa#&ln-K z(fXuHPf#2mj8^zQ~o49)&tE8VrUT_xQQ!H zUTAM22@9fb59UBh*2!c+NsdhM|GA^`q2)nBTo282H6M<9&g+=>me`jNwDSOKTnl`0 zLJsCo(VCk$MsJZYs1b}cby|((b?SApSOmSG-Erjm7icTi4k4nG@-REMnPluROVkgr zN|^f9$DDaYl|`$yJQ%zj?{Ub%|4dcq1;D+&yzdc=GwTQ`A0VDN8{S1Ci$@0PjGAh$?tjx*7EY)rz$X9WgeMn_lI)e)zEh0WI1BlHXCb>GA{g!2!e;*Z zc<))k6Jow-qVAT&k&w?lhUMjKtOX;%I(gIgdG45sBZpRXc4=`)n85i-;g-W& z&nGdB=mR!e`iCVlATkMb+VqNpVlj!KV6*4>Xa3dEJtiII{ckBT z2XSDY1NOHT4A*QYAF1E1!ArX#ABZDkMqi0Jd&du%ut?5I>fU4}%$S3Z?2UqinGYl< zMe%eTG3=*TC|%Ftei>g!DP~>;8qEXd~d{$-yRgI?s^*z`K01 zB`=(TwG_yDpJSL4>*?Ogb=#X{MUENpRxqxw=4iC$K~AECWFeGNKS{Ii?;dO_p&)a1NupA(Z1S-y+Gz_x;y0`1y$(|qf!+@C+MapB3H zB?u4ZaDnDsu_^|gu5};BPG=UCs@Ye}2ieU!{1aA!H_G#j@A?`SR^(3$Iwz(yPggI8 zax82%@u`1CZoLFNRepN5UyfV|7eGHRd;JO=n=Ff*Du&CW~H8s6A6 z_61gLI@tNjuHbZ&fxRAvp|*2x_5JKAPyde|4;i4&l8z>@U*nzE+|F_8pw_2>`Bz&- z7mb$?+0z20_3;9wG(_A8lEkzDMmt$uh8$6a{wdxN8LXDTMP}MlnRgrF?b4 zB}vUfMK`XC7>YDyKcJqo$0)dCl#s`drtrL*X|8nyoQ zCUzjf>RB>y;Gm5ceFN&l>WeO`d=1vFBuUqTho|tWG08{*GM_Z{M-1fA;=G@^S6i1i zyGMO=uP&SBw_>-S&JA_=`Dm%tmHnrDfJA!v%bc}5z~glW>T^Byhv`$tuDr$w+RXjb zp9F0utVs@R03~r8D^gJMb~u_pj0^BWK*U;qw?u<_I6_7)&nFxFm!G zUkfbrtn4svj+n*;-J`tiA4uZ$?R=oC`RY5)hn<;Twe+wfJ=#T7O6y31o9LzCmyCea zFs4-#{Wv33qd}1t*=L#A$(WHplk#`!V`E{TsBTXeYAsbimBLZ)o82C*aPbjHOkyD& zG!zPw<;__6F)oWXp{QCee&C`X%pRU`%Ck%2mP?N(M2?rK z>B0DH^;R3+=d)8^#}&Iu)@oxKR+8{J zGtLolSOo5pSt@HH2Sy=P*;v};O&Ek4SllS*7BB1p9y56B6QD#>eXCpc&gxp9m;(s})cys+i|7hPi z0pT%$A|g{xzrCnjmV>sFS?=!#w4W^l_6*vB>i70%I+X;P9XIlFZHgg}!N)5|>E76) zq7B}fotHntNjm&q&@Y?de2V~t{0O@8>Le6Lr- zd9O(~XU(1o4kbPM*$aiv6WM--PA`+s&RKH-S5WG+@w#1Q>%*nClKJB&aCwhVN0UR7 zXxQALhF*iIawDNf2I%t3ZL={Mw84E1v4y3a`Q?(1aOum8Lz^C$#x~{feE(Xz(9~p= zDm)nW+?Jz2bm;~NZ?LtPIzycuX0>oTNs~rI0iVX;JZBKAw@CEF>9Emukz>2S^zwYq zd;VQAxWa!u5DWlq{MuawewC{t>*N$}S*o(WR&v}%;0RR;zl~6Q$NR;}^mC>gZ)a}9 z5)wAX_jXjDk2`e-t9L}kQj?3{_-&M&g_QjF8;WA92zz^;$31sA$9&qCky$0m&NGN6 z^^d$4OJIKm{@fZ*b$7F<32j&zooQ2imU${!O>Mo5TjdZez`4Di1E$uz-kd&NOLZ~t z7jQIwwl_$6da2*{dwy;5{Rybxu>GVHnhfTAYt_AE>*i&(nxB1zM>z(@`7%tx$!)H@ zQC)BnIJkIMHD}m@+62>JTQyt3c6iFZb9+dnIi$Qq*r4l)ib;Z|4rT*W#uz^ccck^x z(3|gV=SQzLWjl=K0#)~K735T38(b}ov51Rb%zFtjUh_x7q*QHX5d^hBO$_PmIodbG zbv1-%LT0RDDvRF;V!gxH_c$}~f4(oo?TMhzmc-R>?Q_3hv?c4PAeJjti z(%+kh{*?awC{tR_02|Z;P3KnRK3iTtG^u9U+l@&Y7L+pr23C1jb7g81wOGA(VWz%v zuO@*da!{&^UqkEvCDVM|Gq2iclzzPr(F~t3`OGea5TEb8VFhhRd{K;UbP}g3s+hyX zJNTwUvKs7%TRY`NKxeNNSB*yAi#rt#=5gVFC@dzR;!Qo9ZXpaYmZLgLAy+%ZbN$)s zz4i5|5$aol15n8QV!lf;FwtsP5BnA60UZwk1_uyMNwGwZ4_eogGC_XNM{(6uDHm@dg#Aesw2dS+ z$97C0Rqi%g6gT9vT+@`(CpG8WqZHWb8n7YZAmAjw3_LU5EQG75AE6dDo0u5xOf4zC z|LMZ{p)!O%!GN(8S)b$xRlbOcL>U9&lP-_1_U9M20YKol6UKF--+_;PNSD)}S6Fv0 zi4xBVojUL2qQ5}1I8BJ&Nju4%E4Xc|V?1cUgaQ%Ji5*rDX!~CXR_37F){HYY=sX!* z!+!t7cmTd1#(ODloMu(v;w&gJuvEiP#+wVwsp^*cI!DDGc2&fX_@I_g9HaV7!hr$jF!+a#H44?A0Age6XRc2>HqXaT*C5SpxSO$5CeED*5PZrvffw1fw zT3v8${OrY^<4rKoyGR@c`RI}mE(1#_dQfZMow_mVxCg#^H7|G!t{tH8&W9P!9Q=U& zI}@v<;PM??5eXS~|Bl=`Ioh9P8xs_a5TQn5;$3iJY;ldA&v(CKpL=-pqP+o##U)-v|dVJh0Bn|Q8fI;3HA8i?nc}R8f zr+kZdSRqMs(jSRR-nr3?=R#jwydy>{&w>V?95;D1hvj91aYVOXhb7DX;2-iX@<7v? zIo;CqIL`83c4!8~1i=g}Us zwVjz;a0dxRe0X+=_T*7DXBR~ezE92GO!t;A0&z@eakbV34nKOp8tie}(Sl(Z_OO9t z(g;|#JeCFYX`c}WRB%&wNa^xIiN&Xin9ximJnIP>Td`^#iP?C0z80rCGJRBWE7`&9 zP<&~4e>LiiHGx~33KICujE`28h0i8u8-rWY>LvdR?@Dhd=PXn_&xk04_j8?D2`F6w!VeVY$f^-o4Xq0ZUxrppfRu^Ig zlhMG;_lOq7V-(P~@TwLqmsUleTC zrLo{4+=F)|!R2Ysu%e>XQK0DG0Dplui;lM=`j4{iw+;XAWBW@e;Amn4&(F^!Z|-2} zX2n9v!Tm<*|I}Zzak2e}*VqKNy&J|t>itA`7rhR?P7+eD=k7O1Q-YtNkk+iKeelisjn&+&7)v~$IGP`d`ojopETDqO0l6B_3X;z)UQubP| zozmgwqtAL`_hwvgZk!$Wv1X=Lu8JPOQ{WO;F4z4|r_Xu&eb-YiG}Jp6V@&PC^=V=_ z|1Ik9{SW4l8$ay|gfM1S*duQXeJ%Ed$2h>TLQQsvJF_N$LCh3I9fqOh* zTbsF>%`KhC{j_#rg-r;=Y_Tj+aKPQHlp*&^oC?kxQqEw6E0q_C)B9_j2aof#K6kQb z(jLs)^J>AfLV-z_4MEP^lN&WPt=U?#fsA#xT1ucUo4Me^CKZG#%z2+zFKG;uet7&Q ze@!Pq*kN(Cg6=ZzF4q1F!H-(oNDeLzPI2;E_h#F@i_G~d&6@JBjt>nb8o<;*O02zT z>_<6l>4C07NYG~8!LkdzMetdXh!1Ixb!xv);GFJQS@ey6H4c7w-#Es z_<6a?a)X5}ci!;__x`YmDPTC8TUB|piFmZ&VqT0}Q7lEOX+`p}Hv`sQLc=a;dT>IE zG`?)2glz;ebM%Lgs)*@!>I^mPNryAKD=E^Q3kPZ+N3)vrD-10~au`+F=BymO(p&Xf&}V&)oL=%OEt05 zakMx~DxJp37G6>!%gFmfwh|sa_OGRgr7(n0c_W z2y(P(pcARGnm1F0e>ilo(opXIHCH9op?gza$pT!aPN~43Rp8mk+Hc)S zVdI_1$XI7Ewlh7GRo#)z^e%?;{w*y^uokt{oD3uBV)d1)Q;_xuvp+MSG9GKDvNV^d zaPVnHhTHZIYMg+V@@P77H7jGvor&%OL9t#^lto=pJj%`Tl^A%+BnK&8ICB5 zYJr@Tx&bY^m=3^AJ`)SEqEZX1h9E7LDOZ^j$;k1sp~zsS%&g41h8L;I`Ewd}#Nm@{ z425;+b43B+fHE;}tlwfVyPJyi8zT_tFrV`lQ_#NzL>WmxV$K2Gs> zkx>g}BXm*9lqEo|656PB`p)Bd44L`sO0mdhx%w8xy{_sRJQ%E@RPmo^L%z|gJYH4(}7SdQ32}h@IDjTCcO)R-)1V=E;(a%%h4#Q z)z&!cW(F40l-10fsQG1Rs!WpVjnfU{QQ-#+T4SfNo23JpK_~d`=(j!)x0U76ok?`J z(V452)6FXPhiD_bV)06xHAEi9joG0NkR%OdXvgvly8Ah2`d>tbET;#378PdgSgeyw z&SdEHN8zEGI%EKuKd=0Pv}y_1O)08p3jwZ@Q|V^1Y1S>%yQs;kYD%g$TAD{i^>_TI z0>bV*WRgG=qGqf;Z5UfMbe`3;q>-&V#XWT5!R;;NJ$|wDwx7Bj&F{QMDbY}Hb4Hcv zC{@La;ZmE>(2@n$ePm#8=f7qvPG8#ZK)GdFXG$8aa3>e=utxoE`+$eL>x37_FOVsg zNh?M$Z|yAy;htf)Wu9!8_9Z6vvJ{RoM{2an6NeRu;khJh*Pqp^L*RbJji-=d?r70Z z6PLh-O&qtOLUgWf*z#6+?W3+PM^Gv!A_PMapC7R(hOtN1EVT6H`veRzBGL<5th6n& z{C9lzexrGMRmU%BEHYC+5*4FrWf{$IX%)0c4?5a12{hlt|o1-f;(k~-0^9# z5R|_I-vponVbs{#rKLTJ=UT7fO4ntA)R$jnMR#ScDAa zGM!0}C(TlO&}?73!wx1WFkzE|gF{prPD2B@{{Xe&;>*;i0Dd#Lm88nsWP0iPn)d`f z|0&8vQaKLocf)LemV~Ih1^HM#1Kkihbx5B%pVmiMDpcH$wYwJ93tOz)HIItX!g)67Q36gb<*j-q(#LdfI@?a!NM_L`_JH^K@8?k znwdXxerACkW@oSJe0mIL^ zY4euV#^I1HY0^oqm{FY(CvCWM?0+h6|2*<=hdsQp`Vw>A&wN2 zmm$py+JXASPE+THRij9wjVtb&3UHo#MG;@__jr2dB@rzruAdy-N61HJ%n;G-ETwYT zwZm`U`W-MHI2%259(Qgw5_!5i73Gs5UdH0@3>TNZ69xR8rgDS9TuB4sq^{C5&zG^L z@q(S6BmIS;>0l%2_Ew0dX3Vre#3C0zMdPjGdHoVn<`T)oWVoUENrMhxvDMxC;O9szM!iuQE{ZdwgM<&Fc5N3(7Za1}NNY za$_}$C=xK01y3QZvBcmpQfN3yBg${S?#_Y&ksu~AHi3O-L1!;3WUZ&MX)Z4vak_n& zNsaYKD=&%7agQOUGNzJ^C*VBLZ%deTnNXu;f9p%{ljI#q@9u%HlI&ka+?m$TW_^yTcb#)Z4-PR z4*syFzY)^{K9#3vAIm`RO`178R3*_u});%X@JsNn(}ps{H~8~ zK2O#SRDPlAm+`)PACU+g_I88_mU>{_(3cbDvf zh7o*&Gnu$uPOl@NZAEA>k;BV@IZd8uo$zL01DH7kWvW`1S+R!#j*xwUGl7&OV`rt( z+NQN`pylIecPc!VCD3C-wG->$Gw}ZQ#>f611&P&^oP5LI^vbm6q{96^Prv)<7MQLt zZ9UbQ(wxN?{JA|}mazx&Y-YlJ#WQeOR$)RLA9+K@(XwUk1#N}j;ivrLXlcz%XB$fa z=)UU(S>sMiXb#EB7Wg`Glyk>1mkD@tG(Kh3{$e;hmUY6y1uQ2H&#_lNyT|^JX*!z` zOjoaO?9C!)ZG6Q&!Uljv@%_B;4bZMF=*J;&`z0$r@gZaYMa}*3G@2<}(C;|(#__ul zJ~>q^x6Izm&3U7(rBJvgcfL3_ZdsR0U};e7K_V_PJjas!aDNcg^-}wfG2S03`yhJ1 zNAb7#H5aSYfU9*p&r@lZdFj5%C*EId(~sed1`H;_Z+{r3z?r9a9sJReX!1eS8{18M zMU@ja;Ol8&C0M_Kg0WdC<=BKZ$EJi7C{R1njW%j=i7~p%)2bkZ+}eR|_+765UTE1A zO>J`KO_l+7dE|_J1y2w( zW#8(`I>U>NJi(i6ks}4EAq@z4$7gt4-p2fUP_H;@FjHNiS@7irB_mHBc~+V2D>yfN z+{+O^iyvTw*KV#5uRVA}&~sYqbpE|jz-PSu#iKj!t$E_=^-ayCQ1&&%VK<6%XdU#m z55hf=&Ti&%=u*6Q@U&q5M3K!OZtAl6g77{s!?~$`D%c-nB1Ia|vC}q$CB2qI{5 z?kj}g^p6|G@tYN>WHLza(>ECQvM+zHtqkPR3v z55F+W_T`zMG1SB+;8L`YvEKhNfzMMdo7yyM=x{QJ7|s#l;h?D+@;l@4*COs5_F$7y zdtqd#jr@s7k4pNL@E2Zw{V-q?k_Xax(WlNVYiNU4q(E9E%D@077cb(M%PZRWbh7g_kuExa!9ScR>ScV;f9hu&eja8#yjAaS`BWyO1imcA}j9+8xtb zIP1-jmaWDf2@gVrGD$OyQ$?itiJZ&=^w(qPipM~pJC&Pd4PV@B>s<;~prTiPwvB|S z8x>t-Zp36@c8^*{SVp_g9p6cpu0OoJm&|fZwgWp`LA)00Do(*9>xSRR$ZJ~sYcAfW zSZC)@K6svokYeQCCyrwspH!g#I|$($GHkJSR+2PIC^Uv2JP`xn}7UDm@ zGjQ>|8R7l;&hS>P#r*H$_8cArZOnzQuNfI@OZSsqI9kSO&MJ^mb)=ioXp30=m{6BL zO#~65VC-WkjJ{`PCV+zmwQ6FgC~P7NsPJM~tQ0C0@J(ZNlWnf;e7g59OBAYQk_8J9 z?}Zu>MD)%(I}e;JCLdm}Uk`*{PqK9afbRm3cmqNQkK3|4G}_PKoXn=`I2iSR%)#rD zHC}vU=qNI1+Bn>Z-oYn4H(d3;ZfMU!=5hLs^$vKkU)rL15ddYh8t%EZujgN}mIuph0vjgdWPW%qrsdEdYGQp+qKTCLDyO>jE=S>+K|x@l77;cU%*T@ z3_i{XqgkV5>u~fQ5q9s00vxg!V-lMBvjkwHM{r=mSWa%Mdi2 zb`fAqgn<#rujs5F`V-Xvi6cS+cn(A23ri-bUBFk&=f^=(1G!p*Hn*$$S~wwpP61$C1}BxahTvtvG@KLq-Dpkb1@(t8%B)?@6c97f|Eprz)y) z4Ah=;2rM-ws;kq{VpBk=iXgdCg&bBdRcDp0{-D+OJUc_?@kGgJ_zWemz}epp;YMJc z396#Ng%j>HvIGXYVwS=>vKch{qz|fU1Fd!}+m5s(Afm*=*r-Jcx?kI@#ZmA`6dbfB zMdfCjRo1wzDv8ef+qM>?kr`Lh@*g79jNlDK(Nkylk`|@#Er#m4YxJX{M-OygCBICW zTLC^I2Z$} zCwt>DYacbV&PuB_sy?<$Pv68OhE%B(df;etBPDx`A?D@LNJmp(P3BbyNDy1-JZe?DJA#_tTY$)V_>|`vhbjc_l&WOu7HTfY@i--;t z(G|`40bVRd^(A@<kJ47FXC(_saf zXbErXT~Y}(a(p|PuNLx@QZ^c^sz(X#721iE?kuqsGNr9!nB%=Nbd=PE1F5)2cJxXS z!d^0srr~7#7fh}j^bxrf}b{y()5umVm;;`f7>Lr|y zKbIGbZ@{u2L;!8OSgAENs5K@WBCsf-Wk_lG7%{(w#bP2*Ean5~!V*McSRgp#Frc9# zR8FN!)GjJ6$N-!WST!OQJ86n&rWEgj8&wb~)ne%BlqQRIs?v|k`BF6yU1n#=u4t>^ zpmx5A$gjFkvd^qC_xDX~l7;g~sUEQRhqYc!8a`$=EW^6%y*ZnQw9hjrh{N zVpjGXYI}}@${A+!f=tqg!*388rRWpzh*~wQVgx8iA8SOkkP8PCgVi+_WHRJr!UB@C z=!6Zl8C{^7^o0Ssy{jMLalh*dd)$q(BJHQiq(rJOtrAl1shX8Ny5j`2aYcpnH7szypSUSs-Mmv_@6nleAQ=3NnR-+a@9p+1Bx+ zBdEqPLckG%Vm7x`nU>*@@dcZmllUWAeFpC+$__(LtTVpdro`+fiAn@J(gcNqn8*$G z00je`#<(hNC`j2;2C}BiiP#{;^L>&>{+TVNsDP0neFPb895>z}reIlGl&R_wrXYSe zKG5`1n=26OS0F^)&QUI>I(eVXN4te%`S!dmQ~lEruMi5ZVjGN zYLN!}*Y?ar9B};dro4B4@7X^e#I_?LI03E1$tmFhLzjZ)y?hu5{GNup+C+Wz{KATc zis`!{uDxF|^hKoVP*KI_JfLct1TRXDEK+93Yg)*a{#1UYl+2I)nXf4@3Y7@Lk{rb*mIo3# zakhIQnya(M#L78ghuy{uo!!Xb$)DXRv~$_{Hl0LHtfcFkP*~;))a?7Y%jEo0Me&Mt z$%)cu2-fGpxPs1F>vu7&*_VY115xoJTxGBr*CyB7ZQO`26cKQpmfFn&%ah+E4`qyg z5|e~L#R-WT%Hxd@*4BuwT~85MNg&30n5&}gsS9<8uXn5#S%xD?eZG-~QQK`{t{UqIj4h_iJ0t-YCws9j_8e?6l>;NdJH32`eUg>Ep*%e!E7T7u*HK$>2;4XO0I zaXZBs`xghTpG>oP5+rLZ?eJ8>_uJp;A=8LT{348QB_XR-P1pi1_Zjh$I z4o?&Z-uq9gcQx7iNiy;$z?fZp^99 zjguBTZuCxyh?60xI$|Q5PLI<*!R(SUi_(iREdP(Jdu)%iQMZL1+crAxj&0kvZCe$a z9ox1$wr$(CJIR~*tat7`*W5>asiS^DUH3i4I6X;ixEBB?JHExvJWBbrXV8*c6CVee z=>=SGG8_$we+{q7hge-0s~u5TZWuia;k#FbOB0#2Hz*T$$OZwXd+xYvJ^Ih{gV;`YVr+w7!t(c+0MT&NKtlKUE^^VyLFV) z2=@5?NO3&Dk6!wG4(6O8@OV9Rl_*IMo_W=DO($nIh8%76kv8T?NG#MNwqO_{u#yx-TQ(KubFY2i2PlhZ6Q8wiY^$PA5 z_7qlyS`RoSmR|pMp;**8Ta`n+dLNY{q>uiPJ3+|esQ7es_;M_En16f3<)X*Qq|^YF z95M>x@;`wZ$B8mWY-XIQ0}H0aKH|{~f`kpoCYoO?IC2D_TUOIvit*)h4U`(nIl*Hs z7Z`-#NwTFXDJdytLa-(ZU^$&du^X`l4jaV|DQqFn{+Ws_r^L2R+B1M9W5vQFS%oSt z1|e211y^EB=8loy8Yl~DF<9|fUCYgLogU)}#a@m-{I$%Dn(fnZx|pK8{CQ^K1vM`(DS|4ak?6v@_JJ5_7a(13g+&vtTNyotI}sx&vOfel{<3e*gUvjy-Zf9 z3`P%Bt#!{tNDxBwL{q;8cVkBAqn8sD_~@_qn)~S?8`_h*U_`1b7?*)4_fT}MFc%b@ zYPS7(kBQl}%r*F9bJd2vv3s_`L~DA9M(Yp6BmN^ms`9wPYWZ~YOz4?ys~fQ<6t zByA9LaeUy#<+0jfx9|OK0n{s7y>jh7Yv1Bg%hy}ic9^J5YULiIwE8f=-;s7;epG}u3ghXr6 zyr4+dbi``3F4p~eUj*CTK0oHPiCEF@*=&2g+UT=>R3Z*hXEeE`<3r-{N|>|h@e=iL z8qSyLb1$eUNpUs=PNH9*dBpZQL48hNM*<4qbwWesJbAR0QE09}ONy!zHpQ!EJf=h$ zP>wmPN5*h+N4j*K)?1JZyZT^Cd8=ycfA`D@zudU(k;P?lsmh2VbN})C$7AF+Eyw5E zgcwu6h1fgccN?r}jS^_7SPqo!XiUL2a&T}bOJvxygB%VV6#}m&a!98mt7taYVxH~=)n)56;2=ocqjht(O`SPg%{Qo0Z?cc_T8oY8$KgDgqWQ)8 z=wk{gDEebJo9?>I2(GVKQyulp`8<9DUI&E`@j7R|U_5P1eH0!$az4tt{f>e*DSHez zuj${{1b*ZHK@khvsl7vY_+>=lJZ$#cE#987HE7j94TZ6#{at?+-iSg5$4dxVO@J{H zmK*~e9RuOY3hheDFWiy8Hci^JL16k6F0BZt7rEU|KVf){$sc`f`$cN?1=U2LdLSGa5%Tab|mRzrgDqz%?C$x1<&%3|VAhfQ29bA>* z1(}MRZYZn=MvW}lz|Df6!T`p+2LyYf<_~uZ|Hs|l5hCC_Yr{wW^o#Ctz2W$@1kh2E z0bQn7X6J%(ge~o&afbbPmvPf+T6oFgS7BK|E<;Uo4f0ec>v{ zY>OG?Dg-3zn;|F(fx1}>$epc+A_rX4lg*&|7snff0`UM*Zz8_KIZjty`+g1%`e>!v z@WgVz7PhxFJ5+P3t*}W84$X{N&f7CuV1%hPM41A zw`kVtJpkTpp-60aDZh>}-orwPSk>YfRm=X`k=nG<4k>$Y&7fWfT-fog0^%yzA3I&O zO{lV2ZT^gzN7cla(MC~qPYnh$QkQ*aXv2m&1F~5VR>_XFMBv)7q)yj@)z@!RZ{2-{ zXJjLGWy!jf`wzTf9#yjQYK5vEGyaC$xBsG=98d~in>q9X$ z6)DFuzpA^7&hjn+=!hxPnb|y5rTRk#Khcbn)Iw(qE%JPDJ1Rcve#G~vDRv-RkY^8kLtxRj;#btas z-F;)*MlNxdrZzGMv1gqhZZz7GBqns8Hg!*W0p1+Jf7~Mhg9nTr9T*iV^nWfj8{H=Z zTks|XAFjBl)x$`35gw56I!@U~sNs@_+m~OWcQM!W_LT_ zbyh<;MEa7%1e-5dAw-MbI#_>=YjE^KmCPbQ(D0t_#*et}9#9w|(XG2LmSA2Z2YCwQ z{kpiDi}@uD_>-AX?cKk!&@jAkKTWG+OP}hLMS<9*dBAEvH~my`ocd0Y<8{^k@w`)I zm#3+u@>dYJA-~(|D`HkF^_lM3q8lD->G8UM-}vj$=1ga3bFBuve;nkB`2(NmHNlVT z))aQ97x1WuY|6V}n8C?T4hTkpCkPsbFxW68JtDDSgS znU&WR?UE;iiLI7%fG@n=;7`xS7ymZbWGjR-e_d1#Pj`6IMlDd+HIQ96QFD=`|9%3L zP{#M2K9cnNd)loiT@yWd5?j}_tXEu0r+-vt)vZHbL}e4p%k{~3<6Ze5?@aeV^K*8* zoUVwmK1`L3kCmV8Lt0j#8BKBrSE>rSJWx&B%0E<~m)fObo|7HKzXYBy37nSxB&(q< z4lCGGkz{fWQs~sBjBaT%F`2Zp(u*e$k@8a2@>;sdhyS=&!2E(g3L?$I zdKTrsmsJ@5S@8Kz-7)^xq!u+EJrN@-D=ot}6U46bz1~8^$V9}##z4!)#`f)M`O$%3 zqUaF)3y)!CV5enZW&USjB}I-BR4T>d`g^T~e;mX#g|HM1Hifqo><0+rKSM1Pfd4&0 zqVs$7pDnIy-|t;vp#dCmvY^B`(Y+awA|IgI&;>lliGqWE+w%=t5TNI|&&cj`Ry{gc=I=1m2$42Nx4; zkQ}Zz0|9Qo0KGqbb~CQaZ#T4~UxR@g_lbW=(dIoT>1y3CA@qPsuP@ELCuRJz#KnTU z!{8`vIY4Q^SOv6x23z~%q2ge0wdS{f^4DLlu`|!xdCe$UZ)dC_gYZU@i0`Bxx*{5K zClMLdT+EMzC`yqv9+E>2MNyAXq{qsv`;3^-3z86}V04#NCAl+{Lw8bS93#e|LKZS3 z$!GCrcjJm%e$k&<3X>1cN-;wu61p`)(Rc2Pl4r@=f1=)bNgSG%V!!p*DU-CYIeP%B zDYMj4{TC2XXsKul4HK9z-v1G<{$mt|@!wNidd^_zu>XE+&dl~dlQ5u+-`H6WCnzSM zzu9`Uo(30oCSou~XO-b8V6wl7wVBjdxMxUpg=HY#dNd58wig0UX_=e`RShAQoRlo~ z_rw8%gya|u(}FCakT^vGv%#EqkMvmKr1WoBP5rs4#EC?#??#)k(TLI8YOL<*RrWK- zbEZ>`>%UTX`e5o%RdyBS*pe3xB!_^XQ}WMG_Jrnvm4mR$oo0U19BS-{w-^IC=cnuS zACS8ZtzloFJ>PTif4UK2_<=^;fnSqp)}J0Fw|Uy;kPyZA$#J-9UPCXa~p} zYy!9DiC_Qm$2Jn2{R@*-`8 zuA+;ZiO8x>5m{ugh^&}`Z}nhiLRM0m0rQE=w}Mi-qk?i*ZVjDt4hsv=CBCSs-02iy zkTVHZy9rk2ov3i%mjv(DBY`$ZLcF!4+Uj!}AyyF_&E_I4N-SjlB|+`Yv!H|tQlonV z^%v~aJPDci02xiUv$*%!l3uNxcr}bYt29qUq~Nf#+)j@A3f>@!G(KsSlv#x7*Ds>@ zv|xP`nT%`S>LX+T) zy9#C#&INF{aAvAJr1~}hP#Z_>L&HD#)F>R1I9 zvF5w-YP5tPO(*nPyHd%Gd}0p0LfhqwlU(NIu^OZqxTbydj=Tpqxk@Pbn^g1eUyD$e z^*=q3;`&Y_JW!>|~)DPv5~cCXo%>|ECwk_p8Jl4VlF`!$Qy1v9oBB;zXQ-! z!8poin)~6B0M^UtLbIMlItY!>{!0iR9-MJ#f$95_9d4<}#$ID^thtud40nu1X6R^* zME=jjM9fQoeHE5OEC)^cU7RFVTO%GiRIUkeBP>gf>uAq8N3`zA(wJtY1i(;wcD{MZ zsGZx-sfE%?{kX{z{DP2p@J|h@x(Ti#FZqfW!>U^2$aY1GIAgmfm8b%#lnb_n* zXU4|N601dDTviH=RC400a}{tGq*vcvy*sQ646kT@qcE>m#ya9v*A{smGo4h;`qIc zOuz|jqM`kxn#oBS*OrLoG;h?b8+CXmk&3AnN=Y$D3pon0l^T(wi=)A25+%|& zM=4Fj$;mV7D893HqGRVT(g_0k8^ZPBJpP)v%y(ee62{_Bi33oQ;$=``fi2pQTn7%Q zx#_MVV$sg}?P!CwD=!Uuha`;(T{Q!H#DHL1)>;FL8!6=<%=&3T5OBhFicG=g1?gnW ziftKln^bMtbMPzq1ETUiU{>4tC~LqO#uT;^T`%}v8;;SclD$G?wy%{aOhbEep5(@X z#A#qmpY`is6uiiP@j~UU{>G^o>ra_wYUjnqIZw6!RTzGkm1P_h?k$+J3_u#&4B!*9mQe*WnPt`&Am8bu#^OVSDTGj}?hi~>c zOJOkGo(y#{v#Shu0OV=vj8_-GU3AJu9WxMb>5b(0Cv{12b&5zn#b$uPApb~mNEsgTUja-*pBozL=rFoZ={knbC;W~X|`0=C? zRSE?|me6~k1c%YXu1_9wM#edLY*<%3L%*+3SyuIHCIR=D4xgm$81T2hycclQHChGf z_AZ9gl><1PY#9yN4htQiDB%Ox9@wXSgmHD=vE6bo6J|OeTB{k;#<(5;JKl+_;;0nL6Cefv8oLqPdSZcV@QV9Qh!+Yjz z$``Nc_{PiHQPz7y)N|G~0YL-4&!c*mo6LE5XAEQ-Q`TXZOCaEL)foVN3~;l%$n($h zDM0ja-GE~-Gu*a-g46bPUIQz0Z*`1vBcP6RRNPI6F|TA+PUoPRu#5N|GVJY64S3`{ zOaeWP6Wq_+9fpa`&0&0A>*dRu`LRNXkE==8i7gn5KUy(ik_8!I5kjpxs;u9v39I@` zwSmAp!nfEwwNSh6&j`RV&r?D|Mn|Ac)5Rko0~ua6Fk#VXJ+6+^M8SA>M&SHrG;=hs zn$wUb`}41#%i+}?D95YUGjlT&{^U7t7Eae|-_Y3Mf?5?f>dA^l>S7NAk;|2{__dTeWhvt*z~Bi-*A1hgbXC~N@PD1cS- zArC!C?{~wx0<&pO60!A$d?iAQxMSH95h%SJ;yuUz{&hnyPyi6IcjJqSC0fHn~K^ah-XUToC=&3LD?<%+gyJ;wBR$ac-jivczT3`p;;1lfcE24E7lw2ZY`_kl18N4$Xh_1z zC=f%wwys^>6GR+d6Nyceq0CsG+&EjYu$FfwrUK<^{Tnq1PZi-C3yX#Yv6RWEyn{{j z!x8AICo%{WE$ZGrJi8!Vxy(1}S>)SE=VERwMMZYHCFI^^?f8$2O~d8iX`}B|$|mrC znm8%duKzb{^u3fS1U8a$A%B2#ZfBBb+rh{X(uiXHrsshC}}2}R;iubsQ^$**We zjI|Jp6qTF&b(T?nK8WcSuY=*AWpd12$JX&;a#?JWWPa#jf=TTko2ar1vxTZ&m3a0$ zTdMW7TDC6l&mSL61};np8Ps(d)S=bHp%2i?ItBD;M2VE3s}vbgFkj?<7ES*%R+Qow z35JIGucgxe?k|0t%>RFXiGhXvKXXNwSXRzxhmXGZD{8I{T z;`JFp@Nr10rXZnLAu@1Kq)53SyaBP2n2J@8>aiuq%CQ0BRTKGx`aD(QRcmjRj}H$k zs@9PuRen6G>_3fLo-;Ou2iEqdKTp`Wwl|(Tovr~NU1=IbK=M#RJ%ZjMW-gbL-P>Hq zRA#qPHQSk3Kt^$_nSUO+S|YQ{!=Ha_#k|CC`Jc0XIp4(Nhv`Ak=XB9BumfR00jYoa zdB3}4xIWr$jEDeP+vR!|*HFY$Q(ASx-@eE5l^{X~&rgyAQQR3wZXaE;DSNC$h5@2j zmu&%OdO0_LN8fQ9pV&!;`o>Zfc)PuTS!@-(YopM`0@5hH$guF*BfwiF?&9= z#t2uIm~MVQ-aUpD@VtPjZ;f)paszz<(G`f&yP0eU={m0V(Su{4jyu8i_o@__N|=#^ zY2X#>55cx*g}c%U-BmK`huq#@L)-gbMqYaevKxsGBf zC8G*XHP^-(^{z^qw#KF+4isBUYxVpEI^9P5-oI@gPRA3~X&O8Q<&J9$clA_?7L)+> z3v}%%K{5Y-0g~=9CQ!-|oZ+D^&C+N;psA?IG|PVu+B@heshFro47e~5pSkaj6(wT? zl9D+y(4HN-OK1zkoWn>y>5`QlkR~}u?4e-x37!d}JgQ}oIs`epltLl0Nu-zNFzuK? zOeEokfyT>2u|$=cHyWzPUR+28?*p(%BrsQSiiQZZRLBZ#z@adR3gr?Y=8V@24S^;a zZ~iiaVnDh?y5Y!@K0YC^Y@k5}Hn zw(X-o6(&kos<^QFw^6ZXN^X|HqQ5zpN#u0B*9^KJ^LQ35pe_9>T|60c-~-G~>!4)O zIY}6vf$Ut0A5Zzl{~l42HmQc?7s#?$7?orZ79$F1l`Z=58%ttPDLno{zJ;`{P~Aal0LVjN35}e=XNQn<2`*-G81t}=+K*J2n!z&D=AkvPDaf*v zJRZ|bP{d;D;>$yHF>muv;EtJY*P7KtinX%$#_b(BW2)G71x5mHg4 z1*PgpZO??w4Rq|KS&}dhS%a3^b^mN>sKJ5{OFc=B&?c!=bSZ)c29U+qsI&7l;IN=L zP_KlL7o>VNG3R;}h1{Oa)%M|XstA$Q6no*iY((E{db+Hrs~NJ3a9y4!J3>jdKKm`P z5pIg(pFzhpl*~5_^dvA&fK-L!Jh2&yC5I|m)~g{7fl6o>bmrqgokoO^GfP~~nnxP4 zmgFE{MHgcGG)YFg0wiZ+XkB!9Pw>7ksIfk^wD<-7DLB>&TdIbzpQ!pQXwJj}QA9*6 z)B_r9DH=D<1`cpPZSF#X^Cdy($)gQU<_GQNlyqbE^ytUtm#nO@8%*;l*DS1|gBs;+ zl~ou=Fz#a%`UPRXEyq3@cx;S|!y$}7;d@=_hM(n%v4s*ofc)yliia(8&!~ul1cL<% zy=4`>o@#N7Vran;0wHt8M{$vzv4gWo2;P`x?Lk|7qe!Yqv`cA)eZ{Ts6RL`H##QYI z8rWz%7oTL8m!_@OEGkB#2tC*p)&_xrtchGnv7~J#Zm9FPxX1Qv99{uMXHi}yd|h8i z^T#{q9L(x6V6`aQes|t(`{yH;Q0kC-U~+Z<_hV2PB39tP`$|oXD9Dk-gzR}haM;>Y zL|89x$RH4tjG`p9zCok2+8knsAtd16eI9RDw-F+BKV64< z!RCT~#}FT4dt=t4xX;Prk;aKuB|&%u!4*{jB#9^(f>0!B`+VxAb%xs(C@%dhhoWL| zPI_FauKEr4NhqnwEebYDAB*;IbgXxV=XPRGgf*i~eq$IBk+<6>c;Y;Ol=;t{Q+4u+ zu_?4+YbCxwmm?ZnuDb|w=||)Akx|KdbHq7j6(r5sgG#neDH{ykgo8I*V`M&joB{R# zf3RcC=zGs=IDKV#jWD7KTY!A%$WXVS(cs>@ceUMn4JSM2J2vDWh&sD;ZpYSBE($_z z`jZV3oA$DfAV4W@dB#Jo6{%AV>J5+8vkkB#lZ+;T7Mm99cgS5_0;oq=n0SbZnK7pm ztj`Zi-cxl7-0p_?wAO|@)UXdsJi?k;XYlix;k2 z=PshmHIdMFyh|#;10^ZhfITg~Q;yeOudj)Y*83QM*7c_Q z_(%B3NW4+3h75}sr|$Xdpj3fKRQUcvb!WR5J)%{E*(#r7Al5KT#PmLWMkF5G{xNJi z%NF>QDg0k~Jz(ZGZ*}G$x@g)+R->a{##&heLzM(-qGm zDZbm|)IZ1y%P*}ZG>*b2#9eFvM~aVV6Xb=J4E0t;5JFSc`6AC&GJ|D*tKl5)B83V>?mN7;T8-nAAWRj$n7>ZXL#)=dZrq9h% zF}Jwx@3cOee<;4kg2!}4bFtokuszyt9+5Q-NN@}L9u(Woy`QdL6Z~BUbcG7Zee4WF zA`%37CvK+Vqxu#IqlLRTZGZ_-I;>kKMEKY)bt)TaH1q>Yv4oCaM4BJ{+AnMx7?AoSYpi3b&NDX$fW6gpev2u}x3{#} zWc^4oUc>X)K3kUfw1fKkr?nre1=BLoP4A%>bQ3lSfMU(^x7R9Pb!3}0 zoOCx|PGa0YoSU!#v<@CYlH+Ns&crX92VNP^7hS&d*_#>ayiS}6J|}yZ#*7BHeG7P; zcPj;<2>9O2_XbBv28OfY857)buTfiGEY)4D-ni9WB4ftwgQpMf))=C-P@g|C)=y*1 z5!&ZRg_t&}qRbBx8rAo4=T-u!E3(d+W@!ZDOqWqtG4Fx_VAk(;&4|`q4-W;;c&c*o zZ4;4I*OGvExlDZ!FR$rrJ|<7oQNw*D{O->XF~ohgryDXa(-fPP6^Rdcq5Y7fvu z55`Fl*i@iAIQ$G^22r@%N?qr&y_uBI`fVIbWTPJjM!guUtZ9=F>+64e(Z_%H z9@>oRzf!AJN@t^F?2JN8YO|UPe%3dS_8Q|_M6w4Etm5x0Bqb+uptKM=MBg@uR?4n82tMLBi^oc&#mvM^OV9p|ETq^+e@}8m$9}(}`qE!h_LYeYK5Ig7Qc8yIbkT~%Y$vuD-p}Wiexg0?^XcLC(W;=;p;Q9H4T<>iC z`y-k037~!4P_h7Xpm<$&HZzyjm#AV31dM%H;uk_iYPQ=iVf?7Bmc}E$x-&uUk6$#Y z1>>E&TuGt^MjicQ&VePeg7xM31nC1bKgThDEk5prwx7^W_hy--WQwTh{BBDQ-_+)6 z04S)As_LpeWv<-CD<{>&K35IE49e~eJ$++y+NtzaEYYMGp^7-qlUhb3=+kulxPcM> z_Zq(Z_nYMwhAi; z+y4@YE;%jS(M6h7IybxCyMkaPwwc+8Nr_3>h@rLCE{OF7i8|K(VQh&1lWdMKyc(cY7za>&0tjZ!Uvf zSsI@wY_l8mMTAQ5*YrpVx!6ncim+Sb!{U4iAJ&g1z78)4MSZ~7Cs>2LS!5b;aNxyE z1=k-i9%9Ww{9au)or40RX9zYL^=I*~wI8lRo-~90biBd>%vj-GTJG)qu8{Nv&etXOp{vdr6+(l8wd}Ha3hk=FS z`&N$}n-eMl5Z@Lo?SLTHG0ZB9RYDjeyo4+O1_1*V6q+|>)3hly8iJ>0Up=Il zUJ?~eTQ7e`pjUT|C^-!N@YF&uyrztur%IT*N-YRNz#lV#G&#kJs7?U+44e#F7yhH? zF#?RlY@1#&A}aAs)G&h{Cz@O;EWoi%9Svc(E!?2gjvB*6;8nXqZstt-_Y%Dj36dW+ zj!F^Wd1q{VH69)tRU_Wu=0Z z6?&S=8F>1ZBw7m_oq`pmB(yqp35} z*g7&_w=+*6G0bj2vmH{|Pv!Ukt3F`GzePRgOG}Chlr~j%HtY-Sjv5_vS4wmY90Y!pJp!_>E{BQ@apif;4i+qcK zXg``Byd8TY{*~I#xFA!0Aq@@&JPTO!kT0O$jEW|~ECTR#0(&T3&_vFlk?fy#g49K*n5fJp~vd{BH# z3{+LDRR*uDcW)bru%xT_f?ZJNP}wMex&d?fUP87jSRI?Tl72?2jcv(fpiRP|kiH%E`V&X)9 z2EupyDHq){(|U9T~7Ms6c3>ep^oT_`1A%@BW9AgCgF zWLU9&rCD%~KQ=w~@RDdP_KiqGzG%4c#*|coqm_Fn>~mcRR8k9NrQ9LWBr-ip%2$XZ z{^AmH1-V*bv~W!BeG7N$n186gQ`Q1}kz*`KyG5~-ok$pF;q@z|l!`8?7tyt1`;Lj& zIMW67>E1dOgbjW<7zx5C+AH>1Wr|+C|b<&n)A1C)HstuvH!E9A!yFm<3SC^169M z`F)Dnn>DW>hBH52bbBGltFWD|LP?R0Y;h#w!qB6u_6l#zZJ1vY4nIu*#x#)S14#+6 z^YcAT=&oVzmjejUHCf7-ym0=S>RcS&etpUcK6x7qSZ{ry;QvM#;Qg7QigC)S-y*L+DC=d z+VYzgo?nWnhFw9=TK&*myIu>FwOTeiVOsG-vF+2k!CkOFdpda}ek8u^yh;~zo6(~$ zlkRl2nXNWUn>NDa`n@^g+Vi*+TRnbZVvF~T^&CU1(<1E_)Sb57L+F3*)v3ZK)~)r$ zCPb@!4<`nI-yHHb>b#}eZzo@#{{DR3CJDw+AH;Yqd%5cl(Nz|7?>@$7{`p1W#N&}8 z=kxJ*F^lK;(dz|!W+Cua3?^8XKik&tn_=KQ@XgNCh{$t+GBGv@vKOT!N#xkTu7z~m zwttXfurGioxh&X?9svc8jN{z)m` z#3kQF*MHUX`XoPsz+NXFdU7G3Jbbw~FhHu!$>#jj&n1c>{<=Eoj!W`sZ*OCfr>x3P zsV&l?Aeq<)HX3D)FT~W5UEs`2gqSt;!yULTBn9IXXycFm$OhU^mLjU)%ZpaQ)e)IL z$^`&|A`rjvCT4j3M}o-SF0U|pO3M2>k=l0 zJiPZ4&@AWYzs|ypE?=I(&arwdBMeO7{4g~tA<`wf2!1sya5@B$P-I9Vc;F>kEH4c& zZ+DyA6MPE@Eu4{w!XtDPyS&g|egyWH%;jvR5}LfV;f*VT!SoNJm?^A7w#cOqebhR_+}>(}w}s3DiK zUE%u*0k@Y$c60!r*Y+#KmTMcY9slOe^|I$h70X{;u-h?eJL`++XR41uZ@jWY1v@b1 zgg}e-A%(KQED+4<^{2>3b+ZE}E}VeM<66WKw*xcwyMpolGvL|mEUVr&W4wIX%iYaY z0L;D@8-0uyMr-J0H+~6-D0>x?z!O>oDE#wV?NoRs#su8WI$Tn{OsLPkNdS8@jh(X= z6+2{Xkz;+rfUs-|o&ify{}mAG1#OSpuSt*Rs?;}OqnGb|toPdu_#?ZE2`ZrLxhG~a z0iy<2$7Q{X4Y5+K=C1&^LHKD`HR(^njT@U*U7e(r0IKaU%shHC}bY3$&* ztUQ0-l1)~NCQVTF$d@u;HZq30pziE*XB9gF7nKqf#J&lHEZPaqmD~EQawm3ke6ikG-uAU@ zFQFZ$y539!*h35S_gvQB`&?mWIGH%bjwMnx93JtS5{~xqF%!7s3o5|~d8(4a)HsVC zuvN6s0cb|{OhSe`9Et*C3)VuCzof~D3HW#+PW56lv~oc?qZm=B94+Jf_^>ym<$s&x z)aIBzWrz`W!r}Mtqs(Diy5eC8u=77c4@Woa3si3%FD+kq4 z46U5i;Y!*wzjv)}e7swDU;WXnk51r^zI2uWDszRvraCcy1`I$V-JlW%Nvy_RnuX}_ zN+m|QAZtAaEIaIgUjvlLfXC#V0tt95jT%`Uw#tj`vdED>J38Fw2+9^YQXN(!st+R%= zp;6TeaE-m8Q49d&T}*<(mYkN*!X_kG2-NK4icS=kJp}V;(H=WqS-8#%vc20x@}qme z+onm9<#1PE?9X99Pa1x=&nI~EeOkdYH@4Y`+P2RjPuolLq8shW>fHTjTa}d>%DE20 znw#o;7im}=M#`3;mk)w6F&7pIA=?~m&Z}YpQjBs0^;T3v& zI76sec-Vr_{owx5^x;wJN%f&oVM)HH5lZlNP>_5ZsJ}+yKzL`0E(xBnyfId{^?|iZ zd|h0T0?&Z5$g}TvVa-Z9Ri6;U`vVn|JB$X?wX`2Rl~%$eMPO6$|A-7=+b3q~q%|RZt07c#(3Q8e*!udFy&feaw+ij|-UAj% zwt@OUx(v4t@jbWIj`@jH0mV^$Scj;Np@v-?}a(zayLqOEA@QZ>-CYt_sS{1_Q<^C zc2fNqzsL?&{#cU9Xs!gSo&b%^?fC%#D6k$SyasbSbgGx8A4QY%;{JqL?Vrh|Xl%$a z)h6u0QkVh3)bPcUUE;1bCHdjdbi0BZi!J$ajNarWw3(B>_8hy~`1okH=yc7UbHAZv z<$6%1`FuO?z8KyT@kCyhtv?;xxo2JyFRad2j{vxd{9PaE_B; zM>1uQxsMy7C-Mj(x73=UlN3>=f^<&O+^#ldJhUXwxY-GepTJ|Fv%($)8vUL=I_Tw? zV-`S)DE?7ff^@?a#IuFm8g=@bP51oh?SrHiD~-p^_*=(i`|rRMPdoC}rK(<$+qZ?J z*1#94KA{g|5_G}dhehPKwaOC+@KyGC)SUqu!9AIm#y6%7R7gXUK8U`(b#Oq)Mj$sB z!_p&H5{1ICwJL+V!;}BnKp>wK@OhNFZ5OFfB#l9n3dX5LuO@|=zZ$SkFoDAWaZZf{ z#p5jFSL0#0iW*9F93MQs#Dkyip1+%9RBoaswtk(Xb90j!;nRNOj;rPkc+N_=mK^sy za*wrgco$-FX#=NmnfJE^e=uS=2C0zXA5_fmJ#W&K2{cEg0h<^(a9x3S6{q&sp9<72 zVyxFGp(NJpuH?cfB#|&ttS=>5x|$0Xb#E%go7F!{Yw3Eq>!ZOhklCAK&DMMHe1FQi zM6}tSS}3!t(Cc;SDmNto94o4AvshifrSQET96%n^b_f`+gW%~-OGm!A{#uF8e)8a8 zk~bAX$enO1urn*@+T34+@6Xq#K=aEfG1XJ8G5lcruDFLfUXLn%M{{4=CR^IvnEA?_er&SLK+(TZydi4hi!UKObGNOigA>sm zGNp_X4>?62V?pu&pVUrpeZYqIt+uem#8U8n8&_{BZ_uXOTuw#969ik!x6Uu|p@5ID zV4Q~D;86XMSBLDkL%pMHcbkn53E(%vcQ@`k+#gK>JF_&}Aer`eMFO-5qY}Luzl$~r zKvM&NrFDjr$7HjT$d_^t^Or$L4blU#sKap$Wo=_`KT1S-me&=v0fG2>Xiu{K`hcgCI4 ztel)TRDulvzLaW0xV@MKG&Ki|AL8U9w}tIQ&R(idp&-mTX>_Lb3T1+arT&`NFq6`8 zbjACof6Bu10^sv?Z%jn!zUcRw*4EocBFbWyPk(E*mRn|rjmRcXeartu8rr}lS~#JPgj$}Igpvl)Ja?3Ue_z6o~sT( zwyEhhWa1dZ#YLf}`txxXmWM9TrDWkqMaJhemWPAXX$>@jG2;WM&_pEPI5Y_>%Eq;! zTALN1q$Jh&rG#;KVnAx~A^Q=HO)qP*wM`Ci)GWL-q@-_y<3Y+!@Gk(NIb+2QxE@)M zJ8D+csf1riMEPg9ZTlwh52Qzgcmh1U6Nh$uhbRt&4jsX7muitDR7=VPCV!Ysen9>t zM7cdjzFJ~f%9zC62xTu|Qp$C6d#U4Lm&V5GulJDBJ$>~aQ!F))W9nJk^A>2R7Xg6$ z8guG7Q-7>QZ5cmp?qv>F*is=H*i(m6>5dpv0Xt=DpY_y+RURv2QvZW0xK&rLq7 z&y!AesB#s4d>WOPoPIE*#8V?D&fWomZln=W$Qo5wimR6MS{{5j?vslc+ESHoQKI+F zNTfU;sr)}E99ljC$e`-{pKtrfw*zZ9;eJ6ZP(=AFKt2TKc)9#d7s3Q(ioM9^&u`aCiNxO}+d|pk;F6tZ_ zyX0uGzjQ(*HjJqIr6mbO0UzwWg<8Cv_fz%d$K=}$2D?|GSG4ZOgE16hAIE28ZiQ@H z&v%@eZ}M8BQ^ft`i;_yiN6S+++MN~NGPi#+=7x?A6Kx=HP(A4s-d7akAP#z1Q>5$` zxXg!+S=eo+7*~I+R&px;JkRgLv43k5hBI_sf3zWj9x zE${X^h@bQ1R{hv~7&P6~G3BbxXH`z|F5lYxj^lU?C_V)&9a(jM(`tLQN@k4MnGh|* z#;oh^DJl&Zu?)%ZzqwhQv+DG{gz?4ek;b7e-MO*Gjcm@n-)5X5b-6|ppAQ0^c;qD1 z5N$Hp4+otVPSts(0li}f>xIC$(x$4hRhoO)5hnfidk&r*dB_N6Q2WD+Z=fmVG#w7N z=a37Y{A~vXdwAUbIKGca`u72$D8TFdiR7&hp8~hKv4he~rXhqoGg` zE#8h>LIbolAmPa!n|(@P%;M=DsSc(drds4{V)x@oR5&RUwEkDmg8wfS*)8tVeNaou zQ&_9v*l`-)azi+J_xWJGpsoU67Zvu7@vbrFzq=f$z_2-Q)t)f;`)|~#eaTY};$`v5OU@fOvQ;1#s7oDrV94l$|HsxlMo0QC*xRvf+qTtl$2K~)&5Es#Dz@2i$F^;!!;bAYzjJ2ZIWz13 zy*}0btg3ZCdtduv5(egue~ydBf^|oKzZ0oW;FSNy@WhEfCNd9V{%u>#l*~yo{8T!2 zR_xvVPOed*>rjxOT6HAoB6`Uxd6PTmTOI+`J1L_7?1}q0xp<$mKTLo+$m^a!5LtcUA%kpW|Kb#cfS%O8hvtiUB5ujHTei!JRuhDbe1pCL;PE??I2zx*n zUs174P6o#iSEh^sk&41>-8wkGx5;U03xaSyvuCywcAriZ7IWqZf!CV!vdm1BC38rl zExY^%-rijECDK-;EziH<(yhoDVy)sg}ImyKX?52Zps z;zD$~fEmR^%(ED};R$7HgVjsL+WHTvzJq*mL2XXOPLqrynwJdv8HRmzko8$f7(Yvw zqCt}rIURvoxv4xHeIH4yid9IIol-b7<`^SmdHK997NY{CnX>hG!NP}x%}WV5^9Ot? zVzL3m|73f>&EkJ&t25~A|JO;t{@+dl_Wy7az#~h3fXhsBy1zat}H60g);kuv>gZ{Rf< zeEo$(!tSMQj41b->cBQHV*d!eDm@q+%}or{_`Jba$>x8a*D=i%(2e+-_l`o2m}AT* z&lfBRamM{4K$+(oOA`&74Hnf>H12-<^xmZsaE8$}5GwLM!gn@B>*aApEJ>{~sCy_W!FfVCMzqzk;Fz8$2P% z0j&S)SempET`|;CyK4Pkm^V*qJ`g#+YnI-KeU*OsV4)I{zqchN1U!?@V5ZyRC8D56 zlaN5UA{O*63Z5UC2Rb%%`cU}7@=9hI8 zq$Km#JLj*CY%e5F5PxRkKGeXkNkMSIgZfA#6*;KXBb>0{N}22X>P3<`6IKWg?hPwE z^8&I2K#4$2u&^Yci8M$H!Tu`$&E#ogf_Pt1pEmqVQdE>$Q#d6za!b_->5&9o;%Zv+xlfh zjx&JTroNy9V6Bq0zlaUzpOs`wG%ioAXlD$CWHJ8UYYn%wkgoCxlinI|jA?G}c>x1X zg|8mXj`-C~EIG9NJw%K^7YccAU7=Rkkf(!Pj#r^x$fTktFCV_SC*6B{?ITI}tAKrb zjnZu}RZ5*J%w*q|hiJPT?%6s=t?v|LIDPfhbSRyk!fE~1mQXs1>M&fp9gF3B&$KLQa3 zJ}4Ll03D1Gwpqwl)f2|IKp@{Jp|vXv=B(URz?PkS`vx&QFUc#0o;A9gjrP)<&xxnm z`uBy2HYVaSu3U_srEN)RSQ?4*o*tkS#Sd9mAU*pUWvTABY_0sq1%-lu(+y+@kr2(} zICh~Htrp&2ErFb85Ds=wiPwmBBmHf2BQp#PAP&*SB#a6pTTr1FjLDmNr{!ttjv5!? zR?x4pd_1KVUF5&Ws4njf%)m6*#9Iuf2rs{|#%yqMPS(L#T28@dWu|8A4G;hyH-5| zK#}0MoqD+!QMvoAgJx%$f|s#gxJ(tRz*5G;#P6GeLwl+i(fdPPewB)K>`5DvpD%$# z@)w!<jGp0=S&4mKv&vBILkA!|oo*QuoB&!k#JL%FBGYA^f z`cR;Jy>>Gj*O0I%%?XT3&R_!|A-!i_!T*8^H*f*J!t<`BJT= zNh-G)3~4^MtSkx(0oZ8Z%4Pq}s4g06tXjsQLp47dvEvx;4K+m?enx%{?8{rA&Zy#% zl0l}f>`hs$Np%b*!)+Xa#@xFrcKk|}G6VCQ6>s3H2n<*x_R!1AQTfV;2MLehP+2$X zdf0@J+`YSAggdV)J&f(yCc|E&(mJIz%fVc$f zqr|W7M$C^=6@c+4uM31vKF==`FngPxRn_F7OE5@mR1dBf{C1g^o>Drq2#q`dj)Ect zE$BPdz7vG(Aq>=ai2Q|gOuB1a3skPx@}uwDTORRUrJZ?#UIBm!-rJ>heMactnoSNu zi@wo~@=#=@8L3vZy_r5KOX#K#) z6p4IJ&`8J75a0(;kC$mq!)ycvS(+Uwr#3NsihW^Sr$rTcW`L<;T$vrXQ0^N(( zXrAVW8ygjGGOM$cl2DdeUMPG5Ri%EM*2+uEt~o-IpLkP0r%mC3rK%Ct<3;PNQqsFW zMbd@P_uMFKnM<(gQc-QO`ImUp=W$bh;AwVf9>0z2v%e2uDWz~Goa3D)a5o37Os0{- zY>;f&nOEXGzopLHrD^bH*x;g5aZ^*N^?Q$^Nf_BeIHG}DH14msp7y^?61#7$uyWtH zlh)G2lME)j&N=M@Z2Delj5rWY>}iczHb}3fN@>bBc@}i`rPhpE~{R0yrMKYwe z=cJmqlH*k(5r6TtdhNi}`E;=Px%A#w+Wnd2et6h^vC?q(5N?847#=5J#Dzg@{h|KI zY>0cy3KbXK?6AES%XKN18NcTdjSi+n2|cgPWeIREDthsyr7gfz5ik!2MVPn2493=L zg5xRSW2tr~kCZQQqGog9^ZN@A*%De@1e@?d(WrI*#{ecr74%psC)i%y1 z;Fd?3%f=dy;fPOiV^Y)lvQzYm4j!_2lSMgIWOE!|aavh}@dw$%8`t+u{0UHkEdnIv zbF}qKtf* zU6%e3c0HTH{1FECBIyEz+_<@$ww&n`=C#=_e62czC%-^g3qO?DN)?8lO=TF1ndVgk z*A+xxf)0?ZOXHF378H_<3uk91{ZMlttr7e8LI(0?Yaza;G2w!Zr5xb+B$nEsaO~p` zq}m9 zaCU%DIco3G%0MN_0&9>vXyqY^k-2Dpl%IOh6lr?XHxQO1;6X8`?>K9mK-Mk4YR34 zR>~T*M-@MBYw@He)b!Bqmt(#@R?Z{8x@ko<3l2s9*D|N@>9}W9Q<^naUd8uv zubJD>cncRlFMqViz?;H}3(6knzC~rcz^KJG`?t)tb+Kqfij%Dllt$odsDaNa!oH z)Q9)}fy)ji8BE%5QTMB3^MZRNaCteWD^v|eRs9w1s8p#h2!pH+-CPY#b0(#C?x_gN z$tBgEtqYJJYt5Xvy8hK}gXh^RvVx}Ou^sr4W7e8^U?WV;KRP(x-ijpu`z&eb-A-<8 zMQW?Kj(D=HT}?zttREGB{%YkL$oLgyC6^_xLLO&vqf6;Ax9E*a?|b*F?AfQ(ZfS37 zB;T@x;*loSMa|_rl~?CXub`;M%BS}3R#0(T{sX}21?mK^? zsJ6C&TERM+yPdF?)gx!32G}=TyNrD@1k1?5mW1bv(Q2qUJ?#)*B9G8f9aapICM=&v zqwXdeDe>qRN4@Tkn3J26zvjwE6uuk^-Rpo)(Vrff!EVNx(ksm(gzKrjanKofoq_mR zZje~q?vTzhgm$a>Rn1m4*8xBAk#Q2b%UH>07NzmXn*-<%Z1xpE_UzG;k6IFYAO~iIJOPg+1KGBhFS`S2IF?H`?ojE-9LD%AM z=Y3J+egp98V?825AC|bsI4k1YFDCUxZg1RI>8RHK@xt%C>px)%Xg2nLk>S9Lp8ub& z=lCy^2SyV(3J|3S0uSgS4Mq#}LIOhvuE#*21NC|!;DA>#5Td}VEih6b$#*bJ-~uWH z0T{=>6(0cJ|D~hQS01+yVL|9PqW9e((&#wR5S7+llOcFfvJwVC6C+PS33c4L#5a~H zmL#(r%BeGfR)1Hbw<7gqM|YSJWlmw?QHT^R;J;HLP=w zP7fEbvngR=qrsy;xUh=|ZxAa&4p;;!ovv{Dt=;%BgqjkXkU|ObH+$Zt(r^ux^s3&4 zQBQB}{x1grm$*_gLNKljUkEnKZG5)TT0|q{B3VhGRh3O`&rpC;efhR_>FMu)S-25F zDt?qp{9MQkVSd&OdH&ez1=4EmwzANuua2k!E^o0KW#^M25vmvEP0k4XPZl-G=!hzT z^kQ)p;g;(y(8Ud+R>u7_62lm${#*Q8)%8P4Od{FEq%F1eNAUZL6jh*?D<}mJB_2W( zjpJWz%l`uP9Ty-lK-vFIQE-19&c7)N9@hWm7Cq;)@x=I|DBg2CrhWQE=90|ONCFe& zMAR%Mj(INm@}8ziRknueSs7P8x-31cYlN2AsaoW?0%c|)~_MaH+G9gYy)KNOu(JV za7j1qkFgzE&n;X+4Ry$1(#1nI+Ru&_mQIkTpt6Qq@&RgsAab?0?5KDfu;;z^@EQKz z?s526i2lT+fSR4=&<30B-=1Jkv)_cXJMtb%5ncI;rD*y=_lwtUuqUp&cupBDkHC;+ z@xEv%w`nmK)G@WM+jX`JUR2ID#GCmC=!;u~Ip3A{0NH@O892!I$nFz%OQsLKJR0!f zSq3p>gtijXZI&jO(6)R>+6wS@QO|%V85m)Omo&6yK(G=xtmrPmNUS|r1U{oN|4P#P zH4EiPAQ#Dk{K5KBIo}An`D(4e#(R2O{p;l^QGn-y*s}9YH@)cFV$g*Iao(gQp*M=% zx60Yhm7ok%IQcAP!e|ZoOda0hg0~WUYM?wFV>%8jHn#k4QZ*j`jTP3yV94jfn|dkp zSezVQ0EOVBu$IDou_uAXtT7kv9be$lKODtaGKL?nB|fxb35wm(0YX-KMpo*B*XT|#X8CBXksNyU}3dY6tKos zsB3c2LSMiKo#j-7=1;k;-KgYk((-n1dl6y*^nKMB8f4LDnf;tS3W*`h&_385)rHfPCEw6l(N%SX|O(+uhp&UH(nQ5?x| znnhQ5GFC)JgiX@t=~5ZX?opN+@?mufHI_6P5c1@?=WH9E=^vwy6#dVUm!9`60mz1V=N z%uMon467Qen)AN~Lb9pit*x7uw)QZ=zm+90lw943ZLjHmHnB=nl@Ax1L>5cYjbpqf z<0^;VNEN;41oRl@|E0frsp>SLt67c(h%k^4B>b9|8km{G6>Z4NXUIj1ZK32CZ$}QT zXETOV7xRw0yW^>pp1#S+**f85J8rhMZqzn@Ly#KOGgHptzu zZIJ1$O5@T1tC2Z7{0^51B^spdM;)-4Ks#Bm!~#GE_#HxmS!rZqB!eRMqNnx)I3v3U z?} zdyBTSyoZ%y%L2oQnQA7iGjAXY=ut5o85IHDFYhKT5dxjC75d1XxePJxmT=L5^fM`R z3TG?*1_4e!4Sd9F({c}3K)#un*>Bsmkll2YHLAvO&->&D6a&E~K5q~%YpeUlV<9+I z2~Kq5^Wc1DZ;>E*v0xPlnSdhFpHRJOu!!IAF9lIVEnAnyEkUXU+tJApsqT7MGB&>t z8X0FPWk}M5&>S1>3Fha_BJ_mt*tSB=%kYzt!Jn)qpv;BFBuCyf15Ciypc8@3`sGBqvrF3S60>})>OoO3`P9Ncz_T^mj-pYUI?x?(uI|E z8&L8ms&uG{M70oOQbK$)f*jxfCV%7kBZQsK+iMD9kVKK>N)(Jark@w=s8_rWzW?q| z-YXm=I(!=HeW0uiI3Ug^b8tGM#27^_W3U?$I&$_`_1RC@>&?v(uy!ArOUw%w&OEy{ zH;`;m;4dWLF4Y@>S!uvZb&fe$C{Xn}9#7fF8H?vc@6%(pXrn%lVJ)-TGET zM+;B-Px=q?UO3HG7EK-o-%|KfqJ?+$%Z2TN&!!KP;9izZM?m*(F>x(%?dSd(qq8Zg z$DB{*K{KXsUCg`A%%IEOzSk<_fgjiYeFLz?J$vyS!~B~n^b|2O1|OVP8-YN!ue8oY`{Lw*zsU)( zvjSr5L2-qi834)9z$9J`d?cu9Q2L$TM!DCWp-{0y#A3FvC1f-HHYR1V)=@aRMX_XL z$Ml(=gr8F0P^{+Bq}e2Ne}jjZ)^5NF{;}h9??d4aiaX|#AP7|oR zbhQ=5dDkI+=KLUp)`}I>!WG<+FpthLpL;bKBpVzrv;}yzs(JUA6~?S{3C-SIh28VR z>f9Ti9&d(UMamlPs!HXmH-OsYzYrP(Fp0+03k{QH6DeqGQ**kmlE2$4^rysI=s-=3 z>7I7>y3XpC`ukW2PPO75D)e6}g)R`1u%EeL7~_JNL87^wdkGzJydl3$9ZrI5ZM>rz z1b2x*9ROf)d3dBVTwT57jzmLoO$B!Og+0_rhX1%aI$N(DI`z(S%fUcJ9b$*}OK^+B zjlS&umF_IH8u<_i#Yrup)t#PekUISpQ~uZ{WJ{U&>5mpuIJ0p9KjFwTj=Q7AO>yvx zlsx=5Mf{XD*8Fv2F@q#EDEJ7v#a_kRf!Y||8W@0=t4gpMF9i2v+JVW}<+?I@+u(V; zM8CTG&Frj3egXParU`dD_;O(UD*KeptA z<%g-OK)f5l1ITOhk5tAq666KHdQR@`m}gglJcYj)S*;Ed*HKL|=Ur4s5uF};2t8WR z?iTu6HVjb^ znNFg~?3fT2B^um0GIbl_UYzlpRLrVn{2V|R-MZ=BE!@g*cyzy1pY~CatUQxc-1*`d zMo4feH>3c)FDoxQEjt7{O80WmAu?4)LC*CZBoyU)*A%(aThK@N<{$j=9+2foe+b>03~+emCWkRAg6O$si1l!zrfb&?RacsDJZCxr%fZ`S z(b_S1ry>%@?V5qZ6UMbBcPqu5D8B(q!d0z-SvCS@*PDLtq5ejTbbDMnuBH+XDB_&# zaAAqG4c~egBAq!X;0gxiQic$!RuL{ja2!iTe0wzs`>b7pJ)WgI`auax=I40RbmnIl z>j2E0Muh5RQ&zX5HTgc*xSY{~cYds##Gm#ra~YCu2ui$2b3zD94p7L+N>%`x$ti?6 z-NeKR?=bG*F39NNy>yHQt%;E=4qEeO(#Im4iT18e3ei$UfV(rR$JcQ)RZ?d?(w_G5P2KB;;d1e^^nnni#_2NdR_s`vfu;kyS>3@jfdk zq$Y4KbMYkXAI=}M=2qq!&v!R>)IW>eOSlaa={-F>cT!f{iuiqhS9_24X7~ht>%g0S zrO#R7wcD2u;gXK|_%ca}6pGPi8N}mK{1~#_b1i0#>&F;O9iqWIlQjXXxPPHNJnf4| zcY_Wu?erGMRWH7TTDYnDpr!(^UNBhYu7_llO$wmD*un7HROQsmdb7>^MyyKt% zBvhy%na3umc(5>PLXH6-0^qhX>zGZ|u_bFX#g$+WeX$GYkxh;s3AH9P)CZ_qsqAT! zR8t3z#+@mLJ!caU!5iOX!0kY?;{R6xe9p7q?+%Wc?&*XlUD@LWuVaS66IPCH`S`C*$ISe9gd*H>f z5H^XWc|h!K`|)@FhAetqgAXqbFU;p&Y`-r=6Dx7*EB+!ZRj34HtT!c8tp2v&4EvLp z|NP?wL+j;7GX4#KYMm6p>o3E;B0JSQ6R?Hj(AZL6SULa4=gj0tB33=@Gb)cC#1y#^ zoGtNQ^Zd`4&C#^{h0l&618v=R4Zrm*r!%guk1FrO&7<2KAM3@#pcI=a;aE)~zjjMa zox{%9BpZ4cS;Nh`qs6FjYVJ+8R(BcqKcvP|TnUDpBk|z?!G$oEXe*rn#4J#LGs``w zP`^Ew4Gz-RD`iGIYcACS^9I^@0nsZ0h)iiP0gVG>ZHcNQquWMp$P8A{f&n~mzscTH zlGFrf#_(u{*)ghehqCS7d!zNrZowSFZ#7955Ptn1(z&J; zM&U#;RAFy`@*q-PUfNNrnGX&*+(haj8t@SRQc5)NbHs=NEo>Y~BSQW?hteHMo>#03e>myj`Ppnz9EJ+a#8;AGz z26&>*V%JA50qujR%TAv)!F1kff)i&3>vguwBWw?;XPyH9)9zpJ5rJ1J07-ii8e&SoIBr=|6;Iu39*!)>?|`FYO5V5 z#wQx-W|rD~JV3Wu+P>)Vw;gcLNZaI^%P4^kW7sN#xs~)_NVp>T2ApkABF)2 ze2=^OR5@1q#X?KXX1eP`cDlqboC^I|zu7!ewi!bn6$(NtBa@Qw=X^(Dt%5htq|~R~<>7fZl@30H zPiDGopqvm6-T@2VIYw5E*4oKjF#U0Fofj8c!!1_E*Tj~KKH{{vCD({J%c|Q!$D6<` z5Qe>n=sxYm>Wsd2XYErfSy@$}0T0lAVxk#zS65%Rf7O38mRvlE9>^i1Nhrr9ZH_Z0 z#hte{vY{&#e&el4gs=4`-*S}{>i$%{|<0!J>9H}OVvU;?nbXYQ|f zHz4@&GfKYY0}h<#=F7unX}J1X zNs~p~cGvR?;dsTR&C5-u#CTew7twQEB!3(XqM!VNZb={TS-OA7)b{9Y&%3FnG3oAIgUE2Hy7hDiht1DB>a8<)F&Wf z1;3inw2n_ljyRpoMnE-eykZFLOC9B-;Jc?yW!|)Z&B>F~smJ5z-b`x^u(v&212cKr z^8{Jni$ZuCHjEAUj?!rM&3Oba87D@fGLktmod%vN)v3Zk2ccI;a_WEvV=^e5^ zEQUzXR0~u!C>-im5)MFan@ZvhPqhlArBma$*L z4M=3)Z@l2h;$7uu3fNTETrGl}RMf!+|5B{|$GA#a;KdrH((1nXe*40%J|l)lCLhp6 zk2iH2r!=+{+zzi*)DeI%fFMh1$0>MZSdY^8FLHpoN5u>Sc2uEq5sEIsjVqn#FY&Q6 zpWXKuTG#@8nMBK$5 zyCME!^|#&lTnp3JFBdTPM1Wogv1F+Iq4Pxeb4{vLv3nj2wjPvi5!Ej9P>B2YfjMoqnp`4@Yy{6s!YGQaC5Mg-q2Rx1bgV* z%%01>siU*dMp)H(Z>hv{NtPQdr56PnYN)|rX)E(y(wOOIpLn8`z<$lo2K!>g*Rl`l< z5LdNT|NXF|tc;@GOyKPzaoF?TVJ&_IYs!obSQIg5;v?V-o|0rIYT061qaKfM*I#Or{~_K4;wf2P7qfYcY5rB>k;wy~A`^4<{OgPuifTh#D3FQT016 zUJC^^sh!bK4h37#B>|PLT7`MltemEQw2_>NZ@y!|Ls5fA$L6-~V@V0wK{X1e{}sqS zjl!-&mSrxZzX}sO{eIshrpEP0!(phsP3W927P)*dAQud91k#<9mG&dOaeT6e6kWw6 zNi!h3iKX<)IyF(SetIpUV(wN1;1Qa(=25=Elva|nU5XUj@yq+B=xwi5W;iflIs5hd zj_&CZuo!&3iau6~NIvV{sqn#VX)O?kryxHkzG0O-Ql7wpJlBl#9S+&`JPgA4@=x{Y zW?QyXtRdsmw?m5O)ZC}4%ZTn1fySF~e^#+c@f64Sv+Q?7x*{Ucc^cw1fSkT4(&5*7 z;)R&wa<3rzMGWx(_4eC<4(-fRaCha4PY5{GU&={2`HzLDNT( z$pm(JDTV<~RI~g{P;<%c-Y)S6Tq5-(yu#p@?BjItY+oZ^4&~AWT*0)md72gvfnXKo zZv|6*kzz6nyk(?nadmbh5SM1O^fG^lW2j(4ZOp<(u zXq8{_G@DkRy}{xD$8!s$Fe>jsSov)G#RG4!XPD8EySEeK!#El`I!!gtomyNh#{^%LEb&Hb)oPp~%<`LVbSt~> zYhjOIGn=iPBS8hu?;)TXu0D>A3Z%ixHXr`P!phs2g7yzFDg(4iB@|SLdQCvXSQMkW z@z)<&U9xT&#<&%{S)HpcOL!mAZ;+))9x1LGIIGRPSt zh#7Q_|7&&P_;0Hd$N#Z9DFAD|!D;^C6fls#&;-sezZ2)b2g_K1tfmkuz-|k$9H9RT zxGwN$9E=2#~J5=|L7VLLoZK_ zaUEj!s1X!b*KN_^#q(SF?z(fF*VxFS$W0$$uv5XY%bFtdJGM_Vrjzt1^F``v@5-qW znZ!4%yAwqV3+y)ju@f*w3hx%QsyWRze$DKo3-bx&m^?zWB8KviUi!|5LqIigpk%)7 zwhW+VqyCXIKBjgMBo^Gom7EH;;RJHUz%USFqBapL){qjE@iY5K%MEwH!$Hh_uK_n& z8<$2b3jCT+$r%CTC~ywpBqW)fQ`#*rgq)N9nm~OHxMOkV`*eH#D>kS~6uN9&2`Fsx ztIwQv4%ChJVc`3?<=}w`DZrHT9D&ke93<%n^%Q_ketWH5&fv?XkEXWD3wy1+4LWW6BHf4e^o52l8uS1s3gRj3K{P3 zPutZ9ssPYi+t%j!InRTH84>pH#6|3rMNGv;W~$b6u3?Sr=_R!D>zShycCB`E3UgC- z((|pIqZ{9UxlXqv5{i|2Tui?L_Wf`E5jk!19=&$ygM)&g%Ynd0>I*g@ezCFd(ygJI z#+HW87z^LrcVhAR_^8rqYH6f8(61e0V=h)76-O)0B0e!ie9RPYu4s5fAZCQ)eaCa8 z6k@XIKW71;IOZT6pBY37B{C(7{>V<&9wvCOSowF_7}+AecHY}7*OLGPclf0{;+ES$qqw^OYwj9aQzK?+!wR!c0TUvEU@=cXV7X>uxC}lqQ0{ z99`X&ZDW^{1Gypi<75PwR6j*zj|gt*hg*qE#&i^SQFqx_;Mc?XdxaSwFnL+;Go^5; zcJ}c6=F>Xg8n_|%A?SE$(8ZtlxjBPLG|vLt9cr=j-4iS)ls1jR+-v=!%k#?@JHNTu zYIEerPqzLgq7v;D@mcSz@4j!)ZLzgqUFfJQ@2Yvo$vC|~tDplcN7-}`0Xrv*xl&Sb z?)VsMceTPqn(`9Fm5k^^>y=axqDCF%n^0Vf!8sSdu_h~p6y@y%SEBVBrBF~|l9JM> zKS?u@Q)A##N?jx-!zbP(Qq;ld8qvFv!i~iS&`czC)!_75fEnv4ZE5bls-;z`{8SO| zFj!D3ESQD+M(GOR$cCk2kxXP{ZHzwe56iF~!IME@_$IB*9A`fIqEP@g@v?Ks0N$o@ zie-T(SCTwcqs6lG;JweeNEr1Up^U*&Q=ZPZy+B4=lwlJ2+; zJUVQC|BglLTl_~XFR!nWzKH*@xSz03&w`Cq8O97P{lM4XSP6r{n97F3TrxP#{x~K- z^7&16-k$Q#Q?HI<&eWxY=U&M}yw2@Bj#kc0TAKQ25Ws)7ee|4BH}T|6>c3o02F&vP zcO3|T;0PLY{W>tFo;)9{106#>BeY}}zn}XNDpLbw7T*O)jqS(<>tg!U-HQfD%zgRF z2T5;1#X9)34J{~LJP!q|iPC+rCNLSmzfSY}h{7_&GXRc% zy>7fBC|%21{F-8eR?mZ6bmCn7fJcLeX((*J@tj2rf6Kjc5>?Zum>cT^m0aJi4j?}$ z0*7E7SBbD?CK=NTZ~hAuQ@>atg4LcYE(nVPh7@9;x!O~+F@>*#AM1rz=PKt^}67>d1@{ zpgCL}ZL&C;s}lu1eDHS~7Dg+(B;ZJLzR;sbqCJ0w$ksJ2S$k&5WO}GL%i3%n_XoyvmkT{4pgh z6UiT~vq|TbBWHSF-%i3Bhz4*b?JGYntts@Y<0a3_@RpLY`|>&cp3|}w&GAJ9Mu;iiLf`Ylh3x=ypHc=7?3UFyo%Oyh*6mfN%DK^NlQ zbCHG(EK<78;5YHg)u4;Zlo`6QM>LNaB;N!n&YL{yjiGLT{TyIce*^ddRxh`Am?^}E zqPxeRUg1>-L(+%S=@I<4^Di@t-pp6gp^=45w_frU3_Ufy>}Y(mg|_eB_a@gj`sCkh z-Ga3+1X%_(@t_QPAF08+$m{YT_X&orL9Owvi(mLMTPD_Hmg#MW&xuRY(c$B*YW%;n z_wPTg5f2@lU~7o0o&aIZ3eEUD<6ha^iOj0W8WY|@KbgNx+7*Vx) zusU{LG&M~DnEN_0WfO3WH9CfV*(E3;3p=hWytQRb{Ka9hlSt@w)w@kF#-;~LZ{5E4 zg}2lGj2@JaZNS&JqR+dTp4A~i;WGBF+ZLo(2LrG4f!bUl_dk+H*wfY3J{3BqfX^F` zI6_-EBMBXr27rOD3umA#)2_U?F^KWfG2spnOSOPHF(;xb6*JP5M5jKRwKMhhr<<_% zW%@<5>FeNCK3+*G?erpp9Q)Ap5z^H|R=uMQ8r)JkUgK1dQ5@*kLfpL@+S>Cw!YXSp zLUON%{|D>Dch04eLk@hqV)H9J!ZS~N;wa4(2As%Rgs(wl!^9|1FFX82?=+Yp)1*cf z`k$7o3*r3=k-2azw@200Kevt)Ji{$M1kO1GuHHX_sbyUsKTR!t*SsF~ynGyemP1W) z!qe%&@kROLyYDCUD6#$DwO(fHRH;jd5dRuVvuMucTE)h6KC4Y>#Q@g>u2cKzR@GpZ zkMrv0lmJ%e3oM_?$s7WQ%SY$y?nB-D+6c6)Kpf$gz3+DoTiyFlmrP}-Sp+#kO*WpS z%2y*Li$d<>#U*Gg8L|X<`SJ*|)w28^p$|wN2)E05jm_mwk1oR+LREZl$bWZV?CajEjYUVsUiZIi$-NyqQB(d{kqWUai{+_-wgkHu=!x5#+TRM@?-8hCQH z@;r5Z9ePAuw%UlSpTAxSX&Pt(5sdXRO@8;2<>ijkC zG{H)UkL#AN8y2^BhC9WLDKi&IwKF5dxA-{8+n=r_(X#YM3hHW)oUM#yS>AIeRPm*L zS$H+>20E{nu>u=j)VYFj;l?EstLQD?0jm|$XtQ#TC(>LD?Tx62>sggBq8hHfFOUk` zGfA)K(|*&sZoYQJ+8#}b7EdX!kxpF0?0(?<-A;GI@P^+mnTMvb-})*ieuiROKxGKI z2+y*!a>fbx`#E>;VTV^81bOVvg#|iVEJF2iu3FsyAoS%1)_V>r@iVvf&;EtN8??9U4K0%_yjnLbD-PU z;h#EdgqYtF8{Rh%0d0?;pLxOj@;;CAy&uEbPiXIoGkwQ-p`SR-j@ZW+ zbumZuI}_|P;T^$$84#=u!pQ&PKUe;>^^f+Jd=!J4&W9EWrcQ;lMuj#GV*eejT7&gM zGjM_`1i_496x2TdOg0gKS`x(qkLUiBbP`HFfjC2!h5KAp=+2>~-i7erVf|^|c{fP5k~#)FG!lIHoPicy z_SzuSCXL9FGKUIOkmn77F7O2YR4M0BfqY^zK*Rx!EhvFm+_$3c;YtBws1jNpKenmqGxr;viqG}|Sg*hzv_f=Gfiyw2O zy`4mh;)6IoN~y+}v_h;=0?tg2blmu7p!tyPR3>f?DGDW;IC2jUKrakApaCS^5e+e& z+M=OTP{`2KAoDVg=4EOVE?tGr=UD&ZRP~7#vcRw1L|Zf`B3H--YE45TIV>lQtSU+> z83Qa;U7Nab5SjSl844+$@OqZ@kYC_XS4eGvGoba!!2qjH@Bel2{)ZR;x|9KX&LNQg zxpWf)zr0+HP#pha%YlSf|5F|Q|JZt`=t|UW;WoBy+qP}nw(XgUZQC{~wry9ORGd`o z)XiG^Kke@S-1|0L%gbytPh)(2^v;#;ED1W6?j`o^1F-b~qex#A1LFZ<|4*F@go7>p zl?fadu)MMz&3txU78xE;@>3AVxP=TI>RL#>X^BbQB zs{{qZvPUa!{*VfN0v0K$OMWC-aT@7--ys)Yp%#a&(iZ6Ly12QS7LOqG`u4}XChfco z`{4fls`obisNZ48q_9L51Q^23S!O0C2l0Fa0AF|iaIsc$?!(-#2BI*6M{&i8-iafo z*xW`;#WH|hN$_?mI9M|VG<1)( z(8yl0H=ek8%VQi{Bo-)XX6){;8P+_0juMYah(@dIe<4a_3x$4yQj&*B{GZ=8-D(gF zK7H987&)ED3rw4m?f(i*LYznRe%R%GiiHyEI>LBgyRHr0JNMPt4-3jR< zbT;9kPEarg5m0oU4S5&Wx~U`L7@qtdn2X+qkJBN67dJhCotx*c2A*yGNA(p=Lw`?q z0EBT!0ye!Un@vsK)TDOjVO}y&2bkyK^s9WW6ulP+Uq)v1ruWovd+vPQkEghe+P2xg z^2#xYt9sz>xiTJ(;Dzyt@(2VKY9=jM&Ks{^hOIgOBC>ADu|>=%eLU^%1D1%iFx zKxJ*MOUO7P7}$#}eV=uz@f}%(FhKJAfNpTsYz|7hQ(!+xq$1Q4&g~VMauuJDF!|uy zk1P3mOYiujzZjc>kT_{A3|6)`*})d1DPM?-yFMp1t4W{Pfjco=r)$JnX9I}D7{ng5 zv>;^E-yZd%jThRuA~+oQ85XpWf^3fj05kSI zBD7dk?|FKl+k#L#MBj4>J~?ogB6z4rr{cP&j zU37*!o#3?M_yvm=f?84Cd72hHT_s47fxAk0mG%G^{i~9!b6pCB3LHaiWda&ndTIhp zIvie$hl<1>gFzqNm&n>ftgK;WfU=ixsEOVZuJV8CTyQ@457yYk;=_b8MTzAGO^Vvs#oq1x0bM*S+32-r$F=>D>+UM*cthyL6&VWSKia6 zxVY3NdVK{{nd27n{LulxtmOo@h;?R;LW9Q2Q@yIYzcgKQKy|;TU$7DHV0yYk2%9)D zPTwQ0SQU#p$>C;0Jenhv*Y*N3%8QbuspQg+UUOEk9U3<`+*tft^L__4R0uT4H-y^T z$->qoJA1nU($dpa(N^^))5YZmxmQs?S=4Wjy3`+ZAOD|U%8fL1Ctw52o0TB&4423l zvw=6+)1f39CVxBj2ow%E9D-^m@uWdk(PW?eVaW#h_NasY>ruzoXf^)&_NXty!j`OG z`UwHCfhhtql~%Dnb(c{fp}dUT#C`tps2>|qs|Cp`N2a>Rj|XAP#}YMgmsT+y(-o?F zz>It@lAEQ@RKixP7A=`sM#33z@yO27s9r@eURcq^CI~q}Cl5j+QVTA|I1f zroefm2d0&#xQAq0PD#h^STuBP_^n?g2ct-7p#TP($^P-Ew+MQvA1A2&<590dt)gHL zfh`UZs{-m@9AUM!6>4l<<&=bsr zH)4)RfMUDg7;;pz@x-+_3QeN8(^N(nFC}~T-)$4?$pv8v@snzO%#tpZs9XD1+bn!*pt zai?74kLz{l**|mAI-J+VxZmUFD5@170y(@eS6eFUJQ0%C~9%s zBt4m=Vmi#pgh|vmJfYn87tXEzP|EfIWXE+p)IzH%FfA`>VJT{YjiOmBqZp9kq4kctIz8h^>>lJT9F6X9-(2;lR?f= z)<6cs8dOF(QN>?7mKPVOkWED$kiH3EY*T7pwxaSKSRkK-XN{{G`23;dOT zX)gN8idU@aeR@FG)*4=I{4fQe*3@ZA4Bq$Nruw4^AT(inRC{_YK6bmV%?vCVSTMCO z`g(phj;-5f+01y%NN#Fe-EYRX5IP69+c~g5SH&$zJJqgy8st~xSM@0Z05ZF_;d8%f1K+Xqz3l<8kIg%&c5{8BZA|$? zm*{Ske>Xyxv5eW@wQwRhpm_8EJ+T&mf!;QugaKT?pXQVckBZGm*C{M z4H(pa`|lUb|JeNWr&~PR*GntCrcdA>yjiGdhxy|+ReG^Xn$C}C0 zbvOTy%>$>Ikh5?w00JR}0$-p0>{kU9|7dQ|FF)q7D;JxPqm&s_5YjPp$l;_8a&vR? zLlJQ^O$DTVJKlg@*#(1F?&-x}T`*N0nOWX4W zOK~wcC6Vz<9aUtxX+PDZ-T06K4@kuHPNEXzHflVW$KqDX0rH_tnSjry#kTam-jD58 zL5Iza*VE!$UQT5~TG|u@KgM3vZ~j;9TA71pEG6EVh5$U>@D;2g43*d&rDCC&ShyO& z7y&mXMxlCy2R;t;?&=4fFHt97%{8iB2e?Iz{0ND=3*^bHWBRhS>B7f!)nIY^_s4A`L0rF1{C9+ zM2wVzg1c^{8!39Q@nl$8x;tU4Ek;;ahod%ocmx4Tnys!pbgB#ApQ*~W60pdn(2Bb; z?1E;}!wdI={b6zFEq?d@HFFF+Pu$hiIO{+jN&(R;9&fh*{k&~u`*?lpi52gOj;Q@% zhZ2v9j;_dg@1W53)*~Pqn*^`8GrMs&4+Mn4hB}^jYWG*B5K>ws9*+E%T_F zX>xMNMOhfQ*&|;0Kr}y%Q9uK4b|^7n#g&C6cdwENMr^xF(2qa{PNqfs>e@lYAw{xoPy+ z&36=pFSN?*J{po>r&;>-CEAv&{IIT%?(5hz-opWKya4%Uyz~Ntza!ul;_0X`_x?$3 zwa?3Q?!6qrP~Uf|ca<_;@2dOaN2_cW0WG3Kv13oQ_aKt4SI5<%Brk zasuX3eEf=;w~G8b_FG{3WQIDDeYKfJ`}>#Ke)Khg)yYFNttN`AW)H6!ZTJsn3p6MS z6${XC?SoQli7735iz*eC1`F19;Nd`ABvKiV?F4%dL@#i{+cm9aV;*vKP*q%CAK$0z zvZysx@yQy7{5^%O*f|>Q%Y8tqit8=lLN$%!Cv~wT!o7qG>>(&s%06!vxge> z26ixnhQ}`}BcdELvt|N^y8Wii1z{0;&xSI{ELXx{cQSF)#XMTew%+^6Th|UT-m9%F5Nzh3~ zXA*_pO&ACACQA>v%MDq&$%zrwl#MCoVAO;*6uKyO9Q)LyL}UI`l#3VR=(~++FCs`O ze5pz5hSyW*m+B{4MJnG^_jhN&%OIvBdS9dAtHdk)(|-F5Zc1>sZh;#k+*+gg zCUPa)4hiwuh3-Q0LLFcL2$_)yD8K26V}!BFs*{NE@b(z7OX*>_(vR0D7km35N8L`3 zc=jzmKSk0QR5AN=RbzgE`RhG0id8?|KTEF`<%iS7pGm-aN)GP|~ zH3AA8GsrJ?pua6h7ne}Y8D-p1EpX%Eh0M^ape90MWZrvrmF)Te84lG#vu5ddevAn) zQ{?Pv1_otpo)kHg@FSH3x5t zi@0*(s-<^^h4KuDh;&gU@A>>`Y!uYP!z(=aP6=$3De_4mgc);aX`*6b;z;-4muLtY zFC(B0WqTQPp_u^ywC*RkjoeCE+{p0E#s~MSX~Qa-`o^8R$04xL@ID zB%YJWx9stPpCEc9LkQP;=bPzG-!5wt<^ct>{WXrAl<)|E*pGGwb?MOpiY#HFt_(`k z3R0#0?YkU-ydZP_`uz2_^19V2i5ohSi?{aWu~t^A{}0rQlk%L}H{f2^`6L{x>bJH1qxJ|=ofXBx_S;z=vp=|;+zs~L<$9+t5i2s(&!{QbK z@lmqBHvwGGFM2D#DK@%xM#+u)Y1L}N&h5z0^$2_}(vAB9Ug6BURo`L)1R#KsdKu7* zDdZO#q(3wcB1^VC4(?5J*IsvQW8&&rAU_Z76_j+#d-z7N%NV1TiFdx_^dJzXn)YuA zxnX(7l~(_!u08|qzY`|OX=i$sd<(7Sx@+H1FM#liTw&mw>h(}l9A^ByUpxpd4~-uC z>-IbMUYX{q9~aV$rZ`C2*(d%-nZ1us!zVk!NmBH{C>YHY(0AuTOascwMwk|F5Qvb>Yh zbtzR`nRa{AOlpCngs(keYe?2JIH3+c!FTLfZ=WnieJ0}!V zIJyln8LxHs)brGnSZ^+Fl{9%joch?!jqF-8ThNmtn~aLE%ONRz$sP+J$^5)z zEKha@jYTEn@OWwxD*LT}bbkyE27#b$Yl2)(McoA(RR1G}=7Jw`iJ3vT1|K1k(j`VwT0coO4(2v*}J)Vx%gnsdFfM+5aubRF>H4v7dL&2z@t;Aci2-b z@>p~ayFI!K=$kn5Kx~)B@k2zh!-{!SJW+XLlVXv+eK$Nht|)BkLWKo;O&ga)Ai|cI zr^H_a4(U?_a~TH%TjV3U0DKJmCRFVR6L_`VzS-FfgXA=k$UlOq}P@mIXgA1ELa$3EB^10i2OP@p$U%c%@Y^ zV_!P38_JMJ5^Gj|$mx{eqt$x`Gd3=+;^O`3uR%}w272S*AGffX>#!$x83aGh<{EGB zPS#zn#_KHeyq`Ay`jsW$(Hhd;co>~?LqVTSS|6YD68gV&d*@RzRqr2)Yewp?IlItYFpfLDpR(OY#f`E`^jDDy^_CfrzL*}Z|8P-9*w_6 z;514$;zL0S|I)P_UH{Ovm?rg-F1~wV_3Vvy^xq=zW`IjcIh*H5;_M27!?c4%mUH!S zPr2_i3p%BvZTwM;8*U8?*rlx#nWY*2C%37Ti!OUhogstvUk2M{JwcqIR~N3w&yqxk z_lE~a*{WyxUdOAT@-{lgx4qJ9%Wn@jX!P}@ox$_DO-^rVv)#q~zWd`qr77s+eHFpF zMq`uP2cSKsG1U7Q5ja-bKfOZV4ypv$yLRPl8QaYxEAsvnUqiCP3_*up2Q8^Z*%+S3 zU6cfZnU^wuSolZ$n1}%~hJJ#)2#fFrtIc7zYZ!Gs-Bfx=)fVV}Wc&E^_0}xA*oa(BhX6uamJ*!XfkKo3DZ;_k} zC5389SPh}}Yvo<);g_R6xAuAGRGz{Iy7Ehc*AsYoEvBT;s+5~>Gl0`3Gn)J#ytX2; z9BazSU(2nX-=ue&*yJN+vHe6PHj|ak&o_P%N($3oCo7y%g|vu?qK+TqtnD>BpWF5wd4r5ObF7km$&aJAykbxUxC`oP=T9Sd2 z?RHxE_}9HFrc(~_R)EQkZKy&VvcXPmPU$tF`%`HC(++IryIg4*O#@@R&U%-{^B{3{ zMSLJt0S)@oc%`o#!e&bigbU2wJ^;}b0uwYlHfNaxM^a!f@;qON?+y6)i`0qk$WZNi z3>Sg6Jf#gmbt6SGGtBeJ;F3QWk+$?3uZ>;<3c%!c?B}p<3;#iiQ<6i$2#H)xRetL8 zFh{^_$RaM&d>Ld30@#>AZDkZ!d~d7Hd0qRHM~h)F(2vm}x}?}9i2JJnroj&Fk}X2{33W*d#? zg@>5ina{vQhU!ta*Ta1~E8wo|em*K2;2vZsNn3GNfpN|J+2E+0$TJttp{kjX?2R=O z_RjQcrfOCoW^w;|4E!-|{e|$&9o9CsH`a>UH|~;sGXQfFv#t$L!2}Sc%&=ff&s0>% zII?>YoWWvhgO|5tAj%X7-rU~w2F$;ck~$hZj@GMws-yaGgR=Iw!TLjWD53B3Ob#6?}_K~7JUIdBl3Bfh--{>puo z{VNdXMvzDqx&r82jjlegQGxR~gm&Rylh3cg`OnO+A#lc9fW+3GS~4Za*Z@<-=Y{e@ zRuH9_N!V^sffgJy`2fdcLwb1?H~>%Essr-nX#$#d_o2iCYNM2P?e2UxZqoO@>D-|D z6K4~D6>$ChlnDAr@kmCpMbv7QBnq`iX?0?NicDSW4kJQkyypYCb!IOa{B}B9uZmn% zh(NeieRy|q96yyK$ysLe-H)g%)b(c7>LWt*m1H&T21HZpzcc z&!>kU;`XERkOm)|mbfN2|Gr{@ySbPf+o!{UfD`_U;i9nr?f+40;Pl7O}=lOubraKXU!~P=>7s34J$%~VPi-C!S^E)HV$;!#V$<4ye`L9eI z_WN)DBNI>WwFLP{4`T*n0%2!MM@9sp1oMoStxWC;Org72iK|* z|6bilyF08X9y0MhZ77o!;ZYN#h*1`yL=q+(;4dUr2%(@zyO8BKDJ7AV;#Kw|_(}3~ zNP1SscU6xeftQJsbFZr?Rt;+=Got-cN$?p>Qurw0#OH{nmSP8=A+EHLn>9rtV{0!F zO-#vLRJ-$%9oPd7hMqvZ>p;IyV;gh%m}2eNt?lGFsYl;M**S4Z&i(Q3+8nH}HuVe{ zkkxGVFTb1KR}74th6qZXF2oAL#LvS1FK_*SbG+>TyZX%j5A6HDI9@hxuJpYEP(m

_~JYg7%P%87Y6>8#lj=&KfNisXbAX-aELoD8$g{ubyopKBS9K(^d~r((_C zt`q-R{*zx_T@WBZ6j%@#gS5J|wqYn+zoa^%Sby~Zs235>iKcD`-5qg{x$fvMIIb`4lio0Z%!p_G8COvwE#j}w^t;kX^;j4+$!8hm6tSpE}SjWx*Gu;26x}w>Tp$#C^ zp$+P;3a)1!yg7t-d(44oGdJ{WW&}MdfZA+Hm3*>ia^7T0)qEl0yTRPV4^Pqj-q-=C zZbZd?U@x@15M?Z43u|jhUnzv2t#vlm1|0{z$3M*Fze)w_%NzF%CiDS{+estQ7^@5! zhWhH>p5m`L8|J0WA(;x2$_8~Kc9RpcET`@|@MA1slir~rJuteHCvPM{nh`IwfJtvh z8{~TW5^P7SE$&Y%+ymv zNoa8g>_SqwMF2t5m6SC7)3*!?0H%VuLI>y49VsPtUJ_~NpfYjQj8z*hLC!3PFLqwDN;MX?MPB zR4+q5y!e>%ur9D2l3`Q{)9&5qvoH&6`IvG8yk^>7Ns%aWJkn^<%+hxaa5P=n@EWF4 z0RaqQn6D1-6Ok@fPnojU?DatFfg_`^T!pN#MrY_wB;_#OBeq%5^iMXa)VhSh5bBcy zGD<-y?xExy>c@t_R``}lfO9CVeH4tr^oy1l_VwWP8wP!hk+K};r2?_T%rT~Vn3^_0 zu}xIn3A#Ks1$3)}dVg;rjdOHVhC_+t+U02h-P$B0$~;`_A$s@z^zKhBWSl+bg#gV? z-`L2(eJlZ0&L zL)ClK^XO2X8`N^zJV`zz^P{i{fukVlARm->g_AI;hju0>gQPFI$Do z!yvKnceMBC5ZugXe;tRU)Kw}6_dE@l&gOAwrqJRys!RL0V=R$yWzD)C7}cvbHx-i$ zUswPR-HixbScp&$h^kYIUkZZOtZZ?{J@?97H&($JQu=+jL!c-TchH8tGVfvYps2H? zf_BCBb~T&8%1<+iZFY}6R#8|k{ixXVCqpER;JtaFKFNw9+G^>(X`VDB1glNAA7a1lYy~pCMAqp*>?Hu1SvKyaJ;gKW{f(CQZd7N-+2=Vsr-l3_4+1ttC1F} z@1E{a0R0V<$7(@Qp7E$k)^E}{KdzlA0e_;cWg{95su}i9lH_ z)Uu>!1EQfNmgbx>!R)g{_Hsg zu-5g7dG^_KF*C*45lI{7`Jk_b1j>}Th7Dmb>RC?bCukxJIm(Jx4O&rCiB?^0H>+n! zKbyW$mMs|nJtpor|9(C@ z;(6ay9&H@qDqL@oUi)w7LY~yVYp328_i-Ngyx)PNbhbObZ^+L0BFs6=W;Exz`qO%R+=fr6%>EsHTF)CO%q{li%cdNh-dNXv{4p>Uo+KeP zHZ?Qi6g3Z+ikg2Q{pGq4kkBLgo%8MUcz#-sglu0S?DZh_e*2Xl@QR}CP0?Wv*y~R`5(Kn7 z_Y)^2Yg6J5x$6ut9A`8QSk2Bt!n@~sWEqfGQZH}+lnQ&Drk%|atUp|TI>TK)e&t@hYAdf}(PSgYkhpMYlo|DFUdifXGh??Mz+6;lC64GgXd#&@ zJ+E5C*>pcgv9%A%Ms`;Kz=V#3#y04&Iv>cU_u8!!I$7bC9 zbhNcH-OSeTb8~$jzI~^~SS@^}udLRi4Ddx;Sjnu_7XO{&M_V_Wb$fxavZ8!pBF|sh z8d;-6E9XsFFW|sWC)j3b@i1&S3KOGWzJ@?Z!!`U$nI*yw>EY)DNYQ(B`G_s7YfOBb znRf2ntX)6Wc{m9)nW$jKYz{-wO~ZzJUEf*XSQXi1w%gzrV?rfqD1yfo*He-e(-npm z9+wdt?DU>hTFUbKyH66oe> zmwl*t`}^V<{E6%KN!j}Zt2Kx}!u^nncTwbvig-_1fbXpfpsMKr(%ool=zQ>A1a{^d zxf!eXf#9?yuNh#;G!hh`rqYDGLOXzi5`>~;VH)rcAOmGJ8fH9Xn-+nuneE35SYRCQ z$N9z0%F=*A9GE(f$lrjiLmadQToFitCFVt16YkKm5WE9{bS=t&xZ=b)TSZMDAQRsw z@2KJcZEzzF$dm~AYA)B^uh)Gh^2eVQ&gn|P6gNQgRtuMm6}pwD)pvqiy|A8(Fa zEeLB6RuHpK%h2ZZjWSPvi^9);`O}Yrza;M4AT*8m8^v{=BrDkBUWWCM>F?@v#tb!U zu{ji2B-DVwI(+$_>K>g?7;HpXOmcAKPmOe1raIaEle)qVQQ~45YuX+e`l~1pwI4>l z;WPQy~(_6a#F>>5nphpyFgT zE47%8@vSw{&QKVbztewXS!EcvTU8f<{hPC%PmNM!wDcZqxCaB1)yNoyq^>>C6$MyD zE5hIHow+=1mP@RGPP^t9W*wZkVEOkz3+pus0I4=XLno!rorbZmqu8mzF)j2^c>bl9 z76$7vLZlv-A#<{A`26=LFY9n3$nJTa`#O6jSdvrAAte(ZHiaFpD=6Q{YOmBX(;cHl za92$a@05Z%u9~`pI%eXweth5bXVe{ry?Wldt%)La2F$8Cj6mrgH~2-5LlxR4?3`CV zc5eOZTjQbbnD;IYn zIl2BvU(3$I@qamjbGf12(AE+k-?MaG=b$7OA1X?bo5R>O zLroJStpoc-aB-M5tRfiI2j8QZ;D&nj%n#CGAY_A~MljCvATZv#Hcaf>nYeoOG-Bdb zwm$kwh$NVCcJ;0F0apI@RdrSY0@Pa}pn%AP1RLf9G+iAAf^V)f;xeYZ+UoVz7GP~i zAJ?5}Z?@?+UCVAn+ky8nJAE~4-;H>O{s5f@#NLmp+qQWKO7lDe zodUp(c6OIm7ObTV|1b?gI`y_gB1325@b^E=K$Sn%Y<;YpdLKd!Dw56sT5UONF0Bk( zT__jdNoNu3FJ5dIUqKJSr4EoV);w!2WIjaqSVNYaKBIQv{j+@2t{6a8oD#Nq4|LN@)7qC94{w&;kV7yrkEgV`|tia;?$kW-_-*?;Nlpl=Gwd1 z1g4+^d1c5w+U6ASjPQo}}B@sHH3uM_(0P zj!BN8xpmz?b3y)A!bqaZuTB{@UfjeQy%j1&Lq4WG_bTN1{Xt_S z(tk39U!|s|(@NhCyo0OsjF`@lTn1(>wpm32 z)j>6ncKrT-Q**L~RnvSE_hgj5KXQoFt5lT=lTt!qw2PC_G*uUj+qhCblTS^DFtir( z%r8@Tc+=ed zA{XX>3?(~VUNz(-@kqY|rJy`1nJ}4bq5du2A{7@_Y-EvzR=zE!UfqCDGM$psgaxdt zS`l|qQ7mb=_`aqs(r|+4@w6ub7Fra*qmpW_oueK`TINH-`qB@q587luPanV433hmZ zEshd>1s-7en_FFJ@a2M{MM`+b9b(oBLC-5jnx2Uom*dTSofwX34xN2aoR)KNOrQVh zKC@pjUCMZxQl)g*#e4LHeyVRA$) zl+#Uixd;S0e~dtrZ@k~JHL?^XsnD&er0VHqw+FxL5y3;><0pJm>vcrJ|_!I6(U7Wepw|H|DY*8l)K&3w!IW-*`f>Q>*vB0 zL=} zCEy5xrH?=ou&j>K!hvFp5F!ZSss685qSnm37=Q zk+RM~fk})BKRSK?C{#yKQAsGU(5IB> z#8re!fJ&D`0yXq+xRJq5H7&W(3kPY#p)0tqz~cHRjVZ#Khp}GOC4`Nf!lGxuC^cLo zmPVaEX%y^5h14;Y?}hD^FxglrMggp1ROeJC1_L@$l6&N&%*b;{*Wde=p%Q=;=EJbY z!(o(>+@L-^r*>OQm>~;@gQ~BYngVX8tO+6xuBuY%x-|army}`)zX&33`~3HScZV%rE6@|Hro&$0Nc+$q=^gG^p@UMYavEtHm5po%|&08~d8~*I+~DxmUUB z=oOCo^e$_7Xw0UaPNyL*4}g?l0e*igkKdt|=^omuu1`&+*1V9+{CFeZ5Q`4}m<^B% ztP7|HE;W5CM9q&6zOK1*+JSepE~AHI0*i}vg|C=&+Vjga{&B)ihuC4Mo>Y%1B#DB|h?tiK_`&kb@t2~VNHC+KaSK&DdEyF)c3H9}Cv5Hh5xEC{vZ)41 zO3gRbLN1mp)mg_6oLoZ~WkAPD78b3YofSGe;E2*}=<7MIr#?po0Wm45jq#(Y**d{j z|MkFhq(=$6mJ~6Wy^m7X(11OQ8P*(2Vv4x}6I2a+sYNR`8w}8shg4ip9ghWWVgmkM z&XO5y5Hlns=1768VB?^YpZ=8D+SX1MDSW%TXNmmBap@3;%|E*ur%$nlMtisyPdgcp zZcaJe-UQ>aB5dr`nPv_TViK9hk~@g#EzguSX-5S0>B%)m!Q`rtXxB>O?GRYrFfs-bdq@U{V%@ z#{3-XA1o-~k(G%HK&*q~zTJbTaKibZLxzGK2S4zMTAG=Itr!kVlp+OuNL+DkZ-+g3 z7JsrTJy+(PE&1;q;!8O7$H;{v#t4{3&E~2QI=j-H143IB7rK4YC=k)(WYqJWoK$SW z*h9f!qM~6elVUREl!YB?_33K5t!}_d^$q69U&*|_N#Hc%0twjp zoZ&V_K$sGfdOa)eCEt%>v7Kq0$4OY2{C4txJcu#+Ba;xm;dV zo7#fOi9&2O@h_JQ&wMH-&l}2C?nKK}yZp9P2O)e**vElQ*++kwcFD~)7!w{~p*^u4 zHhyYK3BYECm|+^i#uRGCe?1*Em#$52^q+Pl0d_eU-c;eUMT%EYmf!6hV97*imLWbl zidV-=$|xwx$ZcDboOSevt&Z>!T&WHkm<)Dsqy8{BRrO-=MzndC)V2V@C*+?@C7>wH zd=(8Iu&Ag}mD;dGDZeVvE|4LW2jhfZ<<;uH{2JQjy&Z|wL==2u)GrtKnxUNBdKS2A z1^C+%_;eOKyo44D&O^U4vgO^po!Oc?NbI#cUBubzS6mz)rf)>+5l%Ww&RcU@vpJv+ zwR?%WhqMKD@B|5yT@yGrR)}?5wFcG`Sp-yrlT$TPAeH%Ex+aOa)n7Z-b^vx(s`ty! zZT>C{Op{NLm4CUobh>C^&(bS79F-N;0TLM7ko#Kf_d<>4%U!j#f{BR-(x;n>Hmt#_ z5x|Un+{GFK{j1QHrBSCQ9cU)xkEP9PFmNTR0{fs8gHwp1v8hy*3k@F?Fo$wpXTt0I znuTvDzzJtK9&0w5;&%TCJ&(#Gs0d9DD}c-iHUzl=oL{pc|GKWZ_L}Z~odiQ70z~vC z(JSzQ`A(xzY!BP5HEf&Y>lJ0(Hnnu^L(JJJP?sg-Fk)HJ7TO)4P0vkLmNTxUstRt6 zg+@+oeh2}Rq2~KE$mCQEz~f)E9*JA1Hr`dO$pw%)|t}c#5KRSIsR(* zZ;AXRTw{gUv8+Y+7tt76`AUo3y~Si>|cX&WgJPFXV2*?;vX223iiYMnM%|INqTt4CPwb* zDoD*CwQeLM3Z0^MXs~(;u~TPAC3-;yOxb&x&Q1c4M5)tc$^7tU!}}`1*@CcFrtzRE zG;P;XJF$o|E-r|lRxc?o01@tQC#xefXg+}e|5N3jl0rG4`0>>+N1SjsdiEap zZZ!ybF-Sw99JFW0jOijb#zGj(mRbEXxfD)AD)a|P)r#6VjV~l*b~fY$-((2jbb_+_ zrgQ)ICef3^k$uS&An4OvZV(T2m|GcTgoW5U`+AVPaV5*;0S_7j;uE1ue`ZTsnn1Br zx_s$k>5?K@{ixQ@eb~MgYg$@NvGvEfQm)ntXr@}k`E27aarVRbYKlFCX;L~KA zfpLt5>bl=JqXBR7s-P7^XSOuzg6&p=h8CTj;!LeezID^SX(Z-nNvsZhD0Fwr*#mCM zhG4EbxRqVNi6yG@ne~xPpfwZeDN>9C;`-H+e&>0_l!-+(>F=$fpIM`a0&#TA?T5lf zQC3)<8{<3ffUUOeW{>xut#tKzDx-bRuWQmU#=v}dVz7)@xT~0%Y-Vr}y&NEJn<8~gi)J&B z5)@|=^qkELz6Ep$5=P8=Je7MDG#Xq>wvAMzYt1OvfY;Xz*=oa{_QvoI%li(7vBUU| zlns$9PRP{zNlHfQwc^X2ZAhlLWD1-yb=t<~!V(NAL>=sG8&X<#XVf{;rkZ{ooabq; z5!F2l$3{5Y%=9w_#?AX2mb)A7--E<;isc^~f0t()^PTM}x88{Iqz%Og&Xh17V3r#8 zg5c_h0Q-=|L$(j+$=ef!5nF@jqR6X{nB;3SIf|-a{CZz8Bw3gg7qtgMe7i*)zo_Bf z4_d3Y3~FpU=D9L@e!7pXCISAA;0hY_dMSR+miiLza6~Wnc}-Ks%~CliPEkK%GWI#1 zCC`NdayeXuf9Gt7PxZ+h&xm`=zWBs&y9QHB0BSev+AdmS)NS269yyxn(U`GkEC{Ns zQ&D6w%a{F}n|Wf$TONW?C{x>@nkBHIxvarssh@kpcI1N@0f4!}Kh`Q$A9e$fi#H&Y z3QT$U+v)WITu=KS-fCf=r(<&_?M_0%Oo@#;_z3C3)$W^a7Ga8es8x;{Qf&EY@+(Uz zfX;|fzLi$zegsRMyZFak@7SXyRk1rl!{xhK?cdvt0zMHLA-HoYy;v?GtmB;67cFdg zONW`#5N+8j%{cLt)DzXnA!wWd6n7TQl1!lWc}DC%(slk?q@J-NQ5zURG^iA#Q^@*5 z%E}F<(rwgu%VKL7kbCoX7xjD7D=+?G0$8?YL=x9UaGA?0>k}>z_ z&hanWhMZi8%yHShsePd4#NYc`Lx5Z08DFQsgAT#!ifJ z_Vy4843(}JgQ-T>nF82Zu$Ennx!F+%f)sOCglO@ddGH*A$`4F~&|lULP2cj%-VaSN zEC!2SGJ?sdBI3P2Ix`6fVTAye-LO7|u&bi1ZbrM1+)48~qz~jC+!Xr-%RcgfQs{ic7Jagn+40kBxY{j%e(K;J4 z+KHc?RuK$G{Q>QUO<+CFLnS;G zgTTm^w&J-cMLoZf?Y=WDX8#o(bF=v+avJ)%h-26eY@-TMD>?O^wKI4Qy@rWHBiJ;( zmw@a?xJYL$!kyP%lNKo0k1lUPZe}C;4NnJzTU5huhu8Fku zr`=iCugd>gL)$R^&l)-q4x|>1<=@@sfA66=nA3&fLC8VBx1Q+>+aRq7%tXvAMBh3) z2CnZre(rQ-eNa}Mf9NL;b_Qlv4o;Tu&)>Wg2O9%78#5bodO-}B!avzHx^$RWF#YuH zelTc!B6dzL24)s^{cjXUOq1w)o%+u=`e)%C;4 znVpx0sx+-09znp_0-YarOO%KZY2UlTG})Ai20Ly3-0Cw4>hyL`G}MV2JaY|rKUd+QexzUF?%ypk_?CBQ`qASMKj9_f3c%#JjV-vH z2i3rBR~CHd*ODb1fwf6bX#@UxumsL0OdFS}XP{$8-)bQj%UdY;AS58CXN5=o9_p5|ugwIqZ zl@A3yODQc@d~=F}yZfbOt?0o}7NLn6io`0#Y(6%$kZjnJ%S_6zE+x=}R=QejQ65>@ z!P&jQpmv3X^fan6y|XfCYOqE2>HZbH0?3HI`GLfLqT2Wa(4bvl_wVWr!u^lDkQ-RT z2?hxihykbK=lFjDZA4$c_t(Gm-~R7^7^(j`ezUQ#{i87?1aNV){ns}QNt&=eXbY{M zlN}G8ysw)z@tG5`;4(~P39-TIgJkVwBDfOJ?wn8gni5P3am)T{i8zfg3`U}zDuR`H zvdp5H3esSKNmil_+oG^bR@D!SONICE$F{#y*DuHIgoUd+o6X(KCZ8v{w;nS;AGyp? z07T!mgMS$0=C?K$*z8?gb_FLQUR`L^QY?Up5d*h_v>oqxMqDkAk!=|JA1;#kfz{7; zR^7O3`rlHrI`|gW!2DuC=)7z6JKiF!)qh+S+X{fxAb@b`{k@QK)k3Ti%v$_$mc0@M zK2#mT;y-=9oHg5Nw&DKban!iH7<+U`3s|g@s8p}Q5%S|A%+gPIkwfGj(*U7RHPmin zX)L1k@i?@v$?Unt^;&$W!qtSJ1^LsR`_8|0aZ>vF>^9FC`GO2vv+nohVg2?drza#u zc55d8N9v|D)zBvJKc;Uz>dux%gn48-VUfq)$8qh{VDSC0h8XMZM`g=jL>PcxD4{1v zrNEl3ttrCn;V|oOgf?JUxlhsFCqG{LH8-m-u%8vWP4{D7@+H3i4Vzrr|5P7OUBYNV z{s6lOx$MKQ0psY4>W8rW=K3-FV3KF+Xg!t}GO^Wi7hePs1%JC&`_i`hdm+u!`Di># zRacd}KF>vLM0Dd2C`yHubfGp*B=N8Z zk48ATVeh_+J+^;ZgzSN*2Un zovE{AnyCjDq=u_zt1(wJ${%EM!e^wCQd+AS1eb!ZLRZC>d@_&0Ak}};H)G-C<(Pk% zcpAk}!m42Q*NF(12Fb1fx7s-** zhf~q-a2aLF4VhABT}Tv%ioGO{#ZwhSojftWxAyW1-cBVQp;=voQ@v41@hB zyHAn(+);XgT++BASc~1QDxR(Do6sN4J<6P|X==+E3$D)$PhTuC5D2>%6?#(KQA&y- zp1SVx_MgLo!a2Br2$tv?uH4dl4Mk~X5K)hB!zW=oe>Cjljt{K{(8;kij>`UCMOD=lWx-Fx z2NLqeL}fsmFXw<+9s1NK8vLRC)v+>}~Fizm#;r0R_uG$*1*vW}z8ht4p_C@&j|eO6dA zNuZ4(xq49ph}}mdTeWBBL%z3hz{CVNVZediR#alhTSS4u8U|9i#c)uiXmwEW5$M=< z%@9~~WGroPtkAgK-lf){o87^4iIo#{UIA7Th&pR3!?nx5X)%b4=*$m z!`GKnleJNuBWF_NIYK!VGzlz7WPe*1V;WnP<0p;)4n>1#R@PUuxQKS;nmiqi2!E!u zMX&B}qn%0P#X8I}mHeYLw3TQO;%+qPvx!6`Q~-I2)SD#2I!FHr4wvScC}uE#l#m;a zEd&utgpPH#!@_@ZY=K~T2v<3kgKdgLWm1-;K2avx$cjM0CqZRNsD!ZFIw-td?6ym^ zBa{JHFp3S6*vb)wHy69xfo9L&Ic##yTU$jHXatjE&7vwv#&7{DaN^)LC#B4PE!{6B z?ro%!LGYj!IB&>N!?)8iH+(80HP&jaO{2dRv?`R zOQy)fik~eo-f4IuZd5@@kkayT=OG!~ZL$MEK&6O@^@Oy0?*lq9dR}Tzq4b^c2?5Bw zda#r2ZIa!Notdpzb4z-(Da41)9Fv<9U87y2t*tnFT7UQ_-!TQEJ{k0aKxyZ{`wkX< zHy_l$vyi;Z;MCjMqI)i~o&=gnAD%f?Yao~yY@9B6^;DvvPEL8qV6RA2Zi3R&KU8 zcvF>(h$#sK@_@eA{}hA2d1h6aG60+!W1J2uhA}f3Xvfgy_N7Dy$)@g95?Mo}dis{# zH}1ESy_+^#)9V&K%cfSHe|6lAVD9(FQQj%-dtDB%?Q=ZA*&r#|g8FY58m1>Cf15{B zEJ`#seU>St+kX7+q}SW&TyCzbqg^>)S@nD1gduuKp#hFShw|pCPi27;CJ=y6gyiCt zo*?HKi61PcNps}v3ZykXy6%2yyH;8*=CIBC0|$Fe0)Rf>4YpzjI#-CncdG;*xjFJpa?$$e0?70 z0IzWLp>?fxiMB%gV}J!owZ!Pzp3{0K*m$*a0~SvVGFiGL`GBAkg%K`iML1s_m7*K+ zyu^tLDn=?2on}8Jfc@pS*6380uOdJgX7-NiN23}0+1S3%-y}Mt0ZSLu-?sb9wKIK4y&o{7Kvw76xz_Ow5qk&pfyx)0z zLQ?d@rQ>g9LT;hqq22vf##{UM$^7*FZNt;F2{x~;KnA@X&O_G-lriun`Q0_#FL2HP zAK~nex|=QLn1EIhv=jRdyKDFX(-;BPGi`wytG=%aI8aM^#CF5cC(T zMaf|VZUbD}AezzcpBypC`X{yMpkqW$I2KpYVu&g0tX0PVGD9oeq+ZG@0|(eg-JDM2|q-E z0VdRV22w}3weL8;`~La7=%?&M_~^;%9YT5BdhC479A97aHKAeNu~R7oyd0L1GSama z6ODGYKW@GPWGXqZS>u&|`6IGkn`CcXm|~%h)qnV-|LlzbG2h*jtR5MdwNS8tHfi>c zlmbLRu`-7nnT(+)p&KPqh>5@~7!yoS-3dJ6NxqN0>Fk1jEFozD1yD9qy(Z`d>m_MkwAW?;mG{ifv4Lw9!-*Z^nokGwVef`}sx*EQuQ zLkVAdLemLe4FTONS}*mkL($CLZTH?`asWhu-+H{2m1UlP89!`W0uO^XN_wO|=+`}U zh|28}`;kf7@QXqVf*g_Cc2W15d1V-2ceB+%_Sg61>W?y>_|TcgV$px6s(i!PL7xc8Uql zS0>N!TK00od?x7erSDpWpC2AVUM%08(-K#j5xWvUKV}~F_&&r2f7lRP(fkQ1n=-7` zsEk}QcINImf%;fy*eT6&I2i{(UZyCGlSb7C-XApMU35=aXSD;{$Ghh4SAX`&JHa#h zTH{M;Mqzhj7Rm&qo#HwJWLm^4&n_M486CwuU|qBv+2A3J~Sepx6~fq7ef(dzUOOKe@p`ICV8_uqtMQe zW6m?Y6s^=}w|93vRnc!RMes>U37Nc~xU}+h;D7(f9x%JE(V?=q zkJx;cET(CbL6T3a8%%TY`9l%&DzqY#W^76wHjK_La=o_#%1JY*ypHnqVnyNe;Qeuk zcbM-TIJU?u!^yQ?klG6HH9U)XiRxRb)Q}}TK)zeG+PiE!utK;_J98^vIze2Qt z#-2f`iOOPQN}ruOe{xRX-9vC8#o@PY86n4_6FBRpH&OI!x(LbF>2qMGXi<*zayz~d zmCpJxf>#_5%PclQwF2o`w$=}uGWItNgn8`^&v9m3#1Y#%ak2(59mMuw@)k$@e%MDQ zRZx7FKGO8_#qoXMrwldfJR@lgTsF2}D&FjAoIubF5fMOuKUGtw2Qn}N46kK@_mA0l z3A?FruROU2y1hS7k~*;qb_jY)70#ct*Mb#mw}!4}`D_e;)h#(J%_(4(3se2>eQrzT zBfa&b!o>jiit!3yeH1#>p6+n$ye21`%UyVjedrR;94B*MUuZyB z*XjoebK6C}jr@X&oE*SMagPm?M!7G|Ia8CAR<+J6Ng@ z4o=6$@QCt>11mRX1S7M7|(zPq-xR2n=@gG*&n) zQDzNnmdPQ~>~)%B_J#7UitQ9Oi#e6PmPWC$yz$L88!(Lt=?!&@!4$G`9G00H$drhX zIUFl%+A0kd?i(*8T8rrSRkS$zk!BXyM%MyfAi(?ooMQiT0{zS z|6hmslF@!mvH#wrW&_hMz>$Eh7vPjYJ9AJxpjh$OM}$joSfB{1f_uA=gPd9;rC2UYcIQ)A;cEzgGV5m5rlsp!7ML)Dz*YmsGRnNd? zf~mG{pYQ2v#?z5@Yr%@A4;6MZ1GIP|8llKFJT z6xnB$PesCmf*%`?LyaLpLNfXbrGQLKs#Hq2R)xq^r5<5ss?z!6XwUE!d+tvt9@_kY zgiD?oJONA{9n3n*4XG7R0S)#D7sQCN6EKdi@KVBg{U!xLGAo{s(N1q<;{mtXam$>n zdh+>tJF}5>L&3T2d%3Q>lI zbNqTz1W`ciz(Gl-^Lydx#+T_&mR;l#&rxO!_n|D|B8$;2*R@Qr?(gnu(Tf%?nlu~u zD~)k)SRdcZf`6TJ`}%Z$XkYkVem#6$bY5;gq7r>WLJaB=KH6P;%Uc7q(_#|?ug-NE zyUGb0gmG$i)i&BhWrn5wpoe6+{EC_Z_b;D#9!9j$)u6|W6&E+5wbyc%4jL87cV zo>hTbx5YC0LlO(f=c)=45CgR4Le?JRsdxmp7|;SD1#V?|bfEsYgUTqp%ayA_RXVEf zE`(7qlp)IKDCi6R($)3qB>U807DHs^F_@E6b$tby=F^?@%n4xqDfL)D&JCW< zzKLSaf^)}{WsD8lnkUQy29r(=)5}0j-m@LV=#71_z+()qW)jkV}k<>`(pTTM3l)7$Q@4YjDH(O_S#Zgw5#5w8B!+ zQ+WUQ_X@A<%7N)_NGUsWDV#re?02m5kn5E#Dkv1jsko>{=#f%a<>vM2Ig&jV4!`Gf zXso0fUnIA+s|BMs!7hm{3zF4oBReJ9lxmG^UMr$pbcl~6l>xw{5DIauQg>0?2IHxG zieynp^}pGPxB2`{kFCNI0b0I-TBsYAq0OQ^Oz$G(RguQ!kU^4W##POP_a?<#B#@Ar zITr}{pM(}M#baf1)h<5w$=*aszffeq~S?d5}z112&j!P`)_S^rPja6VUI6y?j#a3<}IXM^|!0z^@%lsQc z4CcmBRGkvXMz+yRhFt$d9Z%^X(X~_~fW6YtR?;SQw?v5vXGo3u8RT3iJOKK>0WhB! zWHGAyIOgjd7d4Of1EDJ%mUJNRm75SPNJsWNZ}~K7XMjXYySn75i~An-IeMR6%q}o4 zm@dTI1aOj9GI0iLHxXwtQJoz8vr?&~mEY&5%rRA9{2mL~Qe51h3o2|EwSibmq`t`X zB*#2>5F;dBr30S|bl)NneOw&zASKG`493uKTnh7iEU6}}=kbt{`GA($K`z(=0n$SW5$>bN2fi1Km z@BEV)Iuzwlv+NXIppP+|tY!(t6_J;dU{Wc#^ZHy;`Mkwmso}ZnahqfV7PCa|A~ZR} z05qtSUhy|q_fPmh?ce{0B8K-ByGl?C7d4Hh$PG|_Nyr4-PV?xB>qtg$bFN6(KD9D5K*I&u1 zH$W);@<%i_K%vhGM-aCfhdiejE`bTOTr8Dp9K&>f0qZ$H2o7`LiPGE|npMOw2uFsN zR8aMh^V%zI=jV~}5%>KIxWAh)eMEV0eaT8s1uU1c@XlW*eCf9x)94z~*jQ2E1e zyQI5OQ2!uE|&gKvWH7e$Qd{Y4RvRJW5hjm-m;SRiwLo$v9@ zW0}!0$;$XAZB}>Pl?a zbn=YPEQ*YL^U-!x~EMr^2jlv=#@FdEHk&LOqWfn7##=i7o=CTQ*Ja_QcoZ#!dz*^V=7~Ro&^&bp=nHc~iZmF`kY>mN3?Xc{Vv5!+FDA z9E5WPB(q~<`?cs8prEITU^B8fui@*cK^%bF(z7R}=ja%*E)+9|)HJ9r@zBDx{C(>C zvs1)2hdaRG!S_r2cR~KrAG|W7lbx^W7s-YfuJ`tss_KAzFLsd&5^DjHu`GRGc58-F zrif6*nI@7~$)9mjS}spn$H+0{{5 z@ml@d-ysIX^D7Ec^o!SEL`b8O{gFBWF%I;KgG+G3Uy%r1xUED;PS$D`pK41ZWq-+d26fEselHvlsgqepfjw@niQEBJecY5E7YUcbcsnWuxNoUE_mg7&h*Z$&&Zj6h*0dRoeJn5n6ttdz zp!U+H4}mu?NyUGubs}!2_L_uI3VwEOS##o!%XoPyDTzh&5~Z34o7AVeb5#hf7#hz$ zHRJ%sd5IP4wdZ}S>a#jKpg99qC*pS%br`e4VEE9K+I~p$Vu8*KC5S+6;H~jaO+P*9 z3J82O*8;OUA2Gk`Mjw~vC#~9-t+%<2?tH80IKGF&b7HzXtP}S4Zzqk8nE87x4zE@C z{3W;OsKDjNR**#FCIRN&yrp(JxV`;7D-*yb`- z8EU{d(U1FETEva#?K5tmndwYPi8B7WS0X#ER4-!C$4N_KA_Qy;sE|S3Jqaapbh%6x z|JngfLIG|9eF`!?k94h{odib&Rv_ShbJwOwZ*ua%i&nU9>2SClh<`D1p7Zy%HjJ2M zOI0q6(|sKcHbJ=*j_~>49--kL4+F4NFoZ2!~uWzab?DmHSWCQ3|8fqJD zE$6O;s`e;7bJL@{CU3A?lLTI`zxwCbzWm-wcw@dFO*WUk6I0z31~la*w)!fHH7T|_ zU2f+$oYT!r){aoF2zQkz02T^(;DQAQR-{;QQvF&h&War?2=ngus{teR@tlX7(rHzh z80sjxz&HGFw`uOzGR2I&s&XIz=>E_Z$KW}vo;JlB> zlfV z&L_$ z@lumT>|Q8OaWJm6sqw!`HpM=Uhcd5Zx_k67%9q-+GoEe@!`W{69p612=?sBIjb&*x z+|An$)>EDJ)H7LfCj!=lZV9v|OT*JGb|C%%R%!maw97WHy4HzCH8li%0jt;i&Cl~+ zz-o7Q-uLPCmxpqs-``_Mmbg+t>faDDSI$C%gH4KS#oSgaY@%#Be_&Y({W#nkM)`?B z0A3UfNm-nErrqs4M1Sgbp)quG0^z!Qq`xVv^!+!yGS}Pq96%l(QQ$f8rS#;ifCWV&#&4xAKZ`6m2@HAtNi3#zPH zt|Z9w9o-1FG9*upt^*Sf#!poebUf986S>DVo0FAlr(OH!OLc|{&*yhp-*I~F$vZBB zmaWpsxrI*)4S=uo`x*CrIdr@ICCJoFc6>5rcBE$bMriyh(HtX_+k_aXt0U|bX-%F4 zRg9+@9U(^Rvb{!VBmKCWX)@nai`PSp=i)B1T~Eo!=H2kcwR&qbCJ!W0G9dzSj7-T@ z@n16op3n-mus&Eb@igv<#9gWHqYSv#FryW>+TWkGC;<68sRRu6YTu(qlvi5jF~>+s z;MHmR2wv_+qkrZ$xu=IYFEw7S>OBm(Z+bWm#6#h_F|N5UMYk60Oe@BCxT;y2i|MsC zy9_j$A_@?E=niJIoju=5sjZ70Oo)4qJwZlt!@iZ81udk-8n7@03OTgNxRvu$X^*SX zBC@kRS^;)ntlh&bSVrh*qzi76p_L>duE}S46Z=MNtWUQ1-rkfE3E;9x4o=El zj|vfehhkVSbUT4nK71e7QLv?OuQM^%c0t9(!`c1NfqgrXtXL@LVzhljx7X}TH$Ns! z(dX{j=-1{_id#9{mS=3VcV+_Ss^f&cA|!UeegjrF{X(A4pT6;n$h<8ZBfa}E!9@{* zGr>otE}Rz;pZ_-U`tEFg+$?-n-+TS|nHKRlmVEi>zI>_wgk57>H|08~{kQqI-{n@A zv+wk^uZPoR;KQRC1B9BzdANo*;_;IdSC37eCYe?ZK=6|QFUR4cx(1Xq>Opq!2PD*T zwIKka9sdToS%1z0iv$b(PmeKMtO5P`iI*@Vd41qu>HS`g+LGkFf8EoIXDt12iHGyVFM&L zkv8X7&+4NaoCuDSNSm9Dg@KEcnTZ>iy9r7R%#r|w0V?!>!vO;t!Tf;Z%V4NLZP~A} z@MIZ`0Kom<>c#&U27;Ns3peY0VO!^d zB-wvFQ|`$qEC976VSC%LJ%ccKzM{~U8SvsQ#*FB^qC{lPxX+w~S`(n=cF7~V3gvbt zq98~sc2m{EHT5s ze`OLqowAeSQ+_p=%vFhC$~&G=7mf#8nNgC=*2#{AD{XBoiodNbe4uiTxUHa?9_{-U zX_LUH{YareD`@j%1CNs7LO!1WHi!r(VGyuD;YJb?hZ*5g zFKc`4+J+Jf--eKk^~S03{Q$4?>{s8%Fz=&``o~r8>c$7J^F}EDZ~n+?-(cZY8&g-t z+%^Ch#7ozfDS+0TT8KnpirwGotp&178_3nR8a1EX{x8!RgNqmr z{?IuaL3@YXx0jjkebaM{pjhL}8>@WfwUX{O6ua~Kz1JOP;8>d~@=#bJM~HTM(+_*H z*{KA*AL-wGdf!A@aZfQ9ZAE-CzuD{t4iYxkSVkfgI{~=#HI`cpl3ztO?P~KJ>U>T@^j2pI}_d&v^3|MSZRaO1jdoK_>`^s)1kZ zkunNo@~^hB@}<(?Y;7`Aa$P{YNYUWV&Fi4sX8h`8UDD!kx{V(zhCn=fwrY~Hio;D| z#V4n+XvjQ}4Xn|dCCnfd&soiPM10MI*nuKAZvd2Z5)II(JbfEF!Ytyay>#g?^QQs9 zATl->6u%ag+72C%@TmA{B8k!`%QG;$SRXFu2U}L(xYVw!)PB0i0OrJCDv2X0(cFZ2 zc^D(_pQTtR1u=;a_)_W8syvWq9(*mrI}uK_PlY}4hc(?Go@DrrZ78)S$#x!)F2}ny z*nlv4%U{d0LZOkQQbE|egbTg?gMuTwa_>>HO7{gh-Sg+y!J+0V5@NL~*nubzh5bMY zD~LiSU>(9~aCBtC&V8m?%1msPJxV%GF$8%N@=~ZKfU85Ru0Z(eq~A$i(}^D0tJlFC6S z2`ETuxX6J3(Y)fG^V+-d(vK!X!P*=Lg+By{=zVQ+gyTKY4Ms{#vzP{H zbAsY>gJO8DE+(Qj1?HYXzuGD*;6uq73iBlI^81(ArD)A^Tqp7)kSF4=rJKd!wCRNn z%_LH3iPX_$ogpNXB82~_`eNp6Op_bd&ocXAKl|*9ftF&FD^QW(L<}*$;N}6O)Ao=9 z`~w-}W3c}0=j_uCgjO?`F$0E%WdJ%e%l?HcR(x}(VeJ6i=!6kUoH zX|l*aGpb5O`q#9*gmzR>HG+=e34!9hYwuyvc)jn^jQfHmiE?hqIZ1^teZ561N=iZP z-{0+;kX*dU^r6}DP=e}(=g$;`e|~POMUoaQkM0|oR%&pU{?I@&C1VksaRg9*tWEzC zatDXU$tjSWffgE^2zAKA1`+;-Yjlm}BYlDf|HBNe1+*|!n@ z74z^)tg7ftLmgwdXNh^8nApxwEMEXOW#FLk3uO=;hi3j}87Y(+Z#u^}Igyr#X3WFt zPFNv>Jhb0T=tdRl?`DYy8Z|&XBzKsvtbF9%%Qra02ow=vh({$wiD+X(y+tW?_VRD? z7KaWpF2*06+By!IxZjGw{u$~Lg0jo%29C6~{yYu8YSo$YrD+lHFRq?TSUF?zB>E$Y zYBX^1^2Y}~>c%@0XX}K?OEYx%_`rT@JBCRt%A8!qu{YlL=6fi>T2la^5Ltq$EvXP( z;Rb8B6+sZ;Ax0IbAZDWldC`>N-PlHb9u*0DU`!L0zexeiC_x~K!h4~|&rC>|oP!n0 zgomNvq8;Lp^=&x9m}J45gafDx!AgdGc#`Dz=3ee1103CvV0eDT8mBB-e1B7thwI-6 zD7Qj$pwyhny>BIDRoe!@=?C|*yLJ|wo&>YxHWqSlF`kjelDRts*ZO9yN9 z%;!MqDq%Sc;&T8**wO#wpl|?~@W=;uYpcM(O4{3dgNwaqITr!nYcxt@jQQb?x=T?m ztQ%9-KcntNwXjJOD(A_!6t;}!ma)$aqjw@&$7tHiG)jq8!%pmdAiGgciP@_WN(lSC z^ysZ`x~sRAKKG>TY47xYqHOB6+zg)(rVje#&WJhfvbJiT9zQC*qyz2jF53z=3R44g z>3IMJOb#%&F8F}MUAmIqYtW%GtY}p*6Ekx!$s*3VboSZ9T92D+?g6!RuiVtuX6we2 z;cf~xXZ1L%D4&e$Z7VRiyT1!Ld;Y9xyR#Y?5fOB1N*Wf|T2wIg>|0~32<;2xMJ(*R z9OqtlwG*dVo<6(@q7D0Rx5fKsQ})B2ln-%B$9jV#YQ6wC+Tx!b25f&d7%BzSjLhbZ zve-GpByV{tBmIVo%olC_&SrGcD&OQi=dH4+EK7;7|W0oXB}87YeG@U^+Dd>nI|P4vRI^jUr=h`5`IJ9d{#tUiE( zWki@_Tig89ByAKS8*kUWY*zOCum+tpCQ)gnC^+#a{?VR#bpK5bIHQKnlID%&|Ad9Q zx%OPM?@@2RXEEaI`)s7I)0tK$ZlL+-dJ%X+$3+ZSFgK5KtBi9U(9R_>IoN%QP{^nR z#!Ig-N<#j|?pS$7&_nBqH^x7ka4S__nfW5He(hwh>217p`3P^e0?~9^+qye+50dng zt4BWRvnM}egzG}b-$_%~xjp9)OW?D5*9?%{BhzwU*_^caz$-bD422~IoCd!WPp+D0 z^REKJa{G6C(@U`V@&;&$5S|I1k)P$9;^*TE!(tbq^mU0yB{`gBH%Y2h@Z$)R0dgpk zHxn4~1chVlq`LGP#6z5d#Y)#=+r4H>j;O*s_||K@(aNQxlBLmfnXs}ykP~R z`+*+yw@%JVbKjTf^b@Nuw!|-tA>9XTU-tmGjG3O{bDtjxRmx?gx)-v%gliJEh6GaS zLY9bPZ5JZAW$c?pyGly;;T3a#tDw2L)wGd~yh9Kq*hrqKbQLAWWFr;ug=WQKb;{fl zyHmz_&%*nYB)G&r#^9e9UtYG@F4qJe;$-a!Vi~(`g)esWD>k)itj-sXhRc-IrQ86; zW)(J>%NhyF*DsTu)#~~Lx||Lp&Aib0LrBsT zN1%PN@bheKPrqK^ZlAvTWVq5>fA!<*P;gUw%)O)TTGkDH;qmU`^o+YI>juQME73$& z$H+)HP_?h90EL2~mae})x13uhAhxdp2MM|~e`4Cp8hkU!(+{0lP{o14LT3tvv5I_kCy;oA5fZSvd=LQ}w>qykt<(9F6^LaVop!mUdt=4`n`aI?{qW}eUF;Z96Jr?-k`JR=3G+9SKf zrpQo9g^LU4KhssdU?>GSJBV)2C)c=!Iu&YmE z*+lPLsFVJ){f$_$)BQsXDCFuQKjhp?neA~bNy_ThnF&X1#b*tG-IoUlJkFn@auj&nBSqiav@;K$Ab;#)v*vWiM)Z{|yIxN$P)}!#jZ24otZ6*^; z34;ZW2)KiZA)%?EXh|WVDVe0B!gB5^F8nmnQ{xQ=K9cHQz8Rb+un4XsiU=cYW$QD+ z1X&qS{5+J5`r+lzwZ~FMA8~T=p19}xhudPU74=}Oo4kP3q#yRe@6`xhblsGn2hB@r z4e+#g&!-n1H>+sfHY;@>yQv}C@>{NecQ9MPr_=Sj&hxs*byZy^B|C&`-&`}F)Bb@u z2fHnfLHQ)UvVhDw>*qA>LpoAg)7fM!;0JG!>&Sieg*d+?R*dw_WajogIo3T+6h?+t zG3{naqZXi5aM)_m(C#P)q>-v=DP?I+!ZaMKhWzAuhH2nO<6Xc}mYx05aUDW)CU@W4 z%T8Fd{)HDrr?-W!(84_Mvz`_>IH_wvRj+!P-y}oyLMIVU+Hb>LGWHX4P^82(<1#&T znl$x1AtILg{5%XM6ds%1YPbfpDg%ywe1ev0cIN|Co$w4K*_T!ca1{PMXfD~$)B5Rm9((W`idQvV_tfRM(TtU5!e%kGOV;w;_3)&; z_I*l$qa)M3^MPk!xpoX@Ly|bef^2bIFwN^%F?JF>oRtEi#5DIz_C!UiKGIpbVs2iF z4vtRF&|+!8RII@3)3v~7@UcLbluWbSnJ3_3rPCYmV8fe00$}LIrxZv(ztdv))Y)LBPim`cweb2}`)N`<+pohMw%&JZFq8LOl^tGrzt(3m`2}G0 zT=(Ygyno7wb3sq{+8TFqO{Y(#D#t4bo)m zffOS*^+>0r!wR06uEiqk_U!bcExWe5`couzzlX^tiNT>JlBC|)BV4SJCzYnGNJb>5 zG*7j)eBikK=(EMIhy$NeOVX6;VjqCbY4%iieZ$GsKGY)PYOAg33@@YW8UA~H81T)* zV{TA=G5*f>{Nwzm*!<#iQ8aBuy8iQ3^vyyc>Y#Zf?J&JJny1W3*W{TZgaU3#Qrfwj zZN}oL(=|ipgbgh$wy#+N4k)p!iYD0Py>#f+`uJqNc^nlP5_9t}5BwC^-2lL(2CLQX zhI80Rx7W>xAQ(2~r`3y5kXLK3a9PUz!bkTgZTm$!cZ}DlUBjyIfqs;e&-ebK#Zy;~ z%)U}itZ|%n$!iRA9XirJWy&<>2N5Ufe!SxV{IO9w6B3@WxpV8i#?3z4>g>bOb{OU! zT_Yb(Uczj)gTmkA+)^tc%%T91Q83~@^QAT@^0o{yurX||iErhL;5g!2bPK2FBPyC- zlB)@$JRW}q+8#V~RyCXDj^Hsq)_SR{!0uB%32b zbP8H>g(7Y)rbP7( z;-3ANInVrd39fBiU|39wtS#(VN5AWSdrir73_M;$!En-J7V3(m1aX$x;QTya2)dc> z`E5-hH_Z4hI-rqwO9})4_TM9(M`U-75yoiVM<|b@uLec6l6Y$lp!EX2!`9L|EJ~CO zu)ZE2s6X@ntk1PZBrt!qw*y|zT`2kO94iltUEsZ+lf1Boz5_lnh0S>8w^^Ia?|}*h zJ^VFEtsq;qZHNRJpSsQ}UK&MhBJMAj=odzpIvuA|dl=K+>IHz3^uHT_w|Zt^=2{Vj zj2H!J{j^(6r$_Mugx29C_NoHeK94_CUun#rO_sncVB)p#dzYzJJ@iB zT!(D$)**!z9bxAC9klO%_&#^}=yx%G>cg<&7}Mt#Lj^OBrGnB#TAK|ATSBw`5xCOH zJBq|PvHU$}^lAt2__12l9mbDr%W4oDHNyeR&40@+5gKTr9n#v2WP7^|S`vtn0s)(g zfpfh9)0YeR>TJL~ETn1eR;c z<&8X<9^(PNZ--oEt+*Kl6+p?@2ICU zfr6^tPhbF8sS^~Q-2xT4qgaB!Ydg)*6VD7uIT_be&KyxOHHw$Pl!+Xfw>9zz6~w<5 z-XPIHfZ9gg9v4*O3XgD!7w4r|Dk@fYD{Hr=A-BC(39pD#viiHmS*o|YB%z=#z`iUr zJUCqjkDKG6P?)HTn;0yVD^>a(_fQC5jtZf%si>G<-riO_Lrz-T%UauOE6-)GIG^qV zYR~X%lln3lIR9Ii`M*FfC(yC-Ki2wblz;c#|9WrF`CnQyod4OH`Iqa(16~z@Q{r(E zX>+hLF>tYSvvPe^X1E!cm{_@)b&1%SzKp@G!@fH?_IJRhlyn(70YN9!p25TdAiEiOwcsQ~~A-rh0gVDlF z1~F#iXJ&p`V8dWLYPS2NYNYg^Pui{c?Cb{Lgb@L&*Re_D!0Bfx`$|uH?`@FL#l}0& zgQCVIKJ25BZ!yT?`(kh?VskJxm0h5;!T>3~j5lg*i)Y5{gp=9u>_rmZ>wi#Rl$mga z5Go!bsfSDeLS!?ghH@26EhMK%A?Gwo)5-SWsW-NQ? z14$K5Vkqp^d>ygg#6ii@hUSo7QpJ+P(9p5j*KfC!G1M(GqBnf{kVIp*TN%wC8c8jh zr_I6YU`wowVwN831gt5V>;ixjuhOIcnDRsKKv4c~Qikd)_w%*aEB*JR4Cnt$%5bv( zi~WMJvHc&70t@qhQwTS5!MdP*alc<}=)ZF6uI~R|WltVY<Ur1$fi#m47r&P>lE5!+Bm)V zPYp9i@hUV0G8S|5w-z>p5AG{1teqKmGkDYHW}#?LjHr*zDqS@6QF@XjKbf9pY&hjH z1wG90netz(auK45VXl3m)Ed6hVJ?lCGz$ zXaxhHI5wdpDv#{6l@*eZD2=$rwZjxN_glTTVtT!UOF86o(6WZG#$mdz`r(6>-ymTF zUbAfxH3-2WXw#VU5B8r!ofq!ATaEAG1d|UGR0VAd^&Tuw zzEEKkPRMv_yh%;)5z`iiVE-Teau+sjahs5!4Vo{IO;D?Uv2gFrbbc8oXP6N%_KiCsNMm~8Nx zL(jBYB;+4=wJ7|Kp<_2X0xN@l#PCn*X6I(v)Y>(%upCf}%GZm|vbW_(Lrm%h6U%-j zC)F%9_cv?oQH!ufaqd3$rSX6%uUJ|U`*?ImV|Z42*K*U`L2?nB6LI=mj8a#)BP4OT zW4egGM2GE*T3wuExw~^lw$QFRN%d~cr|Acd3-Sxk7F_vY{W+8?3U#7Xx8(k7ox8@) z4w09>JUW=67t@!!x5?`OqoddL{2NBNFOu2w243Bwk)Nu0-^oiqNluqLbElVYB0Se= zhl8!tJ}y5U&e;x&2U;)R&!~&vex&`942>x{3VwRqffv3t8m@Np>qW)uHe?#IaE5{p zP9!;i`^Qt!Ov{8kLv{0Ksu6^%_oALZE!`0{|Lo?Ve(jl)>M^#qMrWLmmp+GF-&)F@ zasC|Hm}Sby;Kr!{NrUaj*eY;&EpIy66J|oQ1NSLS7hU)7^7H@LoO-?b(q=3Z?-r?X zXjT_9&dc_cmp`|*D0ayt2=^g)n`E=TK~AWRRa#w^r%v-U);{Ess!AWeT-8Q=*mXQX z8N3jz>*dR$(xusfD$U#reVT7Xh3+%t68~<&Q0_QxDU){r&&!Z!&vBwxCoVCQEv`D8 zFkH1y$lOyc0bP3If|7f#*vy9mG2zT25Y|)KN^YBxO2-KS@1V9z^-8u!E~~LmD25i@ zX-~`JdJ&v|>~_+Ow4ub^$MQGhMH&o@i^6+|irHKtbN-^2ZLqH&7f6J*CHPDkZRWbk z{Q&2_gHHcc{ZY}W8#LE~^i+8so}_i zw&Vw=s?H1TKW|ZV6}{p01)p4^aRiOb)=Y@Z!j63>xisd^jY;IjF^;e+KY zRv8~7$Uzr2x9KS%^%8UGd2@6VUvIO1YH}NLex=wknb(o8cX%?M^V}i5U@7)WyrbZI zVFufgpXy6qpA7#oty97TvbD9-J8Ixkhtr%b%B^;_GV|S5BxwDUov7~O7_Ix+J!p64 z=ScBaXW6V|&d)zm6jrH|lVae;oPYMLE=ZAA3QNpN?Cs`@eT5}e4Q94>^mDuhN>E3lKC%mT++e<}CnTWe zd5Ba#@Fc5sQILg>dCWv>%gA8);3m&R2VRvE6GVU`_BA_NXMH2Fe1(Hz8+qWF&j%K3N!IjxZTW<}Qvb;y>j zb-3OhwIsQ>aa+0OXty#ILQSm>B+EMlT8RTiB=-;eK6%#czjsYowHK? zw$c%1qs~2xow@4nESHV-eZBZyGS3Q!>~rG~*`?A~k$Xwy$(Ji^63=o@IIFiIF+$&%mM3)vpO(0DSc&-Fv$%y{-h(xZx2i+frJU3pNE z{T7(p2dub>AwJSf9|}y6O6Om_pd1ps7X#Jv(lQ=nq`w(#U=&V^(y^F4b!|jfwwbN6ndWBX;HD363#TPd zoiQSAailT$DLFtlw7o5qY*-@}K^xYWGw?+S8KJx6 zd)lf?M*P_1rw=iqeqLZmYrY(d^s3?1LZua$SbfLQX=xpkR z?J15G986}cIF=J$&pmF|>Z{Lp^?kf)@zfqeYJAr4{YvZTfi|?nVfU zMrz^GeXnoBEKUa^yZPECBknuLFeVja6DNw33pMQR9UYC58%4~AvHOiArrdjK!;hUn zFI_Eu`fxWQ|CAD&K#ZBMC>?)-=t#iFJ;$R`uiCdrOGw?>YnSbwgSy2ZnXzZPEn3}8 z_ZC#V5~0zQ{&+F(AE@%j+n-y0=1q0){57*>Vy9pmi98*ka$d4+tK z_JXL}Vg#L|&hEV&InY-LbadizztXaSmV6ng`l{TAyK|w^pEt*;FebNVe=A>k>uVk6 z{Q$}2eA)d0ZeLeGHK|rH$?I${zpjRdiR7%FK7XNY-qTW*6qf7a_?pD+Mpq|It&bL6 zdU-Ybqgkv*a9d~!hfh9D;C40PgYqXO^mHm-wrTDyjqcIAZQ1cNq50c)Ig}>XSGK-( zA74nbiG86_*5$#cs4%>{0DB|<_E*vuzm3R8TU7M-{@~}0PRzSMJkw>(cnvXZ<9mMG zzM%0W{^3MwZB3^HYYpAAtLe-J#;r!pv1;1)BaV&Y*-=Nrq-7aKCI{2Iv;+h{+)Uf^ zT;-ovzXrx!F~U0+cV#>}eb%9VrEluO=Pt2VT9BVkV6@IXhQb)m9i%cINiOra_i<0T z`8b=eR~qJfh0R!)@a|K0;~CNjdcANp>Rv^3oVfU<>amjgFUA%N{cJr;$qf!eO+mAw zLYHgmv8{u7Ua5#Ed|6^GsZbXXbI-<-{OYG?tyAN`Ax?C|SQr9JKz1(~BQA3x6 zpsrde)GEy7$bwZ3sJrK~1#Jsz;Lk8j~kv9#KmjPE(`yx*~1)vd2ftNiv`?|APo zvlb=&&o#-Mt~G(0)x_IX?UjyaF_=>S<;PuOGVbr$q|E1=zw$*_6Oxpz{T5q&S?9gm zdZW`l#=hiq`^J7bY8ZLuz&qEnD(^@aw_ESKHKD4I7n@j}Nk1jT$9HLuFy6gay}Vh( zW|`qy@+Obd_Xs9MR%Z_kSH7GNH!m)m4_|q!nJs2ok#3cz)_eYOvs2Dh7j#ANc#m&= zR0^TD#FoD4%&GFcTaPQFvpBf;a(w5W?@Z?t@LwQJ1T8FVMddwH4EH|Mrz5rCC_RaE z9Js^`<+9l4@G`3~P3B>1_Ng6wLx)c(5G0TrUFL!oU#Q$kKgf`y9q54g*393NhTOcl zSlJV`nXAHr(U4#BIj_~O9h)XPy3REce!UAT8#}(-f1UR8=OVFX3$_XGGZDijte*=PUoU=IS?wic)!2Z2`RZjtn!buhQ?rAKpxR00yCGs}){B-) z?)8szq99DsKi~KcOntDL>A3^Vw^~ZvC4uw@>n>h=iU`mK8ie0j5t%%-8{e;oxtrn`vX=CahzCi~JG0FdS0B&y3b(38#UGuBtcxD% z+Z-im_sC~4WBF@)qc+)KbQr1fYHJP?0lQ^IU7FnQ?ZJN|NyaeKVVfdrOWGcy6YEtG znW|m`vWQlhM9M*A*)T^JL#$v;pu5~T2Kg@c7pMD;IZA(6-gzD)lD22wtR+t2VEN4l zHtJ&w8qk(5`3D8gXWu*8zq1<-T={t9-P;e0ma^>)L$fs3W1EbeAKHmrbWJp@ydOWu znsi^Q@~7*sx)mIw!WNgo);8IJUyskyzmoTJy6{Q%bsFu;FEweF%DIJ4z6E3Y^nOX^ zBkCM7-F;^+>{`$xE*^h%xks(KpiCjSYMk)uxl8C%S7>He;L^(?CL3-U_I?yS1MyBo zkoxv?%#JgcwB8O*(=nU(&m7JOpr1T8H+m;smcyTm>&e%{8Nugt;znkDYm-w(_yT?o zSJ7?0!G>3qJzOFfM3)=*vY7U~Tc& zHlgkHc#BC%A;I>XhpUQr-m3w&lU~hkT6WwI@|fvAl5xH+&S%ipMJlZPl}1q2&4>16KQq^ za0DhoFGyj2I`BCrupWbF$%w-L0wKxwPFjlSG`Yq7?SHsqh zEL@)G1iRr;{awi&R^wY8Y+Z77LqfhzXWQlaotAK(cg)H1{zW)^rkou3jGluYO~8|H zgl`()AgsRHyl!tP;m_Svpao@TDcQOc9PL@DMt6k#vYdV&nY|C}C-pTzF#or`qqUS{ zJy&*Aj!Pe9eQAAp+ejsgdkOuqMVh=K&yeS+D392R3}-u@=Kd#QE7e&IZ4b^lfpa~p zQr4gADe)o8Mx7Cy>#4W&6`bqo{`t?jo`y7Sp=;-QhRuZgNS=o<;9yTew|}~M{Y2qB zfi+k1S>bKP6I0?y#*F)cwGrw~0 zHSx2nPODIC4>F4<5X~jhuH+te)2Tsyw+POWdv!|IgQ-tt(8Fe zu8q>iLkuT}I>R)B=tYPji**0si8Y>wN;jJ*SKtaKPUM*0Do@K_;nA1q*kf>eR3-kl z**mZHw?$IQe91XR;t6kV>szPg=sJsb%P#gX1m4y+bbi>n_;?obZ;>7DU9=XW(V^oI zQo5jjH}BIJL@eF5pX^rWGjZ%{&_OjB>DRZFx13Ib286FH?!M^g>$&(ioSCD)2*|UD0bGL7_8B1c0E2Y*ivu$I^emWcQlev$uNvAemA!6r=#O6fA zjRvP3EOA0=XPZtxmVe6tUbz@)tn9xyo0X|2q|h(t5IVrW7{c=mvi4LIeX9^UrdUg= z9V5Jp^%hzY4B&5_dW0MMDB+mUDi^mbw5&6!w{R|tSZ3}LIaJ2t@pDf4!r=hy6W0Mr z_HA_x#{JI3h^{Ceqc_fc9Ua|=JUyVkoJhX&!ef4wU6++D(`w!&M3o;ueY~vFxzky~ z7%Ssy_Sx0KY`CB(7AmMp7bn+Rndw=aEKk%_2^L}8#JgX3W*f(uJmJ(BW%rx!`qY#S z^Q0kLHP(6_O`Q<2Mlm0sF%eSD=~VQt^zE|^ZaJAl(^7Fqt@M)OMZDj#PV`>Z=ozy_ zr|k(|5q}zQS*p^*Dexh)HcneLoPFlJu5xs^>M>=>3;PmSpQ9j^xc#NxFVd8aAmNjR zN49e9es=xEKRl(LQf;)>4yV0TXgp9p5yrenMNE%Z^L}ynt4gje2~B9QJiv6oE55nA zQKM45GBlL6-XUk^`CPERcQ=n~vFN9hHV*pxy}LqYb0Kis@~^c*nX8T-nnoE z_rh}bny=Niy#2as<+vg0QG{xSrc$^fsPv>g+LctToy`Jb&)A_FhthTq? zM~gLTM|}^V5>mSN>px6w>2?}z+m^%k-2jV9@SD7!a(P!rqI~+Eg7T-?p#)VE(_i=m zhH~rVqe2KspwuVf-B@D$=rR_6!VF1Dw7x^WHL!GzPL|!8W5rPrx>eln&vh+lb0mXX z%Q?5}`htV0VWusq=Pl~qs@!x;Rxg)VCtc!ENI$_LTk>#n=yL2t;gE2Jv6igB-6HjN zyZtJi@x97PHKFQCMc){^2^ONxU9oY|UvEjcc=me`9a65^-%pF-58rt)RL}5qfX&T^ zd|xAxndodLT2b9xlYLOxBL>`dH_7gF>8iv+bwN9664BUF(CDQYw2Q?n z8_nJR$J=z0ecqmu`n2i#*M?v-M_gs>a;L-AA!$3ayyYaCyFqWBvlx5YsD4*+z>%8e z+4y0) zluP&C+Nb~B;G(mf{CVgIW8k=7&pBn7Jr$qcQ(H1&FB*UTYsj9 zr><+Z+mp6ydJMYP2%Q*`XZC$4QNZuA^0-D;rEVEpZreH{5Z|(oaf<5$KUQi{q}|=X zxhs3-!z^ymda{XueLK(A?|d_O?&gLe6G&xu{mtMncLg#o)^F}8gXq`~3@S?L2g`XS zf23Er#hCgcjQ^CG#;`e&^LK!2l@)g<4@G`8luC#?bD>NT zaeXs%iT#|^b#<$VKyK$|aW;f$EdS6PtJYLQdt|E1Q!Y`?O`T%J3;tK9S-W%2yB&Ld z`A%i~g2W>|-VXt<7kpL{Q5S3iapYjVpBLwkADmpWsGpOnfA}4x+yR~2GI%HTg0%1K z)Urb2{eSMRr$PMVhqlgG5?T$&kEWf?wbl@a%0@aL^p zQ32lJLRlS&Gik-$r^~n7Kp3<0xRlr(5h}v$o0RYDz4GjB0lSzd_K=}!a4mzgp{CFH zl1*^%CjQIxX`LLQ6}>4LaYzp>3up!X4LP>WBE+L-oT+DAS8(Neubo4r=eGPz-Zv5l zZ@qNl$S)|!cjQWWS?a8KxU7d++StLwqX!XP!|{fhQ-@Vxgp1Cj#TD}PzE@66b$;1Y z<>k&0Ti`EYX6zlqS>#@x=VF(ceY00lLo};nYqi09t%DgubX`iZkM8c@7a7RRw}aWmgY|2#5SDW^XIINXSv@vB(VDFj_$EJVjFl!RW)F^rO`ZSga>NJ)N5b(a?#A+ zy}YD%z-yB@{TcO4(Q2c!N7F_9CHx*kV>Pm6!@n%1rZe6`njXuo7z7vg?Ah~G^o?QRA zMEbS`{~Pg%o4CR-&RH`^a@Xg`1GcdY+Ie?eo^NM%IWmUUtI&9I-u8ZuoyoGh@sUs4 z73Ee2jTcvmg5!!*Ql4Gh@=(kJs$9lW1s+Ga>=f^gyvZBRx`$8+Npy~OvUU=zi3lV>*F_AoaMV@Fb1)7p~~OoPWJ8m119w97ZA zD>#%eRZZ5NqZzgy5{)Gv{y>|$!~4dEeOGNgEyOPyFlrAtDYo`Ltfs*!3+r{=nA`ed z;)v`HVP3^5U4PAyg>RiwgO?k+gbB^RPAv`TM43N&k5vidp7o3<5w(F@+PlmLdhYHX z?deXLTQZv{d3#9HNzt^$HqKp8_$y&fdPc-g-SvLAKG)eg=3H@vj-^PpO{lNRj>y>Q zJGHJMM@TvX<~z>Ti_?8VZP_2$L!VuO$sRs-`BV0#O+t9O#iu+=+eBnz!WeCY^oL}V z0#7R|pL}txHX47d53dqcV(@m~@r0j>_HuPX`1_hKw|#Y<2y9f}DjijPJ@>_kjnvb) zt=&6Mi3{aMM&kOTqe}#Aw=9_+|E$s(1<|&$GIalk%>_j4T9URJcdy@AK>TxB7-*rm zZBscf*e!s=Bc+izu#v!02)r<8jz?lw_Y#n+IyVXJv=k!Zgv`MkX3|Ik5`+44IRm-X z93%~^F9E`@8E$gC3|<0UJQr@7F3qYNy+F6;?!7G*b4t#;g!cZ!(joHf{`5pjg#2Yz zk?EOMg`}ic_x#4Mc^>L3{49TfJ9|6V&MLDgWWNY!Bh$9HhiM;Qp0eLM|M{Xhe@hxK zF7FJ@_sP!ZJuIw?N^HJIMhZAjL)ppw(>)96%bkg?sk)>Fwf2A~ZN}&AKVN>i75g?S zZMxF)U7O!e^g(>E&fyk)f(4TW^Wf>Ewd2u`|bm1wlOc~E?r=}_lXd;1JgGNXr zFnA<}NS;F@gn6(80uJmYpnQZ}gcvFRqHuT|30Z-}Afo9MF?cKqq<)mo-{0|QJQ4m3 z0ST@zhP4Ct86)x6@rV>D44#MruOV*eg$OS90GZte7zvLi;mHkn1UR>ffFy!Ebp6k0 zBnm~jU3nvnh)2T^qfrU?Q!v8-C2kwQzQf|;*KRP6y1VlvzLxZQ_?J$&64q?xN8@4yX0Iz^~ z{0m!^KN^oiQf@C<|1j8&L&CsWNJJ7*)E(lm>pG?Ls(=9OmKkUaKiMVx|xhi7} z3QvNw5Q9eH;POP0K#%Z&00Jp{nl=m$yeW=Z&%ssxld!;cHZ}wlf{ke#VHh-t2vNX0=U2@lr~@V+_`f@?JZlHiC@z(#N|Bmjniiv$o&Sk-DUOOJ zvz`kW9N_iZ;Gn+^Q7CZB5ls653`Z%8t$!H62-x*31V5qx|ENTVMxx*Y6;0%eHTfhVVZU_C56S!as1ve)E0J;Q23@$K2Qn4QoW*vAtVD4~n zVhO5=F#-*&Ie75rbRr zzbV{65h>S$!P^0igL8pMAi>QYLJWT z@NgTS1v41s*;W7d*9QO~Fes{q1QLuu5Ptw)2yaI~!$*up5`e3Lw<7`>|A9eku^<}E z5_ourC^Ygvz%X#FMx(%yAuweH6FyLzKS+M#0IVkdMf@8Ep#WE5GDZUrM-@b%fxCqx zK?4v>?r1c)PY$N607e~20S8C%3#_Bz^pCdqAhoK77aX2I;E7?FG4u|mwf{7c>84z4inI{2_qe4so3!ZSDA%IyQ zPBZ}v{f@)dae)Bl1Gv2th$t#0BoJ{Js&*h+hRc|U#ZoCN5e#m1z+n7;*-ylQm=eYX zB9IfD3&4!2Y@0|z!M!7hZn5y#5x_{u^_-^gA58*w4EF&fiu%KdAz^+~y^d%~&;(;O z$O_R|7|{TRg~tmZT1G=~wgMo51XCmo2p0g#4GITfz^TJwKulDKfw{v(f&ue8c1?8u z#(w}vjTnW;Z3veE2^f%i!nGfRM&jU64uDbjhen|&tG<-an%DvVK|GI#+c9ub*#7_{ zz?}*R$$@sQ?-29{A_%yz0R9c2hPT6D@ennTnrdL2@JtwJ2PjX#J0ua|!3K!muy6$i zFw!6M{2TvausARjSch0Vn4YL$R5K+8#C34($KX&TxM#(HG#_TN5b&X3)`26zVL(e5 zVjP$~H^>gK8WeEgWgP&+Qy~T^J>0>8iVyG~u=o!E2~_3;ydHdJ1BnEPEMNoze+l>f zz+gcT2X6;F<{wV0|BnAal?4fpZZRM?reZ$2OXQPCsXDwM+5@nu>ec8X02>46(#?L0g^KvM$wt|~%oGZEOSkRG|( z62U|Mu8PP7!V#)bd2qgKq8X{pECE{D(ki1(B!Atf& zj^F}!r{dHRsdOY1xyBsyD}Q1YMt>CXl8%HX2U;O^aB123dJ3T_$r_~(9d|o#@E4Li zWdhopS|d0q4@(|Hq=LSln1g;#+WdtHlDRbynq&@J#KGUK1j)4;2v_p-dPs~W;sN>2 z$+b2X+TfnvTrETp*~kvDkDRKD*h)tvkpXy6kP=k>I}S=TPx)(=KH%`k@-_gwj}C%` zjzlEK>LS4P0|au44x)#SL|Ppl<=;Q>Dm{cCS^FeF_Dc^uwxWx$m0C?M)*<-K(ccJw zqO4;8ksPUq;HC$U{O*!O23?*6fK^sfenGAOMUd>Sk5FX?4t!lVl&1mTDUH#88-LeF z*skve^M~e&7y|@?b{B@?=GIa9n+?AOLt3Sad#%yh^|nB0*6wx`r9fiHpbtSZoe{zn zpunvn2W^4M{=N#Ay6saV#0fz5dMu#xKTlG?{|!r^G2+NyEZ{$cwSfR>t`f1+1W{lK zN)77=LkSiCl_|vz*RlM!2CgYMp7Gy(T5Fw9kwGBuGDW=5#!%e-I)45BYfY+@f-vQ` zwN6nRI;AwE>Xb<7RFG_BhVbUbtUgWEWEC%9vN_`RHVnmi{v87bNmkTE@F=W7sUKWx zO0jz(bD=eD7m_hCH4}32a&i*F;Rw=1A{vb%@3ugcu&+Axf4fGlsgmj%`2X8CsCY|* zVk<~C*FHot@+d+;MA-t&madd9=f7WGl>fOeirB>KvHy?t{*n8t5(Dn6s+Zbo=0Gii-+J)h*aYe#(kPJS zk^u7650Q*Iir^<3St3m70e4pWro*7fF}jEy;(wgz@7_>rioTBPc*=d>M9|?{FVa>B zon0UrS`*bq*SkhN(DO7a1oxq}MsPv=(dqw=4}+El6)G?p04eV#Kej;#lZnR>dngo_ z0N)S#{ZB^sKl{a^fP_JX4YxLq?&AnqphD}tIv{wJH|lHP|2O3zJCz1;56J0%f6!~F z5>Ft=zz}{L`fm~c84Csazc8(Fd%a9>cxh0j0rc)RK!}j=sq{2mHHxEqFPm;bz=dkgET0~VSgJP#tyNE9$;P-2KWz#>|uupf>3B+QXnkF zVt@7;^D2h&7QMgJ2X{)rAL6+Wu|KwwWr3>K^`QgE!xYr*OmSfPX? zrmoz93Jg`g3Sb2IsvdxWwH$bVAi@Sh{>ueQUW*}u66<>48VpC3Du5MIs>F(jCsIZ6 zAiJUF0x0&bj(9!$33v!zcft?}p!&Iv!c}63)Im3>hf<{q|6vUmtVn?mygyI{SQFE_ zyp~8>jUN88W)(3BN0m^6B{O*O4J;~Al^_8O4X=*?7$}&pCx#!eAFOdvyzd6YBv9yF zO%--%G0NyWoVNpEJ(f{M-NoJ&{O@;cw3YN+jdTD+qP}nwrxAPN$%wLzBB7T^KI7Jy{hWz>Z)}b z)wR3#S$sxcUqFr9rlDtKWM!ad;9z8+qNgYOc_^UhWbBNE4V+B~$b~r>=@}XRk4hsH z&@KcJQ{n|=C@eEOFE5mdt+Ab?852wXhcYG7!i9h^v(P8D!u{YZEQx&ZKQb$Q;@JOC z_Cy7QADN9MaRVU?gqfW&(F8H{hjKLDB8C8gupi_nx+CiVIzC#zv7S%uzwvx~zD$#%&<%k#nRG(X>I$ijo}+KKs}^!ID55&N!;Kay+_6Z zKS1>Iy(@n6#d^hkTmS=}8BeSH0!^WxDpQl2XUm?=Mez30__^-62Z;%lwv z?Q82_Sy-(HIQbq7!`JxVuhjSed}6qFoJOQ#R<&O{p7CA_1Y@RCiGe-qv+uTeETq== zd1QST+Vxa@yT}Y+LZu`={!-_$+orJQ+lF~9cDV#T-P;#>3qwwV1&gwLXiVqkz3T0WhQW#TQssQ4e<>i5Is{T|B(0_1linA8144Po?b( zaa(A_IKYRF1^{pHAS71w(q|p6Hpp)>oWtFV+|+{>?-84Yg95D9<+^Jdf8FkW{Bb)0 z5Rta;RkINf!4C(N*7ojr8x&dGk+(}Ovgbg6XE8VNYUS|q^Ag7;s+Pht_A_MpfpZg9 z0Pj9T78KFvbCh{6RH-lDK#Hj>m1}VYDC8igKNNRAL{^962W0)<%j<`T^TJe{+Rb-! zunWt+gQ2TOmd;lu6I?r8j#k;D)0UaTYTl5LWWFE~e3sbqg&O=NYMaTKWlVVV)`(0% zPhyTA%7AL!6r(=bJ_>g7Zxu-hCSF|)9PU5;G_{q|Ee(u-n)*V8~lu~S2sutEdXAEj7M?D5n}lZ=-q-~)sF~V zEg-=l&TNc+Y*qL=&V;K%?UksLFsWL++d!Kl!JiK22=jq$z?M>M+fX1Teme=Ucp_L; ziKiN2yax^L5%L*br&V!T!5>e0okF1XjKxV-gEHQS4)*}_j&0Cd!e+wd2uIW@Yq%o` zlV}(Ri;lE6?oc{x7ViWZXb*)D1TpXQv-g_|fZ}vuOdjGvi`4eRG!{*OjH$ zE&Fuu-k|dZe)aYl>-Fzt*YP)?x7Df0_XP%A`}%tly@g>w+XD*V!pJdmzD_YFl1f^4* ziuEYQnx%;Bi9idYQ57o=9m(oe7<{T#n*lEjHLOiMvMOei&1~cysY+!NE^a?ivS_=| zDb3<_ghmZx(^Fir3R$GKa;8&!dM}dmGrv6>gw3 zL$5r_;Vz#Y21)LAt&&U4O@CjV%sQO>kd3!|Z*<&f_k@W^R)7w7ZaCR|A_hTAU5XsY znTiZF8#&YqFv;kRT%){iO&>@Lx9j?g+OebZj$V-+Xvg&cnj1v(r#ZC2mpX%>GGMU= zWlP2gqZUeu0&OMNQqrj$a8ts`0!i`rWqhpam_aCX%oszMbW0e*_*{K3mJ#S^uu##h zH9}p^+iXJKFxVruc9~Sk%rcom#)_Q!lwtJ|s`IDeBB~l2}&_&TDYb;Dy*TsXj z%TSj8?q9|LTg%FShEkB0p*7d93-?@gZ~w{42+$F!Ya&uN*WoL+1EX%SmuCUN0;^N&WhT*5TO?i*jF=rOO}nCK=v(O{CM!wD_^(3 z^53YJ4eb?yC7wcAT~U)~7DHQcG{EmG=vbj87lQ@h z-p9xSLXx-uL zy<{XvT?&olON813-wi{-WJ-r&s$yFA;vvx5B=I}RacEtZKY%?I85z;80q73GJ^5|( z5sOa$eWXr`KTO-!;62kr0-|7G1Tr8o0uNw}c_e{EbN@|Mc=zI>$0chFN}W-w!KU)u zAy_G5cT~3kHA!Ok;-eqqZ9(gjU2>e@EQnndLt3kUgVavN>I@)sqm}wawFj-$e`aNb z8UZ>pW`G)?wTY|?csfed>%30u*{-khLm-;-a>fT$w_KR-ALJPj!`ht28kDVFKYOoX zmKnzBxI`J!I7dK2Y8thtV@%%AGmb#Hf)C*hbuS(fd307FrH2SR09d`v?Tdj3M_a$- z5Ocr-E509U+BF)P$w^KQk)QV$Ue1tF;1W<0HwP#HREM(X9d(yGe6)brP3K7G{R@iNROkLlA6J!xnLElMze&gFRu`rJ?kLUqXx*J ztJ1S(A3K+$T#nc0o*vS_mW;k5m6MI?$^!V|4ix2LPK*IuG^LpWpvG{!+!{P;d^$+#mYP6^HCW| z>H*s;(pHnzUxy_eP96BO?b)*F?2R?>s91eVc!j?>oxQbQBd6;-NQ%cs0LXGm3)pf; z^A`u0F}?6qlKjN7C6Nn^s~j58!f9oJ2v3aTOo zG8pu<&XD}6k`RmOPyKMy(!Qv4<~mq|FbN1?v_z8MYy_@hfzm<<4C%BiMV1qIKNd8F zDy}5NRl=!Fs*YHSCSrmB%E{tTlajm!1_&jKkgk}Zx8~9+<5tqiI;%~Yh7~V}*63n} z6$X@RAwC*)dVfD0%(zt5!P@h>-I0{@o91D7ASyT~HQ;evsl0Y0197!KKb-Lo2as1g$ly*vcAN-u4kpw| zkE@vySHoC94RIc9GRgsE3_|=r97i@tZJkwmbax1A(jQbU6JTYoylXn17rlB;n9l8 zf@IUqTqOg)+7I{H{nkQTxg*ANlAX%p%|Fp$pHG_<_t^UkmH%cs!G4Vx%LKIyrn1vp z2p^5!oGv9#(=Cf5JhwOOwcdVeY$hh-%?D9UckBXCocT)L`{814+@_w?V*5^=j2GcE z7O)Fbk5bM=B&41aaKd$y+Da@Wd16I>wKV&iNGv9`62XZk+f5|_d|E+4dr*hVK%jJr;N%fP%kZaq zbtD0JhG-=<7n+X5GfISiYUEu+#i};Q`i;1|Lq6&xNdAOvxk|l|tW-I+ zV&u!b{?kZ0EMXSO;>;m;zOvctpNc@z732pxJBrczM}Oh;6B74v!|kIUc5<9-n)vPt zlezpXOuk=N1EpT;VY;vneOp?(cP`WOO0%^lzpsdLXI1AH9Hdp4i>FkWuM2qqvpm)G zbDmbIr;N#-cns?0gt)I7L8v52E!?T)L#nu~SfL3eqm0SUxoPU_!sSY+)$vskDKSAR z%x_KTHu?xo&FtA8$33)WWeX5*8`6zj=}Q6v8c&myAokQv@E%9EK_C{d=Kh>PgI zPKkh3S_jZJnXJ1uKM#(G>h?oO)9TZb3e-_2v8v}=m^Q8Y#&}o0B|@93P+c=T9uD{T zJzo5!cx3D5hRG!eMGy7SHBLlb4EGHK$&xvpRLLy|nkQ{3m^H^SRvshG+y|PbZ7CczCIMDH?{(GjN_D>yq1GbC;isTX zU`fqAF{4ps(~SQy$fj9}w~Npnmr*TB9XRk7l#9kS`z@5qfw26gIpt|#1jI-8m9q|{ z@}`ublwu$L^#!>fhw9NgZdda#u#VMpV!)yBmaSDAP4CW0K&wr4Lz<xZd*dOYjV6@T{>(wTR5Zl<%1L-Wp9=D=MeM&l{|ek4gyt+ekjM2Kwct`eMB=I- zV%i2F*gT=;7d%nrPdNzy1GHy$0^_C|f!N%fE57c%CpCHY3r}W-4;EgYd?X5>h$a7Y= z`D7P%?zBxIJAl^Mc6gkpi#q~p^CU21HqnpoLw|7#{w;11-R&4)`dmp_#Vi?s$>@&I$m5y&=U z;4Opjn}QcVRV#YDTo-Zueb!KDhQ1!(7wt0(D%G&zXq%)gal4bV8oZ z#9Ftq0|T57m0O^&Z~Ekb)EsHzP0- zdy>q=FIL?6AWv2-{UcALfk+;@znyhwLC4t#ATT9o&t6ZWnTndlpyz_UI?f_RrfNyM zs-kw1@Sp@q=dGGC@|-+Zq)PEmVodgbP)K2nTeu1PrRthg43h+}F~KjX#PuwMDPI0u z5^+S(eaQSJFcTWb7^hguC{LmT#S`M@#M*HkYUIOqN*{b(--EFk;WJ%l=FhdZtplh3 zlmF@J(-COYRn-K}1K%>vRgd-dFj9Qk&SDg-ibhfHgx2b}TpOsVM{FQBUAnou93Uet z_TVyH{=9~KWm$rFFOzO{v}Fietb*O8KY2`2|80{k!jfYLE~U-#4L1sJaaa_>cM5Zt z|M!Jk%q-i1zH$=r_qWLh-pG!FWbgDHfW{)Qhs;(I`w7=UY9sG9Olu)T(wL0+;~0Aq zQX=7b9h0PHc81)A=Z}P7j5uZdF>G?z39RH$*S_b=@E@7BKEnm4vU+BF8Lm_?`|y(h zKg>tfF*e~%QlhX)nGA%%!Xv^RHW~p#{g0)odCE97W=Ep$KNDvLhBJfVhB& zJ?z{&+;%K1BNVZdxIr}>dAtc+a+fLGxH4|Z6k#x-liwzd6GlmZ4@SzxuPXdk*1HJT zx#IvdWQh~M1yQLeVy838E7mU%W$*$Vm8yKsoU&_X-6r_8VEhnm#_CmKq6}Bso4>9RA>tR8L{_c)xL-s)oaFDW*g^CS2FdZ<(tIm^*^K~z^IpDJ zrTK;auj(D2cbd*|J!bkfM7_c7clpbj0_% zG5(8+N?io9BQAdc|J!17ujwN_LaZJ5xvyfgIYjwMWUOt$-`W~BkXuN1?MqRjUOD!_ zaYymX;nv$V5f7MZ>`YlwG&47yTKkt z{R^wkGeJI*46+$%wZ@^i=Dx!0e;%^;CZtvOWdO7lw%Wr2>rNO(?FWbMGqvvXk+pl) zN&)pOu&UgHg)w#k_Ye1<0HP|lU@=z=R^il!Y&3MCF?3bxDx>)J9lbLyVYr}i)mA;V({G{EoGu_(OQ`gbcr>&=7LnptA{_xS4 z^jiZjO>yJm9r)4P-=n9GM^8V8P8yIyHZxS;4|HHH$LQma;p1c9OdHZwp=zHei>S5sO{nXtRX7I;Y z0y}y8bN$!&2eBVTPdkJ@dmDg1c&lun>`)H_e2TPyyyzH{ODG1~gp)VwaH-WXeFiZ8KLTCa<5(9J98|PsNr;DHN>0^BJjJR@1RJAJhzmW0BubkHph|B-bzyNT&Ax$4+^XK^HWij!} z*g91Jz65uECzi_R-l}?K?42q;hnC5LdVu&;?Y%0#K{aoJ^kSnPww6y&^9O|8v%g8d z@Ac(qwaotjKSS7J?xFnCPQNntlf0T&V^@ICqE;f~EH&dq2v@7d_KW)$!^I+hv_a*$ zUyMJIeMR)0%IwKyt;!qAh=8n#+h#oAc@1GTT=@`EY;P%ek?v%u5o?E``_CDd%fZT; za-Igkz~gi)(X1L0cK>**+f2`}NA0xCpDGW2^~Ya!wn!^m#8vGQ>Q0GuC!_|`G6R{J zK`d9UJEx#h}CFdHan~=pPC9mo&ulp_;_{fC1w4?kH z?!E#4NfS%E$|v8XU3qr@yvUo9yjIG4A=TEd;XTe#h~o$DXaR+uS!lK^C#B!l+^>3_F-j% znb}bn_LSWNl?;9a7WU+9U}eA$TheDc(+iaMRNX5!kM^PFqK8Hm5!sDXk{$E;nK7F2 zHdYRYb3RRgcc3_kGh!W_CDt`a27cUTIbF(igA&ji`KyymJK_{q})SRFn8a^Q;& z@T^|Q(QCg+>UsKV3tfr(`UkWJE7bPi#ix_Aqltmd|8oV}h(q7}8=y25zk5fwo3lUv zookD~`ZQDv@cuixYvhyloQ@CpgifYV;ld~3o+;Fh<@^48!H*?MIfOW8pSjHAJNsxo z9COY#{FmuFOZFuNFzu1OzJ1dA_iA{>$MgM`yX*TmFlfA-H|ITS_0S`^leygVPUhZG z@IA)dq*r0ynR}*98Suz0TW0!E96q@$`A)Qa@mdlxe*47#VKoY{u$*ZBx2=-mdpnCS zlN_-9ZR=NY1L1d>-$ny|p7rmOx?Wohmysn;I`;cyT&Spx(m z<)&Ff*}i2pBTPe?V7aA(SXE%AXCu6Jwi8vKQu0$9u{)CyxpyBz_ddLs!%C@ZoxJ{t zfp0F&B8`KE37!q%AA=Yse4$c*`;au_t?Viq*{d;>IZ!vt#C zR3P%W*XJ+((o3)T$5DQnOs<`xsFfyDF!)#N8K7N5hu>0fHu1Q)_1`+(xPQ;02{6!L zV;$5PBOm;N{Gx+^Lw-7H_ad$g&5@?0u5Q(8~`#v>q?{NZUa>xSU z##I2mNEMihP$6yUl2@oV^1G)@RLtIlBtpw_Y>}fo{m%Qu+k*qLo8ybTMlzh6FN=L!9kCqy>UTd0C<{NOyJJ2|r+=olg;98qog#$mF|5FrnBc%t2ynp$Bilsr_$c7!L#iQI{}wXB?n$6$$!SOngLzFn=}v{3)sFCX8xl9J|LkJ1!m3cdAW)Eq z%sb@OYH(v?d1BLn<0t}0U4 z>E>f`$pZ{y#rxNLR)lPD;t!qJl%>hj{T>PI5MnOw`>{`qP&PA7FPtmcn!uS_H~^5F zI1&Nc>p^JasaeE9D>>R6?c=Y3#)dU9I3!t(9Ki_g%}+BHu?M$t$_S{_0u&O3jZpdZ zW@$4aIICIFoJwMlz*Y{9PSGnTM<-ZkqON=$TjW?@$jAJ4tmX5M)d3h}d9W}Q`5aMv zN{pgZ8NZD-VZyHcFgG_~Z9Tp(r2r9Y>rPUs>c*bU-nH5r!cfJM#cLbpGPw(S#3p~T z75?Us>&J}Z|NH9qSbjeUU6s?$@aY!cYJ>OdVqga{^<-Ndr?FA?EPHxb{rk z^Tk#?ARevc|9}Q{bw&c-FHCo=#l0v6*XliV!DtYp4i#xtkeWr7G}mwvuLnrCgXsX3#Xo2QQlq!Du&hTBLw4#Vw;xyuHBEBEuGv%=kue{~oZ&B$ zNC6v=z9>!aWSFg8N|yGsUOgMwipJ6*r>oZwVtO=-O%B-nY5GTPs7t@U4^r?D}5}uF_f< zW+fUBlFT5Yb(pY)+b~r$gJj{wEi`iGIt2N~r->)CB)LJhVI=utx2;a$H0^&$vb|}+ zPv+uIHb|y|Y{N-nndcMXQ^TF8Yq}CbGd=$mOFeMp9BUmx009aMgMoA@0McCz+mTsA z6T)DDNWZoj9O5yfGYBIESqP39iwSv{K#9_YoCuzo4hdzLh1^KflR!EOKnH->5fVw)EWu> zzY5p4JMQG$p^Lk(dv*@~#w|aOC`X^-9U!^ST$+22R~2zjLe->5xdP`%S1599k^gY) zJj5mL3ziFt2Sv!sQ#}JXqA>J$BZ@D@itAgwX8O&D0^3u4A_Xs{AwRU(`pkf0^L|uO z)l-~8o~`j{d=KmsnmvLCMmCrZ7#v5?zZC9#zBIq&>|2P6R{p0o(b)#*UNa^DfP>bg z?wgCJ$oroBbT<)*m%_a`nBaOC8&vaDH^jq3>@5TjsdH`s>E$W@CJ7I@H76w4`V@Bu z%ab%e*{NfGA)1QJL*2h9L{syq-dOQ53h7H~wiumSnpRiO%Y zAuDJHiOdR{X=F`|aik5%HO%pIurkEXQpn@iY|QaO#>L@5wibVacTGP5@qvoGxU{%r z&XdR-b!s_dXXciEWE1$va@MbZ#_Jg46Y_rd=}BuBajLQ$iIhPQE0nMjYnK=nnVBOH zJDKtl`PmsXU6X_f);jkdy#j5(Lu!j|Ck+3R~kv=BiY+)7`z_}2;<{N|Cx|1-)~;M|5oLq zsdilQqklW(WaHRWjhbr5_ieZR>A!3<8-@CkG#c?m-HR2?tLyUjkW6RKW;OsQ|-VpCfEwn`2|_Ho!g#8jKLc8lK8w zMrukJ`MVP*3hZVS@!E~4)J3<#A5pXM`$qiG$3~pUU%``2;r4fqPY7&A*q%_yp&!ky zRJFHW4)X)u9@z{18%htvryT^SFK3ZhEFdJK;1RxBKMm%~K-|BE;WI?1gdcQaP39BN zf;ja^z`8kd*TT112cJOa`11^-6-dgBjF1p6~TfaD1J?o4M8x|43VA?SAIt`QGn1N zb1*cS9h0~bP16PSNn7dqlm7J*Y#Su!o^FYc$N)=4npol(>i|Tx199`DbPQTl5@#-lXW7p1N*q!uho8xcL-Ct! zC?3R#B<5$*5P`o+;$Y%V!y<^i8~us7)+NSOB~?U8`t=qS9=SAH5yB0L>R&Xm6!LpY zIm#IpHsEMxDpYt*db|Cg8di72mCT^C5ouJ@b*P^8SewbAN`_+`dDPP;4Bx1`WvG4! z`#}8`*P-e)hkeCM2;K^ip>J4fu9O5=bBO1AUBR&VC}Tm z0FMu+qVRgxD=t0Bhq>EwMkO*8HQ8wz?DQQC6Dau@*)Gb)V9$5W_>B^@ZKdK$X`u<) zbkjH`n%W7<#>}RAe9Kx^)CuXKJ;SLNGq1~H8Ri|%1W;<{BUJKV#DwHm;_7vpM6Cj- z{C|Qjuq2QvU60f(gD8lE1EYsvtvMCD0H%%-;F(0?oME(vtpQ9L=_hV)p7sjJs9Ecj zpfRyfegq6A0_^FUgimw75lT#HAwy> zTrHnoc;DVisSijl}bl+%xsy6Q2sr!*r;ygx?GWsumji+-u!jiJdyh||dL z#fR!IGaCues5=HiVTU7BxE@KH1Hi=V=8Q9<@^!>E(3-m^Rx+BH;dw@E!FREa1F#Dq z_8LfO*;`d$fPtKUF)%fO_M2D+^9v*M&t=!++4zp}b*Y~( z7d5789Nb@4;(rHpf9!Lg==y}DjO*`nua4`(*pdb^bV-91(v2@v&aN#~0%rFZF{1=1 zdwyR9n8XQNKnqrNrtFt%=@Fc*z?(U5f82FGV`_1%bYJOO=*$!3xM&KAR0U#J!1(M7 zam-oRY6ii%F0nh0WV+;S?p(Q}vNT<;nwe`*p~Q5&Tr#z#!;IYh*r%kXY}0Or+iQ{d(qKmROqfyo9*lrA^RD#wHl1Eyw~Br87kYNo9ta$J2+*9L0G9g`zyAKjue_i5 zCI1t@eue6k$Tv3&S{}H4JP)S#Ht6LdzwXrH$5>sg!i%l{818tw3?;Jr`;4jgQ;M&i z9j$H#g4xMYo88}5SwSTI%pD&quUM@pNS^yiMJaLW~~UJG$*uts;M4 zk0&N1&IHqTvo>9Sk#KN0Vfie|7gJ-y4jKL2t?58YD!t9A&J@PtFlU-{1|kg@hf-$} zZMAb29&>+O^!K$h!|#nsK1SZ|Zgp?PE}cLav`y(bC6AJ7GALm_W!gLy9(HA`tCHRaXz4emskDJqD$W zd^`>zruzDbuKpCauaBz_tKOcV@diTBLT8^SKz_O zg|pa8DUWCP;HYNn*Ll=n;~r1lf$xrZUr+iM++F!RY4zI@Yd1|by40B}n;pRlNP?qR z0HUN!FPBYik}9In@F&?q!5Ob7_C7SEn#gu~xW{sJt_q4#EzBjzHB`qr61^|q=H!RH!(6>=V z)OS}kAr7p-F^>L8Pw52?$3#P2;#%Rjpz5Pf1+5`9!)>_#kNNzX$}Eg6#7%j&ACLdJ zA!_+eH_Ot+ee201~SY?JvI*+4B=3zgr^Y`Cwi`*#?*ogHF^Fw&Yo%`;CUI z!9iWjO6JhYh^V%JQQVno#pu_j&9Mn=_kQZsf)t3wmokySDDNUIy! z3t0>8AaBOG4Y8V+V2*qu_Bj@`KdLqe=S& z%?K_xoPndShlv79oa_6!6Nf)TURk623}O*vMP9+s0gzP%tGE7edOuz|WYwY1*JRa= zymd~8&N^no=eIe@MphxM0yd7~=UPM&AvagZ&$#|K8yG_S|C0?ER{n1`U_RKqZV^B4 zQjA=vWr#fyvlh}o)RJ#a2B>m?s6k#KrdKn>e#lu1=^|<&{8Fv|V(B9lQhk$rj{sX_ZspE3hps#mgLIT})F7%-+c z_Hg z(ndUYu^Le*9puHOiUJ?K%JlCw#MSMWPb1BZrtE)}-6&3cJO-VjlBLzpj=|Og8RTxi z`$Ahb+z*L^_-O#sr*eV_h&A7I4|l)FkoUgSzo00IdVE~D_b8x0r0X5qdii(blTv%x z{egDLj&<&??C!i%cb6qRd;q5&oXtI)5`mpxnTA5XD*m;+xPv?I<%=)(~IXbLI_0aUxm(wX{We-?~lRN=kt4Jg{)ucS;wKNQ3IF^^q z$-Hv}LyR-v?mu5yqLdcdj?Ke;nabuLM8|Z1)Y(?eE4W=nPnJ##d-Ceu{jD8kS3GWn z+rOEv*1;WZK8nT2KtDkg2rui0SI<}#75%3?RwBhJ5>D0^X3yzK2v??YI zi0zKZPIaYT(DxEy4r6PI>B*!&YV@T}}sJ=iuRx%Uyba&jQQD(k+2w#r#@X zjt5Qp#}j#T5pE_h&Iu-twQHk2ftbTEx#t;yZ>t>o?871{S%ptUV&*FcoE9|^5$YG?ukTrn;kRfsdR1Emfkje>*dr~cbn~srq``@{C7`5 zpDq!AZ+@szi!aSMp2+L2z1ah-m+hCqoh!-jBuo1FmuAn@6R&XrA`{i;{3fyFThG(BzCt&4xxsZfi&eMqB3!m|8!^1btoyY!@n zVD)OVs-ksX=Pfjy)jd`)0JXb1IK|rfruht*%{cyAy6ws>k9N;w-I4ox%PU^lHIN&o zO_a*rm&$Tx(PGKwPy>S-o}Im6$tc9u*4hSh{?6wPDy>+@SgqWNQln{E@Q%7uz`YV_ z*KOUhD^cOIhbXj4_D^oBorGS7V+=6?4A}?=tC)%ZJ_E&sRUnf##AGi!+zz?hjv)ld zmxJ;7!t7FNRciHlTXIfi(tlilAC2RG>?No1zV-h#59`$nul*L+#N~aCr>66|;WbRe z|04h6;09CK`qHQu1#c1Xx@wdO@kQ+b=ruVZQj}M^ZJkJOts64iIDP(A&cYb83cDEV z%CkqdY4sN*TD;vZ%W96oWo;CPKM)SEiMpR+ z$O;(3h}fBI>=G;Dy7@oFl%(WRvN;Y(=yz}|F<|S@?*Hi_`+yGSx*3cKC zpx3b`hc`{}&oDsRpof@J#SZC=z*?C$H3~Zw3-xw>NJkNxp31$Zd>Dvtxz_grVOzSY zP-#ixoozJWo)2M2UmB=5acXRw(k*MqcD9w3o7W{`2xiv#mn?(%X%Jt2fzCk~cX zIKF4ojcyT%zS-$`79M9^!TF@ab;TLzEHW8$nM{~xlCV%ZJRB|bs6t#!*3nX9RT#*Z zTEgNomO-cRZ^K+(lo$Xof&O+y8wm1JD^O3t51YRH0kj2d0Yn!5XAUp6Pco>;KI)f&JGLsLZSph*pUf^F;#Po++jv&P2F&ms*!s$q zC5(UL=|(CoUMr#nETs$5K@1kc-ci^El-L4Jha?!YoQ6@c`8H$oSS^%Z{F5WkSCibS z;kS$HGzU+`;%S${7$bt2b6SUK%!B#L#R(45wefeHk?Qwzv0$^V6=HV8?i(>7)RR=x zzkQf%e9cxu4$=Yn<>rrmYqcL)`5_DiPLZPiFc-qa?rdIlw4<1Y5w)+i;i{nw*-)S? zrw9ucNLVLtm7QnF;#f`JJf-FT&Q$fJdBpz4$%$Y@>2i1VM4C?NF3^b|yS`op)5>+7^ z`i+<~mP;2a<|TtCQ|BsGOJ~}(-(l1Kp^dB>k099{tB~Ehl(7y4o&)ZR!7Xjj8z|1( zuMn_^Q$g`nFHL3tBF6P-5W7apPGV=SJ$bOHySuN4u^ao{o5QYZ3<4xt7l5jCMsbOr zHm^I#9}NIHnFCk2fP-KUWIzJy05aeJ)sG2qz!F3SNHA(3{T>3hoc;_?wWRqBpMB)q z;$4Bck3pjSM-s)Bn|6kr%gjDss*U3_ky_?O@dKLJQ)4(eBKUBsV9 z`D6kiiwdVp$Bu;3>&j4$INb8}AfDrPymK49{_0 z1KEJ-i}2h!ujtGl0|UA1-$$f@W^x?tFU&b2xAm=gxxwi?<#Rv(3XS0@|D%mFl+2TE zsbf8y%u`-ZEeeR>iJ!{mId(FXdskmaHt=`zbmP!D-g?MbL(Wgq%8B7Aru3qE^L{wF zWUdF0<&5gkiRHM5yh!Ij7%^~r9E`6cd;HW_WPGKecFKP6w)#* zK!p3cCrcP@LL|ftW_R-rs~XJIWP>(yMftPBbTB;)=GMZ<<>?7&UCKJ1PScOVbeAcC zXHK|+?T<*EElB_U+`wtdYLwpF2P3VSS#1Jzkx`&Cdbu>-A(C0cu`P$iio?$3LA+NK z&1B1{d6ACIm5yYpe?NeE@BH?bhPw43ab>nb)DEoLVT?>!3s1!8BAyPA%m_=|fsida z&Tn0>oTpQfbk?he7)|L;%G0yv==?6P&*#T;G{Fz zB?J>;y<%#Hk7No4J$2MF#8ZC`0b@2r`E+G|siApokruOi>Y*`O4icP>M~6g3IQ?R1 zCr3XMFNokJ8HJrNwwFg+>O3pBW8g*69Od+X)gv zDDMOTKRVd{0G3y;1DW!$BrrQcl!fM;nwMZ5#|VcvmS*6<$sGC9?83nu`4*T#Xhc{} zlnw^6o=hDnDG{>fz;sWmo73qc!E#30eGp%G1!=dNXD3Qo_$%glsK3guo zAl>;YcYOOGLQH$e>R)kimE;S^Dv%3lC7gWx%Sqhu@+?m7 z5yhs+5iZBUhV##Y^|UjAmUnj2+V|lGI$Z+Rn>2G32<d-J4*k`4N`=B5v(>Xgk-n|}7R?w>sk1Mst{`AKkvEL-nk zrff_IK9ypiSu`_MQAxvGa;k-htPRw?X&)yWAa>AKU8;|kN^VEXA$CN`A-2d<53Jl% z0GmY&muuVpqq-E?Ja*IIGaf7ncXs&9eAy zw3K2%NJK^+(l4Nu0RS_(G(J?9S^siYEEJliZ3y4D?0c-5?)j9r5&dtmc!t)~bVth~ zuFZnm0E?SCj`r7g)ESEIICtch8!jJg7aP^C$OGN->~f%0M6xCDZoK=Ir~_k<3S!^g zEciG>O^euLX9Fkhlsi$^zwta2bIIXI+5M(lc$nM1T0TnyP?B)gseJ$g20Y;9ymds7Sp2@Y?*R+dE*rg zLxfQF8ya@xe!XQJq>~Y1T7)scr8HRoeELjHlhPBA2kBQ+(NG}uN|}GFb<7~CEQcXe zA%CP+;`MV6RDXN*QHlfBXI`@*o{#n2$wVnfH?v z^c{l=cQ831OuR(jf?Favz*{mobZBxZ z3PlDsKv@=+Oj!=*vK$ZJmqCe#7dO<2;&lW-&63-OhwsD?TXIi<&TTTV%z7=lXsIc- z*oK?D)P zF;f%RS<}U4#5w0po>t+rZ#IS>y_(c`oh#INb-OTDuNVGmX5&}S&=vPxYCTy-VAD4N zQT#IX(fETYzhA$;A7Bpv3Or>}vmIAp?RqjFwwYq7hto+zhqxI-B6+Gd^gowh7BwQ8 zN5dZqOs)N;4^|~(OB$>2GBSv*8oUbrp5gcDM5pMird#Numxi37r z@Vz5$DHnlea~o#i_rzf_bF|kZe2QR1i;qf*22Q(*9b18uT^EM@X+#7~T7mv_8!o)_ zEeT?^IEJFPZ5U`h2^m?#ZzOlHIbgE-`}|I;Eu?OHhF7(602NzNEYPB3ABuIUBkW7i zyx31P2@!GhaM(4tEx0veCtnRR#Ok^ix(??^Qni-z#gcnCIP-VynCJy_hA+lCiiz0Q z==)V+>K@ECYE?}3Z$6`@)T&8(p-VN@qxRT~2X42wr8K&|i|Csjz_#I0Ya6X?3YdCm z7w$=D7e?H<0?fmPb9}-|NutNTQ!O7c;BN)jrapX;?eyXl{gO-I*nUIU%hDf)s)-)P zA)@M|kDd#{Bp!h4K{Q9S=0bxdu_ZXBGuPS1*e2#s6i?F5I(kwj<3Q?c^eiTh6GjeADE8^zoKa9!7eZ(lo9@!NG#R9!4Itp$rg z+jB#Q&JfyE!|uLhQnszFILEevtvKt4jo_Of{8CM$b++O?#t|+TV{WKYUmdoC!-h%D z@|XsB$@+Hr$@&NqkH0x}B+w?JL2HwFT^a+g8}YC?c;Ydaz{%nLvWZ?@8f6 zY#;`p!wO~5b9eN+U1JC*t`A{N{<<~w2Q0=~gP3f1xDNp)SaL+y+lYLpp7*Uec;*jY z^G+~|#oW)QQEb_>>GxFE=(*vOS!bddL@So`gE-y5Y6Ts(fQSt|V7BGTI=jpt+x{+x+D{AL z!MvEGp>-drQ+z5IW(rr2nsruoL-IKgnIld}3ejErkJj*Jf9CC!I3nT2*Qn^6Qe^+3 ztIZF)TcV6K@`9x@hL*bVJ$7urWMVbW;egt&1s9t#$X(x2Q1VLK*~Hw*(S%b&?tDc7 zG;p!^Ize&0&T;c$ovdmRGR<=-BvcQx=PPMKF-z}|-DT!cLo|0oCpz8N;KG^kh6Jpz zTu-`&5Ac5PeB^pHY9zA?#c+nrZBik(=~||1@wEwa!u3IE!*j zMODS!%tE4Ljg!m~-pJYo5huT^ip_)ormcU>bHhbh8mMQ|kD(U@!BWNA%aT^FJa;;3 zH|t**4Ruq*ej*(HA`|R;JvR*l`De}6BwQ_AVW!bfMh=nRh?iJ4f-t+>9Cy{+T#3%< zWn5dJJ9cjHEAbO4lNb0`h#T$HL1(8Po@0y0`V?ki%Tp(@c6Z-zvhW8CdM^XOkMQ^) z;+gjA(1o>>;m5%iiqOMOCph|M0lp&`$1dWxKr%DAiw#U z1_=_`sP9dicH3wJ_i7j&yIZL$=94zw+WM+i&j*oe#+ovtR0o2=FPA_*x9z}yk6}8u z?bmHvwO*eb=Aen(Lzewd+_J|xibzsW1Jda0FS88L60{up{_x8T%(BW1tPXkeH1{0= zw06An?mSm~Wg^+!ANUxJ+M2O=G@98A+zE4r78MzKj=yGKjO`4-l}3a)brcL3NV^)% z5Q-gbepO-2k@1>B1AMO*Rfq9Lax`P@yK;WqK5#X$ZOMCOiFXj)9i6;hq49h4jq>L_ zw{ZNB8>?Ty4q2G$|5X&2+2bJs_{XcgnqY^lOx#jy__s-Vv>O*PX_&r?f16vn*F?Qu z%;lS6>bk3N{pFG$51Uk_*tg7*Lo#1|$-uGzg(XCGj=;wJH4yfZBctbJC)maYq^10W zdYyPe#=|f<0gttUk^bvwnv_U)yU8~3hB5AC!jbJ!`Z8WMXOVU^z zl7)0%r3+1zuYtnw57dRjGy*hPB3S$GD%IBRG=@1*nMzpusJS>jxD(A8<@208AQ5G3 zQvPzm!%b1otZfft{rr|pDijh;%b=o7gLMoBRX0rLx2*op3#?dS5}#S z2w`m5?reR0X}8w@c(oyA*sA4zS5a_!d|gOwlo>>VY1reIv6O!HV?l}idQ$t)iKMK2 zPVo8)b`X8=Xrt_x{Ni);`yVe>gr~#{`RA^MLiKNNq?~>}^-V9PkecjJTre#>xizBS zx~IIkFewCZnnkUi_*S@^($Bhk*03o>BR>d7lIo>Ox!(q)_@wA$%%e5sp>jRR^*V%r zqeloJxB4HbOrrECbH@^?FCs!BTVL3AGHv?BI8fJIt=PRH;ZBWr9)mTx7+)P5l7wXi zMTFnItt)+@E~zREP1@5_n0^?&9DPB6FqGs&XKTlbepv)qn4zmzk^gT7w@d1g?n2qy zT02i6{ofhrw{?wksuHl0-h>}EcDi66VOnUwl87abLQ!;jp_{z+HS975DYyFSy^!cec@RNn@NR zRk!H^G;@z_S}S@!W=TC-vLHIwt$O13O?KnQ6C?v|)|$=o#EJYKk(jgRN=RuAmb zOk6x(HU>{3H|~$Qr6V>ldhK>w)#-rPXV(J&2)+V@_FvMwB~>CSH!fIoMjy&ZoPnZV zdjVsy<>RFbklcc7LM0aWlc~hk@L4 z=8Mb`UH$ffvqNI*$;p1}Crc+wCsNfEd)4QNqGB6oSx5aAy^@TX2ViG0t;cq5#|ao> z56h5jJYlY_L{~Rm=^pa}!Y?k5Jvy!2SR@8WvoDqjTS=SGokz)JJLxT$%*?P+Dz>W| z-Nv;%2l+~e{06OT?M;Lj5;ea#kVfHA)f1}N*zD+XF!%Aikj;z$K*5r0&Vv&ZL}gg_ z?%r|LotZy?jkL=q#bUisP&%<=2k1?7X)?BM453B5N}PjL4pjc+o4vuV&5t8RSCbOA z^lWKj-?ZM}O;^I7$H@zwI5Br~fPId@^m?r_>5?rm_G(Zua>AZ0<`AcFakJ)Q<=mz5 zH~%jalJElRrSl~ZMe38=fkEOHg1S>*-<0NgytgR!669GP1K$5SlYcXzx(UQvzg@Fv z$uPCFcT~0@Y<*|sx|KHu;}vg9`=UUqdXOfLgC1ExoBE9t-=w$jNVd1SPNNhl=mEu= z+5cMPm9<~d&d^E*r{#pB{K1XD%2}0HB5_1s+Vs(FlAG(mW*F&I&Nc9(;L3S2NLclp z^5iv!{F<&VOM7O6C9Lelk$(v<7!~%y0NwxjZcE5f3-B8n;7J?8BIHi6VVfBqw50S? zLBV#-t{Vxb8LGnRc03mU%;^XueeWotSK1BxjT7*LGn;us6xUemdk0|2rC!#nEe0@XwTTqLWd5n*_ZG(5;V48pZ&n)SV!GX>pXc?&!TLi+s##!)6 zDaq_D%5Wak-GU^pvCj8(UT3H(k87;^y~C1TDanc&rIJxRD^D<+O=;7{L;6rW`lJF| z!X^^4Cyho2DgSgC_@3Qp35!M^A_(0lKBcO5k06>V+EJYDN=@v>gFbPh&(z@{X)4e- zn5L1r7`c;b)x}9@YLMFB+4ur|FMmpEtDvv5%HVKmf}jF@DOE z4u1DBBjd8WI|-v(BdM<>lE8E_J^#CuL4Fsw0s4Dp7hW)s&e$Q35A#O?re8) zKPJ&ffNXC=5sp|MLjr4(*3ElUC^>T-%8 zjQw@Muj{|FOUW;XpRvD^K_{T``@*i&o7ycijSTz;4#tfyoFn}gA090 z(svUO=HpSMM$+o@G5$s_i~-;8Bm7Rp{hbJNY^FdgdDI82p*LVfI9Kz`G$N>kF((&C zhcEB}abW#Kgq;-jCIWwgJDL4C+FV&`|r*P5xDpC?kQ$QCz*Id1Ixw>v3!+fho$7& za|^P>?kRSkZP-c=t!mPmhZ|J<=h*2)5%$H`HV#CHH|YEffX639yzm6{fqhbf#ckew zjdItnXd~xTL)D!xy{(?iBnmfwdl~Op-H)n;8N-H=>a)5zPBN|yEo{WnuhSuaEcqf+ z9JlN$OZly9(t3v*PV18IgVSF{?m(McDskjP<1I6vI@!r^diFIu|1z`}tgS)$*~96H<3q*B^2B-rE_3`aGAHi^rZ^u*}U-MI32OeGq$QrgM3rpm$*7< z^!T%J@=fXBF-=b_#zpUn=1IGXsn>ya5F_sQiG53H^4^=6!tY;45vNiPAF?OzT+^KV z3RlcqB17#rogjtL)uHQYg`Cl`nCYaywjBbb`!Qn(!*BaAP1;AJ6&hr)JiLBjG-KHN z^XG*EMM}-s+lV^zKeV-ww6v#+Mz|r$`I7}Bt8*|jMj4~~?Z*rpE4ig3rRJM#d9L8e zg7EqQ>4>#Ym7J-NiKOH)V;|OSb>zfGkH<$=gbzZKLCUQKm;y5({M_bJ!BqEO9=m*) zE=dkHuELJ3Zm0DWr@}{_TNF!3HCe6Y!xrNJF%4I$jPJa}R)H*WF^f>Av3p=z%KmMR zqQhq_D&=1C9_zbcPW(a^0`%nQ_>6_z6SHI$zw3%USP)bGVVEWh-RWmU#ZqAF5H56y*3 z0+*38Z+I2bHZ-csM^up>J{BpRblA1<%`rHWfWkDaH0t82 zPPjeqKb2M_>F8m!$^t^1=QO!$&t@%2`*2?V33B_5$d$8RAVs5tRaYb2^2hKbm?JL+ zUJiX4%oWL>S4Q|+mM>*7Q<9c;c9XR`3CQa_KW*Vylt3pHLNQ0(@@Zo?2-F_L&9~#o zp^E+FtIAt1LvS0l7xb{YkALm6OSI-!Q#%vne3BI8YwsH*=bVJ3;cSIqNL#Gh>mgeD- zJw*=8z5{PwT~Bp?DPqOhAEm%HX?&rS%7%k%w13_oI$t9$YsE>tY%lu8`3JY>@y{Cm z&gn;)0_fTo*K>jigpCA;3TeI8cEF4hVjpr_s_&1fZwTM4*izo&ja`Xo8?hb7=Pf6z zQt!kFscfc5S@j8NP3c ze=l;{Z1%(dYpeWY7|oesc%=|9*l zH(IOXU+*y3{Y9ZxXXx5;P@?u@4GD%@+1BZ}^7|l$L^B?=Yw^L))jOK#Q?2Zy6>7YC zwyp^}MuArsze(FZC)ZBJxq7Cr55MI^xV03vg#T$LF+wz%;;Q!J71~9km*<0yxD}@| z2V(z+(1@?;liQb)rLNBx-=n$#AGtUI-J+qWoyi__SNY*~yl=tyv4ob{f=gFJdCo~T zmN1ser1kH%g=gNZIq0&aY`tQ4oNu#d-!D4u_YP5akY|rIV&kvp%V9Zb!DrD(Y)uRn`8!2S!JYGNcOEi4UKz!qNz8N)PPaVXP z$cxT=-PQlOW=9TgtyO0E&1KPWsGUs8?qL1MGeSUydyi+UW8uxT)4up^!_FsNu+YIp zFx@N!va^GB*Z3~176~Q@(5{?I=PK9cl-O`P6~GI;)KO2QzNRCWVp~?@NgJ=JzP2bU&yC57y7Od_KXF~mEitn+YS!9pBu`~c zYWwAUw;(aCSgMJ4iDbv0{kzw zLy!@nxf^Y$zXs@X+xT%{-M8456|U2zMp8T7!R$C67m^GsOx$b3v8LCB`zpNLEL5y7 zKj$hKV!P^}0D8YH@SBd^N*e{=KXNniV-8+Dh)vfpdul2}7E{1?b&}S0)`t2Y@6Dc% zF=LHa|bUG8>mqhL?^7nc?_UQyMQx$2yI_5l^m)eFroCM*6QD{`mpb z42N6}_UDHvcI2pcM}MUmH8jqnbJ!mNGK--G`T{P=G3v-2B%zd7AQw50!60m{E+q_gkwjQ_kmEQ-Fa z8M0%rklm4Gc-7OJ)9M?KycIjTn680(k`-D50j+bh z=8QZ9Ij3}vgO17@!uzDa?##=uZz&h& z{K_-SFD!|NoL#P4h_Z|r9lqL6*AnE*T%`w-ABtmvu;GQ_VE`PF)%SA^ekJ`0Kb*+G z-bk>kJ|I`}ukh|fU^aCB07TeKA17@5RG1235Cawn6}}I4ii*r^*p4g)CPoO1$sp7T%&39|NK??W$@mb z!9cxGg8(nz)qGN@U5J-Efa@>!6|9gCnm7OL9?$6oe*22$ghfm3;VM4J3uYA`3=I-V zAAQ@HK##C(OjwTLM-?;rXM!c3Zfm_Sdk zf0%6d@x8rZc56*efD~@4X^GU9+#LPamxE!?US*i+psu}TGDtX-nGYr5dq1x&B5NBQ z<6{D@7|&t1wn{Z9~J;)RdPGe!M(3w zjy{pY&_;RVN-LtgAxFT8f-T%NyhwS73#hsq_N4P&xZD=RGXtz$n?pl_cl1Z9C7j+G zn<~Lva8WJy)KjrO=}MwSUWaKwj>rmZNgZw}piK)4gpA@14=;QUOMV1Pp2mlO1+^gm zwZKB7!LYlFwBFtz)0#A>M&sQ8k`4t)SAw`lu0;H3yq#dmx!h6I#bN%VQ@})dgJuCF z3xf+!lwDW@;M{#OpCDsDR#P)TXg)v)wgUpQ78ye4$XL#Fk0)0?%BtRv+yDtBe{DRA zzZLdw7C+!9RT7I1z^$PMv3~@rqyhM!t#)|$iHZ-z@9m?P-B+1e8urH~QrDHHQ+L+5 z7Y}_=)D5FJNe5 zx6pjI5bS!!!7A>$_g|Lu;{mj1+hVoZuS1rIVHlX)5~V_3!5pqbV9p|;>57k3uor?p zt{H!tGNvkB=b0!Msz!Xl@()!C50hD~VBn4z{|kJcr|*Q9O(ZICGHn^;Hzp97v<;4A zfUOk7eF6u2ZAu8uO9)Yd+{o{-asC?M#f5ycAuwZ+-n&wYmpQtZIgIyXl=ou{_t;oZ z;1I8>(Ekrb`jU$L{;Hj*&jWI)dwKAYx~%AOp&@Y3Rp{so1m<@n1LJXAo*?d9b4@^5 zLijL8_mJw%b@ZVIzPF=~Mk49K`0tiok2h@72nM?3e*>oyvG2d`+BcA;Jw|?$Wm|#y zN9k1RUY88&ZN?r-2qJg!M%{v?J&fW0I?`Rwkyy{sTqoYSPx8@N zc`FEu^Y=(jxks<)a<2X4a|T3lL5+#GyFA|`*V#K~^hwi!uc1yKBE5e~A$#+SM8SQC zgvO$NN(qlsk?$$_5_-SEg!L-~u;z z)n;h7kAxCt+G#u5H!)NMb{3I!L8tw2&peuujU_?KcST1t`p{7aIsw8{#sik9tJ}qX zZv}BgkK-$W3}QlNt<~Ng&W(%u(OWbLf#sQ-v!<3ve51(rdqKp52Z90j93!e-cO*n! z0>%>yGCSLY2z#K-fzb);*l#U!L~n6JchRuCA=0O=mpU6((3#F4^O!|vx!1rI0_PaH zb}qP_cw?u2I)VgbJWf3uak|PO@Ws5 zY*^kNM!49?-p0vZ;r$Iz0l6?8=o93`;*p^AY@=LR1O%vHk>eeTLPkX)Orj9DtVo|f zJ10B7JRmwSA6^@WSJSUEL-GqAe0MOCFoNFphVHguc~4|Jkr2l22O<11I$0IPu2TDB zhM&Hm0?@7pnxo*dqu?K9(j@#6IN0UtWV>8Z|Hq*a4A-XIfibzQT7afJbk7)p8Vzd4M6Po*@v5O)SQFI!4 zH!;C&mSLY~W1p8`vuYsr*%FeU5K+K|M`cO&2~&N|#Ku^W?}Ih+O$6WZe2>~t_K!*k z5UsaN0)I}#ChQAF`zkJPY6PNIWISZ0q#}%-kOw1U!Kz@ps$;vVVY@0}6BY!csfY*C zt(*P`eX0Up!Qx`O;$t^%@bkaY!fO*2|H?#p&Pd6Mg-sY79Hxf&Z61R44VD&m5{u9@ z7>!*#kcjexh|(E78XrB{1U=d(uuoBJQ&;S3CI#yxRwMMPbchKiEJgcDPEnDFb;pCO zlpc#U;o@_b?f^IURvZQ=8-%PRFAlv!5r;-aaDeQ?f2LLXj*5@LtRI6bq=TVpP+sdw zun|;1lZBC$oRF2g{db`cAEC<(;xbVTFjAmIVIfEd`%WXFXh3L$MR4l`6+>{jp0NDB zc3VGFAo`$WAEIPCASk^?P%=hP^7f@s6gfOPYbU6Ie8GZpp#}rb%*-pm2NquZ3^tpe zntZ?>_R9*PEv1hxe_XcMm^iGF=Dffaatk@bXZ?3?{%$Y~uVQosa5KqJR4|RyF^$wP zjg&AE3W8uK#eDX&Kv#-RSAQHQ4QUQh0~-$bY1ZgFJh}OY7Rrr?X1By(&a*&wiht-t zV2a@pN^o%NWE7$Ib^yo}R1{QE95g;9ra3A0V@eEWKTG(kytY@0Dia3EY5OljDGn|< zSqMJn7SEYt`YX(*$Y{&KKqGuC1aPn@IW_qug9vyNzKV(XHSAy@LK7RqYT9R?6SP4_ ziU9_S0m}a!t!FRB>~`(W93%{?oMJLLDE$~1xj21u$)AN8jMRjWZG?}F5F89EE-pe3 zMkpc2E%#MiMG>VC2E&74%E;q95waZ6m0qJO8KWz;p@{m>gWcUd_+dr8|Bw9#MHG6@ zT>hQ)Egs~vP;;NdfBWt2L8B;$3v=h={Rr9%qV&ds$AZPhGQtP2j9z0IVPo~qFy4E6 z@1E>XYJn)g|vp%1U{y-Osu|aqQkaT7XA;WFCa<( z?9Yo5oyXir{a}5%h}GQnU5U=R&_L|qz_Z0rKbLGgMC^h<0J>q9@rA9Hu7jsZB@3X1 za)dz#SA<3x0K@p4EM_XatQ`3A9Dg9^W9Xw&lXIW*@@^I_7$H!WH>K{JQ@xV z>=H4lG~5Z=EqbsAg0LT33>Ig|B&)8OeOK_qR&Njtg@xE~YN2|i8v*_mGwfBlewRdH zBajkma{Az#^MpZRd-VBl7HAARBnZ3d3(3D84e80>?0j5u ztQ&5j=AGT@1OuC$;Aw~?4Mej18M>pGR9XOmkK11$kGEfk`q{n4+@K_rBqzHLt)qD> zjU>z$28Hbtw5tEIi0(1_UImSP46;kapo;nj9jFJVzgWBP1TPCltR8KEXCOVEPoEFx zKkHO=a$5vpmk9m!VG|h%ND3oCHTe0z@Q0Rhq1^gU5V=r^i*P(1dHe)!^;EyMOX~4V`aGIP`c6N|Z?l+nQq~ zHSG;OLWu%35sH?z@9WkYh!b%aRR453u9Pj5yuJxxV|;L*yACuSY;3TbLuSzH?m?*2 zxkh7iV+QC6yXp_$zb@WupA_6XbEp;)T!7T*CJLQb2sDeHt5-e|1-rJCTFtiA6lYju zTFqj0bhl9T;JD)JtQZE=_l#jT+gQE|N~#SZ6;w&FdU$PYQ#{2P-1u0RB-eX#y^-kb z+Xts3UqtnC*A039iId?%onvnyUFz=P<1%8IZV^zeavo@Rc`6Xo^gH#WzN_Xc**SW% zbf0WFHioOp@Z=jU-%5P+fgx3)CFTy2;-@*uvTKT|HR}wa*1GcD-iF=183()V<73JS zt_cb2gK$*487ri~ZL**r$KAyzsYg#owzE<_Yt@kkz1K{O@#p%Rr%c~&@p&Er@*tt- zus9&gTCtx;X2S1_i)qpQgnszv<=KhzBV1Mz69tN#2a!}v>&{AN&L=ZIu}|6%Z9w9} zI;Eic#!`EJ@_39>*}hR+o=@Iu_?<9BD$jG!6t&yX5`1a*GuNwk!0aN!c2+P%89QC> zBX$|5X6UKqLddD5ZisDlcP@A|uNpksa|iI~a=stktFThut#tH~SC?%DV+N|J`#1h_ z@82mK5AEFZY7TRFf3UT^EBx!Dr<4@Jf&eSZ(psGojyrzjx+_`_O+{}ea;?afgbU|; ziMn}HPx(Zv1N#O`9dq02r32U(%LQ|2q3IJw3l(ib3pGUi+B-yxvYz5L`hJNv9)R>> zv8euW1>I$-Kp7(B?=a1>#pxRKnOfEK>PYRY3aCFWL<{oEW*q+6?Y<2uAJ*H#N$YTr z5ksuWDz@Ae%i*c-KRg8MEUJlWuyMkZ9hO~&qdz~%#pqQ+daI%rWco@4t>4U!uzln2 zC=lAK_!(38#HH}ASji;tp$en|WV~nyA%0}G+F`JF+; zXFr)*)KPeiZ&JMHJj4=%LWJ{|&$2bZl%!)489Ml~5rlinsc zPX^BB+aFdn>YglnxMUaov^M4n-EQEyep=^Dozu?`LR*+_4(TtxM-QbCz>4ZlBXX?O z;kh-oHEbItxt?UlL#%q-thIPYE06QY-cIkpCy#c=G0^_FSnFgXd$akA>*$Y;O@Zp~ zsR#z0qvmqz!G}m)mIrMt@pje91!31a_`oJ<$;J7px=Koecb@yo{CDk7&CV9NTKyV- zZnkTd7&sozpIZ6_)2A$k0WtIDkMu#*Q#~>cv7=LY!!&xtIXP-pwk~yNjfF#+Mh+*3 zh5Xz1XBVN7fnGmDlfBxp^^QjvG2DrDo32~x`kb1b2zH|Tdw zKO9c6ATy`_lr}hm2K2NAbePZmuqymyK`hduPb#qZ>y=1V&ie)iXLI#Z_;!cXr|0gt z0k}^qis zG{i;!&S$`-@z1VQBbGV7<8SECM0Q2(goMorbf9j=J}7vb0trYxmJVXx`4-eI$ca(u ziH6i+v2`aorg1Qo`pN9rA>C~v4tXM9ZNE`{*w^rqP|edNE6&lpie}C{{4TNgOL093Z`K`33im`sA<|@9#QU{fr z!wMmF9(qpZ8i3cf#@`S~Aoegbtxi{>ts%t>15eYiWwk?7bfs`*1%#wmTMG8ynPQU< zJOnsW59xn#lC+3gbSBW(@t4>mI-)OaCAK|4Qoi{^cqc@MZ z9198g(6rLu1JkbI@jvFHaE9?n##Gv`>^(2BidMA%cMtaQd)z5!TNK-Q`nv53WL7k~ zI!-Vuq7;HU(nT|hJWu0!=p;%(zrt~0=C4go7Ovj#c}O$!NS9Q%?5+53{GZ`(Cp_dB$GSrosxnVPXkH$(T)`Gh+a zaA3j^=5gj*z4EaG9l_0JK8A+Y#SW7x!Q$q9ukjlzON5psEW~J4qSzl;^8>$XmOff*2Lsg{T6qimvhsf zH0F>^axd-UA+q3jAxN&G!8wsCmUB4Y>|aCdesmZOm-P&04>#}%p6p*U_tW29a~e|( zskKv$wUIgFw6PPUz1T$pInDHW0dJ!1Mqc`|pLO=UohqT1Qr z8H@P#xm8%!4-x^~wOSnbnR6?6DWQ1;rAE{68vB;U(7|PS{MKe6#&O+I(s#+BBn}PK zq&=ylq(l$9+>_TzBm^(216;*e{fvhb#X$D?dy{tiJGGd#yR($st_%9hIYhG7__*8T zf!b6YgF|Aov1lN7_D03aWwEaPCkcd1)K z%OVoBZ`u-4pW`Rk1AV^C(0AWc;(YASGzaOZUL)f6Z1tZQGL5sHRKu%dwR8uotG|wV z7)vwrF(oll(}uD2Ah9sJkU`K+b)7P_*qf4R+8{1J&rEQ3))ihD@p+qG{o+TDkHA#+ zRD=`BdK`{4DAmtK3Xlr;#WlW0&0XyOmeq`5#UWAZ^i3l`&m+#9dZ+Aq+L2NDTeb2x z9d{$XM7G@deq>*r=2O}!`E=?jEt#J>M~hkWGU4h)X*Atxp-rC-H~n?PbNdFTMW5DU@D+D+i|EEo%Smt>_c(QD1&J z>F7_*?`I$5Raf5^x+_?f_St)>Ss-TAOBCxfwgAYM+ib9R|BE(ld4rIJ{o6w27W~_5@N^^`}Sz5;$U)m|(BsmhE z3F`8x#MJdWV|st`4S_8w@4tgC!FOJ!0&uBUSD%-~ajDd2#yRIU^%FMD z@e()1Z1}|-YD-UzXOa{JstLwHzvD>HzPZ1p`|RpntfWDE!q8If@S%n2gIn~5TWONn zl;Ta~T7jC}Qlz;B=1yQIx_>p+0hM8mBfPSun2tQ90$OconGQi+aZxEQ*73EuMQ)%) zfutR+44@OlFyFa&(bwE(C-@0OdQC9!FfMGgAi(uYJ!#tUhnELhOigPlq>IJ~YoS*j z<5SNer$6%qm#S7PF$lNA3ysI_pAdGuLlpn2YsAv7kos;efm@! z=T!4k-8Ck!>L4Sh%AHDL=+%$ytTC?oR>aK!SAcpxc90<7GE_&>sWDgMQJ$VbNq|Gj zgEZQ4?bV%Tbo2fqmYxVg~+>V;g@1xIY-o@VdBdOv{?Uut@#T zvUdAXStZR4SNrTtyJlxFJJIv;u2hwj|!ba@rj5*GKalHT3;W4B%65}cQn;Sja z2B58Dlk9$VmUu%)e`%j_{L3oK=bfpB zq1c-Xy;lt9=rbnxljTUPePllL zd$hz+*|9`X7_oyYx*Cqw__*>@3>6Q&<;z`Otm|MNEGthe#Sk|P zYpmALFJPK`fBi%uAGb<-bLDh79c<;|`7M-#f&qvdr3>65_NwVCmGngt%+@}2w<+QL zVQl$H`oe6A#c1Aq_?)zFIrEq#p@@g1ZrWh)FZ>fY)1ueOq+6IbdXpG?4@f^!P1q!oS zoaepb#44q=R4FA#uQJKKPA%OZX2NR*+;J4(U=X4*7)vRKJ8vr7fBK-Qm=&Q-`Ui{t z3FR;Vn_=(^+eW;(-3*-#36_<<9ie>l{f+57YBUvcZxn~Rqn`@N5hZRgJLP2Lt>n|= z(RZut*sM_!AnA#2PjC9rrv&d>Wm@lIer=(;2#1@l+WSx5XsJYE%sZ_s=63jJib_ zlJOc)P?bO%g(IA;IHmVs21?r&gx9-Rfs=ZDI=QyrdhWfe_hIvpw7q>l%LdF~pq-yl zADAi^7}n@=`#fa6KbRD_Zv_f+I{{&UX+UpbFwC^Q#pcOYNw#jFUajD4rRU*D3M^5f z5=0VXfL4UW{nHxCLRdZTMYFxDgs(d%UqG+zdHwFeNP82eVwh8Kw(f1`AtD2z6Mh0Y zTxuLgBe_L@Kz#K~(|uXf4h$-$hD%!qU=k2Od_jg9liP%J+em)$JM^5|^lQrf?Nq{K zZ(Yo^i>#{_N=_Pr1N3ub2tVO_J`US_UpeX3oEtN*J1bV^z|>7p86LXGv_(OS5r=Yv4Wr9X8(j6+J-zipZ9OA=X41e1Q zH7H8nwpj6yNWRAO#q9@(mrLB#hTieI6!g2NclN`0sypg9O0nuoLVbw3l!4o;92m;c zK!unGg~LDYb0$w8Z7G-DPUFuH(mCj@tl#L?(G-C) znM3inkJ7W!152wYKh&iCj$wO%pWUgSR?oltIh3&@!|923o$=|?(DJ-dQcfCZGl`$T zf96g7(r=(ewYDh(OXZFl_2U+x%;RMQWTM(Yv)|9$r5(uqev{@1SJV1$`b&EoGyDA( zbr4qO=GYBDo2>rIEJxaYH1*m;mA+{L_@xM|%ZEa!?iq=~GfH~?hj}AVrOxoPM33Ak z!%qtywv(=kb#3##u3FK9s2B%dJqqfdA4Kw_@sMO?EJL(YWM)dn^UfTBJ=yFQ`tTt4 zXk)b=s?y(Rjcf}&1}3W#xM@_l(a_r`qlG&)rH&q?51NNLt_i#_agXw$z}p*gZYk5? z0K}-@&mJ(`bQY{t)$gVTqVqZ4Q$_E>PDCcSSyDaa?iR6xkMc;TZqSENm+*nb#$R^` z-$3O&Sw~buKzVsgDAckMw(I1=g{dTv(=Q8Q;GZZkYg#^>% zo3YTA&s=NHb6H=R4&C_4oW?jUuZ`N%Pw(G>eK6z&tcnAIHKxEFTmoDU$+HJqT2#6g=UpVjQ5gS9b|Q1 znZ_HO+NJ`R2oJz@$uztdOq2&CMj#zIWa3eaHr04n#JY}o??L->K}1F$@%6cc1OGwA z@8>ky=h;lPnXhDpsD2hHMR>s~xM3=|f&Kyf|0?hbZW*5`tWuzxw}M;BXY2sBl1wfF zAoqq)%|iS(l59P0*+hfiYpu}@tl|dxhkuF|EcE_8o(%L4F!4~5$O#+6Pjqh?%>Upc zbK)bzl{rqFIWC~M2cx)0p}6;dif7=I_;mdcxZo00Pz6utNvODosPZk_39(@0y{)Xs zK9Ea&kU1Kw7tR_}i5xs95IhI-4;25ef*m~P8DWIPlR!F*6W!3xykMBLWROH^khEl& z1U0$pbZ8z4&QyqjE8+g(KLw}bkgVen^bg>UL-LslKb=7giXja0zrd-hL-*J8rTA`8 z15hL_ktZEtm$cBm4|<5=tU+St12OZ#GxPOT9gBJ!TIt2 zi0PTLrZ{e-KPP3q7ht`I`3DNtd*D9}oAqAAZ3k&D4I-K&rDDHyIdL<)%Qd@;G&`$> zEq@TSx{HLI4te9^6&&H^{SW^Xz3iNooE%8zUr0el3d>0rKx9u)VEqgKQ!vOp{iIrb zq*gj}pn!Dz3)}uGkhUBE(nb|pb5RB(==MGGnbqU+efvYlh*0mqg3lkIPB6r|6Uu2_gr(dtU>{wkesmLD+f#8<=$YQslrlv*=g(dDKrGpT-1Z~=l?{YCnG$Vd!pGnrLL?7FV zDBq0dG2&E51hPjUuHoLp#K`&6)((C}RrpiMh_K=Ljt;3)>I+(QQJJvkDbE{o5L*9R z7v5Oib2pLf@TksvS#}r(`0sx#Iy&CH=>SZ3J-uzoWBRkX5Zr{Y=_3#i@DX0&-h)PC z*V=k*Zm~~^L-hufPuU0}!$mj)lrULMjvDn?9%*;H5m0E zh%mQUgOC@eI5Fl8e9+cUKlZA1OgPY9Q%a)<6;pP;VlTNhSj~Q9Q9n?^ybE6I@&GkwgCq_N=j-$;DNf`$dXfX0`G4#G0umvrH zMoKD9cV}L7m{Z0pnHK9EP>PGVmP#BGh2w>^4ncixYDz9j>XW8}l_kIz^aIUS4}fwZ zF-bS$&kv%(7a9n1gdFmL$Quyij3c=$cQh?II+aYKGC8(kq^wX>pomN;KY|&-sBGf6 z_b=t$;;5iG%yDu_qPOF3etu?;zr*bkMroA)swdrfW}*@Z5gT5U(P<~a5d73MDzu@H zg!5)BOw}g_>Ft9UWga0Q8HQ?xpAws155EYj#mfV)i*xH;Liqi0F(%>JcT; zSMwv3rE4SPf6TC3)@ca0^eNY<@@eF?S=SVT)Y?sA?onDf5Ve$O{Mk!KL8r=1TT_+@ z!=;qs$)~IWR|BN^)j@Ep(;YT-~R21ysl$VuHG^(6Ng#rrrZ;_;M8gZk;|gs36pD3B?cLI2ct z7HXiOP!g&s=lDt&ngEiDd&e;iRTNH|p5lE@IhR-yuIVwciNAskz!=2)jQgFm^A5|= z8p6DW)Bjd7lW-AN;OZkIQ|N&qQRL$MwQ>4WpA^18fX%0FpodvwQpQ$4_Q3@cLs9`1 zuvct~9_K16l%HVPNnD_Tf6afY*+|-;URUam$OXmH00*ck{7n(_)=X2ds9)8} z_LCSZ-%UW*evWON%#f-oW{%rbGSPS+cUG*zr@ANMZ8}kSdPYjcfF@45x0-DC$s$!Z z$@PeF=auVJ?;77sF>zg-?0jyBAQ_nv9P$D8fhc6_y@nl4^cnv5K-@uh7L&lSy$R6#PfBWUi z*ub{}&+lM$o{)c*6s>gg?RlPzWj4x8GU^$ZVk~&dvljN*xEPV0fXJlcN@1?B-3t{h zQERFoZgIawnbdl!0NKWoKGD3*u|$Av&9OxI^vgoE2mFGkCCb_1mdubMi|b{(Ah#z@ zZU5CKRqe@4F2Gi=hA1-~D?x*BN=rJNdpDEpU>e`;PZ=8X^f{XS#IP?+9*|PDpz}~M^SO_>3hk1 z1@QBirMI`$3}i8`ihjea{oy~1TAI^A48)>+sv97j{8!uE7G!6l(*jrigT!Sr3< z>QU&NT|SWcXL@Dd8RN~345E!HF8yXgDnE5QkHTp}Q+I5PS`@|;_L89rxdr$(zC^RB zRg5UiP)a5tnwsmcLc<#gxgF~230CmzP$2kp0N944O#w53Pna7IzB0L7RyG3f41x>V}?Z>qAZpfON#;s3|4 zpnZ^l6g1QYG~z@<#(j%WA~(Oi>tFtr;zsCEf5u5xki2-QCytOEl}W=64HeDn8W8WL z7}6d_uLXv^|EJat@3gfYmrULQM9(45NcSk&D?lQV4upy*XZFA^fppqDUN8(-szt~r z)j2>l>;-joEci63T&pflA?59QExtbJA-_6xF^7@H$l#>Kkz8RCQ#X*Lz=m@hGt-^3>!J(?AMWimY9pjz9=F~G86w3HS=X7L}i?MVv z8l@xHbp8g9Ev?|#LsZ<7SuS+w^ns=2A4Bk>VVJ+S^QE0&x0y36EId^nq5>z8txbe`DJS%SsBU4-FXL$v&RV}H83#(Y-{Ru0^uc-l?X*~{ zBztO_JhpBeQU54CzF2~_P9&;#ju9GawQU-aBsxyufXioe9!-Z)Jo~v|16e{S^99MI z7%Fb)HSLZ>eyVpUf@y(wehe6jh_Y&qPds$M^jYtsLaaX_71DEJ$j%s(W)zJmx~0ba zY%@}dzFI95eYhrh5D;)-tFn}kOC^GHA=eR!S9$K0dC~Re_3-W2 zPd~B&%9bu~K=?XxUv_1lF5o+ntsO1JswrNAd0QE`A9f>5t}ux{5)2?BzD5`LeZdYx zD6~-nl5EwMD53aW$eesz$ox40Lud@afvBE$MRl#Yp^=uNZU3GdpOE2}iNuCi-eDXj zgce6v-x%vgF+YKwL9$OV5b!SqR)OItRi@aJc>^sl8uT_n2G(ar%rh1L_L<*Kd>U2g8e zRYev^De4y!?SSS{-e^vd_B0bd$wcy}!xHuSm@Mq8DuclhWycBH(qVh2d{rI8#bViD zTc)8K=z!(!DU^5avgfe5Pr7qkm^q|*5*b-fNGMg-*P5M1S?B%hi7&v&6R zEBD`Bx{=6DhM&ICSgP49l~xg--P@B%`d({FT|b*+l>ou0g`i`>C6<9nwUoke71zGM znqxtCJXgt(megl$sTR)%aXZO>{AH6Vhj)E4DgSIQ*_srZBFnq7geff9s5sF?_`EPg zg`t=lX-6|&3-3FA+&u% zCz&Wo(**R$STi*`TTDaEUk2wZDksP6L>JO~<_ZvgwwZ%s{Bsvb8n0gYDWCkF)Og7n zmYioN_8#^XMV(dm0n#yh=GjcyK$SXV^Lp;Wk3CM`uR)jgZ}1xYmk4{yx_ z$6~Eig%oq37AKqBTR3vM&|u|wnTg);-h5hIF@H^dH&B|BKJ&<%joVrkp^*3@ggym2 z%nvMLgydFjVD^G~6C92Gvl@q#LDhWbDc%gW7prYXSKnF5RiGC z_0y$i(J702VQ0#xsrRdr>Zsu2GSHbI`(5Y7)mq2FfzA#II#~T}+fkH|OKkc(y<2`8>ny zwcVX(vc5hs7VH{qjNc>1tx0bDm=f1fb&Q;)8-{c1F}D%Vom^P)nbTm*bA_={iw10r z^XN?_Srig7cRlY{(`hkXsPUKddY55&$#8tdW!82TnTY}(Ba%Y4<6PaURm4B(?2iSi zQVyUv(wD9ovF)n7+_f+xs}!G!TT^?EcqG!pwolORL9f`D#+l@*Kx>+P|FP>#Nu5@@ z__gI?AT%ZaS{7oj`q3ck&jb*_irW>-yMqs9JNh(#;^J$qKTIY^BWtaPZ^q0T zhI0e4!7V;n{5t8Jv?8um-UVUeGc9&(TFd-|D0U$u8}F_TUQwtW81E$IJiVi3VSAjI z8IC>>a#0A;uImjBx4P%^Zc$W~PHR@`5RxA;0xue!oV0|~CKEzi*<|GHazML}(r`P* z;YADcZpY5oqJ@4cOs`ReIBrW;9xg~D?doSSub5J@?|nKA_E!-2Fjq2ykKQ|*Yr+1H zpslXj4cE4Uu1+vR;l3BoRx}6fd;|Wwi+cDRGVMS2I-|KMqqO1Q^oL)ddxD8vwGIl= zK5ALt2K3i(=9l#Kx@helfm1I%yY}SdeUUDFjijN84iydjXno5FhGwoA>ir->T|($a zXpfnRkmZcx$BuCOu7d(KuhUm>|GBR}k-54Zr60@s+|xGp2^y1j-6 zd@|-;XoN-0Y)?BU{ZHM-|5V-%ji9b4j}2k3AC7nK2p8^9ckQ+Af&aKcDaM9Z8Z%?h z9Jj!|+~+_~NS20YboCdoAAc009=Iug65?g#`v@>ThT#5>0q3pRf-7PIiuNQM!u{{U%v$&f;3esZAC-qCB%-p8x&SqH&_{}c|vGBZ(>It-nK?{@(@ zP{$K%a?Wde+1d`=a)|x!nnD)u!M8|o-1&Ixwd&w*KD))`zqftaOgENNZ3u$sI z3{*$F)J9Nf`(D8X{OYG4y|Zgs<(RLS?ul)}Ek)Je3t6K~rz^M6H>+%X$I%uC4{I;C zv;APtYsqbNgU+>O`9FhJQCE9Q z29-j|GJHPn_p_6yeYBHmX{A20J}O@9WbY1(qTX{JA2gs|-flua5b>cH-ZGgx`c{un#eLLSvQy3D2}t*?t`#jHw7;`L`8EBx>su%i6*+lJ zhR=C2>#=v?nA^b@K|NviDKe-`&~baYvqjiIwMdU)zC?75lP%e_*AQH$QXZAS%=#?3 zT#}89NR9kU)7q+~3GIzZlAYOy+gMmqMJ2_c!&nJb(xMGY#Lx9OLsr;lhwa$?zl4#= zZB#;j?BY$pDgnPvgJ5BEqvPtL&y=ebiGdM|GxrZm?0guFs*9l{>cva zE9jt>C}uESmXJ5Nu_8mcv5Z<|VQh+_80LfYD1rlWl+6Qz?vBX6@h4Tzk^rl^Z`}{t zffY!0aM&NGjx)ZAt&kI0fcrB;6gfwl((r1Z=JBPtP8bQNKXR;Ul(z zuO=l={{tjRvgTZ;+3c43F8c3?^23ofB~3^`>$J6ycfpuD{F!bSVNEIgG|Y>XmM*zw?7esE`5QA8{5 z4()SsiU|6$mW4^uT0&^aQK-}r)rI8-kTs}0gOm_PkQ$j;aOhZ~E5x#}^%v>`vQ`)1 zX)Z@(k+K-)4nFL77Yy9RLtw$rff4!;2{ZZ@xg53`{^95bq|KQNp2m#-`p_a{eoKi= zd-U!?vTERle8a^6h3PWGKWf0g=q&(@MA(|pgd|nz_X7b%)I#50z%$3<$d9qdIs_lL z{d+%hp_}AzYT29W>qhaFEiezBK{rU?s`9L6?c84DI4i5YS~m=Ve$0cZV{V9<1r-t$ zGmne3vd!0T##liHfetfIgUS%H7jsI_0;4>^BtDg1K)nxh>JL^g!C-M;qhW@ybsQJF zkiY;Zph<*%KT527fp+K^=GVyIhPRll$6{W6k7i+=p3frwXQO#M{{wF?7;XVLs(2(g zzW5`gLd-Ap@oyw_2ZF(#zXRiHD4~PQW>llEl&Sm&O#atfo4&lY^~+nC{(o-;{?A=6 zBgTxs{8ChVkYh+g2cNUwBtoa(q&M!D_TVxTy^+hTG1@A<5Yph1CU!q_#PwYW6M|G6 z#b|YS6y`n_n-DIUhX9LRt^QbhZ;P)UC&n!-W-?RvoKNoq$y_}pSo~0u$lo6r8Fg|+`I*vmuA$)ivUfT*Pf28W&@I zu$srPL6<^w1Sr063c6?F%RA=a!uGm@1@D%F!GLB3(6u^so9cuCeZAR8@kqDBrwdz3 z@}gg8m|dITCROB}w7)&27E|gQ%pzYkL-w|4cP+WvvhP?zuNPyJ`_Am4IQBkhiFN7FGUtarp>~v|Y7b|U>FA$WrW+Y_@2(|OTdLl#T>GL) zDs?1guIy63m{F+!yT|!GZQy)~tK4|gX#%1rR}o&NBj@M!I2PPszg8^@1&UR=p;VML z{Z9WVX+`~F~{S?P9`iSFp*1aK?U}*KOd9u%E@GSZ_ z@+5!04J{MtH`2Q)OeUhc!WZ!|?1jhgA`zj{`1vgJnOs-J0K_#a-smZyz$eM(|%HGhH=pW2|Ys3ljO zD%zwzPLMIk>DA%~xS5Z%#tm-N7{70VBVZUc8?~eXdhkaT{uo7j%r#x&BPjH2_QX{4 zDBjkgSc6BIl~99HR$w9{Bodu`5|tq=+7SmywLHUC&I(LADKZnP_m+EOD(Duorl&x} ziJ{$%7phS!Wk!CVOm3%J28NcKvAkMp9Yrr>-dYaEU44|6DwEd9SmuqiR3qWfG>a8g z+1xH5$)?65BD}g0$BU-XFx;4ZiU>Zq-q5N$z<#1GZg{8gc`U59nmaLR^SDn%N6+p1%UxYrlq z6spr!4O#$SAbrkSyw_aRnKKP{j#z=VS+&-Pwh>u!h%ZcAwB@foNN1y3VA8^y46gtv z!|q3ZI_O&OD=@l#YZYJ7@ugQ}m&iu@%m4}FbLf9aqu8xJJg{hE8YDmNXeOegTic;k z+z6xFh5ulcqJ^h#G(7DczC36dB}!GL2U`wVx86k$jXLUv>Li6k&1DW!S1X+y(i9SzaO0qQXegO*|E=m_0EL_Aq(dC_ zS651L!w$$L0&=yc@|7hQ=n7XAGyIDlS|IK3vrY$E-!4L&Q+c|O_1j&nhTB)E$o}LX zQyNvPs~`tWrd@zE{n-XnK@{m7b68tt_bK>fTcB!{4yt}Y>E*F#aAe!# z!m8l$TIa$_=dX11RqsU1_}`cp!!zdl2KsH{`+;SqFEKd@hwKpd{^G&@lGGQ&yOw!t@g+EvhlZM&JFz0pZNpwn zE?<(6r23f3AnHgBuB7MheiD93dtb1W@`63(|KgUOV?NDYoR5H_yfgwr_M^84H{+K+ z`{YRMt58+|RV(1sZKxAwyMa(J$p7Cj$!~-dd_6u{Kf%>Hd2{i}+gN;`^rt z%*mWHFj6nbcKA^V1d!aWuRpxCn~D}iUh;>!PE`J#0BhK!(L+gdPju-@4Vo@E&6;6M z5(kzmbXtT4;b^@M+ctSn71Y#Zb&76ng(^fNBvu<0Pw9jEnQ8Wmt!oqVBQjDObl2q6 zlH|EWPdI@%mir{5Parg3A@Q(AZ=Jl zw4UH2kjt5o;f#SIWYT(ZW0*m1Zmgm*YZusL@;7aK-`trssFxvVn0N6YGL~0k2XL^O zKP-p7ZweNK9^tjQje)71Utmh*Bs`|UHfO~M0x|)Y{US%`d85-Nql9w!)VJnyuzJU& zM%ac3f5|n%3mujlN=VLi~7aVm>VU&DLVRggwftq-D&dbQgg6=*yLH}X>xBc}=DdH3nV0QUp z_YSkU*p>4em&$;7f`SqkE>onOA%q}p3!h*T|8Pdr6rC#Xz~yN89)QX#M@7UGAwg!l zJTr07hh-JDmmy-P#M(s{kZf6k3mMi4wHDuk4UOf<24b@zkKhk0l-3gFvpY$gSND(5 zbcx;%`TQ&xF%Mj{ZF?}EX+DZ^@db4^3xHzM&<=hJ(;#WaGcsC~x1$J5p`%`hqLqa8 z7AhGmw>M>^V9OBU>(Bq7EmgKdc4n|t?nIFA&M2M`MLc;Y#G~tP4oo6FgQW@1AAMGQ zB(lIz9E_PS;DY_YT5uIADhSwIJWEr#_x0CD#G%F9$=+x=PL{_d?PKXV4fN_q~ zg60EtcCC>6mTbPp$bNiM#>FPwUpzhLTN!7$Ka9Ll>V_yI?nO)>&BQ@$o>xc+20i?m zLc}BPGZ#rx!g%Jc>tPHqjCgn-_30LkL2$D{XF)kz&&tldrd++{;yB`yEMXq=_#s}Q zyAUF3g7b>Z2TH+xWko%8{2T*o09~x@45M;2(QnaM=ZQ%4k*tjfE%R}sQt)*0(NrPm z-SO;WM&ami`dcKn-3pq4e)H<2{!Y;`11mgD3I0j--%gR}@_ zuO7(xC-MMY6}God=2JgxBX2m2?`#I47p~U=ku@?+kM5|wXJ=zWh}Dq0&bcc_ID;?# z^+N)*Bb`og+sJu56`IO}v57|@6P@V;dItzjD_+;l6|Z12tW^C1TLc&9OpC5@zoyE& zczgDZPl$^c+Vq@V$C2J%p+8X z;|hvTs}Md_{fLyc%}Mw3mj~^cz^It7KToYZgu4Y1f`hlPDP=akNG>eh@(H{U zXq~xDbNtb$fm|N)y{N*PsClr5#jfx>n}__|k9~8LL6Ukrn2G68QNTR-!8{i$tzrZz z;ti_?iz(Va|1Yh!4?zKP`=v`f+vOT@eG|UjLfFy|{#VYn(}wQ6z7R`4tu;ak_llc; z&HHES1^Q4@Wztuei<}nOIIi|(xcFA!QzKnl2z(dRG(vKifIq33j*HfIRKwU5PkNR5 zg4h}GqS|6;R81WV1K_#+noSj{rCY;Lfx6jJC#;Ri)!9f?$6&ZePr{Qeh#3w0s?UjI z*v}BWqi06}eF$Lt8DDqOIap$niUOwfPf@-@yP1`-Y9vZ_IZ0Ptnm}q94K4m#dQE41 zcA-0sqG`gfmg3?B7M8^+2z_aP&%qa}?>1I0#$e#?_@cHQ2|yYX3`di$-9(D&C9^QY zgGi@##dz|J3EkVi<$ibI%y}tBS9?Of&TZk*-Va*F?k02%Ep9URT;{vs;;fT@Bu2#q zAOBDj_J)MNRYa^x`P&E8_*?}#Ml(UTH((sH@y-ffrqf1D-1^MIR^ z-PIZ$*}>@Mzyc&j%2N)QsEmbXe6X5LF>g+PdeB6VrH)xsh7cR@V#Xq_DU}t;5k%eF zDG*o4hjd6g^y!Y44>1t=KywH-C*?_x5LqWfAkvOeec?eXa?U5wzVQC=ml3Y8=q5=0 z(JkT}*E(*&#YCYN88|jR>O>^}N~y?n{7{A+fq^&Ty#ox(yZ%8+dBil{BbyG=rmT4s zu++`vidRIw~Xh+lo<0!B*$cRT6W~{~KZId4U={r(=I`eQ$T_ zuzHoqHy0or{3QJkj40#PmI@AS9~Nr-+aZP*=iR%>viVWa;Ij8soG~V4SvCF^BP6m) zG6rZ-1`#)cVfCL1F}Wzra@6oR6!MHi*!v|I#Hf_K48?=*sNzwL;v4K^SFoDk@M+s} z0pB(93N3m(5p?9*WM3EsT{Cf~9SCvHdbq$`b~6BB7#tokE!N|lku=nv?(A!az6kXu z>bPqG+NPDVQT8!@xh|$Lbvcx|0=~~9*x8N3!&ErpO9r8h#R;|NMyF!typp@-(V=Pk z#Av3?vudrqHRLYst*%VxZK)6*MNBhSLWt{#k`y=& zX6IU&lPWP%YnEL_Ou@8KQ<+?7nT^hBhpnx~L}IawLN=CQbFzpwvG61SLup`i@tx7>RYQb=c9H1vzX`FWds;xrceQcL z+=uO|g_2=0%cQ2^UUTn15vH!TvG{oU_^ZvD>+YPSG(99EzLW&rcapap-~7rblU%jh z-&q&bW6NEMVwyJ3KE~i(2{w05=ocFvQV?~5F4tE9lufwBWc*6@Y-{df9uWYTf_v9v z)w@G%zEIt6FO)bh@1o*X2VF|xP#V6#r2O5Px)d)0VX^6u=E>_I_}rO#UEP#BOs?5b zT4o$QB?XpjghizgBcH7jql6`7zSV8Z%JtdzQDQ!$Gy;P&(kSa0*Z$)3YaBys-Z|oL zTb9hG^-6#77!mN8DUUOm=z{@P7}i0(+1XnWajLvD4Qw6*X%_ha*RM&TTgHn`8-h8( z)_z{bnGE|&CUzk!FJ|jqjl|H&v1`Jv+!*Iw%8O=MN5oBMQQ*uYF5VgkT*&jvLEsWA zf2pxv2hn>YzT1KKw_1YCU?+lAggk?Lnd-0FB2=ZiK0bmv)f5V5K)J{?-6fXubnu^6 z%Y+7m3;SY@tdYq?6>@kK68FmELEJdTJAPDh^XDx-ocH(T*ufHmunU4*pA z8~Y8c6o+-#ap@W30CX#6uvZ_+#`1;E4U>MOEjKEG?MD)-#Xusxj6YYwHXq2;k_rc> z;jM`(wT?rJz@Ux6?dUda+x`9SAayuu)q9FsH1hdd#j$A~!CTRfx5H)^Z#?)AxAUSx z$;&=K-3D*w+)8X2nuczNSM+pCCk!Gww}ab6qs6qHg4|rOqOBhcWIrYa@#wd4zP_e6 z+h#4~_>ec0KOQoQzs^}W87tl+8Klc{GU2j_q0qE9U?@Z+D}6^JBYlS>E&UY#a064Z zqIFZL1!M+;yl8PC8de>0hrRRSyX{`ScK@1!C9LBO`lfiT+=rNzPb}P=l#Eznr0efz zq$|W&;Xu&AVtRjNl;M}moA2N=-M7rgKr}tz9vis0+o<02ux1EetMly_d&C6_3bcly z(1nK~@K^7b;rA@O(OnsMx>N5<6conc+@^q(+->oP>Y$!%1D4St9n-&#Z!xKiEBdD2 zjgOMv#V2q2*u0v95tgnH&ap3~G#5pn$=y%2+qkW;lARl=+U??+toJbL5|b>-5i51a zoF4qSX&}6;bPlffsHW64&s0Ql$&H>^&99hrfiYv*6Jndbu20yWn(k>s$)^&3`>W;R zYcH*dL!4gc#o2caBReX%jRhSD6aGc3i{bjM^YcSo+DNYa4V=6y(z?TWoU3(&YQ-h7U3N+OieV6HMv zgKJ7(QKHOdXEPb8A1qDtrvEFN@9kj#h<=2%qD?J~OI95~l^rg4PmF+WJ%A(dP%vK= zl5W7Um}gpwcn#FM;f61}6ka_0i`9v3G8T^C&$l53y`^AMIh~9Bl+}21GVv0iY!BCt z62k)pgvmK>Y4iVSZj*>B!K5V7$jTUv&V^{G9XI6Rx<7gZKk+r(;3>`R-Dyhzg+5Lv z^m_K+ztT(hKb>^bqbv(eqNU2OM13nSY&?TuX0Hsffany^ZVuQ;0Ny0AzzK6DVy)@* z^=)o~rC<5)*2e1m&Cxs&KLZXOu2x~e$YWb>RZYL}?9#*_!? zC*eyd!@(uxb5TBwZYrpq`)+zrxoi8VTtH|^TMC3{(^LnCqbuL92}NX}i^}zO0xG*C ziRY7Sr>CVQm||jLa~dyqnbj?e`Qrf5tn{+V`J+22Z49@EVnuWScSI33bIiBNn ziZT9I%Ia*NL|G(;8UpHs^&U+-#;A4`1$UQUK@)dbL+tvAhdiTj`%;F1mqHzk zFIxW^%E}gzJc_<|Z8H8k)CMt@$>29G}VxEmxGzWsp9g*s<4ZH>F3kif_9lJ6E$|$w&u`qm;2IB z&a3|KUl`5ny4v@W_}d&FAg?lbA7`0&QD~RxR^kU$)*Kid<4|5Zsk(D}J?C@N6D_mc zmh+vO{z~hL8riIXz56c$l%q= zmz0LWJdX+9w@LEu@7V@|8x;2Nm?8f*;*KQlK;Jg4XL5`&!zFcL%jho;Y=z=aQ3PkO6;1zc> z6}Er<;tBEmy=emB2?U^0Em9O5i2mxbD?Dpg?ue7~EKSCiZgX#2uFT8a6 zw&|6Q)wW%HvLwFDTV;9C7oZa=yfkd~2myJv~K`)$+521F_8{B+gkqI zkezd`d*lNkFtN7_xFVckubd=4Y$})$TqX8R=$QEwfA%(qq(Mn`NK<(3A7ZH!{P7u;9y4amo&Egajdt%^ z&`FB$hqOhTTa2MRB;O^2050396ju$B_SB&!wN3u(?)(^uJVPs;oN81raqqnCe}Wjlw?ZeU!+{jVXP?0*%fo{tg0LkYz=Qn# z>Ov7f9)JiU@Vl#MyUP!iPYV9a?ENqXz~}XKOAgD#?fsdcKqNE8(}dxZ=HmXatMh%R zPp1n%Yn!ixx__ME8+y@rZ9ZXp@%FeN z`5^wxdVGK4@u}Jky}x|YdVMTUY1|)rJTCP<2AU^-Znk|mMa*aEYOQiIUEJ6>3cg+} zecrv?cD27h92Q31IPCMvUlI zi*~l?#PNpe{w9WLv$eKQwiFm>`tjm|cX?vkDWvxM7@T%5f8tB|wFr^T*lyhE#y*Yi+x@f8K-^?W;w`U8DCFi# z8>70Q_ppk*xAAj__%IUP4D8J-R=aSX1yJfg=#WJgD-Q;9;Y4nVmZe{bo7I1IvLFUO z6H*vMX>cvwwlirRmS}ZwX|ls$ORkgBoczIm+P7zoc9R0C>o^2mZH6kTWNwxMFqGXrj=Grh# z+o`iQR#jy;pz!0EckD=Spo@T+<&gRy(~BnMQLQ*G>Qc>tQCF~!3}ji2RX6uva!JOK z7*q1e!jgMvyDzv`RP)b&Yl;-8dqAmICs?>z!mG>i8>)BLfmiym|3I z`>-VNUNG4Ob2pXnK=Ta^fE*<$`Z718;;UGer^?83Q0FSY3|sUP!Q6q$1RIMnwJuWC z>>oWvI3&h8t6Gl21tBS_z)Irp*el=6qA?$2mg$|oL#6@SNjJ7mgdq6_zVTt3z zWHRL~90yfAgF{-!%s#}eG0P_6J2}Q}cp>pLS|#%YSGd#*2}fwE6If(OI78B3eXLz$ zcNp@3V(QZ{BzaM-M3Yv~U``#C^lfjpV03jhEdTeIvw>Bkz7xDU@KwkaMH_PKIipGI zcXGT3WEA38rDS&QtdbzSdcb1pZTU?v4V}UjdDldfO!ZSwP^ZYWT#2b43DUBEUj83h zy#l3xTkoTT5hNWdSU+ixL&;?9CIXyJOc0K#C-ESZs<7I9h~eg+AYw6wrl3{r{zLR1 zdu!GobZRDVH)l=Y3h^i%Ung=Ot*^@hsc=x{@`SYos14x=zO3_*5rEilP&yp^Ml2k{ zA-x(gpFC+_cH6@WEgpVy)5c=(d|%Xl_S-`9z9^D8akp$u9IFf#ykobJ1m}scLlGg? zcj#t?>gt8h-+6?Yl%g}=T0xUUd43n(Vfs+kQndK2mUYl)ovgmhMGT>ga+b*TsVQj%+zUSgxs zt8m~1zo(oRHH-wa|1^uQSExN+wO$?`YG1*V7CK`mA34$4eCrr#e>TuLWIM0!N<$B^ zBjJ2o8Vd5sD<8!bPLuuXRq_aVfS}?ubJSOIC#WhXD-i12O9OnoN_C2FABW#viM-9t zpsq8YO}$qc&6Ee@U(XWT99@gR>T2{o^AkZ z3oBRcdsoaBKk?ZR!@1`PiuxzrOJp7%;;|NS7GF;gU={zR4tu9_!@do?_XQ=9)H_#{T}1%-?A{lESq2UjW3hU zm+3*I+INju{m-A5tI#a3*HmeBzK5WMZ%=cJnyV4Qq}hXirC-~og|W*xa4@TBW{jNzk>u0>`VBA2CEdO3&WzGE{KoHmjfI9(iVJdnLBZXM^$!jW2gQ7bKzR3 z(n*?2^N-F3GD(_S?2>}c_oDGFm94|O8hQgs0Xm%DM@nlX$4Dtt%IT*h=KU8;C{KmE zcLowPY`TBHmTJ<4Y#i^+wSP1a#FeOfS}S!JvGd^&;gn1SPPj{_z- zWfFu&ZwZ&;6f;$#r%s1%6DnG~NN2?@#sYwtj&(DcHN&7sgy!ebJGtw$r=t29K&8p7 zZ+anzFPK}lq{%7r3^(+!e)nf-Sc*ZUA_Y6tT`$(>N@8|qP%mk-<&kI7jTM3uV<*CN zzw$|I)wdxV7D671U0V(}fzs=>MUv8~ZiF;>??(CcZlFXIgM?bijNbj?uKR5*dIj*+ zjJLMPvul*VAzQOehsAkLVQUK*3E2?cZ!QN^cGg~+PE2(_)8Ip_KI`wR7)yZU)2-bS z$4{q$-CoX*j}?YE0DB?696#hVOZet#AP>>Vt99q8TzqhpfJ3B(sFDjsz-m%B3D!A0 z>jCg@e0?sMtQCJH{s zRMxYkD;9Y{<&fzS<9-20?zjA!(d8Lt4sMxET{8`-?!@tj$RgAWcEUABR;fuXc z;|Efg;49M|lE+fSq>>Y9m@54Z3x#C`gk_RFA9nr*rx0OaHE!xo6@yBo#OAlklHS%) z^7o@8ZZ=49*MpK%w**lG^N4RWT4zciq;t_chevmLR>)SfAevCXZVYj?BxZX1uK{d> zat}Wb5Y=8z?|>gRQ&kW{?_cyz${6JM9t>~`uwb=LvdciEgAQcTp1r;_ zMk))6h^xPejLFteUyO4mlmOE*o0L}ZxCUQC+^+s>It1jYu+27cl5 zzBQEDKRrwlM_dmRAPr8<6&^BVJt>dNsqxrP4bfyBZ;^0&jOX(_To3aS99~n#iM>3E z|I2=PV(cOTL|-q=3LG7V;>h(xMRuE%H8gt&)i@nQ@>Sd|?Y9|}7c@lu59kg0&L3*} zlQN(x;^K!M_RYxr`4ID3^PgPN46+-oo~dAW<+dn0x7HXdC|MDhj_>oK>v{J}G_&Bm zg;9p=5*)3(osfziJdr_Gf2#&+VavKRzP5!=Ik;8;)eX^GtBvhCmiI+^t6n}<;B}$W z6P2$Gc16n{!gp&QfdXH_OXMS9OAR|5y)8I z%1?xAy_x-Id-Z|Bw_@ZBa}r25W}jwDg|ptsj#0UiVaEAd6y$60O*MY3p96f3lyy!q zpG@(cq4bZ#`ya!?buRi7zdgCUp2Y~p*~w&2*Kd*PYt6nou@ILr>DD~n(kSL6cjO2H z74o$sbkvK~)aijbZOe_w${0%pUG;cB=2BDaRH*2wRHpQ{o|4&cfDGMr;@Uy+bcd}p zU0b$tqXagjb6wU{C*_Zcx=IV1C9uNYl99_RL#Rd4mULmAxnmVA9SXKfeBJWKdCQA3 z)p!nc;_QP8s8^!Yu!bS>1#Z)|I;7gjRq5rlp}>_38P+oba>0juBC7|kIq26yiz%KwP8ruiXR@WNz9%~leVwXfDb9bMK3F&Y+>V=2 z9p4e4JG73?NpkEhrfyOJ18_bY7Jadl@ZWoFwV(_Ma#vmHRL)pHOliHxvEYroHuLjj zl`Q}?!ys!wpx}IhN^9R_Da;TR(USMjjc%-(dkvI;@;Cc6e-n%|N zD-YZc;C+sra_9LAanUH$`1uYkd(xc0?s};IUg_fL_LVBy6K_lYgi2}_#nmy1@f;$@ zL!m^MriRt!?2RewRQmN%5=BsnfjX}qS;6$veOhP@?x{;uq{^E|vdnBXwNI2Ayj6dx zoqf_?E*!=s9v#C;D*Uj1PPWHomFnLMB~djj&}4Q&xD0oR>g1jvPeh#cm3a(S2*~gh zH3>!hc_F!&7Zb%ToAO;=PNBYKM}fZOM!{$4Au>IPC`2qwD&#E4;?ta|1C`*&CU4H89qL?D9RlB$dvft^%^dxmdnD@28n(rbC z@K|+Q#@~?T9Rj03apk^ejg^tzy(})WF!;JBT>L$Exs!Ehu+BmN^C<10#I2pxT%>Ph z%d?{}M8^T|G!Y59)@=6kvbiY7Au+p|0{=ib%!3&EaFX}h?P!!YmP+ovtJahX?jI%w{#>^tJsOtR(ZdV1l;i>eH6nFXO1ZDy<27ZEfV|}i=c*#WtXzZ^EI+N z`DMg!km~tl#2rw}zuNB@XFSoX_wtcBX%nXBAajX@)Q_-@lRSMwg6AQ|Op5@%*5XmB z&Gg`Kqot!k8GfDVE5~znb_(W7UTHT5v}KwB1{+)&%_kXSRFJ*_o-C z?wQYAL_mub=do4{8~ylqG5uZ7{x=`N$y@(-etWyG8ZaPkk0mQ;RDo~GuAvKV!^=g5 zu^RMcNLcZzvtJzD`=#&|nIctHMw`1i3&hx)SK2V?ndxAPrQj-2lR5|{KOcQQJSKuF zKK?y?_fssR&E#I>ON7iTJX9bxl6FTHcRF_&*6)%mn}D)gSGvpFn1GaJuhQIS?~+_d zDnTHgB-qjN0YpQH@aaPe~C>*5JAOVR$5RxCo?*fl@>4X)EPCD3v5 zdYnS_ut|gf$X^7XXTXUi4+I(pDA^!;h<~eReuMQcT_Iqc2_>re|sWE{EzqWo=eq zFQje(!JiHmSn(?v_uo#Mot&o6?*!!1ucm-zaDlr?feu+}V(x}=2L4FiMku8cJk~od z;H(BuZs&Zinh1{OE9JA3j_o9x#E9zTY;~x^{Eq6PqP}@LewK0xRrGO zOw&j8?k1_6_0#9CB&&;6@|Ol1X)8tSZ;#XG$7QRVxtH52&Kn_3(#tnN`a6`;CUQ{X z5M+j=yMB|g-1McPd|hL;Y@}%IRZ-xKhDOq(?2D6!-~wuAneD8>(+H1c6db^=BSgKw z3SWtSwx1r0$WtkTf@nT#IXDJVq&i|HZzG6F#_IpkNYVzp#hah?cqkxZ#!`)7-s0xr zESFn;wtV};B(7f(ddd7sAlrG0vbdcMA8SUkIzDKGUb2RM(LwcE)nzPAO?(uTGYCXfnuNG4C;b7xc-0=4 z``~rlORTg;{h`jgf8i>19T(})tT?TqhtDCnB1StN%D_D}Xb!VvN4rzxhN)aB>tw)5 zYP(t}8kkAUF{u7K)0&R$)pg7V_nuZMAE%-#hjBK-C@Y{nK+3lbp5|ugQRy0D? zZg?f=`Bn;E8nm+spGmY!R8@%qn&rr#!D?s5r1UfVK8TtbPQY9-uG40ty`HXEjza*~ zO(;=yI1*tCVAGX`L^f;@o?hQ&VY`479 z)B$=Uehoal(#!&SktT~zvr@tP2W!T8!~{c)D~tqqkf-v>@ZB$H`?mD4KHr!W5|zU4 ztZHvnAhjPFwcbWkqv^rSXT^7b4#mu)8L}g(XYe+iC+PR+eL##3;N^A*-0MBH% z;I|etD8ry_yFdi;lFCw6Vs$5!eZ0Z(7!W^Y${r%{|Gu^hBE7hJ|U@wB_VL_?{Eo!PJ#CRdcHOGno=jz&G@6Op%`>^1DT+KZmGHQmhr}q2=aG)kv)w_ZC zh)4!8wl6(#WtiFw>mY??bH&8;rJj{i&vHMk^)2S zv#OGT?N#BZNaX6r%eJy!s8(N^+BlNC8}FGBT32%Gca72)jxsvg_t4076pbFIMSJ_@s(~0Eb-Git+zh%pz7$_UXgH#LO z_`8Lj!;GPQz2miaVLfy;{nFkHQ!z47xg6S1y<*H*Uk-0o$sEog%Kc~cP{;2xK@ti5 z??nBR=5K&29b+r9jb55{ix|w_`AsgejSbTstziD)hA~;Bmk{}$?h4C*IGpo zBY;bNx6w8$OW)@%C_xPk0X7oLVIiYFz0{gNt7Vt={wk{B9Z6Zh=|=$jPn)k7Ge?H;KCU;zC82W8HyMq=`tcLSeRy6uA`e{Jo)j^9F*tCV1a_lFL zbXIB3HMYzuHKX*Z6LZssl2$om|04yi;E=JgX(8SJBly>8eurYT>nXvgxiq zj$3qhnl^yGX96lKYMNMeOt9@Sv;NaO6l|fF8v(SrIn)y0k5d2m^0~U;Cp=z% zlDa0baRe~jQ-Z4~do;8OYc2lSwLro`TrUDBqhJ9NCxRrzjIPJ6c|kl;mJm;rG%?ji zwPGlfpF*a8AMBuzd7uR)Kh?CvvfIF>9Un=~+d??-`^OCC+K99U`9h=e%_F^phs^ud z=Y;01djT7Mr;6UWo3bY(hp*FHZ$PyT$eejCVszN`Ys1wabbh(3b##8{7IF_*H^DQy zAy9*$J2KGs1oxlIDpuZI-B%NC0sNV$8H{WO2?;Jzjs&nVj>AbcW?#X3c;sCImSrOn zW-Bp{CB6-%X^TyPxgKxuB<$j1pTyE)No%5)ql8x8ep?~#O-?)>PA6#XkFUD2EPsVuEZ*Hz#Mryot2g;@)vrla}F5)M%FEmwG@D=k=aB4Vjy3xT| z-D7!*9jQRaC)>~fklc3KRB>+E0HaZ2VoYa7kX!c6or9Ni;_%!G>v?i)%h8m0hHWd+ z;5!b?e^x)~nDEEoeJ`x9{~KJGv*S&2x2x@UrXcgFwzgQP#7aP^yC#fH9VD`$3lj9V zFjD4c;ad0k%%LRd6zw>PXHytJgDWzOsp$24Jz|u~DsPxi@k?a0dl~(-wt3B4NX6NI zo?6^f)5%4O&7{&Ww$_>@nMBfI1#{dwvSEReL^WS`j49sz_Y<# zm3oiQ9Q0Bmmf2OEi)7nn6-y(LAkD334L0Kcf5R1!XvO0Q4-f?wU^W~w&|i>ZP$eSI ztQAj;O#F6VSDx{p_8Aq(f*Lvk#KkviQq$>*4=Am>>Q3ikx>eJ9IKH-AuNhPslR7E zNw({O3hUnfm23?+dnh?Kad?uGh5U_GXxX}jN$T15+M}BI$jOCk*HU457fkQ)oA4U z%#)gV({rB833T?E4d?XQcbhwV+E!UpU?H_LkUvOqSmUt{?Nd0nB z@%G?q(r0;25yN=pUg>5V!k1@cNp%JaK19EG#e#!BdA|9OJKp_iJs99)bCPQ!D>5_% z(Tm{(yN_Lq;(Pi$7>TyWeDvwmMa?3JYh5)_erg^&)ar${sWwgk{Dly}T4Sh=<=VZQ z^_I6E4jTcVQXP7$;`VuGe7S$$I|%1ZwB(AJZ?NRLzKuWnoUzAf4F}*paC_7Yj}D`2 z=l)(rE{vEj(Ir4~sL`C8+6d4bJ#7IQtB*8+SC%}i)K8nh2sUf?6V~fWya+A1E;%zz z;Fo<@h|QLZ7bwGrw;$Cn0l)A4h4XHDaw!Z8UEd-D257Ka#i8_QC-Oh}^8llrHy#V0 z6z{tU>f9m}$y~L6&o|dS<~h8kGmE}{(0wvW`E^vt(C1)|-UEB#>l~W^ckzbte3cFyu|9g)rCfqw(-`dm~C-44ATEP=n6Y1x- zD|b|ANhMRRgO8tB_;fL^a-b*GGu5{moKf=tBXauo&+X;y(`tb5r;bewrPdV==#3LX zsG7Uz-^)HyCNHkuB8NUwlEWZKzMD4_KfwZJCyQYEa|hTawi>L*;YaE4q6jrsFlBz; zhNSd%da%OJuF9Ytf9;KQ#p;E(PqTV6bZ?FjZ7n`hKkNl}kMCcg>bi5T+0Rwq@n;`EvN>bJKkQF{rB0MU6jiY0G_D*u>f{FPpS)fUZiuc@bbgo|mM%Qnq; zNG2VDW1&GCgg3r}-q7m)l&Z;+2UtS`LRdqsZe-OY6!|0+ZdK;9N~80**QU7WS6*PH zQ3hRDcwH^Xr}K#CAb10!qrl)F9l<>vL5t=E;e5&&d<%6aR1K|Z_7_K5Q>YDsZjlv9 zmOA%2lrx&q5T?-(vb}!ny?&CtehA?ZkFt@`is93+)(LQeJQ$oUKcc;ihf7tHpdT=U z=>5q#JWBaXEH}HmHzC5yLGdnlex}902J0jML?yA#zxOOv9zw&<{j*iIC*P=?<#++n zJNNHVv*)UATX*sRlmBDNzSH@{RxkC$KmX&cu+ODmIf>-I_uh9WIMo#W*1||^1XbrU zhmphbd{cl_KP?&its5D>Ty043 zXa*qYP?oY_t!O?npskRLF#2^1tqPB8FXMCXI!iMwC3jSSIMPcK%5{q%}akdayisO7ZN7o6H$&~tCjv^@U8dRI;T?7zn~t~Z%$ zERb2Cd9lKIkvLpg9TqItpskM~n_^MhLdMRbl`%6;Umcozr=8fnu9vA6rEs^f!p#N$ z@`X4CU~@1;dZ?;6Cp~&#$6-1^=1POXx?NY8hB;OIO6BMwq>jp8PCuLV#6Lj~YB(@p zB04%G!jKBks%AJ{Wr{(O!Fgz>@vBv*)FNJ1{!X)^tzu&O15 z;+k%~o6Vm8%&$xxHyM42lX&pHvxat=3eT-+r&NOjI6F?;UgdTF;oBf*qJdrM9o}Lx zb#j2ROZPv))!MN8^nAJ4VP7o*$_;%e)f`?3-e#)~?TM1=mYKlqfV~@s-QO&Hw zNZz4^TNodII%GQ-JkexSC{|RKw~xC>$8d4Czr5(rG}p?l(CWOb_fGT(2j zre=-AAs*PmMaXr@=HLN`gV`C4#2#mdoXFFee;nGqyFVXfz&fI~35}oJE&-tA#eUpT znR+hYVb!h1k$7ku%7!4X;N<_&Of|r(oY~;>_f@tq9)bh8Np~xO9GzVbXs~_ia)<_!R;oN-2XRL^IH!2+DezU8P|5P4Jap z_Xm2iS@8Q@!QfgdzMVz;bYBX^?-Or1=yf}|Ji!L!xh8gyYMQHm$I@{nu*PcV&cKxF zm)<_T2!G&bKAQ;!9(8}D%7G2ww~V7oJ;UQu&L19oNsRuIrRU|P>g{HX!b3jsv(yD4 zNQPf4%Eu_XKX5-SXQi*hgf1QPx}&)|o~{bX0bV*b!LCrtTEmOT4Go-KWxQ$oTC>SyD}-R?q+=iAVw+WtYOhZJqxXaymva%q( zKOKv%T61)E_@Nwv&HtOw6rrf z?8V#Mt83?K?poRS%GA`)FyvT2Xw3Ut?G=JSNv^lUXGo+#+Ev@}b}g|W*;>~z41<-} ziSFG5G)y!?rO|?|U18Lcv}h<-dMI3#xZH4_lJQ)A_ej3)C{(6~KGu8q%y7iE;8dfA zzPd!ZQa#l9a&a}DTQs8;T`BZ!06F#B#2diaJ=4!^r0mOw%UNy7dx~Bdz_~5ySvf-F zbj0rDF(QUVknX+yXL4bbAo*LDr@9A-bq}ZxQn)keio5^(>~_=@*lBR+k++qdz#?>~ zXlC$Y`N25iMmE3|3UKnpQ5WKD4u1H<|5u$H`+asX_^{h}KdttJS6ALq?P+rF$hsHg zm*+CWaDkCgRc>ALZ_f?jZcBNxGMADRc{@>e^e%we{adge=~eZp17%|q68Sf(y6z^# zBRxG>AQKaGODaB8wtN)q@v}h5Jmp&`czgBaSf5s2(4QP#f2V#4f9{oLSEvPgoVk9? z@Q;!HqI=zA?h<}FjjzL84|aK~4%NRf3j6LE>E?Bw$;lP-2q})1s>LwSH!fz7=UHiK z`MG0=GRAau>r(l(>Lq}Oz6qALujOCSDt;EOVIU5lanLU_d;iuzdH+^3c{ep+<%O0T zvwxKehH^Yz80~XMCrtA^Y3W^SlFfBwuy|k+_!K_?F!S_@_y-whB!atUj|w1x^fngDjw88*((u7GCBi zV{GZV(qYpF(bh`=B_$(I`=(j?rf2%5ohs|g3Ah@~z4xy^-&?e_&iyC((lBPJ(DKU( zK>ba~M!C_=^4+<-_4Uke-JxEvWYHrs;H%KM>DlpjIQ{h}^Yv@uiSFmlAmgEFX}c(?EwWJ^a2S2q_+Q-{g(5% zw4w!U8MDp6vCq9h!@{|k@y|G*-69k@MD{b!-hRMP)2kIUHCnp^3E+qhNoE2VRlA}V zM@w&#-}zBrpUySNgu) zR8^O)8@i2AVee=+=c0KDe-gS~!vMcwXIe;an}ar2;ddyZcYensPfh!9{bc1oT|?YC ztFjs)I$xprZb;nc4o*UyYFTg-GwsMe_!@Zws-{sE2_#xLvo+$d;w23=C#7zTo}gAZRbZIqXbFA-JhaP^V#LwwY3)ZFUiDM`iE- zyBHEHb82FmSVXGbHJ^*PuLT!wX5VI;Q3(2Kj3ob8B=gS9_O?8L=zkC8(9ozoHyIM;twRoQbr!V`T|^gh-Tq3$V}DV? z4E(k$b{4`HmKIs)wkEv1>0~K5 zCO=uNJ60uU5pz94x|7;vzqx90-?jLacRSN@(GY>+v6eGSOF+_b%}(I`o^ZUh4YQYG zaZpMHH$o@HhwYQ{o*>8Dzctj-S*_U32E`IEKjD-=8O%SZ%{ znoD|T$WA&l${nV>m)0{5@V!DV9@SOETL#!qx7g#FW6sA6{0G7CkNS{(6d&-ei9W*L zx#alzTbCI!4o4Dva@nZ#;~5?l=I?fE-3s>#kFH-^CA7)-lIzWw$(KTL4=)V#4xQ52 z*NT=XcMcRm&R~V0)p7g5vohdp+b)!*N+|b)C&rQ&oALc^4cE4+Q_{O#(7LK=nO=z6 zdR=OPB-hgFv0n%gKN<_tSeyWPa+q7Q3=;Ke8sxNthORjh)q8#6<>QxeNkNeWge`G4 z`>K8N*XT!O;)5T0cgZ4K97B0mcqMe_OeH!`ev(t5oo3GA7(X&M7YZWf$LQf~t_?NL z*3jg?$>fh5g#YlwPbtr`8F(zT&5&|S?B|WR`juG(R(1Ielb=V~CxeRCN@G1FOD_d# zK5D-;pEuBv7aNbU**?9RFYI!rdaca|E%?MkKd5bO3Y^7Q2%Nvq3EeX%NwygDj=p7- zLYfgsdThy?NW;Us}Dmn1AJ1v2z(d zhjA=&oG%ozik#3I>Y(@=o}JuX<50hQ(p=STuCb>pnR#v)i5+7w-b$*d;lzvR8<)XN znQ5b~p7Pgye=d?9r&ED@KSj5Ltc%m*Vrn%e>M62h_>7cy5lDVpw&T5rr(aSgYQqaE zHyL0>@Rlddl&MW@cj01Kzg!c#DQdB5kjJ36n1kG`-oKa%1_5+WApyQ2X1cpz%liQsz+X20fo~S06o*KJlLk*7C(( z?N{Z@l=ZB0yZuG6;g*?}uFlenqI(TcSk4T0DJe(NtHb2%u|ejxS)9@0kwHJJa%Yp%rX8GYBk!2z$~%9CoVE0i$j)WZok8XwFw_6X{W?r^O}St||H#6MffuUZIGi2S zmmmd=f5cggqk$oGKMc5r7kMi=L3LhQIWj7u4A$M*mT;URrlInzyfzH-Xjj7}qDj*iQoWQ&g1uQO zxf8pqxrS*8;UDnknbRt9J*H!cG#UNgT;JyumYHBE>P|5%`Gf6Zq#GelK%Ss8w76Wy zb)09JeYWhp>+1Rjm;UJjmu2Qi7kla^1wdhCi=f_^wS;^&gg)}b%L(~6J zHW~vRq0(l~`Z6&qNt{IZK|>|(huOQP(*v+tzH$)*HD*siI`^`aRjat8vGGWxaq`7- zLYMi&qxETi@(AUy=xeJu{e+rwKQOXzf5gm(LB~@9nIcI<;uWZ)iq+PJ48_0<@N+}m zo|-7oI!e4Rx)z8K+(h}LpnO=zgl2T8n-Usfdt#Wm(v*N9=J4u!5X`sOL6yNI0cgpfA|Mt$I5yk;dQhL6*eKTlOg{mX9Zsyh1dww@Ui<1JC$`%01$8)kn9O zTqHjM85Fks)nxX2yX@|dePG6Ln8T-Pbl(G0!QiskuN!Ll%ioN!pYAT<2+RGY5F=fm zY;D1z{Y4(ySW^7=nEGKq=w!ko>C}cawA*3@>!V{;xlAw)Sb)e8lF8`PJlKJ$CyB2N z&8vr$xL-~LF?Vw?+0NBu$p5vqw6ow&^HHHki7L_N%v#3n+%G6R?TCj>ycL-KlUkTUAzKu>mLMi@rw=E&q03z~s`${E|%6 z&kLds%k!Ji_hp?^A%@4uXPF@sU&k4uYpauQ*~iC16ePX)XFmrOB+W>loD4e`RIAg( z%$8TSq^5_Ukil+Ajw-zcABl#gw)Q2*c`r-`e`WehVKWAssxud3rS?P(gCo74-Gilb zQ!YlkyF_@X+g>=0do)`1sSWPwQ63&+1t#bNpXp0^6tm&6&%;MG^`Ic@(1D%SU2y8# zf>N*eP!5Mvhx=FV#y0QAXMGNZL&d4(v@n;8KWX&L$HW|Oib^}&w69$&Bkj)eG?UHs zHBYrGs|CW2CIV`GVKJ?IFOnk}Kn{xRmpz*( zDLW^CnG3+h!A${R=V0dK=H=$3VCMob^RfZBxl=`)pcpXOIO&BTpa15FPG)wez4fsR>Umo*?*8!g9~SoT3_eP166#Ua2Z3X& zxwf;#xnKC-A22{4HRSKR#+&a47jG}Uuesa;x%bZ&mve<-A9we3V?&dadR9zZN*|Jljtmjrv~X`tU$K=(>c$ola`EegNS|zfc=63IjDQlR{ZZQP(Y}NE zmr9B*M3hm&dte07RG!gykNwUL6HwY>Nhso86V%`C%i3x`YRo=e*XR`22pD)^fVpM6Rh0Q<#dTghMHpjb0h=?2*UTK`u9R%n~QwN z+bcuACg=`w@0br&4M0r*aVpdax)z7x0_6GsvWmk)#7zLv?s9ir$|pR-Tmvb#k19{z zxSfJ(Ldxb0X)Kfud1rqY!lBp3{HcZi)aGw4+Tw0YNP4@FO6u@Z_UcJF&uQ^EOQ0>X zM}j3J0ge#;$zSaV{!`qX%~K$C&jaXi)QQ za_W8ccsMe;KVB<*-#u---lCoHIa~?Yt?{1_mL0)NWjoUzh^uL`YFS1lO9m~Ka0y?= z-+^+Oglx4+xYqGp{Hh^vz4&as_FtMDztUD&~d6}N3j?FfKm%kanz(?u-MPlCkP#%GK_Znz4%SAOC)DN`rt>S^oGjwEjiqd z)`$OU@6e1vpWUZm$}r^%P*dE}(wmmBBSzaI;qNORuC&Ys;TE?u7(U(D)}K8hf^3!l|Ldf!f+bV(3DQ2OxF# z`=9%(!z3rHC%!1kFMLhdi3RRmMOG3ZDG6F*6Q_VuIUG0 z6ruAN3$YyJ5C@D4g@H&?-<)#8`Xnx}*JW|RQ2Vt~77W!bg8r#J*)`_vZYwu_(7kvH zzJ2Vzo!ca~jktwub9tRY9AV=vv4ai-Dy~X7XuZg57=KyW+<0YgYwKN83^ZluQjv49 zfc{RGY2UjZXm38_yPhdP zOP(xMT&{EV9ffET<&LD7s8P(&q6wl$5mZ{hYSUT=RaY4sSdPi|b;cS5knmkQ{>?qr8grOp#eHSnM z+MA3q?QslR(!{R1?xfWUK^%0)t&%}Sl+?(U%D>!7-C6{~R$&*o|IAx;BLw59) z2PK3x508$XP{Rs$SgHzgPS>>%A;`9xlD=PYk=c|pI*UTPAT=ukI2(!aRteUY8s+00 z9;C~nH#b2qhY!8rK2ZM?#@t^)=aoe;4%_ByAJ`MLD)eW>Q2hmr(~9$L>tg_i{B||w zi1}A7VMbUkr(FEew*8HIYOib4_WWbE1a)!p-*^tBPm?$j#17$n`5^C(|p5rsgptV;E}@?aX{j*`kx7Q952}4=$zQ!i=SkcDLdP$FNTKpRWp2t8`-#H4+TktO5)o? z6=Yq%q#q2dS)8Zo%e~r9SF&q&8CbS^wSPkehkfH%CP7*`N-dt18l8s(hug_qtPkN2$ri)6>pn!YRTU2Zu9?b(xM$-nFhYMtu|%a(fk47tEPD!21NJ-(E7Y*%7pEfU zgmps`a7AfBJ>ME+o5X0B_DLMiS;;lpy4NNAXl5EG%r&`$b(^&KwL z8==g%?H*LT5wbMUEcNwCb=fyvz<{X4+e(1==AYN*z>+yKAU7V#w&ts(T!v} zXvz}p;B45DAOkevG8ZtpWA4z97qb~AvQD83+%VAT87Y#*isq|gk&;xeTI+RS_{?)_ zq6mObH2OeAAdo2A?g)K3$Q~5_+wS;OxOqnV=MRWQcq7yQAbCig=$$~0Tk2+%Ik8VZ z^gj7pjdxl7+d=wl@OK{>8T>}e{%{<*v8%4YYrOPGIlC$0Bj_QB&# zvvUe+YcirWQG`hL=sW6RR<=9gVd_i&us4)u9SLtO&ab%;^6u3(iZsHe+C4B`mQ9! z?IM(0PT#>Az}g8fPq??g#INFOyi50J!RBy!uyT%PO@?8cN@2{5y^7p&C^z_C1IK&1 zKmT8-1=mIUY`Pw?WN|KHX?cc{{)o}ghD zpXpwkCB8ikX$->nAY@Np3gc^ROJwdAe^p+=y{9G@|0Bh?+41+*f~AKoPpJc)bRs*bR6P00*XB@=PXiJ##YJQ3c~$+REGh<(w!m z*+F)jmEMo6uW6#=X(hj<)9F=Et$RzO9$B{_WIUv6i%X<#=`K^K8Uf0_$1qgUNC`&% zh?vHO@(isD1f}poa|K=EeEqkb6nwjl_}KCX>%3qA17YFHQR5}|0&9(UrA>m?GBx1R@JXsjJgsh|b(71_y>6KZNcqn5pkxfaVQmLhAq zCHXj3@Y83nbf{Y+YX0KeEn0=`Y3aae6I{w>P@x4WxYL@@@0Xt^6`oFW#WWN+KSZ1= z{dNIS4|84|bv7#ER?unuCy5oD;;db5KZkWI=SQ+2JRlMGY%x#Ec6j+R5e<;;2RvKS zH(@n2tt;r%jAZG;Ksp=Aed1LDF@il{;2C&Z(W=<^Gd`+S@unuNeM2I@g6FPy*qwH+xC>H<_$|=9nkTj- zZd~Rg0#FA|Sitd(-TTkIIX+|)7o5Yb5bQksnAyfb|Fs~EVx-BUsXrFOv^y>JgPy0_ z@T8HaHO29r@_k2`r;Gk`d+nv4m-kY4rQhM>X6J4zx?jN16;lrBmKMgbK5-XsmKKfA z7}RtQsfj>Jd5vgPmWmZ0ixtSHIIh8)L1*y5Bu)^Mg}2B*>n~KZ1F3_lHcR2#`f$p~ zR?hr5M%Bu%lK#HmG3Z(!^@k#GuM0;jK=T8v+TMjUr!-E&kd@%xa%Idxldo1rUA}hrwF+d z$AxQljlvvvU0!Sb$mMOI zkI|Y?x1UYi&OT@&_<<}yb21=K^lZwj|I@|7ghAQCwAPfN4#3lN=})nyD}mOOu?~PG zm!R@s=6__I>fTbtQ={h1FU^}M%^T~=1C}bHJE_QHmZ}V4{bn}B7Nqz7iguLB1Lo?C z&N{o;>I{B;fM<){IYi1>d0?>~&|rtY5ZkEfnhN^=T7qcm&~%N`bcLiqtQzY5zdw?% zv?@w#%1Z#wr$TzMGYCm0fQZ+Vy-fcn zmhUu!H3b9u>odY23ea^`JIbP5y4G-JfiT1hEruh*Z0lyb2!oR05^7-KJGE(xR(( zaeTveA>CM&0)!ZCGJ^+4%? z^<~d3wti%TiD#Fb7{+p6X-sHe;J?>9{m^=WKLc+4V7^z(bKH_c{^frPB0b?;{~S5e zjfO|MOH}bEOxP`_L>9E1j}u%aLraoQOvy%AGL70`oNar|TB3B1Hfy#ew+^|lj`ctp z6!y6!sdFO!r?UnkvimnSj+$==ZUefkB6l(ctr!CuF50GQ96WGR#tG@RGl;MH0T6o-wVsrW595hlw+w53UD$?-Oq=k&O0mjD?eIoO&w4Uzg|eQ`%Lt0ao-`U;fmPDQ1DQp`sYYFN#uEl|sCQ1>UlUq?cn7^R#js zv~+72Lh0nBL#EorUDmJbbV;qAAR5X=I(hS+r8uayb`r?D%FCJ%ot((bnQ-PTj{8dq z?6<*>xYti1u}`!Fx=qj96k3#5-GFxM+F)o0{Y885z&d>M znZ$VKzuM>=A2t_IoVkVu>YrVyUKRLtyA$&w|8}B zC$;pVu}oPHXF?M!Xld93l71JGVSr8lyq6#zk@Pizv`Wj;Y37XJ!&eQyc6Q}`pr zl{Zzg8Y8l3--lUp{=hGqZB@WWi7rPQ`xcM3D}m2B{Ue9ka)V!9&#)$!^tqIv82A7X z2=nDz<P@R*rv~IRlo*QJ#orVGz3Tea~53GdilI&s`~aBqG%UAuuk4Ti%TtUM-}Q zZyY@Ih-YYTbg4BVwyNXRt8StSF|Cgv%x4?ie z3ZcbPTC27|l!r_s#=aTR>qkh<<*hkBh0b@le?JGz>|b$8FFRpcSRf#5OA#f=3Sh?u z5q@RiO-n&HXE0hS=W<$Qy-tr>Z`NW4z zcP!s9AuH*#d`!P=q;&0nzNc#3;C14aVFTIr^(kQY$WSOke9;_DxD4v$uR-N|)sj`o?E=cCr7<{+}{XJ0YDJQmI9{P1}-( zum5FUtA+o^h;0#(QSP!4+qwV#gYp>P*5Y^F(ANc2yGMph(QycnTm}eCtN|5TWkPuZ zweb37fsl?p<|hxOj;%lUba_7gcp_05xt zeVJ%t`TzA)fc}466}qMH-MTN)996}`q6-J)W5yn?6uCmKn5NZ8G~*Qph9uJ3Af>hEfJ&eO&WR`(G98l}zqJeUb?nPSaO zcZ+}@fS`bF_lIRri^Iu0m~t~Qix`5F70PLpb%2^Y7rd1hTZVNV7!>{^USv|iK~)qq zD58KBt_soQAu$uZ`Wj&(Nna^XmvcnHfe5ejj{lw*l}rLo$548>7ha< zl_U8|*(5WcDhDpK&D&>*V3`$tw3zHNUwJLIH#TcUd`av*>$M!Kr_mjj`hWQPtFXv= zU~K?J2ZzDkeQ|?THa+zZ?BKXD6v2y3>HVkya$bEB-c^|BSMj@9zt{21ZMw(m z=v(pLMO@0d?fyk=`uhFWMY(-)S(_jKs_ahWZ*DJe9#Jnjb((t)m7oRP|B!-Z| z(B#p^=$+;pQx;h@yq?+*qCATi@2J_GFtFcLm;g-((`pGV2vd4fEy#V0X>jM^pi0j0 zZ?rj(`*;<(5c?Pk2tH7{pr#p6lRT)-ps&%QHB?MmIIMD#0crY1H*C^_6tz*#6?OC4 zPJ`9FqcY1~I<`}S8ZxLzP5`V59wJ!9W8((nER_z(d8ZYwo%JuK6_&pwAkm=zr3P@q z%jAO@wGx6E#q5GjK;KdTf*K}^E+Qx2)B<$>atKS-Z{l=bqGxqHW@&VauQ(; zbDm3^KUIOPO0if4f(FP1&7cmKfDKQM`#TkI=Pi0+`E@iBVl%xJ@)cTP!Ny!PmX41X z(9p8eVi^#Tu9zem_ZTEawt${*qnc~Z@Ci!y`jDp0m=Arrh$=DS2BH3`rH18Z@ zoqTvw>OA)q%>h1p28Ft@&~h7v)iz`Pr+imfbvHD0KY;kNrnj|aB!KJcrlt}`S>kic zB^#S>gbl>nb#1s9b((#!7T4eKs~^U5`UO{A8NT;=x`dsT@$lRCkq0&`X*Nps(Fb#i zrh(4s%7D)4PV^~-KMX~T;&F^lby~z25psOXV*Jwd+=vO(p0b0BCsmX2j7g1i@r+SR zD!Xp~bxF$~7E-t4Gz?%I*sEkOyT*xX4g+fTJ0r&zgxPo^PF9O_#SE{5*07biT;hxt ziE0!@9EJk=XCI=rKBnpCLHW!}7ryV%-zX@^F-QNC450sg1lIA9W(L$YrN#Ga z;s-hZ>_N`IKfq!w%ozS^R!K?ZB$yr^DbDHoN<5fw?XPAMo&yV!+l%p>w+Grb@bint z{CFmc*K26LF90RP%IlVY^XX%LcNuwUI)Z=$-Ilw7NpXAfW9t0_w3ClET^f_YT4xZG zHhNn7qXxrt;d7tgQ}ef|L>70xForqLy4}48uQ#Mz5RbVQ0#>Q)zAukrS~Llo`tI!f znU{l(nU-3o*@Wz>hfh9}GCce3!8NoF%WjA32c1)pI{=)AuiJi|5!vRrgNT6S$oRp1 zVZGeFyq9bUv6{qS$|noHFp&kDH|Me|{aycp><8?~@$*a7-fo@L&;&1IT;cB}J2{JN zrl2<4oG5$JmWCh=)Mm_Y&IIF}QZbjtd=P!q-pJbT3AR?F+{rz4%GXU0zlfc>bc1fk zeZ53R9{|3;9j<@)I8TToo|NkD|A|o>DwXCn;FmBHEF-Xg(4Wh4foML=anI4`cc4N) z@1`+HS5Z33nb)uB2er75^MF^QI8DRNCT^yTF}1PG z{*|;H<^<$onStqYCS$^x9Zi`A<+{k9-c3id4)y6_nU#BV9p()6gRWs(BW}v%ILqH+ zV?}t5^Effln>y*G{0$cvv+W+`aZ{GncC5}G`_IM_mgOYhfNZRVvwSUl#9@wOCSWhc zWiHzJC?|OfW?{XJ0=2aBd_QSSn*rN=1Qg|H*F|M9xBo7s5U6Y`WwqBmx|O+3y*7wL;}clX2e&eZea&BHX9pRH6FQ z7szCMvl`_dyGVcZuq4r*rWMzrBosF*gzRS?$|P;mis8-CN_C0@nyG5ebV)DHH`o|H z3v81!!CTUera4>iop{!Zxj<%3`f5hnrrMwY5qP))akT zc;YV&v%s_SJ@O=SDe+#&{i#uwi6Gg5^XhsA4|5l${VZ%2`7#hmIf`|R!6o?k&pE+o zKar9|N1Oe%V!aVoT%PmXjLP_!zYN4eHic5rv^32dGeFwYj+5em-EJ;io@6dtUg{SQ z>KN_8LZ;a3S|+#an?*^^#$jG*jy<|m8*b*hoN8O!H{W(pDsKF?vdS&aha2&gO~)@A zduy9FNI}uZbv+;A?S;pkY%)PVhzn}v0JW#}4whcS#jzfWqB@*22)A}lU`%rc%DbCL>esSks)8%xZ9$f+bujUnhi&N&nZhsk1c$YbE zU)SNu@|8mO)mf9DLz+qRo~wUXHqI{3QtH|wX^HJ0G6Xz4nM0t!xZwFTmHE#1N`}>TjGfcf`$V# zT|kVB{)kc0a;uydt|7-r?ky|hYjiiFV#i%bk;?hD_7Vio`8Mx?SwJnQ-A4c03M~_) zK-{Y+mk=Be7u5 zT%bhsQ)X(`))6nU*xYjK=V^M`_t3b7S}oFF#(JT;KvDKOO@SEm4%+D5j^uZb`MCk1=`7EJ!+R+$AY|$ELyfEG+UlN(fZkCE2Ab z!7*4h&U1261#}zPf-*Tg#T#L=awGq`>(D^uGkiOp0-rDPZ#RjkDZ#J>O*w`;Lltmy zo+uWp@)$F=82&=Z#_>`W)PxeiPu>m*XdR;Ab~2pI5U~PoTT#~9Dm7SBObQ;c*j;{d z>1o9)?v8RwixFlg*F;?=siwe~iBKALhaBAndwEiLqmP49C{|I?)O{)}G9E00R(zcZ z9!2qv^-yk4im9n`B`I>Qd3FB=-RAAaXU$}K%OV#nX?&_^`)s6%=L}AOO)zRi%LwdP zN2Z9=^c0SRrcP|QSQ9|o{_y%si0ck}bjsEv_o_`pV5@}jalP~s$8G%u$i~nnxB2_d zRc2@%NtKxTZ6^EQ*SgoeYSJ?qH@~gE@Xo$(zZZDu;Ew481iax9G=}gpG{yr{88n7G z784@^4H#p#J6KJ&dq6Hgp#`jyKHt$>C66J0)LvWo?-%dsLs6{KDu@#nFMy@CK|LP@ zK>s7(YVI~z{=0VREZomC+=!v(+XA*=EGgGgBk)jGH*H~XOD*9Y;W9ID==%9m!ho|< z!tmhVX>xpjl88h{#idW010Ys9LB$IkdKT2_2XAZvtsDZ)K7fhh`-c`9;b~~dcA-d@ar*b_O&X}eFuboyy3|utC8U(z_0X3H5f}~DrjV}3ddQvv|`VA`iaVFIYfxPk!`jBq#bf*9Sz~#bXWs)%J;uS2Q&dx;2 zVPppogT5&$`T^c@+82wciOlYc{X|q77YVT_$CyhNu%@3O&qJ-@WnIi~iP)Sg^cUok zV(hrmb!lM1jAxhs58Upyy7BxC(w_Xu_c!Quy5hH`NKtipo+S%avI^g9ka@0)P|R{f zvI}2KIt|Eg6_alH-<9WlOW%t~&gSwtY;v7KTjtv>wBJogz1bkGnc^wM!=bT)3ew^&57mYyeYZo*Q`Gvnn*g5b?y}u@{a%4 z-*f@;H@WY1W`zh-iNrPKOVX7BwG^)~oA&4}bJRQ^xb?G8LUiNyN-~cYW|~OwA_?(L zLx{$_u*9#UR=u!>@GJ`eIY7P@7)zWG{(-w3g&nUqhUmDKQBlrUb0-iP_{yPHE6`R8 zA%?MK!k9(%}HTD=#;ExHDZnk9Jik-_J(WU zE|zYf3#Z~IPj~l&oMKmkC_+;jUxJn|DB*?uS3GFwAjQ z^q}6o4Ws;JnSqNFSh_AjJ_k0;d3PqesTfw|JK9Cor5o_jv7nnFU1L&-XNF%k>_;jga~wu0|D2f9_b=(@C;*4Sd4&PX zx&$Edg&1JJN|`Rf>;o8~;TbsZANdaM0MM7+f>8Q;d&@plO(IB7%qejN`)4!pdT;Jd zpjP}sdWvE>LGh3XJ`ot!N4{LDMVm#VC}-dn1tywChkg*yf^G`}nCq`;(@6d7IhVTY z2R+o-#mB%Lv(CNrj?J1OhC_E4bih;Yo1Gm0xbE5sj|po>^Sq1YQi%b^Vx&r|yDPF% zz3s&@L803Tmnw_KudazGT#fq?Ix`z9E|ak`T5JoD6PdOwyP@464a9>k1L8qH0P&zx zZc7c~8Dp60jbn3}Al25pA3Cw6T|b69JDGnYYQPUdJ&2Z?>fjc3VMHFK1z;b|gA{^! zb#P2zcm&c4XgJmAG|-PgZzHCJw|##XijD8uQ0Dr$RT%p}+m<^smkn78)1lbcrE7Qc zs{l31bKRzJ3QChtH0%)3Pvr6kx|?{obGAVdS$!H3{yx^ne6!Y3l%XjKvRyo)sHZFy zX@Yb@lS}#EjasAKEr3g3eIzhbhL1n|5Rx=~(8cnw!vJfTy)ueC{OCJvfsC`~biUVr z-`^!a;#2Vu2WFy_pgGZ2@sv#jYx~gFW78HLXuGxDx{Gb`kS zp(S2^8OX|d@vgSV@|P4ut_!ySPHfc(bST_yaJprSzdb|q$+z+JtwSweu%?v(H!02~ zHj#z?o-OXrOGJ18SbTg&)|yN>j`=gUJ`u*Mt}O6um%fTVuf8C(9N|jS;aZ?5l4qIu z@VGcw8Clp_SvdYr^eq<`D>{Sax>S|G6=J=Lib_KT!niEZm@uT+D3$M-)37HzPX_ zC;R`z`NFWX{qHSP_TcJxtjsKoY}}lz|F=6UD+?p2GfFKuJtR8^bGoeqI9|GsHWUGX zg@uiS{r?RHUazI+O4@w;jPmAW<{0BcXGWCToa0|7Hxv}!%L{BUGaUIs;Z{!&VKi6I z^IJ?@+o};fQmq-Mz+EH55C9Rqwhmep}|zFj`{Z25m&oCxLRY+rJO{5y*k z^k&jH$eCw&Zrt>%1?)Wj{<=Fc_?)-^ObF~;`o@i6+xhtyef#Xc>hJJbBky$LdVdo7 zJXsQaKk5_s*b@p}@B8>oy)eirZ;u1-Pp{-hAnWL;d5+NZA!O zcC>MsW+2wbYd-rUfp-`LE+fI!ug%D|3Tl;8vHW)Ut;_|<{@QD5y7eE z__L==*QCT?qGv=PwItSAL22c3c`IsEz=LtMeIGf|hKBv!m#IH`2%8l;)`!-IEDRP) z*J;GqEXUA(8}J@D9AwWUPAr8(nH#F!2&ZkH0#~ZzXyf83Oy_vRbn`zsa@%d+)+n6QBnR0~u0X>i7A2e^tLH@bWAkq-T9@ysDOo2Sd!G0l{YuGSSzZ@1ymPVr~XCL2S zw1qtj+6=*6C3^Zc9>4-iD!f9B(N!Ti-q$AxH@^6&~^V4ygepA?*ZCXqbkEKG?jC@*zcJXO|?ps!4l|o zY*V2$@X8NoKE<_EABqFBnnqQ(dMf+FHkV4E$+*eiN>_FxG8}t+=%ea^SR@zDbP|dg zFnaPWt55YO7*H~fq-u)V>qp2XjOicV$8N54T6v`ptPIkbkd52`W|Du6dZs1VqCGB^ zhQ;X?qQ|Ef*%MF`2bqQ=3?4kXTIZQybk4YazdSxNNi^-Zv}Z|XLTouR)X14%HD6Q5 z-v08?L2bLN4anDkCnG!S0bWDbyuD;G@Cqv1_^BY2AgcfIG|VFUtmYRD z5w?(e$$v)&hvuisShx1~lub~?Aoobnaj|+0HWqatB2D`F=RN=*limcczXzeU4GsoL zMRnO?**8xK5)&Jj$rV9;O*fo}!knCIGb6FS`1EeTxqm?2HN$psnny(@y8bq0QhE zlmu@zlt3c1ZJp`MJDFIy{k1^<1K_x*dhgJ?*BI~mFz9|W__()7csT{7|9Eq^h>|Yr z%Xg6Os>{*xApv+kNiRi3n`y7N44On27f?Zt77ej;(Rt&dz*Pj_xplDDM7-Eed2Z0{mdCs2f-xex@-f1&ezZEF`bl%4p-MGO5NA z^|jp;ij)qI@caLy)=OKfIBTXlyS_}G>@b}szx(MFwky4eO(^2@YgugGvRqz&rj@v> z4IwXZh(fSA`PqeX3gBm4IzXF*^XBkuZ|$$D(X%BU*Xm~>lXDvHQxw^iJ*J4z z{1<3MRYE^Aw6zsqIj!&!A4!*q+nqGR4z$_s_-$F)L+EK-I>BD_MNB;JxzG>Xjnw0> z{Y-71AYAD5iFzhN%{p>ICnky>CFo1G0^jyOxBfS?>){+b$N?zm1+0=2X-(}lHb5!Y zFn;Tj1XS%S?YUp$xo-DcQ@^1O73;=#2nYi=^vB<5+hFKRT}Lm#8N76yeFjS3u*Anx zsHL<1P1@L_817CI1?ZM={F(u)vZIoWB*^zk@U$-V#=y%I0Ob>D;_}apEM6Uv<#BRg z2jnS&cGf~``_$sd(P?O}s%-Ng(kvxU>UiSott6*Os8m%H7| zRqMP20*H2CR1!p7wQs%uOnV9B1G|apP4rP#cpt84noeMvEbxMt!fSJm#najlIUskIEnD!L{3BWSSE{o;F0nqDF z3-o#v!6!YdR2tA0urmMPx~$K|L0>JT>RJUn$}-y)Q3*F4pqM>P;AArtt7<-0J^Chr)dw(SJARJTP@kLiTq*}pH)l${RyJq)yguBRUuW~t zsAx>t=B=E7(tkdwksiRQyKFZdGaJ7e-e05gE-3(?2uZd<5gkm_ZQ7=%3%qV78d!4( z8B3#u4gan@IO#y)+3tW8$naM0M-JyMg~mvF&V^>m7UM6Wj3~h@P~<^zf(fu)@h^so z-&}S{Z)gh~-9}^dj@P}iapuHKiV>PHjJ~OLLIrb zXbl`K?jACPJz)B_NAp*NzBFa@`!_TBu-RXn1&o=P!lI9MR#dsHbbkQym?~iLm@0E4 z6~^!@JWUYy8Cu}(lhvRHQ4b(urGr2U9HDF~?5h_YQZWzpF`|qHPLAU|7B=08n48rb zHw3v>W@L5iA<}^cqpGs{eKl6SkK=7lIkDgls*#{~+3A3!gyc~+B?bE^f*xFx1^PTg zYs|H=pop(+F^I3c4ERh z8r=fnY~FVqNXR90m|!p_V(+LxDd;t4)L`lW?{VX6WKD(Y@9BY$?4t?c#-Ld}G1Vp? zytSKE{rmUxI8L>>bt_KrqU=ggqaw~~K^7GNWfzILTV%-4 zFvmlLr|ulBlWnOw5Y##ZFU?e%rm3_#vQb3itBpqIPIwaCG7`n{W`+rh%B{qstX@bq zR|o7NXGgLmB3Uuzg7QySzubgdI=CGSA9sc2qpg&@Bjt*7cu!HR5BPeyB9T#$@25oGB(r^5IY2Z zbb?Szd;)$-smzM(@f5ANGklG$HRlgartGX9Ab@$Ibc9*LO#r?#6R(^bzAw|hzuGp6 zo5H*(64RK1UK*Wl$hn`sL3ALH(0X+NgCze1ZBDADc}B*1xc2`KUMb#(XUR#T6Jxin zq8hMT{++5jc6%pdrjq^=JF!2mMyUL*Vy^eO(g>(fptwFbrMZ!>nl;eEdr)5J3MmOc zep5}l8-Gn$PL(318l_XJt4&CX*wOc>sngcFt%0vd{Jv|d!epeKtWYNn5#hp(>^(*I z(F^yRl2&n$mX>6emR50(hn8d|xL7#0Oc|l$UDX==98?@>TfiLYTfp2ITfn?&S`;ly z0Z`WZDiDu!68S|)QEC-jQP#kAnpeBvG7_(((Vb?N;6Zy6Jm67s55ZVA3HLv)Kr7Mw zFcneZe6fm9sk7!#(3~M9`PZ;Ors46U1?-W8l;oI}lw{?<5*!kc4-5%7u8y3qfeSoM z3;ENYjtLa_1-s&@iL}W>$_%H=z7EL!#qezcOXmg!4T9=Fvse)tc}oZv=+_h?yon44 zPWqto(f3zxrha577F3k7RvrpF<~CI<#iK*h2liL08xV@`;@Qd>C7?qGc3fR@)SO zKL_D^ivX5Zxi@hXeSp9yw58mnwrPR7D@`Lv>DXZS{D%;0LEeoD^XQhoBPvm7v_`-g_NKQzM2Zpo4$@wgIhMQQ$**Z81=!Km`VxK;m}H_9OuL;sJUm&X zXTxScIlkF;AwA@RqnK^l;P|MH;cNm|$?1{)&w|nLsZ3XR+n!wwm}NqlP1wW>GJ|#? zGq?>hgHU?_B%PR>1UB&G^&B|nj{1_U_fj>0HkB|D8&j&5ZdkEK!GoLEzya28E(iG6 zytn9m5xUDRiI`*qCaAw-WTI=&`9>QGF0p=4YZX7UjTqJXbWyJ7viM_0UL;1(%*)c# z4kQ-EtmlJ5ZIM&9n_{i?(ipk%O=E?@3CU-7-)SKL(C&hxkjGA1o$Zd=Y2VyI#Zxow zo2xFU9w!n=lvaX?$71Q^6e$9%V*_QEnY@nh$qrl~SVn9InHf__Q)NUh9MOg?Ljvf~ zA!B&raAulu0#UlvkWTS}fROW#*5;+Z+)T)IziqQTk5i!x@63}3;J0%3BZg-L;a z00hzTq(%R<5zVX^&W{9X*Y$K}RRC!$&QsE*B2%#$C(#@z@|*60B4Ke|vmvA39bSyu z0ej+9lv^_&-bVY_XLpt?ITR~At)|w=a&?>*8QMKY43tovUKUb-Q5KSKq`*uDWmhpD z7;0tsUn%3p_{V}QapSHsrhc*Jy#&x+Hr_!5^R+{mFT(6o)5$2k3?Pfx4Fs=Bl)NgC zVjv;s4Qw5?V}?>RxFU>!T+#@O92WMOn%sgNkM z=`*^o!E2mx{^I#{-ngK4A{{etcGRhO(bn+8Zt^C3@l^qN_Yb%%ZsxLob_?KBj0Qxa zZr|6i^1dYV!NMp|B}};~Urd4tT3Q!^u%l9w&XNE=$yqt-z#9LFSr6BAy&n$bY7$k| z>Y*%+Z8jBu(+-M6!68&uSG5gBC0>hULBJ9X#waa(=n|1ev04`j-Q1sPB^ty-oX|>C z!a_yEBN|n?>+hjI%=Q0G`vd+7@&__nazbst6&_h4X&Mlf_!qSJk-Ehwwsh6BA%jdy zs#YQH;oPz#jK@NVYlR0hsv-&`b=%^rb~pEbxG@-n8wUyRnFdM4onbr4i%#v60<@7_+RNFN_@^kpen*e}BtXM*;PFaslTa zghYei^8@V)$o&I4AN&^Q;0JBkOrG~QPN#@5(3lt7()EvGq-I1^!fg&Aa!}wnJL|;| zzMae+a0)%?q;)=dl(3j~{Sq3BfZZ z=rkv;A`+mZ6KL33)TBk`BBhwCz)J1ZSXD(gQ`F>!mWC`JH5>&$#&jBTvlOzPwDfrM zV)Zx7|Dcd_>0hC7lf#lE{y|}@lUUP}ZTh#4z|OBn{mSQY`%sjiMFA2N#q zHd-|tnoo$%p;uGZ%vSuRo*_cmuC86gfATIUl1!MP|Mr!1qGl(n& zslsGC4E^B8_|besAIO`~sMPiJGZ;00cQ<+(7GxYYA{PBx(rW=ackTXJowH z_?S+{j$r<`QZR6(s0x3sstSMY$SIV+xBC9)R6S0{o93F2{zMHZNymcI%H#fnNswVt>b78o5&t6m>QHGQDUooVAMiMA3^>XG@uam_c;3z5U4xf62P{$@I`H*4A9{f<$h9gm;Gcj+sUj58SQ7s^xP<|~ zJy_;qXf!9}jGALPA^>EIYOu6e1Cf5lLeTW84pcsIRjJMKc$Uv?kal$kHBTk(%2oU?`Vw3eA~quSOX^@0lCT6eK*wxlB>ttDeNtpMI+c%3rond)Z~8ShOb zc0eYIjJIONU=k5BymtCM)M_(YU^=y8o-Yl(+JhiQ8iWt%cQD{3jbiSqJ4d(kH;E|b zy1f`?@_+oRmSd6MtLYm=z-(7Xvmni#ZqIS7*A;T{#8e-Ui(n|BGeVD(EmxwU??#AP z3R*SIb)ifFRo20q)&PN6LuI9ycMm%u1=w zVB*w7uCZ`xT8q*yqq;K}Z|O#wQzw`uqGkkVEZQ58yw?p%zhq>?fh#}p*(}k6XD})H zesH(cUHho2Z_n1VmEpY#G?Vgv7<|ChPfzLd!@X{-n3#RFzB^lI<8-hv-q_aV@?Bjp zQ{J&wy{vP%d{-vY5Yml1eUj3Jg8RKTrekW)M9CnU@JBu<>VWZUa1y(_8AcsNuc=WV z(7+6MBR_zDrPAOljz+o1J4#%>6TPM(e@r2MY0#_sO1p4_sVnHMBJOs>nLC&u^3Qv- zvlFtf()aiCHp2*BcN{cXB1_$CxM~A<2(=DdrmrPlJObU7<2M&0;YVI*UVEQBu!{Tq zZg|zrbP^-;{OS2Pmxj}}W{)oN);r7IV>$pw>iDIk-Ss@_V^hcd~J;&TcRh%VGI#Q>tUM_ruL^;Z0euM=@tZY$1jVU-U7Tz@Cm=e z1{0bJknyU3#^uvrN==&1k+Hc9tAk}=ZAn(f6&XE8r5V7)!z0m&=Ri{yh5G0Ei#-wm zZEcj)0F5(1Yfj8epII9ER~WSrI!Vgf&Mou7L4s*3JO4Kj=swHT0wIe6Rr*<}u5!5W zc1B*M?SYG@mkVKtH~qavZGxNQnzUB6=E?PjGgG65zL`>z$%#(f^!IAz6Lt8v0&VKS?h_VVaG~uE!zzRzq zL;9Owg^Y?!?r+gvRz$&-uQGHA`wk14uiCNNEz2Rc%!b4eV5FRdx3u&#m7LYbP0or# z6Fe-mZ6y_-1*tvq#j&sUr_i`ZCbx&pJU1K;)ygJ{B|o&Z@sF(rA}{da;+||k$%tj; zH`cZ*&fGBScIsPbJm_-khhf=JFilOP3-Bf|(?`UQRK*f?yrN1kSV44#Kfh#rR?wdP9)c%tdI6th{}6~>CGMGN5v^O7&-SH3p&-&PJ6b9fxh zh87)0fW=a1>UdduAnV9PaX#f6bOu|3l1U~*#Bxe6mU}3Vv&bv!lZQ9w98>w=Ad+?A z#!x_#rzO)O?<5Q(lP38ABp0Z=Rnj%n;g&rjZWtk(CIq)oGxUfY?+0Z7Kd1lQv|rHa zcvIZQc3mq+Y(Qnpv%P&WetiIw`B#Rqq9z^9ylE6r1>{BZ>YoVdP`J+zk;&0d0RK`q z>wdGjGxQf+ePk98ucJd!4_@s%x#A_c;ZLS{7A7TwQg{9$r^$ZL20YjC&PLUAs*Nm;|LYQMnKDCJ#=iAiMlD%;0SoWSCq$jN_on<~s#)F3uvH z@3p(hDww0VV6g!Q?s9ofdDyZRrr;L#Ar)GvfQQAl&hGMCrHGzcTqPXTAu5$FyBT9; z?^CJ|*$(MU7Z|7mO${;5!vJ|D4>yan0<6dDGRKd24r{!=ZwcEw%_r^MEbfk?MJ*wh5T8d5Yy+ zB7Oy6@~JQOtFz4G?%5j@OPV0w1Q6o|AfK4QXt zJQ(QJUD>Wd$TlAM%gW+AKggf5?LfDY?WIpZS~PEy1n>J&$Mp4Z(AWFE4D-Hx|C2WZ zqnq!oC~giBa4rh@d5&!LoQ@}$()+CV3*m~-F8hZ$)**V6Tsr2XzYd##(;%udt^)}Q z_YuP%Hw>0c%>ciJAuS}Mz91s{|6e1UEHDH?i>#?o9%uDV&n zNz<(~5J+z855IIMoU?|64`w~@sO#6PUjo(!k|)%e04FtQsG4=@1Wf$UOLwxuK5iy% zB|Yh44S78O^Y<*I(mv3E*iS9$D79C+XWtgpq0jOmsmY;l#(RwC*EY(vq4oU~{>r(u z>lq)fchCO5;!3rtv$L|ntCB{Z7)6IhvE0dVw0Qlh%XnRn!~RkTK6~nd+1IO3&*iOH~R%Gm&)u{w5kG}DFzzuvnvC=-pr9Ij^bi!6Y_lT{ zBKB&QjlH}G7oM^zEh`fEtN5v)wt3uNo$U;2FD6?2V3tSZ!{}rEl9W$dRhF@@&tDDH zmw6mC^^QCgtN}c&OrXT)E1%mQwkQCz>cJVet#@^GZ+`heY5T%@>*CX(W`(*bkxv_OSwJRN%*KNEfQy%(&1kKzol=-4_Z9AZt_l$<~ zH?5MN->m;=?qyMut-02d(qWvq?K!SCh_lqR#+N|i4%w`6y}YW;U3u+Ql)rhA_E6x^v5I9sX!gIQ^JnVgfeulBZV(Gkqaqy5a) z#%+EPMLft*DbN%J;ANFibEdR*wTiq>>l>DjUfM&{HCh$@JaM;u)d7gw>aM-rN(p7+ zPKq;l_Sv34)!J1#vgNwl>dh|0WJb2^T?}kZi`%TM*!0E+xux4`yb7MK1tR@+w5W3= z_AgkTpo97oby_1}sO~T16ZZJ%vNwXGHYR2uaMBER=7368X~f+s@#nc{MAeUy5n>=O zICr%s49B^W0^86k${yfb^YJ?5PwEyc>I#hAIqq$*>v?qwU`3jFN>0m!-&Qa+_kM62 z_bVIRkLmU7U>U(Fud`UnMNVFPB|A#$l3^|gnR4fq9c$4L%a*bHsqRr$|1gMHDtRBR z&k64jYzgh2)HpI^7^^KMfv;v#D=}xOpzNFDwMOHv`yDSEt&D-96 zVOB8p!0}x)uYZNd;o3N3^AdXshhr0X9QQqb986TLw=RA16Wr+7uFw%H)=w4e5rjHP z2HD+SDd%R7Ui#dei~y=S2t_!!2s&a05lw?^4DQ`Hy#NFVkf!ri%0xgQyKI?q#|4i# zqfUS86noodB)5XLWNRCC^uCj)9Hbjw`g+_?(;bX+wqAbuA#mMw_mz$K=`q3uzb3Do z#`!;jJCk-cRL%$RXB+Ho3^|MSI`Vr(8%giak1-B@fSzSnD(KE2aO58Q?238jo+{{UfoxtwN z>K0I<^@rA`jeFg!lg_M}d-;VLMphQ9wTiTsL;-jZHs?4DXRV3D=E4Mq$+(lodw8~l z)Pgl+hS`L>#(P9TxxN2#cW%?UUT&!jw)Q8o`LC(I-ovD&QM#It^`)fB2g>W;O^ z)&$&w`T2;@&_%90n&`a~*GJ8VY2ASdUIPN+KNT7dzt(=<0WQ{0zs`596q?4Yyf^r? zP6%i-??|lh1kn`)jaj3*$4qIxh;{{eDrjk(EyM~pcRCmn--3CoFBJ>~U0eaLXmI=0 zX(Im!F)j$=&Hi|r4FCPGYUuC(IN@WSz62<2XEeMFe}K;q(rA72+?3>NbwC9ZOcyr>JcUzc9vbL+nr6f9pBmiI|Rw_bD66Is$;nr#-F zZPEI3Rbc+eS3m|Fl@UIM{?2m;E8^8$5g!+zJHxmuuDkH z)RE4Ah9JbLz$ivMcu|kOc)?uXcSAn^^TIX}VvLuDEXOn*f;RNi%fiLl>*YV&?`p2O zKmrFlJKLeB`%`9-8?>ht?y#q|+)F>x>BM2RXq(2K0HROh{VC&JLjg#9Wjiqakt}Vh znw)!|W3rT7BhQkkq!1`ieBHovmyZ2%OJ<fAWotCEotCV(EWD6g5p=-x}$*xg&I39{posH@{QX3_1UAgxo`8+WfXOcVeno% z5Pz#k!dkM)v*zu4m`h>%z{z$0ot6+e`@8?1U+`l) z>X2XDW4npsGvmc-v)oCqpJ#ThFPSv*%(zO^vYVffA9fdPEuqe&i8C=}i&gM@?|GH= zgln~=fKaDnE* z{=P5tql1&hD~>HLey8i*w;A8v$;Z!n>S=mj>anaNGNJ^cvImKFm*AZhpoYM_QoAe(G3g7H2hqo88RqfVE3`( zJUG72rEXxa`O?k6m@en1Y0vGj_ovA%dQ=8wB}YE_nF}DawN~WT?AlRqbWvyA?O&_c znJyE4ANdx~82&ckgi4&l_%uc}cJAScn0{SeG$BUJID^*ithOwqn|TS$#cu_kIaMRb zxmaWLeNX=>+QUy>s=wdFs6<$G8Zo z&=2o;a)P-lq5Fu`hXt(bp9+9d7`Ea4p{SWWjBiyMzE4Wd0;%r+a7-T4>~z#k2=w$w zSZK8WqNVYWbS@{jUuAU5d^8 zU}Thvd6IeFa`vTOz`Iss3p1s8e>%T>kfmDs)U=%9JC|c@9ON{`s^?m!p1Iut`xw98RRDJeo|0|K zJSJ+`zZ5Kr1Bja&du)Bm8t_*CUG;q}Ai@CN-Cu5~H{T!o5CpfSJ?AX(t)Cy}D$SoE z+Z2G;Llf% zSKl(9xj7rumYz#nls)9uJGPK=r$Z~AmU&I4s<}kV=D0|#etQP~p!@@jHX4 zPbu}k*x!-#q7`Eu!))x^iR*Sg9tXkjMT4)yd^+p?#F)9E3Z}-D*#OA;qi15wDj3tu zqy;>;5s;-zDG``sQfiz8jxmQR0w;tl*0zq%d2D}f8StZcMyxzC?%2rMmdQWGR+`(L z@>OcL{{;T_8_=(``Qcsl5scPev9qe1@N#eb|KaN`pyF7%M$s_1ySoN=cbDKU0fGnD z;4%>0f-|^VaCdiif@|>LZXs`ybIy0q_uv2BwWfQjt9Na$nyK!py%8?z4|4B#OL@im zhn7}KbZPDkUtQG(U{bMFmUK4B5SE@r|!mtqlglLcW0LR&VU zWUz^?eGkMq5B}WluDT@uk>F#FQgs?VLM~VC8_3gZoGgO=Y3Im${>5~^#GaRIlx_4f zU{T$a$2V)Hk313|DyIFksNgzWnakG2n=-B}zNw+J`Pcku1GYNU=T#k)#f&lS1 zW{mc>j*EPfW+hH11PJKp5rEOHX(=q3ZeVL=;1Eo^w3#XmgdRT}?OYxyiSqYg6I(Zl zQ0!nacH-|6b0Y_cGawI^nNkg^8Bsl(~IZ@S7{h|fJNtqF+$@>ANc_r2}Sm z6P$JSte=}np?U@iWT3TMhuPq9%_|v4yp&tuGEkS58#rOLO$xCsxk>a zw#iwXSnbU)t-gmDmY0o7%!xO2*l>%CbZ+oWcJ7;629o7_0#Y!sM6pMXm?(DJcl&Xw zw)L6byJR<=_}=*m$|On_!k(?^*55Q37sO|wN^8_@zS_sE=gs+(i58DT;biJ#miIHv zk>|L$5is+&6bC3a0&|!`nPX*GZ1R6>F`}jBjW_uR!d5MwH2yGvS70zJuBMxg= zh59@IrPc`IyK%k$rL6@-ae6VnR73{NX89ebvYh-}5RES|ZU43Wc|-xNBwma>hvvJ) zr7}3yvu3TOl>%%!uC#BhzZkg%4jMHgB3@7nG*WLNG}PrR0LIt?BGA?fLaf{+gmRc2 zd?X{upb^>;HTVZQ*86YUg6Re6b${ZSDc4|}5nqAItNGd>*;H&FXC;bGrcM(eMWg+h zOSgL&4H(Op9ulc=##udrqcNbaY;#pl^XJ52Q_GeW@8652{1stRgTNRk<7jj1{v5Xg z+CS3t6v^LI@C|?;CXDWg5UxfqSj=ET3zRv$Gq*zc9{mkhNm35{Ls|AVK_drm3KE+N zSDB@5XS;ELH9gC0y8%Oi8%$J+<%XYCY$FhRJXjJbQiVoCglMgja9oq2UgMgXu5aGV z?g+XM=e7oe`|C4K?V>Gb|CmO3pLw}f0kGyJ*ilMq(6B7*M~&BZ&S48;RUvNqjz-V7 zyyKa1AUlYEMir5r6c#fSK z+}IupvUQ10GN_mU2EGBZ zP3a)EZ9-|hYnTl)W-v+f*MEb>v~%Z&GAFsN@Pp^WlC2Oph76azgye{MOQV*^=k182 zJA?-mW2tfiO$~F-siZ@rGA;pt04L7l77c?oilhl797aPYcS@2JLu73r^Cou7c{_cY z)K|Jy%p^2FMtQReOj4d|KFCEIpzuB4m)1Jr6qBTFchOn@<&mVc&eL)TI`)?7&Q)@; z8oj(JqHD~&qy-q!M}`5CS%~~q+Y{1}Me=9vDGS#GwZ! z*G3w@RafedVLxR1bhNu+d`>XeE{6Mbw2&SK7viyvSXdVt{*ISIz_xcbz7v zb#et>_nV!vyi;PCQor861++7$TM5QiIxV?E7eMnEo^CBybS^bUSMmsBst7KLmc#_~ z!jsN6*Y#!Z`Q>5~`pl)4qsCIv-a$+T8JL=OC|njrU5!5O-RuwrS7kJi>hE}s?VK3% zJ(jnmG;D*Emj_guZ2X|%le0b!YM0(5!PMQW?8mmnKGCzA)_0EqfR7g;r}&7!imOm{ zs3nl_S6x{vOD3b`>JpwsXL)Ia3pATJJDm4?nPAEhg+`hv;?_nwvrW|z#f;){2hLh7 zgCaE}5xA)!LQlK!<|j6za;*<9j?LmQ_6uqR_#cq15YrWET(NK)$fM09?73xGP~jt* z@-BZaIkdg!Yi(+518OSKtIUTQv{6U5N!;PkcFsUl`5(n{>Fr)gyL*4&9445fFWd&? z`wB5LL(5Dh5omT0oBO{fZhG?C6W^<~Cc?WFVk}*0uj7jRW%cnb-9=`lUQlKV{-=YJ zn%)MLk9~x|uV=@erS)xUC*<Ko0 zi|75?1~wWuP}VKO?V~$w4L0(qu|@@hXDLP{&M-9(g^0pX%!c$kR;gE54KI6fSB!Qt z?C~9rwkXWc5-t~`pNy^bA1%LKyViZ$=2mE$4fd7jcd9xdh~hraZgCFSdtHXuG19H^ zET*9+;I^I#SOo&JNtP|88R$3Ddzg7Mx_BhE?~!rdfxBp?Zy7n~+z(NvCL|wr^-jMA zo5VR#yN(K>w z?YbsF49i|I103!s}Xyt_wuL}O}$%D|@HR+A)F z7031dB`+wZ9I?3MHZsnMLqKyCRxg|?eOVj7=9JCb$jS_6K%mgIfxALCt?RVj9!?tv zx>H?G+k3`hIJ5Vdz*vvL&f=|kg>TQVFdOi;F1}z@oN-Oz`-d2EU(<5@XWyWoo$DH> zX62vkcz`F5#S)Ia4D(u%jR}#%RXc@wX`;GT&!>*FUuy&`LeerZo_)#oM_5IW`pUJs zwp?IC__)qCkggF@&iYxax(~fAQbxLo$5_k2fAvS3>PZJZF+x&59Vvk!R5nrj6!_o2 zob^@CyKEAaalB-&T_<>N;2E#^;hsA+AIvYQ1Dg+^xs%ph=+7tDt|P>Nyl1KPk0U}n zE@zKvd1pgHm<_%vXP(jMtHIthFo!=~rl1yln-4U$1P-#`or_(jzS`^lV5hy;|5ixZ ze1MIz)p@eS(?f;0(E9KN4&nxhMz_@se{elq_S?>M4E&iqRq^0iOG^v*T`Wo>aoG-b zHW0js`tsA-MIm&u7Q?S;+*fqFW4=2R@6UpTL5@xaKKRJC&ldzfcns&BOh+zX)B8Pi{;Y+_{a{&_xuGs3q>+yc@bH#=N)>&C-XVe5N%; zT4(v749qCN@SWBxn~sZl*JCirw`#Q~Ri!_@p8bpe=QWUJ9k`9ZF25J0DeP3G9n^!m z0#oMom5ZBF;N|%~yKTEKyDQu8Mc2LS*Ll#CH@q@|ojPJyrq=@Uub$IA4#CTt$D8kw zi5EU6cK44wMrltp0>%7vH9x05D2u@7R-o;}`xypRBlwB*#o%59qmA}_%(QaMzJ27F zX7u?;{gMLga?AeZ;`NG@r-RwH@$R&3qiqW&b-#ZxxXywib2{m{j5t{7D9N5b6`zjd z(@5v6!O70!8OnV`u}>ADU#!Cp#MG8dyNEA$pF{iG1{U@YmYXSF%3iOg`vHr}kJs{k zem>kyfwd{I=QGRtQ>jgr`||7`J=Fx*?~hsF>DJ}DL`KCsNuNt3$9Yy8KNN`(E`0H zC(_dNHnI|7A%`O2g$h|KtwvZXZPc+}&rsmaY>1?0$KqC*Xw(dBF2@WnqyiUNm>O?C zrmB@CkQC4IVTI2WLw5%})4W|7IAmv&h1Ex{hi}edp9!{%3xIgc3oeFXm$kn%JPd=U zL=I7Tgp1M9tnA#9iV9(EenuSJ zXT@MqlX__jxBPCyKxtbdJ)*V{$ueUkG$yi%z@s`GnP5*LTE}^MeMpDxuMn|C!K5S= zjpDU4gRb)h;c%)pC*dQ^D$Jc3VNHo`;o6#w{gANeFh}7{T2|p7ikZ>xi-q1w6w-$y z0ZU6KjbEg=)P?ZN78J}>v;)C^QTA>eqT*F`!o*cSQ#^;QC|$6^t!YCcLbJ}TLwN)`rZie;nXkbF`IV2SRGR>o}nCsAzLn^L-HYrbO zK?J(QgdV{>Us0wSvP}C>A~Z#uR7I4~NRZBI;u+ z4Ml%nppLLcHew#i_XB)AG;%dpN%bk5$6`R>j`1b|<2s zWJ{kax&`50!MPk)jrO($m}4%diOyiHJcKJ#reQar3jG;1%Itx2es{2UQ)iyY=F?GA z`F+&D^kv;6D^s35J%8u!fy_o${jUs7zDDxeCpmIgMir$6AqML&17j}&BiszT&cRc& zzk=nOu!NYD>^chdX!duqKj-rJ(t2)$>S-IQw-{>nB)66WvP=WkfDY5x#ma5#G%nj8 zI@}pK!7Gke3b3w4%R+ z6*WlC#c(nVdDm}_k1*^UCq=y@82L^Tx0f;Uo!Jkpi98s+(Y&jn45_^`IUG%U=D5^q zMlqjRujqTp*)*(JVPMjW@$AnuYc$P;f*{%k8dlw3b?jJdniCPFilOavx*cY!Bjhx? zSZd&4dy=1Mlz#ULw`8e8>Tyq;q_8?h`k7>1tXS-cybG@^De5#F<76r7t9B$Vv>`@% zgJ@li&KzBhj=yZ^h-RE6h5o#bwR>Z%sHsx4AaGVhUMR>cYKIh z&_Q61vyyUQR^Isb4WU1Ul+oQp^CWC*=)}j#=oJUn%f6FwJ_2Im-xNG!kw%o##$y$# z&3}C=exs=%m1|pn1m`w`{HJ;gQxe7ANm4+DRI>+PVQ zV%z;YB^jqfwV|IvBH?e6{?qAkrnL*H{W4o6*Rt<2kdjKN*h@KA zT$Tg=jZnvbb!@QEdKk1!^Rc306rVf+=E3?{b-!SMzj&>pBcufS^mAaHpi{VMQ>1C} z1uBG62;XuduO@(hvYZ4w@sU3s#pfY2xA})|WwXvSDX06_6GS%q%{R%qznR+Zvt-Yj zt41$#WG8pJ>WE#z_ve`LeQf|f!!x9ggf ztUL*`+3?4p>Rf21MZK*yvlbTK26JC-+MYqb+<=$_f-Alu`rCVpA^MDQ#A3LHXT*uG zlTOM$YtK*&_HCX~r-fl&l}E?<0E1edZWIx+dph$-#F7T?-NwQej>-lg#q&^PhuId^ zXgm$i7c3rqPM+?1%TwD@%NABlRmY8DsB36lbk~vCyw^wyrZDe-%F#hO31>fMJ{^!g zj|*Y6l37stnDAn}v?PwCL@JoegKv7V839WyI`8W|req|z(Hx@*QRHzY7e* zI5Y;@iZo}PFD5N*qH+USU1oyK8@fmZ8NR8Me{fQ+?s4pjtc{MWwFTmLdK(W4hDT3- zTswAd4zI-ZdNWEdgBeDOmQBsMWx>uRb0D^OTp}m7*Z+)X!}aZPso=~}(k@Je|Hd>~ z;^y&FjWFB6d-nD+v!NeY?6>t}A205v6KNg{R|IKGp~~Y}q~eKztiC8nm9a#0`Om2c zRJaj8LaNqLzLvw5*K)XYLGUw>dSM&Dsh5G^2ii#}gX87I8VCXhbSmuHeQzymU~i;n z&q~mtw~Gcl)->p7HT-10q>WJ~CFUv3mOAeDompOWQsQJ@q7e!?5ghE}$V~R4O?N0r zv_*W{rLuJw?-V%)3OmCL;|H1#Op!M03Y;64;{xBhY*I#aK@OL&8Gj5O-?#E#ffICL z)>thwb>UIip|TvQ?%4Q3UAqWnSJgz>StUF9M8-2b$)wJy)b?5RU}tCGgFY6n)nzTh zP}Pnto-l0rh^@+8GJdl-s`GcVe8bc7PRx!IX3TYofO7IvAWkd@K_8U0w0nhLiD4XU z%+XCN=v|xWB5^m1Aoy;;aAe@YczruIJe!-pJUZUARB1FKi6(7K$%=VI&Tj!p{n6M> z%G*WXYovCmNPj%#@|1Z(0trbcU6#m<}a`z%P35(I!r&;dD->)mY?s-BeGM(p%v((_9X6 zIj6XGZ$gGHCUdI{PPU_M9x?5?$ZE`0IF4@^(+-pQTFd+GzBF=uW|zD$(lZ8}z&KUZ zb^UWX2au~KYEfs__apgs_w34jM=1d~RPDNN)^K7R_a-nusGI)v<_71i8{%!}Pruwf zZv^|dERbTW?ih5Q^Mh)=N2`2x(hDw`a~1``ZGv{vT-68lsqxZ8dpf~$-|Ls(iDg

9{WEeS5#Vj`4w+O(8N&R%U;lakyr<|6730%_?v$GRYcP+y0Al{?&Qv zjDFRCrM@ccnb)t$H`$YC=-dc{ZL$LE{qZ&o6Y1g-Yad_u&ZiQ2Q3tvHAtOvwzVGfj zWc|Pw`3WciRs?7Hl2cXIEqRB=(i=T+7A2oudUyf$?qfrJeq0*lkhBC~Rh6P-=q%AvIk%J3*!!!kL8M9?-*8Z&L-Q_JxZWbr8c zTC>0As#<(Q?_LKI4+}ZV#=M(==M)ZyI~FkEQYxHBP*Q3|U>^Q6UQ1v&(QC^*w#Q; zy+@Qkk{Z>{gn1ySbnu{Onscy~3|I8m@dHYJFbZne%$zl-{U zT(1$gWr;iz788|sx*r!4ui>VN&`lXJv0WBG!F@(Y2aYbv!6tTQy7sKNB;xG19wR@M zmrJXeLaBMa4unAJ^$OAdg589aD@XWyPR;jwPL09I`&YEB|4fwG|Agrx=HOsw=H>&> zrvEj=<^YHM;^X4x`YY%bG%p|coiJ#f0)Pu@zl9(MvU79%_tbjz%WfmO?|Id<%bT(G z5B_A`lU|EcayY}VyfuMF-2R!rVATd};wXyWSDbC&d$(`sex-^VXeH9ZrkkKIK>fvp z^yT?i=SAj?ewZd(!1@LBub0yyYLb_`v7=|wy{oZbN)PRO7X|VBHy77d*zzx= z_AKC6!E>Ow`)t0AAKD#0kN5=0rr#scr|TM>AFpn2J`NUGDCiDukrr)-?q6v4gqtbg zHQ$jN4B70njDdb-2>S-uH(UY7N?Yp3tfM(lfGv-eJFv-b7ig4tk5XMO?&dd_M31=IpUi`$@N-s`FetN@$Ia^@4!94^k!J=rF%( zW31kIcGI}25q{{v_R1Aey(Oer@<%t4*4J@Ju6pdpYZUw*E?$NFVu^}kh1=dEOKp}X zXAU{zL6e~@S@dv)DSXzvw*p=IzCr`R;dXg68Klxm+$~-dWSE z!AA7s|4H~!0+kF1r_*ChRVEV-i+2=mEX~E6-DZBHDx&CJFsy z`6)&cVt-jIN8Jw*d`pxJ0~Rf8mjnRGByJ=)j)pe{)Po!6(FT<&YMtkIV9HcvV8m3K zg5wp1Dm&&yM3BA1rWebm1y$6aP^joqbV;p1LZd0yWniP#? zjTZ_U2(@!m{h;wz6&1w_#^;-`A=nn46B6{yDEnL9Y-3A@bngE@RGgwK)h7pEh z!Cs81I`9=~co1G8kaC&g4xq}>V`uw@-9*wVR9@~IK~@+A1%GU6BKu}3?vGsbZFL!x zv{0OYlKL8m`?y0BVHC4UV~Z)EomYlid7rUmoE58(ZqwktpfHrDcUtGDYg?m|D{ynTh#E}6um#hz;1wRK_v@*mH6@@G|h}|_qf`MHTM?+yw zS$A{HCj8{;s3e=7B@@60eCzwEu4h?Tr2bI&J!l;JYqxwd1TsU2P11oyLkUuL(hQ5W zA&o!GB=u@9-z*VK?R**)VK*NJtm7B6vJRUqB9jNE3`!@&16jLmB054|nVmP2aVLeG zSd);*c<=mBQZ*3|_V{}uR#1A9mWq$I+plD%>5&7w3GkVNyD10|fXPx}SlZ#;bTGJk zD%H%^^+mL;!7c?(rl3YTNo1QgdvqfY*aKPY=9}p+(5i^F{cdYvj>cm7*l2mV_S;0^ z7y_09!a*)n_l_v_rTZw8eGP*e7oNESb>Ph{s0VQ@g`odMQ__xxSaWUk*0B#)KxoG= zE-yrr?&cT~NlYYlc4Xw!)DS;7r@z5_Wt+Sqa#Qr7nS+!UJDw}ZmaATc+B0ii5>zhA z0Rhg6I;N+js*%;E81U(O2TMN0mFJzvurW!NK}eRN|M{>dVqfR)+xvG z@{l!_9$96mxF+Sdi}Sgh*O{IjDYW$GpRrp%i8kr3P%IxMiWV9Sm>h|v(_c6eHNAHn zx-yLT;n|bk^&B=phiTDVlq^l;WQgVKN#_&_weeIA#9t~3wQEQpi#s!5?^Ev zj|Om%s{*|lIO1#^(Wv-;C~(pVHVSk4FLoS+mkW*W%R-gJrqVKPkzi!*PtxR}X@$bX zN>oWwKprfCfBG-x-(-w^f68x!lCSegW+ABfhi*l+N z!c_6T1+io^w(oLbQbq*Xrq;Rf z3rhi~i8)T1eKIg%y`1dKFSC}Kq2$bRKllmkg#CoMlH<<{X*3B6_d}6%iV}X}s56bL zC!Z_Z zkIj)}5EH5;rDHJWUIeX0_5Gc`+hH{hII0`a;uHz4ReYqBE+uHM!^p#mi*+42vE5RK z5SpTrW#tP5tCMk%3v%5dqE$~V3SwAuqZL28e~g%Q&wHob?}gZN^g3kw3kxNXap-bs zoJ-}*RCiv`df$9}7~f0vV@WZgCR7xelM(C*(A1Crh(hk;52L!%2`S2#)nhw!v}I=n zevGpsc1z-_l{)BKDw+xW=9$zmgYU(XTu-=g%-a8%jz8^l$wzqY+U?!vufa(nU%4=7 zO7?Ikz+F4( zJ?Oxl0_4$P7)C4&#o7$P2qu;vmVf9;dUi*ma~t=G+875+oy)`Ls-=?P^HEbe z%+)PD3(_tjOMpXmDu5S!v?@+zk`x?>5)~dOq0YLH+0VHYhaU08@*K6yNzK$Cy+amj zI`Z`FWMdRknBw>lU2`nvWeB?peDVjk(haKkn5ycPg+141qd1iiF;#qEsL+UYlcXqA zW*a|{t*^_p3T>O7$3ts2^wrh#OQ$7BrR>A3NE4S)!XWA>O8Vg$c zz~>Z<_p&l8FtbT`qWl<|NMt2(6!;2l!JnvMV!!k=6;L*Wek!m#u8{o%Wc!?F7_sXY zDv_fp3ya@PkPXtcPf_4%#C3MZl5nz(;c8f;8L#4aAYU zbsh7bvAQeaoBf}b=~)vCO06+S0#3r$w6SA^~ z&(BgOUyzq0M6Sq#2s`|5dHqoLy13gzEDa{lBa*5eVe9cxuMD?5m#E;NWqM@2YeSIdv+dCfMT+JLLiCFDneX$F^>Q=T!*-Mj z&N0qAroO1T1m3xX>`hc4mDPW$EUG!^t%owT`2AeCzn$AfM+hM=sNNv`UF!<1M1uap zXPXo5`VBQ^HVC%kzz=sj-S~3^7q6Gr4Dd|4x*P-HO9SHuyGZ6miX*88a=sdZYg&#a zfoaJ|1LaS$-y9TGgvvzX3Xv}{wwyIxgPQP#FH;{LfT7F5y6Pv@`b-KX$pY@FI#UKE zCP{ElQDL0u%tr9Ih$fjy)&0eLyBuj*lfgWx4#m~HQcGXy-6hUnYacS!m#GABcQmNx zCO<}~am0-ev0?An+NZ{t-uDjbtF{fXIlP--9$(57X3Lx{rp&G?Rj4Sys;Lahh0EO6 z5_7jZ0)})7HqT?%7@;9!#C5};9>(gG|^GwD9*eSI`1u~n!r zwSdz8BuxDH$zr_=WaR$R0JK<-d3H{7S6JpVXOI zR<5l3uCYF}iBlD>IoZo7(MH_4#J67@J?KC7_B2h<*uRHyT&0)$V78A0DkqE4C>XVM zG7awOz3eO7Nw2aNjNPt-ULl5d{;11cVg)fxs=;kvy1f$C*k%3DMycf>jVxTv4D7zJ z0y_CnMG+=$u9t+C9gGnsiSw8e=ZxMio6rJpDYFy>wG~3=#vOlYxY`{$lG%cq(JBjU z794#CX%mS!9~v>G(cO}6?fKNtU%hTA5tlJGy$?I=fwOFLliSOro1Zl(aLUd<2N=J9 zC<-i-X!~l5f-{=oB7=B~yEGSoAneCQ2lRanWAz@xcs&#J0ZQE_dk#`+J-Ao#DuC>( zhMDd`g;Q9SD6L^1_p_L5MW%C@Ra3n&0e0VbSkO*d=zcV!6Zxsq4&2}l-^OU&;TpS_ zp?tukE)_uQGgfJ~x`-Zf{8oXMe0TSA_^BSZY+hJ$Fes4DSp8vuch-^UlW<#s+rZAC#pq9L2INI8KGaHLx2Oa~O`cVmK*R`No~l{s zyRKdjALQsC@dDbH7pap!K62bs3M%1eCUpk0Qu|$0H)Z>l43JLTsTW=lmV8T8rC3MiI6CKtl%&&$oI@KuHr>y9ADo^L}BLI zwXKRc_u*{+fcHsR?ey3#op^}H%ll{N7yXuS^3v0egV8Z=0}fVrXQTo55=e+eNl)3lgxjzU^92i4MIs}34p+v22 z*Ra>o)xq4#JyHm`1*1(22itE?t|Yw;Q8)84L>qU{;%8pvVr@I9g`fS`j^YT0Vm^$K zXu5w)94dy+$mDtBiP{jN%R2;dOMIa1PYYXcu)FfraWm-ny!FuI`<1G%`>ng0@YDCo zv8fK5UtgYnvLvoCSs-)?M_xVyD{hD?w$S$NbttkOW?ngee7{&EcK+lQ-b~uo`Qd{~ zr{oH-ISrb5s4e;!~uCbxhR<0i(g|&T0758J!GGO-Lv}(D$X%WSUlSHjxO3k z)XSI3SnVa}ed&kkBe|?)7EXgLTU*?lKb9j->8WU{$fj$21xM*TFa4c?Pmf+o#@vMU z529WCwLaZiD0CSaC8y2dJ5T*Zfi5-Ian?vvgg5r4p*kDO+zAgMkiLZSjz^V6!$uwvF}|R2uSGA>h#Gvt0ZFI-AJKa zhIMF!a^QXMb09p<@PV;GH2_{90j<=djwd6ZBfjpITwuAEotU3&&js3t?v5l+lKMec=cOal^aLL1mvDCSIld=6lqoKzG_NGD~2~` zg!}#bpf>Fw1GfgWvrTCqgGJ=EEtfW)%?0tcmQ5bj%OvpzRoUB>K4wg$Bo0?d?Vj_Y z7t-iO)USVSrm^0IKmxr~LJ$GjdDz(h>#3&x`>Hi=6u;~b+Xnzw>SGivM9$@csa293 z5wi70+IZ;rpTD}*uB2{)FNd$jFU{V*JunI(QOA<=Es*upQz8Fp1NG{&8Q)|$#yyPY zbG<#ccP;hVvO^8QN5T-WRb1Xsq`D=E_^oVztc#_~cMgK#**=VAoKt-&uD!Agk zD&CI9u6@MYJmfWy#R}kXQhf2(q}5VZU!l%J2KXF?i;wL~w6Dv*MJ|<0Mbj&e`a+7_ zlLD=I$yLD#0^4zi-g!Y8~54{y^q>Rd0lcN+D(ezc0Q89XugVZqRh?+`+GT*gMQJNoR)Gs` zt1zJt9=X{v@8&~nX%A%U`4xi0BsGS+?a`J3Wuk}e`;D#RET^9|5aU8v?5YODj7b0+ z-;QjiZ42aBh`7WH=(gKd>pCd#wPin6^^}K)$$OO9zdi zo||Kodp<(W6(%-F@#SG@ak6AHiy-7~!W#q4ej$p7@jN`^0I>}@hz;_2Y(lMH4n)#G zT`cE@5t#HEu_I`Qs;_iVUZ{w0QT5PJ(mNP{4v;)tl%(A)7J$+T8qk3YzUu#d=Z*Nh zYTVj3w$q{P53*`+K2f84dxU_#(2;lo-S`C=>0(6J#Kg)&CndAXgd_C~JWVMey153u zRCWO{Ma+mBJGj252=Xv@K?Y6%g)N|4R#()BVv?K{J&=t9PO?@iIt(6)W(Ns?X$K!5 z>vqYF5D*^n!o((?$3)H=*D#wbZX`oQ#@azhRt=OOX9ep zJH5ily`5=-?AiF-OUyTVami} zAQS$2l-oF(<%Tmqx>DK>(N`-_CYw4Nh;6;fz;L!udh*=~vJcmYwgd)!Jw2a@VasId z%t=99advNK>IlTver9WX)q6MfL&|#Y9s0cfoP%^H1%+i7k=0@R~>IRqdaYe1kq+^PuW#FezPRBkBE6?) z%SNlj6B}tjf1txZ0~7-rpIp&>Z7Kt1YE0w-ApeLt#V_pCwsq(FQ(ukg;4DZ^pnGz^ zn5c%%Rel?=KG3;M{|Ru?MZBuk6Gpv5v3E4o|0dOP(OtKb_lDF;$G|DX1oprbQ-Bv% zvR!BiK6z7>QB%6dg!TNJMeNTNjg0#4R0*ejl{}oJpkAc*vAHl{Sb3^3q%eD8_zO=T zK6!FTG$Ua#(nw3r?&pHtqUD&H)g>jQ7Dz{Nx=BdvgMjkQi?g0+2>qv_4@(ylqe19J zdIF)pbXP|;DpJC<&ipctsX~<&&R``%diXINYZRRbLXMHbOcZf0i5iP^B+N{;wVal? zPi(EDD<+I=Cn4Q|P&g>;4q=e9=$KIn{Gr~o**qbVjgS)P?lNvMrgw0Y8%8nRUQ(X% z_u~)Q_`jCfUo*qLRWwyIa__9?edr(_+Fnlz&K*y1b^4ao{+Sy=B58QzK-E|aP2Z{c zr)HfTei&_d#b=zV5aL_zZ)oKbub(m$d5mnj6vfhT61Ds$fF<6xux}WUNCgT5mTuC# z^S2sx_#Ei8v#u)uEDIW*Z{NKpRac}z?jUpKiq_M^2`u!x;C6m(BGU_OTmQNN)h5AY z9q!R$8$LhSJ$^l7LN+s4VM?Yt%K@{&3Bw$vM+nK$=RgC4LA=fjvmci=+!g+^(zH^N zx?zuz{vAH86Zk5#_N<_b5dK*bcU9HV=>7;}`WevZCU%p1pZNk-7lC~6&RXOvq`b4qRM)HP^}KEj zWK#Cc=G%=ox;rL}Xv8QC*zc>Bh8BMAGmI-!`7xDhXUqTK%#OLNIpCD2_yxVYd|!I) zf!(54ZG-e91~5o+u?STmf`FIlCw28*rFQ6Sv{RHdop^E`*DV10bn@f&sKkv{d5L3| z&dOnWwItB@oWYvfFL)c}WXGqZ)0VTR(hk&8MAzAMLDOMVn6ROItLZo2%&YqywYICQ zLix>^qs2-^$yPtCyv3P@kKbK)D>dPdJ?X`|e#?_OC_?I%2w#4CE^Vy=zcxBY2BfmS zOf@gX$P!Tf54%+eL#J_^=-2%)cFZj9^!>Cqv6|YD8kC}pJjQF~j z5qR}%MJlc=ajlgycOkDNIqof^F33~+F)XzE})O^NUub< zfEye}di!sw&bq!vgxa>Ap~U6y3ra-MB8Gfi5t=DhKg>{`4LR(}iN#QVobs+9P+;PuKIcCa{?pLs!xcOxkb%X-Kh_ z>Ls*`w$63jCi3P!nzpp_BZCLeC-=!{vam6%VrY@X=N%T#c_XELBcE#4MpVGJS zUoIk{4?}D}GsZ6xe-g28zK2qsZ6belt&S+ieH3LiUcH4}kXFn_dnqxA!{qvS_MzxAG9 zZ=PG7e48{d0h15_cCIEWYykJ4f<6ua^H0GE7r^wVkb?&x{Zr_{2eAApToL?zi<}4m z_+0~{CI;++NU;ELn0y>$tYm5i2rLo~_Mgn{Ke>?cf#S#k*u=aDEGov%;2JVEcJALW z!ovToDB$A)1>ge0iTSw6z#s4}1QuyN9y0Lf?=mkLA1~+<6Tr>H$M?IAjE$A`?{Buh zzuA9(|C=luD+g$X0DuKzBn2R1{7;hLTx0&YfCy|hRxU6yuHTKpMA=xm!B^aWNRhCy z{-F=9;QhaG^Zmh1%EtQtFBKb@#&5B(+1S{~ejk6+U}FbgvHwkj?T@;^6`cPU4e)-1 z-~5xXvHibjfC9(>kyzkG7;NC<9}2wStG^TmZvD5$*#Btkzcj?o_LqjnC;&)s|7Zx5 z>IY2->c#_jf&wT3Tp(mp06YN9FW87UBpm+_R={om78eV|LIY68VE@C+|1mKb0hm$j z-#6hUxDi<7t;}4=-t+#&8{Z%OgBATp31Hs;HZI#AX8`-lKgRu!1Mz@fDFM`fu)SsD z{0AKy``?KElEvWPjM(3TmYVa6oW?&S(KF08U zTCg$%=>X_(oIJk~|5b%W@}C_w|J@91S1=6s?`Bve|5+3CKVZNj{0)N-&(6vYb_KA( zKy2M$@55yTpi%tgLI^C9<}Tn-gbl0|uzUZ@q#UeGa*TjdG_Vl^grTrOvF?zhpe<(T z3P?5%RuCaIfE*+m2MGf*8V8^OIM|xdg#kqnpd=&!ZPTU*pbi3u;~%%uaL}~3GIcOB zCu8H_03px-2%GxE0JKD)1R4MaXgURI4vdl$1oig6QF4K5k^v1(Js$vy000NipWQ=E zJSKo0h_@VnJQr+_f201NU4nxb1R)NE*`#g;$j1OnarpuIUsAxcar`YY=vWXyn(P6< z0C0dEOBk>N`pOE8148lyTtaYyYHlIkHc@*4dLU^2>EZt(%K2y5`Ipu>*}>cW073ZR zmgrt!t&u@OPho+xH2x3ea&m%+D#=wQviAS{yRS; zzm12+LW52AVuokeM+_MDkIuu87;q!IBMcJp_!yt5p?WjneK-UBAw1LkaU%0@0^W3r z?B;6472&BW)0&8Cl%PsNMdJ8u*qj#+tmF-7RbV?iFA8&DV(4|PzBX_E{4VS=x$J$~ zv1oYSaVO^weB%%O4FXYd&SDq4eBJk2E=a$-&FXb_A3Fz|9h-FRW#KgbHZ4(Tsj~0x zESRCvz{}-YOrWs~FiqUt*kT9WECw@uKH#_7An#W@{WKJH`o@CLKf%Uedd-Aakklz{ zW8ig13o2!EdICCDe~DzHwf^Ve2Q7h6lQt|-T7z02pr1>~RLu8Vp*OZGv-^bF)w)p- zWC^p>Og4tC-S}<3)0hXQ+yF*ssJ?rs@e47I`^S>1*n; z(P;=f^*%V6j=htQh`buwjV4J-&rC{X(^o=$0IKV|r7xIp6Wrt}ZSf_O$1>0r(3Mx? z#|zCehVJbjtG1}|7B*OG*z0`Zq*JRa*oquWEGy%RT`QMWjE@hm+K1Spp$?+NHRNK) zBE>%@m9w4oz*7dr{(o$pWl)@3v$g|+y9IZ5*Wj+fA-KB+mjHvi+hD=n-GVy=cXtWy z5d7oK-us;M?Rtw}Q#>_Yz1F=J)N^&;O|hq%M1LDQaHv#nUlDH{f7PPiDN*K>s?{4A zCG^4ELRHDCpc+kc4Y-VICxR>8G^I%Mg^@XOB*-oRwM?R%X6Y*2E}lQm;v*$5Ut>Dh zlpIK0zITj4X6?qJc?1ilPhxML8nZ>_*k1;*fK-+C6JkMqXgpGS!P#mafwrd&a}~|t zENK(_L>R3N+xV$LF987_#*ynNj{WHgdChqgR04ILNW zEoQhEXY6xvwYXXuYZ9MF&~`lCV}tB498((VTp@WOO{ENE-dCgKc&zzn88|m~wSMXB z=H0_7QIwM>UALUwCp8o}5_NItZ?sb*ti1$N$wA?r!wddCO^V@<;4;*~xY5H?kStcN z)H$e~*Fehw)EOI7vwGKH9o}{ptu$itb>S%ooUO9SAtil$MBHprvry&4%NiDZ3sGN; z?rn@P+KzuXF>lO4|Xu7UZHhBtclJ6a!Ot#QA(2MI%S#oPM0B3Z@NA zDDZthi*=xW6!i6Qi{^_|$h#V*^dO<0*41hOlz^Irig}>iD{vmlCK;JxMj4O1?Wz0> zlwiv1z)CYDD?}8`a9Hrg?>35tv~lVxaic!mN z4FuE4aZt5jebe3zy^wC1z#23Gan@yw|r1OR11 zPVe&+jp*%;p_l_ItB}i^e>^=^eSPD=;_L=H^@JCo@Qi;|sQQ(C?ALb-^$_hfxNGrc zEc;k^|JS|liJ~jTkC@Y)LPu@)u&kf<-N!Dkok6TQpSiPVb~yChiq7gSFyQ+dwiC8J zF53j~stN>k1a;md7i@2aM9ycCNAQ4ivVx7#Z(6g1PTT0>59x3%sd7wX;%)IPj^J6r!eRSNtvc*ZXx zulF3DA#hip7NhZV&VE?=H+Wv!3l8B86d!2MvMp&ZX7~aQw-SwY;ggBpl-36MHP$-j zt^Gn%ygv`O8>L4Kjk$WR$;kwBmlMngJmvnU2=KGiU4`BD(-qXV_H*M}AnYr+gcK|e zB%f#6?MZ#gI$)1SnkN|p6B?e+4n$mJZkMIV>8dQQS?%ax%B{mgqb&b0I74&oR|tJj zhwzo}Cu=nM@q_V=809E*JCTd>Fpvv!kmXXX1yg4Zaft-<8RbIk=u#_V#t2he5G*#H zoYb9z;I7A@TMeV4!;)ARc;bY|sd&ZyW6$;(wVn$;F=!e)LW!KOK`?p7!QI5z%1C0} zNVwKdv^HQbx|UB;Q@(Ti1c}KJH9J|#-?PWe43@j$(BQlq@RSn%BgN50_>0h8T`tqy;bvnAc&nu<}XU}4+J~K89H0hR{nXo=O5FMh2+3RzpVOS2O z1pW)XsHO}dMOS)t25KMSSLki7r}w^i8@=<-qpRy{qn@vufTK{`_5g7Twi zqiiFVvG+ZBj9W1+2ST3+uWz_$o*o&cGD;j)h)%SDG@$^+2Q0K28VD@@(bc|-BqYfY z)?B?RH?8CU9!;4EiTv8odH(d)*?QyrTfw#z5b3e6lfh)@m_C31y z9hdc<`!D7ZnI1;Hchm3gje^qiMBkbm70k{mY*o^a;jQ()-CQmlonjji)n*MEaSaD7i>IPxnDG{e@>Jo z>#lvT5@^5awzj@IBUP~#nXBL$Yoln|EXixHRMX|%2Oc}iuHYV!uEAMZCT)UKnVG2N zI0r0PH>3sEP^!bFbnm(@BD#V>kZWA{(xCxXh+QC6p!%i**WvJ8@d8xe2M}55GU`?@ z%6{CR!blzFyFJV5C{X_mOA*(6v;J=x`W38TtDV#H=sXauUSu(|TLbM?xHy}h|8 z%36~mjKpS0vn{M6irhEP<=#Ahil&dnPek8LX4Zb{kO!oMChQh|Yw`>(snY|xt$LeM z6X_(;2|sWv3Vh7zV(x~=jL@x?1q;Eu))bK|*8|3EPpxQ}lMi@y=<}sHvzkOkN3QJ) zi6ZTz2L4QAgx`@kHFP^#@p&81V#<8_1yvV)yqYbr+F<-;q5X&J`n_ztbh-Q9S*9zZ z$JRNP9k;XA>&fpy`wkaI;R1l^P9O<0NKozp@zqiurUgOG!8UWlI)4{=`Y*%o)H!&t5LzVv2QR9rjR^9lffiz z5gXUK%1>ry<$+oQhki8BP+P>j#HYk{pLmfIqelsOIlr0EeEBSq`0*nsIXO|tzshh3 zgcvR=klt^=j4ST9BR+oCMKElJF0O9wT&Hg3-7LM0w&%c+Orb&6Pr=?D8^+j;pPGtJ zajmCRHUv#I+hBcvf|~jadp(Q@JStuvi>wyYrEX>net6719G63!wuWTesvgC5gK z2$d`UZs9vFDVi_!I|Z$AZPJLaICSdgt({K&h{)?RE!|Z6{52`DmPW5zKs+QOBl%UI zr&rN-{I_Lk)KrL5yBR6X}tjI+U)`M-> z`!b#GQ#6&!U>BbWCX&rdh1dk(lxbT*@G2^`lSwF7Ty}FD7`|?Cig1=8k+SHDXo|`s%JhAmU<6VZK4sGvptTfdK&-J- zxp`nq+IffDPf6V_AoF8blA_P)Pw1M?uNgHaSdJ#QUJ%V`f3r{POz|8ctY2n5t+EKp zQQe+Rm4hnkK4nQA`YwI_bGYh~DI_VZ37ddfo${rSBC96*;`9&{yzM7beEHLxB z>`>X-gb;A7NeOf=Ip{d7)8p>V2nT-t5Z#@0$TKa3K*?4`rOt4PkW7K(4~FLK+170o z!X`CDW;OE)?}9nid=&L!g-)vb@@_ZM5{%BRj+j?fn1&Yf`S91Pt+61c1yrlRdg+6|;=X+s|uVc|U;%R5>s!eqh{ zH}2T!^8?B1l2UaxEAaQO3Y?A32%fb=I-NdP>Dn%_iI0}9k3Fd)ZVY&Zijk;k4&@bJ zrV!R1yMsBwdFoK+PK}Y&UCt=1ZvU#`Dt4OaRrb{L24|?uQ`ZZqio;39C(oHF=mdSn=&jVi zk)`jSOhQp1?dMuFR!bHQEyrIKu-8rWQma)!gU7%DFaLr0+^`#6eCIr>AI^3$>0Z@V zd+?nt5AWCa2EY4jUW^?40kd{W<#+Nbj>e?a88JB5(-nGrm5pyyKND|}rWK>uGsJL% zm2g+vy0;9J4HuasD3Z))p3mt02&6>);p)}c$9l?1amQ&m*khX^bp6xN1}>%s`R%JZ zY{!6OMS2?R9X1pynYT#8pD1m7tU^3nJviSRuS+wRE+LdT%}H<^UZN`da1!e+H&{-f z{dxhoeRnsgIeDC z$TYS4QDb5>$g_>=rnke-abF;17{Y+p2~`L9cBJ2M`1|~L$2MR^2QOn2Jkj{%iT!nc zQ}fHw7pzK1Oefhxp1TdY=6Rhn6~#ra9K;RVRV@o+#f??Ip=|*`5UPb<@Q%Nh?oE_-QY6$k*NN>0U&i0STje^UNE76CXXT?{b zAUqqAF;mVDXlDZ`9(eaiYtEqn9+xoZwctA`hmk5AAY{1;+gXZWXdB1jm>ef z??FAUm-zXjmbv3QEfO-bkmX=<0UxVBBzGfN44C6Z`g_{w!r1=AZ-{pd2Kw-K4Lc0o zUil7?&k*L*N)<3kn+|R8v2ZfO#bOLZj;Nn-B$);sWKm)QXBh@P=<3bug0rr8afx4v zY(99yAHGe#7{i`ULYEdmh2?YnE?a^E;?@)<74d%`&{Ii2%+kWUS&(3TP7P`V21jmQ z1gn~7=?~sMKsHVY7Eu1G>J~7cobuI_1Yq?o(bv@Ooy^el^28s#sRRyn-vs9f>jzN% zva3e74q&jbt=1~i#Ob{KOlRD1r-|c7GAZOgS&eV!SF|D2Aq0_|h#65LX;$!PY(e;g%oT+A{xt!g8@ z`BT4e4Q*}t@zusVHJ83w5mG9(DN$Q;w{0B*(v2grB z4FBhiJLrNDfc+nugZlp9JCx`HokKt}fiA}0u}{G_NMsP>H~^`s^9kG;3?w!BH%9BmeXdy3Ci-f+Eg%Ru`7}EgzPJ=piE%H#G8o_HE zs`7M|yd>kT9|Yp?(YG?P@H6gp;ERxzGSDpM%CJpn9sQH3#5dcnnfM4%XM@@FIPijA z&W^5T=>hmm7Z`!|>i%kvBb@p!$1UwR*8l*}VlX$mG$nBTi|65}HP;7trAFKQ7&zDW`r(yzJulZZN9Da-F)oWmMnbuj zy+mY?r1->TjC0ARGJmBOON>Z?h{DFjih{QJ`=`OzDg>?szr;`?rC`qOQc=07((F6S zND=LP%k@7pb5Btu8b)fO@9s_1`aJv){U|l8Ai?2QW@^QeH=0qUH@tSG0@~W3qO_ZT zG~7b$reU~N!aV~GMVcuwOfZ41mU)93U%`E-IQ|RX;`le-;^6)Z%ho4?;L)fNEscS8FgV%YSqPC779n#JF1*)$Ua=mVqT{x4GD z{pkcnEc$2f{H)*i?wcFn<6oh;{%7x4L4=Ty@J;h&01y~B_g^y= znvyF39q%Fki&FlosQ5p(CJ%Gdw<>@EJ~#`{|4Id&h39V|`cDbY`)}it-s>|aOWzay zqny94*QWRDbqfr@!t;laQZ>C_r*mLi6S>8901C|s9F9h4f_9?`d=kN|2JLk zCbL6;HUh}K>is*O_5VJHXgq(*=bwC8nL#A!@3tg=iUWB5S4pv;nEQ93zL$Ue2dne{ z2Bd<$e-J(dprifko_Q}>`0LywKLQdF-yiye)BjOWB|7up0{Y*G?4TSbNJ?;Kwx(_v z2w5;t_g66LCU!W8bTDvc_CGNo{|E-8cmTjckTbP2ceZ%19AbU8uA)@Lhlzy1UM17oazKp zYtYJhV-QIbWh*yFHh(rhZrFptVSo`2vMT(db{s7S$OuL@@G?OB z5P5D>{@td#Lmj>m0JNVGS8Tc!uMGbj&8a5FrCy~nl z*zwhVZuM~881M%EGT|HC-*A1j?=~vJhH|7YJz#yFrI&v1NH)1bWYMK1##Z4@W`t_g zR0rnU7c6*qZ2|QfUPR45I7Kh2gwUFok4Tgi;!mL1tkLi1Gbkt$1QD1;YAlDkBI61` z64}BZiaG-i#bYqgUSi|FWELOt<0P2{3jba?t>7NQQ(v;@pT8`qE!}}P6%^tdnc}5+ z$oeSoJmssN{nLVO*_Tj!Wm2miJY9)jq&qHwHec}}@X~ZgW^kRu%z3zYJ2x%}^1*{F z7}_ZWk$}}*QQmdFYqTD$M-b>6ZgKDA!)Fhtq z>DJPqzzkIre^CwuSNQDHnFwA}t&CX;fg_OOUQ;Xu8KzdNNHcVKp)`l6Lj!HNAIWP5 z)yo#3%T^E>Hd1V@Y{2{G| zwgT4dLRDPFuw!lt6BXm@D1a)9u_*Kb(vh`WOL@LQVfd7xX7rIESMiMi=)V)HuXhYv z5-!BuxyLK^PFSgSYGY$C>`5+KJ316G;Ew5z%a%VSD}02E(AY3yo?XEF@I%QGMzP)n z-|}K4=$K+jSu+4yIxY_@Icez5Awh(7j|s!7^aD7sC6{UCxXyKq=B2<8!Uk;rLx{IP zPjGM}aT*+f$3wGXGgEd6a6N!JC5?Vql>&!nooAb#itHz^WNY%5aN?Et%N)p$tla)(i%(>#6-siVrx143M3A80nklCfpp2@^@mtEu8X{3m3nZ=aPX;Tg&MifQ z;H1<4SeQXOKZ4{S26Beggsd9~nWcy`ttC@{V#3#?D8ejurNEf|vL7N%+}!7o(@Q;h zsn3Ape~%27=$G%sx|9U1g{iMdRGLXLsP0+TeP#wjQl)?-Lu@FG@EH`k3>Jd+_OpyO zB>!k6P;uD3#zaS)8ptamOY#4aH6{s~89u*;yXqw4oQ%qKSGiVKd^=<*2&`mcY=AsA|bQ$3Ps~39{O> z$-IRq%`VE_fUR*P!$O^ulhbh>kNoBHBg{1xomC$C*=wWW-=6+Dk;Gy`9yO7naL{!X zdUIGP0hrzQaG1=NbJ@q*{=!D1904$BHO;Mh_(Zt5<50lb*&itYFCk8#6cx(BdE%mFZ1==#lU(*ma=3r|W9 zf3!$UGz*287VBGO_AAjjd2s(WgN*7G*?1d^W_1=oOONW+o0~8~Wt% z2&2gqO?;sPK7rWF1HRxJZiE%Q_fz<;fRz%LnPwM|fZ_T5YF@j8JU+gwWLEoi9hqA~ zRAYgJ3^?uVOw1;BzgSuHArn3B0N1rlfs!!jpz9jkC+kWPzNGO&l&b3*?^ct*W8DP8 z46g1w&tUz%*COBT(vZ)HrO#bh@PY7IxkOoN`BGKO2-BYaR@K#)2H0i8Wr@=)7xguS zHPkiGqt1)yW8R|z;tQe*g2MCT`;VXxQY;-jutbUIbLFDTgWYxPxw|bll|WMJypRAB zd8gCX{@oq?GXJycFRSj~y+Po3B9Tar4!D-F*QUW{G{N)4iD{X*T_t|ALdze1OdS36 z_w;A%xOGIlHF&~pycNu|N};Rv{J17I95+`ZOqR=mFm|C8Jw3@jf|w!QwER^*n!^B+ z514{!Nu-*w;-*fTl%bI@)Y!O@O`qS>08w$GF^J8Lx5}`sB*;#dl4@`(`2&Y?*wDoL zYo1YsRwJ-^9wuRKD$q@*ze|4K%ok#wOBA0+DtPT?SK=6daSnO-fgyC8I#$0n{szrnQ2ESUKm-?_=K zq$w~x6V_u3${Z?nn;iCSA#F3LB$Tg9)VOM>` zJcaNI8!0#gNNeloqWt_o&4Hq6J#oWBwF%so)oucJw;n8VCwRm?jH4<(*aWwooi?VZ zfZwA`cnCZzkM#3%2F-MbIb3Ro>?7a`kW$5R@m6IM+q)YwP95VAETs5+B?Hd&uGQO5 z8j3<8IVcfU)QL@7SvZA>NrHXah0SXlLu84r)w1z(##7%=|JZZ$v~a)B(fN9MOJw&_ z;b1?r6T@|Co6ksBmgxD6(m}-3dr$W>acl&3k5#@aVC#}DtBYq-K=wNn&M(ERZ1D)@ zm|G}`vMB?G5Po84ZKPsLlW)MqH7YH(S~-mbU%>1ke;eBl6G@vRzwtNsj=DF$CkIx8 zawzNDx*{bE8KhQz4P!}H#h-e55tU-K7S-nUVkmBeKM8o$N&5y3Rm~*Yum>&CdLr}K z7Y~h}n;b9US~#DkOcOFoklMXpPOx~HXa`I1@GeFIw7H`7tL=sspYDL|Zq>pqm*#uq z3O8187jy6!Nm6!Aky~oGOD95_1FMB^8s3_N7d?@sC<(8TsTACW^ z%WN`vbGEaP^_vIeG=V_oU^jwguUC7ck%SUUZq#E=zM99(ew?5NvcYzFXHuMIu5|B@ zyN05o{w$p8vPzzaQ5MOKyv)|dlCoNL17>*~_-hndXO#iJ5t3}CXtlgkH<`f&VpE4K znc1GERZe+S%e)9?XDl)M4yuUTd)IjW?3UQO!fN{J`2u*;xj8|9SIhIxPT6I4 zK@6jpRd4R+lS3fcw*!27Mxd$maRHm8eP!oy!E#abnvJKy?PI^1LL|ajwz+^J|AQM@ z@T@{+N9b3L2Ax9O@^R_%@g4`LKpndT?{bq`XB>y3In7>y<{u2&Y~Y7(8n-ybBu{MSYulG zvfCx#M`E>QQjR2Xv*caMNWMdjZx>c{!ANgprUD?$d;Y4MlU8#unQ(RawppJn*!B#! z^4K#KaxZ!4m>9GEJ7v7n{x-hlG<}(=YNajNYb+F)>@Sd|a?2y|EBiB2MVRY1n_`Vx z7Eh$#rss#zLee|2bN=s+D)RCeu^hegRIy0i$%M~Ijvw*f+E1e@vZx0W*Pa~CpuZqt zaMXb9aqN{|aqXGR@9?-YWZrgO1~$T`pOapJN7s;SVvCXG+EPlugQ(KKb415$q_ITB zhbH;}k9L$u8y_LWv{BqweLrv~ijP3;5qjZ+cKSmMsyg4kA_Z_LeMyoqgF@(B|#mDBct?6?}$z3!G%dM%@=xOBbpBbak_LkRg zo)%pHq)^nzlv7xLo}*q*sX^G%Q9xHRn%!rwzzxX>N_Lu+T}9# z{TGalXqHxi?wrp2>nC}Ci`2plSXs3C;*U68_85>a5|K0k z!1>atV`p53{^nIJGIG{D^1QfQ%j}qU(=RLE&f+`TiazOpGi?n;dmwS{T^D>C?Afr! z1B#%djE6Fh+wEk>L9}im?MjxJ_C%)2>!&<#LbVo;-r&zag~98DJ834*1*pk>Mb!lG zUN3465ZQ<3=rY>Z>>63vBCET&{Uq;V0p?~yan^bRGqOER)ON(T!;PzXq1Y0yV(>;P zZa)G`ECraId-vV+RL6n89rtA?DwfjPt=5tbE=$pgc2A=eG?lnoOX>4|SFAm4(0be4 zJg4TB4HP61P~chuUe!LlvBz32qL{IKzK-2zcCP7jK9c-`0dEb}EJQRnS)R`#4wS*g zdxH1{an@YWCT)LCt?b0!X9T4}F4?=4*M;W!R8ex1Fp^FuY!(YUX`TW%B>tEkCk(`| ziU|t~uf41nBvg4!i9;(0VculNk|Flf3qm^v-`aQO3dtbUY?0CMx9A~v)_m5q0!ImZ zlP?qW-c&4S5w>ueG8O1JN$sD&2Ns@4?lb7!dl{^Tm2ySX6cR9e26{T2ji>fMxo%Ej zG6MVKVUY{+JHNKA)nt3Dut%BM>Goq}YeR)GZsHHUHzWHn%OAL=j|E#S3&9JJv2xq0 zfB%R82D7g-q(n_3i#!Fzw{~?fUX91;{~JOHfYg692?5nQ$Bj47a}Vd46r^rzD!(gvnm2#LDgHX>ns5jzHb|$QvJY}18JYzzb zoReA%)sogZr$K0^kEVCUtCtZv=JKaV`9{7GrSxn)P@B0;*2k}}ubp-}&n9t7z3dfA znKtWg3xvj%wVAUhVGX=y6m$^~V(NUNH7W->IXF9RfHTDb*=N7FsNC^WU91N(UA)=K*kml+3zxpQdd!`S(f4TYfx#U|@W}CfcfA4kY zgHJbWp+&M}n>}#%Y{$#hqjPrvv7(B6_(#Y&f~YMuun=uN|r7)%3S~f1aDz z)}RF+4JgO>Zu9+s%pZ!x*ru!(ZI~_fj7@|24NEB^!)8+?`7ZI)2`e7+@?}(+Be?1Y z)_vP#cHusbm%S5$bF+QN(|T#ZBaGYqqYZ-g#n(?7Zbm?lyG7}$mlpnnzIFa=YPLlM zAuTgBVwB$a0*PC!c_{pY@C&m;JbYK~^E}b5BCkzg+y&K%0g3g0Wm?A#? z1=X4~q!%3+FY11jE+g>zE3wx3aJ`)`iPITZFaO5cKD(J`1Yz9a*hF2|-JTEit}u=c z21{?W8beuO#>1WpnxwB6--Xi+mt9RPNO;P!VOa;7iKl?$Q6CW_OLn32EwfFCCDlb>9#Y9>k`jp1H{sJQ zT_B)_g)B1kD!(j%B8N51SX9?lBGS6_>h_i)>je|9Qonm&d+?6`di3?B6Id8_MYlnF zK4*O70RuZcqPe&Kg9v!D{vg{oGqS0GSzL6Nvzm=kV9t&!Fh8)eEhZ5&YG$5e(r7W( zhV?#++setlNJLj6&r=&FzS2&PI4+@i#SYjV4=!dSe-QRyKVLjG}vtmq{xtL^G8H3p{2cbY!w%hr%xnCn!#r?_S=g#P>g zH24JQJFLs6xECFmWVDHqZ$*X4Ry#cg8w-HI z7N4E%4Z>MZbmmk6YegU+kFqJwc=D_`<2$V+B#`vbtv047x|0lay#Phh|5yV~ar zXRTa5jabd3M@b!sot#GYCeQ4ow~lAjBzVlOZwsG2N2(2`%`ZLVK&K1`pY9{OHW3+x z%Wtp=X0%MZRLc@w0NQ&~>8#I3bl`y$prE`4-N%GSrxrSgo$oEyULwGwq7pjY`=uph ztQc?0p5Ehw)AdHu``$0wcgU|V?|(IJ%6x8aUAR58Rl4swUIszXRER%mvQ%n4C8yG! zm3mczP0gcMVb}*;b@J|Ng0eYcb+z%4D)g-LaALI0n-(Qy3bXsm!GtYI{f~eyg_1qk z$;f@yN})YQW{gPO!`_2ixi&PWgy-etdoe#;KdNsVjt~{mGg}d|YF%nrd0Td4jfCG( z%$T7^ti#VI<-KOfNHD{#a6ko&S30#KNaO{%rKpv;9`e?yUnI{9A?FRuS1-rs7qU4u zY)=`?DsWU>TL75GfXC!2vzb7E@Fw`jwxveX)xIwiD&{>K3uM9m--q2YK9#d!Ycg<_ z!8#ICT@@4~L!U6Z8Dx(UcKx<2xY}$`Mz7Mp7#A);i)DPK7etTAfm*cz*w|gd!;w!LvNtuo@Y@ zikj}SFmD8B?=(*pcTXKixzm37Wo2S3Pex#~sB4|4>zurakel+G1qXHJ_O(Gzg>cPaQKw2q_nw=_5}~sk51&TTzj%6VV2|zP}M30~>k~ns9bs$kDVQjD)8~ybbx3 zZT)?+LAlx3^kB66f)J_hD*G0=Qel2x^lcYFz?L%}(uzG$YFLgturK;?l0CZylOKj| zxE$9P&O&e&=$!4ZIL$OIBTDmu0JiR+yN$}V z1U2|;sJx}zDB1|dcfJ+)wb720AIdCk3Y`wIEImyOfvP8h@HN<>bms&Y$v?oy9qBkh z+Ti<+bspuZ;T&0PDrQb0soT_%BMu*uCPa~Qu%;Om+Z?QK$-1$bKWKhG$s zlUmDC4ZByI5Gky8JA7nqQkU5Km>|M{El6A8xr@q9+A1bbL=+!nQ6g3u98A&LA0#2= z;xas}LVvW+Bt>cJW1k|8}+K0Y6Da6joSh%_0fhZ4_bpf*&N zEOdwdSo?9*m$lb9pOK+hn3PV(xC@atdAMC%yo4tT|;6AP-;5 zLb97r;!6h@(o$ZEKRMo0g{|&?~XQ&);iymf71l`F#kZ&XC>BH?9k05UcGhe-j zPE^6u_oE*^<7pfEUFemtpce)RA8=;wKk%3GUqv3Qe{2x!jjZ7K_?Z5o!JOQn8XW*J zke!3&|C>_Tpo!>=p_bfH<@3n2c9`YdDw>vGrXn4Z5-30Yz~Y-PHT^vhLJB5I7mUqP zO2ohy0^G^~KcJX7O4D3i7y76s{4z3nkCx&fgbECL?@G_Ec5Y;?*N~ufJ&6I#7 zslBQdos4iIb*b*D^mq>V?Y_h9+QeXS~2X|Bd^#8-4rv9Vg&T;R+O?lD))q$fM0pcW2Nf*M@=GJr7#pdQwjg5pSSY10 z_qtTRd5yV843hW_DCVI<1@yNPg{b+Ju_^IDRlPo*wWRvtT6Y3YNB+4v_Ge^Z8^TP5*sbX>1)^rn!u(_Y{Tj(E*)RwP3%en)C630m!YYl z@Vh;}vx_K5a|?5f@m836O$M)RN7iMubTYEwK&Oa^{oSW)$A0`Qu3pO~ zO%(j43puVpl(mn`Cq6~c-n^`F% zIn-8&{+O6W1V<3**3f#HgiKi6^o^7eI%XGmsR%~m!m+qvhI74m4Zkweh`*z-HPh5` zhW@ce_0IJc5Mhkgsscs1hwH9iRM&zGN0wzS%!R*jn-rU^z<>=>dj#LXAaYbws{Y-~ zj@>>IEFh?~KPlK~O~zWAUG@C(VRt*1l0vO~K|`@9Ox4*XTo0Y5yr{5Oz_9$+!R3zu z+v>uy$yEl|L3PQGoWV{zHq?Y0d5iE#;5B+Qiy-=)iU;>(~va?4clP~ATLV1#(c>-E|hJBw1kt0O7*FVNYDIis$LZ)LA zv8C?--o1yl@~Dlxu2Q`TDZD`Ci>;4Cd^{~T7guH!6}D=shF3iz`Uo_?%TT=+JiYD? zSt>UAflz^v-NJ$10&u+@4zTkEk~nq|l#k%$m-ql0MQS=Zti5Ni@C3q~j4hh+n;S+{ z@0C@;C^{WIl_qSFzWe^fEe>p5ykcXq^mxzV9rPWfABqIA4K?6ebF=Mwitd8`fpuo` zUClWv+nf~%o-~)uo5GMjKSYZ$l@OB9(L{BJf$#4paHxfZvhm>2{i;bzrEV8vjih6O z24ujw$>xKQwDqfaRA55^;VR|d?-)7g>O1&LKTFH2WVpbY?d;N1piHmRkzf?X-7T~_ zV(YdXGq%_hmZGlYQju_bxR&c&@O=z)j6E(f_(C9&FNhK2dQZE~sKC{c*Df-i~`A zr)6;-mng!l6WPRVQm7>nWtMSfMQC>U8X$84Nw05>&O&h<^%)L^8VT)PXzd~uwX$_$ zWmHd|2RUr;epbHz7q2`n0DT~=*HGq>B6HH$9CONMnSlAMGfusJyEG$shk(UZ!lIu3 zd?BHq=@{8tjJnqM79If-k)a-1)rO-MsOUrq*#JUuH3}3~|c|(1+I>S;9_i&qFiox6Yc}#BZ=gQ(7yvJm|4JrV_yIm~oSGRAurB z{9KFk_ZC?!cKE3%d<~<1T0&HGx@P!Fu*prqloObvv1^OO>8p@~1>iGw#}!IANwJYz z^y0pkDabjMM4L^u?xT)ymI5 zT%FD@HQPqdcLZ}K6+9U1$$IS25wqE#Foc9g| z%q)zMf!k&M-m63ID%ZERm~yb zPRT74^a>~-`_5$Vr_!IL`Fn$@1So*&w$HF?Yixegyi^lTcCVmVWD+3FU_$C4fash( z0DT{W+uPtSwJz%H1aoPura0zvK$^&q6!o-CmL5c7Y00PU-M$R3Z=A5nYU+s-6c0|R z;a95$sXr^SWc%=STiMc^>tGMmfmJ?^&+7|h?ddXh%}?XJ+F`Fd73Pi3_HV=67Db&e z-3vs-_np5(s8OxxK#V||a%~O$y3?*!EFW#nM9l-sK7d9XH7 zC`Swt&t0?97tj3Ds7(DfzAZCne5}*OhCJwnPR}d8CjqWdR~@o~BF!7mrXWKdFPVVR zm9Ayt0P7J`={jJsc$-0!Ulsip+7CpA;@Tp#Lbq+S)X$Mj_`fWkyL%$A^6t5qUZJU+ z2!=`f84l{MW~pW`g;G6vVk0zi^z7h$Y`MGO<9FFwZER#@tV)?8Od+jXaZV&A4_Wa{ zz9UYXX$b?U@(TB@V^?Q0@dxajAbze210f$JMzLHTEL4EvE&37ISiKpq7prvkx9O|- zCkYS99f&JjmoH5>c1uU(rhPKgQWsO&^Rerl8E;RbZ!Pzz8<)UmkZ1^!@bm~rXf#qM zTyOl)CvLmswah){R5SB@UX4McRMT5bc=}`pPH#_*`HA|3M>L|DLdxp@$JRXsN5XcE z-j8kD*2K1L+qT`YH8Cc(ZQHgd&ct>yU+(*->#d}2s)rgCR#fU}JGd5c-zCYL{F#nH#epggW- zh&)Yz*SlQmz(y?@j1VT3KdO|i(6=-J(g}u|6$;}M9ar2nL-rOh4 z(rB1w+K#pLr*ubeUegUqeM2SBX_$=BM?oOHy(L;to47O8fPghC}T3piFGe_cz*~ll? z$Sc`xH6Ll-5S~Ho(RRaJ%MzHKCLMKR&4c?bUA4HvgKZM<*-?>5-{{k)7RK|ORTU`z zIOCjYTRUq@Das&im3be(+^9doQ7@m{b@%dp;;`JkqLxzduW~J`cnO?&K4|Pt0b)={IdC(vU$tt~5)aWQ_-1I#Hln5bD+|5WWxm0Sj z@Zt5sD4aK)kZaVu0C70MHErEaHO`ik1)#x)h`<`dLo&lhV9Z2*hL9X62&1|}VxnY{ zTV56ebW*sr`4U^_(xTfdJRyv#7NlbAx zOzj8JeX4V;SI!BaS?*UaUnAK(>e(NEiZ`X$jc)ss3Ha|`Ou`Wfy=6aT{p>=p z(DsSQJ<1KpS7&xY)Ypg<8dwnQ07vdPoESM0#&Q|m+<&eQcl3|Vd+YUATI%|;HJoNi z&obhps*g;z@{~Ta|9tVG{&32kbw?0(25?7l-{pzlotf{=gWPq?ml96N*RI=4I9r68 zwZ^iAnyoxm4-T*LP|J0(ntr~bvu?`g(ly~pcra~|Z>_`mJTyl0#IZ~40PJ~mo9azg z6_+J?y&o+qHMSNTPToE{J*G(MCF0*hXkBPJouey1Qz{)gzIr4IddIUjRqG7>htIOg zyMdcpqa6A*0Ox%xg9-xfvz8BNN81zN# zczvgySO&tB$x_%c+gGj~%5Y(>;qwzW<=+*<>Ip)J%<|Nb)reKFISRdDU4IqN0R%iAtHD=ipRUb$Rq|w(lQS4C^8F}8(tAoz`y{KF*}Mb>ls~E zK7IY4Jn?-Qm-gTkH7kDMxH4L)X`Xg*e1VhIB5}QOH~9;KjWst&7a3tl3fOI{rJtdc zRk}GWMokuho70(^-J>i%EgH3pW}R{rsjb?4+_X0vouzi&%TE~<+mZLWj7CB*$m`TB z){>b&=(CD%rReu70P6OOy(Mv#KN1r4^o2&f?3@-lvKlw(L@j>VbR?lw%>Lv%+)we- zEw%1FNJaalzpE;K7CR2&KZS_xvfY*n| z*Y%h4+h4sl`!~K@j+pCU`70xD_E+4;F8GbzxOO_t*mi5SX8>H4xrGq02juCCHs_da z{=0gC;d|Z}AE)G>EkOSnHTOFso@wuZmk5&J4zN9#$%$SJQIs#_(5)giI6-4MJcug> za8NjDY^4N$3nyty>%iwYd;j9uy?oR#?-G^kB$6IbPJ%Bw}@FV%<^>S?&e$9Bg(VqygC)Ekvo2-HI8 z+O__Sgwfkffj8g%HYEPC#J<4W63^9U(_`lT3+XBX;+mEK35J&T{t62F-*jCK)PF3@ zZz?Yn5{&Rab33O0OV=T$;d_CIr%^J2tEL$?f+>SA{YSF9nN$Vie;tN~mU*Clk}4ns6C zLXX4OShK(x4QWXx9`%7YLc$odD9WKw51?I=#43_`#6ZfKV3G%?&FbUh?7AhCo*# zNPFg}Dz-FY{E9>$x35xUTE7-*tTtjyj^~#}I9SmA7c}>Qji3elAQ5^NndH_8DsmNb zQQ9YES77cm&M3`52+Zdn+jJfl3>Ey}ou@Ql7_k4fd%^V0IwHS;5(3!SIR5*{1GkSZ z+G_jBFRzP>_iosl0lI^rHll%`fFJB2uo2V|zqk8!L8BmI#Zl&(N^oM?XslT&n)&Zo zQ*lfZ`*94|BH0m5Vzd{n?`=0WDaxyvN~Q~|nYXT|u1L}kJ$(MQ^}Z|2FtVKZp8UG@ zJ@Lr}7$J*8Y0WVY<&|Vob9u?Q)A2zkL_2a!|JvOOYYL+556*5c6KUE>Z$jN@p4(yS zyi9$S$$H+*|Kt+x@M~plZ6)SN{Kklb{5R?E{TbiGZO*Pm$81H$SX$iFU847HWc#eV zVc#U0LHa(z?74+eh6S43{70YT2^}p&a7S(cV)qzRwmDB(VYNWJLLuqNuhY8@Cd?7Q z`La<4UDaM+bi4P3{-Bqu-^&LF{?&bLvev^rPxak&11`+J$&_Wx2{6?JdVX9P$-8nrd3e)IVsm z9YxwqKicX|#4$0^<7me4GgwG?Y%~Gl-iBq##|m=J>vrnV>y~q{+&L!LK}xA*ze}7$ zp(CCo8&w(DG|Vj`kEE*2*0qk5i=>dV#K84!J5;sG1B=YXY*A8NJ=vZ?IjD`WxZXQ{ z?yZeE?n>ICjuzCrLQAR2r%3G!ZEx9nJxrHdQk*0stu4MQrBttS}Et8o!=q4M_UQXE7gA`m5QOGL_}0i0|oY?j2j%@Z@!N#`Rf2UKw5xY0tWpB z%mz1tjaWf(CK|@)HFZQ;e0`KSDXD0S{-ORJ{-ORFL=|=)D4jEn<%JDdR zTC}v-L7QwC&|^$h=nURIluHL0FiyrcG?B|HtTRYybh#O!%^!1tyhTb~H=4dH__cFX zLb?QdkBDKEynN3IK=ED4%WlC6nII8JA#E^|SXn&H9&=ep)&UCbH9-a_OJ6pjaj&Mott1QJ)=X zn2lmZ8|p}u(uGLmykJ-&b?PilbbR3@uq0Q7d~pi2Ew3F&&VqEV!PBU;J4T>AQxD@5 z5|s)qs^0GsK%NNDCtdZDU~-z2>Yw2!A&*9= zOsEDNfRem!ATBtsSc1abtUB!X4kPt!2>ysPxAVcCwFomt61+l3x54IOT%1Ay4&w9@ zKBIi-rhpEz=Ab&_s^n;TRV9C_R(JOCrL_b|QBZ(p|AHq{5-S1Jo?MhrCYunGG%8hB z$bgKoW6pqEUcp+h(HnDuUv*G9glzO%KiRMlfYLX+MWL+7)R88;1+g*E1TMr4l$lh| z;YWk8tHNdH#Cy#jOZbgaJ%@t$dVxe56@S2FYpmw!0IxD_>kLR5)!ZZ#^rJ7-F7+A{g~^J989AV|W>9r``0P`Qrh_l2;CS z5RV=dCzN9!p!-XR`;fnn8P5nCUzp2_i})AnckCYL`gZvx+!oKIrh(X$Ncd2-|Mb_! znD!lcN`KrHnVg@8%~m`n&P-Ei78QRm50E%l&f5u!iMc7_-WQA=c{>;@6E;0g)<3l( zYY&(;GcM%V2L3%jj>E7DJj6&RK^3QhCSu&d&c+@+Q>GG+BrwHT*l(1CfUP;CT{Qy7 zU0t+0AfHvpIE30dxtFpawf!W=!@l$P_r@r}nz(bn)i3|!^vvg1Gq)fgoaa?O_?RY@7GflPqud#yan9fx~YZVyMrF4eUmnAFt@JfdD!4Gz8vX4ymXdouPleX zIQqA|KiH{>TR|-@W|4>LfhM4bPXOGoA6MQV8Xr%o^gufc?-E@QpYYg9%4=hT^NUp$ z)~4N%DPX9+bW?=r6ZdU;UCF6EX1cehxD;sN(kH2@X=yu1)cNlof!bY_0O)mLf`Kdy%YnSLFUi;rj2_K79lRb>*^*0WqJ3Lk{+(CwE(pyRm;pt zaA0{wSjej{l*P!M)5sGphL={WM7B?*2Kpa&3nytk9dF^&Je~d@2Q}GQ_$8!uU`#a$9NGLs^t^gmqqPJ0QRR=i;&k=kczljV(R9JC;%NLlU!TBWB%|!mf zm_oQ)hg)ut3s0gLM{_dP*?DPUb^<0)fVo>NX4OwaHes7LYR!e$rSG3iX(@P5mG>zi ze|sxl1bCfxd4DH_0U8(E4NemSY$i7LyN~DHHp`Q}%JHzOD2su${D3?n(3G(7w*-|^ zkr>M9Da1+BE`r)p?I&;eKtbtdygBTP<%T_+G$kkHxTiA-Z1-Dk4;c4OO@OwyxDX6N zqj0r`878B$#cjV`*$X}|B7FANDm z%!!9Ow~0hJX0s~HzHF*GM_PDSE`^mdN0!+RX+E@-!X}9spFAGe;Xl^bilah(k?h)te_|xC+;)HbGYQOID0QL6Gh| z>1S}(jn7$DLjcWdBKhalD>;M{oiqNJ+snIA83t9_VzFBHcfVqJKz7!Hq6VpljL{e+ zy4eQLG_#h4D@;i(>H~g~V#M&Gp$@XKH1l*B-us`mI!VT7Jirl@uwP!U_c|bE)CDG& zHM+l(D;yK}s!#95eN@Iw4cE%*EiBc<0e}4f{>laZd<5h@)J4~~Jz$Jv9SW*71hd`M zHMr!x0@W@iY=;SZh1%<*{N&qZVog3-E@m;|SNUOhFVNc4bp-n8^>|C^G_FHuUIRw{Y_ z>`)NSSOZ*Pey{NTCKe|7t$3}bzT8N=6Yx!u)|55+Zf)l({ z&+6OC@CkFv0Q7Z;SGaWb2WXKQu9zM_sxi-+2)EH>Fs><*n~b)e;gJtq#&1sv)Z~~s zdtZ?(`nV^gY<=aHWn}sAM_nSdbrNO>#?uS}vj9ehidxTOAcEx;G~+cK!jRaN*t3Y^ zIx0=Wm{8<~c25Z|plu3AC>rc>A^rK0T;PRbHa!mB_iO`~J#OAm&%Os@uUKZQ{HWZLzp*Rq1N3cg+&yxsH;9JD>Iv0IH6ac3(m zcDWR9wp1!x(5iLs=NCPX>RY8fN-XFda+h?|3?4TQ6nfO(e;38+P_QY?RPzXv9|3)_ zf&6tvV#0%RNjCz6(x6izZ-hgamlAL&5(B^q3~38!b?Qu;(Jt#UJW>h(^LA@2YoyzC zr)ay1=r58K_b+eIYhnU(OUN8NZs9; z=S_v-31*yl=ME10#f?_t29nRqQv>}KF*i`IHT=Y6i#H92xgJ+}=D%Ibj0Lo|I|60Z zp;{Dst@?zOsTcrkra*`L2sKma!M->H1W*UQh`TVg=-hW0-tg@?yNzv)AG{6YcSbl# znGaswpDeeaC4EUa?!ufI`^e=|UztE}7&jj-3BR5eCrO%UyvSejy=`hNvXL>5~qw!A}|Hu3`n6 zg4}k=m?WD46~6hDDgsiu!VCqP7ld2ESrP3>V0ClTxa)enH(crp80dX-G~Ty zuL+M-yX+ZZH8ANG`9F1Xjp}E;73i{joXzjt&^A ztUrifn8g{;o5yLyCiQiT+AX zGVwsegzOzY>2PDE2mNWGxEI&YI=4s$-=&{_{0@UkfJAvg8nNg}X@_<=D89ax6x_JO zlZpF_r~Wq0$3S&g?C&>X80toz2EtA`B8=6eMcju{U*Tq(ty0|~Wl zc#39>-M56P%#KQ1lIhd|m=Fc!T>N1-pwij#gbq*0?)^}=CuU1NL&t!nrmCtLvHy+( z^4^fIWRyE?%!m~WGV2Ut<01IaunrbDkG&m}Vog{iSqBi6l8qU@t=>}#Wfe-SW9Z@1 zC5+j}t}Qcr*+xA}BvH5XE|LJ~^# zsx_ao6XLh8;r1L8+oR)+kwFz5ecvQ$`Why|TG*qoq=e{-|B*1M{*^GZ2H=)39RPOg z_gLhlt~XB_28A2WFI_EHrdm3z$0q>uzD$Z_Q5OM9=JN!5#fE;+o}rO72+rSM?Sxd& z)Om66kL%cMHP~mn4171GgvN`-@pX@9_nkSO`{R^=H&IOJvfRqvtD!?HC}^R_Chw!^ z=bg{T_15xIwZ2@sCHG4SawDeou`^fU3K7SmZ)HHM`YOWqTfz)Ngzq`FmI2fh3;T%| zdVN>;IsUSFKa)B({reLkq*YdFYLRyQHhFS=-K|#58|u?5TF;SoEhyu14aFAxfsW8mzE^r8>r_JMc#QQ9?w zs2Uorn_B4rNB4R*zXsa)E&y^Rb}Ov}*XyI|IbF@9smRQibrXtpwf*%m2`*1&A;{|{ z2iShOy3Re+l!vwW{dbEj;t92-A+qne^1Y31$L()EEA*be=XZ%7`ltTRQwrC551$vQ z@A}%o!8)B2t?;-^#l*aJzD|Q(XFjbOH8feCA}cQiK~b@SCf3(t4S?wA09GQK=5}50 z!kzv)DgEHZk_HBbDxp#cGGnC1d+~Wrs>pFo8mfL`j_Dmeg8i`ynY(H1 zny6PS?Tf&qS*BEmCb*v6NG%3+{j=i@7Yn0PhW$R+YW=#JWqu219`JJy^? zzD)E(QYiTC(Q%=_yGLk(&@R@BL)bEAaPhTRM_QC|eyxwji^#`wuukm38GWR0G(8(v zi!n0zn$&K9Nn(DMR{`xxitBSht^H1zlnJn7oPgnwh%K7$_w&+u8sgO`rgE#(D^CPqaWEUXHSKQ+ta)?svjk>e$l79ln zUyusy4}viZ>d(O^*T;?>pB4&=RrJd|7YMnMtoBg*VHSVg!9i6O8=R;UMfOR*#tG(_ zn($JMg|t_b&&t?nT}AC6pdWW;7w;|V<0i_}veU2l&nZA;V^yJU>$R>R$3GW^5tKh} zxT=4w9-Y}@SU6O+aE!w*x8MZp!s6KAGeP!}ON9SwUFPfF-TdtCNCR!<3f{6z`j7i%~2%JW4~K<~)}`y<0=Tsnmw?F;`C+Gh{m-=&MF?hKHo zyEg;J-x`29X=eQ8e!d#SCvqBM#60hP37s*sLt{e0#yx%z57@26J%oWzHeJ_`)^87| zad?-aDTF6nzV6bs^{>CtUkI1)y9@68e0*O%q3c^dYFV2ItbiD_V>s(@51vl2=A=(c zC>~I=I?M!N&&<8Pwghzz*H+TdfpwP+Pq9HYh=5`;S|+zBBL;HjW5V5i6tY<%k? zHg&{Do;j9V?$3&6#V+{-@NLXm7OGwc-slBIrLLKNXrY)@uQFoQ;Eg#tSKQ2?%)Rxv zhJHZdjBsmSs3n2m6_B@ieBlmBZcZT{7kC2CSb=8!chMSD z$H1Tv?z9d33ZV^C!~pi8S2#n3j^{ zBHpZlEzRs4?sD#AZG7mWl9NpwkoN)DP2Yj8GJ`Dk|& z-`pu~3@`?zNL+fI2nik@10#+e=2SkX{Ru4M3g#~2WYpACm+ALPwH~YQ7 zkchKd|9Or3AB%D>?En@GB`u8V`&!n&-8|F(!%q@`f8W?+W=%sh1ffhb1phwGr8ol$ zofZoYPMY>z)K{c2{sL1<6RiFY>UWGlex&(OgZ;~!5u|-9gBXA>m>-K`Lp)OCA)7`ldeLo!4 zGR2tEq}yU|=tp+y`l36{+!q z^{8nb&$-2@Q)CowiZzER+LRNuAr z88{^rP}s>&hwUaaz-%v7tN{>~L_#mkJbv^E9N`P)Q291FG@0h>mI{y;K+xCT*k-q< zk4G1-?^rmi8=%wTF}$S#(-ZeJL;Clqy56t*kirY0k3WR7m%gRh=Xe&gH-vM8lEjuj}gl$As|ido@_{?te@aD3ic3x1Rl zZ;J(EXIB}LELKFPi1W9@gG4$b;-S{WK~N^_60SN@IA8^s#gI+eyw83be0sU_(ox8< zj{|t2sb}#jDtM=S#3VI{3tV+v{#1cC$rAf3Ak~PK?L}uv{x^!l7adeCWul-{4Fzo z8wxR&s+6$oabcHkQ2ZLJvudhh!wG>DH7T{66bfxGh`J&s$Pa^R%onGH9W?P5$!?^* zBL&qLVDw{YRWeNEcu2OTGRvke1B44HvQMR$pMWCg7&l?P*7_u;Q;=$j$zr)`nIkX>Wf+rAKsr03lQscOO^O~Wvat6OFu%c z+5lt?C2KS{<5>ZJpmMj`vQQ?Kn}%1i1cfrnlcZeMM8bIjn&l}#K?o(qlj?6D3`_fT zLQN-3rJvsFx9ZqqC`J~4Aa)-0aga2yWfD!2tS^C16R+hXPnQ5wow95+=HlGa{8|j-=umW1S%=xm3=S zfKS+$P~<0cokVnROoqcv?hGm2R}JPPk*gYBU0Nk1H|}1}?jmR=O;q7;r@N}C`$_Uw zT){7JD-xS3B3|#O4p2F`sm2>`mq9Y~-9Lf^GC!}R+U9`bLlL}LV&`yDi@m{$Gy(1- zALUWbOA%sD1MI7nNz`eu-3=mT*_nDcsQ?!lO||ig@i=a5kKa|Px>p*j=+_G3=PbmE zI>IV1BoTj}RiZtg)1jh?lodkn&+8_oKgJ!qBp9MP4%)7~U+OkVWsraEMIc?p&9w}| z(0lGyvrC9xrmQ%Yi9xY7ho_l?jsqCWxN6n_@z}%{GwJ;h$&bU{{8Me~P%zp*`yi2! ztTle?t)QRZHW>G-(b#Qmp!=q`87booCScxtUA8!IF9$*fHTu*|cFTuO%D8SKAVIfMzOA@ryZ`Y zW+zX`FG&^+)7}`wtoDq8Zw7=(U=J*b*^rjEkHH!o0+XdoDAJHChm=A!FU3UYr+647 z13{=Ul%lA1+58HSUQ}3sa*bud&SX0%6LtGHg&+J$QOs5JhowmTK6wkQoQ zF>>5&i&|K!P|^!~*9s17M3yYAO{HwPDsgn&aDu3v1tpk@*o*`ZVBLApQO(C|4x*}Z zeOi`^V2h~%LWvuXEIN0|W&Id{c6dR|UFg!#7+qigsr}_-CHTAZ{ zpB^|pnLpgNN{I@Jen=<&)v}h5wopEfQg(vR*CsyDwC(KGe$9)d zqH{ckO?6J->h(`Pcul|G+qAYvo`)Iy;c-%i>oYa5!tzAl&5e198wx^@HNmR{rK+XF z#8hA7^U9&=(l^7k2MF|E$DHGcq&CQN=$O%zfSdy znB2RZL3|zD$bPP!50(=4HWRsf8C-`AX(~Xr)}Qyg7{v8H&Yz$7OYIAEUiL_0_}VN6 zx=eKL?z9IV1LBeEEtp6!rxIkjRfq~2K}LX+oan0N%J@&BQdnG*2!j1ZjzACGdaeXEbt| z&js~EhqAgfvLG@2EuXT8kg2#J>0g>YR5+S})75gA0?_LEiMKQUs=ZF-3CrbjZ!9_} z?QFF@^EYBy{hCb(RlOI`5Ll}b@&l~3Z?we}CiLxREF4uz~$BIheVBh0LrA@u}k1DX|lE+#E z^Gv2Ymk3g4VVTPssI=JNNAWrx5Sdo7m|13n0}il2!K&Xd)FUiUf{`1n!LX?s@cvWIMb_di+XL5Qp_Ylq`m187Vr;P;DY4v()`K z@sm9z0!oZ>GB=CEnkj5&5)x?MNnmDfkvsEO}hE8BdH%()W478m5}ggxEMQXj+xI zUM(^H)lFvQJ=UPar`3??@nOVOcBSKXG#*iUVA*Z8-tEm+C*_>u+v+XxA*pbmw%DSx z$G-}&@31C{f2x}a<#VxEMzYS#(5*9_2Q(F%m>_iD)sFH5-tIa_|7PKx0X)xP5#cZ7 zet9M6JohUwP#0qQ-ydjX^0&U zSv(WA!2e<~xVWw&X~~!moQedG z-p9N2M}|or&HG*FQmppk0UCQ2W#r{d+`_nvjMblj`XT;j(;(<=Ivdg zT4+cTpWh_N(%cP^Z{y{Q=GGRY5{aIu8gD0^tW7v-(C9a)fe1@L09x*a;LOo# zXm%`?tM%jttKv`KQs^gY0mptjC9A2eNnV&y%`q*G zxJl}<&sm;$A0E>6-A^o-my ziG!v=WA<1eLf5C$3<<3%0G8UH=eaq4KUwvaDjebyl+4%~)9Y!S?xuz$P#p@pkD^4X zW23KxaH5gvFeHeKoh;H&v!Qs71Jnj01uI=Kj_FIPFG;gWW5qkwCDG-Qe*o|fvMp5W}%v^XeAHcb&U)R!%M(V>k4Ygl`php^fXP^p(I2G}PwGCrv znvdOaC+@;;=cNmIzo|%H*e`u}>3pC#Nz+0pOp^)HkFn-ZeK(wjOnx$#}Zr;n9 zF>J)`&vAmSW~UH^h_e%Hw~X9ngS%u{%M<(_8gaY?0wEVjbEB}cnT+PKg_y829`JdU zD*uwW`{kWCkNe~0)5848_VP(Kzv|L*VDk%Mz6c>EOxjOKFx3A8*)O0nGyT65IrIOa z$Pq!Azs>ajIS-JV#$)~cRUQ8C!2!ZC7+qRCCOAWy;V~FDF!R4YIe?k{zboILlh#8- zXkpL%!&>r~!R_f8a!{`3RHpN=a_>NqIYq*S##1B?20s?jXsAAN{=Pp_b+@#tOF=$N zTkqrtE72G^%~u{lfyyiY>;fWg@2qUQYv%~@Zrj8Ncc~PYJHrX+c|Y5~fC!h!hx8?S zScU;KDa$#&bh+z$R5I;y7CI+ccvmadi?7@nn*`=F~ z^o~q?5}TFKQrWNbf}e*HB8riKM-rvMv0iW7t*VDBI-VmrMfB)1UD2m28bHP;l)4x$ z4`oXXU8k7Zk=1=7h{E@W^Ew{~dFXkl1@4y5No8}-<;zO_?p(QQ8z6k1Lec08sM{&L zEN$8b%>Vxf|7T|Y5B?7<_+Opx_YsHwX0Y#J0SD9n?xrufy?oKcI@J8+X8mT#;K=x_ zD2U0B5~U;uQrIz}fuW&|Nq$CLvSoAzdnG7RxKx2s2>6N<8uao_s)44yPrgtaSuGN4rXR zcDK*8fR@>yoVZ$Naa-1hpH+3>C?W`dSCw2b;~)$TiVyL)>MBDgDk z(YVJP>~6C{jmXl~#GmjUQ`S^#yC4rG48i_<1sMn*K>v8_bwU9{;kysmthj)FmE@lX zmZ|wv5PBL54rO$L${c76`fmBVcQ)k-0XGLl@zh2l@C2;KxyR&>YZyZRYVqeh#Ch{3f@+cY zyp&S{Td`>^R$fVf=D z*eRA|2?nMsU9`SP6g09qN|BT*@}}Yvyhe%a-^N$jvuKG0Wiv#{5>4xSp*|_JU@o$f zGBmHJMKKxt$fcTJsFEd8dk_x3m(bi&71=tJ1W@d0w8a!fHEeubCGcQlPBbyqUjj_B!eUv0D7W&=z5+rI@XbuTi!=hVKq1On` zTTz8_g}63pTPpA^bd@ZInJ*QkpAB_vSP_TTgtkw+D!JUl4CfS(MTbh??Z=xKekZ=F zfciQ~DPqk@8t)bA&K5HDwE#J^%wC~7{M-9zKjLO&D9k#)U`e%n7&KkvyQFt@`Dq17v5@^I>$eD3^t$ z1Yz)~&^PUXK7*Xo+1uAkK9dPR4KA<_Ab_jSs5iIH$gMQQTu?-dof^#^)-uciF>yiJ zG_-=4PojYDie{maZex+9TO4dXRV^$NokCHY5(9WtW0hvoJivXLJP6q?>PRQoz}9^& zbc~e6yP}~k4%2qy~LY7?4R#Dg3KmMCr7jvNz*+?E^ z9ahT=z>J$xUWj7tM2X6@ff*!2(%t|5*`Qr~+4z+FeiuP9BWX{7dqN9HCC6Y3KQpJj zW$WRt>s%KeJJBG+CZmha*J4%z@cdT1Gw{oF9?PteMMzQm2J|aLxR8Yh@WJp=sX7p1 zvF<|W13+ke12Bb?<5P|D;DLmhREIv4Zd6@?3G8thb%RlcrwPeJ>JY^wK(VD86j>`7 znd6$?iOeFo(UV2LwRLDu7-?VsbwUOaW$IH564*hwZ*84y1Kb{l+j9;u8-xNc>WTd? zx85kKRfUOG&MW#PzE3|~Q1c-iBV0eApYaSxvCfRc{)_|3q^~j$P2Zf9==I+Wy>GWNS1uY37 zRHsG*e9Eq@pp5)*|2DpHP?Kb!w6}@+%u41Ht8vhlh=KqFVg16WU<#+-CbQ$R1*<` zf2eivXp?Vh9qXG~r-pD+?=eQZhvtp%yB~0j>-)cnZ+lQAge?4PKUt{%sNZzUEFkiq z#CN(yAq;5L66zenRJ`NL-Zb=-VAloxu>)sL{gOLCK7Ud(e$o+j2XfV8FFF%`wS|B6 zed*nmPEU+u@R7hIMz`3pdbI{|jkP6Fub=;21=HfU{eFvM?z#9W#yy5VZ?9%2`wiwp zL61BDs3tm$DXci`d!v>Ef$1v^P=Azmo_7BC#XA#EYYhMWE2P;9*S;a{Eo?R1W&c3y zPv!W#?F6nxt?eJ~%H96ifD(cj0bMFrv^!VO!+q8T;%EPVnRVji)SnnbR{c$eZ;Yk8 zSF>U7RC?ZS0KUib8g$!H#DlYpdqy9wZE5PC>$i#6^W0(Po_rF2EO7uw;0oqz_?#T8 z1Wlj>ve8Y1_P;nR<(X3wb#tfOUG++A4=H%c6cLsD`^>~Y$-jeMtRc;+5wakvT1=eM z>7V$ARNp}_I%;`THLeG5-CqB)g6)QIaWE+7R~AX*r~7@xs=Myl(YzZ|Mc#uumDc5U=Han)5M#yY!R((l zQD_gDv;M3UVFr|p5i{jx{<@uX+k4ZQ#R2N+@+@#e^FYpAfCU&I>la$6Dy5w8Mx2l# zK7ig{&ln8GCTNXDMMdF=pTTz$@wcxtv=>rR>W3fpGX2YdboZVa^6Q;?sE$>Rt3XGA zuw;~^Was*=EXDCF+=($xxUusGv&e5cix8DmA}{%gW@Pjd0F|2YSfkyolHS^T^1p*K&5M z#ZV6gL7CG1=4z@{P2R8N@|Sl= zM;F0vtHnKN3aol;rssQ2>r<8bkH1oUBd9Vmz%a)RKl*a;ER)er3?CgKR_7zktx91V z0SNA0Ro`7Cg7)Y zZk73gvs(WV?kQp|#lijg^U9$cJs5r&Vy741)kH{P%f77#2ojm4oJk1bShujsT9 zMpj=*&Gq2{Oc=?u!%7&W@ml+kR^p>;RTvej>Ek#W;rfhR;N?9ES*0z0TGHYy+lx1SyQ-Qa}%YM!_Hn&(N^@+Na6 zXF(eUJA>|J&y~HSPMmwvpjeC-*ek`o;cl^(A!xJMaOpz4=CbDU2LB&h?-(5UyEfcT zY}>Z&WMbR4ZKs2YZQHgzv29FjPt245-ur#e+0S{tbXE6jZl`Vk;jwVreiuynT)=nTRd-UUGeN zJXx60n*q4?zDB>YKklbZ;VgnAttaD13|2aBjXbNrl{Cqy=_}1tUYC`M0N$0-P;9z} z!}CxpM=)<;2Z)z#_D+@3k2OKWg9M1AFhHx%i=D9z`}_nr;|O_!Y<(zk#X~Rfh;?TO8<*aX|@0 zbsED?otB2R@rNLDk8ZWC0GYw+vQ@Sd8|tNvcuw zU~TD=Esy2TQUxaUfgWN6E?~|I&uB!N9pUJIJu~l18LwdI`+jYu>bnZ!uGegX>(q=i z-cUCS`U-tCdLf(d^dm;jFC`l4LhzjbB)_2~Q|gOiGM(RW6$=t91(ag`gEtQvW!bPR zv%=laHO0?AZ*RzdCxWo6e{lfsx6~v0f*2mB1v(nzZ2vgssOkw_!B;0xme*hHJU<;E zP-4@Sufr>qs|2KPvE^2*wfTL7m=flElE+y@6!PKEDkBJ= zztvT=4uE6pL{X9gOot3@U-CI6|1KHwk;!qxd+##}mw$Ct>FFwexcP2e&7E`f+-7+l zb$@8S<>=LOnZH#0o!L1Q|3kH!p5`UL|GXYCIls~(@Syb)w4Z5*ug^o(y@xnQ0&!D| z{ahNvdG#}Gh;>RBx!*sBnU!gwOYfGhDkBc)rF_ZOid(q=P||pdARu#t3z{7U#_NU} zcfoEmEBM2G)iZ+$q+k?3sC%jZiZ~+NT3q3k5wYjS>*97#~=%C+sft83AQ( z7jpHSKlV8-q9312 zaBi)K(`_OI<#GQ@q&gqUx8LkBd7#47+WWk6W@^I?;CxzB?a>uY({)@k=3Z*X>s>U_ zoOc-#Or6q)>>e|6dF>P*XVi`+pefG*ZM#&$vnru@-(Q^r+Kh zO>yO*IxceZaPB=%osJ!c+7y^y&ADEW*#Lm!Rm!6xxuYV@3`h6eazpWDdcw;kV-~G<#X8aaY#&AfE_A;i#P- zz9F9TnK`62tF|IW5aT$w_|e368+a-(H5?H;Z`9k)|320&8y*>y6=RZT1g*3L_ewavpNI zK8E+>y#kQZL70(G$JZ%mBx<}q9E!70F{xW7@Y?v2OYn}~8Ee{RP?PgH8-)rJlCcy_^{Q8fu19W=)Y4Y~@AE{#pMc-d>-YynMrvHbX&5*Y-B8lsuB5m`ciqKZEYaLr#pV3oGBskSujOmMp#FzmV?1dx9Lb)b^8+$hnT@pA z)ORFO-ll3}bw)D>z*gZ^*LJ?#&Cppx=((PteNdo%su&H!;Ma!nchXxxH%;VH!H+AGa;Lr>o~utN4$^9AC}A``;3Co7?Ug-tF~qocSjCh0ss70nt60-CBM07(~h$U*f}cFW15X5$gx67#d{ z;l!eZtK{*0s_JTQXK(~;CZpLM+!9cVV>7s!v9W2fUEf`*ItFY{QcfMCkm9%yCa((e zQAl9S!ssJ8|CX>a4dgAiPLNf?GdyBG#@RpnZahX<&a@s`&l;Hv72@!%Dd>ly@OF8y z{X4D@fMUI<_F*E1-PoOIr*Ifn+Rax3>wyAW94+)9M_-y4&dn(NfeA6kyORD?s z2;#ce^+5M+5n!P*uDgSe2Q+K<0uuR+$ zz!nP;Fuo88Me2o=x?6$k*H(u%cITFi0o6`yOZaOBK9eSLw^aZq&LAQuhb#8WBAkyV$n~_kvtuAKMB1llK|Yme)EJb zR(pG*$$1tvTTJBTC#%jcGPSF=rfl^#n~3hV;V6w9m_+;ju!y?uk+?L96vU1L46N(W zcYn98(lKlMEuCYM=@Omnu&)w z%KB@HqPSHbxlvybxU?%}Na3B*@j*LY1-NC%CY`UbJST(O5mX!uFzoF0)Hgn-J%i zlMyiiIIHQ?QHU_Vv=fyUWo;+e5VG{9{b?CLh0Rlvvo-VM>0?jhj{WCtbtfHOlAbng zKH)8nyGdsb*DW~BSDEH6T6cZ)<~-|%D=-l4G6a9hJZh-NQEP9RxC`!-pf)*v1EcK| zGlRz61xt&CIo8 zVq~s9m!FQ??m}^4K>zv77V3M<>lE5d&&~`G*1zFc?mJoVJM{)Y_5oMwtW|V(?D=FDnl4$E zq;J8G+OwamIgUAwlaXp!$!(lheWVt)H1?}0xTM0zT~u9yHr!Uy9$qz26cyo!{Q?MOe)R)WJZ2eq%l>E1UuPJ)a0UvbjrH z#v&%);`PrNv9kl~%@&DlA@nACrBX$+84qx>yex_AU>&`%MXoX;RwTAO%@cN&aI4+5 zu#h}xi$785-z()#5VI^WInfsI83-T1QsTn9_{%KvC+So=94y>Uq`db2ieL(FxoYPd zueaF2KS!nj4jld6n6GDfweYVQJLt1AdG$aa*k%ce4?oaml^x7~p#4f9ir3h8)(_R+eo+q_G3HkQX4Ma&Iw~(#wM=2ODyx>m)u^|<)}=J7x6~pE87qDZ zs<07kMdt{AiABNfn&MCH$-V!4I~Y$&YLL@)7fml<$gS8(mdZ=uEtXt@ZdDRgT~Zdl z#H>w}Os&<8yn{%h!b&C*#UxCna#g5@vv|t$X|HD@GxaiF2t-xNP{Phs^1`UbV!`vc z{WCbU5c0ohznTAU_IwtS`TwM>snq|ELWuca+4GOo%?!}*8^!-1%g`{4gdEJA^o-0L zEUc+;3!qBSglt@F^vvJg;qN|i6^KEqz7Lo|D#Icu)xRa-R2rcF4vGU<|LfXJH(};m z5)M0j%_|zSl}{Wn>xL|3y8z+*ooA_yAUH_ynDhfh#n3a`(LEHAvIlM-g;fB)Nhg(()|4}}t zJi5j&+R^AUHrN)m9V_Qx!o$xo4X-38WeW64q?$@W6GgLCSBQR*ZG52112Cf1)R$3eLaqrMeq zM_B}v+r(K1yaUU99|ddM(~5uJAT+QVWK*egK>a9~|NotFX6FCV8E0nxcak26F%|I@ zgb2XI!unsAnwYjWD910J*VFppC_F93379wOBms+(e;t3_EFEO54)>!XBe%Lk$zBdZ znH`eE-6TgNt!ktzYe6?zRmP~{oLPuZq%)#Zlh3JDEFv_yqRne9HYXY^s3}xdSC^!$ zdT%!-lB;AtItx7JTwlHT0dk%^bDp|+K!E&xFoDpCtv4#Ip2*$Vi4VbZ;2Vz>;rl2Qc#!}a z70i0`>|(&4z{C4Q+slmW<%|KP$$cXACkuOie?H3JLQ7qP9*mb~2iUH!<23u&eL!Aj z3x7Tzom>Ikae2baejz#fNxL}fkMX#gBYt6w+Y_vEb0+l=yaL%Q@(a{;+vgd7p^P8` zFki?G+9Ae}W`Ry}mcu0+&95#xXJ_(&6DwC5xnm4D+iVv%x3*!w3FvD%uAPzLfv8Ck z&y>5iyer;^5Ujy`fO{XUMo^Mwov^!}yJra=JtVvbETQaQp34lUS(>E|SKbfFGlL2q zSLzQaPGt=H*n?i2;YnN6$AQorQeNoTK4k~UN0i8>hDzo50ldreb*+_}c5_z?RcQy) zzH4i{4s9!&HtV4~Q|Z)2hMLOqnvTW>qus!U`Iq0kv7Mue0E6a(9pq#gcM{X-;C~-~2NYkTs4~DhjpwIx@<8+U;B!_k7US1D_UV zf5j2t^bQhA8>qKQYR<$ns)DQ~UftC+jdU@i#@|<16|SyB;ijNoxllditAK96{!AnuWYTuhlI*Z;xv;pl{Pjg4Z6M9EKmVKYom^Oxd4 zqxUSP&8Y3_)pPAokqnHc3eqW8Xak-_<+EPe8ea4~8J=sA{?|J9A=%nbW>~8jng_ri zGqE^bES6ROiu%RTiKs|bh1m#Det-YjCg9qN{Kc?RG?W@e%YF9h9n-x)NlRE^y5kSu zo^STq9CK;T%?e&lYe5<60adpWnZ+ zN|$KEZ-^>%31y`-iVYgoB?`9wdp-d;wFP4qjBaOpLfcW&8iqSQiL@haf1(U2pDYD& z{SYmK^@_qfoIi4N~eOFuwTM{ZuWJaA-A zV3n+i8ibURNQXoS?sdewN&<{b`dh7|;jzsHTq>cC80{Mm&5T$SzW)rTAcoep*%_SQ zi7gYc=wpV0!wlQ5I)e0-wW^sFIgL)*PRl>1+VZE9$^u;yuY0Vf&c~Z2`v-j{v+qD& z&TLYGwxfnRe~_BQjEud<9R(5QhC}yh==`LJ(RlQ*JQ8#%BJ#HB2ketMW$T!ar?cl> zXB0hGTx)&E6Vz2b|F#(KD(zas=@PkC@4D7$AClE!>$bn>4@~nP>zQV}q3+>1+<8NS z0cVVLtOClbXpyQaZ}EoaeemcRZ`pj6&01r*jk|hRuiV?zFH@6$1;^N34ubnLjV=*` zI}OVnS&t|M46QNs2=F&@6Dq`rXlktQYjLrZWh-}`Mm`r+E5o?|-PO<`+A?HwX{5bX zz-*Y4L*>Gm?t30fJ88T9)EY!KT+bmU&wHopc|U&@Q1h$-;Ari6`drYD?e+eMUg)K$ zZ?$WukGmV;fX$Wjy@|ZsXh5nzW-K61gD_1ncJuq0&W8gV0@(96stbhM&xk7P1DB4h z=we&ykU=!6Zk+A+1PvOXTBfgIn5200^a2UQ#A;{y3?1p^{ajoqcP?+`+kATBz`wZU zZ?G7st(;onTg9+m8>IkOtBVA$4+vwmT(6!L4F3bk zxIbbGmmg#PR|46y#F$q&Tb(WT#0j^f!_D+glAbT^ z1}z8ZfiW$JGHmddnVKP3SC~gEy_~&viYtwsW&&kg&~ElS%f|xot#9K2D)6r!dEE)q zWh}ly?SP8Ef>71|OXTS=bnM!@QbT5Q!awKa*+9d8g8|vme~@uZbsE-h89ISE|>itJA{*hCX?vo-|#zYebgpx8oJl zn_4UTVlynRiQ%4pW&98S3XyNlJ^g7+?)Nqe z0Gnt>aiNo2xHWS)k~|UFW`{nf{|*1hS4Ho;>>>#KwD5KlncF|41$JI9^WuP+OPplw zF9+>N{;PH1?>FkoEszt8#kjBT3~rW>el_(QmtP*;+z_uOt6ftg7O_tY)1QA80DOr! zbWW%u1OrRd1;sAJuzn(J9|UPHN{_(iK#{Ygto5FRFCc8MWXGj$9=+^rp4? zEv^S>hKM&b9z$3U)>9=^Ji5B99)hG;$+76}1~{krAJml@W@*Pc=pWP-?T|hHAJR3# z3uK+GVy%>=I}sh0@PjMo18^^pVUKW1l}Irf>dDM;0pDQwq+^u6!TB_)^O&QM?(Hh! z5(->=)gZd;P|hi!Vi9@33nTbjy z8H;hNStGS2zmj-dZ+Wd4&cN_~j~gG-Hb z2l<9ync2TTRO09VzkMp^)Ll4`|18!rf6G?+fw58z4nb>EJutv9Qn`;n$y2*Az$jBS zE&qMg#7*UU2EhZ^jD%BR3QIsf&qBDq0W~zafi;twyzKPW;tvPYOE5O_6mFq)H$VLY zw{HCdw+ep4t;>;zkbE)!hFdojx?Toh^Yu2X8wbi&gUDUsehT=wxw!=osGi{GLi#oW zSF4cV_Sj{QY#B`=$d%!m6j}b<*~!*R^E5>Pjs`Rs)A;ChJe;rr&~hsUDT$|*IdovM z;Px%jvEvuhW5LftV?*+gzwSzl&LBRgY|7~6d$=d)Jy8^sXSoWTu@qHBN@W{)E)Y^; zHQc5X9&?&fMaTy#WDcB(Ys0J9{~VxZz)5d$^kZ0mAnzUR-y7PMJAC05$|?l^h0)`V zuu6qd1;S5#j{}2E{Wdx)Q!xLFDb|H%P_b9Fvoy9hF(qVX{+~T57RJ<>98h)u^M9Fa zn>ArPzROYkt@v9@wJz$t`I1W6<3VY^;#}~-wfp@D>Hj$yp`p(JxdX!Z4*zn5R@v$Tc%8^C2EqJ7>AUxp zSFc(~QU&0&JQ4O*K|oQpdy)9R(bPo8?Z>gejzJ3r)S?2T6AFVpVxSN53dUv~afO}&eq`IS#(1Ea1#l)-EO zFtqljIUxA{f2JTDM7;K2+OyU;h4q67T<> zao6Vdi3nH4&xWtwt$YlttgR-Kmg|olS+^N-Uw5vC7j=w@8 z3INGMQqQkB9%Ud*2}FtYS~XY9=m!IFbH7wkmXl7Mt`XDuQ!UWUyeyUxK?1+CQRyK@ z*;2~Rq$>M=-wMHA9;7043hVQNd)dzXW)N2%-TKx`&(%q?EoB*;CV}(jM=yE5PZDk3RJ}I&(d-@=9;{5K9 zN>a3vbEa!O;99C_R>8DU&z85rbIZ3L8Y#bTV?1m;ssQPrw8at9(PZWLy6OZSSsB79Wz;mz!im5D$qirMPSvcFh5MCNe>1`TJV5Y= zpH)cqfS^VQTyZZ~f`xS5r2CJ+U{A&1)4Z(X5w04w@l%3h8QAN%xmGy3__p7sOYY-D zP0!P5^S!Wz)@ZI#Hp)spw=ainx=GZ~g z*XdB`2GLFxqC!k+3er&Sgx+)SE&%0EA>oxnGGIeRk?(XB8K$%sEh}pyqWB>9tRamx zt2uSBQ|(?-C3%;$VX#_@NE6YRVML==zfBfyF=|MYD_QV2=;v2O^EQ{faTW78Da7XF ze831gJPn&H(NhYd06d3Hy{a3Hl#Ul6&fS@O53f&AGiOJ&_m`%hG9qj|9#BIGr`Tk6 zg_Vmgp-5MQE{d&n5OUNqnk+dB1&%gi8cdHuBJKmlgjp34M<#(ZJR(+K2nVHvN#nGH z>qGrY3uKSOEnYZJSerp28ip|JO#(}%4(+-``Zo7SCgh3jwdA@#@6r_RRB`U}Stg(e zeTQWtEjh#~lm}miV{RxV3<&uSN9mTvmu+<~Rw#*FB@{Zv7J+6GyVx!AW{4*Y&%P(# zpBG4LB}N6C0Sh#Y;4G#|an5k8wMl*Z2Q8L$hieGTr5y$BEW(v{osu8+7@>JE@ppXqpPAF7-Lsq zCyd1$p2!R93XNCtqhd3+>Mf1wMhQbQ!7l;cyLXsn1S#+0mG}GNR zVL7BdiioN<8MJwL&#twB1sBO-Q*wxU@8KzStoB9M^b;tC@nUR|&WI9zr=yZOD^L@4 zL{F2G^wRUrDRpCsq&7iAp9-%tQH4khBnM-ql`>u%80>fe;(TaB-{~k{9e?xzJeVkB zV}s)3%CCV+oZ8SGIFFzk!0wrpp17X}6Mq*v%bUh*P5TA)<@#{Xh-W)lR^UqLJMAaA zpGK!xK#u%alDqlW{sza#BKNU%e;nsVm(F3nxddnS)A}jQ(cDNh$nPJIY&%gX!2u*5 z+su3E5nz0PBCsjk2^LxsOincf1q~fc#LJ=rA=t2h@70Cg6NZsDNNs^T8H7et7aqXL znxz^*ABdMt{FMN~vq4#!=zVj&3iUlB-;=28h@BSNAy z6Gr;X-Zq`ZG2}3^$H|}d;sQZ+n(}<|%a?vnJ8x$Iq=zvRsFw5s9Ulmr`3dXd^X^3*mDb{XIjt``l#L#RAWF?L}o4Jx9O0gih z*NGi)XEMQBnARx~1$UykQ*I~)6tL>lQT3R^9l`c7{#5sHzt*176h)Pj7f&9|bv_Fh zilTL?jIg0lQeMGgg3*4Q!5Rk*m<~9TjsUZva;$}Gm*+X+L5hVu_6<*VgQYd zjf|&U=R-pU7;JvnuqP%8-B;y4k-DeWF z($6?%m}JYf|2COy6_Ae57$qa^z3?#rpzb>z3_Ri2aOw|%i^(McR=ai@x!I#@`mE=! z8rx-ef??AzCR;MWSQ6uRAIwUi18s8V5!o_5OBb+XxNT*)bMa&D>>MoTk~E}JhmyJr zF!2;v7jj8T^U@oorN^lyEyJ_&XQ+htJ4FiQiRdX@p*Q%n)4oP+5%4~*e#6KEwqF=@ z#reNJQqRiIuiIQ#Dzx#V*kG@DZhi@>H`Ts8)BpgMivuT|^z$vY))?zvr>mNiqP}7K z5qT4abLV{MA&!5)fj@f?Yg^QXpUk`ob(F+<$hJESa&7ueM1f9B!Hiplf8s0$Z+>63 zbYvd+-HILrgn0J4FssL_D9w6&w-ls(mGJ0k)fiCC3aS+tTJd}FFXQ0*^Zx9#)RQYq zMF=FDl2uN?767?)ls7A8!{H_>&JsSTsp+vMgzk+Qh-Bh9%Mx~?VuWUqoI4>ZTS~T| zXWNBvJ-)^2`#ERN2}gXfZp=4YEnxd?O>LcXa7r@OBSS#(di`ad|JYgs=wEzXJ+i_ZTR8b9#>PMhL9MLE(Cn0u7A<-uuWr@m7OE34tIsHxo@F}kpy14M|`INXC}yq zxv4g7cWhPYmWdSBFWM-5Xkzdf5q_a0G*x_vQJM_eM7WQyE{}ilCohLo)T_Jt?Zdd1 z2}GaI)8(EfTbVDzReht-9#5QSEA$8d&n@6IA{I&~a1hLB^u#5=iP8Oo;$|UhC23d6 zYJe2*5PhlKG-26gPk(<(iXd|;^{##U*XO!5y+_;QLDnc$(nR1smdp??$S-i3UtqG2@Z}BP24t1M5QkIkN^i5-}?{R&oED zpHuKAzX`Rjqz?oDR_PZ-mcTiEIzlAT{98#029ECK6qy+ITE#iNktu zm+=)n+g)w$cr10M6Q9O~`i_@Rllt!`f!47-d>O))-Z@z}xO;B%co=-g%R3#kT@v+5 zWl%+lAM9(^sfN;=m+Nk4Y@jF}UITOLWeouC8XyZh&%Z-}+f_fr<_rU983b-uvql8m zm~uN|+eO>PhGxa{LuvgD=*@NVpQ=WIH|8cR#jI#;mj^v;9CqDy57FA{ja^=1c-|+O z8mRJ=T3-j5uy4n5H{>y=)no={vL6)jWUm>xm1HhNm**@xEE*d}?^2$B z_P6*t{>ifpp|82fQp(UKf4pe;$!uQ8#%l@N`Sp&W{lw9fV~0Pfztv(Z{ZeY*eYa5@ zd1bo^=y~qhXqhICenWUIjz2ZUO9w++GnM9G==q8ty=FFFJf2S1?YIYzXhpnD`5T?) zTmxN_4pzCe%LpAs8D{K%!K_!I z|AWIPW~bO1;AVsjE=B;s2(QCfsT~Cp&azn4@QX*V7a<`RdirZiU-L@D7@-2EF`r z@+X)tY5GI+yw*3g9$^6g(OYBOE5hk{X{3{GS0F%YVvJ)A3;Nsq#nPbGcr|?-A1)BbZz&Z3380s&?#mp^EPKdm%j` z3ls(DU$H5Q)Rbxv1VFs(KVA6XC;s5nQ{q5O6eTF4VoRF(lUOP5A4Uj^N=zw^=$qd@ zyP|KO-MuI8HQy9z>1%xp`OU#rY(+pHk8yLTWtRuoJ8XBo4MiI}b=5BbTT={KeS3Q8 z4`JKR_++xZBAT=$F5*qZ?ti-c9Cs?pvRdO)3?P*>?G+x6l^6m-snUB{dO=sg9nDBGk&`+g zhCwD}kqk_@L2@#E+y zwtn#gve?eH|9^k4Q~?5D?9`v}AZonKEdRoF{(F|k@~=46|7UE<@(%{`Kicq|jH&S_ z-#hGVES&$P1&HSQp71TTf2F5qXK!5?KW5j(O`1snfA6u&O8lk~PS_#^{Wkhu+3gfU zfkKXwWcbsmfzbg2p~lBf2v_rF7)3DW2LcJ^Yat=gX_cwkUv^h(dHd!)%%L-XKXdEX zuXVj+6SL{BT<6a(fv>-l0C313s|Iv+vl_ao+1@LkoeYFW#$7lVwDwkDAH*y-{d5{z z^lSE#ykQP-zuz#L>Gk~F7aSpe>jPuveizS|q4DE@WI`Qubh<7=BX>%5sQud^`myL> zGBc(qFut(~E!^DMK*;k-AA0{>VGomuyGH_>3Dh9SSfLD@)M}ksK-1w8+(;aLO=xNg z$46eWj`8G=0o7l{XtEO+uk!NGaKC$pU#zv%TbiHf0z`j|spyqIJO)=6&s>OjCZ_JT zL1|oZu7QL97{CW{BBHA2@P^ZbI?czHk)K%`Z;X`>3tEYaWq4tD}^ zG(lw^Q)!KL49PA**hzV4m6j@LRf(OQhBOpMwOmr^cBps)4UJpMPN`T-Qg%drfzYL} zVrNp6V@kz{B{?8nB#C^$WLzj^G19bQQ5f4ytgg3NCPwOv!s`pYd#3o@A1&bL5A_oz zMa$wiY`v{{0FspmmZW=Ny9&Lo1%4*j))D9hxq&<$S*u&3qH_4Qp;$1v8w;TZmG-7( zS-EC)Iu=y&3rN7pYL(OydFrXKLPes=i_%hAVp592oMGc)wrh#8bS&gw92UAMC+CID zuyOX?b$Is0xq3lYlZwJaX4m@+0kXYmj0#OBO^K-@fJ&tm#IwqlfuxFX2BkEfK9HUG z=fQq{S_x-}JW4O{x@x*o@}d~<{avWy3Lc)JCbT=N8|%Y;bvA=^!RDN8y-QPw!j=Mx zATpmX1;^XcO-dOxdrMsS-1G84vucI)QC8S^QE+hz`QVOzJuc-v1TKiP)#nmpo|Xbv z+3rt&K!u@mEbw0>g_Y^3K?A6xx7fghY%JAuF>a?4z@W0c`0`^cEUkUgT#Kq}Jbbcr zrA>-(+3l3<+4{?gu5`JfiDI+wCBi74T&PMC-qNuYrK;&)WJ$K7!UTt<9k3G)7s=2v zkd|8GTKV@;!mZt;2oqA_(_aS)#_#s7(!|Jd0EIcUbSCjMG{t1*3rbnX$l#6<^Zket zG1k=t=B+fVmd%Qe!vvsnrFtRhGve2TXXYi{3M2HGTBSx|FCEGJnBj&r$fOir7AN39 zU%<(9;(ITo5WdL7iHSXxm!?-4$$XcDtmQq2@g`jY@uz=<$lPy5t_DV_EqFH8R|LN; z09Qdr?PP??(wHg>4so!fpbr&g-`~eD5e0;P&hGh5u@8d!q~G) zv?cI1F}2Q!(gjnFUo-9W8(CZ{aZPGM;3$d*ywqFc&GB_W%n*x9BM& z2aO1pVKiV>E732+5-ME8SpjJp7t|$F0I{nV6){6np;KfLH5*a~M+Ls_grn&RckG7M zGNMIXgMut#->#oOwKAOfD+G-?-O4Ud-CoJ=_@`mHa9rgXH>D$&9HPRV6j~V!O)z|K z4vfXmi8OCABw;OtlNdYE{Qgbmc;tAROrC>|Q4?SGqr}d4Yf1(RmG}xxGUG-@Ky$Lo zgvtJ-U9e4+byyZ+eS&Qk8rL{tNmD)PIv?@~F$F0tHg`(CMnsXn2#{1cI*?%QwLt!l zswHtQy!-(eFUS+ld;)O;K?Ib6a3--+ZW1s|++8CQsV^INMfrt5YC)v_;&@S+2Rd5Spgvp1HwKUgc;7Q~g^_xC) z=w+@8!R=PX#OLUmdV5i`fq1TsdKuoR&t~@{E<&)ow~)Lpa?f$kz486S|3cG`%F~%O zGqWc1CzVCN+s9V^+H}DWV8|ax&Z=}_v_qRyI_Y6%)DM|s&bi#@P=!Ru!@(ob5VY2x zbz9?4qTv6e*>d;FLN|%v&4C&7W$Xp>1XQCpdd;bbtG_MYvpje;)8o!!;tV<#Sb=__(WJ-*v(83|IONq|tq- zaIwsTWo}J6VF{Nb$1{ziWW9LGh|Qjx(0aED^mvX4Z#*hDtp8~a50#6DQST+K&E_jO zBwRAOv^U}MiRd{1aGL!{#F8Ia!*F%t+F$VLlB@KeY(&V+1*8Hp9+dSPAEz$qNZsjc zww9j68=!jpK_yg>J$^(k4XTOD>QPP?p_Z|Nd7=ci>&0fKDlfRpQe|*f7g1_-G_j&m zXQR`XbUGEDZqGejd4&K?_ccT{0))BtWktv*dAhG%m3%(|#@y4!Mmp_g2WJ6_5!wfy zF#ap%&Z^?Jd;UM-RvAQY%(!qp`!_R5wS12a+E>jvZ1VP)9Ps6Lkq#o(^Sf-apb}#j zOzY%gu{EaI`Np{*Zn5irM3Kk*@B<1%jKdRzvb1owK(J~}U@6L}^3-~>zx=S*qu7_E z{~Q0kreMwqsM)Ihh$2l~w5}#ivlihJF1Ed78D>~w^r4) zbV+0eF+qW;iF1<#bhty)kq#8!jemehD2P1ht`{H!SjCn_wTVS0tc5v{t)3vaKo4p= z=2$t#iqX%U&VN`feH3_#WiZk@)QW3`%8Dz6Wg&4t0H<$F&&2;8@)gc;@mZNr0V*^o zrEnWW7wa+y_=o}Fpw1Kr$HnHzHKLtGz7B1Xn`2QIva25gwY=`1T+?@NGhQ=$IUgHO zeD^;9TMzR+v0TFrKw`xDfCd;miaFDr`FXmrs+IHFC@-#M6)aO-5V2t54tM>zANrc( zqw+D1c;d{%@jho7{Kg$wfQSZu^mct< zQ0w%b22qT?HrglS%gku4uosrI*WMla%6I7i8jZ!?_ON7GoUP>NWY}x3jUS0uen?W9 zwZDu%>Idp~O*9>4 z52Vj!C_&5neV}4ItRf`*J3fWS5SnQ{Y~<3^8bs(afDJ;9u_lpb#m0-7^RLZ9WGUMQ zVEbx1HHH>o;&_SnQ8Ri(fi$u@fL3;K|T7pokb+#+AlN89VfleeMzlE0s-zQ!daM-4DfI zVPQXcF{y0t`}mTq-ASQ+z{3re|FKj9$oB4VyWSjQv*=yu>2quEaHF|izUnpK?Vn=s zdERY*qSy5ddKJX6@?hb>=!&apyQDp5st@Pijz|dK5g7wFMa<0^fi2%b1bR4Ri6Ln? z$U{c;@GzSzU1u|Tt$3}k?+^5LZZ3qt|I=g}oLPhf;}~D1@<;6&()N+YUiMo!3HcDD z(+<2Ci}Ijc04jFFU$=(aB@E5Ur_m2pUq_BoF+$o<J(yvkbP*%GCBBO7)H01lGE4_;VH15(l6W}@DJJw(-**75 z$DxJ4i|)#}R56V)E&|;Flb9vE+{648ZM@u4_c1iFULTH2aA}-OJR7^T)Z>f!g8ewL zV6jZ;C#Ez(*zU;rhfy#FBFD0nvwsx?0qn#dxABrno)}Srh|7iuXD!6bhx{B zQ^j*vwwFHNH)5AtVyTpb9$I@I<}c!oR@)EfU(h(hA%ct79wH!@ohoR<#d?J!9Qv>xwauB;Ki&u7(hv&?Qz8)vb-?Kqc3Mt%&! z0#Ea2rj3w+P+jD;40C2q-0cpFR2jDiNBK*Y-#XI|MR}HFlB2#DkHL`z)VI|P@7#Au z^HPIpu4TVZ-oKTAH-OKX)HMv|R^d5J)n*hw8W zO@Z35T$y00V z!K}#&0LnJ{vJ6Eo1a*kv&+PTzCKlF+=YtPLSt88LV&-86*tV_gJCZvtlTLC{Nfu1R zB+nLNY@}@z;Ee z@F?UNkFPtgPr|pwPu|uhy3N}ovf1D$%sB+Uz?XD3tte}8oRUNwl)o=*^kRodBP>`I zSvS6t=R(#2lN_r?p#-Hypx$=gr>0i*iRvyrEQQ<)8a3&$ymWCAGwSqp*!`TeV;4gn z=$eia$hbZ|Lc&ZhtnGdNwaO5=wZ6Bf1AtegdY@OIdj0>0t#^tJY-_ZwW2=%>Y*lO< z72CFLW2KT*Y*d_7Y}>XgPAax--Rynt{m*w!``>0;t*xi|*5?>~2>2d$|M-^mc=SV# zLiR<;yDpGX-bib5PH(odFvGbY#VH(Ba!L%(+HV0;|wt-9x0-sMpZs=6HlCupU^=_IW?b$sEtB zguXv>R$pYFTqwNs6hALcl{@ zV>@h0CZiBMBqss2*bPgCcNflUjZ-as-;^0=5q>N{T3{Y&{QeZ$-}rXa(6p#RnC^P< zE9u3pipKAy<@_7P+wJ?j0M_bjH+;Ip{`ur|mg3IwaT36#9C4hiy4KZXB(i*Ksi_Qq zGuD(7N##q(5`th@50$n3y=gVkz^PUzcj^>XcTX{$WF-nE8fRw^$IWrr5az_}96~F? zgeq+KX@Kky)&opq8rxjWHWwJdI!lh>$FU<*ZqT39Hf38kc8#?%la@VXSZQ77!K5vS zb3*B8lmI@?_~j)@=<^1Q+*0}UBIc>#?Ai$E)`Q;Bu+{Lz9S)D?zc@o{RlmraA~Ayp z?tRNlN0sd{K4ZwdaxB+&@B7@WrV+KV$?}Z z4r`xvS!jAE0i$(^iWuu760Z6%r9Cc5(g7<+PXXA3Yi+OJfkUN#X{V9LN_u_9KD$N3CBoX^U87GQA6JV80+t%t4nnThM%$56r-uO7$T}7pZZOn7r zizTJU#jMa%jL($K)AwjS^eEc8JT6DE6k;a6wL8HbKlRXTAp7;b9;Ue%RT+2ejgvmx zqx3GUi)iE{>96LkS*}!lP%}NIP3h)$aRB{*m&4Gy4S)GZ<3}gs&2NkgsyD_boN!kk z5H}|Eo;Tf(2$2II*)w?T7Ty}=bxUDM!v%bw9`Tr?@6QGG*k*)vpy%I^-?ddDxSgxb zZNHz#9=3^#cmV(_;gSp{b%7zyQMJ zK-Qoi`kui$t?MPG`y$Z$0m}y6o+KuHI^S0}?KO&yiof7kAPcO4+JzKt`vw$Uif{Wu z*<1>?PYJJg`yeUhFs^eL{EXlBCGZBBpN4}sgq#yX<6kwPog-<-QtM&v{~LWx+i#9b z`y+{yUI;0&&-=BT+tQ%GWp?yEH37KfLNre@y7<^(M}IaaFr^$aYG1w53pAeKT!=J2 z^N_9vF}3+gxGlw923dp3`@@}HN{AdA_hL^F!)VO$UMiyr;YfmVO-g66R3P2u*`;fz zSkc(+So`}2^vhIo?J9b4>@oSLk4vd%p@1`smYENRRgBBp=m8Fr5 zfv1_hdo0c5lcF)py=t}pQ2 z%YItzCNZ*D$@zq&l$AuQfZbRe zZ|3Z0yoI*5*?xQDy=v;M)s&6(6rRtK!8Y&Qzz1kp0(abhpjkrSPk^o?0ST8(1P(ck z`Y(C?&jc$=@)bQeX0pLJ*r&dg<=<_Xt>kELND3q_B5e+4E_y~r7Oqd}Xfjj!r_B{_ z76K{xrz9jw@<#hlnG^b7CZFoP@v zN#wKBAyNz#zP929OrwnrNDqPfjY7^-k2$!A<)2>Ki#~~;Di7x7bDw$UQhuSyo-uzyz53& z+id2$dkAZe{sB3@5h}Ojf$?L(NYM@C4e=6#fs6<$*flJK3s@!EAo5bm%op-}b^NzRkwx;9tQlM4U zwd`ElA4HHl5)8g$(KT4g-rHTCLU?j}w$0Aj2j*5-t7dCqtzE`jCLmtiev$Cr~I`JVtSX#N!8ZeMe6 zwojdX4@irNK?-YN_cdOhgM%uS=7J{tA6AT>s+LWpJ}k5Z|5v^NN4{4_U=)!pRMg=I z<`LnL+czKs*co$aCJ4HKN-2Eq$eq`zA5cA)MwS7J*LZxzyrGDZZ0G0WeL9RJI{E#l zU}M2NaI=UI?yr8tZ2EeDJ#?ZH{i$x%4s)$IJ+-iJvm3Zx__bd+7;NFIYdcXZarcKj z0+X)1wXrt0J)g7wcd>&XpvTA|K8f_mqT`m%wia*3jPw1+fkv=kPJaBlSJFh%rz=N? zVF)(@uHZScr!}|Ni)*D!%29Fv6EhJP*EJSTy+BVAaht{uvROT9bNok{nOHmvX&pMsY%cAn?C9J78Jh#pZQmklTrAN`_`x zsMXTAp`rqVR>*olhy#Al~ITn@3E&VN9RiO zNilv8V2bK~Lsirar|?3%8abM2s5MDILo;(WDkhjmv}Gb=;(ELF%f{&tSG4U2G|7oy z@v6@gb#1JQE|IZQ!HFb=0Op-Gwe-9Bd5X>$azN(;fKeetXfPGTmv5xi7|_QS-n3l5 z3@R>QLxbSZla2~f4$K+P>BF%zd&cQ6l4cs|GHZfH_t@`7?uxJ899>=LycWf*u$Bu8 zfphp_*bv=PII3qI*aEBLRiY9fl%$}tN*#Yckz_KPXQH>8-4jwmW|$RxrKCs`%1p18 zPL8`az>^UiR-*WDFd(0_JhCK?`}F%ZRm8kJdWeH)J0@adjvPlJPJD<;vJQ*2F16ZQ z@MKCSS%Zx0d?{9xa@m|hhhJs>GsInemG!71>t2?3V$aWEF}s*d|I6FdFy@g56Rc6e zlDr_khQqj?=kMkAf_D$k&zF%%5={DnQIrzGK%DU#oU7uT**kXjxkUK6I*l=1rjxYy zXDumlS`vbMXm3GZR4n=_-eg)+RisiVoQYqpCyX6JLh*E%EuuzsKnI+koi!S%Ku)ht zBm4{D__!F;oKHz-7d=}{bl3O9qDu8uP7&GPBKgXzhwzj?OsJ?$Q0NMzCbJ0@R7G#5@ac>d^)iQvH3i0vI2xPeyX<0*FT4Fra5Uu{)efc zs)aaom%1f74MK!dNVrwP9236_f`sgjWE8fY!ij$G%2F%1$LLr;961JhMMgSm)#gkc z5+tOAelKoPIEY1cQq~tfkEB~LH$Hu$0XFDI$3W@wO-*GLiGzF6U{g=6vqNKjGuLX+ z*vI`|)CRK*V3b$2^JI33=-q^SA@W49;R*z~V-Nk6j=O(+(srINpjh)Y8A#JZCls)U zjC}}^-K~-ouyy3vkgj513{d*Wnc`BH@p=&?mx_^Q#~>7vL}h&XQJBQWBY$4W0w{1^ zV8rq}y2BEik}NeS8xWPp(>)0$F1=V+uMV!4~3y#8Q}rR~txE*%E4vc7fjzN37`K?<#P{O)ml z^neCE@;8{dmi3^qQF`j)sH;Msr?L81xqW%5uHQ~6+v+**=XTyVb)fRO4VS>@nXt=w zEF%1VYjUJx<+gQI9g&uJ;%CRW?w&MBgb{9py&%53#S|lHu{yj&+%0QD*d8Z}sI?Z- z*f!K%2N_VTo}R}{%V?L}M+2Q2eX#);o_2!2OcHVqC!&yg-drVU9TjC;CVe9yWl)r6 z5E}JmNsOaK6(2ns28a)=M*9atoqp!EM~=XIA1TnKbM{CF9pSNOAnxzgL0u$wd` zKyIJKTbe|)XLZKwi8%QKEepy*_ETx(*lpc#R=Ad-c0AC!VUc*eM9W( z$lyl&NwyY1WlucH7-m$waN2NTpnrYumetx;Nw`#k zpWGWhEOh9pgYq_+3}r+uT#<~1CXb0rF8-io)8~*A;CSY{U^92`)YcHAIRi2a5>nXRuxGEKaP$Ip&+&3pTlqo$n0zoeA@mb`Y%+RC$Gq_~6#5(W@gfYU- zw~%k0K=Whoj{BSP#|ZMr+0=?Q$Hr3yG`rtTkH^@qvHa^2Wg_pwyV-}lUe+};*w8@h z!|Ad3TSY4W*n2px7*}Ojb0&u3trpf`UlAK+J7PH^+~=sXMSg!S>Q($26zE#&u1y;v zd2xLanwi0|GjlSQKIhV!$H^b(1EURV%Xe!`pf1QHE_b0$vt?yx#iUrJ4Qo_LmssD9 z?)vMcHy=)%CiKum&1xMU#q3{%ra)I#8d@4H+Uar)n_QmK&^o95`k*RJS@Hss`@3P{hO4Gs3kKnGx=k_BrfY7y`lX+@@kz}ftpbD~k3=LCgS!aP& zJ1`!qoad`iU$Q(2Vs1%_kgha+)tqs$dj1xwsEO=~=h^L6-&DqX&-qttHCk;6gwx@I zj?>{E(a{HU)2Zcq5qT+)5EBEoV!nGK0OWTAR;A=$New2j>NZU*Pr3agK|5B=RV{-j z6^VPMsTl2$8W7T{&DEkzQYlXT2Ace{<+}&af%9}y)BDs`YC4_RNx3gSt3#-WcPn!H zaJ}s$3Vtp-N1Br_&nAF5MzF#U69*6jUvj8^z#r15$)MJi^h#R<6jL(5WBm5b07`yj zOxW^k`CPq?=1y;!f0MWRR?qQqo85E&kv?8Y9XY$Pd$CB*N9RB1ucC6@V4p%BmHDY4FJvrRN%~EjS~{|;%`nH3L>$3ZO*S9N^*O}X^48J ztW`%jL#E`0Z-`6)-a7Hc{!P#b>?G>DmYCjiIiB%2*U4sBG-6GY;gX9OpuckK6uMfmwOnZF-(ASl z|3imA0>fD+>U~YXShr|kRcC1LK}C>da*`8E7T%`Kv*!0U8MSgGu)i8Xu zJj1-b+YwaQ!0C_x4k2(WzB06OV%+~56`HD3yiKrxGw9#}OKJ;3U{0)-1wx3`Flekc zj2+e(M1!^x3c(es>=1louR2{xbpF)TQB07ZNB%xP@dy1;bsN@?0g%JOfV@(TtpVb6 zSsvd`qPIf8_h>vA6Yy)Wjcu_U!hNgszPPf82-?4hw6?bb{FHdI4UkU-&^hm$@^@y$ zmDP;wg(PibacfwR*2LV7>oKy#4O~k)sQ2n5tB4Eq?xlYj+DhMawCp_ylxM#C#x>Xk z;IdnFG5OkG%*nT8nR^8jC%Hxw#po1AKmO#RXA#WW*n2h`Kj6>!%*5xjSIoZF)7T{>p@^_ok(rzG|+ zfcs--Yqj-_)`w^CrVA|ztr$FbiR69t+kJFZNScMePH*mn(QnM=Ldx&kqI=ezLVJig z?MXf~VsYegfTvmD{IN?KLgbpkgNH0q8EL7;xEc*IB5U3^v~Ed0@No@W3dj9lYON*h zdnwSRl1s7|pIvij>DB4`t0F&_kF6ytrGmHmBj2ZuzHf4joqXWtQ@)IMJ+%cY!GVWE z9y{H$$~Yqir*6q(31*DV_+p=Fu6&7J-jsoAx8O!^fTJA5-zm zPxuONz{~36ht4CH!w0FpkhvG9H+3Ay%EZs93W`9%JT= zp+S_GU=UR@+-l!>?>R~DoBAG766~MI((QdcwUgBmMZMv^8VlT(MK=}viX!4iY{+yxTcy#SSN-r!|3SNX=RI{e)6}|^IA0PWICHOZYw@p)9{L*pd4!&AGGLRV5oc9 zKhg_Eo?^rojfMvvPK#pTC>mpasZopkW$v%sir7kiMTSe{L^Ir zzhPGuPlx0WeMsp4jx@ut{NF*Xc&r4^)aFZU3kIa&x%~ipK?MPTVz7{93s0ugGATM zK{n8u>}@txl}n-(3kKV><>9MEADeAh?0MW8iqFLFbo}}AhgGkf$S=3<53OX2O0O=J z&%iV`hNm-+d~~qb11XL4WS%_0&Bb#wpMWQS3v}nY(~MC2?w3`y-u=~!e9HMzzr$2U zO<(fB(c!jVfg38`(`c73pl+w&o;x|!mI=!{pOBkpii_FR4`L8Yc@^ycS1?zN)-Kat;2HwaGlp= z3kT9x&NzqAGY~j&)si=PbDGS|5*NR;DmQUQ+Ioq5EqbMh$NE+Gqm2lf*xXjA0|YAfM1Qbwdp3r zV-0S_SQ;erK?o+Ju-thq={8LVj_zrnxU!uLWGI<5<8#hKqYly4AXpW}0(cu*jg1#i?{K25xNfu9S>p9UF-?aYsH_mGRK}*bQCU?d%YY$ zJJ1FBiucs}RK`?8HW*9i1MgDI+(2y^0cCL`I=y)1@%_n z(6xX`A!KL(Y!1_{ufDaBmwi75xY%i62JtEEy9U0hh$|<|K>Qc@n6H?` z;^nyDjU{r(g<53D#q=#^6s>dRmxcGmlkq0Xx((E7J7mdP=nIQU=+Uz>FEu%Mg9_^{ z@<;kXR=W#_urP9&xHJhq3=la8iQJ!xg9z+Yv}kefXBD8S3VP8Z8~qM)E;fJ!{S)_3 zql*Ie`j<2*<}i<(MJu)Z*ZZp zB%HCSP~bu<-Du6WYzf(8>8zvZBn2J(Zf9=(%Eg)nWH6kLTHCq*)YD_U70h z!K8?0;NY>yJ`D%MhPj{?DHMj1A_1_@EscPXxMG)giF!ftUm6;xuKZxF+}qV+@7qwa z%$%Wb*o*V(LUkEG?E*mJi$ITM*y1nJ&vY8}Ld?5^t%sv#O{nbR(^qy>nlsR0EIjkz zSl2}0MYHudECz=)ipW8o#imjoH7LK={rucWOUCuycJg)!XC884f;3}x?y2Oxmt5k7$vq)6Q^%KqtJyAb{a!Rwg|;z z!WjG}aH%3{gM*KQFrxUPpAGFP)!JRh zVH2&)d9(_zlG{W?x9>+Mw+lG!!+OC;nnuvTMcj-}-0wV#fXB4RN2e8Z1h(pgZ?Vob z3{um;c=+_+2=#m~n?5GkQkz4s^>r9FUE_32dPl6={LT#dP5DiomshX2$FZBC&a-y! z`1$<)m`{e7kF9sy7TuF?q>YE&OsukH1>X9yf2`FdS0qeniOG<1E=KBSS|GHCo72N* zm1!^viw%$dgJdaKhHyZEaH)uZ+&~r8Fd-(5PbM4sL(1oKC;Xe!A zHxG=>d7dMDAT{TZ?Xq!a>MfYvGz$iqiS9le zm6#~v(@9rwXVqkVGQyJ|b2_WH(3;(u+}`Vx!&i!UGt}@>Uo--ZhWI$3`#3=Gx~&5f z!tCpO07cZ@R=x=YJb6}vXn-#u)P2j-ymBaS(KO7QO~a49Jcu-QR4KsS-rgP8VG4wh zrWqZ>i2VyG!K6G=yff6cGcVM z?e5w_UG8Ng!z+^adcR1KWL~9QCr-buzS8U9M^x2YYwj-aFu-NY=DDa&r~e^FV%+V4 z+L445r%*Ux$x=8o5j=vAc^SE zPJ1dY&i|lxHY$b$mZ+Amhp()0Sjv)V5l}zRv~2*btIuX%_G91PBGSggLr0b0lfAyR zxn1W&Wr$t-PL0OwHb6;YQjmBUE&R+j>hIrf-McG4IP4j!-upOeyD; zNU@kG!@oXK9lh`dRq77QI+-bRpT+@5m_&+R1~?0$f)uHg&Jk%70;Vpv-*sE}1^T{U zee(g!r#$+7uXs7Q^r<3q>yU=4T%|K7MT}>-JEs%HDp0^#Oqls(vzaS5<-A&B-*XnP z+_pjBd7{np1hnS70MU{^IN3~Xh1=%9GKUrT49dus*$$r zE=paV@Qc`sIrBjqd_SvZ|Hp3Sy77s2bR7U~x7zvE7{=~||78RZb*}U2IH!%E*{05wt*u$zK>S|)^7k;zC$9lgII4Tk{&+EUF;~~veN5evRs(UT zD0TAS)~s5**6;y;tXqiW+%eRSbR$%>pvd0HR86Vm~850jIzD(j1e zO6;Y%!a({Zoyjsh5(`C{%{p4$t zf%(bTmjCM95%d;L7a6g6o|81_oot$ zx3TmC_Ky3Rd%yj{%pxz{mxq>yf#AK*ZIq58-?xB!-3(uci=OV9?D)o_Y`MYI4oJGM zL_B27NPNvCvh281q_wRo+cG$#bjE32l(okI{5p zSSOsF#*U=YmvN~BMppdSFHIOvb0YN5_~+&v8(r%SoDVWZlCnQe1m1wY)_G*sjjsKk zHg^V+iI8Z>{II95Ynne*xxSv*Y2I8W%;=laS&VDfHv6nq%&n8uH^tizQoH(6_F2`g zX39l`eUZ&wHFjLW|1x0KuFG3a&GmwVU zC-V%LNI9pRA!LshE$El**9)so-OrZe&@269ZE)<4K7b`3g4*ziNc=m^)*hI6s=s{o zo<7d-4LT(F{alvf?i%gcE;N-Vz-w(9Z&c2)1)?c^C-k#w?+rlad!g)Y{vR_nZ|!&1th&DR^#y?+@}XH%!Q z#vgTY&`t1Og<`KXb<=et;G*?2UY%Bk4ZF#-G`ZFU85=e&V>iK;Jl&{U;XX&_8zYZ# zt^8Q)GWsBl$_BujE)R~DPl5Gjzr!>{T={p2&br?p48sL|+;4A6+k9&&XD&^t*o3Tp zFwb16FUT4pt_p;8^4&t8rTZZyp)dO2(3SB5U}0!;+@Z#U-+v6Pd=vaKFYKScsV7n* zc9>6!gq&LqP9PZ#%ek4goAUnL%*SPB2wE-^&6NUOFaj{ee9LSZsR2C%rpgRJybNjT zMG#(uD1&g8pwe@oyIL{X5PLs0ngI~xlywl{=A8N11eU?(UXw)7c!i?ryXwoK^kJLY%`xLw+K~SR;$9wjSChR>4 ziy8J^0C)N&g+AMF4Gbs$J8$9hA+RD~lhd&;7&u4#rLk|L+s&j}`Tdt!6EGi6@G-hi z0LZ0I$Kj73r|e{0OHvyeU?u->8WcNtK78jgG0=DMiXF(7qImWnuLB%&o9Kd1?IkrYPpGKCB?_XaF z9d}f;6Rhks%i{U0+<4AJDl$tAW8m;Jt@Dh7UJINqhGFLNIZ6u76ji0v)8+{9V2+IK ziWQ-tZ>|b$tF0Zr`JSxF+_=4c6U<6(NJiO(Ku<1hfPhcN^MZi;ZzzTKFPr$!m>?@_ zat;F|1sE&KKa$H&G!+M_n_SolNeK2C4Rm0F6ii<81S14zW@Y;)0{AU?QveJ(`Eynq z8PIPd61JxCm?5-!0kLCV5sV@>WAJ$yjI_=H{mH=Pyw8ZHGNGK8|8sLqrd<@iL#20< zR~J#dd6VdCgb_;oYSe3XOs3fn8oT7>?WJNrBT-NkpXSBoG)N?5qt;D)`1MFZ(s_`O zs#4d#dJXSAUy^>tCXvIOX3k0%>9>6$z64B%#G2hLlk>`+lzr%Ni0|BBVY}T6HOAc}-y#ic!9Td|uJ-`Mhz=6JgA` z;<w>vngS?3eqoF6lH_IVvC{E6pp2RMkdrYXxG!?-nc_t_3>U} zpXRYR^t)69mR$3dwmRMUjvB1q{6P7_GQR#xj*=lNKvDl~&*L(){{QSFu>QM`kZd;x zfe9~TYG>|Z!9>Kx#*{ph2uTDmvHy?hiZgC&jjxLh)>9|EoH1PXmz3j%5Ujspz`;7P zemFxg2?@3z7*s++isF(Yrm+^P%?=h1iDxZ}O(-iH6^8|~LD=fCTb9eRF78^*7IKWp zqTLisv`OlZIxJ>63s%c|U&OrlK8W9&nceGoUoIX8e6)U5TAe}U#dH1RCs4Z_7P2iz1`YpXXvXJd6{{`>PanlNGq!=Q!ViRTjJl|WBOLTr01>xbzs3rk-<4A_`6 zLSK(*fq|Pbd2ygd5W*UKQ;IvIBJ41@OJv#p3njpoNQBV?584bz45~5qa8)F>vsKyy z?+${X^c3xJqW3(gnib)W?3Ztk^P2fiDXer?M1QagsEvnBu{UGCqn-a)HTZTKOy|Jj zD2ykVSy#-3VXHO0q#)3BUP^N?KUqw(Fb`%{>Y$%FsxH!?GfU`prWGNQ|05x-VO&S1p0A2DRxzJ&o$p{JKA+!Sjb}NN zuO``toJ^;#j!V>{nxI8ShbvG)+D(@h&XTOlt}HvQ5@L?3mPIW{{z_K#N z$Xh%KFQGmr@;*r{eT<#k?KDWZxpy<%i3a%DFnou9m3vPg7Z{7l_WfUtw3cP?q#fk#F zpgy1$X*GYn{a}0bMO5QYytQ@0s#aCBl?_d0RNa<`Pu>3LJjJN$O26wx;r8Te1251* zUB0JO-hkNWV#N?ghLcS`s`M(|eKt(!%Zc+REeJ+)J6SLtN4X>}*dp|o0fZ@jjJOFE zs(o0~J+hq+iF7XBMZ@xTrXf1VcnnGSdynyIfR>5344O9gaJ`1pNnEhj=Ug&nDU;@x zlDx0PkIM8RQh~&aml;p`YzUMX=tzJRCwi{Y(n3`)>Zt|pNnThdgmgfN(8N@fr3^g2 zr=3Or;&*X&q$mUi`#8m>hNzk5LDTvA5yQmCMm5_V)cVRK6{gx^u6Hbi5yvKJ>aiGX zXY$?BLffDDSId-SI&4m$D~P(Nm{HL?F=12ULS(ULPSU2#xj7!aPR-;`&c1*+HA$?( z^n44fhz8319JNhxg=ExE@1otE@C6K&rEqGIRISdxC7yfXhG$BRy)-y^gYmn}6WS$) z=yH{RuKR-ZCAU1JRRbWyr7L3yAWbjN)=8)yjUmH{)I`6%(9De1_FY-5GSlUeF9rKG z$%I3Rq~VAl4((caN2cLRS!@HVLVcV@!4>h{uoN>04{~tWE6}}E`*g9Wn+O>;NY$5L~s@( zJgV$mT29bQF-^Z+QjQdCl=D3`acHwTkt~vCT%~wkLdRtDHc6HSf7I&FEiQTlu=D%2( zhU0@CwfxP|f1E_c&I=wSwuQPbssXEeKY7D7hwdGeo2LpkwF<{hbiga zgh|Fy3^8+tVfki&i+bwfQJP(_4l z&bB#iDDLTxjQWf}Iy4s?p&k|PAI8}Fk418zmi~sEAa4LqiW-vAu*wU*&eRZZCl|{^ zd@aU#CB}&}&q>?W91b;@EqC(%`HMtd!Gr5(^0!T}pXt-z!?HK8ql#aiaB?uJDRG38 z69+R81_xq_3yrW;fbDJX1O+2nf)lmsKuZUd43Adx*EMd;1)Mwja(N%ox3^)b%I*~* z0s>VatvoPnbXZLH-TnB+hI)0_tq#~kFW=ZEV6-B<*erXhcujvz50KWNKE+(eSZCie zvVCdw)BT7!iMkyX&aUTJ_cUJa^6TT;k**_;L(8V6UlQvA%$@c5y$z?jHOKgGP*1g{ zpFUlgJ1IrlOqk|95S`z+etmZ5A!7AYs$zY}^{G;}VOxaBAMwns>G_v?{&H5QUc8+A zMLOqIvYpO05^i2WGFDB8Eyr^}GM7Rc6ZUKwlN}w^36ID{StAecer!MY&zN96?Qq^W zbN}0M*3)(mFhceV%L(}DFuZOn`yS8o?TWT0r-sh62PM^!=s9p!&?d9s(0sv8;GNgi z>EEUF<1k+JJ_uYr@7%ffMXz|r^j-N;G%TI%CnQHGkdH~U;Pf_S^3^BOao`RD8G~j$ z@>(AI5U$V!5&~QuR`V3EF5kn~q48};F#Wyggj-?@m~Xz%>e+~|xa7(gEKMWXOq#Sa zJTbx$NIXzNNKB8?z4EIEoK9gy)T zHU7l{IC|6=S{YHb_w`)SI@nRFkFJ?Mo!9;~+-m&`nkW^DSi`JH8#FQb#lcc~LvSN5 zP-ehZre%E{E&dG+IiAIf|6@+SEG22z9DcFM>jYY0S8q!nOu(c}Z(*x}b4joi z*UHF_UQ}>2OZo)?tClo%6IFzC5pS8py8?LmB$ z0tYKcMK}5_?pv1Ur$D}43bR+i(Q|je?`nL+oO3lj8v*a&1uDRu-(^T{v;mijgVYo) zQhiO(qqo)!-U{bwUnBlE^k{WftVA*AEOreOos45E&>rxbtb$Pz{%WW#^EdcOWBA^%Q%yQBD+jXw?S(U80YRL?xn zx9QRC0t1A!6un=zQ&F$cvjuuP*-E$vv+lVnp8Z@HK#AlIf2BKv(v1Sn8<-VP)8MD7J4wb_mO zV7G#uOrV8|XfW!e6zZJ{smw8e9J!-W>J09L6uka}yE;T-=e~E>ml)Vb^FI z;XpS}+0i+{LjMd3gdoq?J9&PdhlzD;_NQRGI?stQzP9_@)Afc3>jj_yh`zJY?L+D* z+i1;s+p?YN`gjj(n#}M{vTB7VZ;xu@-ddIWb*H&B=WifB`Q3rk{C&(fUH-XIz#vV= zWJHupP{90`Z@E6vFNPD~JUc(pr%FMf{iCO%N&kdgvtNvtjDe-PPe4xpF=DZ3LpAtX zs8k1bbSUb&L_uUH2!s=lzK8thU;c3<*qRy)`0yc;+AN94JD|Y>;mBkJOB6f#aF8)? z7cFQkn7+iVByx%GSLK7>(@4?5dTWo}b}Prp!^7$Ns`J4*pF1BQTpNaFz24bMGr|Hq zT?XeB?IFv(-Y2O~k+-q$}o&| zA;F;(IhSYr({e=o4^K5_wkT+aOPJ^~)TnL|fA&$sP!5Na>opO&dONmdYd z=}{^u_ejt0H$3{XM^NVe`95>}N?j1OplOglh{P|ktnl1*w>?!d7@f&-xG;o}3rnaK zz-k*SHD!;yBx`_^V0M?68D7pg+9IB{QA}Bw!i^Z4gB7ydLjHU}xN (uNO)9-n8 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 literal 0 HcmV?d00001 diff --git a/techage/sounds/techage_watermill.ogg b/techage/sounds/techage_watermill.ogg index 3e6486a4306442e5024f928d85a668a5557898ea..246479ba0c66539c717d0bed1b414a4d61b0e832 100644 GIT binary patch delta 16903 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 literal 23079 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 diff --git a/techage/ta1_watermill/watermill.lua b/techage/ta1_watermill/watermill.lua index d9b04a3..b029ae9 100644 --- a/techage/ta1_watermill/watermill.lua +++ b/techage/ta1_watermill/watermill.lua @@ -271,7 +271,7 @@ minetest.register_entity("techage:ta1_watermill_entity", { stop_wheel(pos, self) end trigger_consumer(pos, self.facedir) - minetest.sound_play("techage_watermill", {gain = 0.3, pos = pos, + minetest.sound_play("techage_watermill", {gain = 0.5, pos = pos, max_hear_distance = 10}, true) end end, diff --git a/techage/ta4_power/laser.lua b/techage/ta4_power/laser.lua index 58c89b4..779c768 100644 --- a/techage/ta4_power/laser.lua +++ b/techage/ta4_power/laser.lua @@ -37,7 +37,8 @@ minetest.register_node("techage:ta4_laser_emitter", { local tube_dir = networks.side_to_outdir(pos, "F") Cable:prepare_pairing(pos, tube_dir, "") Cable:after_place_node(pos, {tube_dir}) - + local number = techage.add_node(pos, "techage:ta4_laser_emitter") + M(pos):set_string("node_number", number) local res, pos1, pos2 = techage.renew_laser(pos, true) if pos1 then local node = techage.get_node_lvm(pos2) @@ -56,17 +57,20 @@ minetest.register_node("techage:ta4_laser_emitter", { end, on_timer = function(pos, elapsed) + local nvm = techage.get_nvm(pos) local res, pos1, pos2 = techage.renew_laser(pos) if pos1 then local node = techage.get_node_lvm(pos2) if node.name == "techage:ta4_laser_receiver" then Cable:pairing(pos2, "laser") Cable:pairing(pos, "laser") + nvm.running = true else local metadata = M(pos):to_table() Cable:stop_pairing(pos, metadata, "") local tube_dir = tonumber(metadata.fields.tube_dir or 0) Cable:after_dig_node(pos, {tube_dir}) + nvm.running = false end elseif not res then techage.del_laser(pos) @@ -74,6 +78,7 @@ minetest.register_node("techage:ta4_laser_emitter", { Cable:stop_pairing(pos, metadata, "") local tube_dir = tonumber(metadata.fields.tube_dir or 0) Cable:after_dig_node(pos, {tube_dir}) + nvm.running = false end return true end, @@ -121,6 +126,17 @@ minetest.register_node("techage:ta4_laser_receiver", { sounds = default.node_sound_wood_defaults(), }) +techage.register_node({"techage:ta4_laser_emitter"}, { + on_recv_message = function(pos, src, topic, payload) + if topic == "state" then + local nvm = techage.get_nvm(pos) + return nvm.running and "running" or "stopped" + else + return "unsupported" + end + end, +}) + power.register_nodes({"techage:ta4_laser_emitter", "techage:ta4_laser_receiver"}, Cable, "special", {"F"}) minetest.register_craft({ diff --git a/techage/teleport/teleport_pipe.lua b/techage/teleport/teleport_pipe.lua new file mode 100644 index 0000000..0fd5aa7 --- /dev/null +++ b/techage/teleport/teleport_pipe.lua @@ -0,0 +1,191 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2017-2022 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA5 teleport pipe + +]]-- + +-- for lazy programmers +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local S2P = minetest.string_to_pos +local M = minetest.get_meta +local S = techage.S + +local Pipe = techage.LiquidPipe +local teleport = techage.teleport +local Cable = techage.ElectricCable +local power = networks.power +local liquid = networks.liquid + +local STANDBY_TICKS = 4 +local COUNTDOWN_TICKS = 4 +local CYCLE_TIME = 2 +local PWR_NEEDED = 12 +local EX_POINTS = 60 +local MAX_DIST = 200 +local DESCRIPTION = S("TA5 Teleport Block Liquids") + +local function formspec(self, pos, nvm) + local title = DESCRIPTION .. " " .. M(pos):get_string("tele_status") + return "size[8,2]".. + "box[0,-0.1;7.8,0.5;#c6e8ff]" .. + "label[0.5,-0.1;" .. minetest.colorize( "#000000", title) .. "]" .. + "image_button[3.5,1;1,1;" .. self:get_state_button_image(nvm) .. ";state_button;]" .. + "tooltip[3.5,1;1,1;" .. self:get_state_tooltip(nvm) .. "]" +end + +local function can_start(pos, nvm, state) + return teleport.is_connected(pos) +end + +local State = techage.NodeStates:new({ + node_name_passive = "techage:ta5_tele_pipe", + infotext_name = DESCRIPTION, + cycle_time = CYCLE_TIME, + standby_ticks = STANDBY_TICKS, + countdown_ticks = COUNTDOWN_TICKS, + formspec_func = formspec, + can_start = can_start, +}) + +local function consume_power(pos, nvm) + if techage.needs_power(nvm) then + local taken = power.consume_power(pos, Cable, nil, PWR_NEEDED) + if techage.is_running(nvm) then + if taken < PWR_NEEDED then + State:nopower(pos, nvm) + else + return true -- keep running + end + elseif taken == PWR_NEEDED then + State:start(pos, nvm) + end + end +end + +minetest.register_node("techage:ta5_tele_pipe", { + description = DESCRIPTION, + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta4.png^techage_frame_ta5_top.png^techage_appl_tele_pipe.png", + "techage_filling_ta4.png^techage_frame_ta5_top.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_teleport.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_hole_pipe.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_teleport.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_teleport.png", + }, + + after_place_node = function(pos, placer) + local meta = M(pos) + local nvm = techage.get_nvm(pos) + local node = minetest.get_node(pos) + local pipe_dir = techage.side_to_outdir("L", node.param2) + local number = techage.add_node(pos, "techage:ta5_tele_pipe") + State:node_init(pos, nvm, number) + meta:set_int("pipe_dir", pipe_dir) + meta:set_string("owner", placer:get_player_name()) + Pipe:after_place_node(pos, {pipe_dir}) + Cable:after_place_node(pos) + teleport.prepare_pairing(pos, "ta5_tele_pipe") + end, + + on_receive_fields = function(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + if teleport.is_connected(pos) then + local nvm = techage.get_nvm(pos) + State:state_button_event(pos, nvm, fields) + M(pos):set_string("formspec", formspec(State, pos, nvm)) + else + teleport.after_formspec(pos, player, fields, MAX_DIST, EX_POINTS) + end + end, + + on_rightclick = function(pos, clicker, listname) + if teleport.is_connected(pos) then + local nvm = techage.get_nvm(pos) + M(pos):set_string("formspec", formspec(State, pos, nvm)) + else + M(pos):set_string("formspec", teleport.formspec(pos)) + end + end, + + on_timer = function(pos, elapsed) + local nvm = techage.get_nvm(pos) + consume_power(pos, nvm) + -- the state has to be triggered by on_push_item + State:idle(pos, nvm) + return State:is_active(nvm) + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + techage.remove_node(pos, oldnode, oldmetadata) + teleport.stop_pairing(pos, oldmetadata) + Pipe:after_dig_node(pos) + Cable:after_dig_node(pos) + techage.del_mem(pos) + end, + + paramtype2 = "facedir", -- important! + on_rotate = screwdriver.disallow, -- important! + is_ground_content = false, + groups = {choppy=2, cracky=2, crumbly=2}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "techage:ta5_tele_pipe", + recipe = { + {"techage:aluminum", "dye:red", "techage:aluminum"}, + {"techage:ta3_pipeS", "techage:usmium_nuggets", "techage:ta5_aichip"}, + {"techage:ta4_carbon_fiber", "", "techage:ta4_carbon_fiber"}, + }, +}) + +local blocked = false -- flag to prevent stack overruns (not to pump into the own "tank") +liquid.register_nodes({"techage:ta5_tele_pipe"}, Pipe, "tank", {"L"}, { + peek = function(pos) + local nvm = techage.get_nvm(pos) + return liquid.srv_peek(nvm) + end, + put = function(pos, indir, name, amount) + local nvm = techage.get_nvm(pos) + nvm.oil_amount = nvm.oil_amount or 0 + if not blocked and techage.is_operational(nvm) then + local rmt_pos = teleport.get_remote_pos(pos) + local rmt_nvm = techage.get_nvm(rmt_pos) + if techage.is_operational(rmt_nvm) then + local pipe_dir = M(rmt_pos):get_int("pipe_dir") + blocked = true + local leftover = liquid.put(rmt_pos, Pipe, pipe_dir, name, amount) + blocked = false + if leftover < amount then + State:keep_running(pos, nvm, COUNTDOWN_TICKS) + State:keep_running(rmt_pos, rmt_nvm, COUNTDOWN_TICKS) + end + return leftover + else + State:blocked(pos, nvm, S("Remote block error")) + end + end + return amount + end +}) + +techage.register_node({"techage:ta5_tele_pipe"}, { + on_recv_message = function(pos, src, topic, payload) + return State:on_receive_message(pos, topic, payload) + end, +}) + +power.register_nodes({"techage:ta5_tele_pipe"}, Cable, "con", {"B", "R", "F", "D", "U"}) +Pipe:set_valid_sides("techage:ta5_tele_pipe", {"L"}) + diff --git a/techage/teleport/teleport_tube.lua b/techage/teleport/teleport_tube.lua new file mode 100644 index 0000000..ce6d0c9 --- /dev/null +++ b/techage/teleport/teleport_tube.lua @@ -0,0 +1,180 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2017-2022 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA5 teleport tube + +]]-- + +-- for lazy programmers +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local S2P = minetest.string_to_pos +local M = minetest.get_meta +local S = techage.S + +local Tube = techage.Tube +local teleport = techage.teleport +local Cable = techage.ElectricCable +local power = networks.power + +local STANDBY_TICKS = 4 +local COUNTDOWN_TICKS = 4 +local CYCLE_TIME = 2 +local PWR_NEEDED = 12 +local EX_POINTS = 60 +local MAX_DIST = 200 +local DESCRIPTION = S("TA5 Teleport Block Items") + +local function formspec(self, pos, nvm) + local title = DESCRIPTION .. " " .. M(pos):get_string("tele_status") + return "size[8,2]".. + "box[0,-0.1;7.8,0.5;#c6e8ff]" .. + "label[0.5,-0.1;" .. minetest.colorize( "#000000", title) .. "]" .. + "image_button[3.5,1;1,1;" .. self:get_state_button_image(nvm) .. ";state_button;]" .. + "tooltip[3.5,1;1,1;" .. self:get_state_tooltip(nvm) .. "]" +end + +local function can_start(pos, nvm, state) + return teleport.is_connected(pos) +end + +local State = techage.NodeStates:new({ + node_name_passive = "techage:ta5_tele_tube", + infotext_name = DESCRIPTION, + cycle_time = CYCLE_TIME, + standby_ticks = STANDBY_TICKS, + countdown_ticks = COUNTDOWN_TICKS, + formspec_func = formspec, + can_start = can_start, +}) + +local function consume_power(pos, nvm) + if techage.needs_power(nvm) then + local taken = power.consume_power(pos, Cable, nil, PWR_NEEDED) + if techage.is_running(nvm) then + if taken < PWR_NEEDED then + State:nopower(pos, nvm) + else + return true -- keep running + end + elseif taken == PWR_NEEDED then + State:start(pos, nvm) + end + end +end + +minetest.register_node("techage:ta5_tele_tube", { + description = DESCRIPTION, + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta4.png^techage_frame_ta5_top.png^techage_appl_tele_tube.png", + "techage_filling_ta4.png^techage_frame_ta5_top.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_teleport.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_hole_tube.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_teleport.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_teleport.png", + }, + + after_place_node = function(pos, placer) + local meta = M(pos) + local nvm = techage.get_nvm(pos) + local node = minetest.get_node(pos) + local tube_dir = techage.side_to_outdir("L", node.param2) + local number = techage.add_node(pos, "techage:ta5_tele_tube") + State:node_init(pos, nvm, number) + meta:set_int("tube_dir", tube_dir) + meta:set_string("owner", placer:get_player_name()) + Tube:after_place_node(pos, {tube_dir}) + Cable:after_place_node(pos) + teleport.prepare_pairing(pos, "ta5_tele_tube") + end, + + on_receive_fields = function(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + if teleport.is_connected(pos) then + local nvm = techage.get_nvm(pos) + State:state_button_event(pos, nvm, fields) + M(pos):set_string("formspec", formspec(State, pos, nvm)) + else + teleport.after_formspec(pos, player, fields, MAX_DIST, EX_POINTS) + end + end, + + on_rightclick = function(pos, clicker, listname) + if teleport.is_connected(pos) then + local nvm = techage.get_nvm(pos) + M(pos):set_string("formspec", formspec(State, pos, nvm)) + else + M(pos):set_string("formspec", teleport.formspec(pos)) + end + end, + + on_timer = function(pos, elapsed) + local nvm = techage.get_nvm(pos) + consume_power(pos, nvm) + -- the state has to be triggered by on_push_item + State:idle(pos, nvm) + return State:is_active(nvm) + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + techage.remove_node(pos, oldnode, oldmetadata) + teleport.stop_pairing(pos, oldmetadata) + Tube:after_dig_node(pos) + Cable:after_dig_node(pos) + techage.del_mem(pos) + end, + + paramtype2 = "facedir", -- important! + on_rotate = screwdriver.disallow, -- important! + is_ground_content = false, + groups = {choppy=2, cracky=2, crumbly=2}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "techage:ta5_tele_tube", + recipe = { + {"techage:aluminum", "dye:red", "techage:aluminum"}, + {"techage:ta4_tubeS", "techage:usmium_nuggets", "techage:ta5_aichip"}, + {"techage:ta4_carbon_fiber", "", "techage:ta4_carbon_fiber"}, + }, +}) + +techage.register_node({"techage:ta5_tele_tube"}, { + on_push_item = function(pos, in_dir, stack) + local nvm = techage.get_nvm(pos) + if techage.is_operational(nvm) then + local rmt_pos = teleport.get_remote_pos(pos) + local rmt_nvm = techage.get_nvm(rmt_pos) + if techage.is_operational(rmt_nvm) then + local tube_dir = M(rmt_pos):get_int("tube_dir") + if techage.push_items(rmt_pos, tube_dir, stack) then + State:keep_running(pos, nvm, COUNTDOWN_TICKS) + State:keep_running(rmt_pos, rmt_nvm, COUNTDOWN_TICKS) + return true + end + else + State:blocked(pos, nvm, S("Remote block error")) + end + end + return false + end, + is_pusher = true, -- is a pulling/pushing node + + on_recv_message = function(pos, src, topic, payload) + return State:on_receive_message(pos, topic, payload) + end, +}) + +power.register_nodes({"techage:ta5_tele_tube"}, Cable, "con", {"B", "R", "F", "D", "U"}) +Tube:set_valid_sides("techage:ta5_tele_tube", {"L"}) + diff --git a/techage/textures/techage_aichip.png b/techage/textures/techage_aichip.png new file mode 100644 index 0000000000000000000000000000000000000000..58dfd329e2af87ca78dd5d970bacd52e81104c1d GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ep#Yx{SN8&+xQK{3vu6VZKE1oQ zW5IN!64r57>UoeBivm0qZ&QVVn#}JR>Z>L6cH9PRQF70QH+0|&IouTpf{c)WI z0eAj~y_&J|vqw|Z^VKu@HJ%-?bt&An&hzKPf2;3V-KBe^OOu_y zZ)<4(?As989vj5e@<>ay(VNf1Q}l!qM?;SW!!OnoGHndgHmJ0(WLm?M|PStJyd%j;8Z>-Ssdse(p3g{sQPgg&ebxsLQ01VM~WB>pF literal 0 HcmV?d00001 diff --git a/techage/textures/techage_appl_movecontroller.png b/techage/textures/techage_appl_movecontroller.png index 4938ab17ebb6f0f7e607ce7b31a5de89509f1585..36c22b8ec3c0b75ba258c89780cbede4f5e0c878 100644 GIT binary patch delta 116 zcmZo-ZDpJwk;}-;z`)?S<;8X&#TMWb;_6=DV;Pp-y*wlxD8g70=_4C%`(!-gnyXLt%`wH1R)@TFa~92 z>T{Bmg6H_UhmWs!ah~OU?#~g<7fc5DMB-Vd8y4{f@${ypbKWP8va*~fJ|`YC=z_$L zTvuFv<6LrB;F(b)lb$Dz5{soSR=Sv#4V8F`IF?s6$``UO=Q(e2R;zW^z9)ZSsGzMZ zbDicel32tNB!7rdP)7w-ScucAkzyiE`w0*KkmHxgrI4!vMvev4ph9;1;D7MDTeCPh z;U_~o^La_+EpV2qvfc{$`xaRiO-pA~)WK_jUL7@0oUg zKMxghf7ygivH$=824YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2jvO^4-qAKWkAsY004kVL_t(o!|j#94Ztu60~6GxvPf3QOkJUibgc9hsSk>v zxPAFvC~ioxk&r2c5JCd9K4$A@iila?zR#Ov> z^r1`m6*NEtDFcXTP8qPWz{-$2H9E2O>C=>+oPg|rm6X3Np>`_>A;iN4KMq6QHsTD1 P00000NkvXXu0mjff*BrY diff --git a/techage/textures/techage_appl_recipeblock.png b/techage/textures/techage_appl_recipeblock.png new file mode 100644 index 0000000000000000000000000000000000000000..ae14cc95873359852faaa8403c29131d0d5781d8 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^SN8%R%dqr{p6OGUuKVXT z^(|1Gu_VYZn8D%MjWi&~$kW9!MB;LCf`V{ITU%R`Br6Y3kHV~v3_S-Kk`2~IUG?A< owBeayEMYi@v0UQN$`l5M&&<4SI(u3pfVvqxUHx3vIVCg!04$a$hyVZp literal 0 HcmV?d00001 diff --git a/techage/textures/techage_appl_sound.png b/techage/textures/techage_appl_sound.png new file mode 100644 index 0000000000000000000000000000000000000000..4efea6445812aae57e8ed2c6486c61b76f12d46d GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(NOiWDFuAPeqiZGT0 z`2{mLJiCzw7GK1gqZ z|9+r2V@Z%-FoVOh8)-m}j;D)bh{WaO1PKWNDJd!Lv^`OO^F?QD%=))_YJ%I#zkj_I il^hs?Wvm?Du`n>M;L|ETVV?@r$KdJe=d#Wzp$P!5r6`sF literal 0 HcmV?d00001 diff --git a/techage/textures/techage_appl_tele_tube.png b/techage/textures/techage_appl_tele_tube.png new file mode 100644 index 0000000000000000000000000000000000000000..aaffc3d6d78e6f186ada45cae1fdd93bca93dc21 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SN8%ReX}D64({8&V{1-k z<}UAV96%|?k|4ie28U-i(tsR4PZ!4!jq}L~5SbC;Roieq@ zcS5LywxpzDhy^oiL)C;34d$IEn9jMmxg9%p%%e?8n_1T}jL}TwWYi%&Ss@07&uP5M UoNk;AK$96fUHx3vIVCg!00y@)TmS$7 literal 0 HcmV?d00001 diff --git a/techage/textures/techage_appl_teleport.png b/techage/textures/techage_appl_teleport.png new file mode 100644 index 0000000000000000000000000000000000000000..1a18d594730e5058ac03a116f03e2578a525d78f GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(NeCp4xzM*{(D8g70 zBN5qp|AfXBqaX-&reABcc8wZaqr)U%xq=9?fE5c zy!x+dVDM)GyH@1^K9xTEwwDaTLP8Er8yP(edm_N*7(!O@Y|0yLJv)78&q Iol`;+0Av<5BLDyZ literal 0 HcmV?d00001 diff --git a/techage/textures/techage_appl_turn.png b/techage/textures/techage_appl_turn.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc8b33d657dc5b78fbb564c351a8c9565534d86 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(NEW^^fmxrVSMHowh z{DK)Ap4~_Ta%??a978y+CnqR~X>4HVWHD1HY?#^DxDf~&fA;@nWP4Wsm0d#OHg7ufEm2$(61)$%3$QZ;KIHj0m9Mi5Xb^*^tDnm{r-UW|TEi^A literal 0 HcmV?d00001 diff --git a/techage/textures/techage_collider_detector_appl.png b/techage/textures/techage_collider_detector_appl.png new file mode 100644 index 0000000000000000000000000000000000000000..fa8776b93f0d18de2e904d6ccf18e22d475d1b5d GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSoB=)|uI>dsdb+xwq@}N35Ag;H zGL{7S1v5B2yO9Ru=ycxArhC9Be+<33fvf&B?=TJxD|N9Sdw?F>TF`NU}gvik$r5) S@}nB4n8DN4&t;ucLK6T6tQ=$j literal 0 HcmV?d00001 diff --git a/techage/textures/techage_collider_detector_core.png b/techage/textures/techage_collider_detector_core.png new file mode 100644 index 0000000000000000000000000000000000000000..b0edd8dc66eede7ceed43a681b8bae65e3d4fcc1 GIT binary patch literal 490 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e^#Gp`SN8%RAd?`d>(ycdD&i># z@(X6r42)@>E{-7{$IphI4rDguxjL!kB#%`9L%VJRGi!j8 z*8&zkkqOQ~%BwJ8vf_uXq}=11wtl;H#(?KdV!GvplocC4!@ar6JO;EzRJ!)=Be)i+f( zPFxXjBq82u<)SZ>rq!FhiD;NO;e%@ZzCclfInC}4>I~28)f-;UY5mkRgK3>J$6>?c zi{C9`mhf-(Q>>8IRlm=j9u#9eHQ>3OL~|aS>!+JWhLUlatkRiocJJ-{lzd`z++`2% z)v&jhx{%tC))6*o+nL{6&h&fEbX_DQ9=o8bLpLyFb=qB#S*pwvwpBNt=P8&aIb&+i zouym9-8_*R%$wEocOgfFW%T<+4!mfmaMEjEo^XXHG>OJ@DcCpXYyh{&zq6 zXUxF5U=t6Yk3`phLxU^E3U7WKK9JC#a@>)PEluTU{p0$#?vqk?teVTfz;RUn?sWUN R3xF0ec)I$ztaD0e0ssb~KfwS1 literal 0 HcmV?d00001 diff --git a/techage/textures/techage_collider_magnet_appl.png b/techage/textures/techage_collider_magnet_appl.png new file mode 100644 index 0000000000000000000000000000000000000000..2f748e1fe91d0a30bee8cccb4675d3784546938e GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{SN8%RAoKr!hDrVX$%%;v z_UyTF#OxqYh_NKdFPOpM*^M+H$JEosF+}5ha)N|HLQYScZ*%WN!{+YIo!mxg2?dUa wo!L3G7CNyhx`v!+SmrQ+(YNse!%i6nlf!~%D-syZfCeyly85}Sb4q9e0DB%JuY_q{4JN6Ox)twLuwSee=;vOb7AcWdh_ j^%)cQSO528V`F$diTC8Qdr3cm`WQT2{an^LB{Ts5&;lvK literal 0 HcmV?d00001 diff --git a/techage/textures/techage_collider_magnet_tube.png b/techage/textures/techage_collider_magnet_tube.png new file mode 100644 index 0000000000000000000000000000000000000000..040c3e5bae07270a7f34dc0ae81a08818f22892b GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(N3D S<}w+moWax8&t;ucLK6VkmLNd@ literal 0 HcmV?d00001 diff --git a/techage/textures/techage_collider_plan.png b/techage/textures/techage_collider_plan.png new file mode 100644 index 0000000000000000000000000000000000000000..3cdc09d7d187b3b035942f20e08ddff559067072 GIT binary patch literal 585 zcmeAS@N?(olHy`uVBq!ia0y~yV6*^Y2Nq_a$SsB1uRw}Fz$e7@|Ns9$rcB(zbR);* z%aTVR7;h|i#o}?dUM*^pS!d6|FzFh>_e=gA z=vt(H_1~k*Z_B(^=7#MGoAcFG)^6V`+jGD8e@7j5)?B@O{r^YbmR~OXBP}p!pug^K}`s={qgQZ79?|hzD_xLW`xp~davu#3clh@zddB^zM z%2swhAXulY_vQKNwJdyo_gCe&Hcu`t@;i6%;7Lo%^z$%kFWM6Vof1vZd|GEybAY#$~^1{zk9;_^`eCwoYE}wE)efaZB}_=6zkSBKA%Q Qm>?KDUHx3vIVCg!0LRfFM*si- literal 0 HcmV?d00001 diff --git a/techage/textures/techage_collider_tube.png b/techage/textures/techage_collider_tube.png new file mode 100644 index 0000000000000000000000000000000000000000..2ef480b2aaed997f4d7ba13fefbe54fb61a1a30f GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^S7q;cnn7z+d@2<@`WJsm z6ak9&dAc};NL)@0ILOIt$TRunS9xbE&+v}_yhpstx}+CeNVIauTDtS`DNdygBAn_K zeh2P$vnei6W!-)B#o0{W1>gBUyqoK_?(--9FK7QvRXGuIW!7~c-z_};5_LTxXWw)d ze-3^apr?KOL8!&@yIBU?7foHcG0Sp^Lbsm4gImv@9@hT#TJFfxsMN)|*Y549JuS|9 X-Sf}>%k4{nE@SX?^>bP0l+XkKUDI2w literal 0 HcmV?d00001 diff --git a/techage/textures/techage_collider_tube_open.png b/techage/textures/techage_collider_tube_open.png new file mode 100644 index 0000000000000000000000000000000000000000..21af706e86212443eefd16e3a630fb1f3005d523 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{SN8%R-|AiFnJaBeb{h(a zx#q86E#P_qlw~Xl@(X5gcy=QV$l2@Z;uxZFK6c_o-opkQEd!E7va3>a&+GcxJJ1vj3;eFE>u!*|{o@qrunqil(VS)S0L?P-~%M@-McqiMH$Fg z#@9tau7#(IV~EE2MG;;BF$MbP0 Hl+XkKq~|IX literal 0 HcmV?d00001 diff --git a/techage/textures/techage_frame_ta5_top.png b/techage/textures/techage_frame_ta5_top.png new file mode 100644 index 0000000000000000000000000000000000000000..85b4276242c546f9c44dfb31fca6f1e760e94c84 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{S0L?P-~%L=hK9^mQC^py zSHz*Z2gqkG3Gxe8WUynJ@pTc9tK;e77@~1LnZwMDaT$-Ap2mTh8jP%L770w;23&_4 n53FF=%VMyo@yQAoe?EpnDfho2^H0bC^)Yz5`njxgN@xNA^*$uc literal 0 HcmV?d00001 diff --git a/techage/textures/techage_isobutane_inv.png b/techage/textures/techage_isobutane_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..2189b67b1fc7f52c1579d97fb4ae3aefaa2d462b GIT binary patch literal 574 zcmV-E0>S->P)G2CZGa6j?w*zAf{3sw zmAZ35#=W&tHCNejuTn}egoun9qR(X@w!s>i*idSp$wVS6OGH+I$e{fFUC_*v2M zL{*n(FY<6wT|#WVi1FEB$dp)lkrkFix|WZK)`>_A1TTtmiMp_LXJSO`kh!UY=7_z` z0UO!(bM(F-(b?~g{_En`GB`z}10A!D3E{IHEJ1iZc`Jplm?7FD9nmlyAinA*i>g5v z4KqI~^098P50Vg+FBKh*_OCh{b$~^}2Vb_H`M4C+La+A4GsoXCBiEG#PwV6waG4MO zD;j~*g&qCaMUMj#n!P?mI@N){1?6WMm|k;p7v21QDxLv>S^UHL1=>D?fQ>MbyZ`_I M07*qoM6N<$f~yAwlmGw# literal 0 HcmV?d00001 diff --git a/techage/textures/techage_round_ceramic.png b/techage/textures/techage_round_ceramic.png new file mode 100644 index 0000000000000000000000000000000000000000..70d5dd63a15e5f66b33f73ef3778e01fd967378d GIT binary patch literal 435 zcmV;k0ZjghP)KIth=<0&zgN`CJpcdz0d!JMQvg8b*k%9#0Zd6mK~zY`?bN|e!!Qg6 z;DRd7xMaEGz|PPt4-m=P87btxb

J1Y##0qBQFr_Dhz$F2n?4?ox4o2HwTR*fJyd=g5P*w1uQqy#CK9e1gXeF=@j?( z0zTu8mg6(ntbk?{pK9PB;30lgfX;u~E~?8w2f7UQ+ZyOH@M;CLwRJzeA8KGff!Y>_ d>&y4QX=|!z zAdZj4^@m7n~si-y}i9{ZEeiV%>V!Y>FMcxeSM~;ruzE&J3Bk_^72qnPyqn};o;%c)zx8P zVI(9Z6ciNLY%y>E0004WQchCS2W<2)5}`55P@ zSYLQh8V(sn*yVMJ>hr{9UC%gfgNeuG?I0P)t-s|Ns9F z4-cfIr0D4Aetv#!uF}cL$p8QVK#aCVna4IZHu3TCyu7@Xm6e{Jo^x|^`1trtOiUso zB4A)(LPA2*)6<28g{`fv-{0SELH5r800Iq3L_t(Y$IX`QmZKmHhCy613-Tq1-v5r400{mX7y$f2r1O%DBaz-ovUq^u z6`%mLB_z(ca0CdOBOz7;s20dy)&G>11!)ZlD9!1ZqX#(p$A@)>RDc+VGZLJG-vKFL z1})Lwb^;sDDK)+j@&+jIa-FGik(>aDPSJUleh;Gs7=;C=Sp_)FnN5IYTssgeI$waY znz#ZCke5z$P?!rkQ~Y2KRM5HG$I@spzKKKfeon5l~lMI1CGqq zWNF%qrj{lc+xI6>J&Y+wO{R6p%>=dwY))p1QFlPB{ekoV3Dr~V00VwZ=H_v?AWCC) z`Qg(pHhH)KBD@E_v7{Y1f~MD?={4vb_{O&OiQ7^|wZO6$ZsIB$fkN+m;S&AVg-dyvW&C}PZMOkx}Kjw>tPudG+VOZzt&`?k)wH` zP#ihLzv4YceS_gNXgNE&lo@MQcQ{{X(mbM2Pa7|!f$i2Gg UOKEEFW}ul2p00i_>zopr0Jq~fOaK4? literal 0 HcmV?d00001 diff --git a/techage/textures/techage_smartline_signal_4x.png b/techage/textures/techage_smartline_signal_4x.png new file mode 100644 index 0000000000000000000000000000000000000000..ec3e9fcb354556542ae9b1725eb467167e746460 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e(Ey(i*X*^I+-4qk=-F0MSoq}0 z6KiX0$JRAkMVF=m6?k~MIEHu}Pfj?%FCi(x`jN?y%}sm{!;%B0A{gTe~ HDWM4f&EGNg literal 0 HcmV?d00001 diff --git a/techage/textures/techage_smartline_signal_amber1.png b/techage/textures/techage_smartline_signal_amber1.png new file mode 100644 index 0000000000000000000000000000000000000000..ff3d5e75898087efd70c14cdaa311ac3c667facd GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhk{9nM(zm+ExD8g70 z9G&zGM*|YX*knsq8=fSPcV!@(iA?elF{r5}E)p C>>CFF literal 0 HcmV?d00001 diff --git a/techage/textures/techage_smartline_signal_amber2.png b/techage/textures/techage_smartline_signal_amber2.png new file mode 100644 index 0000000000000000000000000000000000000000..fb9df3df005d6fd6ecb5c523143a72d0a2c70142 GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhk{9nM(zm+ExD8g70 z@jRu?6^qxVjhk{9nM(zm+ExD8g70 zM+S!T_t<~hxX$zk$}@Pn`njxgN@xNA DLz5gj literal 0 HcmV?d00001 diff --git a/techage/textures/techage_smartline_signal_amber4.png b/techage/textures/techage_smartline_signal_amber4.png new file mode 100644 index 0000000000000000000000000000000000000000..3267c8f65711274bbc921e8ceab3ea7b834d9f01 GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhk{9nM(zm+ExD8g70 z@jRu?6^qxVjhkF#KoW;j2^ziZGT0 z`2{mLJiCzwIEHAPPfk!^GWfrcFIj}gnt|bXD*I1AR>J_GJcFmJpUXO@geCyc C?iqLh literal 0 HcmV?d00001 diff --git a/techage/textures/techage_smartline_signal_green2.png b/techage/textures/techage_smartline_signal_green2.png new file mode 100644 index 0000000000000000000000000000000000000000..34685ec77393b1d34867defccec3d9e81190941f GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhkF#KoW;j2^ziZGT0 z`2{mLJiCzwIEHAPPfn0%YWT@tDzUgBiGjg;CHv2pP9Xw7c?M5cKbLh*2~7b1 C2pe$# literal 0 HcmV?d00001 diff --git a/techage/textures/techage_smartline_signal_green3.png b/techage/textures/techage_smartline_signal_green3.png new file mode 100644 index 0000000000000000000000000000000000000000..956cc49ac79e235339a96dbd751fd42d429fb90a GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhkF#KoW;j2^ziZGT0 z`2{mLJiCzwIEHAPPfn0v6=8m6e@jRu?6^qxVjhkF#KoW;j2^ziZGT0 z`2{mLJiCzwIEHAPPfn0vJkqy&;@(iA?elF{r5}E+y C=Nha4 literal 0 HcmV?d00001 diff --git a/techage/textures/techage_smartline_signal_off1.png b/techage/textures/techage_smartline_signal_off1.png new file mode 100644 index 0000000000000000000000000000000000000000..edabb430c385f3ebdd06402fda4b77f043779e86 GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhkloS@;{o;E7D8g70 z9G&zGM*|YX*knsq8=fSPcV!@(iA?elF{r5}E*K Cj2rg= literal 0 HcmV?d00001 diff --git a/techage/textures/techage_smartline_signal_off2.png b/techage/textures/techage_smartline_signal_off2.png new file mode 100644 index 0000000000000000000000000000000000000000..2065fa4a885d50e7b5bccc9273f3adf23614f381 GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhkloS@;{o;E7D8g70 z@jRu?6^qxVjhkloS@;{o;E7D8g70 zM+S!T_t<~hxX$zk$}@Pn`njxgN@xNA Dc{3d< literal 0 HcmV?d00001 diff --git a/techage/textures/techage_smartline_signal_off4.png b/techage/textures/techage_smartline_signal_off4.png new file mode 100644 index 0000000000000000000000000000000000000000..1ffcbacca469c4265e74fabaca52c4e53bfded9f GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhkloS@;{o;E7D8g70 z@jRu?6^qxVjhk{AXZL+_Yg2P=v80 z$S;_|;n|HeAV@jRu?6^qxVjhk{AXZL+_Yg2P=v80 z$S;_|;n|HeAV@jRu?6^qxVjhk{AXZL+_Yg2P=v80 z$S;_|;n|HeAVT8lxOgC^>bP0l+XkK DK5HB_ literal 0 HcmV?d00001 diff --git a/techage/textures/techage_smartline_signal_red4.png b/techage/textures/techage_smartline_signal_red4.png new file mode 100644 index 0000000000000000000000000000000000000000..7220fb58430ceffbd3e287e900415573151dfa44 GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhk{AXZL+_Yg2P=v80 z$S;_|;n|HeAVtQ~F{|ot=IT#p1l-Pf6i)@$%lxOgC^>bP0l+XkK DK)oC_ literal 0 HcmV?d00001 diff --git a/techage/textures/techage_ta4c.png b/techage/textures/techage_ta4c.png new file mode 100644 index 0000000000000000000000000000000000000000..6ce1a9f2295be7785081706af3e7135bdc8ca5ca GIT binary patch literal 7606 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 YKZy5_7suXH*Z=?k07*qoM6N<$f+_CF*8l(j literal 0 HcmV?d00001 diff --git a/techage/tools/repairkit.lua b/techage/tools/repairkit.lua index 5ea2092..7778ac0 100644 --- a/techage/tools/repairkit.lua +++ b/techage/tools/repairkit.lua @@ -17,7 +17,7 @@ local S = techage.S local Cable1 = techage.ElectricCable local Cable2 = techage.TA4_Cable local Pipe2 = techage.LiquidPipe -local menu = dofile(minetest.get_modpath("techage") .. "/tools/submenu.lua") +local menu = techage.menu local function network_check(start_pos, Cable, player_name) -- local ndef = techage.networks.net_def(start_pos, Cable.tube_type) @@ -109,6 +109,11 @@ local function read_state(itemstack, user, pointed_thing) consumption = dump(consumption) minetest.chat_send_player(user:get_player_name(), ndef.description.." "..number..": consumption = "..consumption.." kud ") end + local flowrate = techage.send_single("0", number, "flowrate", nil) + if flowrate and flowrate ~= "" and flowrate ~= "unsupported" then + flowrate = dump(flowrate) + minetest.chat_send_player(user:get_player_name(), ndef.description.." "..number..": flowrate = "..flowrate.." ") + end local owner = M(pos):get_string("owner") or "" if owner ~= "" then minetest.chat_send_player(user:get_player_name(), S("Node owner")..": "..owner.." ") @@ -149,7 +154,18 @@ local function settings_menu(pos, playername) local number = techage.get_node_number(pos) local node = minetest.get_node(pos) local ndef = minetest.registered_nodes[node.name] - local form_def = ndef and (ndef.ta3_formspec or ndef.ta4_formspec) + local form_def + + if ndef then + if ndef.ta3_formspec or ndef.ta4_formspec then + form_def = ndef.ta3_formspec or ndef.ta4_formspec + elseif ndef.ta5_formspec then + local player = minetest.get_player_by_name(playername) + if techage.get_expoints(player) >= ndef.ta5_formspec.ex_points then + form_def = ndef.ta5_formspec.menu + end + end + end context[playername] = pos if form_def then @@ -170,7 +186,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local number = techage.get_node_number(pos) local node = minetest.get_node(pos) local ndef = minetest.registered_nodes[node.name] - local form_def = ndef and (ndef.ta3_formspec or ndef.ta4_formspec) + local form_def = ndef and (ndef.ta3_formspec or ndef.ta4_formspec or ndef.ta5_formspec.menu) if form_def then if menu.eval_input(pos, form_def, fields, playername) then diff --git a/tubelib2/depends.txt b/tubelib2/depends.txt index 9207dab..60f8390 100644 --- a/tubelib2/depends.txt +++ b/tubelib2/depends.txt @@ -1,2 +1,2 @@ -default +default? intllib? diff --git a/tubelib2/init.lua b/tubelib2/init.lua index 88d4420..509dc07 100644 --- a/tubelib2/init.lua +++ b/tubelib2/init.lua @@ -9,4 +9,6 @@ dofile(MP .. "/internal1.lua") dofile(MP .. "/tube_api.lua") dofile(MP .. "/storage.lua") -- Only for testing/demo purposes ---dofile(MP .. "/tube_test.lua") +if minetest.settings:get_bool("tubelib2_testingblocks_enabled") == true then + dofile(MP .. "/tube_test.lua") +end diff --git a/tubelib2/internal1.lua b/tubelib2/internal1.lua index daa2d2b..9902053 100644 --- a/tubelib2/internal1.lua +++ b/tubelib2/internal1.lua @@ -132,7 +132,7 @@ end -- pairing functions -------------------------------------------------------------------------------------- --- Pairing helper function +-- Pairing helper function. NOT USED (see internal2.lua)!!! function Tube:store_teleport_data(pos, peer_pos) local meta = M(pos) meta:set_string("tele_pos", S(peer_pos)) diff --git a/tubelib2/settingtypes.txt b/tubelib2/settingtypes.txt new file mode 100644 index 0000000..7386cc2 --- /dev/null +++ b/tubelib2/settingtypes.txt @@ -0,0 +1,3 @@ +# Maximim number of Forceload Blocks per player (default 20) +tubelib2_testingblocks_enabled (enbale the testing blocks) bool false + diff --git a/tubelib2/tube_test.lua b/tubelib2/tube_test.lua index fc92a51..0b40140 100644 --- a/tubelib2/tube_test.lua +++ b/tubelib2/tube_test.lua @@ -269,7 +269,7 @@ local function store_connection(pos, peer_pos) meta:set_string("peer_pos", P2S(peer_pos)) meta:set_string("channel", "") meta:set_string("formspec", "") - meta:set_string("infotext", "Connected with "..P2S(peer_pos)) + meta:set_string("infotext", "Connected to "..P2S(peer_pos)) end local function prepare_pairing(pos)