From 826cefeca7b8e8fc12a956ea6de37cac06f80097 Mon Sep 17 00:00:00 2001 From: Regular-Joe-SF <53127823+Regular-Joe-SF@users.noreply.github.com> Date: Sat, 23 May 2020 20:26:48 +0300 Subject: [PATCH] Adds new SecHUD designations and tweaks secHUD on examining (updated 22 May) (#12666) * Add new criminal_status * Add new criminal_status * Update security.dm Add new criminal_statuses to sec records console * Fix beepsky not arresting executees * Sechud now shows latest comment on examination * Update human.dm Add new criminal_status * Update hud.dmi Add new sechud icons, animated hudexecute * Sechud now shows latest comment on examination Simplified it according to farie's notes * Sechud now shows latest comment on examination Once more, thanks Henk! * Sechud now shows latest comment on examination Per Henk's review, another one bites the dust. * Machinery threatcounts fixed I just noticed that actually this doesn't affect beepsky, but turrets at portable_turret.dm. Well, now there they are. * Turret threatcounts fixed Now it should be proper: execute status now counts as threat to turrets. * Update hud.dmi New sechud statuses. Hourglass symbol for search status * Update hud.dmi DISREGARD: Test commit for affected on icondiffbot * Update hud.dmi New sechud statuses. Hourglass symbol for search status * Revert "Update hud.dmi" This reverts commit 8deaf40679c3caf6f35cff95487629e4828b3c72. * New sechud statuses. Zoomglass for search status (now). * New sechud statuses Make ghosts with all HUDs or sechud enabled able to use the examine function of sechud. * Add new sec statuses LF and conflicts resolved * add new sec statuses LF and conflicts resolved * fix turret threatcounts LF and conflicts resolved * add new sec statuses LF and conflicts resolved * add new sec statuses, add sechud ghost examine LF and conflicts resolved * Add new sec statuses LF and conflict resolving take2 * Add new sec stasuses LF and conflict resolve take2, rid with empty lines * Fixing Travis warning on list access at 355 * On built fail trailing newlines accidentially forgotten, check, warning on list access, better but still not gone (got to git gut) * Fixing usage of LAZYACCESS Yeah - there was just un-necessary stuff there. Thanks to AA and Farie for help * One last un-necessary thing off * Move criminal status to defines. Per Farie request: criminal statuses are now defines, every usage of them moved to utilize them. Minor: CC evilfax uses now 'demote' status in demote reply * Beepsky prisoner threatcount: status quo back to what it was since indeed, it becomes a nuisance if he tried to chase prisoners in jail * Requests done Removed useless check from secrecordComment, used isobserver at ghost omnihud * re-add isobserver check My bad, this check actually gives ghosts the View Comment Log from the HUD where they can't interact with the other buttons. I guess this is exactly why you comment code * More sane expression on check at secrecordComment As requested! Co-authored-by: xXx-RegularJoe-xXx <53127823+xXx-RegularJoe-xXx@users.noreply.github.com> --- code/__DEFINES/criminal_status.dm | 10 +++++ code/__HELPERS/mobs.dm | 18 ++++++--- code/game/data_huds.dm | 19 +++++++--- code/game/machinery/computer/security.dm | 35 +++++++++++------- code/game/machinery/computer/skills.dm | 2 +- code/game/machinery/machinery.dm | 8 +++- .../mob/living/carbon/human/examine.dm | 28 +++++++++++--- code/modules/mob/living/carbon/human/human.dm | 16 ++++---- code/modules/paperwork/paper.dm | 8 +++- icons/mob/hud.dmi | Bin 14588 -> 15184 bytes paradise.dme | 1 + 11 files changed, 103 insertions(+), 42 deletions(-) create mode 100644 code/__DEFINES/criminal_status.dm diff --git a/code/__DEFINES/criminal_status.dm b/code/__DEFINES/criminal_status.dm new file mode 100644 index 00000000000..75c33909fc2 --- /dev/null +++ b/code/__DEFINES/criminal_status.dm @@ -0,0 +1,10 @@ +//criminal status defines +#define SEC_RECORD_STATUS_NONE "None" +#define SEC_RECORD_STATUS_ARREST "*Arrest*" +#define SEC_RECORD_STATUS_EXECUTE "*Execute*" +#define SEC_RECORD_STATUS_INCARCERATED "Incarcerated" +#define SEC_RECORD_STATUS_RELEASED "Released" +#define SEC_RECORD_STATUS_PAROLLED "Parolled" +#define SEC_RECORD_STATUS_DEMOTE "Demote" +#define SEC_RECORD_STATUS_SEARCH "Search" +#define SEC_RECORD_STATUS_MONITOR "Monitor" diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 6444ca32b69..f437c409088 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -244,21 +244,27 @@ proc/age2agedescription(age) var/their_rank = target_records.fields["rank"] switch(criminal_status) if("arrest") - status = "*Arrest*" + status = SEC_RECORD_STATUS_ARREST if("none") - status = "None" + status = SEC_RECORD_STATUS_NONE if("execute") if((ACCESS_MAGISTRATE in authcard_access) || (ACCESS_ARMORY in authcard_access)) - status = "*Execute*" + status = SEC_RECORD_STATUS_EXECUTE message_admins("[ADMIN_FULLMONTY(usr)] authorized EXECUTION for [their_rank] [their_name], with comment: [comment]") else return 0 + if("search") + status = SEC_RECORD_STATUS_SEARCH + if("monitor") + status = SEC_RECORD_STATUS_MONITOR + if ("demote") + status = SEC_RECORD_STATUS_DEMOTE if("incarcerated") - status = "Incarcerated" + status = SEC_RECORD_STATUS_INCARCERATED if("parolled") - status = "Parolled" + status = SEC_RECORD_STATUS_PAROLLED if("released") - status = "Released" + status = SEC_RECORD_STATUS_RELEASED target_records.fields["criminal"] = status log_admin("[key_name_admin(user)] set secstatus of [their_rank] [their_name] to [status], comment: [comment]") target_records.fields["comments"] += "Set to [status] by [user.name] ([user_rank]) on [GLOB.current_date_string] [station_time_timestamp()], comment: [comment]" diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index aff345d2451..08a7b77daff 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -223,19 +223,28 @@ var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.security) if(R) switch(R.fields["criminal"]) - if("*Execute*") + if(SEC_RECORD_STATUS_EXECUTE) holder.icon_state = "hudexecute" return - if("*Arrest*") + if(SEC_RECORD_STATUS_ARREST) holder.icon_state = "hudwanted" return - if("Incarcerated") + if(SEC_RECORD_STATUS_SEARCH) + holder.icon_state = "hudsearch" + return + if(SEC_RECORD_STATUS_MONITOR) + holder.icon_state = "hudmonitor" + return + if(SEC_RECORD_STATUS_DEMOTE) + holder.icon_state = "huddemote" + return + if(SEC_RECORD_STATUS_INCARCERATED) holder.icon_state = "hudprisoner" return - if("Parolled") + if(SEC_RECORD_STATUS_PAROLLED) holder.icon_state = "hudparolled" return - if("Released") + if(SEC_RECORD_STATUS_RELEASED) holder.icon_state = "hudreleased" return holder.icon_state = null diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index e886ac0db89..8c815198d31 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -72,17 +72,23 @@ break var/background = "''" switch(crimstat) - if("*Execute*") + if(SEC_RECORD_STATUS_EXECUTE) background = "'background-color:#5E0A1A'" - if("*Arrest*") + if(SEC_RECORD_STATUS_ARREST) background = "'background-color:#890E26'" - if("Incarcerated") + if(SEC_RECORD_STATUS_SEARCH) + background = "'background-color:#999900'" + if(SEC_RECORD_STATUS_MONITOR) + background = "'background-color:#004C99'" + if(SEC_RECORD_STATUS_DEMOTE) + background = "'background-color:#C2A111'" + if(SEC_RECORD_STATUS_INCARCERATED) background = "'background-color:#743B03'" - if("Parolled") + if(SEC_RECORD_STATUS_PAROLLED) background = "'background-color:#743B03'" - if("Released") + if(SEC_RECORD_STATUS_RELEASED) background = "'background-color:#216489'" - if("None") + if(SEC_RECORD_STATUS_NONE) background = "'background-color:#007f47'" if("null") crimstat = "No record." @@ -464,12 +470,15 @@ if("criminal") if(istype(active2, /datum/data/record)) var/list/buttons = list() - buttons[++buttons.len] = list("name" = "None", "icon" = "unlock", "href" = "criminal=none", "status" = (active2.fields["criminal"] == "None" ? "selected" : null)) - buttons[++buttons.len] = list("name" = "*Arrest*", "icon" = "lock", "href" = "criminal=arrest", "status" = (active2.fields["criminal"] == "*Arrest*" ? "selected" : null)) - buttons[++buttons.len] = list("name" = "Incarcerated", "icon" = "lock", "href" = "criminal=incarcerated", "status" = (active2.fields["criminal"] == "Incarcerated" ? "selected" : null)) - buttons[++buttons.len] = list("name" = "*Execute*", "icon" = "lock", "href" = "criminal=execute", "status" = (active2.fields["criminal"] == "*Execute*" ? "selected" : null)) - buttons[++buttons.len] = list("name" = "Parolled", "icon" = "unlock-alt", "href" = "criminal=parolled", "status" = (active2.fields["criminal"] == "Parolled" ? "selected" : null)) - buttons[++buttons.len] = list("name" = "Released", "icon" = "unlock", "href" = "criminal=released", "status" = (active2.fields["criminal"] == "Released" ? "selected" : null)) + buttons[++buttons.len] = list("name" = "None", "icon" = "unlock", "href" = "criminal=none", "status" = (active2.fields["criminal"] == SEC_RECORD_STATUS_NONE ? "selected" : null)) + buttons[++buttons.len] = list("name" = "*Arrest*", "icon" = "lock", "href" = "criminal=arrest", "status" = (active2.fields["criminal"] == SEC_RECORD_STATUS_ARREST ? "selected" : null)) + buttons[++buttons.len] = list("name" = "Search", "icon" = "lock", "href" = "criminal=search", "status" = (active2.fields["criminal"] == SEC_RECORD_STATUS_SEARCH ? "selected" : null)) + buttons[++buttons.len] = list("name" = "Monitor", "icon" = "unlock", "href" = "criminal=monitor", "status" = (active2.fields["criminal"] == SEC_RECORD_STATUS_MONITOR ? "selected" : null)) + buttons[++buttons.len] = list("name" = "Demote", "icon" = "lock", "href" = "criminal=demote", "status" = (active2.fields["criminal"] == SEC_RECORD_STATUS_DEMOTE ? "selected" : null)) + buttons[++buttons.len] = list("name" = "Incarcerated", "icon" = "lock", "href" = "criminal=incarcerated", "status" = (active2.fields["criminal"] == SEC_RECORD_STATUS_INCARCERATED ? "selected" : null)) + buttons[++buttons.len] = list("name" = "*Execute*", "icon" = "lock", "href" = "criminal=execute", "status" = (active2.fields["criminal"] == SEC_RECORD_STATUS_EXECUTE ? "selected" : null)) + buttons[++buttons.len] = list("name" = "Parolled", "icon" = "unlock-alt", "href" = "criminal=parolled", "status" = (active2.fields["criminal"] == SEC_RECORD_STATUS_PAROLLED ? "selected" : null)) + buttons[++buttons.len] = list("name" = "Released", "icon" = "unlock", "href" = "criminal=released", "status" = (active2.fields["criminal"] == SEC_RECORD_STATUS_RELEASED ? "selected" : null)) setTemp("

Criminal Status

", buttons) if("rank") var/list/L = list("Head of Personnel", "Captain", "AI") @@ -548,7 +557,7 @@ if(3) R.fields["age"] = rand(5, 85) if(4) - R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Released") + R.fields["criminal"] = pick(SEC_RECORD_STATUS_NONE, SEC_RECORD_STATUS_ARREST, SEC_RECORD_STATUS_SEARCH, SEC_RECORD_STATUS_MONITOR, SEC_RECORD_STATUS_DEMOTE, SEC_RECORD_STATUS_INCARCERATED, SEC_RECORD_STATUS_PAROLLED, SEC_RECORD_STATUS_RELEASED) if(5) R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit") if(6) diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 9e07fb43b28..b7361db01a3 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -310,7 +310,7 @@ if(3) R.fields["age"] = rand(5, 85) if(4) - R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Released") + R.fields["criminal"] = pick(SEC_RECORD_STATUS_NONE, SEC_RECORD_STATUS_ARREST, SEC_RECORD_STATUS_INCARCERATED, SEC_RECORD_STATUS_PAROLLED, SEC_RECORD_STATUS_RELEASED) if(5) R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit") if(6) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 0a55acfcb81..19dc80f9a40 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -552,8 +552,12 @@ Class Procs: if(check_records && !R) threatcount += 4 - if(check_arrest && R && (R.fields["criminal"] == "*Arrest*")) - threatcount += 4 + if(R && R.fields["criminal"]) + switch(R.fields["criminal"]) + if(SEC_RECORD_STATUS_EXECUTE) + threatcount += 7 + if(SEC_RECORD_STATUS_ARREST) + threatcount += 5 return threatcount diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 3db7c079ccc..b67e01924c8 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -346,6 +346,7 @@ if(hasHUD(user,"security")) var/perpname = get_visible_name(TRUE) var/criminal = "None" + var/commentLatest = "ERROR: Unable to locate a data core entry for this person." //If there is no datacore present, give this if(perpname) for(var/datum/data/record/E in GLOB.data_core.general) @@ -353,9 +354,16 @@ for(var/datum/data/record/R in GLOB.data_core.security) if(R.fields["id"] == E.fields["id"]) criminal = R.fields["criminal"] + if(LAZYLEN(R.fields["comments"])) //if the commentlist is present + var/list/comments = R.fields["comments"] + commentLatest = LAZYACCESS(comments, comments.len) //get the latest entry from the comment log + else + commentLatest = "No entries." //If present but without entries (=target is recognized crew) + var/criminal_status = hasHUD(user, "read_only_security") ? "\[[criminal]\]" : "\[[criminal]\]" msg += "Criminal status: [criminal_status]\n" - msg += "Security records: \[View\] \[Add comment\]\n" + msg += "Security records: \[View comment log\] \[Add comment\]\n" + msg += "Latest entry: [commentLatest]\n" if(hasHUD(user,"medical")) var/perpname = get_visible_name(TRUE) @@ -398,17 +406,25 @@ if("medical") return istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH,/obj/item/organ/internal/cyberimp/eyes/hud/medical) else - return 0 + return FALSE else if(isrobot(M) || isAI(M)) //Stand-in/Stopgap to prevent pAIs from freely altering records, pending a more advanced Records system switch(hudtype) if("security") - return 1 + return TRUE if("medical") - return 1 + return TRUE else - return 0 + return FALSE + else if(isobserver(M)) + var/mob/dead/observer/O = M + if(O.data_hud_seen == DATA_HUD_SECURITY_ADVANCED || O.data_hud_seen == DATA_HUD_DIAGNOSTIC + DATA_HUD_SECURITY_ADVANCED + DATA_HUD_MEDICAL_ADVANCED) + switch(hudtype) + if("security") + return TRUE + else + return FALSE else - return 0 + return FALSE // Ignores robotic limb branding prefixes like "Morpheus Cybernetics" /proc/ignore_limb_branding(limb_name) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 59285ba88e3..7d1073fbdb2 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -715,14 +715,14 @@ for(var/datum/data/record/R in GLOB.data_core.security) if(R.fields["id"] == E.fields["id"]) - var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Released", "Cancel") + var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list(SEC_RECORD_STATUS_NONE, SEC_RECORD_STATUS_ARREST, SEC_RECORD_STATUS_SEARCH, SEC_RECORD_STATUS_MONITOR, SEC_RECORD_STATUS_DEMOTE, SEC_RECORD_STATUS_INCARCERATED, SEC_RECORD_STATUS_PAROLLED, SEC_RECORD_STATUS_RELEASED, "Cancel") var/t1 = copytext(trim(sanitize(input("Enter Reason:", "Security HUD", null, null) as text)), 1, MAX_MESSAGE_LEN) if(!t1) t1 = "(none)" if(hasHUD(usr, "security") && setcriminal != "Cancel") found_record = 1 - if(R.fields["criminal"] == "*Execute*") + if(R.fields["criminal"] == SEC_RECORD_STATUS_EXECUTE) to_chat(usr, "Unable to modify the sec status of a person with an active Execution order. Use a security computer instead.") else var/rank @@ -768,7 +768,7 @@ if(href_list["secrecordComment"]) if(hasHUD(usr,"security")) - if(usr.incapacitated()) + if(usr.incapacitated() && !isobserver(usr)) //give the ghosts access to "View Comment Log" while they can't manipulate it return var/perpname = get_visible_name(TRUE) var/read = 0 @@ -783,7 +783,7 @@ for(var/c in R.fields["comments"]) to_chat(usr, c) else - to_chat(usr, "No comment found") + to_chat(usr, "No comments found") to_chat(usr, "\[Add comment\]") if(!read) @@ -1554,13 +1554,13 @@ Eyes need to have significantly high darksight to shine unless the mob has the X var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.security) if(R && R.fields["criminal"]) switch(R.fields["criminal"]) - if("*Execute*") + if(SEC_RECORD_STATUS_EXECUTE) threatcount += 7 - if("*Arrest*") + if(SEC_RECORD_STATUS_ARREST) threatcount += 5 - if("Incarcerated") + if(SEC_RECORD_STATUS_INCARCERATED) threatcount += 2 - if("Parolled") + if(SEC_RECORD_STATUS_PAROLLED) threatcount += 2 //Check for dresscode violations diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 93cf7f7f982..d80b175e757 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -694,11 +694,17 @@ H.makeCluwne() else if(myeffect == "Demote") GLOB.event_announcement.Announce("[target.real_name] is hereby demoted to the rank of Civilian. Process this demotion immediately. Failure to comply with these orders is grounds for termination.","CC Demotion Order") + for(var/datum/data/record/R in sortRecord(GLOB.data_core.security)) + if(R.fields["name"] == target.real_name) + R.fields["criminal"] = SEC_RECORD_STATUS_DEMOTE + R.fields["comments"] += "Central Command Demotion Order, given on [GLOB.current_date_string] [station_time_timestamp()]
Process this demotion immediately. Failure to comply with these orders is grounds for termination." + update_all_mob_security_hud() else if(myeffect == "Demote with Bot") GLOB.event_announcement.Announce("[target.real_name] is hereby demoted to the rank of Civilian. Process this demotion immediately. Failure to comply with these orders is grounds for termination.","CC Demotion Order") for(var/datum/data/record/R in sortRecord(GLOB.data_core.security)) if(R.fields["name"] == target.real_name) - R.fields["criminal"] = "*Arrest*" + R.fields["criminal"] = SEC_RECORD_STATUS_ARREST + R.fields["comments"] += "Central Command Demotion Order, given on [GLOB.current_date_string] [station_time_timestamp()]
Process this demotion immediately. Failure to comply with these orders is grounds for termination." update_all_mob_security_hud() if(fax) var/turf/T = get_turf(fax) diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 849db6579a59673543c9b0256414b5a008287465..bbe41ddbe22e6f7d6e4630871cd1724d27fb1a2b 100644 GIT binary patch literal 15184 zcmc(G2UJttw(br^K&7bs7Fs|+LUTe;8esj*{D?J?z&Vzgh z0RZ5HYu?lc04A`=1h5|fzqWn*$N<24%-`^V=S>?AYj=BBPkR?<0Py{ooY>(!qR8_c zw`0J*I#BmAIiteoeaEfv@C(Dn?6+q$6XQ+~O}4^<$ThC4S+8uMtPffD-rnr|c#7Ui z$U|bOyL$y>D$%XVMk?x0qTU$ItJG}eyQ#5?VMWqxy0yKM65Zg&L#jWV& zN@RtZZ@0dR;qq+yy`?Hc?ta^du$yoFi>@D^2$_?}~E8v>7q+Edz0R{Lj+11YT!iex59`dv>n=%0uH|uCs`h zJLPZcr8MN-CU}+3pc8+Z=)Y0!cIbj1thwIAm3_l6>6=y5X~}a32d-zcJefEeA*Y}E zS)}`hlywJD>DHxud$ycd-mgyYUbMgS&_AD$tOrC77@Tj4Iehu1?o$?)4wS?TB|gaba3{yr&|C54BRR5JT+H9T!mac-!?xaG-G&mi2FE1? zx?`4&doL=w>*&#)#J7RNX*Dm7A(D>{T+!BuATs%9pG?TOYUilO)g8`knjo2$ z?Av^Ru26k@P>T4_)4e$SoxbY%Z|ayo?uwM9_ImSj=H&?Hv~ZnMBHcQu;?Z>}%}nab z=lgGjrRDCvV^3(gLgGAm_UxT$j$@|gGH4CU!}qgS?IY6>T7#P@e zO1xg@j^)(3X6)XOs;(+*JN(AtuI-a;hs)}pjH6GTtV{e^ztI19=kr37VYGRCfs4^{ zlCewZH=S$eHIDhz@tV$tykgreTv$twU(gnIYAn-!9rx#%UKS!kW1&3XRTjbx<$X}1 zew}Gfrwp1(>pSxJY@*;|T*LI-5!R97l4oAEqSmze1Giz53;3(#BN_y^Z7vNLH_wny zjsmo%gR5*)R_6q|{sUBys#?%tSP<tj`~eyj`|;9 z`Lp{`6m3ZiFr9>>q{F2p{f*lLyc_#shiF?K6aHlu1(qKVwD_qVBOx%9Q!8)g{}f8L z?z-0b(fY@=;E&c#*Q7sM*NZAWwWvIIbxF1M;Z?cneSWg;j+g zH|MU*jxDWybkAjyrhb^MaL?^bkyOa*xHfAj2gAynB$tkdwH;uF!%{1P5UC63m^O82 z&|BZO31a(^tV5P~8FQ0Oqtranu86+*hDaofBbDMIH~1_%M?KNEy`3Vdui)0@7r@t* z)o)w&P&&rvC@tX{k%Ow1EFEl#v@h#nDLYCV1S$;FXqC)qsS>4no@&Ya^D$7*Mvw`&w$wH@xfs4Jkxe6R{9_M$TT<9uYw(&E};3iOwk zPVYRey0EIc#^Hra@>-4}TJgRed-~a^u5XiR_dfsp5yM+2#QJK$(eNIO zqI9>m0XCyTGkYy5w1P`YEM5gign0*Ow2|?Qm6PX*gu&x+`HX~Pw835ER>4-sUddCF zk%&zw{sWnvzz|8ihV>i~v+szw$KwkHhHn@YMz12wGtItko-TDBua1)QH)S*Y_9OQE zU3K-4<5DJu#eqX#Y_zg^U-^71Tt=?!a9w#k16PT|?iE3ME}_k%ec3CmO`j}j2#UiU zQoblrDuXk`a<(#!9nz02b^L1ioM0e<$(yMr;28lCn5BD;1Z0VcFT<{ry8{mGRAp?w zS()xB8)`Wbe7e7C=mOAxdMz+s%G9XXiM+jN(I>Mrg$>rM@m_V;A5kb+y`7~K(>&&G z*RWaMg;Z2JXl1YTy3x3x$~9efn~?c4_uDKB07UgoUl^?*>-)?jn}4htEjJ75QEQEq z(*K-piGwvbBNX^l=Qgq zC^PNJbg7%o*xG%l%%t}^{0IQ&yOL{xzB+pf;X79>L?b-<7P?{`%zkpl)&NLVT#4K6 zvLu(JL6&wE~C z0_q(Z)J*97ZHU>q%ENlrf_m3Tq5w%m?TZrAyQ1TGN?35h>NZwcl%HiSQPe*D`vu@L zqKU*fBm92H`BrnHx>g5%v0(-(&7n7Q6*TYq!GNN_(AJrX8p;$)$Y$dO3jU|Ty zxEEoE?kHdV7)8_Z^{uS`eyr~@*Ag>I=EDJY02Nlrf)X<0Zm22b22>}`r~!cTcX5zO zDc=My_3EIM{ofT0CE%vte#Myh+44Rlbv+3FcbfS!mh9tnevIDr@kthq;oJW@ipbb9 zJyg5b;B1Ms$X_c3g~8l9-f5 z?Vum!nRrw}ja{VJV!;tnF}Rm`k&Do!(;M867OZ=J<{ZOkKDuHd{Q%>#dWlS@VQ~w2 zLU+H?1xIcez?QP3mK81i#W#}Ip+zQ-UI+x~w|P-~>h!imgc&rKzw5UWfdMuzwT-*C zMSj1p^~N=RKb$*i(c#zuBkX)zxYlO)olpA5sQ{ zMBzp|SSoqrQoSuL_PlZ8ix&r^OulAYk-pfp$LM4oQ^#h)3L z+IJL_jWjeg8a6LkH)p4%HTbc+26LpAjq$GRZFIt%n%ntcJH_-B3W8vb|25u%xwk$n z(P7{{ugK6ZGIxrUF&U}R)!S4;{xx=!(<;Ml9_uu8S<19L-zq_>3CqY9Y)VE}*+}=n z$L#1OQ#km!vgj7Jv;pr=-3F^p8XGz%&>X|AGkr3%H|pOTU>_Gam$kx{JCTUeVEPbN z_lMV)M%&u_0ZNzzh7kef-#$qTw;ai~)DmEFdW~e8p2yf*ah;Y+2LZ2uotZ*Pynk|rzLH-c&(i9|I~JUJSCqRbzyk4c3ahW&iX1u& zX|kIj#ZNk|Ag5anu*z*!H0;o!reB}D@7D%McJ!uCk5uh1es0lJlRA0D_D%DfQwBR_ z+FpeU-~uo7m9@+$(jEjJ*nH85D3wGm;9J@O)${$6^K8$=%F6j^=D01Y&V#5}TG4*% zSDCn>VFn1|1D|>;{7wlY_h86V@4gDZK0V)i@ozZg0OAxLBH*FI8D@{V!+fD^bU;=O zM?o)>?=X9|g9824-2h_V1-z?f0^Y@3Jls*_9BkL-mDNf6l+HKQ28r=r#F{&R0{+Nl zHm)G4;w^1FiiB3Fc??u->_{-r#{+sJ!CqTRa?_oR?%b^1WtwSGj2MkNlO#L8Ekf?^ zAoLLgT%f3#eZ#j^Ca3My(m5gqM_=3V@SlzBS`f7)y(BfPKzW#s$}>vsl0f#? zb$y#r;{x>0%XhcG?G{$v$TPl4-Yt#%g+&L28Wp|Vt~+1&&XBbfn0Q(zv-q;WSS!FX zD&yHa;DF2K__RHyl<9JZl$$c*m!!H?Hf!SE?8PVdC?uH%mW?PN`+YRSOwJDLOCc@m^+b zja%%^$}26sva8%It0s01$v5!8gI?FF8i{1$^wQ}_H}Df`y&q9+Uv4SU}f zyoz~XLOsfYi9K>?U5R*_vHlikyEGQR+DUwbJoZ$ zEO!&V$!|bt2jQO${Ng?WUeB;np7hW&q4?LPZ0<|G%!Zx^jdpM4zXPdUT{PU$N2dw zxKEc>>`D9S=e<zdyad+Xa;YFU+>qRPy>? zmgOv5e=BCJY8C`KlN>bp(G$;}tDI=kGqFXYoP<|VV4Bp1PO2{hDnD(L*8;^ip|N6| ze485Zo~Jaz&%&?kq?$FxL21Z$HnbTSZ?UGIS8KkC!>7Ki&d|lQ!HNIujn#^qu;5Z(Pi#tYG^b z4@vK370+x1ZX{r5+}Ib$o44q6H1hDDj0zdXOuH?+ujBWZLK5}mWUP=z!vX7qFGLWn z1Zse3T05D zC@d%%{_UO<5Bcj8IMsXGi=%#)e!^#` zN~0Y&Vc!4q1fE$KuAU_SWC4yZ*H;*4Xh+=m!Wbz9=|)v)@ClLn*x#1motZAP0C`Z> zK$$hGZ0tb|GtP@ZV=K$4&(ggh=|u|nI(>LeaWEr0&#@f(su!aO~oA);a68C~@1B!4k!_%4tJO%c9Os9eB@ML8Y&c z+m22LuxG!vM`Z^|;D6D|hz>YY=K2GlVuTdE(&M;t48Tqt5-wV3hxIL{8A$v%Yh%OT zsknS0*<+R2!NEa4D5$QpY6l|dGwNpKV5|fJj_{GEmlJ>WvX6O#b5 zLQr0#Y`~rfhD8{@8Zw@?bDi)`EH55dT3)_yX^G~CWEU0T+*$;)?lkMr z9QG0Ttvw2bKJ)z0ozyqOY<23^+_jSMs`=ZJh_^-$k`7$;UU^VfQE@()UJ@DflQPZy z8#>)M{-*%?A0W6N-m{M?4zqSTZGs)Sa)vdY!Ni4Gu{HO%yKx$DKUY*q8^ozoCLyZi_W+(oIHF4+7FWGGJRN~ zpb|)U&l7_x9C6Yf9l4_7@UC0)no+7esv_{};7*GhYTr81v_Cw)&s>Yjh<8pAf%D1v z6o}a~@)+nfG}35_f(HruefP0l0wbt{fF!N%10uW!#0SmIPc$fY%Ho)SoVkA2Gs4a*DNf#FA>=e?-Aw?ZzdV4T{9_c zyLYSJ8vpSAuB0GGtoAVc5?peXeK0$6B>@?@W4R<3Ra#^dVo~jPdu_#1f6dEfGF5+y z<^o!mLzs+lr52NJQwf4PMLbr8PWfrX-uf1pNv5@ENon73tdZPXw+5He3ITFq^wFzS z!@HsYXpy4%>2cIS##MUu$_D<#qHt?aQxPI3y1Hv`S_ca{9CErt1ql^rup%Ht_mn=D zycj$_>@4e_`<#4hYTK{nc^gh+SB@dH3p^<*MQk?hZ@=8Gix{z%t$vOj)fdF6Y-`Q% zk;2kQlN#XSmgu)2M{-3xGeYX=;;5;&FyzA?Gl>c6k(c0JA6#Qw7k}Dl*)Pka_cM$p z13nZF6N3#~-rbC3NY6$d5R-bD-b#|K-#4sH23BCqrA*1n9Jia?ZjVw>@kp!MROgP( z?;WYu@}mxr=0+bX#N~H`zZ8)>#&mMCUJc@?!cvLa&T6o0`$W zDqoHOf%1O+4{b-;w6INxu2VzoK$)|-wRIbfksiVC=OUQrQ3ug9I{D&Etd{-cx91KH zKe${FgT>d|K^OvS7j>>4R`=LwItY$d_KVe3> z8EM1V@Up!=_=UKX(yoJPpnLbFdqqUdHCN!J%?9OaRj?)9JWQjf0bk+dwkNx@@ynVX zYEirv!Bx`Hj~%;AugqPC_dqK?zB9G87%CWu)-C_aN;3$Q`I(8OI_43lbr{ba(Z5)6 zs%hw;P1!tR&B)kahD^` zs%)FVD+I4;%DC(ug7?Vm*!YlpU#v!nNsac#`O==A-7`ITTm$%%BnkmJYCP;{Jv$Jn z2CUbQR(TLn*HU}8;_qU=Ypr&zs-%u=!=f^_#TlT^_tNsj;CPiaS*eOIf6%7Wd%HBU z2**VMjvwgZ<{@OiFyNaCB5!Y&WqOhe=AphkkEge{NgiV`;}8*qU;BZFb~)gEM+u#Q zBN_r}+acU0BQM5(ZBPpKoY18V7FUkcb4LK>ZqO7|dCbqHjBKau)@t-->2~!a931v- zQ@*qMHRIrgw29Al(ii;V-FvP8VvC?y9f-s$Vjl5Dghp_xwMh-NNPQ5a}K^ozS8)BT^fyt~4m*vgO zBe%OX0yap!3^BXltJs-<^KgaR3I`gFw%w83;#_VDd-rujQCjv>;JZr%X@=Oa$5B;5{Lx@mR=<`QU^mAf*7Cjp_gE^zoG83Cd2YyDKWsXhMcUdX4D%={?U6OZ_Uc@=*zQw?|Q1` zhyNh65QH}WBnJyDw(`3UJh^zAQ^5Bl7)lwjXMed*i+jncZG^qatg-V(+0I=;;G8~z z#RV{+W9AYi=Y}?*zWkBkH{L{^5-0R+3F4(6q#OcBE{aeTzuP?F#^@yY&P<|^w;8>Q z&$@xVG($TyQZjWQvqswI4_Nva+Z3OYafP`njX8`NdeY(Xo#N?O{75}jUPT=2qKDrEYzR!=Yf)oM^3ZIK~7Q`9!h}N#+K?HPB z&zaqZ#olv1Hxbbtah>PZ``M0?E+S;WD+piU=yZWZxBTiRipH`Qj&#jij>lb;E&Y*S zbKmn@?E1#}H7ODazctpLjIHnrLbgvzrP!G}oA)TCEt4^(xWOmR%C2hXFh%0*vLFVD zjd6rNda@H!l?Jl%BXSJV?v4+a6O~@%=p?Ivp_Lm3KI}c&0aYISG4JxGdvmt^P@Ife zrQUTO!=`!I7f1YH@~%*X?C1G_7ZA$Lt)w$o9sGy9d=#*ai%Di%5VfeDgg1Pz6(>E< zh$ayN>GCndLSn5O4J)mpk)B31e7s#wpznFPd4@jt{tptCnakPTqSEz|G|L6E%3uC8 zI-mWW>pb;oq)D3-i^#dR_qBQ`I*eGcMN*dT{o6g3qoalRMOd;k`UH|a`{9s|LR{zL zz7;EeEtN3V>+e(+=8+G1ySDH(3IQ%Y1_sf_KGZEAu8C3(Q&`5EjQ#jQN*!(Mho@BD z0gE?)a+DU_50YB-{qp${y{T&#Brmb#H-wBig=cNbFkj_hd7GtRyqv&T6aJ-X?QX|- z!(=!(9)D1g3ic+p8q_vWfQV;7$t3qsnwXb4AezAk_1(g zkv3jmo%&kCk-BW57g-zFqKfCE)Qj+W9b&Nd0xTcqmhD&KB&- z>u073FXFS`pJ3b`x&7u>d997a8YueQ)!dLf%-g9L!iNKMamzbfq{d7i?0V$q7WVp( zPsEyNdM|07aBCl|GC7W&ISF^Lw|5)gXsHAvwQApTbEYHRj`03J_2`4ZknG)@*xkV0 z&D=f0p~mv!mYrMEryWP+a}d`f$w@5*#YRZq!BYD2`#N&;i})vu<(;M7*=h-&?LkaY zO3=r$RSz1417H)qIyZ9-6s2l!XNPkS+*W2dFBd6KD6@nj(%_l?(p`^N1RhJ2NnK2= z)B5pq(c*)NctMJ_ILl$~6CYw8inDqgjI(RSN6t$c(`e>Xo zzN;0rmJ(1dwpd=yTs@x>kROVo;=4T0B{7?rn0Wrs)mg+5=COeUs+sQ|3?0}Q8II`s)gbU&jz9Yu6pFk_ z5ln1_tBWE^N%I4psVZ{#2^nvHWz(8eO5KN&Z=C^`G^4;5?AecM9v4#bQ;$@e&=0hd z+EsK*xHhC?`9sxqZktYvJ^u6k&vP|$+*f?MR7}y8BzVx&oJ5&@@0n#{ujHo}cT&MW zU96iH7U{gbs4h$17U6JyNU#_sf8PI;lCgXJN#v%Y(SBqhO-cnvk1HjcD&hy?IxCX< zkP_=N`4I;ZVG=26@uTQimx&%>^k}Vw@C7 z%?HD$Xx$X$AqU!i34d)HXSB>*-*8fls5~trbi}oT1aiqSQkH=CH)-|yrEAY4@1Nyj zlD-XOtO;Ly2ZoSbGp$%A2HW^^bEhNa9y4VcoY}PrVi9Ki#N&7_2Hc;t{-dg3Rjt7~ zPzEIh{$q{QVLAsK)-$JyA$e01Z>Y&iAN+Rb$+L7F{DAoYC|B%f3Q`PwZ*~n( zQk&%MD4lydKVhvbKbZhM;?f#vZT7k{r)%FH+d-r16p)DqT`apcTg01WK-bEN>%<7` z7u;wRzq8*W=^zhUMXWi8GEdx2HdGN*0f6G^VlXuW0O!KN3o48qy!yWUU0fp5j{};` zI7XKqyl0o-u{-Yyu>><-|Jv%G9sv8PH}yf+S7l|tcmHvH_ z%ul){`!1Dwx5bnR`d{__?CfhZ7iMt6Z|qS3s?lihc;b{zcjejCVEjR*`eD{F#;-Sj z?C`14ma-Ys?R*|Y1|1VIu*}U-GlGSE!PCJ^%gmCDMePT&TI`{b8_`-e=q!WVoCzyM zhz}eQ5js~3(K!l;>pUWmts_ zMVtEck@H(xq_;{6A)^}1ejv}lIXO9z^Vz|;n=a%F54#7zBquagj5fd<=Lb!rl{ zqCTlPCS9oXj;r$M=14oZ-t|h-ofvCSZ~3{51ez zA~x*vf#G2h8sW~c#XalC)i>0vR=WPc`d`P4Qx1$ye2RMx#vIw zlqtA-&%UK`sFZ%q4Twzy$QBeTMhLdo# zQbA+|Qjq^a66-|ur&2jQRsgrE;Ro74IlHFUxR669GV-RlA&~yp;9i{RZeXtC2WkG^ zG`O!O&SyZ4Ec+|^{ZG31FU9+z55eE2|5Eo4HUC|E7IcD%@}L~GpWDPjULYPtGQ6+w zop?w=R|Xa#uZ}24%HkJoXx}>8Fp-7J%&7BW0>HQOUm5!PiZ*@kINT#2ospGSY^cQa z)p17U4={*f$O6!w&%_NmF(%iPqNH)M@SZmlN8mjs(Lq5)LM8f)*h4x4Pwh=T+A&v0 zEP{-`)ySWOzgF#^nemAs_hn%yYpJ@#u4bZh-Dlw+!qdn^=r&Hu8Tzb*0$R>j45 zUMMrf4aqr>Hw)BPy=Fm8adq8iTgY_|T%7E6`Ka$I3513Dwpwnw@&c%ebMj0)J{ak) zU~|s8mPR_pg6W#!h8!}vj~I*nneNLg%mvXLFyM?RRDi4xi{M#KMub1R7+rTrwRM?_ z7z2!@h||Ni<@bset&Z0N1#-RqqbyH)PuS`9Dj37QWdgu>b}N`VOE#D5$JhFmrn|jw zEVx#CVN`&%UBZTWw65xDw1)e#(*VrhyUPoXV*`xO9R>92z!M}7cl^JDDdeMs39?HQOF1)n1@`nPmot-5GZDXvfltMW#92 zz}ZN9ln}U>mD63^%<|upk)s>)VGsbt&w}DJ9wm)%L7I|bB0%e($63ro0pHVW>j*Th zWr_>^77FAtL+V8f6&WX!VSpjGGt>4>BR6!;{%^sYS$iO?Wl9 z9u{Dy?|!rC{i6;joEc|B&Atf^uVi`Z@Q)Qj8DO{?YUX4C<^Ep_Uz7pgFm0Zff0^EY zGqU?RwEym@iQn`64~H!b=lz)hT(FOge_;lWMrTYj+;m z-vS?rUly_QT|K;d?HpwR_`S8@zPy-#__h&wY8_bs&BG0iA}=N;-}Q?4;{LWjdaNg( zu}z5L!zRo{0Yf(M?qT(H*Vg5KYatBwu=h&D7kdQwa`IW&mA^Vs*Cjp(6=O%3Vf4ocJ@G=3$uSBgGCqM`#pAM~*Hn^yB$O z^|uue*Jpp%o%$Sj^k?&Ve|`W8hR%#x)r;4MzE2)iUq>ASrTDiLD!1?`Pe?GKtik1% z1b4*c?6+ z+yLA;uc+W*A~mZn$XZ_>dz@8zNgqu%7mD9LOw8flJM%LAi5jd}-t5}h9iE`Y?&-)ATD4f`r zCWRL5p%5hX$vKZwWDdD$WFkG7E?=1obqQ%FM}1XkAfG4S!(uSwnnRti;5$j4Z3ICD zXS2e_NO_e6Qz0EyQv?DLhG_uwGLP~@-o>aa7_U$01}$;l9L@+>rHbbi6cnURN8UFdeVjviG`UAiT4^Ll3I40m%Qn<=B`N1vs~MdEow(O-GhisV-)T){Si=e$hf2HDkc4FkM&o`e7b{10Wd z)AzildKSkm4Pf^=VMt%lfiir$mr7Wffcp5CD_JgS=RWI#T7cU0c6E&$0^ewW1tadN z?{J@)RmASe5er=Dq()N~puS{^8C$9iGzp6Qqb~K}cQ&M*9nx*yj?_b3X4BL z#X^{}^WA&vI^V2NjobQmYgDO!q5Z!zlK*T7{{s&H=ji;O*Bat*3i*DQWZ5W@UCJT{ zxpwTVyG8oA&+9Ro)U%N{#FsR}^kDgFG`TQ6q%G@`0`vxL?qDCk{G5=;hx*VQdUaE;ZWbrHVbUgz%aBz z$!K+za0SrRr?F9tFI49|xsKLA(@)_e$-5_TalA&^bT&#h(%{u_l;@4irAR{N4s8~f z%wv=t9F#D8j{q}Hn_CVMeZ5q^Lzq8j#E_|3!YCG_^9;c`tqCL7SaPV>odLGEkOGD@ z+~7yPDGY_oiZ@R+PRe}!l`#~OFH>dDNGxp83Zm0inA{7svcTEB8`~+8^heat+-j`L zhq0f3ZeoVd{oibmR!tA=4S)26OirokQmvWUk zFlkU?fFrWXyTzf37F1@QJGQf%wW^OO$6^uj4n;I(`x-;jRp^ru@nOqXJ2DTy%%qNB zeK)2o7_?wk08X}oE*EKKX-hLu8Im@^wn4~nZ9Yp|Qle_`{?3Idqb&0iY~tb_eJ-@^ z6fL%N-Or_EsxmOc(&9L}9F1C)F^or-Yqxzxb^yWBuXc7TR`q8`u(kk9^gibI;6pn_ zr}Sp?waSsHi1>3jx*eO@wLJY*>=KeD)Aoqc%XY5@MivCP9&UuWvgfQ7-=x?hRlzL_ zxHD>Rn-_QGs{XAJ*e~#gBjY-_ zbPp)ppI7y5hVi(I^t8W@wEm^5J8O{aC`X~red)NeKR2Vy)rzCQ0rv{)(*ju1SNtWg zQZSwNmNZVcVEG5>{r@aJia37Ma2Xgt*e<7o&M-6Fq;i7%1z!=^BzHZtBJU(Ihww#p z;vfWg_292GKq`)qfFFDkOr~%3mB<;m(>_ESz@1E$OC3u+{R;On?Y*`LE`z40N`DI>NbG@J;2@h zoEgVv0+M4JTE_E74=zvKy!SYB%x6ro?D2k>_rkl3?xN>&gOQ#{?Pc1AZE_5?8SY?O zV>P*Qe{p#lmp3nK7OiC;8ap*azFTUXiEhn9>YU5;8Ogp2sGXJ`uDtXCJUzg4`OIz@ z3J?=LtRAhE8Pmy2F9=C>H183aC^XGVOu)SzKwHTAPgY=!mjnsjr7kNy=?5VCH5O0TO9b<`HY1RPao<2HKI8;SZ96WjhjH~+U}*>m zyBB>vrcjiUyb>+2k?x&M|3$902%z4hWs*u?(EHg1_rlkRN=TlCNJ^#;*L!*;jQ>D2 zfmzc+nF>v+I~NpW>(!`mVE~quO+S{<&lx|IjX>~C;J(Qd#Rr zlxzR!H_+3VBSI=;J0H7S%Bx`O)QhmzS&9}zpOQzs7iP^@{bwtXKMNRZ zi7Oq!$We6Am_O3W>t^a!Kg=AhWq*?z`*3VMqHkq8{=xwAbZk$}bkWbH7w!6`y}RJ} zHh+yDYuee%*^W%jI}v;nM*rs0KQLgsdPjDR+NH85<+b|5^dhX=)U06XmcyCqdx1R3r$_>?jz}2=z@O6=K1;M-rY#tF@p?`0c{_P zp4|Q{Rl5Ru+*_`Q+BrU(LaarOV`29iIN2t4{fr{K9KH*Wf%S^6}rc-&zUHiN6 z{nfDoA3BMM?RASFcEYgqAVEP-I)D;zL~>jd;wbi-v&^M~jmp4evEA=hiCvYw4`~!d z#cf6pi5YlI(uLGu4keSph&u3i0|~kb6C!j4wg0ID3?9R-FS~fy+y(4*;J*rO|8_>7 z=$W2ObUzGUzUGKlxQ0N3Nqy`8jAs9&ZfAhZQod3D^KHqnr@1Ey@o!K+9XV0Fs=C^)p&3bBPqR-AMzzP5W zJL1|^3jm;lim+K0Cg^8qcw_+p7*@iqZ0}ul4Ri_c^uOon=L-O#8JTHa0aMCsx?>wv zW)cqW-`Dl!Yd77_my}#cLSEArxBugh2W%{)Ge~%Bd}(ImLc2lOLTTVR?nXd#7r%(( z1S1coT0!F7I@hwKx-jnzu-VROT|6A8t{Bo#R+d$Or|uaB1^9}j+fey1U(MPdWj(ej zE0eNL?{sTxp5SA5Oz&I_4mzPS@D_Twl8_~BscF_M71*E z(^EMNZ74d)Vhjc1W_P){>SWX&-`EK0*avN?2MEF9m#cal{I_zh(nb3y7Q@(u!Yz*Q2}+nf zQ$cGB-A11*%pZ?CUv{_JT&QfI=-n+xyUhMMi-D>~=%(t9yp!?*%C~-AxUC`)BcLx= zVpmiBDx9S)QPAT9;mn&_cB_s?LCL~r##4>*cFTEudG&TvH!n2s6JA|mk!}t&n!ejH zDu*zL*R}YfIb_+bMjZCfZBzOX?zZkZ{}3%wY9eEoD#X63oySm}+;nW>DX-8hD%b1L z^q|=%H_3?P02z1P(60@*R2DeyO~en^q)oigUCVvxj|k0TmZ)t%IT)TgS!C zzpB4DHxvCJ`orbvOEuG^h5cne%M+_i6L}t~3c>L_tKlo*p{%cKa?Mh=IdmU>GrEIp z9Mpfyq2bu@i$kwUBII)T#iqOguW!Q7Zy0Vk6YT@Qyk$?{Z?avZN@MtRcjTiFCIx(D zhK-KTGPgP;qTOwX_vD^@Nn=s-Uw`+u!1n7!ok%sV@C#+-GP4U0xdnsIeZ@|c#GSd9 zr5eqqTPry!A3Cj`>ns?oSREho%Nv}+F5{Fb9QwGqW%~G;`DNkwnYm>FeN?sf5=?md z(FvcS#hinGrPAHjRn$3rbQYToOz$e@&`QSP5t5jls@&f-%~=0t?$#x z_%$}lhZd|kc`@P7z}lAbjMxs>1;>0@>80&3JC&uhuJ0;-n&vY|T()KJb?i~FY1>l8 z#@+N)!&t-8tH6;1V%#z%gEZ5v$ajsx6gh$C_B^;{bc}Me?^qS%eJ_jKv%f9FgA1!2<;rjGJ;d*Ku4$+#sMW%q zH}C?B;Toa|k=@-IE%z(E+z9*OeL=V}?yKhF*?&I#Bk$f*NqqkDh}5 zTd2ObVqu9yR)y^>F8Cndd%UnHv6_2Wji-pV1lF#=iTN^oE1#Wg*J({ojq-u}ANukIlzQmQ&dqg%4CLyDO%@uxnbW2IAxrJtfA7-CAz2qWH0XA3 z)z)*^CuGUTuWfGVjU8aPF2#l%S^Q8lh~~VuvhaKI2mpwebQSsIRt+;Bf_8=twiSY$ zT3ggR!cSP^MC>T^!G`Grn}}}>r^uvuLIR(4*=}lx1ac}#&PDzq_!09RX9DR#30~44 zxr(FKae5Tx8_wJx`Zi0b4Q0yV<5d8XF5j}P(7gM7$bO%AN@E}Q`L*1e$tkY>K4VKD zM}F-UQ5LyZl2u-ES9MRRfOL=HcREw~hK9 z^2f2}*DzqV4)yzkX>BbavyjPD{0>(9YKk8{#U(bL3Hy3Iu8Imxjg6vY)Wh%~!tI)X zbPX%o6}_2(cMYw?*Ru6jz!FRq|1<;~CXD8!fm|k_@a#yg)L=I# z;x4|DLiY9#(DHW@{mm3qZigBflpHoF;{-HWOeisOvIhYT;w$+>F}9+Q+-YQGh4+eq zD0j6}*gEZ>LdQ)x#=gg*0@N-up!6 ziLW$nc}XDL#&n)OMu&p2>>15Y`_>}T2qadwOiiOu!h6z{Wc~JYbz@%{ z6mWCGDih$9K5RM)HJ<{#?kzt?Gafzp+Uk4()N9E{RPNTJRXjfPF|bqw*iRVE#ETLR z=!<;EmR~$3M&P_6M8LFNby{6(r>19Gqk`HVZ^T-zM!Sb6{s5h%wrBY69k?(md)o_4 zU zY06H;;74KS$DpznY0Ry>p`%R#r=`vCnmqm zKQs$rek|UY6`t}c6DG#e=%U8(2wo{%( z_m%n!sVunoGTf!Po5AYgu`_xepPn3(5N)xVZ-!m;(JQJ{S5#Z>oHG@xQt?hVZn6Y5 zvzRvRYG80BF7c9rp5-=Sav<}~L!qW9=2>>0MD>o+FdhTBG7sB(hJdCauxS#V&uGr0 zf{c-aEJC6G5i`Sd!~yH25!m%7y(}RLf?` z$fnZ@+9zG~8yju`ZMw3cm%?UZ#3}c|#@P9cC(VYQCcAUykpIr*{@k91R+) zR})8Mt8COxkd}%_KV_qS9L#5!m{DjI!w? zTG=j5JKrBInbkirWHR*V`g&S*sgswfn(@)B&_65~FVJ5lMUV^2>MT7q0+&vNFZN2m zw_I8C2GFa-MXXYtb5C5jexyBlrXCUE)1q_uODHzQFD#~#zT_x5Dh(XPwXL3?ZWbRT z_i0$*;N)wE<&dgo0}IA-IyCccYxx-^r;F=hc1hbC^u;$meqkF5*+^+u+%gOgo)o5Z zr}BDr*eTul@%m;s&8Dx#H;Z>-Vj{n+x1Si;YaS8N5~UL0<(AF@RNvgZq!F_HuGP33 z0HXL5-Ci#uH~lEf?|!DCIxwDl?|vrbE5$oAVN+~wgcU4Dn!v>F_GPvjxu;RXkbgb^ zw1Vt3yn?EIXo@2U%EvHNqN*=m+^5~MHaGEvR=v?1dENE(_3?eV6xeC=rY=DL`Ti?$ z&z+bE@ftR+Vz6I7hig;$5YHl&lT3Ptm z^H8$>yHjGx2A(^C3Co8{!U6#3cMk9Un%^jG?&cIZjI9&-VGyu$-ev!v!ux+?72XOU zCir3sf4p?pe~}E9g>}XY>*7TNyXCA`!QJ$w^no+4MnK|-zc?bQF4h>1k|CCpt;Yi=u?|TPgG@V_L)TPq8c1ApiC#m`N8e8 zi{8abZ|d`-wY**(XnR1fDy*q7Pa-ZRo=VD3n{JUnc#TyWAL#OJ?%fVt{c%Pd0pUuj z__{+_x%kRI37S3i55-lR7HA&dyVJ?CZ)+< zmUr6Nl*XMu$uCC-Q&!y7_m*ZvHROLsRu%Mk%nq+RwR?{|7KR@LTM?rwL$hn!2v;B$ zrnJ}G4_U85VPT{qd)jXF4X3+F(7%Nu%MWf*RDSO~$3Dj4F4v~Et|R>>v|QuEXI!}x zE4VH}V42!n(9MR$mQ3yh_lo0rUCP>dqoXpjX|Wphv(YGy*qOc)sO?mB4wx{q{p&Os zn4rA|?k+^_z2m2w5t7gEVs>_zN2caEx5EBa4r5@diPE;8pOLI9keo*P;(+%k-xL(9{X+q9Ov^ zqnJ#lXTk(>zPr+EZ4fcB4^7pNI`0f&hE=|PQ9~ZAAd_D51CyjS=Uw-{ecnj#4o-~l z3N+)O4)|kT9W=fJlW2NMEQ^w0%Gg?8Z!VzTZLt1fK4JJb3{Azw?+ww~lRFoY^tTY| z8_D4r`B6#bsJSZf>Gj+7ZUF0N?MKjb^NK7188Rlcx^Ko_lbKNJR=FntAO!jwt?5lD zDap-SG^F>*Bq}Z|QaYh0YBl5-og>8C0@~TWk>s&|b5?(d1l39VJB?KZ7o^Zl*fL2a z-+-tq_IoiQoSzR8OC=6f)CJ^888kDg^TwDDAUCC0Rj{z@7ua-MtctW&TGzMgzy9&n zsoGh4V7~9*_f8v}Hr(h7lsfR~eR(ar;G_1taIZ;_{S;8_`(QA9Z@5NaXzDcLj);PN zN7azVfmPTA+iL7{Ar*^GQB><4FRziA85zVxb5PmI3%1VpIbkOtuo)rzN>{}wI^mnI z0N$5Mhdvg?k9?qAIUJ!&?*O$=BYQd+4D9nV3N%a|qCPC)w`T5yo$}2$LC^pG> zEI8_O5dc_W7Ul9H>Mov>oq^kUo>QYwOnD7k#$ExcPlxnNG5}G~l+J`(LQ}ziK!OHI z#LW_y+CHD^{+Qj};5wA+vpZ^TzywBK*P+38WTq|RqE(f5H-J^Gqz4YTvgs1@>!Ti* zRp5Rm-6rv9`S?^ot5B-|)Ya9g()Q+)O(si_-)xzle1aBYbEwfj{>Uq92h7JS0ia;g zt2RHYBK84pF9@CEg-Yt{6+e^VyEO@6sDo1wjLx1ifj;{GfieI0klKv@+|LuStw4BA zCm6T4uGFWLr_TftweM|_K7)BThRM_M!fMZGG+_v6TWKfn6Bi|W+865tlnc$98WN@{ zuDkG~_X%KURWoLpcF3!12T@}rrI^p1xZ1p5ow(VdhHt|hYWBv*Ll!j#Ak>;b&LoGj z90I4p!kfnuh{;hUgQR#tjCB%m;S45jF6;Y}%R5J_!2mcUd6@tKUdVAgVCiAaQmrkQ)b@2uEBUSZXKF zik3xzUF#r(I}(UP&ipNbhB_$SH})s;Ae<7wLr%^4p%U-+50?DuKFhKs0-A5BXHWmy zm%=MLEez55@87$AFx>!zaEB0yqoydnB!B7jqd^qYdX-*=U1-R5yD75A>v)wY0sOpI z4gQ`1ZENN+va4|`+pdPY0_Z6iZgf`GHR@YKgF8%|tX|}8 z&EK7eSg04Ud!=fmtHG!TLa$emQ%=fKsiB~ta!|xf>M(WI_F}W(ugGOgeo`kYdz=;a zh98|_3fA13OzIzW+nzc2ad&>qJ{>0Yxrl)SetnP)3t^925k>;O3y+7N4?7_1LcovQ za&fqm-)nlXl>_-AMQLX@hTl)V^!o~VQbeOD*5`zV_x$YHx8FuRP>!4ly17jn2&QM%Z=NAjI~;Sbfe|vSB?QcGGK|SeGfXl*TBk!UAWT0wJ0LodTr0oLE=%o71s|q zqnYyNlCNPJo*_exzQ!lgWrhT_i~H}DB|*^lyBdTZA`>6~(g&px8(X-7squgCTPEed z`K^&*dQC86IiAuU*u>^PKE#_=h9mnAs7`Cx$iUkp>)%|WF6Lfoj;PG&#canygm@M! z7x%OZc+xZlevyTDmS=C>{;Ri1yC}+0_G6$EZbcp|^(?6p*7<=O7kdf4#kF2kZm%8u-Ue}$B<>_z1ZS<2H5jH*beM29*V_$s^}9KX8}fhgLHHTs9JCp8Z{?SShk?I3KU@a5#9>3=^<|B!_jS(L42-11j^t+;A zTPfJcug}-x(j%aO1rWJbFfk z{=0&cM3bL&mr@T_2^FIW%v9(lPh}cul9bPqrnUCCkgXid%0#yfreqogr-+d=>g9eX z{A7b+=_7&(qy49Jh*pWeYdPJ6y@wL#Ec+JjbFu6YT*$M&g9`48ntlr=ix+58 zOq234>Wz*`#LRiqpXIeEqPyM9pD#fEF& z8KNN|_9BUjhP>U~m@Zp^Yy?zMA*6OgUnDHwqRiUPODBYHk7~W=nQaOlndQ;aJq?8B zwzWAy6X~95SSiknAAEJr@?DUipkQ4P-nz_3YGIYEA#@>v@*&seoMaoFR?=A`jLP2D zdTs2eJEPY2XkVy2ALbw5tIdyGOaOcAzg13X6LV?eD3GjK-0Jq1rvF-Iq_X6() za$QL5{=|)|)@wb2XmQ#3(`~PYIs);#V27c!w@LXpUzElcml-*)e>vZLyz^mUTaJxQ z#;dT+Kcr8I-Gp?zxmmTqqNH_QJ27nh2yDdX-Qk5%Pt%{q;`>w0gYAH)450pkLUoJeEDwB7=N;0&bt&pdkwk3+9D$sGC6H)0N8% zpO}mzIy@t@e{mda4)sbHTGd80+=0{@DjpK~%JkdD>We%xx%Ue*Luxd^fd>5V9^CiI zEOwwtR@DzJxHU`oLw%MrZI?~~7M~A&ZXx!awdN*%_y&!~4+XxBYurulW-S3!?B?%w6n zJ=S$e$b~-#VzA3fsa=3l%-eH88HA0dfQGj}g1=;MOV#mgE-o*MJ<0tV5V#f?i4JnY zg_H>jJZq=%RycI-`#r$Zc4(>fa%??B?!IXmrk??Ohf%Rekg(tD+KZe_%fc-5pRB5t zAvq4Jy@in1VY=VhcLswz-&!fba=GPghqwj{6iEn9ZOrldnt19uNDCo{aCjfksvvk$ z!jMv|LhXn6dNkKANfR(~da=B+y_1?D8;*?HX2%F%e|)5id#~5!;n$T_{FJrh#(uA7 zm(NLLw=}Hy7s&>UFarpKf}v7bzDJfT@4ef%n|!23MZ~{ub$D;icJ$t{iT;qxUSehN z<@K7V+Pl-_5NwBTZ{SjIPYfEuUi&JXgHGJHqjbv3@Mhv^Dxv#D=}Tgz0_q|noK|9) zoI+G;c)voXm=>+?%yGi5oKsl-VzKf*P3ZmGACb0P3~wGrZKUdMse&32@?*hDii+Vu zpW&z_KvS@GCDOp~Fn&Pn&a{!5uBqS-m80MEaLRmj97ucST{{?antT)S;+(T^@ay#Y z(DUTW=$Bfvp<#gqQQJ6v27x<9yF>6=z_os9p%sSeE+iu&ZUq0xF}cA2JcaT3_l#fA zQm40StjNwh(*HS@H-!J-Xw?z_iy>I|P1&lR9{gqE9L~*@abvtzUrmWEWU7?Sj}B0` zUVEAS83yp1fZuQWviM)ZF2tY>1P=P*b7zB7eoEX~{)`!k)rndDoZ&;5YI9JtY2t)k zpeN?E6Kt6lQw|m3V*x7kr%quP8@BW(g^B=I4yfe6DC6L3IhW_+SCo|0ME6`WAP^I~ znS6P(Q~3xhfPVZJxIKa3>_00O>m_MMjZh({o*cRK?%5vU=*Q7&!~I0>4@)1#<;0o~0?J8QMwk`!MZKG&3Z9T1UnjjYhCNzv{j$yI^f3av6)2y4(c|{(R zlrOE4hl~w% zJnGgA%B~8WmyNvSfcg*zuekvhr7GUWqh=ojjpE6iY9Dv-FR1;k&K=R-)ZaTxY8qJ; z8AHGAjht>R)j{MG;>@d1Jh)acK@d}KDCU1ovpOX_qmlT$J4e>lcSxZbqy-#xyXMw3 zo%Z;3gnL$*>D2Zk&AVO4?J-epBua^D9_3yR^k<3*HmE}R?!BR2Iq0SxsV|R^^$FL3 z{y*ALku(ZBb$e`M6+XFJnB@~OWJir#_w#hwcj#S(xAZNKN2VkcsfghB0wj_R&LtbD zcxx9ebm8CM4|`$Sazs_U5>{-=Jgr%OngdqP4Dy}I$q(I3AS8&wXYNoBOE`^LC2KrA z_QA4b5cLyM`OIwE4nI&5xLFmb%+kUJYv}!osnEL1QI}iZ>y)Qsl>6nFb(1yg59U_Q4>TDPo7&ue$63q%kS{=uI%VaFh z=i-Wc7JW%LEyuaPAt;#yX;$=I=q>QvqIE|=%2kGF$XiLr;%4i>Sp9QEqNA}{bUPqlKV}u=vP}@$xyLb@@E&q3HFJOw1Qwq7pf58G)R+ktuR! zS9B=_y~0N~tts^&1GvjtLgUNaF8+pz`k&h={`WRkTu9L^C?(;XxaZOr}M4Yv(sZfPw>f ztPVPsjTZ$@Fb)&!ZUD9_MLVKt&7W>C7bE#esBll6dK$Bct$SM(SX~QN>F@4i{;A%U zqQ(9ULP+);c%%@N&WYtpSm^pmCxLtL% zMT%3X+A7l=+OxG2TUbG681L$k_6>*dhnCPH>dX`&)pSER_ly^hhl(erk#Vvec1EK zGd*2xf3MlK^9QXIc%UWR$XzC@H#0~%=Q@Bnpm`?c^DAUHK4bv2vVS-R*!Ym%zyP!4 z#cuxLb%}Aql-4^7*tX`kZ#~px?A_fUgVYtX<;-KM9 zJ$w^OZ$I6i7zz$(KmcE*u70k+uxAicXu11L;LOl5Iyx6r#a^LTGCM52vd&?D&`@@S zo>SeqK`IWB#Rb64BjeJ!te&WOvcO7CvXM^ ztMi8+_6gv;R|Qf1xddbs_m$*URoS(BC!a; zLLCi=7ip5F$7G=xK#8g)ag;YZYMp1K=;2zbA652o z=%#F|-$&ZF^j9W`6|2Q9CEtpf2k<_-th-cU?)7w7D{7@=fgoT1Q8HK{ibJC98lv$kgm8C*!tGD6E=Ar((OMg327;N^a@N4LvEw0lPN(lEhw_4ur1f$kIKBcHrw? zM@G?KY_xhAblEG)U7x@LbAK=Fd93G`kz{Vd2yE)vL8oUTYv)U7 zG3Pb(XZikNa)^-pv=qbt= z5)~P|Z_~bgLYf2v3ToK;>9=M@IS-m{Vq+jP$xNHN1VPC|z-)n)88vw-$A1$FQu3Ea zqrDga(@*s6>rm_`6ze|AjQ*|#Y(6RLfPb0g1d<=d0vg9msfNDMTIwX(V+?2m?0J?; z^s^79I-mp2`~?o$XAyc}&4nrFSx?#(>DThE1_MERmW4)$0|IdGVE=6LDy1PvwterG zH0m(`mm zR!oO=f2T9_6RJeq9fu{LWnwK7L$m#>rFHQR>&zAC*7nmm7Aw|&)n{x6LG?wj*>4o4 z)CCw;EhAd%Ib>P@b)Ku{znYucgj8ZJ%GMec zi{Ay%>?aiHH}}gr`ByD*FUW?JtDP5}M;cvUW^P0blN+KwABxVI69)7K8Fje(!LZEp zX_^rZ8x=m|z-%}x-;D^&`~3Nn)mORd2v!J?T>LFm7}1`@aBCeZpT{I69IFP#0! zWx479b%m!D(&)d`p%^ggpx=B!u-vRX2ArpdT4TBmw z|KEd%Ksho0(;+-z&|=}vV6bQH5LjvajJThvn{<|Fi@+IMQGHWTA^svb?8wyCi*8S zkUNAv|59U*S$p>`6y&dqH7-GU47)?BTY3$;SNZwq_&a74B1z75pT~f@TGGb`*^M(U z+kPdcR66K0i%&zRu^lNF9ppJxIcW8okrrToDblhL2Kam6m4Bp1cMcatiBv)|Jxrka zH?94@6nS26iu%30my)0D=g~aRI>t^1IDCmqKR_mB%~by!kZtlk>g)h_Wda9;8_?J1 zYOF@RAe#k-GwFXH>+d2@1ow9JL|kzP1w+-G9UFaWbLv7pNp)@ zN?SN2nOv};4onY6RTBdxV>H0YNDja9%wrXLtv>IcQf z;_OK#8`8XDW4SECfx8@&&r9<1@``)Ke=tA!3UPuuW1gqy%6#BKJwCqvb1!gYVj_H# zoe9mF{DTdh->r>#&I}oHjI71kk@ZCgnr<`C zy`Zl^A;MOxloKhgr5A&Y=E((7{9cB_LwjxIqA5-F!*X%BSc;9LnZtLZdBVn9n#7Tj z6#1dO>152W)rb4!<93YwGczLIaIicmI%^d><``8d*pBg*bonA#qMfDW`W>Eo$>E_S)L?ypAA5W0l*0{5hDKq?8hGfAT&9?#r$%v10Dr6od$sT6C4NKbU^h3 zXxF1dHU*S%yAM#`n7^uOa*>>+sVs!Jxw*97eBPa*`X&cIJ;6kY^qEBSDFHR`a?!JnZj~E3CfcH!MJ_x#VRJZ>s1f^AdyGXR`flkU;zC}|0kZS`d z%_=gvftn(`uAo&()l6F-&cLu4ln&o(3Lv5EpRN~Bgbm+8_gjG)B#aFVQ1o3@k-5;1f{KENd7Bx6D0F_|M>ldp40>CK}U@!#(Ff{f{;zB8iAUdLELce@yy&U}&8z+;g9{3GqL5{4E&5zyPkPca1}^+4%& zAOj$(Ok2QrjZ{9(0g1R%6apVrb{vGf?bwSDTqdKvAeHzZS^59`$l>2cFf;aRUn#hB z`ExxkVxviewzgubKCr%XJWpzQ1;=NR8|AmQu_735jZ$h9hHOJJG4M zl18p0a8qUVLEa0t{#a@@92J!SY95S~0b&Sup7CJg^CRl^b27!z!W z+e;>|3<$p>m8*GnF-noCNh{zp%>zenD!~U=uuVqkibm<3M}hl;AtkL;BH*3^g-0W+y*xLNs9HEaRD`l z7v56HhFNaOllo!yqi}}i&%erxNBL1?B!<8nWG91sux-7?ibf-s5G=;`ajETw3+t$C z=!JD)B-GGO6E(vXyd!~H6q)2A&}jb5IVj=xpP|yPGgpB2>>Wr6aqdJMftGjL?g$Xs zG;!rve2C_utcySn6$0GskAL}pjS#Q+Kj7eLx@Kha@2MrtrL}0I)sPBPsE_y^3UOtT z6oDKoHqZNYiz@@_qO!kMn>mWQyAu?T_uH_@hPqwrCaw(ij0pC<6nUk&SrK9@$}r!7 z`taz8>fDnv8N-Kt2L)E%UOz50g1g`pk||K#erfTGKCTWnfFbRw#c`DP^>w-E{%3k_LSOzgloP zl*FDp>4$MbQSr!%F>rSgPwcodI4$ZkP*J4m)kdRFS1Q|R#=qaeBga0wXD0u>9_O=; z@a_J-Y0V5J$+~pLk3c7386$@e58oS|hT@pjVYM{B-dWkLQ~(B?G|JYTX5+hrrOfJ6 z2T4!@JP`UM7Has<_S%T}?}WpHk!cOoKy%Oo@t({bQWCBq^jpwVun#d@)ZRtWJo>Re z=s4gfaS}KTM5L1mgxv@?sFaP_SNEBDB||xQ@)DoqVV~6$*zQ|w8fgRNS1126h4H-v zN8;L))~~gyXuM_Lot$+*!E(5NG%<;>$RjNVxT?v8!V?ig9KvDia^v(h>#$;5LGOU^ zn5i*!C~uXgov@X9@pBZJg#jpa${hpl9b?diGN7D~i#|zc-R1i>$m9LfIaQd=H`BWy zss=U|4Ek_V+U`7DAY%*#m7!qgv+KXk1F7^cViosBkrM#0G0qNXI6?tQV2veL%HWr1 zZzY|S5b2ddr_n;S0ALDn0l3x%>SzH;$6}x`N15gMOt67tPFQw@%fD~^ zW%qmhW4x>^f7@mYymVtTkJ#;{Moc}k>(Q0KF_uZ*nCAnOla|i|Orbde!(%~}cZy%W zGT{a3uPxMrA^TVE&zfbDI?9Nn1l-_krs>KXrKqE`L0du z8ly&D_)QjJ+IJmI3RD7>)Y4dxCO z$38&A+#TcrR3IFXbnF4tF|M^H@cTJY4fspKq&aJL^$pGmQVSePbIMVMhJx8-(