diff --git a/baystation12.dme b/baystation12.dme index ec5a6267ce..a96b3f20b3 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -444,6 +444,7 @@ #include "code\game\objects\effects\decals\Cleanable\humans.dm" #include "code\game\objects\effects\decals\Cleanable\misc.dm" #include "code\game\objects\effects\decals\Cleanable\robots.dm" +#include "code\game\objects\effects\decals\Cleanable\tracks.dm" #include "code\game\objects\effects\spawners\bombspawner.dm" #include "code\game\objects\effects\spawners\gibspawner.dm" #include "code\game\objects\effects\spawners\vaultspawner.dm" diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 20eb15d6af..261e8c6d75 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -164,6 +164,19 @@ proc/tg_list2text(list/list, glue=",") return text2list(return_file_text(filename),seperator) +//Turns a direction into text + +/proc/num2dir(direction) + switch(direction) + if(1.0) return NORTH + if(2.0) return SOUTH + if(4.0) return EAST + if(8.0) return WEST + else + world.log << "UNKNOWN DIRECTION: [direction]" + + + //Turns a direction into text /proc/dir2text(direction) switch(direction) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index f5870a2499..6660c00345 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -6,6 +6,7 @@ var/list/fingerprintshidden var/fingerprintslast = null var/list/blood_DNA + var/blood_color var/last_bumped = 0 var/pass_flags = 0 var/throwpass = 0 diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index 8ef8c76f62..6b7038a38e 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -56,7 +56,7 @@ src.visible_message("\red [user] has slashed [src]!") playsound(src.loc, 'sound/weapons/slice.ogg', 25, 1, -1) if(prob(10)) - new /obj/effect/decal/cleanable/oil(src.loc) + new /obj/effect/decal/cleanable/blood/oil(src.loc) healthcheck() @@ -66,7 +66,7 @@ src.visible_message("\red [M] has [M.attacktext] [src]!") M.attack_log += text("\[[time_stamp()]\] attacked [src.name]") if(prob(10)) - new /obj/effect/decal/cleanable/oil(src.loc) + new /obj/effect/decal/cleanable/blood/oil(src.loc) healthcheck() diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm index aa274e505e..88b785b5c0 100644 --- a/code/game/machinery/bots/cleanbot.dm +++ b/code/game/machinery/bots/cleanbot.dm @@ -293,16 +293,14 @@ text("[src.oddbutton ? "Yes" : "No" /obj/machinery/bot/cleanbot/proc/get_targets() src.target_types = new/list() - target_types += /obj/effect/decal/cleanable/oil + target_types += /obj/effect/decal/cleanable/blood/oil target_types += /obj/effect/decal/cleanable/vomit - target_types += /obj/effect/decal/cleanable/robot_debris + target_types += /obj/effect/decal/cleanable/blood/robot target_types += /obj/effect/decal/cleanable/crayon target_types += /obj/effect/decal/cleanable/liquid_fuel target_types += /obj/effect/decal/cleanable/mucus if(src.blood) - target_types += /obj/effect/decal/cleanable/xenoblood/ - target_types += /obj/effect/decal/cleanable/xenoblood/xgibs target_types += /obj/effect/decal/cleanable/blood/ target_types += /obj/effect/decal/cleanable/blood/gibs/ target_types += /obj/effect/decal/cleanable/dirt diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm index d71a43c083..59b77c54fd 100644 --- a/code/game/machinery/bots/ed209bot.dm +++ b/code/game/machinery/bots/ed209bot.dm @@ -796,7 +796,7 @@ Auto Patrol: []"}, s.set_up(3, 1, src) s.start() - new /obj/effect/decal/cleanable/oil(src.loc) + new /obj/effect/decal/cleanable/blood/oil(src.loc) del(src) diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index 3496b6723a..68d9888d5e 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -964,6 +964,6 @@ s.set_up(3, 1, src) s.start() - new /obj/effect/decal/cleanable/oil(src.loc) + new /obj/effect/decal/cleanable/blood/oil(src.loc) unload(0) del(src) diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm index fb3646653c..c4de96f5e9 100644 --- a/code/game/machinery/bots/secbot.dm +++ b/code/game/machinery/bots/secbot.dm @@ -726,7 +726,7 @@ Auto Patrol: []"}, s.set_up(3, 1, src) s.start() - new /obj/effect/decal/cleanable/oil(src.loc) + new /obj/effect/decal/cleanable/blood/oil(src.loc) del(src) /obj/machinery/bot/secbot/attack_alien(var/mob/living/carbon/alien/user as mob) diff --git a/code/game/objects/effects/decals/Cleanable/aliens.dm b/code/game/objects/effects/decals/Cleanable/aliens.dm index 7ee6aaa3b5..9e33b680cb 100644 --- a/code/game/objects/effects/decals/Cleanable/aliens.dm +++ b/code/game/objects/effects/decals/Cleanable/aliens.dm @@ -1,30 +1,20 @@ // Note: BYOND is object oriented. There is no reason for this to be copy/pasted blood code. -/obj/effect/decal/cleanable/xenoblood +/obj/effect/decal/cleanable/blood/xeno name = "xeno blood" desc = "It's green and acidic. It looks like... blood?" - gender = PLURAL - density = 0 - anchored = 1 - layer = 2 icon = 'icons/effects/blood.dmi' icon_state = "xfloor1" + basecolor = "#05CC05" random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") - var/list/viruses = list() - blood_DNA = list() - Del() - for(var/datum/disease/D in viruses) - D.cure(0) - ..() - -/obj/effect/decal/cleanable/xenoblood/xgibs/proc/streak(var/list/directions) +/obj/effect/decal/cleanable/blood/xeno/proc/streak(var/list/directions) spawn (0) var/direction = pick(directions) for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++) sleep(3) if (i > 0) - var/obj/effect/decal/cleanable/xenoblood/b = new /obj/effect/decal/cleanable/xenoblood/xsplatter(src.loc) + var/obj/effect/decal/cleanable/blood/xeno/b = new /obj/effect/decal/cleanable/blood/xeno/xsplatter(src.loc) for(var/datum/disease/D in src.viruses) var/datum/disease/ND = D.Copy(1) b.viruses += ND @@ -32,10 +22,10 @@ if (step_to(src, get_step(src, direction), 0)) break -/obj/effect/decal/cleanable/xenoblood/xsplatter +/obj/effect/decal/cleanable/blood/xeno/xsplatter random_icon_states = list("xgibbl1", "xgibbl2", "xgibbl3", "xgibbl4", "xgibbl5") -/obj/effect/decal/cleanable/xenoblood/xgibs +/obj/effect/decal/cleanable/blood/xeno/xgibs name = "xeno gibs" desc = "Gnarly..." gender = PLURAL @@ -43,19 +33,19 @@ icon_state = "xgib1" random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6") -/obj/effect/decal/cleanable/xenoblood/xgibs/up +/obj/effect/decal/cleanable/blood/xeno/xgibs/up random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibup1","xgibup1","xgibup1") -/obj/effect/decal/cleanable/xenoblood/xgibs/down +/obj/effect/decal/cleanable/blood/xeno/xgibs/down random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibdown1","xgibdown1","xgibdown1") -/obj/effect/decal/cleanable/xenoblood/xgibs/body +/obj/effect/decal/cleanable/blood/xeno/xgibs/body random_icon_states = list("xgibhead", "xgibtorso") -/obj/effect/decal/cleanable/xenoblood/xgibs/limb +/obj/effect/decal/cleanable/blood/xeno/xgibs/limb random_icon_states = list("xgibleg", "xgibarm") -/obj/effect/decal/cleanable/xenoblood/xgibs/core +/obj/effect/decal/cleanable/blood/xeno/xgibs/core random_icon_states = list("xgibmid1", "xgibmid2", "xgibmid3") /obj/effect/decal/cleanable/blood/xtracks diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index d5f8dd59ac..ed405447c1 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -1,16 +1,19 @@ -#define DRYING_TIME 5 * 60*10 //for 1 unit of depth in puddle (amount var) +#define DRYING_TIME 5 * 60*10 //for 1 unit of depth in puddle (amount var) + +var/global/list/image/splatter_cache=list() + /obj/effect/decal/cleanable/blood name = "blood" - desc = "It's red and gooey. Perhaps it's the chef's cooking?" + desc = "It's thick and gooey. Perhaps it's the chef's cooking?" gender = PLURAL density = 0 anchored = 1 layer = 2 - icon = 'icons/effects/blood.dmi' icon_state = "floor1" - random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") + random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7") var/list/viruses = list() blood_DNA = list() + var/basecolor="#A10808" // Color when wet. var/list/datum/disease2/disease/virus2 = list() var/amount = 5 @@ -23,6 +26,8 @@ ..() if(istype(src, /obj/effect/decal/cleanable/blood/gibs)) return + if(istype(src, /obj/effect/decal/cleanable/blood/tracks)) + return // We handle our own drying. if(src.type == /obj/effect/decal/cleanable/blood) if(src.loc && isturf(src.loc)) for(var/obj/effect/decal/cleanable/blood/B in src.loc) @@ -33,36 +38,52 @@ spawn(DRYING_TIME * (amount+1)) dry() -/obj/effect/decal/cleanable/blood/HasEntered(mob/living/carbon/human/perp) - if (!istype(perp)) - return - if(amount < 1) - return +/obj/effect/decal/cleanable/blood/update_icon() - if(perp.shoes) - perp.shoes:track_blood = max(amount,perp.shoes:track_blood) //Adding blood to shoes - if(!perp.shoes.blood_overlay) - perp.shoes.generate_blood_overlay() - if(!perp.shoes.blood_DNA) - perp.shoes.blood_DNA = list() - perp.shoes.overlays += perp.shoes.blood_overlay - perp.update_inv_shoes(1) - perp.shoes.blood_DNA |= blood_DNA.Copy() + if(basecolor == "rainbow") basecolor = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]" + + var/cache_key="[basecolor]|[icon_state]" + var/icon/I=null + if(cache_key in splatter_cache) + I = splatter_cache[cache_key] else - perp.track_blood = max(amount,perp.track_blood) //Or feet - if(!perp.feet_blood_DNA) - perp.feet_blood_DNA = list() - perp.feet_blood_DNA |= blood_DNA.Copy() + I = new /icon('icons/effects/blood.dmi', icon_state=icon_state) + I.SwapColor("#000000",basecolor); + splatter_cache[cache_key]=I + icon = I - amount-- +/obj/effect/decal/cleanable/blood/HasEntered(mob/living/carbon/human/perp) + if (!istype(perp)) + return + if(amount < 1) + return + + if(perp.shoes) + perp.shoes:track_blood = max(amount,perp.shoes:track_blood) //Adding blood to shoes + if(!perp.shoes.blood_overlay) + perp.shoes.generate_blood_overlay() + if(!perp.shoes.blood_DNA) + perp.shoes.blood_DNA = list() + perp.shoes.overlays += perp.shoes.blood_overlay + perp.update_inv_shoes(1) + perp.shoes.blood_DNA |= blood_DNA.Copy() + perp.shoes.blood_color=basecolor + else + perp.track_blood = max(amount,perp.track_blood) //Or feet + if(!perp.feet_blood_DNA) + perp.feet_blood_DNA = list() + perp.feet_blood_DNA |= blood_DNA.Copy() + perp.feet_blood_color=basecolor + + amount-- /obj/effect/decal/cleanable/blood/proc/dry() - name = "dried [src]" - desc = "It's dark red and crusty. Someone is not doing their job." - var/icon/I = icon(icon,icon_state) - I.SetIntensity(0.7) - icon = I - amount = 0 + name = "dried [src]" + desc = "It's dark red and crusty. Someone is not doing their job." + var/icon/I = icon(icon,icon_state) + I.SetIntensity(0.7) + icon = I + amount = 0 /obj/effect/decal/cleanable/blood/attack_hand(mob/living/carbon/human/user) ..() @@ -72,40 +93,26 @@ return var/taken = rand(1,amount) amount -= taken - user << "You get some blood on your hands." + user << "You get some of \the [src] on your hands." if (!user.blood_DNA) user.blood_DNA = list() user.blood_DNA |= blood_DNA.Copy() user.bloody_hands += taken + user.hand_blood_color = basecolor user.update_inv_gloves(1) user.verbs += /mob/living/carbon/human/proc/bloody_doodle /obj/effect/decal/cleanable/blood/splatter - random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5") - amount = 2 - -/obj/effect/decal/cleanable/blood/footprints - name = "bloody footprints" - desc = "Whoops..." - icon='icons/effects/footprints.dmi' - icon_state = "blood1" - amount = 0 - random_icon_states = null - -/obj/effect/decal/cleanable/blood/tracks - icon_state = "tracks" - desc = "They look like tracks left by wheels." - gender = PLURAL - random_icon_states = null - amount = 0 + random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5") + amount = 2 /obj/effect/decal/cleanable/blood/drip - name = "drips of blood" - desc = "It's red." - gender = PLURAL - icon = 'icons/effects/drip.dmi' - icon_state = "1" - amount = 0 + name = "drips of blood" + desc = "It's red." + gender = PLURAL + icon = 'icons/effects/drip.dmi' + icon_state = "1" + amount = 0 /obj/effect/decal/cleanable/blood/writing icon_state = "tracks" @@ -123,7 +130,7 @@ /obj/effect/decal/cleanable/blood/writing/examine() ..() - usr << "It reads: \"[message]\"" + usr << "It reads: \"[message]\"" /obj/effect/decal/cleanable/blood/gibs name = "gibs" @@ -153,19 +160,20 @@ /obj/effect/decal/cleanable/blood/gibs/proc/streak(var/list/directions) - spawn (0) - var/direction = pick(directions) - for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++) - sleep(3) - if (i > 0) - var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc) - for(var/datum/disease/D in src.viruses) - var/datum/disease/ND = D.Copy(1) - b.viruses += ND - ND.holder = b + spawn (0) + var/direction = pick(directions) + for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++) + sleep(3) + if (i > 0) + var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc) + b.basecolor = src.basecolor + for(var/datum/disease/D in src.viruses) + var/datum/disease/ND = D.Copy(1) + b.viruses += ND + ND.holder = b - if (step_to(src, get_step(src, direction), 0)) - break + if (step_to(src, get_step(src, direction), 0)) + break /obj/effect/decal/cleanable/mucus @@ -178,4 +186,10 @@ icon = 'icons/effects/blood.dmi' icon_state = "mucus" random_icon_states = list("mucus") + var/list/datum/disease2/disease/virus2 = list() + var/dry=0 // Keeps the lag down + +/obj/effect/decal/cleanable/mucus/New() + spawn(DRYING_TIME * 2) + dry=1 diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm index fa3aa3bfa9..1494e92219 100644 --- a/code/game/objects/effects/decals/Cleanable/robots.dm +++ b/code/game/objects/effects/decals/Cleanable/robots.dm @@ -1,17 +1,14 @@ // Note: BYOND is object oriented. There is no reason for this to be copy/pasted blood code. -/obj/effect/decal/cleanable/robot_debris +/obj/effect/decal/cleanable/blood/robot name = "robot debris" desc = "It's a useless heap of junk... or is it?" - gender = PLURAL - density = 0 - anchored = 1 - layer = 2 icon = 'icons/mob/robots.dmi' icon_state = "gib1" + basecolor="#2B2B2B" random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7") -/obj/effect/decal/cleanable/robot_debris/proc/streak(var/list/directions) +/obj/effect/decal/cleanable/blood/robot/proc/streak(var/list/directions) spawn (0) var/direction = pick(directions) for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++) @@ -19,7 +16,7 @@ if (i > 0) if (prob(40)) /*var/obj/effect/decal/cleanable/oil/o =*/ - new /obj/effect/decal/cleanable/oil/streak(src.loc) + new /obj/effect/decal/cleanable/blood/oil/streak(src.loc) else if (prob(10)) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) @@ -27,31 +24,22 @@ if (step_to(src, get_step(src, direction), 0)) break -/obj/effect/decal/cleanable/robot_debris/limb +/obj/effect/decal/cleanable/blood/robot/limb random_icon_states = list("gibarm", "gibleg") -/obj/effect/decal/cleanable/robot_debris/up +/obj/effect/decal/cleanable/blood/robot/up random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibup1","gibup1") //2:7 is close enough to 1:4 -/obj/effect/decal/cleanable/robot_debris/down +/obj/effect/decal/cleanable/blood/robot/down random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibdown1","gibdown1") //2:7 is close enough to 1:4 -/obj/effect/decal/cleanable/oil +/obj/effect/decal/cleanable/blood/oil name = "motor oil" desc = "It's black and greasy. Looks like Beepsky made another mess." - gender = PLURAL - density = 0 - anchored = 1 - layer = 2 + basecolor="#2B2B2B" icon = 'icons/mob/robots.dmi' icon_state = "floor1" - var/viruses = list() random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") - Del() - for(var/datum/disease/D in viruses) - D.cure(0) - ..() - -/obj/effect/decal/cleanable/oil/streak +/obj/effect/decal/cleanable/blood/oil/streak random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5") \ No newline at end of file diff --git a/code/game/objects/effects/decals/Cleanable/tracks.dm b/code/game/objects/effects/decals/Cleanable/tracks.dm new file mode 100644 index 0000000000..d1c329014c --- /dev/null +++ b/code/game/objects/effects/decals/Cleanable/tracks.dm @@ -0,0 +1,194 @@ +// Stolen en masse from N3X15 of /vg/station with much gratitude. + +// The idea is to have 4 bits for coming and 4 for going. +#define TRACKS_COMING_NORTH 1 +#define TRACKS_COMING_SOUTH 2 +#define TRACKS_COMING_EAST 4 +#define TRACKS_COMING_WEST 8 +#define TRACKS_GOING_NORTH 16 +#define TRACKS_GOING_SOUTH 32 +#define TRACKS_GOING_EAST 64 +#define TRACKS_GOING_WEST 128 + +// 5 seconds +#define TRACKS_CRUSTIFY_TIME 50 + +// color-dir-dry +var/global/list/image/fluidtrack_cache=list() + +/datum/fluidtrack + var/direction=0 + var/basecolor="#A10808" + var/wet=0 + var/fresh=1 + var/crusty=0 + var/image/overlay + + New(_direction,_color,_wet) + src.direction=_direction + src.basecolor=_color + src.wet=_wet + +// Footprints, tire trails... +/obj/effect/decal/cleanable/blood/tracks + amount = 0 + random_icon_states = null + var/dirs=0 + icon = 'icons/effects/fluidtracks.dmi' + var/coming_state="blood1" + var/going_state="blood2" + var/updatedtracks=0 + + // dir = id in stack + var/list/setdirs=list( + "1"=0, + "2"=0, + "4"=0, + "8"=0, + "16"=0, + "32"=0, + "64"=0, + "128"=0 + ) + + // List of laid tracks and their colors. + var/list/datum/fluidtrack/stack=list() + + /** + * Add tracks to an existing trail. + * + * @param DNA bloodDNA to add to collection. + * @param comingdir Direction tracks come from, or 0. + * @param goingdir Direction tracks are going to (or 0). + * @param bloodcolor Color of the blood when wet. + */ + proc/AddTracks(var/list/DNA, var/comingdir, var/goingdir, var/bloodcolor="#A10808") + var/updated=0 + // Shift our goingdir 4 spaces to the left so it's in the GOING bitblock. + var/realgoing=goingdir<<4 + + // Current bit + var/b=0 + + // When tracks will start to dry out + var/t=world.time + TRACKS_CRUSTIFY_TIME + + var/datum/fluidtrack/track + + // Process 4 bits + for(var/bi=0;bi<4;bi++) + b=1<>4 + + if(track.overlay) + track.overlay=null + + //var/cache_key="[track.basecolor]|[state]|[track.direction]|[track.wet= 30) - if (!dirtoverlay) - dirtoverlay = new/obj/effect/decal/cleanable/dirt(src) - dirtoverlay.alpha = 15 - else if (dirt > 30) - dirtoverlay.alpha = min(dirtoverlay.alpha+20, 255) - if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M + if(istype(H.shoes, /obj/item/clothing/shoes/clown_shoes)) + var/obj/item/clothing/shoes/clown_shoes/O = H.shoes + if(H.m_intent == "run") + if(O.footstep >= 2) + O.footstep = 0 + playsound(src, "clownstep", 50, 1) // this will get annoying very fast. + else + O.footstep++ + else + playsound(src, "clownstep", 20, 1) + // Tracking blood var/list/bloodDNA = null + var/bloodcolor="" if(H.shoes) var/obj/item/clothing/shoes/S = H.shoes if(S.track_blood && S.blood_DNA) bloodDNA = S.blood_DNA + bloodcolor=S.blood_color S.track_blood-- else if(H.track_blood && H.feet_blood_DNA) bloodDNA = H.feet_blood_DNA + bloodcolor=H.feet_blood_color H.track_blood-- if (bloodDNA) - var/obj/effect/decal/cleanable/blood/footprints/here = new(src) - here.icon_state = "blood1" - here.dir = H.dir - here.blood_DNA |= bloodDNA.Copy() + src.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints,bloodDNA,H.dir,0,bloodcolor) // Coming var/turf/simulated/from = get_step(H,reverse_direction(H.dir)) - if(from) - var/obj/effect/decal/cleanable/blood/footprints/there = new(from) - there.icon_state = "blood2" - there.dir = H.dir - there.blood_DNA |= bloodDNA.Copy() + if(istype(from) && from) + from.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints,bloodDNA,0,H.dir,bloodcolor) // Going - bloodDNA = null + bloodDNA = null switch (src.wet) if(1) @@ -66,8 +72,8 @@ step(M, M.dir) M << "\blue You slipped on the wet floor!" playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) - M.Stun(8) - M.Weaken(5) + M.Stun(5) + M.Weaken(3) else M.inertia_dir = 0 return @@ -77,13 +83,13 @@ step(M, M.dir) M << "\blue You slipped on the wet floor!" playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) - M.Stun(8) - M.Weaken(5) + M.Stun(5) + M.Weaken(3) else M.inertia_dir = 0 return - if(2) //lube //can cause infinite loops - needs work + if(2) //lube //can cause infinite loops - needs work if(!istype(M, /mob/living/carbon/slime)) M.stop_pulling() step(M, M.dir) @@ -95,6 +101,29 @@ M << "\blue You slipped on the floor!" playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) M.Weaken(10) + if(3) // Ice + if(istype(M, /mob/living/carbon/human)) // Added check since monkeys don't have shoes + if ((M.m_intent == "run") && !(istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP) && prob(30)) + M.stop_pulling() + step(M, M.dir) + M << "\blue You slipped on the icy floor!" + playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) + M.Stun(4) + M.Weaken(3) + else + M.inertia_dir = 0 + return + else if(!istype(M, /mob/living/carbon/slime)) + if (M.m_intent == "run" && prob(30)) + M.stop_pulling() + step(M, M.dir) + M << "\blue You slipped on the icy floor!" + playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) + M.Stun(4) + M.Weaken(3) + else + M.inertia_dir = 0 + return ..() @@ -106,29 +135,49 @@ for(var/obj/effect/decal/cleanable/blood/B in contents) if(!B.blood_DNA[M.dna.unique_enzymes]) B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type - if (M.virus2.len) - B.virus2 |= virus_copylist(M.virus2) return 1 //we bloodied the floor //if there isn't a blood decal already, make one. var/obj/effect/decal/cleanable/blood/newblood = new /obj/effect/decal/cleanable/blood(src) + + //Species-specific blood. + if(M.species) + newblood.basecolor = M.species.blood_color + else + newblood.basecolor = "#A10808" + newblood.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type - if (M.virus2.len) - newblood.virus2 |= virus_copylist(M.virus2) + newblood.update_icon() + return 1 //we bloodied the floor // Only adds blood on the floor -- Skie /turf/simulated/proc/add_blood_floor(mob/living/carbon/M as mob) - if( istype(M, /mob/living/carbon/monkey) || istype(M, /mob/living/carbon/human)) + if(istype(M, /mob/living/carbon/monkey)) + var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(src) this.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type - if (M.virus2.len) - this.virus2 = virus_copylist(M.virus2) + this.basecolor = "#A10808" + this.update_icon() + + else if(istype(M,/mob/living/carbon/human)) + + var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(src) + var/mob/living/carbon/human/H = M + + //Species-specific blood. + if(H.species) + this.basecolor = H.species.blood_color + else + this.basecolor = "#A10808" + this.update_icon() + + this.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type else if( istype(M, /mob/living/carbon/alien )) - var/obj/effect/decal/cleanable/xenoblood/this = new /obj/effect/decal/cleanable/xenoblood(src) + var/obj/effect/decal/cleanable/blood/xeno/this = new /obj/effect/decal/cleanable/blood/xeno(src) this.blood_DNA["UNKNOWN BLOOD"] = "X*" else if( istype(M, /mob/living/silicon/robot )) - new /obj/effect/decal/cleanable/oil(src) \ No newline at end of file + new /obj/effect/decal/cleanable/blood/oil(src) \ No newline at end of file diff --git a/code/modules/detectivework/footprints_and_rag.dm b/code/modules/detectivework/footprints_and_rag.dm index efe2ebfa52..e8a207ca8e 100644 --- a/code/modules/detectivework/footprints_and_rag.dm +++ b/code/modules/detectivework/footprints_and_rag.dm @@ -4,6 +4,7 @@ var/track_blood = 0 var/list/feet_blood_DNA var/track_blood_type + var/feet_blood_color /obj/item/clothing/gloves var/transfer_blood = 0 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 1454b360b5..60014a89e2 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1326,5 +1326,7 @@ mob/living/carbon/human/yank_out_object() src << "You ran out of blood to write with!" var/obj/effect/decal/cleanable/blood/writing/W = new(T) + W.basecolor = (hand_blood_color) ? hand_blood_color : "#A10808" + W.update_icon() W.message = message - W.add_fingerprint(src) + W.add_fingerprint(src) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 104e60fff8..4611dda0d8 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -56,3 +56,4 @@ var/xylophone = 0 //For the spoooooooky xylophone cooldown var/mob/remoteview_target = null + var/hand_blood_color \ No newline at end of file diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index c5d5351e3f..25531def83 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -39,6 +39,8 @@ var/list/abilities = list() // For species-derived or admin-given powers + var/blood_color = "#A10808" //Red. + /datum/species/human name = "Human" language = "Sol Common" @@ -128,6 +130,7 @@ punch_damage = 5 primitive = /mob/living/carbon/monkey/diona + blood_color = "rainbow" warning_low_pressure = 50 hazard_low_pressure = -1 @@ -139,4 +142,4 @@ heat_level_2 = 3000 heat_level_3 = 4000 - flags = WHITELISTED | NO_BREATHE | REQUIRE_LIGHT | NON_GENDERED | NO_SCAN | IS_PLANT | RAD_ABSORB + flags = WHITELISTED | NO_BREATHE | REQUIRE_LIGHT | NON_GENDERED | NO_SCAN | IS_PLANT | RAD_ABSORB \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 423486499c..88aa24d29e 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -47,7 +47,7 @@ /mob/living/simple_animal/hostile/hivebot/Die() ..() visible_message("[src] blows apart!") - new /obj/effect/decal/cleanable/robot_debris(src.loc) + new /obj/effect/decal/cleanable/blood/robot(src.loc) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) s.start() diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 9b0a931a83..2695556c71 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -152,12 +152,12 @@ del(src) else if(toner > 0) - new /obj/effect/decal/cleanable/oil(get_turf(src)) + new /obj/effect/decal/cleanable/blood/oil(get_turf(src)) toner = 0 else if(prob(50)) if(toner > 0) - new /obj/effect/decal/cleanable/oil(get_turf(src)) + new /obj/effect/decal/cleanable/blood/oil(get_turf(src)) toner = 0 return @@ -166,7 +166,7 @@ del(src) else if(toner > 0) - new /obj/effect/decal/cleanable/oil(get_turf(src)) + new /obj/effect/decal/cleanable/blood/oil(get_turf(src)) toner = 0 return diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 80672b358e..d6ba7a13ad 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -153,7 +153,7 @@ datum newVirus.holder = blood_prop else if(istype(self.data["donor"], /mob/living/carbon/alien)) - var/obj/effect/decal/cleanable/xenoblood/blood_prop = locate() in T + var/obj/effect/decal/cleanable/blood/xeno/blood_prop = locate() in T if(!blood_prop) blood_prop = new(T) blood_prop.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*" diff --git a/code/modules/reagents/reagent_containers/food/snacks/grown.dm b/code/modules/reagents/reagent_containers/food/snacks/grown.dm index b8be5cf0bd..2c59a75ae8 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/grown.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/grown.dm @@ -671,7 +671,7 @@ throw_impact(atom/hit_atom) ..() - new/obj/effect/decal/cleanable/oil(src.loc) + new/obj/effect/decal/cleanable/blood/oil(src.loc) src.visible_message("The [src.name] has been squashed.","You hear a smack.") src.reagents.reaction(get_turf(hit_atom)) for(var/atom/A in get_turf(hit_atom)) @@ -1003,7 +1003,7 @@ var/list/turfs = new/list() var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread if(inner_teleport_radius < 1) //Wasn't potent enough, it just splats. - new/obj/effect/decal/cleanable/oil(src.loc) + new/obj/effect/decal/cleanable/blood/oil(src.loc) src.visible_message("The [src.name] has been squashed.","You hear a smack.") del(src) return @@ -1040,7 +1040,7 @@ sleep(1) s.set_up(3, 1, A) s.start() - new/obj/effect/decal/cleanable/oil(src.loc) + new/obj/effect/decal/cleanable/blood/oil(src.loc) src.visible_message("The [src.name] has been squashed, causing a distortion in space-time.","You hear a splat and a crackle.") del(src) return diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 94bb46e354..3a0a200efa 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -1325,7 +1325,7 @@ src.streak(dirs) -/obj/effect/decal/cleanable/robot_debris/gib/pipe_eject(var/direction) +/obj/effect/decal/cleanable/blood/robot/gib/pipe_eject(var/direction) var/list/dirs if(direction) dirs = list( direction, turn(direction, -45), turn(direction, 45)) diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi index 960f4c1e19..ae5383b690 100644 Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ diff --git a/icons/effects/fluidtracks.dmi b/icons/effects/fluidtracks.dmi new file mode 100644 index 0000000000..5a47cb3a4f Binary files /dev/null and b/icons/effects/fluidtracks.dmi differ diff --git a/maps/tgstation2.dmm b/maps/tgstation2.dmm index 785510b49a..d8655a8517 100644 --- a/maps/tgstation2.dmm +++ b/maps/tgstation2.dmm @@ -825,7 +825,7 @@ "apS" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/security/detectives_office) "apT" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fsmaint) "apU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/fsmaint) -"apV" = (/obj/effect/decal/cleanable/oil/streak,/turf/simulated/floor/plating,/area/maintenance/fsmaint) +"apV" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/decal/cleanable/blood/oil/streak,/turf/simulated/floor/plating,/area/maintenance/fsmaint) "apW" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "security_airlock"; name = "interior access button"; pixel_x = 20; pixel_y = 20; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "apX" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "security_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "apY" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "security_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "security_sensor"; pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plating,/area/maintenance/fsmaint) @@ -897,7 +897,7 @@ "arm" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor,/area/maintenance/fsmaint) "arn" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fsmaint) "aro" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "Security Maintenance APC"; pixel_y = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fsmaint) -"arp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/decal/cleanable/oil/streak,/turf/simulated/floor/plating,/area/maintenance/fsmaint) +"arp" = (/obj/effect/decal/cleanable/blood/oil/streak,/turf/simulated/floor/plating,/area/maintenance/fsmaint) "arq" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/fsmaint) "arr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plating,/area/maintenance/fsmaint) "ars" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint) @@ -935,7 +935,7 @@ "arY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "arZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "asa" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint) -"asb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/decal/cleanable/robot_debris,/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fsmaint) +"asb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/decal/cleanable/blood/robot,/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fsmaint) "asc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/wall,/area/maintenance/fsmaint) "asd" = (/obj/structure/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/fsmaint) "ase" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/fsmaint) @@ -3182,7 +3182,7 @@ "bjj" = (/obj/machinery/door_control{id = "Disposal Exit"; name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 4; req_access_txt = "12"},/obj/machinery/driver_button{id = "trash"; pixel_x = -26; pixel_y = -6},/turf/simulated/floor/plating,/area/maintenance/disposal) "bjk" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "garbage"; name = "disposal coveyor"},/turf/simulated/floor/plating,/area/maintenance/disposal) "bjl" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating,/area/maintenance/disposal) -"bjm" = (/obj/effect/decal/cleanable/oil,/obj/machinery/power/apc{dir = 4; name = "Disposal APC"; pixel_x = 27; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/disposal) +"bjm" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/storage) "bjn" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/port) "bjo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port) "bjp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port) @@ -4678,7 +4678,7 @@ "bLX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bLY" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{icon_state = "white"},/area/toxins/telesci) "bLZ" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor{icon_state = "white"},/area/toxins/telesci) -"bMa" = (/obj/effect/decal/cleanable/oil,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/storage) +"bMa" = (/obj/effect/decal/cleanable/blood/oil,/obj/machinery/power/apc{dir = 4; name = "Disposal APC"; pixel_x = 27; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/disposal) "bMb" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/toxins/storage) "bMc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bMd" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) @@ -5844,6 +5844,7 @@ "cit" = (/turf/simulated/wall/r_wall,/area/crew_quarters/sleep/engi) "ciu" = (/obj/structure/shuttle/window,/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) "civ" = (/obj/machinery/camera{c_tag = "Atmospherics South West"; dir = 4; network = list("SS13")},/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple{pipe_color = "red"; icon_state = "intact-r"; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/atmos) +"ciw" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/maintenance/aft) "ciy" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 8; icon_state = "caution"},/area/engine/break_room) "ciz" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "cyan"; icon_state = "intact-c"; level = 2},/turf/simulated/floor,/area/atmos) "ciA" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; frequency = 1439; icon_state = "off"; id_tag = null; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/table,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/machinery/light,/obj/structure/reagent_dispensers/virusfood{pixel_x = -30},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/medical/virology) @@ -6065,7 +6066,6 @@ "cmM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) "cmN" = (/obj/structure/closet/crate,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/aft) "cmO" = (/obj/item/weapon/cable_coil{amount = 5},/turf/simulated/floor/plating,/area/maintenance/aft) -"cmP" = (/obj/effect/decal/cleanable/oil,/turf/simulated/floor/plating,/area/maintenance/aft) "cmQ" = (/obj/machinery/portable_atmospherics/pump,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/atmos) "cmR" = (/turf/simulated/wall/r_wall,/area/engine/storage) "cmS" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/engine/storage) @@ -10568,10 +10568,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaaaaafaafaaaaaaaaaanlaafaafaaaaafaafaaaaaaalQaaaaaaaaaaaaafcafcafcafcafcafcafcaaaaaaaaaaaaaaaaaaaaaaafaaaanmanJanJanKaeFanqanLanMaeFanNanOanPanQanRanSanTanUanVamFanWamFalCanXamianYanZaoaaobaleaocaodaoeaofaogaohaljaoialNalNaafaaaaaaaaaaaaaaaaaaaaaaaaaaaalOalOalOalOalOaaaaaaaaaaaaaaaaaaalPaafaojaojaojaojaojaafaokaafaojaojaojaojaojaafalPaaaajiajiajiajiajiajiajiajiajiajiajiajiajiajiajiajiajiajiajiajiajiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalPaafaolaolaolaolaolaafaomaafaolaolaolaolaolaafalPaaaaaaaaaaaaaaaafcafcafcafcafcaaaaaaaaaaaaaaaaaaaaaaafaafaaaanmamqaonalRaeFaooaopaoqaeFaoraosaotaouamzamAaovaowaoxaoxanWamFalCamAamGaoyamxaozaoAaleaoBaoCaoDaoEaoFaoFaoGaoHaoIalNalNaoJaoKaoLalNalNaafaaaaaaaaaalOalOalOalOalOaaaaaaaaaaaaaaaaaaalPaafaoMaoNaoNaoNaoNaoOaoPaoQaoRaoRaoRaoRaoSaafalPaaaajiajiajiajiajiajiajiajiajiajiajiajiajiajiajiajiajiajiajiajiajiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaalPaafaoTaoUaoUaoUaoUaoVaoWaoXaoYaoYaoYaoYaoZaafalPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaanmapaapbaeFaeFagXagXagXagXagXagXagXagXagXagXapcapdapdapeapfapgaphagXagXagXagXagXagXapiapjapkaplaplapmapnapoappapqalNaprapsapsapsaptalNalNalNalNapualOalOalOalOalOaaaaaaaaaaaaaaaaaaalPaafapvapvapvapvapvaafaoPaafapvapvapvapvapvaafalPaaaaaaajiajiajiajiaaaaaaajiajiajiajiajiajiajiaaaaaaajiajiajiajiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalPaafapwapwapwapwapwaafaoWaafapwapwapwapwapwaafalPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanmapxapyapxapzapxapAapAapBapCapDapAapAapAapAapAapAapAapAapAapEapFapGapHapIapJapKapLaleapMapNapOapPapQapRapSapTapUajhajhajhapVajhapWapXapYapZaqaaqbalOalOalOalOalOaaaaaaaaaaaaaaaaaaalQaaaaaaaaaaafaaaaaaaafaoPaaaaaaaaaaafaaaaaaaaaalQaaaaaaaaaaaaaaaaaaaaaaaaajiajiajiajiajiajiajiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalPaafapwapwapwapwapwaafaoWaafapwapwapwapwapwaafalPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanmapxapyapxapzapxapAapAapBapCapDapAapAapAapAapAapAapAapAapAapEapFapGapHapIapJapKapLaleapMapNapOapPapQapRapSapTapUajhajhajharpajhapWapXapYapZaqaaqbalOalOalOalOalOaaaaaaaaaaaaaaaaaaalQaaaaaaaaaaafaaaaaaaafaoPaaaaaaaaaaafaaaaaaaaaalQaaaaaaaaaaaaaaaaaaaaaaaaajiajiajiajiajiajiajiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaaaaaaaafaaaaaaaafaoWaaaaaaaaaaafaaaaaaaaaampaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafapxaqcaqdapxapxaqeapEaqfapEapEapEapEapEapEapEapEapEapEapEaqgapEaqhapEaqiapEapEapEaleaqjaqkaqlaqmapOaqnapSaqoaqpaqqaqraqsaqtaquaqvaqwalNalNalNajhalOalOalOalOalOaaaaaaaaaaaaaaaaaaalPaafaojaojaojaojaojaafaoPaafaojaojaojaojaojaafalPaaaaaaaaaaaaaaaaaaaaaaaaajiajiajiajiajiajiajiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalPaafaolaolaolaolaolaafaoWaafaolaolaolaolaolaafalPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapxaqxaqyaqzaqAaqBaqCaqDaqEaqEaqEaqEaqEaqEaqEaqFaqGaqHaqGaqIaqJaqKaqLaqMaqNaqLaqOaleapiapiapiapiapiapiaqPaqQaqRaqSaqTaqUaqVajhalNaqWaqXalNaaaaaaaaaalOalOalOaaaaaaaaaaaaaaaaaaaaaalPaafaoMaoNaoNaoNaoNaoOaoPaoQaoRaoRaoRaoRaoSaafalPaaaaaaaaaaaaaaaaaaaaaaaaajiajiajiajiajiajiajiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqYaqZaqYaaaaaaaaaaaaaaaaaaaaaalPaafaoTaoUaoUaoUaoUaoVaoWaoXaoYaoYaoYaoYaoZaafalPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapxapaaraapxarbarbarcardarbarbarbarearearearfargarearearhariarjarkalNarlalNarmalNalNarnajhajhajhajhajharoaqQarparqarqarqarrarsartaruarvalNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalPaafapvapvapvapvapvaafaoPaafapvapvapvapvapvaafalPaaaaaaaaaaaaaaaaaaaaaaaaajiajiajiajiajiajiajiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqYaqZaqYaaaaaaaaaaaaaaaaaaaaaalPaafaoTaoUaoUaoUaoUaoVaoWaoXaoYaoYaoYaoYaoZaafalPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapxapaaraapxarbarbarcardarbarbarbarearearearfargarearearhariarjarkalNarlalNarmalNalNarnajhajhajhajhajharoaqQapVarqarqarqarrarsartaruarvalNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalPaafapvapvapvapvapvaafaoPaafapvapvapvapvapvaafalPaaaaaaaaaaaaaaaaaaaaaaaaajiajiajiajiajiajiajiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafarwarxarwaaaaaaaaaaaaaaaaaaaaaalPaafapwapwapwapwapwaafaoWaafapwapwapwapwapwaafalPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagapxaryapbapxarEatVatXatWaumatYarbarFarGarHarIarJarKarLarMapEarNarOarParQarRarRarRarRarRarSarRarRarRarRarUarVarWarXarYarZasaasbascasdasealNaafasfasgasgashasgasgasiaaaaaaaaaaaaaaaalQaaaaaaaaaaafaaaaaaaaaaoPaaaaaaaaaaafaaaaaaaaaalQaaaaaaaaaaaaaaaaaaaaaaaaajiajiajiajiajiajiajiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasjaunaslaaaasmauoasoaaaaafaspaqYaspaaaaaaaaaaaaaaaaaaaaaalQaaaaaaaaaaafaaaaaaaaaaoWaaaaaaaaaaafaaaaaaaaaalQaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafapxapxapxapxapbapxarEarAatXatWassasrarbastarIarIarIarJasuasvaswasxasyalNaszasAasBasBasBasBasCasDasHasIasHasHasHasHasIasHasGasKasLasMasNasOasPasPasPasQasRasRasRasRasRasQasPaaaaaaaaaaaaalPaafaojaojaojaojaojaafaoPaafaojaojaojaojaojaafalPaaaaaaaaaaaaaaaaaaaaaaaaaaaajiajiajiajiajiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasSasTasUasTasSasVasWasVasSaafaspasXasYaaaaaaaaaaaaaaaaaaaaaalPaafaolaolaolaolaolaafaoWaafaolaolaolaolaolaafalPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafapxasZataapxapbapxauParAatXatWauOauNarbatearIatfatfarJatgasvapAapEathalNatiatjatkatlatmatnatoatpasEatuatvatwatratsasJatqattatzatAatBatCatDatEatFasPatGasRasRasRasRasRasQasPaafaaaaaaaaaalQaafaoMaoNaoNaoNaoNaoOaoPaoQaoRaoRaoRaoRaoSaafalPaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10607,7 +10607,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQaWEaWFbeMayWbeNbeObePbePbeQbePbePbePbeRaPBaPBaPBaPBaYwaYxaZYbeSbeTbeUaYybeVbeWbeXaPEaPEaPEaPEbeYaPEbbFbakbalbeZbbHbcQbfabfbbalbbJbarbfcbcSbcSbfdbfebarbffaIOaYVbfgbfhbelbembfibfjbepbdcbfkbaAbflbfmbfnbetbfobetbdfbfpbfqbewbfrbfsbftbfubfubfvbclbfwbaDaZobfxaIOaNsbdubdvaZFbfyaZFbfzbfAbfAbfAbfBbfAbfAbfAbfCaZFaZFaZFaZFbfDaZFbfybfEbfFbfGaZFaZFaZFbfHbfIbfJbfKbfLbfMbfNaZFaZFaZFaZFaZFbfObfPbfDaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFbdzbfQbfRbfSbfTbfUbfVbbmbfWaafaaaaafaJGaJGaJGaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQaYnavtaYnaxTbfXbePbfYbfZbgabgabgbbgcbgdbgebgebgebgebgfbggbghbghbgibgjbghbgkbgkbglbgkbgmbgnbgnbgobgnbgpbgqbgrbgsbgtbgtbgubgvbgrbgwbgxbgybcSbcSbfdbgzbgAbffaIOaYVbgBbgCbgDbdabdabdabdabdcbgEbaAbaBbgFbgGbgHbgIbgJbgGbgKbaBbewbgLbgMbgNbgObgPbgQbgRbgSbaDbgTaHfaHfbgUbgUbgUbgUbgUbgUbgUbgVbgWbgWbgXbgYbgZbgVbhabhabhabhabhabhabhbbhbbhbbhcbhbbhbbhbbhdbhebfObhfbhgbhhbhibhjaZFaZFbhkbhkbhlbhlbhlbhlbhlbhmbhnbhnbhobhnaZFbhnbhobhnbhnbhpbhqbhqbhqbhqbhrbhgaPtaPtaPtaaaaaaaJGaJGaJGaJGaJGaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQaZLaZMbeMayWbhsbePbhtbePbhubhvbePbePbePaRebhwbhxbhxbhyaYyaZYbhzbcJbhAaYybhBbhCbhDbhEbhFbhGbhHbhIbhJbhHbhKbhLbhMbhNbhMbhMbhObhPbhQbhRbhSbcSbcSbhTbhUbhVbffaIObhWbgBbhXbhYbhZbiabibbicbidbaAbaAbaBbiebifbigbihbiibijbikbaBbewbilbimbinbiobipbgQbclbiqbaDaZoaIObirbgUbisbitbiubivbiwbixbiybizbizbiAbiBbiBavUbhabiDbiEbiFbiGbhabiHbiIbiJbiKbiLbiMbiNbiObiPbiObiObiObiQbiRbiSbiTbiSbiUbiUbhlbiVbiWbiXbhlbiYbiZbiYbhlbhmbhnbhpbhqbjabjbbjabhqbjcbjdbhqbjebjfbjgbhgaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQaaaaaaaMYbbnaPybjhbePbjibePbjjbjkbjlbjmbePbjnaRebjoaRebjpaYyaYyaYyaYyaYyaYybjqbjrbjsaRebjtbalbalbalbjubalbalbalbjvbalbalbalbalbjwbjxbjybjzbcSbcSbfdbjAbgAbffaIObjBbgBbjCbhYbaAbaAbaAbaAbjDbaAbjEbjFbjGbjHbbXbjIbbXbjJbjKbjLbjMbilbjNbclbjObjPbgQbjQbjRbjSbjTbjUbjVbgUbjWbjXbjYbjZbkabkbbkcbkdbizbkebizbizbkfbkgbkhbkibkjbkkbhabklbkmbknbkmbkobkpbhbbkqbkrbksbktbhgbkubkvbkwbkxbkybkzbkAbkBbkCbkDbkCbkEbkFbkGbkHbhlbkIbkJbkKbhqbkLbkMbkNbkObkPbkQbhqbkRbkSbkTbhgaaaaaaaaaaaeaJGaJGaJGaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQaaaaaaaMYbbnaPybjhbePbjibePbjjbjkbjlbMabePbjnaRebjoaRebjpaYyaYyaYyaYyaYyaYybjqbjrbjsaRebjtbalbalbalbjubalbalbalbjvbalbalbalbalbjwbjxbjybjzbcSbcSbfdbjAbgAbffaIObjBbgBbjCbhYbaAbaAbaAbaAbjDbaAbjEbjFbjGbjHbbXbjIbbXbjJbjKbjLbjMbilbjNbclbjObjPbgQbjQbjRbjSbjTbjUbjVbgUbjWbjXbjYbjZbkabkbbkcbkdbizbkebizbizbkfbkgbkhbkibkjbkkbhabklbkmbknbkmbkobkpbhbbkqbkrbksbktbhgbkubkvbkwbkxbkybkzbkAbkBbkCbkDbkCbkEbkFbkGbkHbhlbkIbkJbkKbhqbkLbkMbkNbkObkPbkQbhqbkRbkSbkTbhgaaaaaaaaaaaeaJGaJGaJGaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazQasSbcFaAFaZMaTPaTPaTPbkUaTPbkVayWaxTaxTbePbkWbkXbkYbkZblablbblcbldbldbldbldbleblfblfblfbhHbhHbhHblgblhblhblhblibalbljblkbllblmblnbloblpblqblrblsbltblublvblwblxblyblzblAblBblBblCbjUblDblEblFblGblHblIblJblKblLblMblNbjLbjLbjLbjLblObjLbjLbjLbjLblPblQblRblSblTblUblVblWblXblYblZaIOaIObgUbmabmbbmcbjZbmdbmebkcbmfbmgbmhbmgbmgbmibmjbmkbmlbmmbmnbhabmobkmbmpbkmbkobmqbhbbjgbmrbmsbmtbhgbkubmubmvbmwbmwbmxbmybmzbmAbmAbmAbmBbmCbmDbmEbmFbmGbmHbmIbmJbmKbmLbkPbmMbmNbmObhqbmPbkSbmsbhgaaaaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmQbmRavtaYnawYawYawYaPyaxTaxTbePbmSbmTbkZbmUbePbePbePaPBbmVbmWbmXbmYbmXbmXbmXbmYbmXaPBaPBbalbalbalbmZbalblpblpbnablpblpblpblpblpbnbbncbndbnebnfbngbngbngbnhbnibnjbnkbnlbnmbnnbnobnpbnpbnqbnrbnsbntbnubnvbnwbnxbnybnzbnAbnBbnCbnzbnDbnxbnEbilbnFbnGbnFbaDbaDbaDbnHbewbnIaIOaIObgUbnJbnKbnLbjZbnMbnNbkcbkebizbnObnPbnQbnRbhabnSbnTbnUbnVbhabmobnWbkmbkmbkobkpbhbbhgbhgbhgbhgbhgbkubkvbnXbnYbnZboabobbocbodboebofbofbogbkCbohbhlboibojbokbhqbolbombonboobopboqbhqbmPbkSborbhgaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaabmQavtavtaYnaxSaxSaxSbosaxSaxSbePbotboubovbkZbePaaaaaaaaaaafaafbowbowbowbowbowbowbowaaaaaaboxboybozboAboBblpblpblpblpblpblpblpblpboCbjzbcSboDboEboFbarbarboGblvbarbarboHboIboJboKboLboMboMboNboMboOboPboMabRboQboRbnzboSbnBboSbnzboTboQbnEboUboVbfuboWboXboYboZbpabpbbpcaIObpdbpebpfbpgbnLbjZbphbixbpibkebizbpjbpkbizbplbhabkhbpmbpnbpobhabppbpqbprbpsbptbpsbpubpvbpvbpvbpvbpvbpwbkvbpxbkxbkxboabpybpzbpAbpBbpCbpCbpDbpEbpFbhlbpGbojbpHbhqbpIbpJbpKboobkPbpLbhqbkRbkSbpMbhgaaaaaaaaaaaaaafbpNbpOavTbpOavTbpObpQaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10625,7 +10625,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGpbGqbGrbGqbGpbGsbGtbGubASbGvbEWbGwbGxbGybGzbGAbGAbGBbGCbAUbGDbGDbGEbGDaUnaUnaUnaUnbGFbGFbGFbGFbGFbGFbGFbGFbGGbcnbcnbGHbGHbGHbGHbGIbGJbGHbGHbGHbGHbGKbGLbGMaIUbGNbGObDZbDcbDbbDYbDdbEbbEabGVbGWbGXbynbGYbGYbGZbHabHbbHcbynbHdbizbizbizbizbizbAcbCNbCObCZbDabFHbEcbHibHjbIGbIGbIGbIGbIGbIGbIGbIGbIGbBQbHlbHmbHnbHnbBTbHobHpbHqbHrbHrbHrbHrbHsbHtbHubHvbHrbHrbHrbHrbAEbHwbHxaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagbHybGlbGlbHzbEPbEPbGnbGnbHAbGnbGnbEPbEPaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavQbHBbHCbHBavQbHDbHEbHFbASbHGbHHbEWbHIbHJbAUbHKbHLbHMbHNbAUbHObHObHPbGDaaaaaaaaaaaabGFbHQbHRbHSbHTbHUbHVbGFbHWbHXbHYbGHbHZbIabIbbIcbIdbIebIfbIgbIhbIibIjbFIbGRbGQbEabEabGPbFLbFKbFJbGSbEabIsbItbIubIvbBxbBxbBxbBxbBxbIwbIxbIybtLbtLbtLbtLbwQbAcbGTbCObCZbDabHebGUbICbHjbIGbWLbWLbWLbWObWMbWLbWLbWLbBQbIKbILbIMbIMbBTbINbIObBWbIPbIQbIRbISbITbIUbIVbIWbIXbIYbIZbHrbyVbJabyVbJbbJbbJbbJbbJbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabJcbEPbHybEPbEPbGnbGnbGnbGnbGnbGnbGnbEPbEPaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGpbHBbHBbHBbJdbJebEWbEWbJfbJgbEWbEWbJhbJibAUbAUbAUbJjbAUbAUbJkbJlbJmbJnaaabJobJpbJqbJrbJsbHVbJtbJubJvbJwbJxbJybJzbJAbJBbJCbJDbJEbJFbJGbJHbJIbGHbGHbJJbJKbLObMTbMSbMVbMUbMXbMWbNibMYbLWbLVbJWbJXbJYbymbJZbKabBxbBxbKbbKcbJMbJMbJMbJMbJMbKebLRbLSbTobLUbLQbLQbLQbLPbKibKjbIGdPxdPwbWLdPubWLbWLbWLdPvbBQbKobEybKpbKpbBTbBVbKqbKrbKsbKtbKtbKtbKtbKubKvbKwbKxbKybKzbHrbKAbKBbKCbKDbKEbKFbKGbKHaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEPbKIbKJbKJbGnbGnbGnbGnbGnbGnbGnbGnbEPbEPaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavQbHCbHCbHCavQbKKbKLbKMbKNbKObEWbKPbKQbKRbKSbKTbKTbKUbKTbKTbKVbKWbKXbKYaaabKZbLabLbbLcbLdbHVbLebLfbLgbLhbGFbLibLjbLkbGHbLlbLmbLnbLobLpbLqbLrbLsbLtbLubLvbNjbNqbNpbNnbIzbOubOtbOsbOrbNlbEabLGbLHbLIbymbLJbLKbBxbBxbLLbLMbJMbOIbOGbOHbOzbkebOybtLbOCbOFbOAbOBbNkbEcbHibLXbIGbWLdPybWLbWLbWLbWLbWLbWLbBQbMabEybMbbMbbBTbMcbMdbBWbMebKvbKvbMfbMgbMhbMibMjbMkbMlbMmbMnbMobMpbMqbMrbMsbMtbKGbMuaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabEPbEPbMvbGnbGnbGnbGnbGnbGnbGnbGnbGnbGnbGnbEPbEPaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavQbHCbHCbHCavQbKKbKLbKMbKNbKObEWbKPbKQbKRbKSbKTbKTbKUbKTbKTbKVbKWbKXbKYaaabKZbLabLbbLcbLdbHVbLebLfbLgbLhbGFbLibLjbLkbGHbLlbLmbLnbLobLpbLqbLrbLsbLtbLubLvbNjbNqbNpbNnbIzbOubOtbOsbOrbNlbEabLGbLHbLIbymbLJbLKbBxbBxbLLbLMbJMbOIbOGbOHbOzbkebOybtLbOCbOFbOAbOBbNkbEcbHibLXbIGbWLdPybWLbWLbWLbWLbWLbWLbBQbjmbEybMbbMbbBTbMcbMdbBWbMebKvbKvbMfbMgbMhbMibMjbMkbMlbMmbMnbMobMpbMqbMrbMsbMtbKGbMuaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabEPbEPbMvbGnbGnbGnbGnbGnbGnbGnbGnbGnbGnbGnbEPbEPaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaabGpbMwbMxbMybGpbMzbGtbGubASbASbMAbMAbMAbASbASbGDbGDbGDbGDbMBbGDbGDbMCbKYaaabKZbMDbMEbMFbMGbMHbMIbMJbMGbMGbMKbMLbMMbMNbGHbGHbGHbGHbGHbGHbMObGHbGHbMPbMQbMRbIzbKdbJVbKdbIzbJSbJRbJUbJTbJQbEabMZbNabNbbymbNcbNdbNebNfbNgbNhbJMbJNbJObJPbIBbNmbJLbNobIAbwUbwUbwUbwUbwUbHibHjbIGbIGbWPbWLbWLbWLbWLbIGbIGbBQbNtbNubMbbMbbBTbNvbMdbBWbIPbNwbNxbNybNzbNAbNBbNCbKvbNDbNEbHrbNFbNGbNHbJbbNIbNJbNKbNLaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEPbGnbGnbGnbGnbGnbGnbNMbGnbNNbGnbGnbGnbGnbGnbEPbEPaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNObESbNPbESbNQaaaaafaaaaaabASbNRbNSbNTbASaaaaaaaaabGDbNUbNVbJkbGDbMCbKYaaabKZbNWbNXbNYbNZbHVbOabObbOcbOdbGFbOebOfbOgbOhbOibOibOibOibOibOibOibOibOkbOlbOmbOnbOobOpbOqbKfbKgbLwbKfbKhbKgbKfbOvbOwbOxbOvbOvbOxbOvbOvbOwbOvbLEbLFbLCbLDbLBbODbOEbkfbLzbLAavSbLybLNbwUbOKbHjbIGbWQckSbSjbXTbWRbYSbSjbWQbBTbOSbOTbDsbBTbBTbOUbMdbOVbJbbJbbHrbHrbHrbHrbHvbHrbOWbKvbOXbHrbOYbJabyVbJbbOZbPabPbbJbaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabEPbPcbPcbPcbPcbPcbPcbPdbGnbPebPcbNNbGnbGnbGnbGnbEPaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaafaaaaaaaaabGDbPfbPgbPhbGDbMCbPiaaabPjbJpbPkbPlbPmbHVbHVbPnbPobPpbPqbPrbPsbPtbPubPubPubPubPubPubPubPubPwbPxbPybPybPzbPAbPBbPCbPDbPEbPFbPGbPGbPEbPGbPGbPFbPGbPGbPGbPGbPGbPGbPFbPHbwSbyubyvbAdbAebPNbPObPPbAfbAgbAhbBrbwVbwUbHibHjbIGbONbOMbOLbIIbIIbOPbOObOQbBTbBTbQdbBTbBTbQebQfbMdbojbQgaafbQhbQibQjbQkbQlbQkbQmbQnbQobHrbQpbHwbQqbJbbQrbQsbQsbQtaagaagaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQubGlbGlbGlbGlbGlbGlbGlbQvbGobGnbGnbGnbGnbQwbGobEPaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10653,7 +10653,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaafaaaaafaafckAaafaafaafckAaafaaaaafckAaafaaaaaaaaaaaaaaackBckCckDckEckFckGckHckIckJckKcdecpKcmTcmTcmpcmocjdcmqcmwckRcihdPzciXciZcjacjbcmxcdeckUckUcsOckWckXccucrwcmycmzcmAccuaaaaaaaaaacTclccldcleclfclgclhclgclfclgcliclgclicljaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaclkaaaaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaabXRcdOcdPcdQcllchQcdTclmbZSclnciMcloclpclqclrclsbXRaaaaaachcaaaaafaaaaafaafaafaaaciPaaaaafaaaaafaaaaafaaachcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalPaafcltclucluclvclwclwclwclwclwclwclwclwclwclwclwclwclwclwclxclyclzclAclBclCclDclEclFbJkciQcbxcdecdecdecdecbxclUcdecmlcrvclIclIclIclIclJcjbcdbcmmclNclOcsEclQclRccuclSclTclGclMccuaaaaaaaaaaaaaafclWaafclXaafclWaafclXaafclYaafclYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclZaaaaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaabXRcePceQcePcmaceSbZQbZRbZScmbcmJbZQcmccdVcdVcdVbXRaaaaaachcaaaciOciOciOciOciOaafciPaafciOciOciOciOciOaafchcaaaaaaaaaaaaaaaaaaaaaaaacmdaaaaaaaaacmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaafaaaaafaafcmeaafaaaaafcmeaafaaaaafcmeaafaaaaaaaaaaaaaaackBckCcmfcmgcmhcmicjNcmjbJkbSAcmkcmkcmkcmkcmkcmkcewcdecepcmncemcemcemcemcemceocdlcdpcmscmscnKcmucmvcdjcddccvcdicdgccuaaaaaaaaaaaabTecmBbVpcmBbTecmBbVpcmBbTecmCbVpcmDbTeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXRcePcePcePcllcmEcmFcmGcmHcmIcmJbZQcmJbZQcmKbZQbYQaafaafchcaafcjGcjHcjHcjHcjHcjIciPcjJcjKcjKcjKcjKcjLaafchcaaaaaaaaaaaaaaaaaaaaaaaacmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQalQalPaafaafcfWcmLcfYaaacfWcmLcfYaaacfWcmLcfYaafaaaaaaaaaaaaaafaafcmMcjNcjNcjNcjNbGDcbyccpcmNcmOcbtbJkbJkcmPbJkcmRcmSceucmUcmVcmVcmVcmVcmWcmRckUcmXclNcmYcmZcnackUccuccuccuccuccuaaaaaaaaaaaabTecnbcnccndbTecnecnfcngbTecnhcnicnjbTeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbgbXRcnkcnlcnlcnmcnncnocnncnpcbXcnrcnscntcdTcnucnvaaaaaachcaafckzckzckzckzckzaaaciPaafckzckzckzckzckzaaachcaaacmdaaaaaacmdaaaaaacmdcmdcmdcmdcmdcmdcmdaaaaaacmdaaaaaacmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQalQalPaafaafcfWcmLcfYaaacfWcmLcfYaaacfWcmLcfYaafaaaaaaaaaaaaaafaafcmMcjNcjNcjNcjNbGDcbyccpcmNcmOcbtbJkbJkciwbJkcmRcmSceucmUcmVcmVcmVcmVcmWcmRckUcmXclNcmYcmZcnackUccuccuccuccuccuaaaaaaaaaaaabTecnbcnccndbTecnecnfcngbTecnhcnicnjbTeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbgbXRcnkcnlcnlcnmcnncnocnncnpcbXcnrcnscntcdTcnucnvaaaaaachcaafckzckzckzckzckzaaaciPaafckzckzckzckzckzaaachcaaacmdaaaaaacmdaaaaaacmdcmdcmdcmdcmdcmdcmdaaaaaacmdaaaaaacmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfWcmLcfYaafcfWcmLcfYaaacfWcmLcfYaaaaaaaaaaafaaaaafaafaafaaacnwbPhbPgbGDcnxcnycnycnzbGDbGDbGDbGDbJkcmRcmRcnAcnBcnCcnDcnEcchcnGcnHcnIclNcnJcnKcmZcnLckUaafaafaafaafaafaaaaaaaaaaaabTecnMcnNcnMbTecnOcnPcnObTecnQcnRcnSbTeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclkaaabXRcnTcnUcnVcnWcnXcnUcnYcnZcnXcnUcoabXRaaaaaachdaaaaafaaaaafaaaaafaaacobaaaaafaaaaafaafaafaafchcaaacmdcmdcmdcmdaaacmdcmdcmdcmdcmdcmdcmdcmdcmdaaacmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGvaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalPaafcfWcmLcfYaaacfWcmLcfYaaacfWcmLcfYaafaaaaaaaaaaaaaafaafaaaaaacocbJkbJkbMBbJkbJkbJkbJkbJkbJkbJkbJkcbtcmRcmRcoecofcogcohcohcoicojcmRcokclNclNcmYcmZcnackUckUckUckUckUckUckUckUaaaaaabTecnMcolcnMbTecnOcomcnObTecnSconcnSbTeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacooaafbXRcopcoqcorcdVcoscotcoucdVcovcowcoxbXRaaaaaachcaaaciOciOciOciOciOaafcfVaafciOciOciOciOciOaafchcaaacmdcmdcmdcmdaaacmdcmdcmdcmdcmdcmdcmdcmdcmdaaacmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalPaafcfWcmLcfYaaacfWcmLcfYaafcfWcmLcfYaafaafaafaaaaafaafaaaaafaaabSybPfcoybGDcnxcnycnycnzcbxcjXcjXcjXcjXcjXcmRcozcoAcoBcskcoDcoEcoFcmRcokclNclNcoGcoHcoIcoJcoKcoLcoMcmtcoNcoOckUaaaaaabTebTebTebTebTebTebTebTebTebTebTebTebTeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaabXRcoPcePcePcdVcoPcePcePcdVcoPcePcePbXRaafaafchcaafcjGcjHcjHcjHcjHcoQcoRcoQcjKcjKcjKcjKcjLaafchcaaacmdcmdcmdcmdaaacmdcmdcmdcmdcmdcmdcmdcmdcmdaaacmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa