From a7b5c28f7743bcc4fce5faf3c8e36993797189f1 Mon Sep 17 00:00:00 2001 From: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com> Date: Sat, 10 May 2025 16:25:04 -0400 Subject: [PATCH] Smith Expansion - Smith + Xenobiology = Energy Guns (#29040) * Initial Commit * Small adjustment * Vendor stock update * Icon states * Finished merge, fixed runtimes, coded properly now * Mapped in assemblers * Swapped bluespace slime and sepia slime guns * Replaced scatter laser with eshotgun --------- Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com> --- _maps/map_files/stations/boxstation.dmm | 6 +- _maps/map_files/stations/cerestation.dmm | 8 +- _maps/map_files/stations/deltastation.dmm | 9 +- _maps/map_files/stations/emeraldstation.dmm | 2 +- _maps/map_files/stations/metastation.dmm | 9 +- code/game/machinery/machine_frame.dm | 11 ++ .../machinery/vendors/departmental_vendors.dm | 1 + .../research/designs/machine_designs.dm | 10 ++ .../research/xenobiology/xenobiology.dm | 23 +++ .../smithing/machinery/casting_basin.dm | 38 +++++ .../smithing/machinery/kinetic_assembler.dm | 145 ++++++++++++++++++ .../smithing/machinery/power_hammer.dm | 2 +- .../smithing/smithed_items/misc_smithed.dm | 7 + code/modules/smithing/smithing_cast.dm | 21 +++ icons/obj/machines/smithing_machines.dmi | Bin 4258 -> 11398 bytes icons/obj/smithing.dmi | Bin 4077 -> 4942 bytes paradise.dme | 1 + 17 files changed, 285 insertions(+), 8 deletions(-) create mode 100644 code/modules/smithing/smithed_items/misc_smithed.dm diff --git a/_maps/map_files/stations/boxstation.dmm b/_maps/map_files/stations/boxstation.dmm index 50511c8af66..924e17cfcb3 100644 --- a/_maps/map_files/stations/boxstation.dmm +++ b/_maps/map_files/stations/boxstation.dmm @@ -68036,9 +68036,7 @@ /area/station/public/dorms) "nXu" = ( /obj/structure/window/reinforced, -/obj/structure/table/reinforced, -/obj/item/hemostat, -/obj/item/scalpel, +/obj/machinery/smithing/scientific_assembler, /turf/simulated/floor/plasteel{ icon_state = "whitepurple" }, @@ -87485,6 +87483,8 @@ }, /obj/item/slime_scanner, /obj/item/slime_scanner, +/obj/item/hemostat, +/obj/item/scalpel, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "whitepurple" diff --git a/_maps/map_files/stations/cerestation.dmm b/_maps/map_files/stations/cerestation.dmm index 7f7f5e4a3fa..d3e252ae669 100644 --- a/_maps/map_files/stations/cerestation.dmm +++ b/_maps/map_files/stations/cerestation.dmm @@ -59464,6 +59464,12 @@ }, /turf/simulated/floor/plasteel, /area/station/engineering/atmos) +"lCN" = ( +/obj/machinery/smithing/scientific_assembler, +/turf/simulated/floor/plasteel{ + icon_state = "whitepurple" + }, +/area/station/science/xenobiology) "lCO" = ( /obj/structure/rack, /obj/effect/spawner/random/tech_storage/engineering, @@ -133877,7 +133883,7 @@ cGd cGd wNA qKO -yiP +lCN xIa xIa xIa diff --git a/_maps/map_files/stations/deltastation.dmm b/_maps/map_files/stations/deltastation.dmm index 64865129e61..e919db87503 100644 --- a/_maps/map_files/stations/deltastation.dmm +++ b/_maps/map_files/stations/deltastation.dmm @@ -85488,6 +85488,13 @@ /obj/effect/turf_decal/stripes/corner, /turf/simulated/floor/plating/airless, /area/station/engineering/control) +"tgQ" = ( +/obj/machinery/smithing/scientific_assembler, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "whitepurple" + }, +/area/station/science/xenobiology) "thl" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor, @@ -130127,7 +130134,7 @@ eGq exC mek tjH -cQP +tgQ cVf cVf cSc diff --git a/_maps/map_files/stations/emeraldstation.dmm b/_maps/map_files/stations/emeraldstation.dmm index 819f156c3a4..750f2d9aa87 100644 --- a/_maps/map_files/stations/emeraldstation.dmm +++ b/_maps/map_files/stations/emeraldstation.dmm @@ -23053,7 +23053,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/filingcabinet/chestdrawer, +/obj/machinery/smithing/scientific_assembler, /turf/simulated/floor/plasteel{ icon_state = "whitepurplecorner" }, diff --git a/_maps/map_files/stations/metastation.dmm b/_maps/map_files/stations/metastation.dmm index 536099d8cc6..cb1bdca4b82 100644 --- a/_maps/map_files/stations/metastation.dmm +++ b/_maps/map_files/stations/metastation.dmm @@ -42933,6 +42933,13 @@ }, /turf/simulated/floor/plasteel, /area/station/engineering/break_room) +"fbq" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/smithing/scientific_assembler, +/turf/simulated/floor/plasteel{ + icon_state = "white" + }, +/area/station/science/xenobiology) "fbr" = ( /obj/machinery/ai_status_display{ pixel_y = 32 @@ -130284,7 +130291,7 @@ gZe deu sFX pNz -kjo +fbq fvN aaa aaa diff --git a/code/game/machinery/machine_frame.dm b/code/game/machinery/machine_frame.dm index 690f78f37ec..7b3c1ce0743 100644 --- a/code/game/machinery/machine_frame.dm +++ b/code/game/machinery/machine_frame.dm @@ -1097,6 +1097,17 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/manipulator = 3, /obj/item/stack/sheet/glass = 1) +/obj/item/circuitboard/scientific_assembler + board_name = "Scientific Assembler" + icon_state = "supply" + build_path = /obj/machinery/smithing/scientific_assembler + board_type = "machine" + origin_tech = "programming=1;engineering=4" + req_components = list( + /obj/item/stock_parts/micro_laser = 1, + /obj/item/stock_parts/manipulator = 3, + /obj/item/stack/sheet/glass = 1) + /obj/item/circuitboard/ore_redemption board_name = "Ore Redemption" icon_state = "supply" diff --git a/code/game/machinery/vendors/departmental_vendors.dm b/code/game/machinery/vendors/departmental_vendors.dm index 00cd0897362..01437bc26c5 100644 --- a/code/game/machinery/vendors/departmental_vendors.dm +++ b/code/game/machinery/vendors/departmental_vendors.dm @@ -367,6 +367,7 @@ /obj/item/smithing_cast/component/lens_focus = 3, /obj/item/smithing_cast/component/lens_frame = 3, /obj/item/smithing_cast/component/trim = 3, + /obj/item/smithing_cast/misc/egun_parts = 3, /obj/item/storage/bag/smith = 2, /obj/item/storage/box/crewvend = 1) diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 20715cfbd5e..dd8950b2e81 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -582,6 +582,16 @@ build_path = /obj/item/circuitboard/kinetic_assembler category = list ("Misc. Machinery") +/datum/design/scientific_assembler + name = "Machine Design (Kinetic Assembler)" + desc = "The circuit board for a Kinetic Assembler." + id = "scientific_assembler" + req_tech = list("programming" = 2, "engineering" = 4, "plasmatech" = 3) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000) + build_path = /obj/item/circuitboard/scientific_assembler + category = list ("Misc. Machinery") + /datum/design/mining_equipment_vendor name = "Machine Design (Mining Rewards Vendor Board)" desc = "The circuit board for a Mining Rewards Vendor." diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index be67faed004..60a5b196fa8 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -17,6 +17,8 @@ var/Uses = 1 /// The mob who last injected the extract with plasma, water or blood. Used for logging. var/mob/living/injector_mob + /// The gun type associated with the extract + var/obj/item/gun/energy/associated_gun_type /obj/item/slime_extract/attackby__legacy__attackchain(obj/item/O, mob/user) if(istype(O, /obj/item/slimepotion/enhancer)) @@ -41,86 +43,107 @@ /obj/item/slime_extract/gold name = "gold slime extract" icon_state = "gold slime extract" + associated_gun_type = /obj/item/gun/energy/gun/shotgun /obj/item/slime_extract/silver name = "silver slime extract" icon_state = "silver slime extract" + associated_gun_type = /obj/item/gun/energy/disabler/smg /obj/item/slime_extract/metal name = "metal slime extract" icon_state = "metal slime extract" + associated_gun_type = /obj/item/gun/energy/gun/mini /obj/item/slime_extract/purple name = "purple slime extract" icon_state = "purple slime extract" + associated_gun_type = /obj/item/gun/energy/disabler /obj/item/slime_extract/darkpurple name = "dark purple slime extract" icon_state = "dark purple slime extract" + associated_gun_type = /obj/item/gun/energy/laser /obj/item/slime_extract/orange name = "orange slime extract" icon_state = "orange slime extract" + associated_gun_type = /obj/item/gun/energy/gun/mini /obj/item/slime_extract/yellow name = "yellow slime extract" icon_state = "yellow slime extract" + associated_gun_type = /obj/item/gun/energy/ionrifle/carbine /obj/item/slime_extract/red name = "red slime extract" icon_state = "red slime extract" + associated_gun_type = /obj/item/gun/energy/plasma_pistol /obj/item/slime_extract/blue name = "blue slime extract" icon_state = "blue slime extract" + associated_gun_type = /obj/item/gun/energy/disabler /obj/item/slime_extract/darkblue name = "dark blue slime extract" icon_state = "dark blue slime extract" + associated_gun_type = /obj/item/gun/energy/gun /obj/item/slime_extract/pink name = "pink slime extract" icon_state = "pink slime extract" + associated_gun_type = /obj/item/gun/energy/gun/blueshield /obj/item/slime_extract/green name = "green slime extract" icon_state = "green slime extract" + associated_gun_type = /obj/item/gun/projectile/automatic/laserrifle /obj/item/slime_extract/lightpink name = "light pink slime extract" icon_state = "light pink slime extract" + associated_gun_type = /obj/item/gun/energy/arc_revolver /obj/item/slime_extract/black name = "black slime extract" icon_state = "black slime extract" + associated_gun_type = /obj/item/gun/energy/lasercannon /obj/item/slime_extract/oil name = "oil slime extract" icon_state = "oil slime extract" + associated_gun_type = /obj/item/gun/energy/immolator /obj/item/slime_extract/adamantine name = "adamantine slime extract" icon_state = "adamantine slime extract" + associated_gun_type = /obj/item/gun/energy/gun/nuclear /obj/item/slime_extract/bluespace name = "bluespace slime extract" icon_state = "bluespace slime extract" + associated_gun_type = /obj/item/gun/energy/sparker /obj/item/slime_extract/pyrite name = "pyrite slime extract" icon_state = "pyrite slime extract" + associated_gun_type = /obj/item/gun/energy/gun/mini /obj/item/slime_extract/cerulean name = "cerulean slime extract" icon_state = "cerulean slime extract" + associated_gun_type = /obj/item/gun/energy/gun/shotgun /obj/item/slime_extract/sepia name = "sepia slime extract" icon_state = "sepia slime extract" + associated_gun_type = /obj/item/gun/energy/laser/retro /obj/item/slime_extract/rainbow name = "rainbow slime extract" icon_state = "rainbow slime extract" + associated_gun_type = /obj/item/gun/energy/lwap ////Slime-derived potions/// diff --git a/code/modules/smithing/machinery/casting_basin.dm b/code/modules/smithing/machinery/casting_basin.dm index 12e5708ece0..cf4fa0eeb3d 100644 --- a/code/modules/smithing/machinery/casting_basin.dm +++ b/code/modules/smithing/machinery/casting_basin.dm @@ -50,6 +50,16 @@ . += " - [MAT]: [ROUND_UP(((temp_product.materials[MAT] * quality.material_mult) * efficiency) / MINERAL_MATERIAL_AMOUNT)] sheets." // Get rid of the temp product qdel(temp_product) + else if(istype(cast, /obj/item/smithing_cast/misc) && !produced_item) + var/obj/item/temp_product = new cast.selected_product(src) // This is necessary due to selected_product being a type + var/obj/item/smithing_cast/component/comp_cast = cast + . += "Required Resources:" + var/MAT + // Get the materials the item needs and display + for(MAT in temp_product.materials) + . += " - [MAT]: [ROUND_UP((temp_product.materials[MAT] * efficiency) / MINERAL_MATERIAL_AMOUNT)] sheets." + // Get rid of the temp product + qdel(temp_product) if(produced_item) . += "There is a [produced_item] in the machine. You can pick it up with your hand." @@ -86,6 +96,8 @@ . += "cast_lens" else if(istype(cast, /obj/item/smithing_cast/component/trim)) . += "cast_trim" + else if(istype(cast, /obj/item/smithing_cast/misc/egun_parts)) + . += "cast_egun_parts" . += "casting_lip" if(panel_open) . += "casting_wires" @@ -233,6 +245,32 @@ qdel(temp_product) return FINISH_ATTACK + if(istype(cast, /obj/item/smithing_cast/misc)) + var/list/used_mats = list() + + // Check if there is enough materials to craft the item + for(MAT in temp_product.materials) + used_mats[MAT] = temp_product.materials[MAT] * efficiency + + if(!materials.has_materials(used_mats, 1)) + to_chat(user, "Not enough materials in the crucible to smelt [temp_product.name]!") + qdel(temp_product) + return FINISH_ATTACK + + to_chat(user, "You begin to pour the liquid minerals into the [src]...") + // Use the materials and create the item. + materials.use_amount(used_mats) + linked_crucible.animate_pour(operation_time SECONDS) + operate(operation_time, user) + produced_item = new cast.selected_product(src) + produced_item.set_worktime() + produced_item.update_appearance(UPDATE_NAME) + produced_item.update_icon(UPDATE_ICON_STATE) + update_icon(UPDATE_OVERLAYS) + // Clean up temps + qdel(temp_product) + return FINISH_ATTACK + /obj/machinery/smithing/casting_basin/Destroy() if(linked_crucible) linked_crucible.linked_machines -= src diff --git a/code/modules/smithing/machinery/kinetic_assembler.dm b/code/modules/smithing/machinery/kinetic_assembler.dm index 00032834333..c2aefbc3cf1 100644 --- a/code/modules/smithing/machinery/kinetic_assembler.dm +++ b/code/modules/smithing/machinery/kinetic_assembler.dm @@ -231,3 +231,148 @@ extra_product.update_appearance(UPDATE_NAME) extra_product.scatter_atom() finished_product = null + +// MARK: Scientific Assembler + +/obj/machinery/smithing/scientific_assembler + name = "scientific assembler" + desc = "A smart assembler that takes slime cores, energy cells, and energy gun parts to produce energy guns." + icon = 'icons/obj/machines/smithing_machines.dmi' + icon_state = "assembler" + max_integrity = 100 + pixel_x = 0 // 1x1 + pixel_y = 0 + bound_height = 32 + bound_width = 32 + bound_y = 0 + operation_sound = 'sound/items/welder.ogg' + /// Slime extract for the egun + var/obj/item/slime_extract/slime_core + /// The gun frame + var/obj/item/smithed_item/component/egun_parts/parts + /// The battery + var/obj/item/stock_parts/cell/cell + +/obj/machinery/smithing/scientific_assembler/Initialize(mapload) + . = ..() + // Stock parts + component_parts = list() + component_parts += new /obj/item/circuitboard/kinetic_assembler(null) + component_parts += new /obj/item/stock_parts/manipulator(null) + component_parts += new /obj/item/stock_parts/manipulator(null) + component_parts += new /obj/item/stock_parts/manipulator(null) + component_parts += new /obj/item/stock_parts/micro_laser(null) + component_parts += new /obj/item/stack/sheet/glass(null) + RefreshParts() + +/obj/machinery/smithing/scientific_assembler/examine(mob/user) + . = ..() + if(slime_core || parts || cell) + . += "You can activate the machine with your hand, or remove a component by alt-clicking." + if(slime_core) + . += "There is a [slime_core] in the core slot." + if(parts) + . += "There is a [parts] in the gun frame slot." + if(cell) + . += "There is a [cell] in the power cell slot." + +/obj/machinery/smithing/scientific_assembler/RefreshParts() + var/operation_mult = 0 + for(var/obj/item/stock_parts/component in component_parts) + operation_mult += OPERATION_SPEED_MULT_PER_RATING * component.rating + // Update our values + operation_time = operation_time = max(ROUND_UP(initial(operation_time) * (1.3 - operation_mult)), 2) + +/obj/machinery/smithing/scientific_assembler/update_icon_state() + . = ..() + if(panel_open) + icon_state = "assembler_wires" + +/obj/machinery/smithing/kinetic_assembler/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/I) + . = ..() + update_icon(UPDATE_ICON_STATE) + +/obj/machinery/smithing/scientific_assembler/update_overlays() + . = ..() + overlays.Cut() + if(panel_open) + icon_state = "assembler_wires" + +/obj/machinery/smithing/scientific_assembler/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(operating) + to_chat(user, "[src] is still operating!") + return ITEM_INTERACT_COMPLETE + + if(istype(used, /obj/item/slime_extract)) + var/obj/item/slime_extract/core = used + if(!core.associated_gun_type) + to_chat(user, "[core] is not capable of producing an energy gun!") + return ITEM_INTERACT_COMPLETE + if(slime_core) + to_chat(user, "You remove [slime_core] from the core component slot of [src].") + slime_core.forceMove(src.loc) + slime_core = null + if(used.flags & NODROP || !user.transfer_item_to(used, src)) + to_chat(user, "[used] is stuck to your hand!") + return ITEM_INTERACT_COMPLETE + to_chat(user, "You insert [used] into the core component slot of [src].") + slime_core = used + return ITEM_INTERACT_COMPLETE + + if(istype(used, /obj/item/smithed_item/component/egun_parts)) + if(parts) + to_chat(user, "You remove [parts] from the gun parts component slot of [src].") + parts.forceMove(src.loc) + parts = null + if(used.flags & NODROP || !user.transfer_item_to(used, src)) + to_chat(user, "[used] is stuck to your hand!") + return ITEM_INTERACT_COMPLETE + var/obj/item/smithed_item/component/egun_parts/new_parts = used + if(new_parts.hammer_time) + to_chat(user, "[new_parts] is not complete yet!") + return ITEM_INTERACT_COMPLETE + to_chat(user, "You insert [used] into the gun parts component slot of [src].") + parts = used + return ITEM_INTERACT_COMPLETE + + if(istype(used, /obj/item/stock_parts/cell)) + if(cell) + to_chat(user, "You remove [cell] from the power cell component slot of [src].") + cell.forceMove(src.loc) + cell = null + if(used.flags & NODROP || !user.transfer_item_to(used, src)) + to_chat(user, "[used] is stuck to your hand!") + return ITEM_INTERACT_COMPLETE + to_chat(user, "You insert [used] into the power cell component slot of [src].") + cell = used + return ITEM_INTERACT_COMPLETE + + to_chat(user, "You feel like there's no reason to process [used].") + return ITEM_INTERACT_COMPLETE + +/obj/machinery/smithing/scientific_assembler/attack_hand(mob/user) + if(!slime_core) + to_chat(user, "[src] lacks a slime core!") + return FINISH_ATTACK + + if(!parts) + to_chat(user, "[src] lacks an energy gun frame!") + return FINISH_ATTACK + + if(!cell) + to_chat(user, "[src] lacks a power cell!") + return FINISH_ATTACK + + operate(operation_time, user) + return FINISH_ATTACK + +/obj/machinery/smithing/scientific_assembler/operate(loops, mob/living/user) + ..() + var/obj/item/gun/energy/finished_product = new slime_core.associated_gun_type(src) + finished_product.forceMove(src.loc) + qdel(slime_core) + qdel(parts) + qdel(cell) + slime_core = null + parts = null + cell = null diff --git a/code/modules/smithing/machinery/power_hammer.dm b/code/modules/smithing/machinery/power_hammer.dm index 7bc9e78e5f8..af463db6671 100644 --- a/code/modules/smithing/machinery/power_hammer.dm +++ b/code/modules/smithing/machinery/power_hammer.dm @@ -48,7 +48,7 @@ /obj/machinery/smithing/power_hammer/operate(loops, mob/living/user) if(!working_component) - to_chat(user, "There is no component in the machine.") + to_chat(user, "There is no component to hammer!") return if(!working_component.heat) to_chat(user, "[working_component] is too cold to properly shape.") diff --git a/code/modules/smithing/smithed_items/misc_smithed.dm b/code/modules/smithing/smithed_items/misc_smithed.dm new file mode 100644 index 00000000000..e98d5c8af8a --- /dev/null +++ b/code/modules/smithing/smithed_items/misc_smithed.dm @@ -0,0 +1,7 @@ +// MARK: Energy Gun Frame +/obj/item/smithed_item/component/egun_parts + name = "energy gun parts" + desc = "Smithed component of an energy gun." + icon_state = "egun_parts" + materials = list(MAT_TITANIUM = 10000, MAT_PLASMA = 10000) + hammer_time = 6 diff --git a/code/modules/smithing/smithing_cast.dm b/code/modules/smithing/smithing_cast.dm index 9a2140be5a0..d46507e7826 100644 --- a/code/modules/smithing/smithing_cast.dm +++ b/code/modules/smithing/smithing_cast.dm @@ -26,11 +26,15 @@ . = ..() if(!possible_products) return + if(!length(possible_products)) + return var/list/product_names = list() var/product for(product in possible_products) var/obj/item/possible_product = product product_names[possible_product.name] = possible_product + if(!length(product_names)) + return var/new_product = tgui_input_list(user, "Select a product", src, product_names) if(!new_product) selected_product = possible_products[1] @@ -158,3 +162,20 @@ icon_state = "trim_cast" desc = "A cast for creating trims." product_type = /obj/item/smithed_item/component/trim + +/obj/item/smithing_cast/misc + name = "misc cast" + icon_state = "insert_frame_cast" + desc = "Debug cast. If you see this, notify the development team." + +/obj/item/smithing_cast/misc/AltClick(mob/user, modifiers) + return + +/obj/item/smithing_cast/misc/examine(mob/user) + . = desc + +/obj/item/smithing_cast/misc/egun_parts + name = "energy gun parts cast" + icon_state = "egun_parts_cast" + desc = "A cast for creating energy gun frames." + selected_product = /obj/item/smithed_item/component/egun_parts diff --git a/icons/obj/machines/smithing_machines.dmi b/icons/obj/machines/smithing_machines.dmi index cd2c5a5fb34dd01eb37bc3caaea262ba3a19eeab..fbe6aa2c12970eb08884049d1500cf0a0f917101 100644 GIT binary patch literal 11398 zcmZvCXIN8Bw>F4^f`BN3QdLxn3aCgYq4(ZFARr(`Akw8I;QlOtOh;ZB+%w ztlya4xeCjad#V}NAIE4e_kCx_6Cy!oImWtcaoAAvrP$(kYYWSewxs=p;={Ar91)?Z z4M;&FPtPnp;gTyx*K2dWBX2q9Yn)-FD{U-86^6&b2ok@=GDSNuO! zcQmDfA|66#9+H?$u0aJ$i<$Ic*eE{ji}V>70||rRLX+lvlP8hAKm1yVQ|!hPEwfhR#lJ;Dirmp=4P&*F3& zo9DvTv7W3U+jRRwd0P>0GxyAd9osC2Sb<|KkvbMaF+!wsG&J`lv{aQ$Uu9!+VDGY# zL8z#WVP_?selAyo*L!vGT-Avjq=^iCi=S1F!n~Dz2$j{gZ>QJxt96t zdGAD_3*(IRrse)wm)-5_&WVWU+vN19Bgz^FBZ+l&JeYz$Os1^WJ(GHUcCDN{N1~*` zPa{hm4UhMSNiR@~kS>1v9moM>BWFi`r*o%aWKeEr@GhhOUED@Z0Dc+1pD0uo-#0x3>cVx$?a|ZXP^k~+&Crg{iO}m zHCg~YD%dmGZBj`%;{cPvwlvd{2MFa$vM33Q`+&=@RI!Cipn0XcOgV$%jU_;)&` zP5OkN5W69}1-}GJU0CY+-Exb`_BjM`XkArujHnk;b#ADw1}|*~6jckd`@PSRJ1E(I zrJ(mikk3gYh4~RYL-s+q2+g)w6}j_#v=^d34gP+sv1p|Kb>P?E`vZHvYw=b34(o#a zB#XWM9~AJw$f^k_6)x2O5oNo z4}5acM{=OH@*yYThec^=6&%>-qwBlr8k7-rvqG-pJ>UT)JS*W=_~!5)+1*doH~>P^ z|D|Z@VT@Nja<~KG1{p!%gF8hluZ5ayO7W{~>WlZ_A6e?V-d_2%#s_QA^U@g}iK zt`~jh>|qG5WG&Ra-J2{(Pm<1%G*Bm6{h9;@OUB$) z!_<|!$KCqv4!Eqlo6IldL=7NMf`yfVu`4zbT>EwlZ)^pGYhgGn+_mN-uCqIMAu8Y_ zIG9Lzes}qn4kX|j?j~~CcY@OsW-Y|t3{lr|{4hXI+MoCnd_5Js`myp7;t*5G5;Z+{ zp*Rlkwi)E?=B72d^`K3EO=i-%v1GC9QTi+)Kn_8lT4i2&dwl;KAqooyb3Ahp76Lgw z7j3ljyqnNrMuI#^ngxDWxLm%Ax2_vI|AH$}m0Z2_juUv2XoCpZ&*^Ox-J5KA!osQz z`|u$ngKc1-Ca9EGs&@*S<(P*jKdVj`jU%UUZj{$la%rLQbOl+z53Eb2#vWmAcs>0! zV#dED0>m`8jw#RKW2UA8R)dZEt{WKaywlZi3*`x9*Yfy>yqj>-MX}a#bS6WBkd>WP z;rV5TqekSz{PIv4Z!!R1?$&n9U0f;2n`}nsbshJ#Ds_qYwtlg(dVRst=h)h!$L;7# zJ^Avu7=NIGVN79nfa;uK`5P7gS@pY~Dc`Q&+i4S{O%dzQXQx;+Hx zcd;=Z0hh%e_yiF#ah|699b45A5TwuIc={uBO{2v-H~+Gyp$*A3OVeui?~7U{m@L$W z$JV0q_r&1A4|jt@iYc6}4`buTo) zTEkK4Guu!pbGze&(%O_0nUZ1_a`=ys9fiFss!jpAoat2;JNV3O+quuj3@`YlMBV674e`WQt}?T)7fIWLeAcQi1YRKD zeYDF`?m;^2Vck8y0M{BiSZJv%luZ7IgHE8FC|kHa2x{m-wSJ^rNy$rXOAk&1wA zSTh81^imWAe}Z42M7WwiujTSF-ktJHzXKs>@e~RiCI=--2~H%7Ql8J}e0h zJFhzSv2D+%Ro|~5Q;N8~=MK9mp|v%GMylj}Jp+L^%pw9$RPUBUzntvN?O?-fjF2}* z@xa4~oi~WCykeA>keC{9HM)LuPW6_=I zvN8DceD-DxVh@osd-MTUIR6S3+ANVy<&?eyIziRA{>upmd*kS>G4so$mBcmXhaOVt zthF!+Y@lqOG@CNJ)?U9hoI70jZASY`=ue{6hS^wf{aqP57<;-#ZV)XAi9E@^N8h8A z*$j8Mv&r5*`O~Tnhwl>@=?Ejo#>8_=k{nSVO1ynSjTm5oN_5`@zk>+CKDT~HdO{C$ z7M??nxs_Ms%d+{{aCZFm5Kuo5C-IqDes&fGhE<4saGO?L(0$vOGi^&b3pn}@o2Uhe zF>EKez%VVp^cwDFHXD(RA4KLR1n=S7%WBlwsQ+grB`*L+)m;H~?Sg(e$KGcMV*Piv zqsShxbrvD_Y1O7nJ^;}=w)PDDliES$O(yECS`_Lem#$(&^3m4P;@|ua95c!ViU6;I zYegQdF_UaRpL}~syu1MXzKp-N64P2HLf5eHA+vq375k%2>dIQ_@(Yb9{}aK# zU5KrNC4GBZWnWaEYIaj(@jys#D@*EAkD>)rC-(N%Ymu6-K_uMq3ul+SZ3u@F{rlK;g zw&nO~CrD@<3X(fizhe)Z*!m#fpQQl>NM4L33&;p5&{$nQU#CV zi<^H`UA!gAJesU2_miv&7GP!0qMTJbpp1d9&~foKgEB5tNz_q3HMf(n2f|Nn{7Co? zy$$JW=`Md}U|b{<4Mj=h=PliACKUsnAfwz8yu*$DfLn3oNG#7qI_GB8^G|jN3Bp1( z*+H7Y4a+K%cbWv-%V|_6zvur`U0NDwz3(6t2M}tmc`xGaxvK@1o8I`M=?MJgn@mbu zbkdl^8U(-FNpR#ML13%N^NH)TjRY{`60KF-lk^1Hdj*v*n)#q(f$ld!c2GT=z(v6j zeP$mw6}^Ag`%(qHt^B<#3$;o!QBrwDdp#rR!YnA8T+bYx&8jEKf6l+b zD*zMb-rIqwZM|f5>GH*nkOr~1&DH&OH}$?=n?f*moQ}?7KP1?J-uEfPT0t@^$pOY* z3k)Gijoo(H9<$*~8SkV2HT?a?%4YFnuT8I(c^_%brx90pOF6B1{{aQqjjwZ!CyebE zA|VxkC-Y-kd4Xo=R-vb+Ar3&Qe}9_=c3(JOk(QX~R<6Q_TMF5E&u<;*Alp`=JkRKH zOB>kFVG?A2S~H@lYe)E66qslnrQ96BK&=P=qxYIoaVbsxPbq5^GAE%=12vO&8~NAE zCl>fI45}G(Y1I56@SDNE@AG40?xY<@^~4&Ws!^gP zIZ(vcp9m$T$-Jkla8-~=<`J_#+Q{IfR_rW|L;QJ6Ta5}|(E7P;kggvO zb#(4ladGCD)m`sI$OR6TjrmLJ6K%wR>G5A}t+X^fN}#iNw^38=BUDdS?Ce zVZUy!hRq(0zBmX?&U!BUPVT9r-B)4mg_P+FhtDiF%y7g`r44GgW>Iz*y0r7<_)JunwGE0kJ3bIB zXM$4M3{6)jE(Vb*VWD%6aG^Ie;-QTMHY)-bzL zg_-y7A6bwB3EVTDXOWTluy;da=%c!Sf>qi)F8vNY5Eh%uJZBmw;F6|sR&{4VqP@o+ zQ^r}ynw=(Qj=1L8Rphqsf`(~u<+x*le;lOryLJsc|6k``5OA_)Z zZvZd_>(9qos7j3o9Zk(nO^FnFqO4IAFZB`9M?+6pD=slm=fcVdop2s=q zlNt&1^+3PFOHa-YNHkZN+a>ZrOv!_G>Txunc53CpS={HLD42C~>1fRq% zo{#P$3S06e9C9z_%L~i?IGh6CTOe(G)MiWvy19bXNuH9G*tFG1Ty)e8q!U+GhUd6T zX>{QTGHV(_I3S*JYf92&P+izgK%TuUSX(vzZcNqZ8#3C2|Fv+ z64Xo{eP}b0h-{j~m<6S&JE;Jdci4QvK&@~Cp5uN^Y%p)M? z%SCsjO%sy4>VVp%+oojAan`bTgijvNqqxnOjR(M6XI<|lRD&~xRjQgZf09dt8aQ7I z6U`Y^vG+rN=1&*cfCmR-UKjr%o}{+f^>$nGlN*Gde^1)pX)tQ8qzpJN=f~Xp>IA9$ zL4fXewEAMBe7J4dgYf-B-0hbp0oQS{$slrCMqBVXXPeEiW~{yT!kTy{~Ydr`px zPjT1$QRDq7jfDUd`JK0}YbT55@S7V^j@DwAeI&XdM^8Izb)HR9Org>ga%U2I+ zyR|MLjUEIB}!;OwhviGsHtN79Qyv=^dwcvsxtLaB7MeM>+L`;K@_1EH+`b zw%g{Zz+!|X|DM+Qs@8u1oSlk^4)9m*JOHsXvt=KDE_p5(-rp>+oR{d2elFeUuNG*u ziSx{cWy{-a*2l{axWbksStFo*v_>iR6;hIE?PER0pL|tbY)#dQ4`~%m+k0*)x%3R( zGg{zKaVybF3a~iR1c#8INfL z&D;oYE0$t(^O1;@-Bsw?FXlp4;SQEU5^NBHOKCa*s#7zis#52TbHkiwW&{il>&li6 z`wlxgbM7)r@emPrszGvAcsh|}^4%<9v0VAYy#f|UwNG(SCCqRmdsF5{@_yaxaPdyph=;_XmOg^; zu@$<})OlWy?9!VN@kwZp&n5b2tnAJkq69f?&uMnMr8s%`&C*VUvLnOrvwVWw|(Wk7>D0<%zSGu3l}9iPB{bu?vAI( zU@T`&9Aqq<8{lA5Xy99bcYl&v+rIq9;BEhpg)@Kf=Wj8-wImAUiTmU|_K}|-H?zTB+tlyzh+ik%sjURQNRBZeKJ;>h_F0MkM3eP|7of?Lf;|JBx$Sg=lu!K13G)m_ zB^@JLBR3e^q${G`Bc~50WYz9y)!~hoU_TXigwyqf&KUO>5mZLGbAvQBMYhUJyRQ)` zlPUX?;{~mm0W7wpr*A}DmySw{JqRXei{ckm=wimUcua?tQr#|X+@7HQo|NtPXx#kH ztqsS16S5%s9p)1V@X=LFc&{ygKYwR`4v0RUFuqGF7x7gMs{LY?rIaqbq8fT@o>~=7XS{K4T+4(Z1tlj1Rmr%y`&;sL7z5K-7icino@c9j z3x(1Fz9N%qPE_uY?eRbuv3HchPaNIxRjl@Q#H$xelR_Z0jooYctPpg%1#mUY(uO~O zRD!8c40F~+iFP~rj54*lSURGCIhy5XhQ@`=ljn}0Az>SM4)(#O^wj~B5C68T(N%NBxKQrgBj=Z2*sAY1NG_jM{7<`#lBf^q z6U#5r-%Qq8^BPP1n&(XZ?G0)(%&D{L`fo)irp_WwRoR)kztdH^v&~S{Y^O0rUM}*b zg`icszwF>!zuTKT;5hYsJovD+Y4-$pAa2s+NWUl`;*xINR zAii){)+YB6GoV54?;xWP56={A;E0p8RzJCy|BfmO(ZtxhjQOc5Q6}M{Ov3*YYeUMC zziB^EQ+xUpBnarEiw=e~A9!P9=i%&sU7>R4BdhT>bCV8Bol4GW30CyH0Vxy%|4*-E zZY{qhtlxK0em!w;w4K28*EukB|8>m&{r=3o@pE!AH4_=-oODrpG3$z}o0f#Z{a5~P z!U4G0X$s-Nm1RQm!lN+?Y6gB44ru1kp~wXS?oHb*3LtQMNRv$zY>nyJvJ0F;O5P7U zy2&kfYkZ+rK3pNer(}eQ{mJrmDwofrt*K1yZ+~G5MXSIpabRFZ&Iwk~tt2M+KDo(4 zaCHc7PSIIj@sV8W{h?Qfd;LoCF_}S@rO)p~0Ci5_zX8xSNMwgN7moye`=I_cYyGb5_BgR7F zw?E>wvV@f3!$D2P!m4l_nht{A58UXmhg>fzqr2?4@`Q^!c~MFfJm%P@jN`U2AwHv? zeTm&$J1D7|BL0s6+gF&=z-Sp}daewfeB019!x{1XsUHp1zhKh1@}2Q?JIRgf7I5O3 zv6WZ0r-2fx&cD?(r+X}%O9so>D&5(xsR=|q1I`#<({8*pjSqt5ETY&pEvaH4uDXUIDI=F z+C#MOS;ZRh(BaWo>3D#f$=@O-ZzZon?(`70%C$dZg0|s}5JP-ImDx8Js8`f0Mfo2K zVgugA=(KOy3@;eHC5z<7zU$mSC=E34UgzE~u&yL1i&-axk7tgL1-Rqm>2L#8lqPK8 zTRMjNF$&ijn+j!i-t5^{KW{;kOU(yVu0F+e!$c16DmXH%hxSt<6Q4GFUQGa_9<+?L zMHj*vKVdOz;20*C5#+ca->Y>m@BP*NJpPWoibPEYgn^asnFq+`=IN~DL(PT$bAp90I~b!u)lbg0HwZ~xHq5GkbU8*K5C-@DEe>bSpOGf{^tsu9brPj z^CRw0BMyRH?J>6_j3-)~CGKvEL65XE&kt2THccZ^j%E_RJM)k!0UMrMT?DXx=`=-o z?OiLLsare+Mg#@Mz{sPH0@PKMV@j9rMuQK}Gk^QT+eC>Q@^J>CJt{NtDJL!9jKuwh z%Ah-ArJfQ9LTN(PxA9U7;a7mVMj|f94mpaC<7M0Qw9Hhp$A(ah>_X)W!?Y)(T{__O zk_GavFSmMs@Jh%npCXnSD4Oy<<^+85{lVVdBH9)Rp7QIh2aaOWu+JJ)B$_h{wAr20 zUrLXUB=_u6VCGB5Zg@B44hGk^8Lfma+4mU$W-ru-Pr_+b#LMb5qMtxd5V3+OCEmsPlMSh>4`9O&MP1Kpo)A%Cl;^>bp=Lp#|7Pi#PSXNO=aZ>e>?Fj!G*@z z`8mw75IrwyQCc-BdD#7X%;ua|xCd2Uzn*p24l4Igcna`j2bNp|aM5Z;N_~;@iP2=$?+Kosc9)yfl+}?bv zXK3(ag$bV46;_@5fg0dL8fQifAVEp!iOOqd@sWILq}a(WZ{mn@%|AtBr87#oHYcg? z$4ZgE0zo)c^pivhqUkwue~8rg^It7c5(>V?kl%V$TU5$+S@745WG1Tcm39}Kj~jMN zGbHxgKiq9VVLS^C!a{2|4;mc_>-Z`E&HWIY7LFoNBUz11`3sJ+NQFFAedAAAlnwpN z{li|oO?89PRpSRe^<97kgZK!~lk9P^@~gX=Sp;9JNuNWE@7Y&fCEObDd>=z9>=Mye z*lFj7eR&|FbQ)nI(;~BVO_g7#R~Ejec|QI2x?y8Y(i+&bk)HE~-OKESnKyo~_nZ*o zo)aH(8m;V?6YdI0HJSKTA1U#vUDpP(Jh#%~TmkNMV`le+jZt9B|G50-kTL+ECcxOa zg@wS+d(Xekv=bw(-yq?059VJy07Kj;{k-Gr$d(-z30BpEWVd@njZX_@JTb#C4Y)@x zYAH^{eHV9KL<2inST{nMX+{Zqu2)zXLoztm#=P*Jfz7lEhhIoJU0}C_>81KuIlk_5 z3pVZuqV`<_-V4RRlzf0K4VH8M`WEQUvJH*eJa~rx2L(RQoav4*kauM!>k)r33<_o= zGiPgIEAq%O7mnbCXH>iv13WIgvooDj(i+2pXv>8-MMP`01wDKMsM zpypZoCTY}E{Wl1Dj&y&61E(TZNYuB3zq#W{Q2h(TQ`BA-?-semzy6ohJHlwVYI@d$ zCw@K#J~;(=zUKk)oN7hzJv-R0%?o{Vht+`gXDE+sfRepxSaed@aVH5_F8 z+cyjTut)aW(VF0%z4HY5{tSSa;VF26h9c-Ys?9~Vs*R4Kw1BZUnQ@Pf&=JhlZP4~|n!45lhU&Qr+ zk{-93PrsA*E*%(6l=j_a`9Y)a>qdQ{ca_~4cKrghEmm&C zYRg2G?W$F|+nYrwm21kn&D*aY49Cs53MDTFR@@%C!X!`#KkFWtq+gQ^4`rP3RuzRL zKJa_2Z)?rwV!gTF{yeZlGSMR5rPAQAv8T+fep;|#xCf=sWrTe@e#%5|>2d4Uh_MVc zqwPQ7la=E&uq-s{$tx%!{j7PrGF!Epx0w|s9S;WRU%ts+*iA1mK9a*E(k*9!PpPTz z{%y#+kNPh;@RlK#_=(SpG_A*03e#fTK|geZwp| z(+M>?whXnk5j`NERA1O7al(wUA-e`^f%+%HL)|J1%G4%Lc3gf%WRPou|YXOJecO$l^ z*up;KYieY}o}RaU%ey=_47!f@L+n6yD<2IV)U@TNpH!{D>~xj7`|P(FQUw1pMt)vs z;0y8lbY?Ztp8U+slur{ca=MiKw>e{lu3fWIz6t1L9^SGF=rytO(Pevjy5H)}uKG`U zr2L<@qyB1EMJsW@xk5osc4j99`8VLJrQ1ZBlyh5-uMkHVZL`QX$v?BA2{ZV>W*(9o ze6V57qPBjE&XE3Y!R1j+=<#3SnnEoRAC_JaDC06Vfqr{x{Yg_Vmd1wk^a2-Xpqlk_ z>y>|Ht0YR*&lf`qB_NBb5BWcbc>mAxi$W>iexvE~vQ-ImXK2DY!l-9l-C)waBZBzwH@+QnyWYfU`#!Gz~-;ia?1G?X$B-Wh^d^S$&Ha-seadv}7EE+i&sQ zc#-7z%PrUqW4jRavu&^;H}~2*&KTZHwu#*}+5Ps=-M%r8wr4KLF%Q@G6LUV_801K3 z`tLx-@s0jjnAlvk>2LG#t6v0j;;!E zX^4qmQWIk6XtqD`H9#$EvbqpMRDGso^-zRHJh_6gM3#%XkIFZ-T<6}h?!CCA>+P*m zOgUqPiSjs4DflLjQ2({nzPw>tnMftmCwhrkb~bOBvc$ zvkk6igJk<)NPmTJAJ=`jycU*;ge3*aP}8ZQ@*mM_r*;&$5sb6GJu21$xCZ_cenW`; zqNcf*;W@hh8v17#4b5v>hO;z67o~5|C^~$mrKMq{V>wS_cVgLXD literal 4258 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 muqPp-sk7t%&EoC?KgQ-5{ta(k-1L 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