diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 19ca2c9e865..11ee7f27a0f 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -110,7 +110,7 @@
"acf" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "Brig Secure Armory Exterior North"; dir = 4; network = list("SS13")},/turf/space,/area/security/permabrig)
"acg" = (/obj/effect/decal/cleanable/cobweb,/obj/structure/table,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/glasses/sunglasses/blindfold,/turf/simulated/floor{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
"ach" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
-"aci" = (/obj/machinery/power/apc{dir = 1; name = "Prisoner Transfer Center APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/stool/bed/chair/e_chair,/turf/simulated/floor{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"aci" = (/obj/machinery/power/apc{dir = 1; name = "Prisoner Transfer Center APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/stool/bed/chair/e_chair,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
"acj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/effect/decal/cleanable/cobweb2,/obj/structure/table,/obj/machinery/light/small{dir = 1},/obj/item/device/assembly/signaler{code = 6; frequency = 1445},/turf/simulated/floor{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
"ack" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/security/execution{name = "\improper Prisoner Transfer Center"})
"acl" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/permabrig)
@@ -2218,7 +2218,7 @@
"aQH" = (/obj/structure/stool/bed/chair/office/dark,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/library)
"aQI" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/library)
"aQJ" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/library)
-"aQK" = (/obj/structure/crematorium,/turf/simulated/floor{icon_state = "dark"},/area/chapel/office)
+"aQK" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor{icon_state = "white"},/area/security/medbay)
"aQL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office)
"aQM" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office)
"aQN" = (/obj/effect/landmark/start{name = "Chaplain"},/obj/structure/stool/bed/chair,/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office)
@@ -2500,7 +2500,7 @@
"aWd" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/library)
"aWe" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/library)
"aWf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/wood,/area/library)
-"aWg" = (/obj/structure/morgue,/turf/simulated/floor{icon_state = "dark"},/area/chapel/office)
+"aWg" = (/obj/structure/crematorium,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office)
"aWh" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office)
"aWi" = (/obj/machinery/power/apc{dir = 8; name = "Chapel Office APC"; pixel_x = -25},/obj/structure/cable,/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office)
"aWj" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office)
@@ -3818,8 +3818,8 @@
"bvv" = (/turf/simulated/floor,/area/medical/morgue)
"bvw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/medical/morgue)
"bvx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/medical/morgue)
-"bvy" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/medical/morgue)
-"bvz" = (/obj/structure/morgue,/turf/simulated/floor,/area/medical/morgue)
+"bvy" = (/obj/structure/morgue,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office)
+"bvz" = (/obj/structure/morgue,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor,/area/medical/morgue)
"bvA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bvB" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor,/area/assembly/chargebay)
"bvC" = (/turf/simulated/floor,/area/assembly/chargebay)
@@ -3914,7 +3914,7 @@
"bxn" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor,/area/medical/morgue)
"bxo" = (/obj/machinery/optable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/medical/morgue)
"bxp" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/medical/morgue)
-"bxq" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/machinery/light/small{dir = 4},/turf/simulated/floor,/area/medical/morgue)
+"bxq" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor,/area/medical/morgue)
"bxr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 12},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bxs" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/assembly/chargebay)
"bxt" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/bluegrid,/area/assembly/chargebay)
@@ -4263,7 +4263,7 @@
"bDY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/closet/secure_closet/captains,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
"bDZ" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/obj/machinery/camera{c_tag = "Captain's Quarters"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
"bEa" = (/obj/structure/table/woodentable,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/item/weapon/storage/box/matches,/obj/item/weapon/reagent_containers/food/drinks/flask{pixel_x = 8},/obj/item/clothing/mask/cigarette/cigar,/obj/item/weapon/razor{pixel_x = -4; pixel_y = 2},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
-"bEb" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 1; icon_state = "left"; name = "Shower"; req_access_txt = "0"},/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/obj/item/weapon/soap/deluxe,/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/captain/bedroom)
+"bEb" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor,/area/medical/morgue)
"bEc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/crew_quarters/captain)
"bEd" = (/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/central/sw)
"bEe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/hallway/primary/central/sw)
@@ -5059,6 +5059,7 @@
"bTo" = (/obj/structure/table,/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "mining_shuttle"; pixel_x = 25; pixel_y = -8; req_access_txt = "0"; req_one_access_txt = "13;48"; tag_door = "mining_shuttle_hatch"},/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/mining/station)
"bTp" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5},/turf/simulated/floor/plating/airless,/area/space)
"bTq" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plating/airless,/area/space)
+"bTr" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/machinery/light/small{dir = 4},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor,/area/medical/morgue)
"bTs" = (/obj/machinery/computer/shuttle_control/mining,/turf/simulated/floor{dir = 9; icon_state = "brown"},/area/quartermaster/miningdock)
"bTt" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor,/area/quartermaster/miningdock)
"bTu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor,/area/quartermaster/miningdock)
@@ -5072,9 +5073,13 @@
"bTC" = (/turf/simulated/wall,/area/maintenance/apmaint)
"bTD" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"bTE" = (/turf/simulated/wall,/area/blueshield)
+"bTF" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 1; icon_state = "left"; name = "Shower"; req_access_txt = "0"},/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/obj/item/weapon/soap/deluxe,/obj/item/weapon/bikehorn/rubberducky,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/captain/bedroom)
"bTG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/command{name = "Blueshield's Office"; req_access_txt = "67"},/turf/simulated/floor/wood,/area/blueshield)
+"bTH" = (/obj/effect/landmark{name = "revenantspawn"},/mob/living/carbon/slime,/turf/simulated/floor/engine,/area/toxins/xenobiology)
"bTI" = (/turf/simulated/wall,/area/ntrep)
+"bTJ" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/camera{c_tag = "Virology Isolation 1"; dir = 2; network = list("SS13")},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"bTK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/command{name = "NT Representative's Office"; req_access_txt = "73"},/turf/simulated/floor/wood,/area/ntrep)
+"bTL" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/camera{c_tag = "Virology Isolation 2"; dir = 2; network = list("SS13")},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"bTM" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor,/area/hallway/primary/central/south)
"bTN" = (/obj/structure/sign/directions/engineering,/obj/structure/sign/directions/science{dir = 4; pixel_x = 0; pixel_y = -7},/obj/structure/sign/directions/medical{dir = 4; pixel_y = 7},/turf/simulated/wall,/area/janitor)
"bTO" = (/turf/simulated/wall,/area/janitor)
@@ -5086,6 +5091,7 @@
"bTU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "paramedic"; name = "Paramedic Garage"},/turf/simulated/floor,/area/medical/paramedic)
"bTV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/diamond{name = "Paramedic"; req_access_txt = "66"},/turf/simulated/floor,/area/medical/paramedic)
"bTW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/paramedic)
+"bTX" = (/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/engine,/area/toxins/xenobiology)
"bTY" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acutesep"; name = "Acute Separation Privacy Shutters"; opacity = 0},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
"bTZ" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acutesep"; name = "Acute Separation Privacy Shutters"; opacity = 0},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
"bUa" = (/obj/structure/sign/greencross,/turf/simulated/wall,/area/medical/sleeper)
@@ -6519,7 +6525,6 @@
"cxr" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/wall/r_wall,/area/medical/virology)
"cxs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/wall/r_wall,/area/medical/virology)
"cxt" = (/turf/simulated/floor/engine,/area/toxins/xenobiology)
-"cxu" = (/mob/living/carbon/slime,/turf/simulated/floor/engine,/area/toxins/xenobiology)
"cxv" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/engine,/area/toxins/xenobiology)
"cxw" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
"cxx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
@@ -6579,8 +6584,6 @@
"cyB" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology)
"cyC" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology)
"cyE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
-"cyF" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/camera{c_tag = "Virology Isolation 1"; dir = 2; network = list("SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
-"cyG" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/camera{c_tag = "Virology Isolation 2"; dir = 2; network = list("SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cyH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cyI" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/camera{c_tag = "Virology Isolation 3"; dir = 2; network = list("SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cyJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/medical/virology)
@@ -8034,7 +8037,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaczakSaczaczaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaetafqafqafsaetafqafqafsaetaaaagGahRahSahTagGagdahUahVahWahXahYahZaiaaglaibaicagUaidaieaifahGaigaihaiiaijaikahNailainaioaipaiqairaiqaisahnahQahQahQahQahQahQahQahQahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamjaaaaaaaaaaoOaaaaaaaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaaaaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaetafsafqaitaetafsafqaiuaetaaaagGaivaiwaixagGaiyaiyaiyaiyaizaimaiAaiCaglaiDaiEaiFaiGaiHaiIahGaiJaiKaiLaiMaiNaiBaiOaiQaioaipaiRairaiRaiSahnahQahQahQahQahQahQahQahQahnamjamjapBaabamjamjamjamjamjamjamjamjamjamjamjamjamjamjaabaabapCapDapEaabaabamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakSaabaoQaabakSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaetaiTaiUaiVaiWaiTaiUaiVaiXaiYaiZaiZaiZajaaiZaiZaiZaiZajbajcajdajeajfajgaiPajhajjajkajiajmahGajnajoajpajqaiNaiBajqaiQajsaipainainajtajuajvahQahQahQahQahQahQahQahQahnaabaabaabaabaabaabaaaaabaaaaabaabaabaabaabaabaabaabaaaaaaaaaapCaqDapEaaaaaaamjaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaczaczakSakSaabaabaaaapFaaaaabaabakSakSaczaczaczaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaetajwajxajyafqajzajAajBajCaiYajDajEajFajGajHajHajHaiZajIajJajKajLajMaiPajOajPajQajRajSajiajUajVajWajWajqajXajYajZakaakbakcakdakeakfainakgahQahQahQahQahQahQahQahQahnaabarxaryaryaryarzaryaryaryaryarzaryaryaryaryarAaabaaaaaaaaaapCaqDapEaaaaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaczaczakSakSaabaabaaaapFaaaaabaabakSakSaczaczaczaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaetajwajxajyafqajzajAajBajCaiYajDajEajFajGajHaQKaQKaiZajIajJajKajLajMaiPajOajPajQajRajSajiajUajVajWajWajqajXajYajZakaakbakcakdakeakfainakgahQahQahQahQahQahQahQahQahnaabarxaryaryaryarzaryaryaryaryarzaryaryaryaryarAaabaaaaaaaaaapCaqDapEaaaaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaaaaaaaabaaaaabaaaaaaapFaaaaaaaabaaaaabaaaaaaaczaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaetakiafqakjakkaklakmaknakoaiYakpakqakraksaktakuakvaiZakwakxakyakzajMakAakBakCakDakEakFakGakHakIajWakJakKakLajlakNakOakPakQainainainakRajvahQahQahQahQahQahQahQahQahnaabasqaabaabaabasqaabaaaaaaaabasqaabaabaaaaaaasqaabaaaaabaabapCaqDapEaaaaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaabarBarBarBarBarBaaaarCaaaarBarBarBarBarBaabaczaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaetakTakUakjafqakVakmakWakXaiYakYakZalaalbalcaldakvaiZalealfalgalhaliaiPaljalkajQallalmajialnaloalpalpalqaiNajrajNaltaluainaiqairainalvahnahnahnahnahnahnahnahnahnahnaabasqaabaaaapCapDapEaaaaaaapCapDapEaaaaaaapCapDapEaabaabaaaapCaqDapEaaaaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaaaasrassassassassastasuasvaswaswaswaswasxaaaaczaaaaaaaaaalxalyalyalyalzalAaaaaaaaaaaetaetaetalBalBalCajTalEalBaiZalFalGalHalIalJalKalLaiZalMalNalOakzalPajmalQalRalSalTalUajmalValWalXalYalZamaakMalramdameainaiRamfamgamhahnamiamiamiamiamiaaaaaaaaaaaaaabasqaabaaaapCaqDapEaaaaaaapCaqDapEaaaaaaapCaqDapEaaaaaaaaaapCaqDapEaaaaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8069,10 +8072,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKlaKmaKnaKmaKmaKoaKpaKmaKmaKnaKqaKrazEaGTaKsaJqaKtaKuaKvcBXcZjcBYczPczRcATczScZkcATcATczRczPaKDaKEaKFaKGaKHaKIaKJaKKaKLaKMaJwaabaIAaKNaKOaKPaKQaKRaIAaabaFPaFUaFVaKSaKTaKUaKVaKWaFVaCJaERaFWaFXaKXaKYaIGaFXaKZaFXaIGaLaaLbaFXaGhaERaGiavVaLcaxzaGkaAZaBaazXazYazZaLdaLeaILaLfaJQaJQaJQaLgaLhaLiaLjaINaLkaLlaLmaLnaLoaAsaaaaaaaaaaaaaaaaaaaaaaaaaaaaMUdbodbndbqdbpdbraMUaGyaLHaJeaHKaLHaMUaaaaMUaLHaLHaLHaLHaHKaLyaLzaLAaLAaLAaLAaLCaLBaLDdbtaLEaLFaLEdbvdbudbudbwdbydbxdbAdbzdbzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKlaKqaKmaLKaLLaLMaLNaLOaLPaLQaLRaLSaLTaLUaLVaBmaGTaLWaJqaLXaLYaLZaMaaLZaMbczPcZlcATcZmcZwcZvcZwcZxcZyaMkaMlaMmaMmaMmaMmaMmaMmaMoaMpaJwaaaaIAaMqaKOaMraKQaMsaIAaaaaFPaFUaFVaMtaMuaMvaMwaMxaFVaCJaERaMyaMyaBQaMzaJKaHraMAaHraJKaNOaBYaMCaMCaERaMDaxNaMEaxzaGkaAZaMFaMFaMFaMFaMGaMHaMIaMJaMKaMLaMLaMLaMMaMLaMNaMOaMPaMQaMRaMOaMSdbBaAsaMUaMUaMUaMUaMUaMUaMUaMUaMUaMUaMUaMUdbCaMUaMUaMUaMUaLHaHKdboavqaabavqaLHaNbaNcaNddbEaNfaNgaNhaNhaNhaNhaNiaNjaNkdbFaNlaNmaNlaNnaNlaNldbGdbHaNqaNqaDxaLJaNsaNsaNsaNsaNsaNsaNsaNsaNsabCacUaaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLUaNuaNvaNwaLTaNxaLMaNxaLMaNxaLMaNxaLTaNyaNzaBmaGTaNAaJqaNBaNCaNDaNEaNFaNGczPcZzcATcZAcZCcZBcZEcZDczPaZqaMmaMmaMmaMmaMmaMmaMmaMoaNPaJwaabaIAaNQaNRaNSaNTaNUaIAaabaFPaFUaFVaNVaNWaNXaNYaNZaFVaCJaERaERaERaERaOaaIGaFXaIHaFXaIGaObaERaERaERaERaOcaOdaOeaxzaJNaOfaOgaOgaOgaOhaOiaCnaOjaOkaOlaOjaOmaOnaOoaOjaOpaOqaOraOsaOtaINaOuaOvaOwaOxaOxaOvaOyaOzaOzaOzaOzaOzaOAaOBaOzdbJaODdbKaOGdbLaOHdbMaOIaDAdbOaDAaOKaOLaLHaMUaONaOOaOPaOQaORaOSaOTaOUaOVaOWaOVaOXaOYaOZaPaaPbaPcaPdaPeaPfaSFdbPaLJaPiaPjaPkaPlaPmaPnaPoaPpaPqaPraaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPsaLMaLMaKnaLTaNxaLMaNxaPtaNxaLMaNxaLTaNyaNzaBmaGTaPuaJqaJqaPvaDBcZFaDBaJqczPczPczPczPcZHcZGcZJcZIczPaPCaPDaPEaMmaMmaPFaMmaPGaPHaPIaJwaaaaIAaIAaPJaPKaPJaIAaIAaaaaFPaFUaFVaPLaPMaPNaNYaPOaFVaCJaERaFWaFXaPPaKYaIGaFXaIHaFXaIGaLaaPQaERaERaERaPRaPSaPTaPUaPVaPWamiamiaPXaPYaPZaQaaILaQbaJQaILaQcaILaQdaILaQeaQfaQgaQhaQiaQjaQkaQlaQmaQnaQoaQpaQqaQoaQoaQraQoaQlaQsaQlaLFdbQaQldbRdbTdbSaQwdbUaQxdbVdbXdbWdbYaQBaLEaQCaQDaQEaQFaQGaQHaQIaQJaOUaQKaQLaOVaQMaQNaQOaQPaPbaQQaPdaPeaPfaUndcaaLJaQSaQTaQTaQUaPpaPpaPpaPpaPqaPraaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPsaLMaLMaKnaLTaNxaLMaNxaPtaNxaLMaNxaLTaNyaNzaBmaGTaPuaJqaJqaPvaDBcZFaDBaJqczPczPczPczPcZHcZGcZJcZIczPaPCaPDaPEaMmaMmaPFaMmaPGaPHaPIaJwaaaaIAaIAaPJaPKaPJaIAaIAaaaaFPaFUaFVaPLaPMaPNaNYaPOaFVaCJaERaFWaFXaPPaKYaIGaFXaIHaFXaIGaLaaPQaERaERaERaPRaPSaPTaPUaPVaPWamiamiaPXaPYaPZaQaaILaQbaJQaILaQcaILaQdaILaQeaQfaQgaQhaQiaQjaQkaQlaQmaQnaQoaQpaQqaQoaQoaQraQoaQlaQsaQlaLFdbQaQldbRdbTdbSaQwdbUaQxdbVdbXdbWdbYaQBaLEaQCaQDaQEaQFaQGaQHaQIaQJaOUaWgaQLaOVaQMaQNaQOaQPaPbaQQaPdaPeaPfaUndcaaLJaQSaQTaQTaQUaPpaPpaPpaPpaPqaPraaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLUaQVaQWaNwaLTaNxaLMaNxaLMaNxaLMaNxaLTaNyaNzaBmaGTaQXaQYaQZaRaaRbaRbaFzaRdaReaRfaRgcZKcZMcZLcATcZNczPaRlaRmaRnaRoaRpcZOaRraRsaRtaRuaJwaaaaabaaaaElaRwaElaaaaabaaaazEaFUaFVaRxaRyaRzaRAaRBaFVaCJaERaRCaRDaBQaREaRFaHraRGaHraRHaRIaRJaERaRKaRLaRMaRNaROaRPaRQaRRaaaaaaaPXaRSaRTaRUaILaRVaRWaJQaJQaRXaJQaJQaJQaRYaINaRZaINaSaaSbaINaScaINaSdaSeaSfaSgaShaSiaSdaSjaSkaSlaSmaSlaSlaSlaSlaSnaSlaSlaSoaSldcbaUbaSlaSqaLHaOQaSraQFaSsaStaSuaSvaSwaSxaSyaSzaOVaSAaSBaSCaSDaSEaQQaPdaPeaPfaSFaSGaLJaSHaQTaQTaQUaPpaPpaPpaPpaPqaPraaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSIaSJaKmaLKaLTaLMaSKaSLaLMaLMaSMaSKaLTaLUaSNaBmaGTaSPaSQaSRaSSaSRaSRaSRaSRaSRaSTaFzczPaEvcZPaEvczPczPaEFaSWaEFaJzaJzaJzaJzaEFaSYaEHaJwaFxaFqaFqaFJaTdaFJaFqaFqaFKaTgaThaFVaTiaFVaTjaTkaTlaFVaTmaERaERaERaERaFMaFNaTpaFQaTpaFNaFMaERaERaTtaRNaRNaRNaRNaTuaTvaTwaTxaTyaPXaTzaRTaTAaILaILaILaILaILaILaILaINaINaRYaTBaTCaTDaTEaTFaTGaTHaTIaSdaTJaTKaTLaTMaTNaSdaTOaTPaTQaTRaTQaTSaFRaTUaTVaTWaTXaTYaTZdccaVUaSlaUcaOHaUdaUeaUfaSsaUgaSuaSvaUhaOVaUiaUjaUkaUlaUmaQPaQPaOVaOVaPdaPeaPfaUnaUoaLJaUpaUqaUraUsaUtaUuaPpaPpaUvaPraaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSIaKmaKnaKmaKmaKoaKpaKmaKmaKnaSJaUwazEaUxaSPaAvaUyaUyaUzaUyaUAaAyaUBaUCaFzaUDaYgaUGaUGaUHaUIaUGaUJaUGaUGaUGaUKaUGaUGaULaUMaUNaUOaUPaUQaUOaURaUOaUOaUOaUOaUSaUTaUUaUGaUGaUVaUWaUXaUYaUZaVaaVbaVcaVdaVeaVfaVfaVfaVfaVfaVfaVgaVhaViaVjaVkaVlaVmaVnaVoaVpaRNaRNaVqaVraVsaVraVsaVtaVuaVvaVwaVxaVyaINaVzaVAaVBaVCaVDaVDaVEaVFaVGaVHaSdaVIaVJaVKaVKaVLaSdaVMaVNaVOaVPaVQaVQaVRaVSbeCaVUaVVaVWaVXaVYaVUaSlaSqdauaOQaWbaWcaWcaWdaWeaWcaWfaOVaWgaWhaOVaWiaWjaQPaWkaOVaWlaWmaWnaPfaNqaNqaLJaWoaNsaWpaWqaNsaNsaNsaNsaNsabCacUaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSIaKmaKnaKmaKmaKoaKpaKmaKmaKnaSJaUwazEaUxaSPaAvaUyaUyaUzaUyaUAaAyaUBaUCaFzaUDaYgaUGaUGaUHaUIaUGaUJaUGaUGaUGaUKaUGaUGaULaUMaUNaUOaUPaUQaUOaURaUOaUOaUOaUOaUSaUTaUUaUGaUGaUVaUWaUXaUYaUZaVaaVbaVcaVdaVeaVfaVfaVfaVfaVfaVfaVgaVhaViaVjaVkaVlaVmaVnaVoaVpaRNaRNaVqaVraVsaVraVsaVtaVuaVvaVwaVxaVyaINaVzaVAaVBaVCaVDaVDaVEaVFaVGaVHaSdaVIaVJaVKaVKaVLaSdaVMaVNaVOaVPaVQaVQaVRaVSbeCaVUaVVaVWaVXaVYaVUaSlaSqdauaOQaWbaWcaWcaWdaWeaWcaWfaOVbvyaWhaOVaWiaWjaQPaWkaOVaWlaWmaWnaPfaNqaNqaLJaWoaNsaWpaWqaNsaNsaNsaNsaNsabCacUaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvaWraBmaBmaBmaBmaBmaBmaWraAvaJnazEaWuaWvaAvaWxaWyaWzaWzaWAaAyaWBaUCaWCaWDaYgcZRaWFaWGaWHaWHaWIaWJaWJaWJaWKaWLaWLaWMaWNaWOaWHaWHaWPaWQaWRaWSaWTaWTaWUbdkaWVaWQaWQaWQaWWaUWaUXaUYaUZaUZaUZaUZaWXaUZaUZaUZaUZaUZaUZaWYaWZaXaaXbaXcaXdaXeaXfaXgaXhaXiaXiaXiaXjaXkaXkaXkaXlaVyaVyaVyaXmaXnaVyaINaXoaXpaVDaVDaXqaVDaXraXsaVGaXtaSdaXuaXvaXwaXxaXyaSdaXzaXAaXBaXCaXDaXEaSlaFSaXGaFSaSlaSlaSlaSoaSlaSlaSqaLHaOQaXHaQFaQFaQFaXIaQFaXJaOVaOVaOVaOVaOVaOVaOVaXKaOVaPfaPfaPeaPfaXLaXMaNqaXNaXOaXPaXQaXRaXSaXTaXUaFTaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaIfazEaAvaCzaBmaXWaXXaXYaXZaBmaCzaAvaAvazEaYcaSPaAvaYdaYeaWzaWzaWAaAyaYfaUCaFzaWDaYgaUGaYhaYiaUGaUGaYjaYkaYlaUGaYmaYnaYoaYnaYpaYqaYnaYnaYraYnaYnaYsaYtaYnaYuaYsaYvaVTaUGaUGaYwaYxaYyaYzaYAaYBaYAaYCaYDaYCaYCaYCaYCaYCaYCaYEaYFaYGaYGaYGaYGaYHaYGaYIaYJaYGaYGaYKaYLaYMaYMaYMaYMaYMaYMaYMaYNaVyaVyaINaYOaYPaYQaYRaYRaYSaYTaXsaVGaYUaSdaSdaSdaSdaSdaYVaSdaYWaYXaYYaYZaTQaZaaSlaZbaZcaZdaZeaZfaZgaZhaZiaSlaSqaWaaOQaZjaZkaQFaZlaZmaQFaZnaZnaOQaZoaZpbeKaNqaZraZsaZtaPfaPfaZuaZvaNqaZwaNqaZxaXOaZyaZzaZAaXOaXOaZBaFTaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaAyaAvaWraBmaGTaFzaFzaGUaBmaWraBmaZDaZEaZFaZGaAvaZHaZHaUzaZHaUAaAyaZIaUCaFzaAyaSUaSUaZJaZKaZKaZKaZKaZKaZKaZLaZMaZKaZKaZKaZKaZKaZKaZNaZOaZPaZPaZQaZPaJaaGCaKiaJaaJaaZUaZVaZWaSUaZXaZXaZYaZYaZYaGEaGEaGEaGEaGEaGEaGEaGEbacaGFaGFaGGaGFaGRaGRaGRaGRaHeaGZaGRbacaHgaHgaHgaHgaHgaHgaHgaHgbaobaobaoaINbapbaqbarbarbarbarbasbatbaubavbawbaxbcjbazbaAbaBaSdaSdbaCaHhaHoaHhaHhaSlbaHbaIbaJbaJbaJbaJbaKbaLaSlbaMdcjaOQbaNaQFaZlaZlaZmaZlaQFbaOaOQbaPbaQbaRaNqaPfbaSbaTbaUbaUbaVbaWbaXbaYbaZbbabbbbbcbbdaXQaXOaXObbeaFTaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtdcdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8089,12 +8092,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboPboPboPboPboPboPboPboPboPboPboPaHRaAvaAvbpQbpRbpSbpSbpSbpTbpSbpSbpUbpVbpWaZOaZOaZObpXbjlbkFbpYbpZbntbjlbqabsubqaaZKaZKaZKaZKbqcaZKbqdbkQbkRbqebqfbnzbqgbqhbkRbmobkXbqibnCbnCbnCbqjbkXbqkbnHbmuaHVbqmbpqbprbqnbqobpubnNbqpbjPbqqbqrblgbqsbqtbqubmEbqvdavbqxbqybqzbqAbqBbqCbqDbnVbqEbllbqFbqGbocbodboebofbohbqHbohbohbohbohbqIbqJbqJbqJbqJbqKbohbohbohbohbqLbohbqHbqMbohbqNbqObqPbohbqQbqRbqRbqSbqTbqUbqVbkobkobkobkobkobkobkobqWbqXbqYbkobkobkobkobkobkobkobkobkobkobqZbrabrabrbbrcbrdbrebrfbrfbrfbrfbrgbrhaFTaabaaaaaaaabaNtaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtdcdaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboPboPboPboPboPboPboPboPboPboPboPbrjbrkbrlbrmbrnbpSbrobrpbrqbrqbrrbrsbrtbrubrvbrvbrwbrxbjlbjlbjlbmdbrybmcaZOaZOaZOaZObrzbbKbbKbrAbjybrBbrCbrDbrEbrFbrGbrHbrIbkRbrJbkXbrKbnCbnCbnCbrLaIgbrNbnHbrOblbbrPbrQbnLbnLbnLbnLbnNbrRbjPbrSbrTbjPbjPbjPbjPbjPbjPbjPblkbllbrUbrVbrWbrXbrYbrZbsabllbsbbscbscbsdbsdbsdbsdbsdbsdbsdbsebsebsfbsgbshbshbsgbsfbsebsebsibsibsibsibsibsibsjbsjbskbsjbsjbsjbsjbsjbslbsmbsnbsobkobkobspbspbsqbsqbsqbsqbsqbsrbrabrabqZbrabkobrabrabrabrabssbstbstbstbstbsFbsvbsvbsvbsvbsvbsvbsvbsvbsvaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboPboPboPboPboPboPboPboPboPboPboPaAvaAvaAvbpQbswbpSbsxbpSaIhaIhbpSbpUbpUbdabsAbsBbsBbsCbjlbkFbsDbmdbsEbmcbsHbsGbujbsIbsJbsKbsKbsLbsKbsMbsNbkRbsObsPbsQbsRbsSbrDbsTbkXbsUbnCbnCbsVbsWbsXbrNbnHbsYblbbsZbtabtbbtcbtdbtebtfblbblbbtgbthbtibtjbtkbtjbtlbthaaabtmbllbtnbtobtpbtqbrYbnVbtrbllbtsbttbtubsdbtvbtwbtxbtybtzbtAbtBbtCbtDbtEbtFbtFbtEbtGbtHbtIbsibtJbtLbtKbtMbsibtNbtObtPbtQbtRbtSbtSbtTbslbtUbtVbtWbtXbtWbtYbtYbsqbtZbuabubbsqaImbudaImbsqbuebrabssbstaInbugaInbstbuhbuibstbuwbukbulbumaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboPboPboPboPboPboPboPboPboPboPaaabunaAvbuoblUbupbpSbuqbpSburbusbutbuubpSbuvbwHbuxbuybsCbjlbjlbjlbjlbjlbjlbuzbuAbuBbuCbuDbkRbkRbkRbkRbkRbkRbkRbuEbkRbkRbkRbuFbkRbuGbuHbuIbnCbnCbnCbuJaIgbuKbnHbuLblbbuMbtablcblcblcblbbuNblbbuObuPbuQbuRbuSbuTbuUbuVbuWbuXbuYbllbuZbnVbvabvbbrYbvcbnVbllbvdbvebvfbsdbvgbvhbvibvjbvkbvlbvmbtFbtFbtFbtFbtFbtFbtFbvnbvobvpbvqbvrbvsbvtbsibvubvvbvwbvxbvybvzbvvbtTbslbvAbtVbvBbvCbvDbvEbvEbvFbvGbvHbvIbvJbvKbvLbvMbsqbvNbvObvPbstbvQbvRbvSbvTbvTbvUbstbvVbvWbvXbumaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfazEaBmaBmaAvaAvaAvaAvaAvaAvaAvaGTbwabwbbpSbwcbwdbwebwfbwgbwhbwibgebbKbbKbbKbwjbrvbrvbrvbrvbrvbrvbwkbwlbwlbwmbwnbkRbwobwpbwqbwrbwsbwtbwubwvbkRbwwbwxbwybsTaIgbuIbnCbnCbwzbkXbkXbwAbwBbwCbwDbwEbwFbwGbzDbwIbwJbwKbwLbwMbwNbuWbwObwPbwObwPbwQbuWbuXbwRbwSbwTbwUbwVbwWbwXbwYbwZbwSbxabttbttbsdbxbbxcbxdbxebxfbsdbvmbtFbtFbtFbtFbtFbtFbtFbxgbxhbxibxjbxkbvqbxlbsibxmbxnbxobvxbtTbvzbxpbxqbslbxrbxsbxtbxubxubxvbxwbxxbxybxzbxzbxzbxAbxzbxBbxCbxDbxEbxFbxGbxHbxIbxJbxJbxJbxKbstbxLbvWbxMbumaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvbxObxPbxQbxRbxSbxSbxTbxUaFzbpSbxVaIhbwfbxXbpSbpSbpSaZOaJkaJkbyabybbyabyabyabybbyaaZOaZObkRbkRbkRbycbkRbydbydbydbydbydbydbwubyeaJlbygbyhbyibyjbykbylbymbynbyobypbyqbyrbysbytbyubyvbyvbywbyxbyybyzbyAbyBbyCbyDbthbyEbuUbyFbuSbyGbthaaabyHbyIbyJbyKbyIbyIbyIbyIbyLbllbyMbttbyNbyObyPbyQbyRbySbyTbsdbyUbyVbyWbyXbyYbyZbzabzbbvnbzcbsibzdbxkbzebzfbsibzgbzhbvwbvxbtTbvzbvvbtTbslbvAbtVbzibzjbzkbzlbzmaJmbzobzpbzqbzrbzsbztbzubsqbzvbzwbzxbstbzybzzbzAbvTbzBbzCbstbxLbvWbAhbumaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboPboPboPboPboPboPboPboPboPboPaaabunaAvbuoblUbupbpSbuqbpSburbusbutbuubpSbuvbwHbuxbuybsCbjlbjlbjlbjlbjlbjlbuzbuAbuBbuCbuDbkRbkRbkRbkRbkRbkRbkRbuEbkRbkRbkRbuFbkRbuGbuHbuIbnCbnCbnCbuJaIgbuKbnHbuLblbbuMbtablcblcblcblbbuNblbbuObuPbuQbuRbuSbuTbuUbuVbuWbuXbuYbllbuZbnVbvabvbbrYbvcbnVbllbvdbvebvfbsdbvgbvhbvibvjbvkbvlbvmbtFbtFbtFbtFbtFbtFbtFbvnbvobvpbvqbvrbvsbvtbsibvubvvbvwbvxbxqbvzbvvbEbbslbvAbtVbvBbvCbvDbvEbvEbvFbvGbvHbvIbvJbvKbvLbvMbsqbvNbvObvPbstbvQbvRbvSbvTbvTbvUbstbvVbvWbvXbumaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfazEaBmaBmaAvaAvaAvaAvaAvaAvaAvaGTbwabwbbpSbwcbwdbwebwfbwgbwhbwibgebbKbbKbbKbwjbrvbrvbrvbrvbrvbrvbwkbwlbwlbwmbwnbkRbwobwpbwqbwrbwsbwtbwubwvbkRbwwbwxbwybsTaIgbuIbnCbnCbwzbkXbkXbwAbwBbwCbwDbwEbwFbwGbzDbwIbwJbwKbwLbwMbwNbuWbwObwPbwObwPbwQbuWbuXbwRbwSbwTbwUbwVbwWbwXbwYbwZbwSbxabttbttbsdbxbbxcbxdbxebxfbsdbvmbtFbtFbtFbtFbtFbtFbtFbxgbxhbxibxjbxkbvqbxlbsibxmbxnbxobvxbEbbvzbxpbTrbslbxrbxsbxtbxubxubxvbxwbxxbxybxzbxzbxzbxAbxzbxBbxCbxDbxEbxFbxGbxHbxIbxJbxJbxJbxKbstbxLbvWbxMbumaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvbxObxPbxQbxRbxSbxSbxTbxUaFzbpSbxVaIhbwfbxXbpSbpSbpSaZOaJkaJkbyabybbyabyabyabybbyaaZOaZObkRbkRbkRbycbkRbydbydbydbydbydbydbwubyeaJlbygbyhbyibyjbykbylbymbynbyobypbyqbyrbysbytbyubyvbyvbywbyxbyybyzbyAbyBbyCbyDbthbyEbuUbyFbuSbyGbthaaabyHbyIbyJbyKbyIbyIbyIbyIbyLbllbyMbttbyNbyObyPbyQbyRbySbyTbsdbyUbyVbyWbyXbyYbyZbzabzbbvnbzcbsibzdbxkbzebzfbsibzgbzhbvwbvxbEbbvzbvvbEbbslbvAbtVbzibzjbzkbzlbzmaJmbzobzpbzqbzrbzsbztbzubsqbzvbzwbzxbstbzybzzbzAbvTbzBbzCbstbxLbvWbAhbumaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvbzEbzFbzGaFyaFybzHbzIaFybzJbpSbzKaJMaKbbzNbpSaaaaaaaaaaabaabbzObzObzObzObzObzObzOaaaaaaaKcbzQbzRbzSbzTbydbydbydbydbydbydbzUbzVbzWbzXbzYbzZbAaaKdbkXbkXbAcbkXbkXbkXbAdbAebAfbAgbBubAibAibAjbAibAkbAlbAmbAnbyDbthbAobtjbtjbtjbApbthaaabyHbyIbAqbArbAsbAtbAubAvbAwbAxbAybttbAzbsdbtvbAAbABbACbADbAEbAFbAGbAHbAIbAJbAKbALbAMbANbAObAPbAQbxkbARbASbsibATbAUbAVbAWbAXbAYbAZbtTbslbBabBbbBcbBdbBdbBebBfaKjbBhbBibBjbBkbBlbBmbBnbsqbBobzwbBpbstbBqbBrbBsbvTbvTbBtbstbvVbvWbEGbumaaaaaaaaaaaaaabbBvbBwbBxbBwbBxbBwbByaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBzaAvbBAbBAaMWaAvaAvaIfazEbBDbBCbpSbBEbBFaKbaKbbpSaaaaaaaaaaaaaaabzObzObzObzObzObzObzOaaaaaaaKcbBJbydbBKbBLbBLbBLbBLbBLbBMbBNbBLbBObBPbBQbBRbBSbBTbBUbkXbBVbnCbBWbBXaIgbBZbCabCbbAgbAgbAmbCcbCdbCebCfbCgbAmbtgbyDbthaNIaPwbCjaRvaPAbthaaabCmbyIbCnbCobCpbCqbCrbCqbCsbCtbCubttbCvbsdaSVaSOaSObCzbCAbCBbCCbCDbCEbCFbCGbCGbCHbCIbCJbCKbsibAQbCLaSXbsibsibsjbCNbCObCPbsjbslbslbslbCQbCRbtVbCSbzjbzkbCTbBdaKjbCVbCWbCWbCXbvIbCYbCZbDabDbbvObDcbstbDdbDebvTbDfbDgbDhbstbxLbDibumbumaaaaaaaaaaaaaabbDjbDkbDlbDmbDnbDobDjaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzOaSZaKcaKcbDubDvbDwbDxbDxbDxbDvbydbwubyebydbydaJlbDybDzbDAbDBbDCbDDbDEbnCbnCbDFaIgbBZbCabDHbDIbDJbDKbDLbDMbDNbDObDPbAmbDQbDRbuQbDSbDTbDUbDVbDWbuWbuXbDXbyIbDYbDZbEabCqbEbbCqbEcbCtbEdbttbEebsdbEfbEgbEhbEibEjbEkbElbEmbEnbEnaTabEpbEnbEnbEqbErbEsbEtbEubEvbEwbExbEybEzbEAbEBbECbEDbEEbEFbEYbEHbtVbEIbEJbEKbELbEMbvFbENbCWbCWbEObEPbCYbEQbsqbERbERbESbstbETbEUcHibEWbvTbEXbstbxLbHVbumaaaaaaaaaaaaaaaaabbEZbFabDlbDnbDlbFbbBxaabaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzOaSZaKcaKcbDubDvbDwbDxbDxbDxbDvbydbwubyebydbydaJlbDybDzbDAbDBbDCbDDbDEbnCbnCbDFaIgbBZbCabDHbDIbDJbDKbDLbDMbDNbDObDPbAmbDQbDRbuQbDSbDTbDUbDVbDWbuWbuXbDXbyIbDYbDZbEabCqbTFbCqbEcbCtbEdbttbEebsdbEfbEgbEhbEibEjbEkbElbEmbEnbEnaTabEpbEnbEnbEqbErbEsbEtbEubEvbEwbExbEybEzbEAbEBbECbEDbEEbEFbEYbEHbtVbEIbEJbEKbELbEMbvFbENbCWbCWbEObEPbCYbEQbsqbERbERbESbstbETbEUcHibEWbvTbEXbstbxLbHVbumaaaaaaaaaaaaaaaaabbEZbFabDlbDnbDlbFbbBxaabaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzObFcbFdbFcbFebFfbFgbFfbFfbFfbFfbFhbwubyebFibkRbkRbFjbnCbyhbDBbFkaIgbFmbFnbFnbFobFpbFqbFrbFsaTbbFuaTcbFwbFxbFybFzbFAbAmbAnbyDbthbFBbFCbFDbFEbFFbthaaabCmbFGbFHbFGbFGbFGbFGbFGbFIbFGbFJbttbEebsdbFKbFLbFLbFMbFNbCBbFObFPaTebFRbFSbFTbFUaTebFVbFWbFXbFYbFZbGabGbbGbbGcbGdbGebGfbGgbGhbGibGjbGkbGlbGmbGnbGnbGobGpbGqbvFbGrbvIbvIbGsbGtbCYbGubGvbGwbGxbGybGzbGAaTnaTfbGDaTfbstbstbGFbDbbDbaToaToaToaToaTobDbbDjbDnbDlbDnbDnbGJbDjaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzObGKbGLbGKbGMbydbDwbDxbDxbDxbydbydbwubyebGNbGObkRbGPbnCbyhbDBbGQaIgbGSbnCbplbnCbGTbBZbttbGUaTbbFuaTqbGXbGYbGZbHabHbbHcbHdbHebHfbHfbHgbHhbHibthbthaaabCmbFGbHjbHkbHlbHmbHnbHobHpbHqbHrbttbEebAEbHsbHtbHubHvbHwbCBbHxbHybHzbHAbHBbHCbHDbHEbHFbHGbHHbHIbHJbHKbHLbHMbHNbHObHPbHQbHRbEDbHSbHTbHUbZMbtWbHWbHXbHYbHZbHZbvFbIabIbbIcbvFbIdbCYbIebvFbIfbIgbIhbIibIjbIkbIlbImbInbIobIpbIqbIrbIsbItbItbIubIvbIwaTrbIybBwbBxbIzbBxbBwbIAaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzOaSZaKcaKcbIDbydbDwbydbydbydbydbydbwubyebGNbIEbkRbIFbnCbIGbIHbnCbIIbnBbnCbnCbIJaIgbBZbttbGUaTbbFubAmbIKbILbIMbINbIObIPbIQbIRbISbITbuWbIUbIVbuWbuXbuXbIWbFGbIXbIYbIZbJabJbbJbbJcbJdbJebttbJfbsdbCBbJgaSVbJibJjbCBbHxbJkbJlbJmbJnbJobJpbJlbHxbJqbJrbJsbJsbJsbJtbJsbJubJubJvbJwbJxbJybJybJzbJxbJxbJybJybJAbJBbJAbJAbvFbvFbvFbvFbvFaTsbJDaJmbvFbJFbJGbJHbJIbJIbJJbJKbJLbJMbJNbJObJPbJQbJRbJSbJSbJTbIjbJUbDbaTTaTTaTTbJYbDbbJZaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8125,21 +8128,21 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrmcrncsAcsBcsCcsBcsDcsEcsFcsGcsHcsIcsHcsJcsKcsKcsKcsKceTbZVbZVbZVcsKcsLcsKcsKcsKcsKcsKcsKcsKcsKcsKcsKcsMcsNcsOcsPcsQcsRcsScsTcsUcsVcsWcsXcsYcsZctactbctcctdctecmnctfctgcthctictjctkcpPctlcoCctmcpPctkctncpOctocoNctpcmscmsctqctrctscttckPbnjbnjbnjbnjcnzcnzcnzbnjbnjbnjcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjIctyctzctAcjIcmAcmAcmAcmAcmAcmAcuTcsncuUctBcswctCcmAcmAcpjbsyctMbsybsyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrmctPcsBctQctRctSctTctUctVctWctXctYctZcuacubcuccudcudcuecdqcufcdqcubcugcubcubcubcubcubcubcubcubcubcubcuhcsKcuicujcukbszbuccuncuocupcuqcurcuscutbufcuvcuwcuxcrVcdzcuycuzcuAcpPcpOcpPcpPcuBcuCcuDcpPcpPcpScpOcuEcoNcuFcnzaaacuGckPcuHckPckPaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjIcjIcjIcjIcjIcjIcjIcjIcjIcuIcuJcuKcjIaabaabaaaaaaaabcmAcmActEcmActGctFctHcmAaaaaaabsycuYbsyaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUabCcqtcqtcqtcqtcqtcqtcuZcvacvacvbcsHcvccqtcqxcvdcvecvecvfcvecvgcvecvebvYbvZcvecvebvZbvZbvZcvecvecvecvecvlcvmcvncvocvpcvqcvrcvscvtcvscvscvucvscvvbxNcvxcvycvzcrYbHTcuFcvAcvBcvCcvDcvEcvFcvGcoCcvHcvFcvIcpScvJcvKcoNcuFcnzaaacuGcvLcvMcvNckPaaaaaaaaaaaacvOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjIcvPcvQcvRbxWcvTcvUcvVcvWcvXcvYcvZcjIaabaaaaaaaaaaabaabcwectJcuVcxCcxBcwacweaaaaaabsycwobsyaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaczaczakSakSaczakSakSakSalwakSakSaabalwawTaaaaabaabcwpcwpcwpcqtcwqcwrcwscwtcwucwvcwwbxYcwybxZcwAcwBcwCcwDcwEcwFcwGcwHcwIcvecwHcwJcwKcwLcwLcwMcvecwNcwOcwPcwQbZUcwRbyfcwTcwUcwVcwWcwVcwXcwYbzncxacxbcxccrYcrYcuFcvAcoNcoNcxdcoNcoNcxecxfcxgcxgcxgcxhcxgcxicxgcxjcnzaaacuGcxkcvMcxlckPbhsbhsbhsbhsckPckPcxpcxqcxqcxrcxqcxqcxrcxsaaaaaacjIcxtcxucxtcxvcxwcqacxxcvWcxycxzcxycjIaaaaaaaaaaaaaaaaaacwecwbcuWcxCcxCcwccweaaaaaaaaacxJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaaaaaaaczaaaaaaaabaabaaaaabaabaaaaaaaabaabaabaaaawTaaaaaaaaaaabaabcwpcqtcqtcqtcqtcqtcqtcqtcqtcxLcwybxZcxNcxOcxPcxQcxQcxQcxQcxRcxScxTcwLcxUcwLcwLcxVcwLcxWcxXcxYcxZcwQbZUcyacybcyccwUcydcyecyfcwUcygcyhcyicyjcykcylcymcyncyocypcypcyqcyrcyscytcyucdzcdzcdzcyvbHTbHTcbRbHTcnzaaacuGcywcvMcyxcyycyzcyAcyBcyCbzLcyEcyFbzLcyEcyGbzLcyHcyIcyJaaaaaacjIcxtcxtcxtbzMcyLcyMcyNcyOcyPcyQcyRcjIaaaaaaaaaaaaaaaaaacwectKcxCczMcxCcuLcweaaaaaaaaacyXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaczaczakSakSaczakSakSakSalwakSakSaabalwawTaaaaabaabcwpcwpcwpcqtcwqcwrcwscwtcwucwvcwwbxYcwybxZcwAcwBcwCcwDcwEcwFcwGcwHcwIcvecwHcwJcwKcwLcwLcwMcvecwNcwOcwPcwQbZUcwRbyfcwTcwUcwVcwWcwVcwXcwYbzncxacxbcxccrYcrYcuFcvAcoNcoNcxdcoNcoNcxecxfcxgcxgcxgcxhcxgcxicxgcxjcnzaaacuGcxkcvMcxlckPbhsbhsbhsbhsckPckPcxpcxqcxqcxrcxqcxqcxrcxsaaaaaacjIcxtbTHcxtcxvcxwcqacxxcvWcxycxzcxycjIaaaaaaaaaaaaaaaaaacwecwbcuWcxCcxCcwccweaaaaaaaaacxJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaaaaaaaczaaaaaaaabaabaaaaabaabaaaaaaaabaabaabaaaawTaaaaaaaaaaabaabcwpcqtcqtcqtcqtcqtcqtcqtcqtcxLcwybxZcxNcxOcxPcxQcxQcxQcxQcxRcxScxTcwLcxUcwLcwLcxVcwLcxWcxXcxYcxZcwQbZUcyacybcyccwUcydcyecyfcwUcygcyhcyicyjcykcylcymcyncyocypcypcyqcyrcyscytcyucdzcdzcdzcyvbHTbHTcbRbHTcnzaaacuGcywcvMcyxcyycyzcyAcyBcyCbzLcyEbTJbzLcyEbTLbzLcyHcyIcyJaaaaaacjIcxtcxtcxtbzMcyLcyMcyNcyOcyPcyQcyRcjIaaaaaaaaaaaaaaaaaacwectKcxCczMcxCcuLcweaaaaaaaaacyXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaaaaczaaacyYcyZczaaaacyYcyZczaaaacyYcyZczaaabczbaabaaaaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaabxYcwybxZczdcwLcxVczecwLcwLcwLczfcwLczdczdcwLcwLcwLcwLczgbzPcxXczicsKczjbZUcybcybczkcwUczlczmczncwUczoctaczpczqczrczscztcHZbHTczucbSczubHTbHTbHTcuFcZScnzbnjbnjbnjbnjbnjcnzcnzaaaczwczxczycjqczzczAcoOcoOczBbAbczDczEbAbczDczEbAbczDczEcyJaaaaabcjIcvWcvWcvWcvWczFcqaczGczHczIczJczKcjIaabaaaaaaaaaaaaaaacwecuPcuMcxCcxCcuOctDcEpaaaaaacyXaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaczaaacyYczVczaaaacyYczVczaaaacyYczVczaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbxYcwybxZczdczYcwLczZcAacAbcAbcxUcwLczdcAccwLcwLcwLcwLcAdcAecAfcAgbYxcAhcAicAjcAkcAlcwUczlcAmcAncwUcAoctacrYcApcrVcAqcArcAscAtcAucAvcAwcAtcAtcAtcAxcAtcnzaaaaaaaaaaaaaaaaaaaabaaacuGcAycvMcAzcAAcABcoOcoOczBbAbcADbAbbAbcADbAbbAbcADbAbcyJaabaabcjIcvPcvQcvRbBBcAIcyMcAJcAKcALcAMcANcjIaabaabaabaabaabaaacwecwecuScuRcwdcwecweaaaaaaaaacyXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaagaaaaaaaaaakSaabcyYczVczaaaacyYczVczaaabcyYczVczaaabaaaaaaaabaabaabaabaabaaaaaaaaaaaaaaaaabaaaaaabxYcwycvecAWcwLcAXcAYcAZcBacBbcBacBccBacBdcBecwHcBfczdczdbzPcBgcBhcBicBjcBkcBlcBmcBncBocBpcBqcBrcBscBtcBucBvcBvcBwcBxcBycBzbBGcBBcBCcBDcBEcBFcBGcBHbBHaabaaaaaaaaaaaaaaaaaaaabaabczwcBJcBKcBLcBMcBNcoOcoOcoOcBOcoOcoOcoOcoOcoOcoOcoOcBPbBIaaaaaacjIcxtcxtcxtcBRcxwcqacBScBTcBUcBVcBWcjIcjIcjIcjIcjIaabaaaaaacwecwecwecwecweaaaaaaaaaaaacyXaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaagaaaaaaaaaakSaabcyYczVczaaaacyYczVczaaabcyYczVczaaabaaaaaaaabaabaabaabaabaaaaaaaaaaaaaaaaabaaaaaabxYcwycvecAWcwLcAXcAYcAZcBacBbcBacBccBacBdcBecwHcBfczdczdbzPcBgcBhcBicBjcBkcBlcBmcBncBocBpcBqcBrcBscBtcBucBvcBvcBwcBxcBycBzbBGcBBcBCcBDcBEcBFcBGcBHbBHaabaaaaaaaaaaaaaaaaaaaabaabczwcBJcBKcBLcBMcBNcoOcoOcoOcBOcoOcoOcoOcoOcoOcoOcoOcBPbBIaaaaaacjIcxtbTXcxtcBRcxwcqacBScBTcBUcBVcBWcjIcjIcjIcjIcjIaabaaaaaacwecwecwecwecweaaaaaaaaaaaacyXaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaabaaacyYczVczaaabcyYczVczaaaacyYczVczaaaaaaaaaaaaaaaaaaaaabaabaabaaaaabaaaaabaabaaaaaacxLcBZcvecCacCbcCbcCccvecvecvecvecvecvecvecvecvecvecvecvecvecCdcCecCdcCfcCdcqxbBYcChbCibChbChbCkcCmbClcBucCocCpcCqcCrcCscCtbBGcCvcCwcCxcCycCzcCAcCBbCwaabcCDcCDcCDcCDcCDaaaaaaaabcuGcCEcvMcCFcCGcCHcCIcoOcoOcCJcoOcoOcoOcoOcoOcCKcoOcCLbBIaaaaaacjIcxtcxtcxtbBBcCNcyMcCOcCPcCQcCRcCScCTcCUcCVcCWcjIaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyXaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaczakSaabaaacyYczVczaaabcyYczVczaaaacyYczVczaaabaaaaaaaaaaaaaaaaaaaaaaaaaabbCxcCYcCYcCYcCYcxLcCZcwycDacDbcDccDccDdcDecDfcDgcDgcDgcDgcDhcDicDjcDicDicDkcDkcDicDlcDmcDncDocDocDpcDqcDrcDscDtcDucDucDvcDwcDxcDycDzcDAcCscDBbBGcDCcDDcDEcDFcDGcDHcDIbCycDKcDLcDMcDNcDOcCDaaaaaacDPcDQcDRcDScDTcDRcDUcDVcDWcDXcDYcDZbzLcDYcEbcEccEdcEebCMcyJaaaaaacjIcvWcvWcvWcvWcEgcqacBScEhcEicBVcEjcEkcElcEmcEnbSIcEpaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyXaabaaaaaaaaaaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaaaaabaaaaabaabcEqaabaabaabcEqaabaaaaabcEqaabaaaaaaaaaaaaaaaaaaaaaaaabCxbCxbCxcEucEvcEwcExcEycEzcEAcDacDacEBcECcvecvecEDcEEcEEcEEcEEcEFcEGcEHcEGcEGcEGcDocDocEIcEJcEKcELcEMcDucENcDrcDucDucDucDucEOcBucEPcEQcCqcDAcCscDAbBGcDCcDDcEScETcEUcEVcEWbCUaabcEYcEZcDOcFacCDaaaaaaaaacDQcFbcFccFdcDRcFecFfcFgcFhcFiczEczDcFicFjcFkcFlczEczDcyJaaaaaacjIcvPcvQcvRbDrcAIcyMcFncFocFpcEmcFqcFrcFscFtcFucjIaabaabaagaaaaaaaaaaaaaaaaaaaaaaaaaaacyXaabaaaaaaaaaaabaabaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaakSaabcFvcFwcFwcFxcFycFzcFzcFzcFycFzcFzcFzcFycFzcFzcFAcFwcFwcFwcFwcFwcFBcFCcFDcFEcFFcFGcFHcFIcFJceHcwycFKcDacvecvecvecZTcEDcEEcFMcFNcFOcFPbDscFRcFScFTcFUbDtcFWcFXcFYcFZcGabDtcGccGdcDrcGecDucDucDucGfcBucGgcGgcDAcGhcGicGjcGkcGlcGmcGncGocGpcGqcGrbCycGscDLcGtcDOcDOcCDaaaaaaaabcDQcGucFccGvcDRcGwcGxcCIcGycFicGzcGAcFicGBcGCcFlcGzcGDcyJaaaaaacjIcxtcxucxtcGEcxwcqacGFcFocGGcqacqacGHcvWcvWcvWcjIaaaaaaaaaaaaamjamjamjawTaabaabaabaabcGIaabaabaabaabaabalwamjamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaakSaabcFvcFwcFwcFxcFycFzcFzcFzcFycFzcFzcFzcFycFzcFzcFAcFwcFwcFwcFwcFwcFBcFCcFDcFEcFFcFGcFHcFIcFJceHcwycFKcDacvecvecvecZTcEDcEEcFMcFNcFOcFPbDscFRcFScFTcFUbDtcFWcFXcFYcFZcGabDtcGccGdcDrcGecDucDucDucGfcBucGgcGgcDAcGhcGicGjcGkcGlcGmcGncGocGpcGqcGrbCycGscDLcGtcDOcDOcCDaaaaaaaabcDQcGucFccGvcDRcGwcGxcCIcGycFicGzcGAcFicGBcGCcFlcGzcGDcyJaaaaaacjIcxtbTHcxtcGEcxwcqacGFcFocGGcqacqacGHcvWcvWcvWcjIaaaaaaaaaaaaamjamjamjawTaabaabaabaabcGIaabaabaabaabaabalwamjamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaaaaabaaaaabaabcGJaabaaaaabcGJaabaaaaabcGJaabaaaaaaaaaaaaaaaaaaaaaaaabCxbCxbCxcGLcGMcGNcCYcZUceHcGPcEzcEzcEzcEzcGQcEzcFJcEEcGRcGScGTcGUbDGcGWcGXcGYcGZbEocHbcHccHdcHecHfbFlcHhcDqcDrcZicHjcDucDucHkcBucHlcHmcDAcHncCscHocHpbFvbFtbGBbFQbGEbGCbGEbGGaabcCDcCDcCDcCDcCDaabaabaabcHxcHycFccGvcDRcHzcHAcHBcHCcHDcHEcHFcHFcHGcHFcHHcHIcDRcHJaaaaaacjIcxtcxtcxtbDrcHKcHLcHMcHNcHOcCTcCTcCTcHPcHQcHRbGHaaaaaaaaaaaaamjaaaaabaaaaabaaaaaaaaacHTaaaaabaabaaaaaaaaaaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaczakSaabaabcyYcHUczaaaacyYcHUczaaaacyYcHUczaaabaaaaaaaaaaaaaaaaaaaaaaabaabbCxcCYcCYcCYcCYcHWcHXcHYceHcZVceHceHcEDcIaceHcEEcIbcIccIdcIebGIcIgcIhcIicIjbGRcIlcImcIncIocIpbGRcIrcIscItcIucIvcIwcIxcIycIzcIAcGjcIBcICcIDcIEcIFcIGcIHcIIcIJcIKcILcIMbGVcDKcDLcIPcIOcIOcCDaaaaaaaabcDQcIQcFccIRcDRbIxbIxbIxbIxcDRcIVcIWcIXcIYcIZcJacJbcIYbIBaaacDPcjIcjIcjIcjIcjIcJdcqacJecyMcJfcyMcJgcyMcJhcyMcJibGHaaaaaaaaaaaaamjaaacJkcJkcJkcJkcJkaabcJlaabcJkcJkcJkcJkcJkaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJmaaaaaaaaacJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaaaaaacyYcHUczaaabcyYcHUczaaaacyYcHUczaaaaaaaaaaaabaaaaaaaaaaaaaabaabaabaaaaaaaabaabcJncJncJncJncJncJncJncJocJncJncEEcJpcJqcGTcGTbGIbICbGIbJhcJvcDocJwcJxcFZcJycJzcDocJAcDucDrcJBcJCcJDcIxcJEcJFcJGcJHcJIcJJcJKcJHcJLcJMcJNcJOcDAcJPcJQcJRbJCaabcEYcJUcJTcJVcCDaaaaaaaaacDQcDRcJWcJXcDRcJYcJZcKacKbcKccFccKdcKecIYbJEcKgcKhcKibIBaabaaaaaaaaaaaaaaacjIcKkcKlcKmcKncKocKpcKqcKrcKocKpcKscjIaaaaaaaaaaaaamjaabcKtcKucKucKucKucKvcKwcKxcKycKycKycKycKzaabamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJmcJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaakSaabcyYcHUczaaaacyYcHUczaaaacyYcHUczaaabaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaabaabaabcJncKAcKAcKBcKCcKDcKDcKEcKFcKGcKHcIdcIecGTcGTcGTcKIcGTcGTcGTcDocKJbJVcKLbJWbJXcKOcKPcKQcKRbKhbKhbKhcKVcKWcKXcKYcKZcLacHncCscLbcLccLdcLecLfcDAcJPcLgcLhbKMcLjcDLcLkcIOcIOcCDaabaaaaaacHxcLlcLmcLncLocLpcLqcLpcLpcLrcLscLtcLucLubLscLwcLxcLybLtaabaabaaaaaaaaaaaacjIcLAcLBbLucvWbLEcLEbLUcvWbLVcLHbLWcjIaaaaaaaaaaaaamjaabcLJcLJcLJcLJcLJaaacJlaaacLJcLJcLJcLJcLJaabamjaaaaaaaaaaaacJmaaaaaacJmaaaaaacJmcJmcJmcJmcJmcJmcJmaaaaaacJmaaaaaacJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaakSaabcyYcHUczaaaacyYcHUczaaabcyYcHUczaaabaabaabaaaaabaaaaaaaabaabaaaaaaaaaaabaaaaaacJncKAcKAcKBcLKcLKcLKcLLcLLcLMcEEcLNcLOcLPcLQcLRcLScLTcLUcLUcLVcLWcLXcGTcGTcGTcLYcLZcMacMbcMccMdcMebNdcMgcEEcMhcMhcMicHncCscMjcMkcMlcMmcMncDAcMocMpcMqbNgcMscCDcCDcCDcCDcCDaaaaaaaaacDQcMtcMucMvcMwcMxcMycMxcMxcMzcMAcMBcMCcLybNlcMEcKhcIYbNqaabaabaaaaaaaaaaaacjIcMGcxtcxtcvWcMHcxtcxtcvWcMHcxtcxtcjIaaaaaaaaaaaaamjaaaaabaaaaabaabaabaaacJlaaaaabaaaaabaaaaabaaaamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaalwaabcyYcMIczaaaacyYcMIczaaaacyYcMIczaaabakSaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaabcJncMJcMKcLKcLKcLKcMLcMMcMMcMNcMMcMMcMMcMMcMOcMPcMQcMRcMScMScMScMTcMUcMVcMScMScMScMUcMWcMXcMYcMdcMZbNdcMgcNbcNccNdcNecNfcNgcNhcNicLfcNjcNkcNlcNmcNncNobGVcNpcDLcNqcNrcNrcCDaaaaaaaaacDQcNscNtcNucNvcNwcNxcNycIYcNzcNAcNBcNCcNDbJEcNFcNGcNHbNqaaaaaaaaaaaaaaaaaacjIcNJcxtcxtcvWcNKcxtcxtcvWcNKcxtcxtcjIaaaaaaaaaaaaamjaaacJkcJkcJkcJkcJkaabcJlaabcJkcJkcJkcJkcJkaabamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaalwaabcyYcMIczaaaacyYcMIczaaaacyYcMIczaaabakSaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaabcJncMJcMKcLKcLKcLKcMLcMMcMMcMNcMMcMMcMMcMMcMOcMPcMQcMRcMScMScMScMTcMUcMVcMScMScMScMUcMWcMXcMYcMdcMZbNdcMgcNbcNccNdcNecNfcNgcNhcNicLfcNjcNkcNlcNmcNncNobGVcNpcDLcNqcNrcNrcCDaaaaaaaaacDQcNscNtcNucNvcNwcNxcNycIYcNzcNAcNBcNCcNDbJEcNFcNGcNHbNqaaaaaaaaaaaaaaaaaacjIcNJbTXcxtcvWcNKbTXcxtcvWcNKbTXcxtcjIaaaaaaaaaaaaamjaaacJkcJkcJkcJkcJkaabcJlaabcJkcJkcJkcJkcJkaabamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaakSaaaaabaaaaaaaaaaabaabaabaaaaaaaabaabaaaakSaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaabcJncNLcLKcLKcLKcLKcLKcMMcNMcNNcNOcNPcNQcMMcNRcNScNTcJqcGTcGTcNUcNVbNtbNucNYbNvbNvcObcEEcOccMYcMdcOdbNdcMgcEEcOfcMhcOgcOhcDAcNhcNicOicDAcNkcNlcJPcJQcOjbJCcOkcEYcOlcOmcOncCDaaaaaaaaacOobNwbNwbNwbNwcOscOscOtcOubJEbJEbNxbSSbJEcOzcOzbTicOAcOzaaaaaaaaaaaaaaaaaacjIcxtcxtcxtcvWcOBcxtcxtcvWcOBcxtcxtcjIaaaaaaaaaaaaamjaabcKtcKucKucKucKucKvcKwcKxcKycKycKycKycOCaabamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaczaczakSaczaczalwakSakSakSakSaczakSakSaczcODaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJncOEcLLcOFcOGcOHcOIcMMcOJcOKcOLcOMcONcOOcOPcOQcORcJqcGTcOScOTcOUcOVcOWcOXcOYcOZcPacPbcNTcJqcPccPdcMbcPecEEcPfcMhcPgcPhcDAcNhcNicLfcDAcPicNlcJPcPjcPkbKMcPlcDLcPmcNrcNrcCDaaaaaaaaacPnaaaaaaaaaaaaaaaaaacDQcPocIYcIYcPpcPqcPrcOzaacbTpbTqcPuaaaaaaaaaaaaaaaaaacjIcjIcjIcjIcjIcjIcjIcjIcjIcPvcPvcPvcjIaaaaaaaaaaaaamjaabcLJcLJcLJcLJcLJaaacJlaabcLJcLJcLJcLJcLJaaaamjaaaaaaaaaaaacJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcJncJncJncPwbNybNybNycMMcPAcPBcPCcPCcPDcPEcMScPFcPGcPHcPIcPJcPJcPKcPLcPMcPNcPOcPPcPKcPQcPRcPScPTcGTcPUcPVcPWcOfcMhcPXcPYcDAcNhcDAcPZcDAcNkcNlcJPcJQcQabJCcOkcCDcCDcCDcCDcCDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDQcQbcIYcIYcKbcQccQdcOzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPnaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaaaaaaaaaaaaaaaawTaaaaabaaaaabaaaaabaaacQeaaaaabaaaaabaabaabaabamjaaaaaaaaaaaacJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm
index 75a11f33acc..88f1bc3eeda 100644
--- a/code/__DEFINES/mob.dm
+++ b/code/__DEFINES/mob.dm
@@ -54,11 +54,10 @@
#define GETPULSE_HAND 0 //less accurate (hand)
#define GETPULSE_TOOL 1 //more accurate (med scanner, sleeper, etc)
-//Some on_mob_life() procs check for alien races.
-#define IS_DIONA 1
-#define IS_VOX 2
-#define IS_SKRELL 3
-#define IS_UNATHI 4
+//Reagent Metabolization flags, defines the type of reagents that affect this mob
+#define PROCESS_ORG 1 //Only processes reagents with "ORGANIC" or "ORGANIC | SYNTHETIC"
+#define PROCESS_SYN 2 //Only processes reagents with "SYNTHETIC" or "ORGANIC | SYNTHETIC"
+#define PROCESS_DUO 4 //Only processes reagents with "ORGANIC | SYNTHETIC"
#define HUMAN_STRIP_DELAY 40 //takes 40ds = 4s to strip someone.
#define ALIEN_SELECT_AFK_BUFFER 1 // How many minutes that a person can be AFK before not being allowed to be an alien.
@@ -74,4 +73,8 @@
#define REAGENTS_EFFECT_MULTIPLIER REAGENTS_METABOLISM / 0.4
// Factor of how fast mob nutrition decreases
-#define HUNGER_FACTOR 0.1
\ No newline at end of file
+#define HUNGER_FACTOR 0.1
+
+// Reagent type flags, defines the types of mobs this reagent will affect
+#define ORGANIC 1
+#define SYNTHETIC 2
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index affe84a0156..4ea37560a7f 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -37,4 +37,5 @@
#define BE_VAMPIRE 2048
#define BE_MUTINEER 4096
#define BE_BLOB 8192
-#define BE_SHADOWLING 16384
\ No newline at end of file
+#define BE_SHADOWLING 16384
+#define BE_REVENANT 32768
\ No newline at end of file
diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm
index 509f8b3c66c..7d12e16ed7e 100644
--- a/code/_globalvars/configuration.dm
+++ b/code/_globalvars/configuration.dm
@@ -48,7 +48,8 @@ var/list/be_special_flags = list(
"raider" = BE_RAIDER,
"vampire" = BE_VAMPIRE,
"mutineer" = BE_MUTINEER,
- "blob" = BE_BLOB
+ "blob" = BE_BLOB,
+ "Revenant" = BE_REVENANT
)
//Random event stuff, apparently used
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 1585302f64b..73b92eda82d 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -90,6 +90,9 @@ datum/mind
proc/store_memory(new_text)
memory += "[new_text]
"
+ proc/wipe_memory()
+ memory = null
+
proc/show_memory(mob/recipient)
var/output = "[current.real_name]'s Memory
"
output += memory
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index c9ba94a87b4..e0649723e01 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -592,6 +592,14 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/storage/firstaid/adv)
cost = 10
containername = "advaced first aid kits crate"
+
+/datum/supply_packs/medical/firstaibrute
+ name = "Brute Trauma Treatment Kits Crate"
+ contains = list(/obj/item/weapon/storage/firstaid/brute,
+ /obj/item/weapon/storage/firstaid/brute,
+ /obj/item/weapon/storage/firstaid/brute)
+ cost = 10
+ containername = "brute trauma treatment kit"
/datum/supply_packs/medical/firstaidburns
name = "Burns Treatment Kits Crate"
@@ -617,7 +625,6 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 10
containername = "oxygen deprivation kits crate"
-
/datum/supply_packs/medical/virus
name = "Virus Crate"
contains = list(/obj/item/weapon/virusdish/random,
diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm
index ce63b3f82e2..a1acb1814ff 100644
--- a/code/game/machinery/poolcontroller.dm
+++ b/code/game/machinery/poolcontroller.dm
@@ -77,8 +77,8 @@
var/mob/living/carbon/human/drownee = M //Typecast them as human.
if(drownee.stat == DEAD) //Check stat, if they are dead, ignore them.
continue
- if(drownee && drownee.lying && !drownee.internal && !(drownee.species.flags & NO_BREATHE) && !(drownee.species.reagent_tag == IS_SKRELL) && !(NO_BREATH in drownee.mutations))
- //Establish that there is a mob, the mob is lying down, has no internals, species does breathe, is not a skrell, and does not have NO_BREATHE
+ if(drownee && drownee.lying && !drownee.internal && !(drownee.species.flags & NO_BREATHE) && !(drownee.species.name == "Skrell" || drownee.species.name =="Neara") && !(NO_BREATH in drownee.mutations))
+ //Establish that there is a mob, the mob is lying down, has no internals, species does breathe, is not a skrell/neara, and does not have NO_BREATHE
if(drownee.stat != CONSCIOUS) //Mob is in critical.
drownee.adjustOxyLoss(9) //Kill em quickly.
drownee << "You're quickly drowning!" //inform them that they are fucked.
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index 0fd7432660d..4855c0d1f84 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -3,6 +3,7 @@
name = "\proper space"
icon_state = "0"
dynamic_lighting = 0
+ luminosity = 1
temperature = TCMB
thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT
@@ -13,14 +14,14 @@
var/destination_y
/turf/space/New()
+ . = ..()
+
if(!istype(src, /turf/space/transit))
icon_state = "[((x + y) ^ ~(x * y) + z) % 25]"
if(config)
update_starlight() //MC will initialize all the space turfs that get created before config
/turf/space/proc/update_starlight()
- . = ..()
-
if(!config) return
if(!config.starlight)
return
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 7adcbf2560c..114dbf21cc8 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -31,6 +31,8 @@
var/dynamic_lighting = 1
+ flags = 0
+
/turf/New()
..()
for(var/atom/movable/AM as mob|obj in src)
@@ -320,8 +322,6 @@
M.take_damage(100, "brute")
/turf/proc/Bless()
- if(flags & NOJAUNT)
- return
flags |= NOJAUNT
/////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/admin/verbs/freeze.dm b/code/modules/admin/verbs/freeze.dm
index 502060933ee..128ef87060b 100644
--- a/code/modules/admin/verbs/freeze.dm
+++ b/code/modules/admin/verbs/freeze.dm
@@ -5,88 +5,83 @@
//////Allows admin's to right click on any mob/mech and freeze them in place.///
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
-/client/proc/freeze(mob/living/M as mob in mob_list)
+var/global/list/frozen_mob_list = list()
+/client/proc/freeze(var/mob/living/M as mob in mob_list)
set category = "Special Verbs"
set name = "Freeze"
if(!holder)
- src << "Only administrators may use this command."
+ src << "Error: Freeze: Only administrators may use this command."
return
- if(!mob)
- return
- if(!istype(M))
- alert("Cannot freeze a ghost")
- return
- if(usr)
- if (usr.client)
- if(usr.client.holder)
- if (istype(M, /mob/living/carbon/slime))
- if(!M.paralysis)
- M.adjustToxLoss(2147483647)
- M.AdjustParalysis(2147483647)
- var/adminomaly = new/obj/effect/overlay/adminoverlay
- spawn(50)
- M.overlays += adminomaly
- M << "You have been frozen by [key]"
- message_admins("\blue [key_name_admin(usr)] froze [key_name(M)]")
- log_admin("[key_name(usr)] froze [key_name(M)]")
- else if (M.paralysis)
- M.AdjustParalysis(-2147483647)
- M.blinded = 0
- M.lying = 0
- M.stat = 0
- M << " You have been unfrozen by [key]"
- message_admins("\blue [key_name_admin(usr)] unfroze [key_name(M)]")
- log_admin("[key_name(usr)] unfroze [key_name(M)]")
- M.revive()
- else if (istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/FM = M
+ if(!istype(M)) return
+ if(!check_rights(R_ADMIN)) return
+ if(M in frozen_mob_list)
+ M.admin_unFreeze(src)
+ else
+ M.admin_Freeze(src)
- if(!FM.paralysis)
- FM.anchored = 1
- FM.frozen = 1
- FM.AdjustParalysis(2147483647)
- var/adminomaly = new/obj/effect/overlay/adminoverlay
- spawn(50)
- FM.overlays += adminomaly
- FM << "You have been frozen by [key]"
- message_admins("\blue [key_name_admin(usr)] froze [key_name(FM)]")
- log_admin("[key_name(usr)] froze [key_name(FM)]")
- else if (M.paralysis)
- FM.anchored = 0
- FM.frozen = 0
- FM.AdjustParalysis(-2147483647)
- FM.blinded = 0
- FM.lying = 0
- FM.stat = 0
+///mob freeze procs
- FM << " You have been unfrozen by [key]"
- message_admins("\blue [key_name_admin(usr)] unfroze [key_name(FM)]")
- log_admin("[key_name(usr)] unfroze [key_name(FM)]")
+/mob/living/var/frozen = 0 //used for preventing attacks on admin-frozen mobs
+/mob/living/var/admin_prev_sleeping = 0 //used for keeping track of previous sleeping value with admin freeze
- else
+/mob/living/proc/admin_Freeze(var/client/admin)
+ if(istype(admin))
+ src << "You have been frozen by [admin.key]"
+ message_admins("\blue [key_name_admin(admin)] froze [key_name(src)]")
+ log_admin("[key_name(admin)] froze [key_name(src)]")
- if(!M.paralysis)
- M.anchored = 1
- M.AdjustParalysis(2147483647)
- var/adminomaly = new/obj/effect/overlay/adminoverlay
- spawn(50)
- M.overlays += adminomaly
- M << "You have been frozen by [key]"
- message_admins("\blue [key_name_admin(usr)] froze [key_name(M)]")
- log_admin("[key_name(usr)] froze [key_name(M)]")
- else if (M.paralysis)
- M.anchored = 0
- M.AdjustParalysis(-2147483647)
- M.blinded = 0
- M.lying = 0
- M.stat = 0
+ var/obj/effect/overlay/adminoverlay/AO = new
+ src.overlays += AO
- M << " You have been unfrozen by [key]"
- message_admins("\blue [key_name_admin(usr)] unfroze [key_name(M)]")
- log_admin("[key_name(usr)] unfroze [key_name(M)]")
+ anchored = 1
+ frozen = 1
+ admin_prev_sleeping = sleeping
+ sleeping += 20000
+ if(!(src in frozen_mob_list))
+ frozen_mob_list += src
+
+/mob/living/proc/admin_unFreeze(var/client/admin)
+ if(istype(admin))
+ src << "You have been unfrozen by [key]"
+ message_admins("\blue [key_name_admin(admin)] unfroze [key_name(src)]")
+ log_admin("[key_name(admin)] unfroze [key_name(src)]")
+
+ update_icons()
+
+ anchored = 0
+ frozen = 0
+ sleeping = admin_prev_sleeping
+ admin_prev_sleeping = null
+ if(src in frozen_mob_list)
+ frozen_mob_list -= src
-/client/proc/freezemecha(obj/mecha/O as obj in mechas_list)
+/mob/living/carbon/slime/admin_Freeze(admin)
+ ..(admin)
+ adjustToxLoss(1010101010) //arbitrary large value
+
+/mob/living/carbon/slime/admin_unFreeze(admin)
+ ..(admin)
+ adjustToxLoss(-1010101010)
+ stat = 0
+ revive()
+
+
+/mob/living/simple_animal/var/admin_prev_health = null
+
+/mob/living/simple_animal/admin_Freeze(admin)
+ ..(admin)
+ admin_prev_health = health
+ health = 0
+
+/mob/living/simple_animal/admin_unFreeze(admin)
+ ..(admin)
+ revive()
+ overlays.Cut()
+
+//////////////////////////Freeze Mech
+
+/client/proc/freezemecha(var/obj/mecha/O as obj in mechas_list)
set category = "Special Verbs"
set name = "Freeze Mech"
if(!holder)
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 7e825d76539..8ddeaf1f513 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -23,6 +23,21 @@
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
+/obj/item/clothing/glasses/meson/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if (user.stat || user.restrained() || !ishuman(user))
+ return
+ var/mob/living/carbon/human/H = user
+ if(istype(O, /obj/item/clothing/glasses/regular))
+ H.unEquip(src)
+ H.unEquip(O)
+ var/obj/item/clothing/glasses/meson/prescription/P = new /obj/item/clothing/glasses/meson/prescription(get_turf(H))
+ H << "You fit \the [src.name] with lenses from \the [O.name]."
+ H.put_in_hands(P)
+ qdel(O)
+ qdel(src)
+ return
+ ..()
+
/obj/item/clothing/glasses/meson/night
name = "Night Vision Optical Meson Scanner"
desc = "An Optical Meson Scanner fitted with an amplified visible light spectrum overlay, providing greater visual clarity in darkness."
@@ -31,6 +46,12 @@
darkness_view = 8
see_darkness = 0
+/obj/item/clothing/glasses/meson/night/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if(istype(O, /obj/item/clothing/glasses/regular))
+ user << "\The [src.name] is too complex for you to fit with prescription lenses."
+ return
+ ..()
+
/obj/item/clothing/glasses/meson/prescription
name = "prescription mesons"
desc = "Optical Meson Scanner with prescription lenses."
@@ -40,6 +61,24 @@
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
+/obj/item/clothing/glasses/meson/prescription/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if (user.stat || user.restrained() || !ishuman(user))
+ return
+ var/mob/living/carbon/human/H = user
+ if(istype(O, /obj/item/clothing/glasses/regular))
+ H <<"You can't possibly imagine how adding more lenses would improve \the [src.name]."
+ return
+ if(istype(O, /obj/item/weapon/screwdriver))
+ H.unEquip(src)
+ var/obj/item/clothing/glasses/meson/M = new /obj/item/clothing/glasses/meson(get_turf(H))
+ var/obj/item/clothing/glasses/regular/R = new /obj/item/clothing/glasses/regular(get_turf(H))
+ H << "You salvage the prescription lenses from \the [src.name]."
+ H.put_in_hands(M)
+ H.put_in_hands(R)
+ qdel(src)
+ return
+ ..()
+
/obj/item/clothing/glasses/meson/cyber
name = "Eye Replacement Implant"
desc = "An implanted replacement for a left eye with meson vision capabilities."
@@ -145,6 +184,21 @@
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
+/obj/item/clothing/glasses/sunglasses/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if (user.stat || user.restrained() || !ishuman(user))
+ return
+ var/mob/living/carbon/human/H = user
+ if(istype(O, /obj/item/clothing/glasses/regular))
+ H.unEquip(src)
+ H.unEquip(O)
+ var/obj/item/clothing/glasses/sunglasses/prescription/P = new /obj/item/clothing/glasses/sunglasses/prescription(get_turf(H))
+ H << "You fit \the [src.name] with lenses from \the [O.name]."
+ H.put_in_hands(P)
+ qdel(O)
+ qdel(src)
+ return
+ ..()
+
/obj/item/clothing/glasses/virussunglasses
desc = "Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks many flashes."
name = "sunglasses"
@@ -233,6 +287,12 @@
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
+/obj/item/clothing/glasses/sunglasses/blindfold/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if(istype(O, /obj/item/clothing/glasses/regular))
+ user << "You doubt you can make a blindfold actually IMPROVE vision."
+ return
+ ..()
+
/obj/item/clothing/glasses/sunglasses/prescription
name = "prescription sunglasses"
prescription = 1
@@ -241,6 +301,24 @@
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
+/obj/item/clothing/glasses/sunglasses/prescription/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if (user.stat || user.restrained() || !ishuman(user))
+ return
+ var/mob/living/carbon/human/H = user
+ if(istype(O, /obj/item/clothing/glasses/regular))
+ H <<"You can't possibly imagine how adding more lenses would improve \the [src.name]."
+ return
+ if(istype(O, /obj/item/weapon/screwdriver))
+ H.unEquip(src)
+ var/obj/item/clothing/glasses/sunglasses/S = new /obj/item/clothing/glasses/sunglasses(get_turf(H))
+ var/obj/item/clothing/glasses/regular/R = new /obj/item/clothing/glasses/regular(get_turf(H))
+ H << "You salvage the prescription lenses from \the [src.name]."
+ H.put_in_hands(S)
+ H.put_in_hands(R)
+ qdel(src)
+ return
+ ..()
+
/obj/item/clothing/glasses/sunglasses/big
desc = "Strangely ancient technology used to help provide rudimentary eye cover. Larger than average enhanced shielding blocks many flashes."
icon_state = "bigsunglasses"
@@ -265,6 +343,47 @@
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
+/obj/item/clothing/glasses/sunglasses/sechud/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if (user.stat || user.restrained() || !ishuman(user))
+ return
+ var/mob/living/carbon/human/H = user
+ if(istype(O, /obj/item/clothing/glasses/regular))
+ H.unEquip(src)
+ H.unEquip(O)
+ var/obj/item/clothing/glasses/sunglasses/sechud/prescription/P = new /obj/item/clothing/glasses/sunglasses/sechud/prescription(get_turf(H))
+ H << "You fit \the [src.name] with lenses from \the [O.name]."
+ H.put_in_hands(P)
+ qdel(O)
+ qdel(src)
+ return
+ ..()
+
+/obj/item/clothing/glasses/sunglasses/sechud/prescription
+ name = "prescription HUDSunglasses"
+ prescription = 1
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/eyes.dmi'
+ )
+
+/obj/item/clothing/glasses/sunglasses/sechud/prescription/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if (user.stat || user.restrained() || !ishuman(user))
+ return
+ var/mob/living/carbon/human/H = user
+ if(istype(O, /obj/item/clothing/glasses/regular))
+ H <<"You can't possibly imagine how adding more lenses would improve \the [src.name]."
+ return
+ if(istype(O, /obj/item/weapon/screwdriver))
+ H.unEquip(src)
+ var/obj/item/clothing/glasses/sunglasses/sechud/S = new /obj/item/clothing/glasses/sunglasses/sechud(get_turf(H))
+ var/obj/item/clothing/glasses/regular/R = new /obj/item/clothing/glasses/regular(get_turf(H))
+ H << "You salvage the prescription lenses from \the [src.name]."
+ H.put_in_hands(S)
+ H.put_in_hands(R)
+ qdel(src)
+ return
+ ..()
+
/obj/item/clothing/glasses/thermal
name = "Optical Thermal Scanner"
desc = "Thermals in the shape of glasses."
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 62bd113f2d7..e2bae061cbe 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -122,6 +122,13 @@
icon_state = "deus_blueshield"
item_state = "deus_blueshield"
+/obj/item/clothing/suit/jacket/fluff/kidosvest //Anxipal: Kido Qasteth
+ name = "Kido's Vest"
+ desc = "A rugged leather vest with a tag labelled \"Men of Mayhem.\""
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "kidosvest"
+ item_state = "kidosvest"
+
//////////// Uniforms ////////////
/obj/item/clothing/under/psysuit/fluff/isaca_sirius_1 // Xilia: Isaca Sirius
name = "Isaca's suit"
diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm
index 1908bfde173..1b991838684 100644
--- a/code/modules/events/event_container.dm
+++ b/code/modules/events/event_container.dm
@@ -134,7 +134,8 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)),
// NON-BAY EVENTS
- new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Cargo Bonus", /datum/event/cargo_bonus, 100)
+ new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Cargo Bonus", /datum/event/cargo_bonus, 100),
+ new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Revenant", /datum/event/revenant, 50)
)
/datum/event_container/moderate
diff --git a/code/modules/events/event_dynamic.dm b/code/modules/events/event_dynamic.dm
index c73b85a4857..92644e3eb1f 100644
--- a/code/modules/events/event_dynamic.dm
+++ b/code/modules/events/event_dynamic.dm
@@ -50,6 +50,7 @@ var/global/list/possibleEvents = list()
//possibleEvents[/datum/event/mundane_news] = 300
possibleEvents[/datum/event/cargo_bonus] = 150
+ possibleEvents[/datum/event/revenant] = 75
possibleEvents[/datum/event/pda_spam] = max(min(25, player_list.len) * 4, 200)
possibleEvents[/datum/event/money_lotto] = max(min(5, player_list.len), 50)
diff --git a/code/modules/lighting/lighting_process.dm b/code/modules/lighting/lighting_process.dm
index 3159cfcd852..b8f777473f7 100644
--- a/code/modules/lighting/lighting_process.dm
+++ b/code/modules/lighting/lighting_process.dm
@@ -1,4 +1,3 @@
-
/datum/controller/process/lighting/setup()
name = "lighting"
schedule_interval = LIGHTING_INTERVAL
@@ -6,7 +5,10 @@
create_lighting_overlays()
/datum/controller/process/lighting/doWork()
- for(var/datum/light_source/L in lighting_update_lights)
+ var/list/lighting_update_lights_old = lighting_update_lights //We use a different list so any additions to the update lists during a delay from scheck() don't cause things to be cut from the list without being updated.
+ lighting_update_lights = list()
+
+ for(var/datum/light_source/L in lighting_update_lights_old)
if(L.needs_update)
if(L.destroyed || L.check() || L.force_update)
L.remove_lum()
@@ -16,13 +18,12 @@
scheck()
- lighting_update_lights.Cut()
+ var/list/lighting_update_overlays_old = lighting_update_overlays //Same as above.
+ lighting_update_overlays = list()
- for(var/atom/movable/lighting_overlay/O in lighting_update_overlays)
+ for(var/atom/movable/lighting_overlay/O in lighting_update_overlays_old)
if(O.needs_update)
O.update_overlay()
O.needs_update = 0
scheck()
-
- lighting_update_overlays.Cut()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index f8aa4a64ac9..39e0f052f2b 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -80,7 +80,5 @@
var/lastFart = 0 // Toxic fart cooldown.
- var/frozen = 0 //used for preventing attacks on admin-frozen people
-
var/fire_dmi = 'icons/mob/OnFire.dmi'
var/fire_sprite = "Standing"
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index ab942f7f6de..9a8dd644d5a 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -744,11 +744,8 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
proc/handle_chemicals_in_body()
- if(reagents) //Synths don't process reagents. // fuck you they do now - Iamgoofball
- var/alien = 0
- if(species && species.reagent_tag)
- alien = species.reagent_tag
- reagents.metabolize(src,alien)
+ if(reagents)
+ reagents.metabolize(src)
if(status_flags & GODMODE) return 0 //godmode
diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/apollo.dm
index 409944cd048..3acc2e08a90 100644
--- a/code/modules/mob/living/carbon/human/species/apollo.dm
+++ b/code/modules/mob/living/carbon/human/species/apollo.dm
@@ -37,6 +37,7 @@
flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | NO_BREATHE | HAS_SKIN_COLOR | NO_SCAN | NO_SCAN | HIVEMIND
dietflags = DIET_HERB //bees feed off nectar, so bee people feed off plants too
+ reagent_tag = PROCESS_ORG
base_color = "#704300"
flesh_color = "#704300"
blood_color = "#FFFF99"
@@ -90,6 +91,7 @@
flags = IS_WHITELISTED | NO_BREATHE | NO_BLOOD | NO_PAIN | HAS_LIPS | NO_SCAN
dietflags = DIET_OMNI //still human at their core, so they maintain their eating habits and diet
+ reagent_tag = PROCESS_ORG
has_organ = list(
"heart" = /obj/item/organ/heart,
"crystalized brain" = /obj/item/organ/brain/crystal,
diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm
index d067870f381..cfc0eb08207 100644
--- a/code/modules/mob/living/carbon/human/species/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/golem.dm
@@ -7,6 +7,7 @@
default_language = "Galactic Common"
flags = NO_BREATHE | NO_PAIN | NO_BLOOD | NO_SCAN
dietflags = DIET_OMNI //golems can eat anything because they are magic or something
+ reagent_tag = PROCESS_ORG
blood_color = "#515573"
flesh_color = "#137E8F"
diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm
index 5a2446f6e2f..7c3dbd46108 100644
--- a/code/modules/mob/living/carbon/human/species/monkey.dm
+++ b/code/modules/mob/living/carbon/human/species/monkey.dm
@@ -19,6 +19,7 @@
tail = "chimptail"
bodyflags = FEET_PADDED | HAS_TAIL
+ reagent_tag = PROCESS_ORG
//unarmed_types = list(/datum/unarmed_attack/bite, /datum/unarmed_attack/claws)
//inherent_verbs = list(/mob/living/proc/ventcrawl)
@@ -60,6 +61,7 @@ datum/species/monkey/get_random_name(var/gender)
flesh_color = "#AFA59E"
base_color = "#333333"
tail = "farwatail"
+ reagent_tag = PROCESS_ORG
/datum/species/monkey/vulpkanin
@@ -73,6 +75,7 @@ datum/species/monkey/get_random_name(var/gender)
flesh_color = "#966464"
base_color = "#BE8264"
tail = "wolpintail"
+ reagent_tag = PROCESS_ORG
/datum/species/monkey/skrell
@@ -85,7 +88,7 @@ datum/species/monkey/get_random_name(var/gender)
default_language = "Neara"
flesh_color = "#8CD7A3"
blood_color = "#1D2CBF"
- reagent_tag = IS_SKRELL
+ reagent_tag = PROCESS_ORG
tail = null
bodyflags = FEET_PADDED
@@ -102,6 +105,6 @@ datum/species/monkey/get_random_name(var/gender)
default_language = "Stok"
flesh_color = "#34AF10"
base_color = "#066000"
- reagent_tag = IS_UNATHI
+ reagent_tag = PROCESS_ORG
bodyflags = FEET_CLAWS | HAS_TAIL
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index 851b970e8fe..890a5c3102b 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -7,6 +7,7 @@
flags = IS_WHITELISTED | NO_BLOOD
dietflags = DIET_OMNI
+ reagent_tag = PROCESS_ORG
//default_mutations=list(SKELETON) // This screws things up
diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm
index 8b36b05b18e..cd0b03fc745 100644
--- a/code/modules/mob/living/carbon/human/species/shadow.dm
+++ b/code/modules/mob/living/carbon/human/species/shadow.dm
@@ -19,6 +19,7 @@
flags = NO_BLOOD | NO_BREATHE | NO_SCAN
bodyflags = FEET_NOSLIP
dietflags = DIET_OMNI //the mutation process allowed you to now digest all foods regardless of initial race
+ reagent_tag = PROCESS_ORG
/datum/species/shadow/handle_death(var/mob/living/carbon/human/H)
H.dust()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
index cfe4d3eea09..cf8f0204d00 100644
--- a/code/modules/mob/living/carbon/human/species/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -15,6 +15,8 @@
interests, rampant cyber and bio-augmentation and secretive factions make life on most human \
worlds tumultous at best."
+ reagent_tag = PROCESS_ORG
+
/datum/species/unathi
name = "Unathi"
icobase = 'icons/mob/human_races/r_lizard.dmi'
@@ -48,7 +50,7 @@
flesh_color = "#34AF10"
- reagent_tag = IS_UNATHI
+ reagent_tag = PROCESS_ORG
base_color = "#066000"
/datum/species/unathi/handle_death(var/mob/living/carbon/human/H)
@@ -87,6 +89,7 @@
bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
dietflags = DIET_OMNI
+ reagent_tag = PROCESS_ORG
flesh_color = "#AFA59E"
base_color = "#333333"
@@ -116,6 +119,7 @@
bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
dietflags = DIET_OMNI
+ reagent_tag = PROCESS_ORG
flesh_color = "#966464"
base_color = "#BE8264"
@@ -145,7 +149,7 @@
flesh_color = "#8CD7A3"
blood_color = "#1D2CBF"
- reagent_tag = IS_SKRELL
+ reagent_tag = PROCESS_ORG
/datum/species/vox
name = "Vox"
@@ -185,7 +189,7 @@
blood_color = "#2299FC"
flesh_color = "#808D11"
- reagent_tag = IS_VOX
+ reagent_tag = PROCESS_ORG
makeName(var/gender,var/mob/living/carbon/human/H=null)
var/sounds = rand(2,8)
@@ -239,7 +243,7 @@
blood_color = "#2299FC"
flesh_color = "#808D11"
- reagent_tag = IS_VOX
+ reagent_tag = PROCESS_ORG
tail = "armalis_tail"
icon_template = 'icons/mob/human_races/r_armalis.dmi'
@@ -270,7 +274,7 @@
dietflags = DIET_HERB
blood_color = "#FB9800"
-
+ reagent_tag = PROCESS_ORG
/datum/species/slime
name = "Slime People"
@@ -286,6 +290,7 @@
bloodflags = BLOOD_SLIME
dietflags = DIET_CARN
+ reagent_tag = PROCESS_ORG
//ventcrawler = 1 //ventcrawling commented out
has_organ = list(
@@ -310,6 +315,7 @@
flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
dietflags = DIET_HERB
+ reagent_tag = PROCESS_ORG
blood_color = "#A200FF"
/datum/species/grey/handle_dna(var/mob/living/carbon/C, var/remove)
@@ -363,7 +369,7 @@
blood_color = "#004400"
flesh_color = "#907E4A"
- reagent_tag = IS_DIONA
+ reagent_tag = PROCESS_ORG
has_organ = list(
"nutrient channel" = /obj/item/organ/diona/nutrients,
@@ -445,6 +451,7 @@
dietflags = 0 //IPCs can't eat, so no diet
blood_color = "#1F181F"
flesh_color = "#AAAAAA"
+ reagent_tag = PROCESS_SYN
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
H.emote("deathgasp")
diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm
index 948040fb1a6..25b6cddc1c7 100644
--- a/code/modules/mob/living/silicon/robot/component.dm
+++ b/code/modules/mob/living/silicon/robot/component.dm
@@ -202,9 +202,15 @@
user.visible_message(" [user] has analyzed [M]'s components."," You have analyzed [M]'s components.")
var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss()
var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : M.getBruteLoss()
+ var/TX = M.getToxLoss() > 50 ? "[M.getToxLoss()]" : M.getToxLoss()
+
user.show_message("\blue Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health - M.halloss]% functional"]")
- user.show_message("\t Key: Electronics/Brute", 1)
- user.show_message("\t Damage Specifics: [BU] - [BR]")
+ if (ishuman(M) && (M:species.flags & IS_SYNTHETIC))
+ user.show_message("\t Key: Electronics/Brute/Residue", 1)
+ user.show_message("\t Damage Specifics: [BU] - [BR] - [TX]")
+ else
+ user.show_message("\t Key: Electronics/Brute", 1)
+ user.show_message("\t Damage Specifics: [BU] - [BR]")
if(M.tod && M.stat == DEAD)
user.show_message("\blue Time of Disable: [M.tod]")
@@ -238,6 +244,12 @@
(org.burn_dam > 0) ? "[org.burn_dam]" :0),1)
else
user.show_message("\blue \t Components are OK.",1)
+ if (M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && M:brain_op_stage == 4.0)
+ user.show_message("\red Subject posibrain is unresponsive. System shutdown imminent.")
+ else if (M.getBrainLoss() >= 60)
+ user.show_message("\red Severe posibrain damage detected. Heavy corrosion present.")
+ else if (M.getBrainLoss() >= 10)
+ user.show_message("\red Significant posibrain damage detected. Moderate corrosion present.")
user.show_message("\blue Operating Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1)
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index b2e0408b7e4..8d3a43e9ab4 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -363,6 +363,11 @@
desc = "That's not red paint. That's real corgi blood."
valid = 1
+ if(/obj/item/clothing/mask/fakemoustache)
+ name = "Definitely Not [real_name]"
+ desc = "That's Definitely Not [real_name]"
+ valid = 1
+
if(valid)
if(user && !user.drop_item())
user << "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!"
diff --git a/code/modules/mob/living/simple_animal/revenant/revenant.dm b/code/modules/mob/living/simple_animal/revenant/revenant.dm
new file mode 100644
index 00000000000..44290d9c615
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/revenant/revenant.dm
@@ -0,0 +1,315 @@
+//Revenants: based off of wraiths from Goon
+//"Ghosts" that are invisible and move like ghosts, cannot take damage while invsible
+//Don't hear deadchat and are NOT normal ghosts
+//Admin-spawn or random event
+
+/mob/living/simple_animal/revenant
+ name = "revenant"
+ desc = "A malevolent spirit."
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "revenant_idle"
+ incorporeal_move = 3
+ invisibility = INVISIBILITY_OBSERVER
+ health = 25
+ maxHealth = 25
+ see_in_dark = 255
+ see_invisible = SEE_INVISIBLE_OBSERVER
+ universal_understand = 1
+ response_help = "passes through"
+ response_disarm = "swings at"
+ response_harm = "punches"
+ minbodytemp = 0
+ maxbodytemp = INFINITY
+ harm_intent_damage = 5
+ speak_emote = list("hisses", "spits", "growls")
+ friendly = "touches"
+ status_flags = 0
+ wander = 0
+ density = 0
+
+ var/essence = 25 //The resource of revenants. Max health is equal to twice this amount
+ var/essence_regen_cap = 25 //The regeneration cap of essence (go figure); regenerates every Life() tick up to this amount.
+ var/essence_regen = 1 //If the revenant regenerates essence or not; 1 for yes, 0 for no
+ var/essence_min = 1 //The minimum amount of essence a revenant can have; by default, it never drops below one
+ var/strikes = 0 //How many times a revenant can die before dying for good
+ var/revealed = 0 //If the revenant can take damage from normal sources.
+ var/inhibited = 0 //If the revenant's abilities are blocked by a chaplain's power.
+
+/mob/living/simple_animal/revenant/Life()
+ ..()
+ if(essence < essence_min)
+ essence = essence_min
+ if(strikes > 0)
+ strikes--
+ src << "Your essence has dropped below critical levels. You barely manage to save yourself - [strikes ? "you can't keep this up!" : "next time, it's death."]"
+ else if(strikes <= 0)
+ death()
+ maxHealth = essence * 2
+ if(!revealed)
+ health = maxHealth //Heals to full when not revealed
+ if(essence_regen && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate
+ essence++
+
+/mob/living/simple_animal/revenant/ex_act(severity)
+ return 1 //Immune to the effects of explosions.
+
+/mob/living/simple_animal/revenant/ClickOn(var/atom/A, var/params) //Copypaste from ghost code - revenants can't interact with the world directly.
+ if(client.buildmode)
+ build_click(src, client.buildmode, params, A)
+ return
+
+ var/list/modifiers = params2list(params)
+ if(modifiers["middle"])
+ MiddleClickOn(A)
+ return
+ if(modifiers["shift"])
+ ShiftClickOn(A)
+ return
+ if(modifiers["alt"])
+ AltClickOn(A)
+ return
+ if(modifiers["ctrl"])
+ CtrlClickOn(A)
+ return
+
+ if(world.time <= next_move)
+ return
+ A.attack_ghost(src)
+
+/mob/living/simple_animal/revenant/say(message)
+ return 0 //Revenants cannot speak out loud.
+
+/mob/living/simple_animal/revenant/Stat()
+ ..()
+ if(statpanel("Status"))
+ stat(null, "Current essence: [essence]E")
+
+/mob/living/simple_animal/revenant/New()
+ ..()
+ spawn(5)
+ if(src.mind)
+ src.mind.wipe_memory()
+ src << 'sound/effects/ghost.ogg'
+ src << "
"
+ src << "You are a revenant."
+ src << "Your formerly mundane spirit has been infused with alien energies and empowered into a revenant."
+ src << "You are not dead, not alive, but somewhere in between. You are capable of limited interaction with both worlds."
+ src << "You are invincible and invisible to everyone but other ghosts. Some abilities may change this."
+ src << "To function, you are to drain the life essence from humans. This essence is a resource and will power all of your abilities."
+ src << "You do not remember anything of your past lives, nor will you remember anything about this one after your death."
+ src << "Be sure to read the wiki page at http://nanotrasen.se/wiki/index.php/Revenant to learn more."
+ var/datum/objective/revenant/objective = new
+ objective.owner = src
+ src.mind.objectives += objective
+ src << "Objective #1: [objective.explanation_text]"
+ var/datum/objective/revenantFluff/objective2 = new
+ objective2.owner = src
+ src.mind.objectives += objective2
+ src << "Objective #2: [objective2.explanation_text]"
+ ticker.mode.traitors |= src.mind //Necessary for announcing
+ if(!src.giveSpells())
+ message_admins("Revenant was created but has no mind. Trying again in five seconds.")
+ spawn(50)
+ if(!src.giveSpells())
+ message_admins("Revenant still has no mind. Deleting...")
+ qdel(src)
+
+/mob/living/simple_animal/revenant/proc/giveSpells()
+ if(src.mind)
+ src.mind.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/revenant_harvest
+ src.mind.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/revenant_transmit
+ src.mind.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/revenant_light
+ src.mind.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/revenantDefile
+ return 1
+ return 0
+
+/mob/living/simple_animal/revenant/death()
+ if(strikes)
+ return 0 //Impossible to die with strikes still active
+ ..(1)
+ src << "NO! No... it's too late, you can feel yourself fading..."
+ notransform = 1
+ revealed = 1
+ invisibility = 0
+ playsound(src, 'sound/effects/screech.ogg', 100, 1)
+ visible_message("[src] lets out a waning screech as violet mist swirls around its dissolving body!")
+ icon_state = "revenant_draining"
+ for(var/i = alpha, i > 0, i -= 10)
+ sleep(0.1)
+ alpha = i
+ visible_message("[src]'s body breaks apart into blue dust.")
+ new /obj/item/weapon/ectoplasm/revenant(get_turf(src))
+ ghostize()
+ qdel(src)
+ return
+
+
+/mob/living/simple_animal/revenant/attackby(obj/item/W, mob/living/user, params)
+ ..()
+ if(istype(W, /obj/item/weapon/nullrod))
+ visible_message("[src] violently flinches!", \
+ "The null rod invokes agony in you! You feel your essence draining away!")
+ essence -= 25 //hella effective
+ inhibited = 1
+ spawn(30)
+ inhibited = 0
+
+
+
+/mob/living/simple_animal/revenant/proc/castcheck(var/essence_cost)
+ var/mob/living/simple_animal/revenant/user = usr
+ if(!istype(user) || !user)
+ return
+ var/turf/T = get_turf(usr)
+ if(istype(T, /turf/simulated/wall))
+ user << "You cannot use abilities from inside of a wall."
+ return 0
+ if(!user.change_essence_amount(essence_cost, 1))
+ user << "You lack the essence to use that ability."
+ return 0
+ if(user.inhibited)
+ user << "Your powers have been suppressed by holy energies!"
+ return 0
+ return 1
+
+
+
+/mob/living/simple_animal/revenant/proc/change_essence_amount(var/essence_amt, var/silent = 0, var/source = null)
+ var/mob/living/simple_animal/revenant/user = usr
+ if(!istype(usr) || !usr)
+ return
+ if(user.essence + essence_amt <= 0)
+ return
+ user.essence += essence_amt
+ user.essence = Clamp(user.essence, 0, INFINITY)
+ if(!silent)
+ if(essence_amt > 0)
+ user << "Gained [essence_amt]E from [source]."
+ else
+ user << "Lost [essence_amt]E from [source]."
+ return 1
+
+
+
+/mob/living/simple_animal/revenant/proc/reveal(var/time, var/stun)
+ var/mob/living/simple_animal/revenant/R = usr
+ if(!istype(usr) || !usr)
+ return
+ R.revealed = 1
+ R.invisibility = 0
+ if(stun)
+ R.notransform = 1
+ R << "You have been revealed [stun ? "and cannot move" : ""]."
+ spawn(time)
+ R.revealed = 0
+ R.invisibility = INVISIBILITY_OBSERVER
+ if(stun)
+ R.notransform = 0
+ R << "You are once more concealed [stun ? "and can move again" : ""]."
+
+/datum/objective/revenant
+ var/targetAmount = 100
+
+/datum/objective/revenant/New()
+ targetAmount = rand(100,200)
+ explanation_text = "Absorb [targetAmount] points of essence."
+ ..()
+
+/datum/objective/revenant/check_completion()
+ if(!istype(owner.current, /mob/living/simple_animal/revenant) || !owner.current)
+ return 0
+ var/mob/living/simple_animal/revenant/R = owner.current
+ if(!R || R.stat == DEAD)
+ return 0
+ var/essenceAccumulated = R.essence
+ if(essenceAccumulated < targetAmount)
+ return 0
+ return 1
+
+/datum/objective/revenantFluff
+
+/datum/objective/revenantFluff/New()
+ var/list/explanationTexts = list("Attempt to make your presence unknown to the crew.", \
+ "Collaborate with existing antagonists aboard the station to gain essence.", \
+ "Remain nonlethal and only absorb bodies that have already died.", \
+ "Use your environments to eliminate isolated people.", \
+ "If there is a chaplain aboard the station, ensure they are killed.", \
+ "Hinder the crew without killing them.")
+ explanation_text = pick(explanationTexts)
+ ..()
+
+/datum/objective/revenantFluff/check_completion()
+ return 1
+
+
+/obj/item/weapon/ectoplasm/revenant
+ name = "glimmering residue"
+ desc = "A pile of fine blue dust. Small tendrils of violet mist swirl around it."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "revenantEctoplasm"
+ w_class = 2
+ var/reforming = 0
+ var/reformed = 0
+
+/obj/item/weapon/ectoplasm/revenant/New()
+ ..()
+ reforming = 1
+ spawn(1800) //3 minutes
+ if(src && reforming)
+ return reform()
+ if(src && !reforming)
+ visible_message("[src] settles down and seems lifeless.")
+ return
+
+/obj/item/weapon/ectoplasm/revenant/attack_hand(mob/user)
+ if(reformed)
+ user << "[src] keeps slipping out of your hands, you can't get a hold on it!"
+ return
+ ..()
+
+/obj/item/weapon/ectoplasm/revenant/attack_self(mob/user)
+ if(!reforming)
+ return ..()
+ user.visible_message("[user] scatters [src] in all directions.", \
+ "You scatter [src] across the area. The particles slowly fade away.")
+ user.drop_item()
+ qdel(src)
+
+/obj/item/weapon/ectoplasm/revenant/throw_impact(atom/hit_atom)
+ ..()
+ visible_message("[src] breaks into particles upon impact, which fade away to nothingness.")
+ qdel(src)
+
+/obj/item/weapon/ectoplasm/revenant/examine(mob/user)
+ ..()
+ if(reforming)
+ user << "It is shifting and distorted. It would be wise to destroy this."
+ else if(!reforming)
+ user << "It seems inert."
+
+/obj/item/weapon/ectoplasm/revenant/proc/reform()
+ if(!reforming || !src)
+ return
+ message_admins("Revenant ectoplasm was left undestroyed for 3 minutes and has reformed into a new revenant.")
+ loc = get_turf(src) //In case it's in a backpack or someone's hand
+ visible_message("[src] suddenly rises into the air before fading away.")
+ var/mob/living/simple_animal/revenant/R = new(get_turf(src))
+ qdel(src)
+ var/list/candidates = get_candidates(BE_REVENANT)
+ if(!candidates.len)
+ message_admins("No candidates were found for the new revenant. Oh well!")
+ return 0
+ var/client/C = pick(candidates)
+ var/key_of_revenant = C.key
+ if(!key_of_revenant)
+ message_admins("No ckey was found for the new revenant. Oh well!")
+ return 0
+ var/datum/mind/player_mind = new /datum/mind(key_of_revenant)
+ player_mind.active = 1
+ player_mind.transfer_to(R)
+ player_mind.assigned_role = "revenant"
+ player_mind.special_role = "Revenant"
+ ticker.mode.traitors |= player_mind
+ message_admins("[key_of_revenant] has been made into a revenant by reforming ectoplasm.")
+ log_game("[key_of_revenant] was spawned as a revenant by reforming ectoplasm.")
+ return 1
diff --git a/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm b/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm
new file mode 100644
index 00000000000..e3197e90306
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm
@@ -0,0 +1,188 @@
+//Harvest Essence: The bread and butter of the revenant. The basic way of harvesting additional essence.
+/obj/effect/proc_holder/spell/wizard/targeted/revenant_harvest
+ name = "Harvest (0E)"
+ desc = "Siphons the lingering spectral essence from a human, empowering yourself."
+ panel = "Revenant Abilities"
+ charge_max = 100 //Short cooldown
+ clothes_req = 0
+ range = 5
+ var/essence_drained = 0
+ var/draining
+ var/list/drained_mobs = list() //Cannot harvest the same mob twice
+
+/obj/effect/proc_holder/spell/wizard/targeted/revenant_harvest/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
+ if(!user.castcheck(0))
+ charge_counter = charge_max
+ return
+ for(var/mob/living/carbon/human/target in targets)
+ spawn(0)
+ if(draining)
+ user << "You are already siphoning the essence of a soul!"
+ return
+ if(target in drained_mobs)
+ user << "[target]'s soul is dead and empty."
+ return
+ if(target.stat != DEAD)
+ user << "This being's soul is too strong to harvest."
+ if(prob(10))
+ target << "You feel as if you are being watched."
+ return
+ draining = 1
+ essence_drained = 1
+ user << "You search for the still-living soul of [target]."
+ sleep(10)
+ if(target.ckey)
+ user << "Their soul burns with intelligence."
+ essence_drained += 3
+ sleep(20)
+ switch(essence_drained)
+ if(1 to 2)
+ user << "[target] will not yield much essence. Still, every bit counts."
+ if(3 to 4)
+ user << "[target] will yield an average amount of essence."
+ if(5 to INFINITY)
+ user << "Such a feast! [target] will yield much essence to you."
+ sleep(30)
+ if(!in_range(user, target))
+ user << "You are not close enough to siphon [target]'s soul. The link has been broken."
+ draining = 0
+ return
+ if(!target.stat)
+ user << "They are now powerful enough to fight off your draining."
+ target << "You feel something tugging across your body before subsiding."
+ user << "You begin siphoning essence from [target]'s soul. You can not move while this is happening."
+ if(target.stat != DEAD)
+ target << "You feel a horribly unpleasant draining sensation as your grip on life weakens..."
+ user.icon_state = "revenant_draining"
+ user.notransform = 1
+ user.revealed = 1
+ user.invisibility = 0
+ target.visible_message("[target] suddenly rises slightly into the air, their skin turning an ashy gray.")
+ target.Beam(user,icon_state="drain_life",icon='icons/effects/effects.dmi',time=80)
+ target.death(0)
+ target.visible_message("[target] gently slumps back onto the ground.")
+ user.icon_state = "revenant_idle"
+ user.change_essence_amount(essence_drained * 5, 0, target)
+ user << "[target]'s soul has been considerably weakened and will yield no more essence for the time being."
+ user.revealed = 0
+ user.notransform = 0
+ user.invisibility = INVISIBILITY_OBSERVER
+ drained_mobs.Add(target)
+ draining = 0
+
+
+//Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob for 5E.
+/obj/effect/proc_holder/spell/wizard/targeted/revenant_transmit
+ name = "Transmit (5E)"
+ desc = "Telepathically transmits a message to the target."
+ panel = "Revenant Abilities (Locked)"
+ charge_max = 50
+ clothes_req = 0
+ range = -1
+ include_user = 1
+ var/locked = 1
+
+/obj/effect/proc_holder/spell/wizard/targeted/revenant_transmit/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
+ if(!user.castcheck(-5))
+ charge_counter = charge_max
+ return
+ if(locked)
+ usr << "You have unlocked Transmit!"
+ locked = 0
+ charge_counter = charge_max
+ panel = "Revenant Abilities"
+ range = 7
+ include_user = 0
+ return
+ for(var/mob/living/M in targets)
+ spawn(0)
+ var/msg = stripped_input(usr, "What do you wish to tell [M]?", null, "")
+ if(!msg)
+ charge_counter = charge_max
+ return
+ usr << "You transmit to [M]: [msg]"
+ M << "A strange voice resonates in your head... [msg]"
+
+
+//Overload Light: Breaks a light that's online and sends out lightning bolts to all nearby people.
+/obj/effect/proc_holder/spell/wizard/aoe_turf/revenant_light
+ name = "Overload Light (25E)"
+ desc = "Directs a large amount of essence into an electrical light, causing an impressive light show."
+ panel = "Revenant Abilities (Locked)"
+ charge_max = 300
+ clothes_req = 0
+ range = 1
+ var/locked = 1
+
+/obj/effect/proc_holder/spell/wizard/aoe_turf/revenant_light/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
+ if(!user.castcheck(-25))
+ charge_counter = charge_max
+ return
+ if(locked)
+ user << "You have unlocked Overload Light!"
+ panel = "Revenant Abilities"
+ locked = 0
+ range = 5
+ charge_counter = charge_max
+ return
+ for(var/turf/T in targets)
+ spawn(0)
+ for(var/obj/machinery/light/L in T.contents)
+ spawn(0)
+ if(!L.on)
+ return
+ L.visible_message("\The [L] suddenly flares brightly and begins to spark!")
+ sleep(20)
+ for(var/mob/living/M in orange(4, L))
+ if(M == user)
+ return
+ M.Beam(L,icon_state="lightning",icon='icons/effects/effects.dmi',time=5)
+ M.electrocute_act(25, "[L.name]")
+ playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ user.reveal(50, 1)
+
+
+//Defile: Corrupts nearby stuff, unblesses floor tiles.
+/obj/effect/proc_holder/spell/wizard/aoe_turf/revenantDefile
+ name = "Defile (30E)"
+ desc = "Twists and corrupts certain nearby objects. Also dispels holy auras on floors, but not salt lines."
+ panel = "Revenant Abilities (Locked)"
+ charge_max = 300
+ clothes_req = 0
+ range = 1
+ var/locked = 1
+
+/obj/effect/proc_holder/spell/wizard/aoe_turf/revenantDefile/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
+ if(!user.castcheck(-30))
+ charge_counter = charge_max
+ return
+ if(locked)
+ user << "You have unlocked Defile!"
+ panel = "Revenant Abilities"
+ locked = 0
+ range = 4
+ charge_counter = charge_max
+ return
+ for(var/turf/T in targets)
+ spawn(0)
+ if(T.flags & NOJAUNT)
+ T.flags -= NOJAUNT
+ for(var/obj/machinery/bot/secbot/secbot in T.contents) //Not including ED-209
+ secbot.emagged = 2
+ secbot.Emag(null)
+ for(var/obj/machinery/bot/cleanbot/cleanbot in T.contents)
+ cleanbot.emagged = 2
+ cleanbot.Emag(null)
+ for(var/mob/living/carbon/human/human in T.contents)
+ human << "You suddenly feel tired."
+ human.adjustStaminaLoss(25)
+ for(var/mob/living/silicon/robot/robot in T.contents)
+ robot.visible_message("[robot] lets out an alarm!", \
+ "01001111 01010110 01000101 01010010 01001100 01001111 01000001 01000100") //Translates to "OVERLOAD"
+ robot << 'sound/misc/interference.ogg'
+ playsound(robot, 'sound/machines/warning-buzzer.ogg', 50, 1)
+ for(var/obj/structure/window/window in T.contents)
+ window.hit(rand(10,50))
+ for(var/obj/machinery/light/light in T.contents)
+ light.flicker() //spooky
+ user.reveal(30, 1)
diff --git a/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm b/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm
new file mode 100644
index 00000000000..0f1b3545391
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm
@@ -0,0 +1,67 @@
+#define REVENANT_SPAWN_THRESHOLD 10
+
+/datum/event/revenant
+ var/key_of_revenant
+
+
+/datum/event/revenant/proc/get_revenant(var/end_if_fail = 0)
+ var/deadMobs = 0
+ for(var/mob/M in dead_mob_list)
+ deadMobs++
+ if(deadMobs < REVENANT_SPAWN_THRESHOLD)
+ message_admins("Random event attempted to spawn a revenant, but there were only [deadMobs]/[REVENANT_SPAWN_THRESHOLD] dead mobs.")
+ return
+ key_of_revenant = null
+ if(!key_of_revenant)
+ var/list/candidates = get_candidates(BE_REVENANT)
+ if(!candidates.len)
+ if(end_if_fail)
+ return 0
+ return find_revenant()
+ var/client/C = pick(candidates)
+ key_of_revenant = C.key
+ if(!key_of_revenant)
+ if(end_if_fail)
+ return 0
+ return find_revenant()
+ var/datum/mind/player_mind = new /datum/mind(key_of_revenant)
+ player_mind.active = 1
+ var/list/spawn_locs = list()
+ for(var/obj/effect/landmark/L in landmarks_list)
+ if(isturf(L.loc))
+ switch(L.name)
+ if("revenantspawn")
+ spawn_locs += L.loc
+ if(!spawn_locs) //If we can't find any revenant spawns, try the carp spawns
+ for(var/obj/effect/landmark/L in landmarks_list)
+ if(isturf(L.loc))
+ switch(L.name)
+ if("carpspawn")
+ spawn_locs += L.loc
+ if(!spawn_locs) //If we can't find either, just spawn the revenant at the player's location
+ spawn_locs += get_turf(player_mind.current)
+ if(!spawn_locs) //If we can't find THAT, then just retry
+ return find_revenant()
+ var/mob/living/simple_animal/revenant/revvie = new /mob/living/simple_animal/revenant/(pick(spawn_locs))
+ player_mind.transfer_to(revvie)
+ player_mind.assigned_role = "revenant"
+ player_mind.special_role = "Revenant"
+ ticker.mode.traitors |= player_mind
+ message_admins("[key_of_revenant] has been made into a revenant by an event.")
+ log_game("[key_of_revenant] was spawned as a revenant by an event.")
+ return 1
+
+
+/datum/event/revenant/start()
+ get_revenant()
+
+
+/datum/event/revenant/proc/find_revenant()
+ message_admins("An event failed to spawn a revenant. Retrying momentarily...")
+ spawn(50)
+ if(get_revenant(1))
+ message_admins("[key_of_revenant] has been spawned as a revenant.")
+ log_game("[key_of_revenant] was spawned as a revenant by an event.")
+ return 0
+ message_admins("No candidates were available for becoming a revenant.")
+ return kill()
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 0407a0edc07..999bd0145fc 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -440,6 +440,16 @@
anim(mobloc,mob,'icons/mob/mob.dmi',,"shadow",,L.dir)
L.loc = get_step(L, direct)
L.dir = direct
+ if(3) //Incorporeal move, but blocked by holy-watered tiles
+ var/turf/simulated/floor/stepTurf = get_step(L, direct)
+ if(stepTurf.flags & NOJAUNT)
+ L << "Holy energies block your path."
+ L.notransform = 1
+ spawn(2)
+ L.notransform = 0
+ else
+ L.loc = get_step(L, direct)
+ L.dir = direct
return 1
diff --git a/code/modules/organs/pain.dm b/code/modules/organs/pain.dm
index a712f543a88..d48592f64d9 100644
--- a/code/modules/organs/pain.dm
+++ b/code/modules/organs/pain.dm
@@ -77,7 +77,24 @@ mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength)
mob/living/carbon/human/proc/handle_pain()
// not when sleeping
- if(species && species.flags & NO_PAIN) return
+ if(species && species.flags & NO_PAIN)
+ //While IPCs don't feel pain, they will notice their gears gunking up with residue (toxins)
+ if(species && species.flags & IS_SYNTHETIC)
+ var/toxDamageMessage = null
+ var/toxMessageProb = 1
+ switch(getToxLoss())
+ if(25 to 50)
+ toxMessageProb = 1
+ toxDamageMessage = "Your servos seem to be working harder."
+ if(50 to 75)
+ toxMessageProb = 2
+ toxDamageMessage = "Your joints seem to stick randomly."
+ if(75 to INFINITY)
+ toxMessageProb = 5
+ toxDamageMessage = "Your motors seem to slip; it really grinds your gears!"
+ if(toxDamageMessage && prob(toxMessageProb))
+ src.custom_pain(toxDamageMessage, getToxLoss() >= 15)
+ return
if(stat >= 2) return
if(reagents.has_reagent("morphine"))
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index 722c75da1c6..91392283ac5 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -404,6 +404,27 @@ datum
del_reagent(R.id)
return 0
+ reaction_check(var/mob/M, var/datum/reagent/R)
+ var/can_process = 0
+ if(!istype(M, /mob/living)) //Non-living mobs can't metabolize reagents, so don't bother trying (runtime safety check)
+ return can_process
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ //Check if this mob's species is set and can process this type of reagent
+ if(H.species && H.species.reagent_tag)
+ if((R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN
+ can_process = 1
+ if((R.process_flags & ORGANIC) && (H.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG
+ can_process = 1
+ //Species with PROCESS_DUO are only affected by reagents that affect both organics and synthetics, like acid and hellwater
+ if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_DUO))
+ can_process = 1
+ //We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption)
+ else
+ if(R.process_flags != SYNTHETIC)
+ can_process = 1
+ return can_process
+
reaction(var/atom/A, var/method=TOUCH, var/volume_modifier=0)
switch(method)
@@ -412,7 +433,11 @@ datum
if(ismob(A))
spawn(0)
if(!R) return
- else R.reaction_mob(A, TOUCH, R.volume+volume_modifier)
+ var/check = reaction_check(A, R)
+ if(!check)
+ continue
+ else
+ R.reaction_mob(A, TOUCH, R.volume+volume_modifier)
if(isturf(A))
spawn(0)
if(!R) return
@@ -426,7 +451,11 @@ datum
if(ismob(A) && R)
spawn(0)
if(!R) return
- else R.reaction_mob(A, INGEST, R.volume+volume_modifier)
+ var/check = reaction_check(A, R)
+ if(!check)
+ continue
+ else
+ R.reaction_mob(A, INGEST, R.volume+volume_modifier)
if(isturf(A) && R)
spawn(0)
if(!R) return
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 586354d69b2..fab92027cc9 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -7,10 +7,6 @@
//The reaction procs must ALWAYS set src = null, this detaches the proc from the object (the reagent)
//so that it can continue working when the reagent is deleted while the proc is still active.
-//Some on_mob_life() procs check for alien races.
-#define IS_DIONA 1
-#define IS_VOX 2
-// ^ fuck this shit holy fuck - Iamgoofball
datum
reagent
var/name = "Reagent"
@@ -26,6 +22,9 @@ datum
var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!)
var/shock_reduction = 0
var/penetrates_skin = 0 //Whether or not a reagent penetrates the skin
+ //Processing flags, defines the type of mobs the reagent will affect
+ //By default, all reagents will ONLY affect organics, not synthetics. Re-define in the reagent's definition if the reagent is meant to affect synths
+ var/process_flags = ORGANIC
proc
reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not.
if(!istype(M, /mob/living)) return 0
@@ -303,6 +302,7 @@ datum
name = "Hell Water"
id = "hell_water"
description = "YOUR FLESH! IT BURNS!"
+ process_flags = ORGANIC | SYNTHETIC //Admin-bus has no brakes! KILL THEM ALL.
on_mob_life(var/mob/living/M as mob)
M.fire_stacks = min(5,M.fire_stacks + 3)
@@ -467,6 +467,7 @@ datum
description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen."
reagent_state = LIQUID
color = "#0064C8" // rgb: 0, 100, 200
+ process_flags = ORGANIC | SYNTHETIC
on_mob_life(var/mob/living/M as mob)
if(ishuman(M))
@@ -515,6 +516,15 @@ datum
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
return
+
+ reaction_turf(var/turf/simulated/T, var/volume)
+ ..()
+ if(!istype(T)) return
+ if(volume>=10)
+ for(var/obj/effect/rune/R in T)
+ qdel(R)
+ T.Bless()
+
serotrotium
name = "Serotrotium"
id = "serotrotium"
@@ -573,10 +583,12 @@ datum
on_mob_life(var/mob/living/M as mob, var/alien)
if(M.stat == 2) return
- if(alien && alien == IS_VOX)
- M.adjustToxLoss(REAGENTS_METABOLISM)
- holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears.
- return
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.species && (H.species.name == "Vox" || H.species.name =="Vox Armalis"))
+ M.adjustToxLoss(REAGENTS_METABOLISM)
+ holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears.
+ return
..()
copper
@@ -596,10 +608,12 @@ datum
on_mob_life(var/mob/living/M as mob, var/alien)
if(M.stat == 2) return
- if(alien && alien == IS_VOX)
- M.adjustOxyLoss(-2*REM)
- holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears.
- return
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.species && (H.species.name == "Vox" || H.species.name =="Vox Armalis"))
+ M.adjustOxyLoss(-2*REM)
+ holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears.
+ return
..()
hydrogen
@@ -662,6 +676,7 @@ datum
reagent_state = GAS
color = "#808080" // rgb: 128, 128, 128
penetrates_skin = 1
+ process_flags = ORGANIC | SYNTHETIC
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -676,6 +691,7 @@ datum
reagent_state = GAS
color = "#6A6054"
penetrates_skin = 1
+ process_flags = ORGANIC | SYNTHETIC
on_mob_life(var/mob/living/M as mob)
@@ -749,6 +765,7 @@ datum
description = "A strong mineral acid with the molecular formula H2SO4."
reagent_state = LIQUID
color = "#00D72B"
+ process_flags = ORGANIC | SYNTHETIC
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -872,6 +889,7 @@ datum
description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls."
reagent_state = SOLID
color = "#673910" // rgb: 103, 57, 16
+ process_flags = ORGANIC | SYNTHETIC
reaction_turf(var/turf/T, var/volume)
src = null
@@ -1190,6 +1208,7 @@ datum
description = "It's magic. We don't have to explain it."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
+ process_flags = ORGANIC | SYNTHETIC //Adminbuse knows no bounds!
on_mob_life(var/mob/living/carbon/M as mob)
if(!M) M = holder.my_atom ///This can even heal dead people.
@@ -1688,6 +1707,7 @@ datum
description = "A special oil that noticably chills the body. Extraced from Icepeppers."
reagent_state = LIQUID
color = "#B31008" // rgb: 139, 166, 233
+ process_flags = ORGANIC | SYNTHETIC
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -2491,8 +2511,10 @@ datum
d/=sober_str
- if(alien && alien == IS_SKRELL) //Skrell get very drunk very quickly.
- d*=5
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.species && (H.species.name == "Skrell" || H.species.name =="Neara")) //Skrell and Neara get very drunk very quickly.
+ d*=5
M.dizziness += dizzy_adj.
if(d >= slur_start && d < pass_out)
@@ -3216,4 +3238,4 @@ datum
holder.reagent_list -= src
holder = null
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm
index e8009abbe60..82d945c5403 100644
--- a/code/modules/reagents/newchem/drugs.dm
+++ b/code/modules/reagents/newchem/drugs.dm
@@ -4,7 +4,7 @@
#define REM REAGENTS_EFFECT_MULTIPLIER
-datum/reagent/nicotine
+/datum/reagent/nicotine
name = "Nicotine"
id = "nicotine"
description = "Slightly reduces stun times. If overdosed it will deal toxin and oxygen damage."
@@ -13,7 +13,7 @@ datum/reagent/nicotine
overdose_threshold = 35
addiction_threshold = 30
-datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
var/smoke_message = pick("You can just feel your lungs dying!", "You feel relaxed.", "You feel calmed.", "You feel the lung cancer forming.", "You feel the money you wasted.", "You feel like a space cowboy.", "You feel rugged.")
if(prob(5))
@@ -26,7 +26,7 @@ datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob)
..()
return
-datum/reagent/nicotine/overdose_process(var/mob/living/M as mob)
+/datum/reagent/nicotine/overdose_process(var/mob/living/M as mob)
if(prob(20))
M << "You feel like you smoked too much."
M.adjustToxLoss(1*REM)
@@ -34,7 +34,7 @@ datum/reagent/nicotine/overdose_process(var/mob/living/M as mob)
..()
return
-datum/reagent/crank
+/datum/reagent/crank
name = "Crank"
id = "crank"
description = "Reduces stun times by about 200%. If overdosed or addicted it will deal significant Toxin, Brute and Brain damage."
@@ -43,7 +43,7 @@ datum/reagent/crank
overdose_threshold = 20
addiction_threshold = 10
-datum/reagent/crank/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/crank/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
var/high_message = pick("You feel jittery.", "You feel like you gotta go fast.", "You feel like you need to step it up.")
if(prob(5))
@@ -53,26 +53,26 @@ datum/reagent/crank/on_mob_life(var/mob/living/M as mob)
M.AdjustWeakened(-2)
..()
return
-datum/reagent/crank/overdose_process(var/mob/living/M as mob)
+/datum/reagent/crank/overdose_process(var/mob/living/M as mob)
M.adjustBrainLoss(rand(1,10)*REM)
M.adjustToxLoss(rand(1,10)*REM)
M.adjustBruteLoss(rand(1,10)*REM)
..()
return
-datum/reagent/crank/addiction_act_stage1(var/mob/living/M as mob)
+/datum/reagent/crank/addiction_act_stage1(var/mob/living/M as mob)
M.adjustBrainLoss(rand(1,10)*REM)
..()
return
-datum/reagent/crank/addiction_act_stage2(var/mob/living/M as mob)
+/datum/reagent/crank/addiction_act_stage2(var/mob/living/M as mob)
M.adjustToxLoss(rand(1,10)*REM)
..()
return
-datum/reagent/crank/addiction_act_stage3(var/mob/living/M as mob)
+/datum/reagent/crank/addiction_act_stage3(var/mob/living/M as mob)
M.adjustBruteLoss(rand(1,10)*REM)
..()
return
-datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob)
+/datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob)
M.adjustBrainLoss(rand(1,10)*REM)
M.adjustToxLoss(rand(1,10)*REM)
M.adjustBruteLoss(rand(1,10)*REM)
@@ -397,6 +397,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob)
color = "#A42964"
metabolization_rate = 0.2
overdose_threshold = 15
+ process_flags = ORGANIC | SYNTHETIC //Flipping for everyone!
/datum/chemical_reaction/fliptonium
name = "fliptonium"
@@ -406,7 +407,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob)
result_amount = 4
mix_message = "The mixture swirls around excitedly!"
-datum/reagent/fliptonium/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
+/datum/reagent/fliptonium/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
return
if(method == INGEST || method == TOUCH)
@@ -437,10 +438,10 @@ datum/reagent/fliptonium/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
..()
return
-datum/reagent/fliptonium/reagent_deleted(var/mob/living/M as mob)
+/datum/reagent/fliptonium/reagent_deleted(var/mob/living/M as mob)
M.SpinAnimation(speed = 12, loops = -1)
-datum/reagent/fliptonium/overdose_process(var/mob/living/M as mob)
+/datum/reagent/fliptonium/overdose_process(var/mob/living/M as mob)
if(volume > 15)
if(prob(5))
switch(pick(1, 2, 3))
@@ -457,4 +458,173 @@ datum/reagent/fliptonium/overdose_process(var/mob/living/M as mob)
M.drop_r_hand()
M.adjustToxLoss(1)
..()
- return
\ No newline at end of file
+ return
+
+//////////////////////////////
+// Synth-Drugs //
+//////////////////////////////
+
+//Ultra-Lube: Meth
+/datum/reagent/lube/ultra
+ name = "Ultra-Lube"
+ id = "ultralube"
+ description = "Ultra-Lube is an enhanced lubricant which induces effect similar to Methamphetamine in synthetic users by drastically reducing internal friction and increasing cooling capabilities."
+ reagent_state = LIQUID
+ color = "#1BB1FF"
+
+ process_flags = SYNTHETIC
+ overdose_threshold = 20
+ addiction_threshold = 10
+ metabolization_rate = 0.6
+
+/datum/chemical_reaction/lube/ultra
+ name = "Ultra-Lube"
+ id = "ultralube"
+ result = "ultralube"
+ required_reagents = list("lube" = 2, "formaldehyde" = 1, "cryostylane" = 1)
+ result_amount = 2
+ mix_message = "The mixture darkens and appears to partially vaporize into a chilling aerosol."
+
+/datum/reagent/lube/ultra/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ var/high_message = pick("You feel your servos whir!", "You feel like you need to go faster.", "You feel like you were just overclocked!")
+ if(prob(1))
+ if(prob(1))
+ high_message = "0100011101001111010101000101010001000001010001110100111101000110010000010101001101010100!"
+ if(prob(5))
+ M << "[high_message]"
+ M.AdjustParalysis(-2)
+ M.AdjustStunned(-2)
+ M.AdjustWeakened(-2)
+ M.adjustStaminaLoss(-2)
+ M.status_flags |= GOTTAGOREALLYFAST
+ M.Jitter(3)
+ M.adjustBrainLoss(0.5)
+ if(prob(5))
+ M.emote(pick("twitch", "shiver"))
+ ..()
+ return
+
+/datum/reagent/lube/ultra/overdose_process(var/mob/living/M as mob)
+ if(prob(20))
+ M.emote("ping")
+ if(prob(33))
+ M.visible_message("[M]'s hands flip out and flail everywhere!")
+ var/obj/item/I = M.get_active_hand()
+ if(I)
+ M.drop_item()
+ ..()
+ if(prob(50))
+ M.adjustToxLoss(10)
+ M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1))
+ return
+
+/datum/reagent/lube/ultra/addiction_act_stage1(var/mob/living/M as mob)
+ M.Jitter(5)
+ if(prob(20))
+ M.emote(pick("twitch","buzz","moan"))
+ ..()
+ return
+
+/datum/reagent/lube/ultra/addiction_act_stage2(var/mob/living/M as mob)
+ M.Jitter(10)
+ M.Dizzy(10)
+ if(prob(30))
+ M.emote(pick("twitch","buzz","moan"))
+ ..()
+ return
+
+/datum/reagent/lube/ultra/addiction_act_stage3(var/mob/living/M as mob)
+ M.Jitter(15)
+ M.Dizzy(15)
+ if(prob(40))
+ M.emote(pick("twitch","buzz","moan"))
+ ..()
+ return
+
+/datum/reagent/lube/ultra/addiction_act_stage4(var/mob/living/carbon/human/M as mob)
+ M.Jitter(20)
+ M.Dizzy(20)
+ M.adjustToxLoss(5)
+ if(prob(50))
+ M.emote(pick("twitch","buzz","moan"))
+ ..()
+ return
+
+//Surge: Krokodil
+/datum/reagent/surge
+ name = "Surge"
+ id = "surge"
+ description = "A sketchy superconducting gel that overloads processors, causing an effect reportedly similar to opiates in synthetic units."
+ reagent_state = LIQUID
+ color = "#6DD16D"
+
+ process_flags = SYNTHETIC
+ overdose_threshold = 20
+ addiction_threshold = 15
+
+
+/datum/reagent/surge/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.druggy = max(M.druggy, 15)
+ var/high_message = pick("You feel calm.", "You feel collected.", "You feel like you need to relax.")
+ if(prob(1))
+ if(prob(1))
+ high_message = "01010100010100100100000101001110010100110100001101000101010011100100010001000101010011100100001101000101."
+ if(prob(5))
+ M << "[high_message]"
+ ..()
+ return
+
+/datum/reagent/surge/overdose_process(var/mob/living/M as mob)
+ //Hit them with the same effects as an electrode!
+ M.Stun(5)
+ M.Weaken(5)
+ M.Jitter(20)
+ M.apply_effect(STUTTER, 5)
+ if(prob(10))
+ M << "You experience a violent electrical discharge!"
+ playsound(get_turf(M), 'sound/effects/eleczap.ogg', 75, 1)
+ //Lightning effect for electrical discharge visualization
+ var/icon/I=new('icons/obj/zap.dmi',"lightningend")
+ I.Turn(-135)
+ var/obj/effect/overlay/beam/B = new(get_turf(M))
+ B.pixel_x = rand(-20, 0)
+ B.pixel_y = rand(-20, 0)
+ B.icon = I
+ M.adjustFireLoss(rand(1,5)*REM)
+ M.adjustBruteLoss(rand(1,5)*REM)
+ ..()
+ return
+
+/datum/reagent/surge/addiction_act_stage1(var/mob/living/M as mob)
+ M.adjustBrainLoss(rand(1,5)*REM)
+ M.adjustToxLoss(rand(1,5)*REM)
+ ..()
+ return
+/datum/reagent/surge/addiction_act_stage2(var/mob/living/M as mob)
+ if(prob(25))
+ M << "Your casing feels loose..."
+ ..()
+ return
+/datum/reagent/surge/addiction_act_stage3(var/mob/living/M as mob)
+ if(prob(25))
+ M << "Your casing starts to come apart..."
+ M.adjustBruteLoss(3*REM)
+ ..()
+ return
+
+/datum/reagent/surge/addiction_act_stage4(var/mob/living/carbon/human/M as mob)
+ if(prob(25))
+ M << "Your exposed wiring begins corroding!"
+ M.adjustFireLoss(5*REM)
+ ..()
+ return
+
+/datum/chemical_reaction/surge
+ name = "Surge"
+ id = "surge"
+ result = "surge"
+ required_reagents = list("thermite" = 3, "uranium" = 1, "fluorosurfactant" = 1, "sacid" = 1)
+ result_amount = 6
+ mix_message = "The mixture congeals into a metallic green gel that crackles with electrical activity."
diff --git a/code/modules/reagents/newchem/food.dm b/code/modules/reagents/newchem/food.dm
index 42b259c0ea7..39f2a5b6234 100644
--- a/code/modules/reagents/newchem/food.dm
+++ b/code/modules/reagents/newchem/food.dm
@@ -337,6 +337,7 @@ datum/reagent/greenvomit/reaction_turf(var/turf/T, var/volume)
description = "A bizarre gelatinous substance supposedly derived from ghosts."
reagent_state = LIQUID
color = "#8EAE7B"
+ process_flags = ORGANIC | SYNTHETIC //Because apparently ghosts in the shell
datum/reagent/ectoplasm/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm
index defbb6246ab..a27dfd98a45 100644
--- a/code/modules/reagents/newchem/medicine.dm
+++ b/code/modules/reagents/newchem/medicine.dm
@@ -911,4 +911,71 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
result = "haloperidol"
required_reagents = list("chlorine" = 1, "fluorine" = 1, "aluminum" = 1, "potass_iodide" = 1, "oil" = 1)
result_amount = 4
- mix_message = "The chemicals mix into an odd pink slush."
\ No newline at end of file
+ mix_message = "The chemicals mix into an odd pink slush."
+
+//////////////////////////////
+// Synth-Meds //
+//////////////////////////////
+
+//Degreaser: Anti-toxin / Lube Remover
+/datum/reagent/degreaser
+ name = "Degreaser"
+ id = "degreaser"
+ description = "An industrial degreaser which can be used to clean residual build-up from machinery and surfaces."
+ reagent_state = LIQUID
+ color = "#CC7A00"
+ process_flags = SYNTHETIC
+
+/datum/chemical_reaction/degreaser
+ name = "Degreaser"
+ id = "degreaser"
+ result = "degreaser"
+ required_reagents = list("oil" = 1, "sterilizine" = 1)
+ result_amount = 2
+
+/datum/reagent/degreaser/reaction_turf(var/turf/simulated/T, var/volume)
+ if (!istype(T)) return
+ src = null
+ if(volume >= 1)
+ if(T.wet >= 2) //Clears lube! Fight back against the slipping, and WIN!
+ T.wet = 0
+ if(T.wet_overlay)
+ T.overlays -= T.wet_overlay
+ T.wet_overlay = null
+ return
+
+/datum/reagent/degreaser/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustToxLoss(-1.5*REM)
+ for(var/datum/reagent/R in M.reagents.reagent_list)
+ if(R != src)
+ if(R.id == "ultralube" || R.id == "lube")
+ //Flushes lube and ultra-lube even faster than other chems
+ M.reagents.remove_reagent(R.id, 5)
+ else
+ M.reagents.remove_reagent(R.id,1)
+ ..()
+ return
+
+//Liquid Solder: Mannitol
+/datum/reagent/liquid_solder
+ name = "Liquid Solder"
+ id = "liquid_solder"
+ description = "A solution formulated to clean and repair damaged connections in posibrains while in use."
+ reagent_state = LIQUID
+ color = "#D7B395"
+ process_flags = SYNTHETIC
+
+/datum/reagent/liquid_solder/on_mob_life(mob/living/M as mob)
+ M.adjustBrainLoss(-3)
+ ..()
+ return
+
+/datum/chemical_reaction/liquid_solder
+ name = "Liquid Solder"
+ id = "liquid_solder"
+ result = "liquid_solder"
+ required_reagents = list("ethanol" = 1, "copper" = 1, "silver" = 1)
+ result_amount = 3
+ required_temp = 370
+ mix_message = "The solution gently swirls with a metallic sheen."
diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm
index 43b750b87e6..edeed358cf0 100644
--- a/code/modules/reagents/newchem/newchem_procs.dm
+++ b/code/modules/reagents/newchem/newchem_procs.dm
@@ -11,10 +11,35 @@ datum/reagents
datum/reagents/proc/metabolize(var/mob/M)
if(M)
+ if(!istype(M, /mob/living)) //Non-living mobs can't metabolize reagents, so don't bother trying (runtime safety check)
+ return
chem_temp = M.bodytemperature
handle_reactions()
for(var/A in reagent_list)
var/datum/reagent/R = A
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ //Check if this mob's species is set and can process this type of reagent
+ var/can_process = 0
+ //If we somehow avoided getting a species or reagent_tag set, we'll assume we aren't meant to process ANY reagents (CODERS: SET YOUR SPECIES AND TAG!)
+ if(H.species && H.species.reagent_tag)
+ if((R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN
+ can_process = 1
+ if((R.process_flags & ORGANIC) && (H.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG
+ can_process = 1
+ //Species with PROCESS_DUO are only affected by reagents that affect both organics and synthetics, like acid and hellwater
+ if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_DUO))
+ can_process = 1
+ //If the mob can't process it, remove the reagent at it's normal rate without doing any addictions, overdoses, or on_mob_life() for the reagent
+ if(can_process == 0)
+ R.holder.remove_reagent(R.id, R.metabolization_rate)
+ continue
+ //We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption)
+ else
+ if(R.process_flags == SYNTHETIC)
+ R.holder.remove_reagent(R.id, R.metabolization_rate)
+ continue
+ //If you got this far, that means we can process whatever reagent this iteration is for. Handle things normally from here.
if(M && R)
if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0)
R.overdosed = 1
diff --git a/code/modules/reagents/newchem/pyro.dm b/code/modules/reagents/newchem/pyro.dm
index afeb62ef652..4dbb2c9ee82 100644
--- a/code/modules/reagents/newchem/pyro.dm
+++ b/code/modules/reagents/newchem/pyro.dm
@@ -26,6 +26,7 @@
reagent_state = LIQUID
color = "#FF0000"
metabolization_rate = 4
+ process_flags = ORGANIC | SYNTHETIC
/datum/chemical_reaction/clf3
name = "Chlorine Trifluoride"
@@ -413,6 +414,7 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
description = "Catches you on fire and makes you ignite."
reagent_state = LIQUID
color = "#FF9999"
+ process_flags = ORGANIC | SYNTHETIC
/datum/chemical_reaction/phlogiston
name = "phlogiston"
@@ -443,6 +445,7 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
description = "Very flammable."
reagent_state = LIQUID
color = "#FF9999"
+ process_flags = ORGANIC | SYNTHETIC
/datum/reagent/napalm/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -467,6 +470,7 @@ datum/reagent/cryostylane
id = "cryostylane"
description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K."
color = "#B2B2FF" // rgb: 139, 166, 233
+ process_flags = ORGANIC | SYNTHETIC
/datum/chemical_reaction/cryostylane
name = "cryostylane"
@@ -500,6 +504,7 @@ datum/reagent/pyrosium
id = "pyrosium"
description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly cools all other reagents in the mob down to 0K."
color = "#B20000" // rgb: 139, 166, 233
+ process_flags = ORGANIC | SYNTHETIC
/datum/chemical_reaction/pyrosium
name = "pyrosium"
diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm
index 410aa5be2e2..f7b7d3c3977 100644
--- a/code/modules/reagents/newchem/toxins.dm
+++ b/code/modules/reagents/newchem/toxins.dm
@@ -226,6 +226,7 @@ datum/reagent/facid
description = "Fluorosulfuric acid is a an extremely corrosive super-acid."
reagent_state = LIQUID
color = "#4141D2"
+ process_flags = ORGANIC | SYNTHETIC
datum/reagent/facid/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
@@ -720,6 +721,7 @@ datum/reagent/ants
description = "A sample of a lost breed of Space Ants (formicidae bastardium tyrannus), they are well-known for ravaging the living shit out of pretty much anything."
reagent_state = SOLID
color = "#993333"
+ process_flags = ORGANIC | SYNTHETIC
datum/reagent/ants/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) //NOT THE ANTS
if(iscarbon(M))
diff --git a/code/modules/tram/tram.dm b/code/modules/tram/tram.dm
index 9e76a976028..f36e467b88f 100644
--- a/code/modules/tram/tram.dm
+++ b/code/modules/tram/tram.dm
@@ -20,6 +20,8 @@
var/activated = 0
var/looptick = 0
+ var/delay_timer = null
+
var/list/blacklist = list(/obj/tram/rail,/atom/movable/lighting_overlay)
var/list/ancwhitelist = list(/obj/tram, /obj/vehicle, /obj/structure/stool/bed/chair, /obj/structure/grille, /obj/structure/window)
@@ -72,7 +74,11 @@
/obj/tram/tram_controller/proc/tram_rail_follow()
var/stored_rail = null
+ if(delay_timer >= world.time) return
for(var/obj/tram/rail/RT in get_turf(src))
+ if(RT.stop_duration && !delay_timer)
+ delay_timer = world.time + RT.stop_duration
+ return
if(RT.godir)
handle_move(RT.godir)
last_played_rail = RT
@@ -84,6 +90,7 @@
if(R != last_played_rail)
handle_move(get_dir(src,R))
last_played_rail = stored_rail
+ return
//INITIALIZATION PROCS
@@ -212,6 +219,7 @@
collide_list = collisions
/obj/tram/tram_controller/proc/handle_move(var/dir)
+ delay_timer = null //reset delay
gen_collision() //Look for collisions
if(dir in collide_list) //Prevent moving if there are collisions in that direction
return 0
diff --git a/code/modules/tram/tram_rail.dm b/code/modules/tram/tram_rail.dm
index fb63df62617..2a22f8d4238 100644
--- a/code/modules/tram/tram_rail.dm
+++ b/code/modules/tram/tram_rail.dm
@@ -4,4 +4,5 @@
icon = 'icons/obj/tram/tram_rail.dmi'
icon_state = "rail"
var/godir = null
+ var/stop_duration = null
layer = TURF_LAYER + 0.1
\ No newline at end of file
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 62998f37b7c..7a45b29f2ec 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/corgi_head.dmi b/icons/mob/corgi_head.dmi
index 2a7e92f3fcb..be1f3baa252 100644
Binary files a/icons/mob/corgi_head.dmi and b/icons/mob/corgi_head.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 2a003edd4f0..6ef7e6484e5 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index fb5ee2cc19f..5f816544610 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi
index 31c03e4ec0a..8f489c651e8 100644
Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 5d82953f0fc..20ef88ec908 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1517,6 +1517,9 @@
#include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\undead.dm"
+#include "code\modules\mob\living\simple_animal\revenant\revenant.dm"
+#include "code\modules\mob\living\simple_animal\revenant\revenant_abilities.dm"
+#include "code\modules\mob\living\simple_animal\revenant\revenant_spawn_event.dm"
#include "code\modules\mob\new_player\login.dm"
#include "code\modules\mob\new_player\logout.dm"
#include "code\modules\mob\new_player\new_player.dm"