From 6cfd8b70766563e447450f39972d934187a30a07 Mon Sep 17 00:00:00 2001 From: Nienhaus Date: Fri, 7 Nov 2014 19:18:48 -0600 Subject: [PATCH 1/2] Adds EngiCart http://i.imgur.com/18w9fkq.png Can hold three toolboxes, metal, plasteel, glass, tape, and a flashlight. --- baystation12.dme | 1 + code/game/objects/structures/engicart.dm | 173 +++++++++++++++++++++++ icons/obj/engicart.dmi | Bin 0 -> 1900 bytes 3 files changed, 174 insertions(+) create mode 100644 code/game/objects/structures/engicart.dm create mode 100644 icons/obj/engicart.dmi diff --git a/baystation12.dme b/baystation12.dme index bd4705e5d7c..adeb1dcc9e0 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -725,6 +725,7 @@ #include "code\game\objects\structures\displaycase.dm" #include "code\game\objects\structures\door_assembly.dm" #include "code\game\objects\structures\electricchair.dm" +#include "code\game\objects\structures\engicart.dm" #include "code\game\objects\structures\extinguisher.dm" #include "code\game\objects\structures\false_walls.dm" #include "code\game\objects\structures\flora.dm" diff --git a/code/game/objects/structures/engicart.dm b/code/game/objects/structures/engicart.dm new file mode 100644 index 00000000000..ed96aa27e08 --- /dev/null +++ b/code/game/objects/structures/engicart.dm @@ -0,0 +1,173 @@ +/obj/structure/engineeringcart + name = "engineering cart" + desc = "A cart for storing engineering items." + icon = 'icons/obj/engicart.dmi' + icon_state = "cart" + anchored = 0 + density = 1 + flags = OPENCONTAINER + //copypaste sorry + var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite + var/obj/item/stack/sheet/glass/myglass = null + var/obj/item/stack/sheet/metal/mymetal = null + var/obj/item/stack/sheet/plasteel/myplasteel = null + var/obj/item/device/flashlight/myflashlight = null + var/obj/item/weapon/storage/toolbox/mechanical/mybluetoolbox = null + var/obj/item/weapon/storage/toolbox/electrical/myyellowtoolbox = null + var/obj/item/weapon/storage/toolbox/emergency/myredtoolbox = null + var/obj/item/taperoll/engineering/myengitape = null + +/obj/structure/engineeringcart/proc/put_in_cart(obj/item/I, mob/user) + user.drop_item() + I.loc = src + updateUsrDialog() + user << "You put [I] into [src]." + return +/obj/structure/engineeringcart/attackby(obj/item/I, mob/user) + var/fail_msg = "There is already one of those in [src]." + if(istype(I, /obj/item/stack/sheet/glass)) + if(!myglass) + put_in_cart(I, user) + myglass=I + update_icon() + else + user << fail_msg + else if(istype(I, /obj/item/stack/sheet/metal)) + if(!mymetal) + put_in_cart(I, user) + mymetal=I + update_icon() + else + user << fail_msg + else if(istype(I, /obj/item/stack/sheet/plasteel)) + if(!myplasteel) + put_in_cart(I, user) + myplasteel=I + update_icon() + else + user << fail_msg + else if(istype(I, /obj/item/device/flashlight)) + if(!myflashlight) + put_in_cart(I, user) + myflashlight=I + update_icon() + else + user << fail_msg + else if(istype(I, /obj/item/weapon/storage/toolbox/mechanical)) + if(!mybluetoolbox) + put_in_cart(I, user) + mybluetoolbox=I + update_icon() + else + user << fail_msg + else if(istype(I, /obj/item/weapon/storage/toolbox/electrical)) + if(!myyellowtoolbox) + put_in_cart(I, user) + myyellowtoolbox=I + update_icon() + else + user << fail_msg + else if(istype(I, /obj/item/weapon/storage/toolbox)) + if(!myredtoolbox) + put_in_cart(I, user) + myredtoolbox=I + update_icon() + else + user << fail_msg + else if(istype(I, /obj/item/taperoll/engineering/)) + if(!myengitape) + put_in_cart(I, user) + myengitape=I + update_icon() + else + user << fail_msg + +/obj/structure/engineeringcart/attack_hand(mob/user) + user.set_machine(src) + var/dat + if(myglass) + dat += "[myglass.name]
" + if(mymetal) + dat += "[mymetal.name]
" + if(myplasteel) + dat += "[myplasteel.name]
" + if(myflashlight) + dat += "[myflashlight.name]
" + if(mybluetoolbox) + dat += "[mybluetoolbox.name]
" + if(myredtoolbox) + dat += "[myredtoolbox.name]
" + if(myyellowtoolbox) + dat += "[myyellowtoolbox.name]
" + if(myengitape) + dat += "[myengitape.name]
" + var/datum/browser/popup = new(user, "engicart", name, 240, 160) + popup.set_content(dat) + popup.open() +/obj/structure/engineeringcart/Topic(href, href_list) + if(!in_range(src, usr)) + return + if(!isliving(usr)) + return + var/mob/living/user = usr + if(href_list["glass"]) + if(myglass) + user.put_in_hands(myglass) + user << "You take [myglass] from [src]." + myglass = null + if(href_list["metal"]) + if(mymetal) + user.put_in_hands(mymetal) + user << "You take [mymetal] from [src]." + mymetal = null + if(href_list["plasteel"]) + if(myplasteel) + user.put_in_hands(myplasteel) + user << "You take [myplasteel] from [src]." + myplasteel = null + if(href_list["flashlight"]) + if(myflashlight) + user.put_in_hands(myflashlight) + user << "You take [myflashlight] from [src]." + myflashlight = null + if(href_list["bluetoolbox"]) + if(mybluetoolbox) + user.put_in_hands(mybluetoolbox) + user << "You take [mybluetoolbox] from [src]." + mybluetoolbox = null + if(href_list["redtoolbox"]) + if(myredtoolbox) + user.put_in_hands(myredtoolbox) + user << "You take [myredtoolbox] from [src]." + myredtoolbox = null + if(href_list["yellowtoolbox"]) + if(myyellowtoolbox) + user.put_in_hands(myyellowtoolbox) + user << "You take [myyellowtoolbox] from [src]." + myyellowtoolbox = null + if(href_list["engitape"]) + if(myengitape) + user.put_in_hands(myengitape) + user << "You take [myengitape] from [src]." + myengitape = null + + update_icon() + updateUsrDialog() +/obj/structure/engineeringcart/update_icon() + overlays = null + if(myglass) + overlays += "cart_glass" + if(mymetal) + overlays += "cart_metal" + if(myplasteel) + overlays += "cart_plasteel" + if(myflashlight) + overlays += "cart_flashlight" + if(mybluetoolbox) + overlays += "cart_bluetoolbox" + if(myredtoolbox) + overlays += "cart_redtoolbox" + if(myyellowtoolbox) + overlays += "cart_yellowtoolbox" + if(myengitape) + overlays += "cart_engitape" diff --git a/icons/obj/engicart.dmi b/icons/obj/engicart.dmi new file mode 100644 index 0000000000000000000000000000000000000000..3e171fc173eebf412a73def4e69354d570fc33c3 GIT binary patch literal 1900 zcmZ`)dpy$(7yp@IVezy#*coS_IrjI#`}0#)#N z;mqIFl5RjS??&FY^4le1R+rTyKX+a~p#d68@540tdTE!ByTUWXiDIeL?xzfG?n;4ziju#= zwJ?fJr`v&T-}V05As^VN2AQ_Z|AM$x%$`<;a!L2 zp7Lvg`CrF%#Z}r8NP4{vf~MZSCM^kCp0`JSJ-^?0f;E zQn6PL5=FbsLe^P;5dRBzPz+Yxd$Kgckh;~oq-;LgwBxfKluz4J2E z+xYC3tSMh*OlYLXoBi@*ceQ%ca;vAviK29(82z!*oq!OCbOSUtT>~h3qp5bTNDgb+ z%qC0f!l@l($$-5mIMRirAs6@B$J`-I$=EN!pGO^g|8@Cg{8=DPtWfftZ=DBHJfigV zWUCm5YyBjcd>lYF_Mz`6%F1F)%3ddw_G1aId7K%s$S19OA` z1FzHf1~dRg9SKyr!-dNIcIs)ZXZN4XEDRT+I`9|e4STT#V4aecLtWqQQDfdzxEBf< z=pB()dw{C!J!_anrt<|j)*1YplO@W+0uHm%<<#}xB;`~-8h(LmCzSmTNi&O?Rih6o znDOS{{gGbdXYW!nl~Z|@^$vuLFv#@2q4m5ph&wcGO1+3kAaeVFH28C^T+fM`wa5Ni zYgYqp88avtSb6eGABYsP&}@|xv(#aGyj=ZO3IEBNDG{O8p?``7Pczw?bNhOWI|rln z`T#9+Yi>UxGSYOW#q$W8%@&7%zgS0~e-RPxzwipW&P~k8iV$+Ei(0K8Ta+1yWDP~& z53Hx&tJf-tQQUb;)SFoLfj%Hb8|AhtXNzCXR{6Mmv#Gfe$c|QsjYiy`w}BB~?*K7V z4GU7AKWKCo#zLf17<)ZUf#-H)fvTWR_qGX{f5((RsT6W(w}N>+sllr>{1)~0i@oGSvM)>M2oYlD9b2c+yg=4oQGkl;Tc}9 zB-z8!wc%F*x#RK86y;E|X1imy5DdF*t3INPT$Nihx|9vlw4Ew%WaKpBXlgcgSZ6OG zD|(U^$uUd+LlRy$S6o!|QkA=$gXGx9I%12w(dN#H$wsnhR7-%o>$>xIRP6Lef zafheqoMnyOb=x)9Nd^gjwY6bhNp8p68#3NF*n?U(vKOy=${5u(D*wYu%B;rdivOKu zqX0a5D_HPHxAjWDI6%6VduQK<_Td9(aZukw0?MbIoqQ%AhmcFz{?2rK%G;s{`;LZo z54Ib+pTA*+(bmZI=4<*g7_ok5aF8|vd36#%8@3*BF39=$;!{@I2{d7Q!Xkl z=1)mU;cz%@w>rIb_izkti{Y{|wa}$EM}tE{7q&MR5kbo^sRKk+60P?m!PL|g08+b( zy_K3>v?s<#`RfO^^4ClHAa7rfrvl|~kon=y+>`d&7krH@d!1##1OeXQHjM!$C%8e~o2|~xxscHJO zBVAGI6Mq>{+aXi|T@bSbJZ*jj7}nCjz~G70A6JTMvyGUp~s6~(& zHcQLQ&(DuAv%>w?&fi|pQe}iY3Ct_0kXEYLK_@E5=z{W@W?Bwz2=!(B35Y97N&-7C9Qe$#`Q8Z&0dr4@Nm+E@Z+>X z6n-PH8J_$YlNHj7Xo^q`P!Eza+%=6;Pd!=0OKvFZ Date: Fri, 7 Nov 2014 22:48:44 -0600 Subject: [PATCH 2/2] Ports the TG style Jani Cart. --- .../objects/items/devices/lightreplacer.dm | 5 + code/game/objects/items/weapons/mop.dm | 7 +- .../objects/items/weapons/storage/bags.dm | 5 + code/game/objects/structures/janicart.dm | 162 +++++++++++++++++- icons/obj/janitor.dmi | Bin 1785 -> 2500 bytes 5 files changed, 177 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 15dfc43a7db..63836e9ecc6 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -188,6 +188,11 @@ //Can you use it? +/obj/item/device/lightreplacer/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) + J.put_in_cart(src, user) + J.myreplacer = src + J.update_icon() + /obj/item/device/lightreplacer/proc/CanUse(var/mob/living/user) src.add_fingerprint(user) //Not sure what else to check for. Maybe if clumsy? diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index eef11d00953..44dd498c426 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -53,4 +53,9 @@ obj/item/weapon/mop/proc/clean(turf/simulated/A as turf) spawn(5) reagents.clear_reagents() mopcount = 0 - return \ No newline at end of file + return + +/obj/item/weapon/mop/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) + J.put_in_cart(src, user) + J.mymop=src + J.update_icon() \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index a591567f701..bde3d2d5550 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -47,6 +47,11 @@ icon_state = "trashbag2" else icon_state = "trashbag3" +/obj/item/weapon/storage/bag/trash/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) + J.put_in_cart(src, user) + J.mybag=src + J.update_icon() + // ----------------------------- // Plastic Bag diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index ce96dc510a4..15096c49b22 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -400,4 +400,164 @@ /obj/item/key/ambulance name = "ambulance key" desc = "A keyring with a small steel key, and tag with a red cross on it." - icon_state = "keydoc" \ No newline at end of file + icon_state = "keydoc" + +//TG style Janicart + +/obj/structure/janitorialcart + name = "janitorial cart" + desc = "This is the alpha and omega of sanitation." + icon = 'icons/obj/janitor.dmi' + icon_state = "cart" + anchored = 0 + density = 1 + flags = OPENCONTAINER + //copypaste sorry + var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite + var/obj/item/weapon/storage/bag/trash/mybag = null + var/obj/item/weapon/mop/mymop = null + var/obj/item/weapon/reagent_containers/spray/cleaner/myspray = null + var/obj/item/device/lightreplacer/myreplacer = null + var/signs = 0 + var/const/max_signs = 4 + + +/obj/structure/janitorialcart/New() + create_reagents(100) + + +/obj/structure/janitorialcart/proc/wet_mop(obj/item/weapon/mop, mob/user) + if(reagents.total_volume < 1) + user << "[src] is out of water!" + else + reagents.trans_to(mop, 5) // + user << "You wet [mop] in [src]." + playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + +/obj/structure/janitorialcart/proc/put_in_cart(obj/item/I, mob/user) + user.drop_item() + I.loc = src + updateUsrDialog() + user << "You put [I] into [src]." + return + + +/obj/structure/janitorialcart/attackby(obj/item/I, mob/user) + var/fail_msg = "There is already one of those in [src]." + + if(istype(I, /obj/item/weapon/mop)) + var/obj/item/weapon/mop/m=I + if(m.reagents.total_volume < m.reagents.maximum_volume) + wet_mop(m, user) + return + if(!mymop) + m.janicart_insert(user, src) + else + user << fail_msg + + else if(istype(I, /obj/item/weapon/storage/bag/trash)) + if(!mybag) + var/obj/item/weapon/storage/bag/trash/t=I + t.janicart_insert(user, src) + else + user << fail_msg + else if(istype(I, /obj/item/weapon/reagent_containers/spray/cleaner)) + if(!myspray) + put_in_cart(I, user) + myspray=I + update_icon() + else + user << fail_msg + else if(istype(I, /obj/item/device/lightreplacer)) + if(!myreplacer) + var/obj/item/device/lightreplacer/l=I + l.janicart_insert(user,src) + else + user << fail_msg + else if(istype(I, /obj/item/weapon/caution)) + if(signs < max_signs) + put_in_cart(I, user) + signs++ + update_icon() + else + user << "[src] can't hold any more signs." + else if(mybag) + mybag.attackby(I, user) + else if(istype(I, /obj/item/weapon/crowbar)) + user.visible_message("[user] begins to empty the contents of [src].") + if(do_after(user, 30)) + usr << "You empty the contents of [src]'s bucket onto the floor." + reagents.reaction(src.loc) + src.reagents.clear_reagents() + +/obj/structure/janitorialcart/attack_hand(mob/user) + user.set_machine(src) + var/dat + if(mybag) + dat += "[mybag.name]
" + if(mymop) + dat += "[mymop.name]
" + if(myspray) + dat += "[myspray.name]
" + if(myreplacer) + dat += "[myreplacer.name]
" + if(signs) + dat += "[signs] sign\s
" + var/datum/browser/popup = new(user, "janicart", name, 240, 160) + popup.set_content(dat) + popup.open() + + +/obj/structure/janitorialcart/Topic(href, href_list) + if(!in_range(src, usr)) + return + if(!isliving(usr)) + return + var/mob/living/user = usr + if(href_list["garbage"]) + if(mybag) + user.put_in_hands(mybag) + user << "You take [mybag] from [src]." + mybag = null + if(href_list["mop"]) + if(mymop) + user.put_in_hands(mymop) + user << "You take [mymop] from [src]." + mymop = null + if(href_list["spray"]) + if(myspray) + user.put_in_hands(myspray) + user << "You take [myspray] from [src]." + myspray = null + if(href_list["replacer"]) + if(myreplacer) + user.put_in_hands(myreplacer) + user << "You take [myreplacer] from [src]." + myreplacer = null + if(href_list["sign"]) + if(signs) + var/obj/item/weapon/caution/Sign = locate() in src + if(Sign) + user.put_in_hands(Sign) + user << "You take \a [Sign] from [src]." + signs-- + else + WARNING("Signs ([signs]) didn't match contents") + signs = 0 + + update_icon() + updateUsrDialog() + + +/obj/structure/janitorialcart/update_icon() + overlays = null + if(mybag) + overlays += "cart_garbage" + if(mymop) + overlays += "cart_mop" + if(myspray) + overlays += "cart_spray" + if(myreplacer) + overlays += "cart_replacer" + if(signs) + overlays += "cart_sign[signs]" \ No newline at end of file diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi index 92a8c6c528fc0fbdb55e2d3ec4e2937fc8235efe..57314ee7f059f383d707b5095a6bc618a56f3da7 100644 GIT binary patch literal 2500 zcmV;#2|M005u}0{{R3yb+fl0003~P)t-sz`(#? zUtieS+kZ_0g@=o?ZU+CE00jjFrKP2jk&$w8a?HR0R8&-8fPlor#1Sk>{Qm&``^;8# zcbWhH09ly;XtDrz%-h}qI5;>!KtKS6<%R730000iEGz)b{{Wf)HDAV6eA;xE>i`@8 z%w{t;RV^167glgQA0Ho0O-&mc8|v!n|NsAOZEeh%GeK7>0L(N005h3p0165r|K$K2 z92`YOMGh`VCpJ$ZE<-RuVH6!FJ#oi4XSDzG^J)zZAby$A^Ry?qEn zaAsy^|H_sB006v;TA2U<7b7yv000ssIE;*p^|5D%MTuqr0MCEY94kN^D?hSMP6Sku zEo-}deSIq{D^pWbj13kXEkz$NOG9+bZfV=-0C=30)4>jcFbn|DGy94K?*^5t7XvXKqJCPQ~7!bc3TnEXmstTzwTeoii|8G0@<^~eDk3bU1KA-#T=Yt6c$hYU-bIIqBD2n9&%+%DR z4fsr@Tu}N&V|qGvzZsW!K5Tk=Hl7diG4s(aL@bI7zqx3i3h4ts-Ye!mUI_I`to%h3 zRA!VJp5XjEJS>DzWcq=iI-VK^+<1cX~Z_{ZB}SWQ8Eaj zA-g{2)GTJ1CP89ZuHee*>gozhFq6rxt*x(TGJHW!{emD$QFeKQV&TTru?6#mTn-Cv zZWi+6`Sr5I5+s@&zfTYh!%Q!OnQ{G;P#F{n7FmLun|Kc9avVXy`pnNDnS-1`MuJ6V z1~)g?*Vot9c!C^1H3(g>Bof@(DsF9!FUZTEmmp>ttH`e;5(K~T1;f+_W`j1yD$ZYt zFIfB(U=|4xq!o##>zXd8k1QEOreL;I5@b+WL9l{7!67@XtZNz=Y9hgsYseB576~6T z#H|a@ucw|pJpJ6Cr$A9!v>w zQUwm;phhFR*I_{XMqe0%jmyV+riK0;2e!V3jYpm(@ngprWvbaMxR?1#!P$vHHNx;KSmuAr{p3 zv!l&Hg}96oL~jy&`)hYe%liD{bXuX${et*~VD*5jjG zqk)sy_(~^&YP^D``NXtL#a2w~>G82`jbxZN4&xd4jRbK`?8#!O#T3wv9HQI*xP7Xig0BZ9q`nSk9u0 zH%J{DOJM{B{X5Gttv1pEK+v{3AZS_r{vH4QnOtv(iJ)o#B z=Q#L1jt}tbc0Ix7_jncj;aL*|mwk;+lt6)?*Igvas(65EeR)NTnVm&Emx3StB3{PhRL9ye}{|o%{kO2 zDOI1KAP)TQTL)X$YQIYGS}6P`3EjVgVcYh$Mu?-YI-a1IsQo)(f3JCR;$2nPXk9CT zg*vQYl>VJ4-e|S-T!t*vfBbpfKYP7y@Vxwjk@|O{xbZ&smwwV}wcvym9{R*K|BuBf4R{tFOKdi<-b1$)GR;Bi(^6V`(r=~MkV!v5{X12kw_#GiA0hNv)tQA zQh?w_m&wDpT~Z>65A{a+bK~Q7MiTGOjSmq_Z}Ub9Mke)w5{X2T4F3U>ept8}XSl}z O0000G9 delta 1758 zcmV<41|j*x6Zs8jiBL{Q4GJ0x0000DNk~Le0001h0001h2m=5B0QBII`2YX_=TJ;k zMZmzoUteF?+1r0j0)>Z*vu+0enE<7wrIC@5a&mH1R8-8s0APTC#KgoAEJ^(T09JK( zng9O)S(yN6vH*9?k#Qk^1qB8D`^?+k0?cMJ>gwwM|NqRHGXTsp{{S5^J)zZ z`;z3s`h6e}9YMbI62?+`cA;7@E6zZvy z00001bW%=J06^y0W&i*Hwv&+o6o1me4uUWY2H^Ad6bsx9s8=rrVmQb(;B#oQ|9+)SdE6<2-l_Wg=nn z!6%%xnp`-^IeQTFxYR#q5C){EYbNV!d{z*hZRCt{2n0nORuFn(zO8b|uR;2E7;uo6|Ete}KhBdVadP z*0GFGrDN*kJb`0B7vGkJ=;NtS~@uk=2?$zo23mRilYb1T0CW*RzfWtR z(~$s3>OZal$s!N{U6_G>zuWCzUC97s_a6Zmr~t07_3P{W0Mh%vN&E*Y0PxQbAm4wQ zbp8W5fc_guScD9KSA@oJXbk21AIZQ#kpXl;Bnrj=JMPA4Xc$0XC;*g2C>L1+-U^V} z(+p$=$WOpafI;o4|9?;p!1e*fZY(8eadx56FiL@;$Uw9c=Jw}nghocV1ja}TK#dP> zPsEl$QG|tRL~n#+0-)n2fFKwnc@37JWBXUCRH;%X{r)2Z)VY`0Cbae#Tfv5GJUrIuA2e|=I zqc*-9kH>d4!GC+gMlGDYAl_`Y**g-MzZppY(3S$6P>JI7Efsl3A_0Ish^0X11B}~u zV=+LTN(P{+K|RiZ2w>bcUXuX@fUcV#!VG-WcL^wfao5gS11Q5jr0Y8M{|NpZfVj#9 z0E#%$5gD`@T?hyw@eCq~0Oaw+Rb;PLugBTq_K3e)M}G&XRH;&>N|l8AgfS-Hc!Jqg zxx)ApwlK00wmwfLwv}UusX*C!+t|jAg>9PvVE2!yWz9gD`-A_SudD#z?*IV?0LLbm zpFPi;CH?Oe)0-~liD=dOBM#EGx@${q8ODRavS$Rrb+P-mgP|4)fFF3#1Yst=zp-?zF^>)S zisI9!rRJ}|Z?)3kW2vo{%cs@yX*rJoLb-wKIDdiT{=?c{0zjvmnmb*>xjaKj{0ZjE zrcFMVS}IPgK#&4Faoq|2X47^GfK>H7ENym8*6?|Hm^cAgcY_jpk#o>MmeWv_{unOTzq@*Jc!f$Zvdcs z(SHEXQHl-}hqTY5tBp89q7*(y8%e=&aS=`Z`!eFX=pi5*&)z&{8| z@((<&f^ssDoZq)q(h?}o@5KX%&hOrHIZFVl^Lya{%JX~S1j_S!;RLGldl>-I^Lq&Z z^7DJ~0IKtQ;RMR_d*KAi^Lx=!pWh27IM(_7KTHEe3W2e!ga7~l07*qoM6N<$f|n>s A