From a9b0ecb7d08c7a59f1cab0e03f6d446fd2b15c02 Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Sat, 20 Dec 2025 11:33:10 -0600 Subject: [PATCH] Weather anomaly (#94509) ## About The Pull Request A weather anomaly can spawn on the station, causing a sandstorm, snowstorm, or rainstorm to affect the room (and nearby rooms). These weathers range from "harmless" to "mildly damaging". They last for around five minutes. The weather doesn't start immediately, giving people time to neutralize it before it causes damage. Neutralizing the anomaly stops the weather. If they detonate, it just throw objects away from itself. image image A rarer version of the anomaly can also occur, which brings a lightning storm, which may damage the station itself. Also, reactive weather armor. When you are hit, it summons a lightning strike below nearby assailants. ## Why It's Good For The Game With the added rain mechanics I wanted to use them, but it's kinda hard to shoe them into the station because, "why is it raining on a space station that makes no sense" However, anomalies are weird, so this fits perfectly ## Changelog :cl: Melbert add: Weather anomalies, in four variants: Rain, snow, sand, and the rare lightning storm. add: Reactive Weather Armor /:cl: --- code/__DEFINES/research/anomalies.dm | 1 + code/__DEFINES/weather.dm | 13 +- code/_globalvars/bitfields.dm | 1 + .../subsystem/networks/research.dm | 1 + code/controllers/subsystem/weather.dm | 3 +- code/datums/components/area_sound_manager.dm | 2 +- code/datums/weather/weather.dm | 151 ++++++++++++++---- .../datums/weather/weather_types/ash_storm.dm | 3 + .../weather/weather_types/rain_storm.dm | 10 ++ .../weather/weather_types/sand_storm.dm | 3 + .../weather/weather_types/snow_storm.dm | 28 +--- .../effects/anomalies/anomalies_weather.dm | 100 ++++++++++++ code/modules/admin/verbs/adminweather.dm | 14 +- .../modules/clothing/suits/reactive_armour.dm | 76 ++++++++- code/modules/events/anomaly/_anomaly.dm | 6 +- .../modules/events/anomaly/anomaly_weather.dm | 77 +++++++++ code/modules/mob/dead/observer/observer.dm | 1 + code/modules/research/anomaly/anomaly_core.dm | 6 + code/modules/research/anomaly/raw_anomaly.dm | 6 + icons/obj/devices/new_assemblies.dmi | Bin 27564 -> 29183 bytes tgstation.dme | 2 + 21 files changed, 437 insertions(+), 67 deletions(-) create mode 100644 code/game/objects/effects/anomalies/anomalies_weather.dm create mode 100644 code/modules/events/anomaly/anomaly_weather.dm diff --git a/code/__DEFINES/research/anomalies.dm b/code/__DEFINES/research/anomalies.dm index f0dabae0250..b2b39d4d08c 100644 --- a/code/__DEFINES/research/anomalies.dm +++ b/code/__DEFINES/research/anomalies.dm @@ -8,6 +8,7 @@ #define MAX_CORES_BIOSCRAMBLER 8 #define MAX_CORES_DIMENSIONAL 8 #define MAX_CORES_ECTOPLASMIC 8 +#define MAX_CORES_WEATHER 8 ///Defines for the different types of explosion a flux anomaly can have #define FLUX_NO_EMP 0 diff --git a/code/__DEFINES/weather.dm b/code/__DEFINES/weather.dm index 7cc84cc8a4e..0bd041a497c 100644 --- a/code/__DEFINES/weather.dm +++ b/code/__DEFINES/weather.dm @@ -35,7 +35,7 @@ GLOBAL_LIST_INIT(thunder_chance_options, list( "Regular - Standard Storm Activity" = THUNDER_CHANCE_AVERAGE, "Occasional - A polite amount of thunder" = THUNDER_CHANCE_RARE, "Rare - Like finding a four-leaf clover, but in the sky" = THUNDER_CHANCE_VERY_RARE, - "None - Admin Safe Space (Thunder Disabled)" = NONE, + "None - Admin Safe Space (Thunder Disabled)" = 0, )) //WEATHER FLAGS @@ -53,6 +53,17 @@ GLOBAL_LIST_INIT(thunder_chance_options, list( #define WEATHER_BAROMETER (1<<5) /// If weather temperature ignores clothing insulation when adjusting bodytemperature #define WEATHER_TEMPERATURE_BYPASS_CLOTHING (1<<6) +/// Alerts are only sent to people within affected area rather than on affected z-levels +#define WEATHER_STRICT_ALERT (1<<7) /// Does weather have any type of processing related to mobs, turfs, or thunder? #define FUNCTIONAL_WEATHER (WEATHER_TURFS|WEATHER_MOBS|WEATHER_THUNDER) + +// Indexes for weather_data list to override behaviors +#define WEATHER_FORCED_AREAS "Areas" +#define WEATHER_FORCED_FLAGS "Flags" +#define WEATHER_FORCED_REAGENT "Reagent" +#define WEATHER_FORCED_THUNDER "Thunder Chance" +#define WEATHER_FORCED_TELEGRAPH "Telegraph Duration" +#define WEATHER_FORCED_END "End Duration" +#define WEATHER_FORCED_DURATION "Weather Duration" diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 88e622add8c..7046a2f8f4d 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -689,6 +689,7 @@ DEFINE_BITFIELD(weather_flags, list( "WEATHER_ENDLESS" = WEATHER_ENDLESS, "WEATHER_BAROMETER" = WEATHER_BAROMETER, "WEATHER_TEMPERATURE_BYPASS_CLOTHING" = WEATHER_TEMPERATURE_BYPASS_CLOTHING, + "WEATHER_STRICT_ALERT" = WEATHER_STRICT_ALERT, )) DEFINE_BITFIELD(visible_info, list( diff --git a/code/controllers/subsystem/networks/research.dm b/code/controllers/subsystem/networks/research.dm index dece0f78e01..8a48e90c266 100644 --- a/code/controllers/subsystem/networks/research.dm +++ b/code/controllers/subsystem/networks/research.dm @@ -66,6 +66,7 @@ SUBSYSTEM_DEF(research) /obj/item/assembly/signaler/anomaly/bioscrambler = MAX_CORES_BIOSCRAMBLER, /obj/item/assembly/signaler/anomaly/dimensional = MAX_CORES_DIMENSIONAL, /obj/item/assembly/signaler/anomaly/ectoplasm = MAX_CORES_ECTOPLASMIC, + /obj/item/assembly/signaler/anomaly/weather = MAX_CORES_WEATHER, ) /// Lookup list for ordnance briefers. diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm index 0882720cdfb..c330455fb15 100644 --- a/code/controllers/subsystem/weather.dm +++ b/code/controllers/subsystem/weather.dm @@ -109,7 +109,8 @@ SUBSYSTEM_DEF(weather) var/datum/weather/W = new weather_datum_type(z_levels, weather_data) - W.telegraph() + W.telegraph(weather_data) + return W /datum/controller/subsystem/weather/proc/make_eligible(z, possible_weather) eligible_zlevels[z] = possible_weather diff --git a/code/datums/components/area_sound_manager.dm b/code/datums/components/area_sound_manager.dm index 8dfb7895699..f712fc8043b 100644 --- a/code/datums/components/area_sound_manager.dm +++ b/code/datums/components/area_sound_manager.dm @@ -43,7 +43,7 @@ /datum/component/area_sound_manager/proc/react_to_z_move(datum/source, turf/old_turf, turf/new_turf) SIGNAL_HANDLER - if(!length(accepted_zs) || (new_turf.z in accepted_zs)) + if(!length(accepted_zs) || (new_turf?.z in accepted_zs)) return qdel(src) diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index a8d7a83ea0d..f0a87956c56 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -57,19 +57,19 @@ /// Types of area to affect var/area_type = /area/space /// Areas to be affected by the weather, calculated when the weather begins - var/list/impacted_areas = list() + VAR_FINAL/list/impacted_areas = list() /// A weighted list of areas impacted by weather, where weights reflect the total turf count in each area. - var/list/impacted_areas_weighted = list() + VAR_FINAL/list/impacted_areas_weighted = list() /// The total number of turfs impacted by weather across all z-levels and areas. - var/total_impacted_turfs = 0 + VAR_FINAL/total_impacted_turfs = 0 /// Areas affected by weather have their blend modes changed - var/list/impacted_areas_blend_modes = list() + VAR_FINAL/list/impacted_areas_blend_modes = list() /// Areas that are protected and excluded from the affected areas. var/list/protected_areas = list() /// The list of z-levels that this weather is actively affecting - var/impacted_z_levels + VAR_FINAL/impacted_z_levels /// A weighted list of z-levels impacted by weather, where weights reflect the total turf count on each level - var/list/impacted_z_levels_weighted = list() + VAR_FINAL/list/impacted_z_levels_weighted = list() /// Since it's above everything else, this is the layer used by default. var/overlay_layer = AREA_LAYER @@ -109,15 +109,15 @@ var/weather_flags = NONE /// List of current mobs being processed by weather - var/list/current_mobs = list() + VAR_FINAL/list/current_mobs = list() /// The weather turf counter to keep track of how many turfs we have processed so far - var/turf_iteration = 0 + VAR_FINAL/turf_iteration = 0 /// The weather thunder counter to keep track of how much thunder we have processed so far - var/thunder_iteration = 0 + VAR_FINAL/thunder_iteration = 0 /// Index of the current section our weather subsystem is processing from our subsystem_tasks - var/task_index = 1 + VAR_FINAL/task_index = 1 /// The list of allowed tasks our weather subsystem is allowed to process (determined by weather_flags) - var/list/subsystem_tasks = list() + VAR_FINAL/list/subsystem_tasks = list() /// The temperature of our weather that is applied to weather reagents and mobs using adjust_bodytemperature() var/weather_temperature = T20C @@ -137,11 +137,12 @@ ..() impacted_z_levels = z_levels - area_type = weather_data?["area"] || area_type - weather_flags = weather_data?["weather_flags"] || weather_flags - turf_thunder_chance = isnull(weather_data?["thunder_chance"]) ? turf_thunder_chance : weather_data?["thunder_chance"] + weather_flags = isnull(weather_data?[WEATHER_FORCED_FLAGS]) ? weather_flags : weather_data?[WEATHER_FORCED_FLAGS] + turf_thunder_chance = isnull(weather_data?[WEATHER_FORCED_THUNDER]) ? turf_thunder_chance : weather_data?[WEATHER_FORCED_THUNDER] + telegraph_duration = isnull(weather_data?[WEATHER_FORCED_TELEGRAPH]) ? telegraph_duration : weather_data?[WEATHER_FORCED_TELEGRAPH] + end_duration = isnull(weather_data?[WEATHER_FORCED_END]) ? end_duration : weather_data?[WEATHER_FORCED_END] - var/datum/reagent/custom_reagent = weather_data?["reagent"] + var/datum/reagent/custom_reagent = weather_data?[WEATHER_FORCED_REAGENT] var/reagent_id if(custom_reagent) reagent_id = custom_reagent @@ -165,7 +166,7 @@ if(weather_flags & (WEATHER_THUNDER)) subsystem_tasks += SSWEATHER_THUNDER - setup_weather_areas() + setup_weather_areas(weather_data?[WEATHER_FORCED_AREAS]) setup_weather_turfs() /datum/weather/Destroy() @@ -179,26 +180,94 @@ * Calculates duration and hit areas, and makes a callback for the actual weather to start * */ -/datum/weather/proc/telegraph() +/datum/weather/proc/telegraph(list/weather_data) if(stage == STARTUP_STAGE) return stage = STARTUP_STAGE SEND_GLOBAL_SIGNAL(COMSIG_WEATHER_TELEGRAPH(type), src) - - weather_duration = rand(weather_duration_lower, weather_duration_upper) + weather_duration = isnull(weather_data?[WEATHER_FORCED_DURATION]) ? rand(weather_duration_lower, weather_duration_upper) : weather_data?[WEATHER_FORCED_DURATION] SSweather.processing |= src update_areas() if(telegraph_duration) send_alert(telegraph_message, telegraph_sound, telegraph_sound_vol) - addtimer(CALLBACK(src, PROC_REF(start)), telegraph_duration) + addtimer(CALLBACK(src, PROC_REF(start)), telegraph_duration, TIMER_UNIQUE) -/datum/weather/proc/setup_weather_areas() - var/list/affectareas = list() - for(var/area/selected_area as anything in get_areas(area_type)) - affectareas += selected_area - for(var/area/protected_area as anything in protected_areas) - affectareas -= get_areas(protected_area) - for(var/area/affected_area as anything in affectareas) + // so /datum/element/weather_listener relies on z traits to determine when to set up sound managers + // thus if we force weather on a z level that doesn't match the target trait, we need to manually set up sound managers + if(target_trait) + manually_setup_sound_manager() + +/// Manually add a sound manager to all mobs +/datum/weather/proc/manually_setup_sound_manager() + var/list/filtered_zs = get_impacted_zs_without_trait() + var/list/playlist = get_playlist_ref() + // we only need to manually handle sound managers if there are zs without the trait being affected, fortunately + if(!length(filtered_zs) || isnull(playlist)) + return + + // add in dead mobs so we can get observers covered too + for(var/mob/living/affected as anything in GLOB.mob_living_list | GLOB.dead_mob_list) + if(isnull(affected.client)) + // this registers 400+ odd signals... maybe we should reconsider + RegisterSignal(affected, COMSIG_MOB_LOGIN, PROC_REF(handle_mob_log_in)) + continue + + manually_setup_sound_manager_on_mob(affected, playlist, filtered_zs) + + RegisterSignal(SSdcs, COMSIG_GLOB_MOB_CREATED, PROC_REF(handle_new_mob_sound_manager)) + +/// Returns a reference to the "sound playlist" for this weather type +/datum/weather/proc/get_playlist_ref() + return null + +/// Returns a list of z-levels impacted that do not have the target trait +/datum/weather/proc/get_impacted_zs_without_trait() + var/list/zs_without_trait = list() + for(var/z in impacted_z_levels) + if(!SSmapping.level_trait(z, target_trait)) + zs_without_trait += z + return zs_without_trait + +/datum/weather/proc/handle_new_mob_sound_manager(datum/source, mob/the_mob) + SIGNAL_HANDLER + + if(isnull(the_mob.client)) + RegisterSignal(the_mob, COMSIG_MOB_LOGIN, PROC_REF(handle_mob_log_in)) + return + + manually_setup_sound_manager_on_mob(the_mob) + +/datum/weather/proc/handle_mob_log_in(mob/source) + SIGNAL_HANDLER + + if(stage >= END_STAGE) + stack_trace("Attempted to add a sound manager to a mob after weather ended") + UnregisterSignal(source, COMSIG_MOB_LOGIN) + return + + manually_setup_sound_manager_on_mob(source) + +/datum/weather/proc/manually_setup_sound_manager_on_mob(mob/living/affected, list/playlist = get_playlist_ref(), list/filtered_zs = get_impacted_zs_without_trait()) + PRIVATE_PROC(TRUE) + + var/list/sound_change_signals = list( + COMSIG_WEATHER_TELEGRAPH(type), + COMSIG_WEATHER_START(type), + COMSIG_WEATHER_WINDDOWN(type), + ) + + var/datum/component/our_comp = affected.AddComponent( \ + /datum/component/area_sound_manager, \ + area_loop_pairs = playlist, \ + acceptable_zs = filtered_zs, \ + ) + our_comp.RegisterSignals(SSdcs, sound_change_signals, TYPE_PROC_REF(/datum/component/area_sound_manager, handle_change)) + our_comp.RegisterSignal(SSdcs, COMSIG_WEATHER_END(type), TYPE_PROC_REF(/datum/component/area_sound_manager, handle_removal)) + +/datum/weather/proc/setup_weather_areas(list/forced_areas) + for(var/area/affected_area as anything in (forced_areas || get_areas(area_type))) + if(is_type_in_list(affected_area, protected_areas)) + continue if(!(weather_flags & WEATHER_INDOORS) && !affected_area.outdoors) continue @@ -263,7 +332,7 @@ update_areas() send_alert(weather_message, weather_sound) if(!(weather_flags & (WEATHER_ENDLESS))) - addtimer(CALLBACK(src, PROC_REF(wind_down)), weather_duration) + addtimer(CALLBACK(src, PROC_REF(wind_down)), weather_duration, TIMER_UNIQUE) for(var/area/impacted_area as anything in impacted_areas) SEND_SIGNAL(impacted_area, COMSIG_WEATHER_BEGAN_IN_AREA(type), src) @@ -281,7 +350,7 @@ stage = WIND_DOWN_STAGE update_areas() send_alert(end_message, end_sound, end_sound_vol) - addtimer(CALLBACK(src, PROC_REF(end)), end_duration) + addtimer(CALLBACK(src, PROC_REF(end)), end_duration, TIMER_UNIQUE) /** * Fully ends the weather @@ -294,12 +363,17 @@ if(stage == END_STAGE) return SEND_GLOBAL_SIGNAL(COMSIG_WEATHER_END(type), src) + UnregisterSignal(SSdcs, COMSIG_GLOB_MOB_CREATED) stage = END_STAGE SSweather.processing -= src update_areas() for(var/area/impacted_area as anything in impacted_areas) SEND_SIGNAL(impacted_area, COMSIG_WEATHER_ENDED_IN_AREA(type), src) + if(target_trait) + for(var/mob/living/affected as anything in GLOB.mob_living_list | GLOB.dead_mob_list) + UnregisterSignal(affected, COMSIG_MOB_LOGIN) + // handles sending all alerts /datum/weather/proc/send_alert(alert_msg, alert_sfx, alert_sfx_vol = 100) for(var/z_level in impacted_z_levels) @@ -315,7 +389,24 @@ // the checks for if a mob should receive alerts, returns TRUE if can /datum/weather/proc/can_get_alert(mob/player) var/turf/mob_turf = get_turf(player) - return !isnull(mob_turf) + if(isnull(mob_turf)) + return FALSE + + if((weather_flags & WEATHER_STRICT_ALERT) && !can_see_weather(player)) + return FALSE + + return TRUE + +/// Checks if the player is in or can see an area affected by the weather +/datum/weather/proc/can_see_weather(mob/player) + if(HAS_MIND_TRAIT(player, TRAIT_DETECT_STORM)) + return TRUE + + for(var/area/nearby in view(player)) + if(nearby in impacted_areas) + return TRUE + + return FALSE /** * Returns TRUE if the living mob can be affected by the weather diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm index f3e9f3c4b04..367977a90bc 100644 --- a/code/datums/weather/weather_types/ash_storm.dm +++ b/code/datums/weather/weather_types/ash_storm.dm @@ -28,6 +28,9 @@ var/list/weak_sounds = list() var/list/strong_sounds = list() +/datum/weather/ash_storm/get_playlist_ref() + return GLOB.ash_storm_sounds + /datum/weather/ash_storm/telegraph() for(var/area/impacted_area as anything in impacted_areas) if(impacted_area.outdoors) diff --git a/code/datums/weather/weather_types/rain_storm.dm b/code/datums/weather/weather_types/rain_storm.dm index b1386d84587..4516112824c 100644 --- a/code/datums/weather/weather_types/rain_storm.dm +++ b/code/datums/weather/weather_types/rain_storm.dm @@ -27,10 +27,20 @@ weather_flags = (WEATHER_TURFS | WEATHER_MOBS | WEATHER_THUNDER | WEATHER_BAROMETER) whitelist_weather_reagents = list(/datum/reagent/water) +/datum/weather/rain_storm/get_playlist_ref() + return GLOB.rain_storm_sounds + /datum/weather/rain_storm/telegraph() GLOB.rain_storm_sounds.Cut() for(var/area/impacted_area as anything in impacted_areas) GLOB.rain_storm_sounds[impacted_area] = /datum/looping_sound/rain/start + + // change the message for if rain is triggered inside the station (no canopy of course) + for(var/z in impacted_z_levels) + if(is_station_level(z)) + telegraph_message = span_warning("Thunder rumbles from above. You hear droplets hitting the floor around you.") + break + return ..() /datum/weather/rain_storm/start() diff --git a/code/datums/weather/weather_types/sand_storm.dm b/code/datums/weather/weather_types/sand_storm.dm index c346c536a91..fdac54739e3 100644 --- a/code/datums/weather/weather_types/sand_storm.dm +++ b/code/datums/weather/weather_types/sand_storm.dm @@ -24,6 +24,9 @@ weather_flags = (WEATHER_MOBS | WEATHER_BAROMETER) +/datum/weather/sand_storm/get_playlist_ref() + return GLOB.sand_storm_sounds + /datum/weather/sand_storm/telegraph() GLOB.sand_storm_sounds.Cut() for(var/area/impacted_area as anything in impacted_areas) diff --git a/code/datums/weather/weather_types/snow_storm.dm b/code/datums/weather/weather_types/snow_storm.dm index 01a07df6133..f4a3baaa190 100644 --- a/code/datums/weather/weather_types/snow_storm.dm +++ b/code/datums/weather/weather_types/snow_storm.dm @@ -28,7 +28,10 @@ // snowstorms should be colder than default icebox atmos weather_temperature = ICEBOX_MIN_TEMPERATURE - 40 // snowstorms temperature ignores any clothing insulation - weather_flags = (WEATHER_MOBS | WEATHER_BAROMETER | WEATHER_TEMPERATURE_BYPASS_CLOTHING) + weather_flags = (WEATHER_MOBS | WEATHER_BAROMETER | WEATHER_TEMPERATURE_BYPASS_CLOTHING | WEATHER_STRICT_ALERT) + +/datum/weather/snow_storm/get_playlist_ref() + return GLOB.snowstorm_sounds /datum/weather/snow_storm/start() GLOB.snowstorm_sounds.Cut() // it's passed by ref @@ -40,29 +43,6 @@ GLOB.snowstorm_sounds.Cut() return ..() -// since snowstorm is on a station z level, add extra checks to not annoy everyone -/datum/weather/snow_storm/can_get_alert(mob/player) - if(!..()) - return FALSE - - if(!is_station_level(player.z)) - return TRUE // bypass checks - - if(isobserver(player)) - return TRUE - - if(HAS_MIND_TRAIT(player, TRAIT_DETECT_STORM)) - return TRUE - - if(istype(get_area(player), /area/mine)) - return TRUE - - for(var/area/snow_area in impacted_areas) - if(locate(snow_area) in view(player)) - return TRUE - - return FALSE - ///A storm that doesn't stop storming, and is a bit stronger /datum/weather/snow_storm/forever_storm telegraph_duration = 0 SECONDS diff --git a/code/game/objects/effects/anomalies/anomalies_weather.dm b/code/game/objects/effects/anomalies/anomalies_weather.dm new file mode 100644 index 00000000000..ea407acfa3a --- /dev/null +++ b/code/game/objects/effects/anomalies/anomalies_weather.dm @@ -0,0 +1,100 @@ +/obj/effect/anomaly/weather + name = "weather anomaly" + anomaly_core = /obj/item/assembly/signaler/anomaly/weather + lifespan = ANOMALY_COUNTDOWN_TIMER * 2.5 + + /// Chance per turf per second that we will produce thunder. Use the defines + var/thunder_chance = 0 + /// The type of weather this anomaly will produce. If unset, will be picked from select_weather() + var/datum/weather/weather_type + /// List of active weathers spawned by this anomaly + VAR_PRIVATE/list/active_weathers + +/obj/effect/anomaly/weather/Initialize(mapload, new_lifespan, drops_core, forced_anomaly_type = src.weather_type, forced_thunder_chance = src.thunder_chance) + . = ..() + + add_atom_colour(COLOR_MATRIX_INVERT, FIXED_COLOUR_PRIORITY) + + weather_type = forced_anomaly_type || select_weather() + thunder_chance = forced_thunder_chance + + active_weathers = list() + + var/telegraph = lifespan / 5 // 1/5th of the time is dedicated to telegraphing, to give people time to find and defuse it + var/end_dur = lifespan / 15 // then 1/15th of the time is dedicated to winding down + var/total_dur = lifespan - telegraph - end_dur + + var/list/affected_areas = list(impact_area) + var/list/num_turfs = length(impact_area.get_turfs_from_all_zlevels()) + for(var/spread_dir in GLOB.alldirs) + var/area/nearby = find_adjacent_impacted_area(spread_dir) + // prevents nearby the central hallway from basically always being included + if(isnull(nearby) || length(nearby.get_turfs_from_all_zlevels()) > num_turfs * 1.5) + continue + affected_areas |= nearby + + var/datum/weather/weather = SSweather.run_weather( + weather_datum_type = weather_type, + z_levels = z, + weather_data = list( + WEATHER_FORCED_AREAS = affected_areas, + WEATHER_FORCED_FLAGS = weather_type::weather_flags | WEATHER_INDOORS | WEATHER_THUNDER | WEATHER_STRICT_ALERT, + WEATHER_FORCED_THUNDER = thunder_chance, + WEATHER_FORCED_TELEGRAPH = telegraph, + WEATHER_FORCED_END = end_dur, + WEATHER_FORCED_DURATION = total_dur, + ) + ) + RegisterSignal(weather, COMSIG_QDELETING, PROC_REF(clear_ref)) + active_weathers += weather + +/obj/effect/anomaly/weather/proc/clear_ref(datum/weather/weather_datum) + SIGNAL_HANDLER + active_weathers -= weather_datum + UnregisterSignal(weather_datum, COMSIG_QDELETING) + +/obj/effect/anomaly/weather/proc/select_weather() + return pick( + /datum/weather/rain_storm, + /datum/weather/snow_storm, + /datum/weather/sand_storm, + ) + +/// steps outward from src to find an area that is not the impact_area. +/obj/effect/anomaly/weather/proc/find_adjacent_impacted_area(check_dir) + var/limit = 9 + var/turf/next_turf = get_step(src, check_dir) + while(next_turf.loc == impact_area && limit > 0) + next_turf = get_step(next_turf, check_dir) + if(isnull(next_turf)) + return null + limit -= 1 + + return next_turf.loc + +/obj/effect/anomaly/weather/anomalyNeutralize() + for(var/datum/weather/weather_datum as anything in active_weathers) + weather_datum?.wind_down() + return ..() + +/obj/effect/anomaly/weather/detonate() + playsound(src, 'sound/effects/magic/repulse.ogg', 100, TRUE) + for(var/atom/movable/repulsed in range(src, 5)) + if(repulsed == src || repulsed.anchored) + continue + var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(repulsed, src))) + repulsed.safe_throw_at(throwtarget, 6, 2, src, force = MOVE_FORCE_EXTREMELY_STRONG) + +/obj/effect/anomaly/weather/Destroy() + for(var/datum/weather/weather_datum as anything in active_weathers) + clear_ref(weather_datum) + return ..() + +/obj/effect/anomaly/weather/thundering + name = "thundering weather anomaly" + + thunder_chance = THUNDER_CHANCE_HIGH + // maybe we can put acid rain in this later? + // though it'd feel unfair if it showed up and immediately dumped acid on people. + // we would need an even longer telegraphing time for that + weather_type = /datum/weather/rain_storm diff --git a/code/modules/admin/verbs/adminweather.dm b/code/modules/admin/verbs/adminweather.dm index e5c77625b80..8721a1aabb2 100644 --- a/code/modules/admin/verbs/adminweather.dm +++ b/code/modules/admin/verbs/adminweather.dm @@ -28,9 +28,9 @@ ADMIN_VERB(run_weather, R_ADMIN|R_FUN, "Run Weather", "Triggers specific weather return var/list/area_choices = list() - if(!length(area_choices)) - for(var/area/area_type as anything in typesof(/area)) - area_choices[initial(area_type.type)] = area_type + for(var/area/area_instance as anything in GLOB.areas) + area_choices[area_instance.type] ||= list() + area_choices[area_instance.type] |= area_instance var/area/area_choice = tgui_input_list(user, "Select an area for weather to target", "Target Area", area_choices) if(!area_choice) @@ -72,10 +72,10 @@ ADMIN_VERB(run_weather, R_ADMIN|R_FUN, "Run Weather", "Triggers specific weather thunder_value = GLOB.thunder_chance_options[thunder_choice] var/list/weather_data = list( - area = area_choice, - weather_flags = weather_bitflags, - thunder_chance = thunder_value, - reagent = reagent_choice, + WEATHER_FORCED_AREAS = area_choice, + WEATHER_FORCED_FLAGS = weather_bitflags, + WEATHER_FORCED_THUNDER = thunder_value, + WEATHER_FORCED_REAGENT = reagent_choice, ) SSweather.run_weather(weather_choice, z_level, weather_data) diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index 44ba487bccd..d6d28df30d5 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -15,7 +15,8 @@ /obj/effect/anomaly/hallucination = /obj/item/clothing/suit/armor/reactive/hallucinating, /obj/effect/anomaly/dimensional = /obj/item/clothing/suit/armor/reactive/barricade, /obj/effect/anomaly/ectoplasm = /obj/item/clothing/suit/armor/reactive/ectoplasm, - ) + /obj/effect/anomaly/weather = /obj/item/clothing/suit/armor/reactive/weather, + ) if(istype(tool, /obj/item/assembly/signaler/anomaly)) var/obj/item/assembly/signaler/anomaly/anomaly = tool @@ -496,3 +497,76 @@ /obj/item/clothing/suit/armor/reactive/ectoplasm/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) owner.reagents?.add_reagent(/datum/reagent/inverse/helgrasp, 20) + +/obj/item/clothing/suit/armor/reactive/weather + name = "reactive weather armor" + desc = "An experimental suit of armor that manipulates the weather around the wearer when in danger." + emp_message = span_warning("The reactive armor's weather control unit sputters and groans...") + cooldown_message = span_danger("The reactive weather system is still recharging! It fails to activate!") + reactivearmor_cooldown_duration = 30 SECONDS + +/obj/item/clothing/suit/armor/reactive/weather/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + owner.visible_message(span_danger("The reactive armor alters the weather around [owner], shielding [owner.p_them()] from [attack_text]!")) + playsound(src, 'sound/effects/magic/lightningshock.ogg', 33, TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) + + var/datum/effect_system/steam_spread/steam = new() + steam.set_up(10, FALSE, owner.loc) + steam.start() + + var/list/affected_turfs = list() + for(var/mob/living/attacker in oview(2, owner)) + attacker.adjust_wet_stacks(5) + attacker.extinguish_mob() + if((attacker.loc in affected_turfs) || !isopenturf(attacker.loc)) + continue + + for(var/turf/open/to_affect in view(1, attacker.loc)) + affected_turfs += to_affect + + shock_turf_windup(attacker.loc) + + reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration + return TRUE + +/obj/item/clothing/suit/armor/reactive/weather/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text, final_block_chance, damage, attack_type) + owner.visible_message(span_danger("The reactive armor malfunctions, calling down a storm upon [owner.p_them()]!")) + playsound(src, 'sound/effects/magic/lightningshock.ogg', 33, TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) + + var/datum/effect_system/steam_spread/steam = new() + steam.set_up(2, FALSE, owner.loc) + steam.start() + + owner.adjust_wet_stacks(10) + owner.extinguish_mob() + if(!isopenturf(owner.loc)) + return + shock_turf_windup(owner.loc) + +/obj/item/clothing/suit/armor/reactive/weather/proc/shock_turf_windup(turf/target) + new /obj/effect/temp_visual/telegraphing/thunderbolt(target) + addtimer(CALLBACK(src, PROC_REF(shock_turf), target), 1 SECONDS) + +/obj/item/clothing/suit/armor/reactive/weather/proc/shock_turf(turf/target) + playsound(target, 'sound/effects/magic/lightningbolt.ogg', 66, TRUE) + new /obj/effect/temp_visual/thunderbolt(target) + for(var/turf/open/adjacent_turf in oview(1, target)) + new /obj/effect/temp_visual/electricity(adjacent_turf) + + for(var/mob/living/hit_mob in target) + if(hit_mob == loc) // avoid hitting the wearer + continue + to_chat(hit_mob, span_userdanger("You've been struck by lightning!")) + hit_mob.electrocute_act(30, src, flags = SHOCK_TESLA|SHOCK_NOSTUN) + hit_mob.Knockdown(2.5 SECONDS, 10 SECONDS) + + for(var/mob/living/nearby_target in oview(1, target)) + if(nearby_target == loc) // avoid hitting the wearer + continue + to_chat(nearby_target, span_userdanger("You've been struck by an arc of lightning!")) + nearby_target.electrocute_act(10, src, flags = SHOCK_TESLA|SHOCK_NOSTUN) + + for(var/obj/hit_thing in target) + hit_thing.take_damage(20, BURN, ENERGY, FALSE) + + for(var/obj/nearby_thing in oview(1, target)) + nearby_thing.take_damage(5, BURN, ENERGY, FALSE) diff --git a/code/modules/events/anomaly/_anomaly.dm b/code/modules/events/anomaly/_anomaly.dm index 4d1916158f2..2f55338c3d6 100644 --- a/code/modules/events/anomaly/_anomaly.dm +++ b/code/modules/events/anomaly/_anomaly.dm @@ -40,11 +40,14 @@ var/newAnomaly if(anomaly_turf) - newAnomaly = new anomaly_path(anomaly_turf) + newAnomaly = make_anomaly(anomaly_turf) if (newAnomaly) apply_anomaly_properties(newAnomaly) announce_to_ghosts(newAnomaly) +/datum/round_event/anomaly/proc/make_anomaly(turf/anomaly_turf) + return new anomaly_path(anomaly_turf) + /// Make any further post-creation modifications to the anomaly /datum/round_event/anomaly/proc/apply_anomaly_properties(obj/effect/anomaly/new_anomaly) return @@ -54,4 +57,3 @@ /datum/event_admin_setup/set_location/anomaly/apply_to_event(datum/round_event/anomaly/event) event.spawn_location = chosen_turf - diff --git a/code/modules/events/anomaly/anomaly_weather.dm b/code/modules/events/anomaly/anomaly_weather.dm new file mode 100644 index 00000000000..3ce303cf3df --- /dev/null +++ b/code/modules/events/anomaly/anomaly_weather.dm @@ -0,0 +1,77 @@ +/datum/round_event_control/anomaly/anomaly_weather + name = "Anomaly: Weather" + typepath = /datum/round_event/anomaly/anomaly_weather + + max_occurrences = 2 + weight = 10 + description = "This anomaly causes weather effects to manifest indoors. \ + It can be cause completely harmless weather like light rain, or something which could harm unprotected individuals like snowstorms. \ + Note, triggering multiple at once will likely break weather sound effects." + min_wizard_trigger_potency = 0 + max_wizard_trigger_potency = 5 + admin_setup = list( + /datum/event_admin_setup/set_location/anomaly, + /datum/event_admin_setup/listed_options/weather_anomaly, + /datum/event_admin_setup/listed_options/weather_thunder, + ) + +/datum/round_event_control/anomaly/anomaly_weather/can_spawn_event(players_amt, allow_magic = FALSE) + // weathers have some funky global state that may break if multiple are running. better safe than sorry. + return ..() && !length(SSweather.processing) + +/datum/round_event/anomaly/anomaly_weather + start_when = ANOMALY_START_HARMFUL_TIME + announce_when = ANOMALY_ANNOUNCE_HARMFUL_TIME + anomaly_path = /obj/effect/anomaly/weather + + var/forced_weather_type = null + var/forced_thunder_chance = null + +/datum/round_event/anomaly/anomaly_weather/announce(fake) + if(isnull(impact_area)) + impact_area = placer.findValidArea() + priority_announce("Barometric anomaly detected on [ANOMALY_ANNOUNCE_HARMFUL_TEXT] [impact_area.name].", "Anomaly Alert") + +/datum/round_event/anomaly/anomaly_weather/make_anomaly(turf/anomaly_turf) + return new anomaly_path(anomaly_turf, null, null, forced_weather_type, forced_thunder_chance) + +/datum/round_event_control/anomaly/anomaly_weather/thundering + name = "Anomaly: Thundering Weather" + typepath = /datum/round_event/anomaly/anomaly_weather/thundering + + max_occurrences = 1 + weight = 5 + description = "This anomaly causes more hazardous weather effects to manifest indoors, like thunderstorms with frequent lightning strikes. \ + This version will trigger lightning strikes which can cause decent damage to people and equipment alike." + min_wizard_trigger_potency = 2 + max_wizard_trigger_potency = 7 + +/datum/round_event/anomaly/anomaly_weather/thundering + start_when = ANOMALY_START_DANGEROUS_TIME + announce_when = ANOMALY_ANNOUNCE_DANGEROUS_TIME + anomaly_path = /obj/effect/anomaly/weather/thundering + +/datum/round_event/anomaly/anomaly_weather/thundering/announce(fake) + if(isnull(impact_area)) + impact_area = placer.findValidArea() + priority_announce("Severe barometric anomaly detected on [ANOMALY_ANNOUNCE_DANGEROUS_TEXT] [impact_area.name].", "Anomaly Alert") + +/datum/event_admin_setup/listed_options/weather_anomaly + input_text = "Weather type? Be very careful with the dangerous ones!" + normal_run_option = "Default" + +/datum/event_admin_setup/listed_options/weather_anomaly/get_list() + return valid_subtypesof(/datum/weather) + +/datum/event_admin_setup/listed_options/weather_anomaly/apply_to_event(datum/round_event/anomaly/anomaly_weather/event) + event.forced_weather_type = chosen + +/datum/event_admin_setup/listed_options/weather_thunder + input_text = "Thunder chance? Be careful with high values!" + normal_run_option = "Default" + +/datum/event_admin_setup/listed_options/weather_thunder/get_list() + return GLOB.thunder_chance_options.Copy() + +/datum/event_admin_setup/listed_options/weather_thunder/apply_to_event(datum/round_event/anomaly/anomaly_weather/event) + event.forced_thunder_chance = GLOB.thunder_chance_options[chosen] diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 4fb1f734741..869d30b2fdc 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -150,6 +150,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) SSpoints_of_interest.make_point_of_interest(src) ADD_TRAIT(src, TRAIT_HEAR_THROUGH_DARKNESS, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_GOOD_HEARING, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_DETECT_STORM, INNATE_TRAIT) /mob/dead/observer/get_photo_description(obj/item/camera/camera) if(!invisibility || camera.see_ghosts) diff --git a/code/modules/research/anomaly/anomaly_core.dm b/code/modules/research/anomaly/anomaly_core.dm index 16a9277c26e..a9d3b7f4d71 100644 --- a/code/modules/research/anomaly/anomaly_core.dm +++ b/code/modules/research/anomaly/anomaly_core.dm @@ -94,3 +94,9 @@ desc = "The neutralized core of an ectoplasmic anomaly. When you hold it close, you can hear faint murmuring from inside. It'd probably be valuable for research." icon_state = "dimensional_core" anomaly_type = /obj/effect/anomaly/ectoplasm + +/obj/item/assembly/signaler/anomaly/weather + name = "\improper weather anomaly core" + desc = "The neutralized core of a weather anomaly. The sound of thunder can be heard in the distance. It'd probably be valuable for research." + icon_state = "weather_core" + anomaly_type = /obj/effect/anomaly/weather diff --git a/code/modules/research/anomaly/raw_anomaly.dm b/code/modules/research/anomaly/raw_anomaly.dm index d86ed1f1d9d..e33a3adca3e 100644 --- a/code/modules/research/anomaly/raw_anomaly.dm +++ b/code/modules/research/anomaly/raw_anomaly.dm @@ -74,6 +74,12 @@ anomaly_type = /obj/item/assembly/signaler/anomaly/ectoplasm icon_state = "rawcore_dimensional" +/obj/item/raw_anomaly_core/weather + name = "raw weather core" + desc = "The raw core of a weather anomaly. It makes you wish for a rainy day." + anomaly_type = /obj/item/assembly/signaler/anomaly/weather + icon_state = "rawcore_weather" + /obj/item/raw_anomaly_core/random/Initialize(mapload) . = ..() var/path = pick(subtypesof(/obj/item/raw_anomaly_core)) diff --git a/icons/obj/devices/new_assemblies.dmi b/icons/obj/devices/new_assemblies.dmi index f80f89ce20a09f44f03487f52590fd6961711ed6..55ac60442c86fdd046005d260b5487ca4c7e3aee 100644 GIT binary patch literal 29183 zcmb@t1ymeOyDo}5f#6OE5C{Yd?gRn^cL)$9xJwAmFj#O&(BSUw&IEUN2=4AM=-lS} z_g?$I=k9aQzH8lCJ<~PS)z#J2uRQNlZ-*!=N@HV?VZgz`Vat5_s0s%MpYi-fLjh_I zd8)PH;1CQw)IWd!XzFDA&C=n!rM(>-oLfq1!l2!{7_Q_jlv$^rNK)v%JdcgkM_QtO zw$G-`6>@t)8cSlo%hQop`Fu9sU%$xlR9Y#rs$Y!SA3a#PYSw8j&8DnkFrQWx7FEa^ zPpeWc$W0o}Qt^!?UW4|cq7}sN(~KL6Qe~+~9Zst%WRC~7ub#Q)GR=c}M3Alfx9g{? zEn+hR{dJ0N-MqhIn;gHdLqR+lr@O-?Ry6Nh!U(xq%0(-gJlkp_lT2 zSz=!og}=;+`G80Y|NiHPNbW63#53J`umM^3QQKPF)uJ5z=MYx#|9 zU0B^Rv2W7WKBc=XmkZB#neTNqy$kr+j@k$8N&@qn!dpZ&M2Bm#ZxPAsuSiG+W}2Aj zD_+{P%Pw=ERx~cuW2dEN6PPlQ{-mL0Q0w;z;gs2LpxJyl`1m=Tc%!@aBuFD^*f13y z6#N5Isdv(%tAQa|uch3ILi=aJ+2)=WKC3fNg*6{VxpNf?F`58@c;e|}c71xQr`CrY zd>gtrRF~Eb^`Fa*-vaec_y}`cQ&Km49(y%9FC$|s?#0OO;W8f`jOOwqITSC6KN%d z<}i(TwG5f9fq!urkfKB?pY_X=p~Vjyx5C5C>QJ$IxG&>s^WE+;vVIjxNqHdA-)sba z!M*EBH!g(}j^SgD;pW5<(5tY&PbNn%#X0^&mO7zOY@;u#_hfs33<{?g1@3T?tI-_a zRsPzBgL?%h^YMeaTgu^*rx(FhBlK+a@X*eV9Dzm)O{T#Z{sS&SVMCp2tp>l?OUx~! z3gH4m!m!ea>(5H#MWW@lh4~r>x!1dueK=R@y8GpO3Z(=zQXgNv3K0{>d)2?4wv@U; zUEMrSm&`24iSE8!uBCrJd>C#1`|()l;!&iUQ})9LcyTnEfO#9uavxmr;7l33pSa>^ za-R_J#L>Q@%ZLF7-_f9d0-Dg%!K2dzR0Pnyq6xr_|A|BwfSa`v&jwL!-rL630Y8=g zbKvoMfSHY%p_pk`2~TxX7EK(DgRjH@tY*Ogn^MyysNUGwTFQW*nw|X-Pfyo?#wz#8 z;q0(l>Bgg#4nE`q?L(*Q?YaGrc-UH;!H)$^FUBA2op)Efmf2NR5)f)p9V;vF=wR~) zIT?lg%|05byqxi=IWe0rLcj(4`YDzAe@Sd^M&=ite=LvrxwIQc^qQ8B?KJBwQ_6@LjiJ9u4@&oV8ygr3~F0}VMQ>OPD(AX>S71!gIGn4jjZzgT^d?k1ErR@K$@ z(QKsA=jvdlZz?@F>2wo6#j0*WXV#mw^%XJP)dfiYVN`{pWrwegV+ZbZ2TZjl4f@3V zJYv<$DAAu*ZzM|G2hy`R2gs!c+C3s=dby1 zi{UL0%Zh^lIlvNFZfbp4-|_G?SW}sd#;Ku(N6r_UDTm0!y!`1-Bm`R-K)~GKeK_Y0 zUCjBs<~*`W@TI+r^e*O&Qakbw25M(5d~94!1@CvB0Ft9DLrPK%;#H2b|Nk!kvXM6tOqELh@Zp9NHd`z&$1!pxF}zyXIvH zS^1^0NYhtxQ~_SmXBrrAv)}XvcF+!k6}y|yDw;iMsW7fqcIzL=qp*4-jdR~WXkyV( zZxLh)^dhPa*RdiM5AMHf)j)evvS&eNz59^SNLww`{jd+b2t{sJd?~2i!-^#&fv6j> zCpUaM%yn0jX&1EjPJ$GoIif_SVFPGRfpK(NX&7eobyM`dD*VqGW(Du+oCF)<^a$fZ%R2q$Dgy&#(B?lRT z;J`y+BlC~ehJ0|v^8<9b+W+5FwF58OCjeLcv-tlP{r(@EbO>@kJKvhMq*a@kJHKE+ zol1oc>6H84!H7F7fRRn@X$~m~*Gh_@67>x>(_HEUN^~*ipNx8RKei*7^3?S3T~ossPXg@v9wHJUbvBr#e_%^0!L@hqjJ$PlE* zsnlo${V>C?u90RqJxgSr@N~j6S!J(v5Emnu28>fxb#jys9eWA}8;C2eL66B(_F7fz zpw=q;l1u;Q4MLAn*k+k_9;N$}#vtBuHgkeCxq*iyURg*WeT3oP9GTR3Y7vJ&Q&)3d zTN(@Pmt1gZp2zd>)2K6L!;^4t(h6R|N_nyM>VbiY)4t*~O)FTPoyttdFrrLuYbOR;f%DWGYU%O^j;2)XU>u)20Uq& zar6|3E@N(8>0@T&2tSLEyAaj-`i2Au`|`=<(4x@tpwh)Qt!}FDn*cZMrKeUoHxs`z zF(-Y6{!W@m|3a;M(l7LhqL<3r9%MTvCg1OqKyeIrm%OxZGFJZ@Sp^y1D>lhcYKvJ( zq1-nTQ4oSKT=JT9$}`I1rI{nAVK88d;C`mbbV+lD-*%q76F&Fah1pRmOShR<8=j*t zfE{1#Pn<#Ps9v|u-68tMPGQMLQqVED8Z}GP;{5@xt^;b#S1U>R8=|feFU_eQRYC@z zo0C^vUVv+1kc2inyGgNY4P)8V7>` z6Jla!dIfFjK{1vNFxowJ6O#YUMbCAvk`USJ*@!5(vDW@bRG!L8L&LGYVHh<{Su7>i z-bE~gzMitjS@4eS+0|HR8{D+&DYln7AMH$FeuGyQUFq$DQFOO^MsAQ_u)~4N1UsVc zT!>uNDX3bbLv{>0LgS2YC!00CxTwhPp4GE~dfLH{$X9)!z;12A(CYV0jvmF(Kl!a5 zsfm-X*AIygUCkn^Jefi2Z}zg^OB}6kglw3qM8!oXz2qP=+(#?e=%a18z)9mWotbx7 z14K~<@Qy`MllEg_WXkNfTwY@opTzG^BlzbFh9DPz(z-g~BJJ(<{L z@M2=sF^88ve|GqT2?n!;FNj1CJhtKzvYp6yYLrCw%ifT^iVb*GW^YX`X=#ivA(Pp# zuozF_;}0YAa=d%ZhduEt_3Rb;r;qbuWbg_kUpFRSWJfmkb9`Z^W#`s&ixt(bv1=b6 z3m525x)5*be`v{SZGzi#c_6ITbp@x{FtkM;TQBHIjPo=D>)sT&igiG&6#p@lqa7*4Cq5Y@B zvVe3J3L%LywkCP8(P@S4Mprnq4qCARlE+^h4seF=4ZWo)To38JdiB@4kM2&`M3$c% zDR3h~7^~MWHK8LJ`Ll_YB1RTyC$2Ft%?X}ia_DkmViD6|pnUbXM#UhWQn_m<_(x zX8t`3G&Ok@tuOfFB=ulC%cLJ|hTMz8E#&;k3g-h$h{=qIW{Xc>4 zf1cD~cZGpP1o)BwySCWqq!9@mJCTDE4@M8^yFlDWTHc(4AOAZ~*6GT%CRqPz=rig# z_a3?UWqP=e$6E&1mOYM(bGtDf%V{`*S!lCY#GyqAJxC(>Dde{gkAZuf3%fA3&rX`B ziF#9TH+V7RrPY*07uM8$$L(Co+JQZ})%doDVUO#uT z7whxvQ{n|Q6!XmjyifM2$!n|kSj}V&TStUJ(a#-LySQmmY{lp1J1R;^)tAp}xp(B$ zhRENAU1HPR6>FKd=jNCx8=UN2&Ml!rAkV$M?#4L&R07xsT#Yy23^mosc`fxmz+XRI zJ&C@4`t3foq$^Ph!P;s&yG|$%z4H_pGlo2F71yW@#_L?e>ikp|n`XH)0s^{%qomk5 zHSM(>W64t%(1{vH6Gi+7&c78gDFwvGQSh7Gd0h1<@3ToX+7Bs2atQT^g@L*Sw-p|5 zdJ0YDY5_Y%-lQ*Od!SFBajBA+6E%QU>mLPJGD*-6KtW#jAQTk6i}Gk$E+{XzzVSSj zpc2CDKNPo@wGwz+xR*!md^7Xhd8<7gq-nY;wKA>}HF{I4o=NLBZf7uLu^8$5x*KT% z2&%$}>FrRIC^{^V5KW7k-6k&eFwFTY!PTE=4~^H$qqCqoLf?JM)D)0i0c=ob)Heh7 ztu6Q)8VaUINkA&h-xwhzv3K<3Q%1htdDH9A9{%nT`G@pv4FAEb%;~O+_?F0|k-iuE zw-R(25A>t2rVU>!{RMwT8n{q=qRq(sYmj4)HV#h3`*(Y_=yivhpOkrOp({As5{Gru z-hAhgT4wp$H1O=l_F0^Ujhq5HrAD2n`WGK>*^nUbVNQMN&VaAD}K%q z+RUny|8TVQ-2TAr)gLkP%uYFD6_(%p{Q2_}U>`4@)e}F@KqNGZJ~L>Rpm`nJASz=j z97`23f905&iHpTfEASimR~t=NVhA6ymWK9-bGp{)x7C}n?Rf*x)pWrq2jp(Qc%aI3 z(BnZrXx>jc7O)j~LPvEQRlbG=H^k4Hpwxu~=u-P&4Jf@cm{QucDYPCi7NtxMIkxd- zp{-(!K zXT)`RhCQ|!vOYi&j{Bx7P=7^AFIM@#{4l}WWk~n05O*`O;Quw?{ZGCB4-|cQ_uPIw z?yc6lztJrYMENdWefjn$4gLF9FMEQo@88k>SFHTMoccctusiU+$=UrAZd?POW-c~+qUf`x$f8>Wawu{aD^-)$Y%@3OrTTQzX}C+CHC#wZef`w!N>WcH z5jXX(h+)JJ|Jjc6qklki)cl2yiGl+d*x>5Wl+WyLz-<`eCVuPgVEHz++*-ZX<(GLb zGAM&4j)kXI_PK%HeeIp%5mY%Za>Pht4-_AR`~Oo6(n$1I+m2CBOBRizp%3l9rzc2G zy|1g&Ej7#igGHW43~#?PlB!wm$L{m5xTr$66+t|>eaBq%KJhyB#7mlkcBT~4q=pH` z@>ti!NyGzZxNT=X=qpH+H9K8o%(DVch9slys?`3fq4RdS+}pH&q^IOfdn$&u3e5nhotvAC$<7n|(@2 z{1fn&UmmKhn7Un$R4uCD%@lUKe1bo?fZ}J9|c-DX`zhikf~5Oj!hVP99sND`W}y|=e_eH zOl$MqS54J|f&#76XKs_1~{jzBC^m&Mw`rP%_^I&dX%x)-_ zLqi*JO?ptk8(z6`a_k(|Mg{kpVAa)x{1F`rp_Yti$WRk(;FJPAUY57QDzls1un6RJek7RxC2M7 z2pPh6_`u)xY@FY9WYtRsIi{m_1I#aCnvX>$*QJuT&_CtP2iCPipOWJUqNAhx=949+ zRiP4w+AnM;K{A}tjFqeM?A7^Qz%wu8{~|HL2Wr+lWMw#N!GbFT-@}qTP%`kcXZ8I0 zQN`w=pw_iuZd1xMuT2hp@FQVaqZxlWrpRzsK|-=7yf=XH=@Z>U|6`$+ew%n1d^dHW_r_<|0Nj0we;orJEUS0*CKJvh4yy{nd`2wbG|h(HLhY@2wy z(tLZJ^Kwk`-2I~YAOeE-L5)TB2@#3+8?_Xfs7Fg0>*ED5FO8;;WEMr!v%@>c-6)YHv2!0|8@~Sa z=+)DEx-X#5$ZWYteYUUtnC3Eg`yKOj3PZ9OTU%RvsUyL*#fif7W~Ln>CR*()i6TP2 z;WdsF?%P4zsUh1J`z!oSwrUo?s?P2`^ooviXlNu7o+^;3i7K$c`!Qwl<5(Ub9Y?A(mGzGi$`GwZs`+}+UN z%ooJb8Tb0Vay|=1o806WA+m_n=)boQ_?g!>H^dT?QGg5(AY@mG8C`;4C{yV|5!a_+ zmwR4%c=T~OGX~`1XnCcfG`#9}NFqA zZ9&_nxpgH;pG5t?=HS_ea=y?ZZ_h{t=es#}im5E*)e#`C+?-#!v~VOKs76;;MkLC( zcdv~p9XH(rq>L$)QB0Kdb>B^^(3G?{Vo~-YgavT^AJehAKjN3|MHuK3H8*n(VBt3` zNsLq_k0)6n&Zg3;BX*o1E+_`VflRW6pB$oSDV{@@aXHOp$EhM+Ti3SnRPXUgUPyD= zv)(+5_@m&bQiZ!jw}@#Ak#Z6Gxy}OlXF~7NPXqmrtT6rG!krP}>|(Zm(8YKNDY}-T zI6&wBFGPN<2U&lpoW@TGnhWryV~9N!uCU1N33Aev<3j56$upZAqYGBW2xI zkJ_{P*M!d=EP!OnME$+nzgWiqTpQ35$3;}NKasYds;@1LWJAfjSq7(*+Y1!iom#(@ z5d*yvq<0cN>qEp%KvHmC4ekbC(kfHVy&wHxeeSTB=OwWr3XRiV60zU<@%9HFIaU!8 z7cSl(e9@JO>#&uu?LwsFq80qkovoSVtzAZ)njW3lxvz}L$Kz}lWtN%A_Tz?!M?wBZ z#HAAR6_rQZ22l?vM`uCL`lhxXmPRVfG~eKut*N0wcn7-LpVpC;#fTEQE1bL4FHaHrq&)#e&+t1+P;Q_JBj-eyR%?el)^039$sH}J&nFJ8k2qnTywS{np zUQg(GI7)CC4@WQ>^Z8-M&WT~2u*?q^u8&_*IO?gX`a1Ca$FpMq-Use8p7Zqz{6|PmQz%G5h1(m2?MFBsy3Wx{~Uteyt}D4Rx`9oro0+ulsB&9TiCB z|Fj{UTuc2Z-Bu{mcc{{zy#kYC)U*L^O6dNepm(=eGK|PlMn(p}G;p{!_A6~mu{W=i z&QMJesxAwr^88i?0V`$+*zohv&dsvsQD}pN${~AAFSS&$Xh<|WUg>p!cU|TRY7+le z2W4I35)8}6~C9XYb<`%ne^jP zK%TfuXAP79sZ6wQ`7l4NRc$f;dU%(PARN3_4j#Vug=)2)q1az@K4r*@87`^pnG&au za?ifoxtcXV7kc_-T_hdgO+0=vnV*KUIFd@8pC&jv289SYB+arlj#WX|hGen2QALiX z4~(z$v^;U#l#Q;*t&Es?%grmj33dvq!_o*aYPwv)Cf z1kMvP&pH!RNdy#6eu(CoN20v4dupsX zSSJ(0m@acrZP6=4QS=b1?g}m!W27q9*iN#i(@mb8({!3)XWoh5N^dG?oG zyB)zwCtv)?hLGt5$#Zy$Af(&#I*wT zMqB)Ln0zx#J=R)T(;i&BfqKLQ6`TxW`1y+`l6LfAtR+czHLN?nJL*qK*O*55=|^IN zGu@KAs-pSq=+5*yYF{00gra@+qnS!u%?FD;N2JRxTAU2-nJjMiOEwfM@5jrz-$=of zJxb{w`sqx2Qe4u=h+73UlQOs{)0t_|+xR->cSvpi0V}9H-0D&9zun(_-wH9H;u{9Q z8J?Sg*U>CT#fbTL_t&~Rto!ABb1=wk{@kyqZ;yniEP@B)z@W~Mf=+v1F~>w{XGe!7 z+pTw>n%v}RH{bOEnwFJ@bcZjhgI=-owxNOU(c{b4ghUm)MWo%@-vGoyF4Lxxh0COr zTD?-R|JW$T2Nx+@+e`hz7I93;Z;T2&*TtF5b?PZW3&94vLzX=8jMOX_o`y)J!}My( zmP`W|T4BC>$`8w&k(0VWxG`yjT?3V32u#rTP}v(M#6{^a^%x?HQ~%g7lA@vJKoy1R z!&}}aP;)q3T%K1^f$Ouqz5Rg@vV%0G9#pkQ^*Dg&%LYb?daAvP$xK~!Eqlak#(1K- zGk4Mi4L`Y34d6AFzu8&SO!DbPV2cI zdPUy24q^KaQYF6n`JE+f@FDji;P((E)*^a(3#R}8Wi=%O*74(TE;Ie>#NWU2z-O0(g=P4Zj^GF?{N@#GJnC|ARoYFlSa{q8 z;m>|KAem)HE0p)2VSl6+#rObkkV)AByAYRPL(Xw$$}H4`>{|W??Ae{`&ob?@^iZm` zl{-?cAPv7(XQdd_$yyYEUV`5 z2!h?;w|xd_X%}x`zLa4{4^RRllO}qFhXNOwND>-Tj+mLqSn;Q~Yw)Hwl745Qv#Yyj zwnQ^AkgY1`BHK>BG@lAM+C@D_!G;SM5L4LFQX(z~DW2GVE{RNdW##%h_-}?%Z~^B* zR<>D}76t}Jlh?Nlua}MmRUY@clm=*yE(bi%xfQrlq_OpzL_o>}^#6{r{&)Eo{|%?~ zeNc~AJYYNR$O&x(vUCtjR z44&jcpsD3|ub1{r$ zP$zqj_pLs!$j5qQP)Xy2G<`7K_^vb!Q#zmHV(g`he!VxJves%r?6038$KVI-qj>|b zs8nj=3u@Pr9qA~c?i5S>zUH$J-VTe?pyL=s52PBv-P-m?(|=LX8HlEr`&?lNuN50# zW!R2D#G+#YB@kox_Wu0vKtlk2MULSd^6=nwWL;m9*`GQ(Yo{$y=Sie+>{Yc?-8UMw zT>4(%8*?ItVzceCv1{#@y6XcjgYUu#Wjf+L#H0DQSqJ?O>o(iME?St1&BLW8QlQ1= zIC;YSCH@;;(b6`2lcKH5`hzt&(OoDO};<)4(W-C ze`wz>qyFkN8&!e4kVjAB`iMq|oZsvnFsUcnL24oGEKMRW0=KF6QAI_i02^13b*X_a zmSXh5)BaN5{SnXW1;dvoa{9* zgRK57KQ@yJoFCi2Xjd^wYr;ts zwmJ|zAO6WV4hky&B;^=R-o+v1Z{20}3TEk)78NnoOrkE-4u^sXPt8_u=D*rjuj}5z zs4Xs=keF68Kwq1t0qN7ib)B$x@M7Ru_xUQOX6X1%`M{21{xhy?6@AiKXlQ80(^4Js zXxrjdSoYR;L^2EuvUGw3pBuHBnLlQr9ktWD_VT@Q{v|_YFLJj>0_tJ}1NtYa@~1D3 z^g1!b!w0hl#vdQ3O7vR=YO*N>UEU#s3p+s}VWT4VSU$x1ZZuY?63^>aa7@h1jhoSO zjBe$~H}tGe=LwLXsi_JwmQ2X5<(ylq)B^`?Ky zApbVjHRUU(CFMVPK30gjhE*SH_XY_h!4VQa%>37xedk=r3w+`8mWb+Jpmd+~>`xch zh9!(x)*mKUtM(yOndP3=mkMT+9Wbwa!R444(3az`*>QS0?~uqlcJl9Mpe?o?I9dUp z!@;f|oA0h}?u3xd&GfQ1YIJ++#sw5T6H7O040`JbpGR6lSYNiWK~81bU3&2QDYwzf zt20|3Hu0AgUyTc^yXj-EWxb+p_GaWqmDLS@RGJxhgIfeyKScTu_V@>I&DfIT2G*av z2(RN3GU<9d8@1(&)=(B>{Rce@GWbe?-eV#;U(|# z6jRCW(3PY>)A>jyE_$!&>FIUA`{C=lad4$iFjoS35wWhOk9Ps%J@lD0pA&wIfIQTn z6w|T8P!){tVrAwYN>^))FY4>8vu{64Ue1!eT-hTFtWX6%`v=fF+uJ~oS zx9@Pi@g`<8ZY8BNToy3+W>7Z398op)l$S@UaWbfZju$ayCXFEz;1EMXF*?D9>%*9Ho^}F%}*oPg`ycPZ3E=8!lFFq=ot`>8+sDbmoV0nCYQ2rhq61 zn$cD7Q-`p88b{3I4|5)}11E&{)vT2cYvL}4bMU*;_Z%D?nY}eNT%E2R62jheM|n%f z-i=O+jBCyzo8Mbm&juiuJ8kF4Zcp|{2YB~UQlj1!tQ^M_t*n(du}^=e-o0QjY$iJgoI@FPLbkcDTyb(eH$AW@6+j|a%n+)tZ*=2J^9(dNXua#GDUVH0}nLAmjxI^L7 z2Ifg#8Pw>E^z_|R>kod&sk|-@7_#fh_IH*)9*7%11U^Aovj)&B$?z4p ztV>nHx~)gs`_iHwawD0}+Wj0@+5#~0r8Q1_s*$85vOVO{MSVmZBkh<{hHK-~!}9Hj z-pXWNIF-NgH?#a5Kf!MN?p`cGNNa%LX zxTgzpBEkZiFsZr7pNNeoEt0EwgFSnICoRW!`$U!I#V!DY0e+Lk<%>tx4ijdW`*}YD zHV78v@lX~3#$k-M@W$yI`YhZCJL9bZvKI#cAN~7k*g12H`e~c=*;cZ7x7Cg&Z0ud2 z^$j(3T^}vRJ;&^8lS&`V4!wYGBKNJWZevFi@u027dg~w0IDr2Vy1q1;33Dy()zRtc z2AR=N*`AjLhY*!0U-}*y5=(AoWTw2#(f?MN#ea7mhte+c%vuEQlSP z6JR3IA`Gvp5AZa>jm`zVCl&*{99|xW7r~>sN+iQ;dMIyR1?uZ{?1n|kdX4Lj3Okio zxh%CV939YVJ*InZFN;959tAM%GN$PR8uP%GcKN2N2^Dp$Gyy;gq)F4{&LRg^O;Z5- z>=o})K}0f0v1{kW$wF^={lj`m8Rln711zjjQCLfz*)W;f@`3MrWb**;B^--aKzFxg zkiDMZA1c`~NGN>hSr+MXe)YGha&H4a{(H_es<)Xc@-aCRlE2G#M1zb?_*f|CJZj*!*l)(gP;i zGWPplEz;*W^F69SIO*9pFb;yM6~P!?^ZiHIX$R*4OxSGP$;{-(!a)>uNP`z6*?+;- zwI{)3=mLv%pUdbvPy}|bMMYOCR4S}XbSsPJyjvXg2TiTZwgS0_y>62Y%+I^k8ow%V z;1q~cE7cK(`LSaH2GLwR6z$!OXXWFC?Fmt zcC~uldt`!K*5c+)daoJhU>C$SSFi`NBY;Lz}mg4bO*)5Er}rcJ1$h)*8;MUKTfh_vMK6Mz+*+v>mz;Mg)1o2J>sa9hW!? z)p**~?*HMhTpg+d)uUTH2Oh~YjFTkfnNRNhYF@T|n?);UTFx4j?031C=W` z1|=djee6QZlmjHBLsOU5FOGt{a~b@i?%-bHU5d-B|FL=3VFM=uxy#UgU3 zmc*GAu!nMuUC!3HdE8k)hLvaeDs`&q$RBZxC3#sWh*(9zvv?Dv2a^4OUZ?3l5A*4f z0q5thX`Zd?6H#}cXS{4qbc^-*OM)_hgbU{FhF6=^6cfQEz6UCr)41+|<=TX}6L% zLtkQsxya0n!N~LYa-m+ZjVI}h&_~RM+z>OI&DPiX)fjA)%e!1egj8D_SYPM9#7_$! zdgF|Kv5!ZYza&r>5gm_&ff4lLu)C0Hhys(tOLMur%GOJAOW^hvnQ$XHku z*Hgz9@Z_xJ-km90SURp-Yn-}Agsc!2%KcVLK&vVO1o96~c)CD@S$E*R&zo+=7$a$C zv1+5vAV1Ml9oltI?oa7l5mL$c(iB{UmB7Zgo-w|iLx^1NvVG>6>f_hnyHAItn!sMn zdbW1*g!bpkbp=ny<#DNAS;YejE~?iD-NNvu89Aw*(8bm>D2DsR@yfaFfD->((XGuV zmX+;OUyOY+!XhQlxktOpd`}mM?y7Zx+T88k3iPlb%+|hib@kU8h0yyHplE2XLb(;^ z!lX1+d9Qbo@0r8;)#e{#r1el-3M+>uoIS#p!VyZR%Wq&z<^G;G-pL!KijnmKjjkv4 z{OYQ{y~PeqJ)O;@<0r5aGXm(o4xvliEpI5fUW-nXpVC3lh2^7zK8xN56-&zAq{9?G zz20V0^BI_@uzx+o0S9;xCg8O+&JbP;Y#{p4)+TL#dA-L621rEAux$JsOm9&NL7f+3 z65%~>HDD?8M`Q{tJOeir9pNh`$D7M^eq+gIkLn2MTY%LBP9W=GlkY5>PB5)W&&K>Bzk^rCunXCD5d0f5#-u zeJmBm z}NM%$jNqP9UJBJ#3))PF?~OZxgFpRLWqrv-)P$1or& z449?wK{~+e_JC1y655~+70a14*@VmcN2>ufiCB@LyVLZ3?@nNQiLq47op$~@N*S$W#I`n~LjF%04a>o-jBan!;KM<-@UK-jk{ zVUc&*^iiSvSXmFDB7^nJyMPrwV47YhTR#Eti2F6~_>jK_mV}vSGXA9ETTmn5Q!&zi zxOA_sC?;b~Z>z2?ChHXyw9|QrEZK*xIiruZFJ(3%8G7rjL+^nCu4aNogsk4{l<7zC zC4IHB&*h&J42O;`=pONCN0|kkh3`|j1qEA(KJ4ULRR|!+0$nzSzm)djZ%Nm)S=C{x+)i@!?9lb^F$_c|F^yU z2Ipece>@}|K*-&Za#7HfUyIu7uB{^R*RbY`+LUopIwcwNhW*@S>RlKQHGM7v-?Y`n zZkmM9b-;&5SkUdl=Hd6AG)_N`%7_#z>`SmTCaOqzX2VFkFAmUi_5=)7?!iu43^ml{ zEG!+7m(BL3HQn%>U%3Xe;ZA-wQwdN@ooCZSG)qN z7WR(fe#H#r6qKYT#5Dy}L{C4$Y|7=(F0h)&C$N9GkNZ*>d>-7t0T=WVk8|(h;qIo6 z4Y=QCQvFvgC$P>1yff22>Suk60Z_63N+|yLe|%d8zCIFoQ;y^J5$uREb8tXW|15Z7 zx{8zD;5qsDWfiR6)q*lcu{Qw!De2U74RZ5F<{xTzJoi(7Uh@`+h8xHb-0firt6z9s zs}Oz?K2@jMJFaMujuVYU=doE=s{CACE@g%JwFVn#L{MS>xn;WT>zSr!hV6p4Q|EfA zBJvkzYnoLF)0(ullM}R3-CTL!4n>cOTs4M@T#mGuPk1Q#J@sN|j z$XXBD^7$Q#Yn~qwR==pOo*$Z2l%=SmB8}{whZN7x%erhgXKuK$exyj~91toXE!nCm zsfP<~gis@hGEG+&+6hYMQC3^JxofmlWO%DLhEfrvfn$f!nN0p*AF=NmZ<*8 z8}T%h9}L2m9nd8%j=^}t<-LoHlgY_PyDo9p$4VK zlh*(_zsd=HqocEJE`wxAZQe=cOI3k3H}9T{zz&!Q>|_Kd2L1BYn#FBfs>yHj3)Yrx zSs`*-Ec6@eg3ome>mv9@oD0R#jP6s0*;O1gr9C7 zcuI+_=tjv$|K>|;ZPW-Zh0NkKCXFc<$|2puKKJe_!>A8PY~5hgg>N`j73$_02q|If zylq2_o&v?s)jqJ|HR46eChyX1j)MFw-PlAVq+l&w@W>NYUWAQ2kW zGuU=zUm(K3f9)7cUC_Q4#?UMBB8W)ZOOcElA2#+oCz74cdkG4THE>(%?sC%$S5{LV zFm}8R_tq&O!F*Ym!pcC|B%8bWjCiC0?uN=(#ROf`XT5a6bhz01gVqj++UZcgj)+)7o> z2*orOywUE3p)D`ZJYPA7v}+{nG7}26E0!_x*c34O8atCSg&NV$!D}E6>@v9!5D?fD z6fn+pihOgiaZ{$u}WsoElAc3>tPHT7Ri4xZl$VR+^e zA(M+;bAPCy!I5NU@?Mf(SI(4F@Q&CykaeT+f$dFR2HnDy45K8+8*ko!+|R#=Y?bI~ zb%NDDZJk|=m74-R_{Gm#%mIl~I9^!Mt_+Q~0ykZof(oPH7s)Kz5CZO0x?Z$s3ffO9 zlQQ4wUK)pW=P?F$;Sld(=H7!ngJvAv9klHsK4eq*NOS+U4JU6)zH`q>yd{+cjK%Rp5?sG=$*PrJk_(Aza?--#Rlg!NTc~;84D{smb7#mAMo zFP%Pthviryd2YA6SFj-7vdDpMK}+Z9vHhaVZ)b{3it($}+^V`-!`y6*S>AW|z)q({ z7V&=h7L~=4!4hgjI-IREA*5rUejYbQ;1s=oCtK#;Z`!AB?)H9fR8q>*`qT@@;@_F- zlbyI9-6|pD^rErU%(N2l!-b9$RKfPBxssVh6%9uVNKzJo=d@cUjH~kJY8$hnh&otv z)*40E6yla#>`!o<1OOcfpl;FL!6*(4#=-E z_?Ow|B=j#>+E66Jy!ATvpG13vVHche0D2;s*Ix4(C7tdC zz2bCfdtNH}$A*5rx)&wbkQTUSNs=kta1Fal@c~dXrIj;!Hsmk!*?kW%T~qsbnh=-- zi?LaaXCh&Fqr5rf zvKLv19Bmcx(aO=C`9=8=>I1@tqY@Gx5KW;1jNAmCg_`0Bd@1Wm2NnL3F&etl}-BcN8 zms_~MRQ_Wst!eZG(_?1{tah+t{vR=UI8mK_D8+3~;Ws`!Gv%Jes@T_IU4{n$K(E1{ z%RlHB#Y*Vv1 zqH51r>dQv7u2rnepPgz{tnXyn0kaY)y%rN!MjCx^q@ydpfX0KuQYul4yAhw~TiY(? ztNgEFjhDg_NQ@MdH6gD%4v9=Z<$R(iNz4(B0#;5yO4};OGRO(}#a?9>d3wQtjfk^| znh#rAVXVerRpUUXhKX;RMq|VQ>4ruy1K6@T!Z#sK$&VLMbopQk3LjDmk?0qu3lxYgl6S-#2Eo`&lS=F_6{RPCak6PRO+m8cro}Vcd&5h6&x@C zTVW~J>eH@dxgWTe(V@?=nSs^j!jazjNpVyPx^B z1;M1NW?#0~#+?9qfC%HR^R?(R13p8Sr=le`oBgmG@dW;iJ`&rMWTz9MTa7}ban~jt zJt`#xP%_jMgCK~%3%ijt#zVS%ww7pJnrHSV)TRw3-wSD?*K}hCN^6Tj#um}V%D8n9 zbWrU9vmJc{ikrIr!DQgUl*d*L??6+c+m@)y>~7gvsF#+$hreLLmipRl5?~)iN&K_* zHn;X<;92&fOEJH`t5}k{jb-}-V$jh7FJI#(22n1@LyDAK4g!sJ~Jpppq=cd@b^;NuOj1soe z<%-1P7j`U^2mf+tGb$Sl(Y|wuJ)$k-l0Z_lssl%WPO$$r{W|y}Gruj$Dv3@isCi0O z8y$5N5h`)E>BDafXb-|;lN&U&^yS|*CnYz0CEw#Ve@*AHIe5|dF8T{5$B_TykL#KZ zj&9L-VTygUI&JcV{FD-{KuKt>X5r2DR3u&0XR?Dj%zE)$B0ezaAXaQ8{#HIN`lpoMkj|(>{(P?Iigz~i zd`TaEJqf){ea0aT5ZpYYBHMr4 z@sN1&pp-8V>*jq!OxUhVyalu3RUlm&)YEx?&B^*x=T@$!;0al@@-Bhg>U1bGFPPB!NZ9HE^7E0YUNFXciRXh;L z+5iMf=PQ~<7cGG3nC2kDnD7}v=~o)oa<7W|X4+>ghWDr(oP7C35Qgt8nxOWSIBwTe z^~x@y=WE=6ww}xV(2Xv>Ksi;UL9HxxufD>E@|44UD%VV+lR&?jJ%l4fClOb+2}ikj zG5NY@pZ5tX_8WJ1Tyf?M#Lb6I&(<74t0BjsBaaV?avW|9)H|kKso`O@rEF7H)sDtn z)+kNTNJz%SXo5I{HO}BKh?Mpeg&(%HxEu5I3l|!LX6C0$WP`@rCmfAon%zXG7tPbx zhhJ;80i&-%CWQj@Tgtd~v3L%p_-A%fff>7@Nchs8Kg=2~EF=`47HgEN*eahUy$T=A zG5u*8o4^qmCc@@-r7%I?ne05d31@yu%lulRhQG?L7NKe%?z|z_-N+X8TxWYeI)3y` zC{{MD3avF6U#hAf_SZ2TEY1hpns0h!iqNGab&OTmvb(WVx>JJo#dKMP{8-`jr>qu> z3lL%xEYh?e-+4oVg6_o8fq6jWAMVKK_I)rlWg+JQIk7l>NOR^UBE%(n7lO#jg*cu58ReN!N+0+`Rx-#s5o6aJFOEkc!ibLhpdo?JnJ*aDtiyOGS@2zN)n{;rgV~;B*QR(II zGMyk+hQK@;%@Rh`uHXB<=Pj<&sh*VAAGu^(Y9>W# zAXxs^Une9ZH3x|bC07^psXj}chvU9=VWrMCx9bmgD?F(P`Xm}} zMkXK_nQUt=z}c0yr?%%~hVjICe^g;{76z!iPzGsGkanm&&LU*LyXB&vlNl26@Iifo z!(Wg1f{nO>jTcZ#kFjW_$K9PyPvG|5PnrXUn(;h-*1ImSk%b%ftccikJbyd)R z0vGN(dfb)Fe@w)GNJs<(lNI2OJc87keT=!{PElDI{_>gWrL4DMK4YXlJ(eiK^zzTv z`22JGVtDaII6@xmd)YmocI13A-2|4~!xJr~S-3$Q4r@RvqYs(dyM|~dudBc$_1+MW zSA(I`@}Q|p{%j9D*e6Jfgi>tsS)8c9sXQ zRduJEG5HwNl)tel8CkW3sV*&Q(ueyWAQf&1$Of`WwB_k|Z4tVI`KDA2%z!+Z2j!?S zEwzyA77*(eM236t=bpW%|EWm67xmDxsth<=x%@ZPrx(1nftGSP5k(%0BI_Z;MtsbN ze@3%M7OB~9+F=GJ7$jw@l4E~$X%Qy63@K#Hak)L{q2$?Q19J`VH>E*A`Q}6!vkrXO zmGi=_FJ6j3cl(hpGW4d1F3Q#CJxfc9&D)YmN6{mqC`rF@l55$@xTWSZqvnaBZe2go z8-|h3!J%VM{tvGQy-64Qv- zyQN!fRKz2T;#=v3{zHUpeA~YYn@+8Z9>8DN%021ASqP;wPWe=ckaSXDbY&2a-mcJK z_SrL4%*jJAa0ZMl7!4fZ%WRVhDW=uVX>C(yV5!3I+t{*U!8vbS^SJ0iHIl1Kw9L$6 z%FZF&W}T!wA!!|US0W9^wJvq#L_(`-LBRFlN03f|4HCh--MzI@T|pY z+6!fb5{ob@0;i`aDjhvj45h=96?rY(OqGHs)a;O;%=eB_A;nl*X%cPk{F?T_&p2gr z1#tL2zqGjY^M5BLaN_{hav4FZ_+qnhvu#U%cI!I!L3LKs;t_&hw$E0>Ru5W1&q5QG zC}lnF@5QX1UDs3XnFqlJ?TLdEr!f;0%v%P#PP>$!h1~_(Gu0h=zszUmI*n4z+499~ zUn>Y3v!Qr{RA)*}ycm-7aF|nYGS@YT+^bHVgI=jN(tN44m^FJy7bV zEx3UvsVrt3P_RRvISN*XTQHKGRj_NiT`d%oi6ql`D)3lpEophqc?KQ)Bq>WmCfDKI z4Zk|GHyyf&fHXCJZs*P_Efljt=Gh*~Zj(l60bb!qrKRVEijL?`)KBht(mIg)obRuE z*EOjSx+_2pm)aN)TbMS{66J$iqWY1{MEaOYv|7Z%ii50b2h>QV74%LlW|W(y=sk+K5qR_E{k@!`A`O{QEq=&- z7NLb%FUC_~XJOb{yTeHBhJ z0W-cEU~@EA(?6#1qp0W);Sk24<~h?%R^rry2Ut|CkRSOz)W=gx7Yl?+dcqV2#YHi` zfk(4NmNfm+lJfIop;%O?+OV)Dnv<3md@hrzokaF*!&D8PT>L&T#~X+!R(^WvIlrO| zyF98GGJ+4;m*$et=-_`WH!C(i{P*QA>J3iW?62sBJDDF;X2mjmmdAg!6V-l8mm|?3 zCko}2IQlSikZ@5N1#UoMi>M!MR%q|(i#%%E+*w=@+;Erng7wwoL_82<72L0F_;}St z5_xEj%JrWbH2ph9=s%^tYh|o(4X=OAI>Lv{^e{G3r%xXU=YPFiLu(IjIY ziM8wZ;sznl>{t>hT2oVFL!Y(al3Js-z0}vKwa484{q-{pZ#Co9XTp^3 zo2uo>_;2FG8b_tC_3~O*pxQ}CWx#nTNB%Av83u57ZiaLOe_JOMq*Ws+vQW2Msg1OF z2v{!$uD+cVR?{|K`={Zw8cZn}*70)DlLJh&<{{n&Y&qNyaT7n>??KCM!TvoeZU^t?lz?#Yr;N8+hFX z>5D!jx}hU!kPC;A@t1^w+>Waf5lO(>IBQ^7SWH{vHPg#&j*)GUp`s5f2SXUte9u}| zu|fk<@(#pMVA!5qmJoG^fWaZU(^A`*k}Moz>2;0YESoJey@N-N6Z_j-|Jree%(4)X z`F>{B>@6t|710iTjL)oK9X{50tvDZPn4I<8$Tt(mpM(P3HP7*be1gO#y+v={45i1$ zC6Q0S>|L?)?Y&IcZhp$D473zZK^}RM8_-Gs@ycU8&Xa<=@A$6e@xsiF0!Ct zI@+`>=1*kYEwDFd!g?v}C&cS~(n{7Wp{YIj{!-_!%62z|3OB-^^R4*|P8^>_Iut8} zG~({&LCw#HJuG%`sca3UOg%I!jg}YT_|OXzwfmsO);gP6PRKD!k^u>duxqk2CGq5( z9-r%1QBi1zdH)=E*>AhSlBUHnT&en@mzb3%i4;lXWt}5K{mvZbb9gjRV_8Ybx;pie zx}_y&a_x84FRzLI)M=7KNm3e+E|j*51Pa#MRdze}YYq6)k#t5~iAy3A%a3j4WLIb& z)b}@3OnL0|x~W$-47Xd@GFj=L$ckKu)pM8sh^~REI3;nefCTrCFHegi=?|}lOOA%E z7XM80B8K1jL8MiQIqUp_gm=BKuY*K>V3UyR1-GsMa0TPbB4~ByA7LP~Wt9*>+A>m1V|uICoyp^6@u1#qZ7A0W|wQ zXXiiZeOmykl9cfJvhvHIsq!c`vyr*$`}+-FYikMFCEV!mXYD(aKQwoTy}wJ*pDAkUFs-+~8=13R`e1!^N{92`nh?*zsrJ;OX?{qe*WN2Npd^8^?V4?m_F%AS|G zSpJrSA~3+*M*@G--FA+?GGCC2ZiK-m6sz8iam#D1doEDTh-bnzt;Q913_tBlwQSZ8 z**ccl2Y78cd-CaC47=9(iczTzq5-qW7n;9)|LW2F*`0E<=D}eg;wh9#?U2mi-BV<{ zKS11;IxS{qs%r0}BcyN;zy%$@t5Q~5x<1$nF_uKZ$B{3GIkA3L4I6IWb1oF7c;4Xv zR<-Z1e)^IpP24xCcU>T}i{X`<%$fec^)~2JP`Q&xk<*BGNud7EfHy`)8qHYW;uRB) zSMM*fREp9I16Y$!cFke<=%OHrxFAvgFeD!rM@WIKKERqcZ1|{vo4VuRLXaOH35};v zlV`hhP5-TTuM8GT9T~^N!=fjYpcaV;XA|6?O8f{1mL>w+9(BfU!G}5n;V$7(=U^*o zAt;#|_a>ZN#fb$p?;Z6=KWHa!#HYP}>eZ|4CS|83_Ayb*+2xc2Nc%(yC_B{w7nfXn zn5^~ec(B-woma1%#qa(m9b@q2l#6ei5NwC4xNjre{M>Es?YxBr^$X4oyer?Wib7GIc368_sI zzeU&z2?(4~IdWYKcoQ``YtBLOjaUGTvW^fC9Qo6kmKf4t`9MCtwS6z}{g^ezgbdEL z2!eAMB!+kG`sofo7LjwBHIoN-Q4)p1WmsgqyspYE&-Z6Lo|HAe+nJF(n@!6u-xXsi zuK69Vk8v>)ESsC2aHkGPInPO)#GGaG?+8Yy{Bj!jAp0g;SKvdcw@~OfP0E)q{-o{< zn|oz9{3`HP2JaV{f=~Z0dW*emQEN2nW~T{7sj0atTDzYgqpxBwQ*}*-BK&!%#`>k| zNE*uWTiQ?ErI!%l;u$h5ZE0e^i_e8c9;UA<3LhjgPA6rM?c@nYB%7|Z39~ByoOY5? zi&a?LA%=J1PU1^kW}4P1V7mCj;gw?J^?MGCj+*>_#tKsF56;J3f2LYjCBUGNj53s} zI~-WiO-wc)Is?Pheb=j#Jxht>dC8r*Dy!imZ%I*kJ_(f3$3=oWXB2nTO;xWoRceG? zQw-TP?l~-eIcvUu=#2F#TXX!A&>s8O*GMJjd;|lPT((5)`=n1zTchdn>4c@Rh&{}Nrqpv&kBb5`)AWj&Ef_0=TOFq7m7{1Xy*1Q;H24t{D*N{-mPB_BcXTR z4C#I{J)|;Fw?L>$_&P^mEQpx%d(!bJWmCv}=5TZ2S)omxh~(;%hG@z-F5kw~-+EMK z5FCS&B>BKdvr$IZ5BgvlGF=rE{g%N22K+SbV*};m6pE|{fuM1`QR{n|!^0aHv`lrG zO`8DW&QH0nURi_gvkn(f9z?_)A;!zPG$`-}_@4gE7i>c6WMVWo0tT!CInJ~0mif~S z+-u(mDq3!lTjz8xXnkH!6warVpWiI*+Max#zjtFAZ-}SeBF=9fw(Q)#+s7g+pdfEH z&}3sbknX>6%0il?Rtf%|kXT|d?1 zsN>r{2MaJ^%n>QBle_ zcGfT7_ZJ$CF$*#FzI%C&IA(LE^Qg*=>}|kI>namHp*327*?xGA-ZjQ5nkw16hM}yW z7>K{d*We+@6mj-eG4sr&>90}&6E~>Y3Jw~UiWy4sKyAExt{_LzYfbwc|9#k^zvEip zrJ(w6i@r_i3{N`}5B?_~fM_C&a`{5!chsH#Vy`~+pGIabIFY^FyVh@VU_DDjJ~Du* zca8PhEmYpHEhma)pD6R4Qskc{OZkXo&R0Z-GtGAH&sKSD$EgDEuy{%iAJ6oDjNDF$ z{d9d$r&aSo_<@Hu?fLHG4B$O9i(LnizN~Oxx5<=Ass|4$0CGRz1_Lq8Pr7*gAsJ;u zyieky!ps$Ail=qB(3gekUtJNE&eB3R=LBAq&-PJtg0G}XObnAfFVg)I2XYND%SHW} zji!0S(+XY!^7AnQ<`fG$_ma4}A0?;s`~#o5)X&MTMU_e{c{eyK{dn`wuy1`)wEFuT zVM&0b{tlJSyA>vBzQ+50NvFe z2S48Ug8|Wf?qTPnfa-(ci!<5nt8JjWEdw7QE#jUU*5*5kuf`_j*EN~is?EdD=MMb} z-4@E2Sv?Q$>x&zx<{sIeq-%CCsp4*o^D?M2LHs0lC~)noQb2xQpI*rCZ8&#Uc1}#y z!AQc$wz74aeK<5kO?G_rd)h$o*L!Rh6Pov^wm!N~WHop4Mm2Y?Mj=XIaf)GT{c6^Cyqc1$ljTO)Vus#!_!Y0N0 z_BLzKoGG>oIn4&JYkBlBDA3Ca6 zdhet+U(Y8da=&S8}I5Fi>ndM7SgGdJ&$G(m^J@YzKyz%Q` zs*rKInJ|}R(i33zH3=Mk0$e4ToW!G_>#WE))gov^uYx3AnL9)Otow#ayvlxNx_m;w zAX1+N>?yiBI;Y2(yt$Q?@vkMQi1ej761=`FY;dwgKMlC=F4$XLnwz)7z${uvaS#D~ z_cZvqn9C;lK}3GP-ph`iyL{E@1!uC{Ko`Dt%oKCsN~aMYw{#u^#thcw>a;5eEneZ z=P|0?>kF~{7IuynFAuNM7H7#Ab6V18cXw=s0+7vVuB!=~p?Baz&RJxUra)=+B{Gz^ zjiF18ukj$Pe-mf?>R$Nd0jzWXCQ?^jT_VuvT^)4C7x>sV+(HInt}-i5dg}0wJx7M0 z;LY`c!|jD`!Wc=z6HXl34ILS?3pg`}G8ff7axxDU z!0F(o%zXBwogF8ql{JU`l(2(_dUquWn!nBR4yP28K49GCBNMcO_dKlShJ+MqWmo3t zP%b~c9&8H5Z}VtHq{C~E{P!dnuD5y88PgN@m_08iQKDRMKp zy>a;!>=|pU&(iC;jJk7F74!hBy1M$_3=P`MQ4Ox@y()#}>h8KJ4{`Dw-VtbwnA#-3 za@*Q1lzMBsBM_zCCqeuRllW{a5o+8ks;co@47 zxr~0p8jQZ5#`jsl;?mcj@1pa#92 zC(Mck&M4ZnwSpn2p(WRc#nzxjnJ(i8Sh}ht(#K1VW0sX&5tdKJ)Uu!rfv01Y@HZ_5 zea_rwb^cCs2hFH+{zrsr1$)ll{@ma+@+me<+-C<#Sr?uo{<>ZBKO%WUMUXokS^v%| zW$h(qEWqNS)U;pN2RBRdY+80UtZW$zi}@oKvFDGI@ITeN#-qBedsfE8v>Y?nDpK2` z;;ShugKhGhXvQsDRb_Cr|1X$@66oy z$Q1qjqyV>$4Cwz-8qozPBbLY>W!x_p=GPSQ;DVv1Ja~A7!q5!>7EBS1grHVzU#Hk{ zfJ^_X_}X9ezuTHR@GiI9mOvfj`&^x*f@@1q(H^K3Yx}5svuM>4JIK>PRSy4kE`kX} z1FOaC*uwkdLk%R@ekU}`4>^mxF1xm!0c1L{UGFYYXzX;`-{O!a1U@q{ZPjAfyWtF} z0JokGL&y3R`*U7|#o}S@$c_!pk_mo7HLE4Yvw)Q|irEQRgIiO^L-g}r?JbF=f65+| zd3LwekGEe)S2v@iuGY1t)145z#o+Q16Ni_mJpdOXoHq0(nP0Pzo57%d0RnRZj5)9) ztBx=d8}9cH+_&)dr-t23*l5T^U!mx^7ty5aP?Y{`L#(dfmBhy!v-Yvz+?DllSy1kCYoh`P1^S#T!a6UO=Dqp?&nbM_405k*k((D$%{vXq*ZJPu5cJ+2$EUMw2E;aCZ zZmEbL-o^WF3P>q7g`g0-ZpBmRHQ){-V5#fUC9pX0j}D=mRWp6>XLIlP5;GApt<5xfA=?w4glc|way6m~5 zY@1ALb6aLh9mQL1cghTFM3DWcBPzY@%qI?>xYd^ZIxV?EO3F50tt=LS{r81-R)GC? zK~IsX=mtj_?(~<>5ruQ@zz-QLcUOIqFZOdZYAlRyn+(ny9@rehqtr(Z*g+cyKlSga zbaTgbQ*%8qYMAY<&O;9lf3|A(TbKg(l!_B>XBpdJn*i8INz7!>Nv40;E}a zH=3JL*F22jY_IjHveq<0yoROwDvn+#qhcMrP+-V0gGy$yD%=boPbHsRYNmb6>ciRA z#0etvb?XKq(7c0RXEB;I57WRne>tTB!)>e1^LK!Ap2rXFIldKR8Nc#%F}0W@+@PpB z1E04r=cTuKj)_WOU}zWPIl?F!)a{_Y{R|KKb&f~aQ~y@G#L)o5SReyFSgvISfAv{( zyf)?JH<)S@G5r>P21i)U<%nT&oMrOQ3W=z4(>3@6Brt`MN2(HmC%KO9Xb-+0KiqNF zUcl^bI?TH_N+(+5ngb?=N&nrNQ(wW-4E)%U4QXNaT?o-t@`d58!L4qjt1_57SErj--!{7;qV zY(SfTJ=~dCjZCHa;5|6*JsUld{{OCe%j(6@^riCxZP@0r4>OJiY{Bfy?}=9FS#eAb zk~2i`?8Dijg~DfhXgB zmS^{ObKQKu;@hr6PrJABx;rfX#y1R-J0ydYCo#8PS@h@o#RB`lv$EFqE!g|qEr>i= z0lA)_ZtM}(QCx;@t9%uQTr-5FnOD7=jlfpJk7|+?VP^_C^^=KDjakWf z`B&R+;SfliPMT2>DFa_gv-GNV-J;QDI1AwDR?4jDAx^otkohiI=tLbiKWi`JEEEl> zG8bHD7-^CK4`9F}saZ+Pe``6{iFbhI^?#uDJjP%@=r5xIJegMjKX$}YeyJw^Th=V- Fe*t^E{u2NI literal 27564 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