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"