diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b6de6f38459..ba97650547b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -99,3 +99,18 @@ There is no strict process when it comes to merging pull requests, pull requests * If you are proposing multiple changes, which change many different aspects of the code, you are expected to section them off into different pull requests in order to make it easier to review them and to deny/accept the changes that are deemed acceptable. * If your pull request is accepted, the code you add is no longer exclusively yours but everyones, everyone is free to work on it but you are also free to object to any changes being made, which will be noted by a Project Lead or Project Manager. It is a shame this has to be explicitly told but there have been cases where this would've saved some trouble. + +##Developing Secure Code + +* Player input must always be escaped safely, we recommend you use stripped_input in all cases where you would use input. Essentially, just always treat input from players as inherently malicious and design with that use case in mind + +* Calls to the database must be escaped properly - use sanitizeSQL to escape database entries from players or admins + +* All calls to topics must be checked for correctness, topic href calls can be generated maliciously, so you should ensure that the call is valid for the state the item is in. Do not rely on the UI code to provide only valid topic calls + +* Information that players could use to metagame (that is to identify the round type and or the antags via information that would not be available to them in character) should be kept as administrator only + +* It is recommended as well you do not expose information about the players - even something as simple as the number of people who have readied up at the start of the round can and has been used to try to identify the round type + +* Where you have code that can cause large scale modification and *FUN* make sure you start it out locked behind one of the default admin roles - use common sense to determine which role fits the level of damage a function could do + diff --git a/_maps/map_files/Efficiencystation/efficiency3.1.3a.dmm b/_maps/map_files/Efficiencystation/efficiency3.1.3a.dmm index 24f3313094b..7a9a947f916 100644 --- a/_maps/map_files/Efficiencystation/efficiency3.1.3a.dmm +++ b/_maps/map_files/Efficiencystation/efficiency3.1.3a.dmm @@ -428,7 +428,7 @@ "ail" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/maintenance/fore) "aim" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/medical/research{name = "Research Division"}) "ain" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/medical/research{name = "Research Division"}) -"aio" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fore) +"aio" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance,/obj/item/clothing/shoes/jackboots,/turf/simulated/floor/plating,/area/maintenance/fore) "aip" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore) "aiq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/maintenance/fore) "air" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/item/stack/rods,/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fore) @@ -1351,8 +1351,8 @@ "azY" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fore) "azZ" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/storage/tech) "aAa" = (/obj/machinery/light/small,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/storage/tech) -"aAb" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/storage/tech) -"aAc" = (/obj/machinery/camera{c_tag = "Secure Tech Storage"; dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/storage/tech) +"aAb" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/storage/tech) +"aAc" = (/obj/machinery/camera{c_tag = "Secure Tech Storage"; dir = 1},/turf/simulated/floor/plasteel,/area/storage/tech) "aAd" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fore) "aAe" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor/heavy,/obj/machinery/door/airlock/maintenance{name = "Atmospherics Maintenance"; req_access_txt = "24"},/turf/simulated/floor/plating,/area/atmos) "aAf" = (/obj/machinery/meter{frequency = 1443; id = "dloop_atm_meter"; name = "Distribution Loop"},/obj/machinery/atmospherics/pipe/manifold/supply/visible{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/atmos) @@ -2043,7 +2043,7 @@ "aNo" = (/turf/simulated/floor/plasteel{tag = "icon-purple (NORTH)"; icon_state = "purple"; dir = 1},/area/hallway/primary/central) "aNp" = (/turf/simulated/floor/plasteel{tag = "icon-purple (NORTHEAST)"; icon_state = "purple"; dir = 5},/area/hallway/primary/central) "aNq" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/hallway/primary/central) -"aNr" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Robotics Lab"; req_access_txt = "29"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/assembly/robotics) +"aNr" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock/research{name = "Robotics Lab"; req_access_txt = "29"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/assembly/robotics) "aNs" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Mech Bay"; req_access_txt = "29"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/assembly/chargebay) "aNt" = (/turf/simulated/floor/plasteel{icon_state = "loadingarea"},/area/hallway/primary/starboard) "aNu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "loadingarea"},/area/hallway/primary/starboard) @@ -2130,7 +2130,7 @@ "aOX" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/item/stack/rods,/turf/simulated/floor/plating,/area/maintenance/fpmaint{name = "Medical Maintenance"}) "aOY" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fpmaint{name = "Medical Maintenance"}) "aOZ" = (/obj/item/stack/cable_coil/cut{amount = 2; icon_state = "coil_red2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/maintenance/fpmaint{name = "Medical Maintenance"}) -"aPa" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fpmaint{name = "Medical Maintenance"}) +"aPa" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/item/clothing/shoes/jackboots,/turf/simulated/floor/plating,/area/maintenance/fpmaint{name = "Medical Maintenance"}) "aPb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/hand_labeler,/obj/item/weapon/gun/syringe,/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) "aPc" = (/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/clothing/tie/stethoscope,/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) "aPd" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/closet/l3closet/general,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) @@ -2224,7 +2224,7 @@ "aQN" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "caution"},/area/atmos) "aQO" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "caution"},/area/atmos) "aQP" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 5},/area/atmos) -"aQQ" = (/obj/structure/disposalpipe/trunk,/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/machinery/disposal/deliveryChute{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/disposal) +"aQQ" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/disposal) "aQR" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) "aQS" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/disposal) "aQT" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/machinery/recycler,/obj/structure/sign/securearea{name = "\improper STAY CLEAR HEAVY MACHINERY"; pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/disposal) @@ -2644,7 +2644,7 @@ "aYR" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/security/checkpoint/engineering) "aYS" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/checkpoint/engineering) "aYT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/security/checkpoint/engineering) -"aYU" = (/obj/machinery/light{dir = 4},/obj/machinery/camera{c_tag = "Security Post - Engineering"; dir = 8; network = list("SS13")},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/checkpoint/engineering) +"aYU" = (/obj/machinery/light{dir = 4},/obj/machinery/camera{c_tag = "Security Post - Engineering"; dir = 8; network = list("SS13")},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/computer/monitor,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/checkpoint/engineering) "aYV" = (/obj/machinery/door/airlock/external{name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/engine/break_room) "aYW" = (/turf/simulated/wall,/area/engine/break_room) "aYX" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor) @@ -3052,7 +3052,7 @@ "bgJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/icecream_vat,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/kitchen) "bgK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 22},/obj/machinery/camera{c_tag = "Kitchen Cold Room"},/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/kitchen) "bgL" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (EAST)"; dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/kitchen) -"bgM" = (/obj/structure/table,/obj/item/weapon/gun/projectile/revolver/doublebarrel,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/kitchen) +"bgM" = (/obj/structure/table,/obj/item/weapon/gun/projectile/revolver/doublebarrel,/obj/item/weapon/storage/belt/bandolier,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/kitchen) "bgN" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/kitchen) "bgO" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark/start{name = "Clown"},/turf/simulated/floor/plasteel{tag = "icon-redbluefull"; icon_state = "redbluefull"},/area/crew_quarters/theatre) "bgP" = (/obj/structure/mirror{pixel_x = 28},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{tag = "icon-redbluefull"; icon_state = "redbluefull"},/area/crew_quarters/theatre) @@ -3206,7 +3206,7 @@ "bjH" = (/obj/machinery/door/poddoor/shutters{id = "qm_warehouse"; name = "warehouse shutters"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/quartermaster/storage) "bjI" = (/obj/structure/disposalpipe/wrapsortjunction{dir = 1},/turf/simulated/wall,/area/quartermaster/storage) "bjJ" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/quartermaster/storage) -"bjK" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Delivery Office"; req_access_txt = "50"},/turf/simulated/floor/plasteel,/area/quartermaster/storage) +"bjK" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Delivery Office"; req_access_txt = "50"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/quartermaster/storage) "bjL" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "bjM" = (/obj/item/weapon/paper,/obj/structure/table/wood,/turf/simulated/floor/wood,/area/library) "bjN" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Librarian"},/turf/simulated/floor/wood,/area/library) @@ -3470,7 +3470,7 @@ "boL" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #2"},/obj/machinery/bot/mulebot{home_destination = "QM #2"; suffix = "#2"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage) "boM" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "boN" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/clipboard,/obj/item/weapon/pen/red,/turf/simulated/floor/plasteel,/area/quartermaster/storage) -"boO" = (/obj/machinery/computer/ordercomp,/turf/simulated/floor/plasteel,/area/quartermaster/storage) +"boO" = (/obj/machinery/computer/ordercomp,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/quartermaster/storage) "boP" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "boQ" = (/obj/structure/window/fulltile,/obj/structure/grille,/turf/simulated/floor/plating,/area/quartermaster/storage) "boR" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) @@ -3751,7 +3751,7 @@ "bug" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/quartermaster/storage) "buh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bui" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/quartermaster/storage) -"buj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Cargo Office"; req_access_txt = "50"},/turf/simulated/floor/plasteel,/area/quartermaster/storage) +"buj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Cargo Office"; req_access_txt = "50"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/quartermaster/storage) "buk" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bul" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera{c_tag = "Aft Port Primary Hallway Central"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/hallway/primary/aft) "bum" = (/turf/simulated/wall,/area/security/detectives_office) @@ -3873,9 +3873,9 @@ "bwy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{name = "Cargo Bay Maintenance"; req_access_txt = "31"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/quartermaster/storage) "bwz" = (/turf/simulated/wall,/area/quartermaster/qm) "bwA" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/quartermaster/qm) -"bwB" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/glass_mining{name = "Quartermaster"; req_access_txt = "41"},/turf/simulated/floor/plasteel,/area/quartermaster/qm) +"bwB" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/glass_mining{name = "Quartermaster"; req_access_txt = "41"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/quartermaster/qm) "bwC" = (/turf/simulated/wall,/area/security/checkpoint/supply{name = "Security Post - Cargo"}) -"bwD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/checkpoint/supply{name = "Security Post - Cargo"}) +"bwD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/checkpoint/supply{name = "Security Post - Cargo"}) "bwE" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/security/checkpoint/supply{name = "Security Post - Cargo"}) "bwF" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/hallway/primary/aft) "bwG" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/hallway/primary/aft) @@ -4420,7 +4420,7 @@ "bGZ" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/security/warden) "bHa" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/security/warden) "bHb" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/security/warden) -"bHc" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/shotgun/riot{pixel_x = 3; pixel_y = 3},/obj/item/weapon/gun/projectile/shotgun/riot,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) +"bHc" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance,/obj/item/clothing/shoes/jackboots,/turf/simulated/floor/plating,/area/maintenance/starboard) "bHd" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -32},/turf/simulated/floor/fancy/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "bHe" = (/obj/structure/table/wood,/turf/simulated/floor/fancy/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "bHf" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) @@ -4684,7 +4684,7 @@ "bMd" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/security/hos) "bMe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-darkred (WEST)"; icon_state = "darkred"; dir = 8},/area/security/hos) "bMf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/fancy/carpet,/area/security/hos) -"bMg" = (/obj/item/weapon/folder/red,/obj/item/weapon/stamp/hos,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/table/wood,/turf/simulated/floor/fancy/carpet,/area/security/hos) +"bMg" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/shotgun/riot{pixel_x = 3; pixel_y = 3},/obj/item/weapon/gun/projectile/shotgun/riot,/obj/item/weapon/storage/belt/bandolier,/obj/item/weapon/storage/belt/bandolier,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) "bMh" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Head of Security"},/turf/simulated/floor/fancy/carpet,/area/security/hos) "bMi" = (/obj/machinery/computer/secure_data,/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Security's Desk"; departmentType = 5; name = "Head of Security RC"; pixel_x = 30; pixel_y = 0},/turf/simulated/floor/fancy/carpet,/area/security/hos) "bMj" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/secure/briefcase,/obj/item/weapon/storage/box/ids,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge) @@ -5194,10 +5194,10 @@ "bVT" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating,/area/maintenance/port{name = "Chapel Maintenance"}) "bVU" = (/obj/effect/decal/cleanable/robot_debris,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/maintenance/port{name = "Chapel Maintenance"}) "bVV" = (/obj/machinery/light,/obj/machinery/driver_button{id = "chapelgun"; name = "Chapel Mass Driver"; pixel_x = 0; pixel_y = -25},/obj/machinery/camera{c_tag = "Chapel South"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) -"bVW" = (/obj/machinery/newscaster{pixel_x = -28; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) +"bVW" = (/obj/item/weapon/folder/red,/obj/item/weapon/stamp/hos,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/table/wood,/obj/item/clothing/mask/cigarette/cigar/cohiba,/turf/simulated/floor/fancy/carpet,/area/security/hos) "bVX" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "bVY" = (/obj/machinery/power/apc{dir = 4; name = "Escape APC"; pixel_x = 25; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 4},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) -"bVZ" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) +"bVZ" = (/obj/item/weapon/beach_ball/holoball,/turf/simulated/floor/plating,/area/security/prison) "bWa" = (/obj/machinery/door/window/westleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Unisex Showers"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) "bWb" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "bWc" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) @@ -5238,7 +5238,7 @@ "bWL" = (/obj/machinery/shower{dir = 4},/obj/item/weapon/soap/nanotrasen,/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) "bWM" = (/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"},/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) "bWN" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) -"bWO" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) +"bWO" = (/turf/simulated/floor/plasteel,/area/security/prison) "bWP" = (/obj/machinery/vending/sustenance,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "bWQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 8},/area/hallway/secondary/entry{name = "Arrivals"}) "bWR" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) @@ -5274,8 +5274,8 @@ "bXv" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 4},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "bXw" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/washing_machine,/turf/simulated/floor/plasteel{icon_state = "barber"},/area/security/prison) "bXx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{icon_state = "barber"},/area/security/prison) -"bXy" = (/obj/structure/table,/obj/item/device/analyzer/plant_analyzer,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) -"bXz" = (/obj/structure/table,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) +"bXy" = (/obj/structure/stool,/obj/item/device/radio/intercom{desc = "Talk through this. It looks like it has been modified to not broadcast."; dir = 2; name = "Prison Intercom (General)"; pixel_x = 0; pixel_y = -28; prison_radio = 1},/turf/simulated/floor/plating,/area/security/prison) +"bXz" = (/obj/machinery/newscaster{pixel_x = -28; pixel_y = 0},/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "bXA" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "bXB" = (/obj/item/seeds/ambrosiavulgarisseed,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "bXC" = (/obj/machinery/computer/arcade,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) @@ -5300,12 +5300,12 @@ "bXV" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 4},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "bXW" = (/obj/structure/table,/obj/structure/bedsheetbin,/turf/simulated/floor/plasteel{icon_state = "barber"},/area/security/prison) "bXX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "barber"},/area/security/prison) -"bXY" = (/obj/structure/table,/obj/item/weapon/pen,/mob/living/simple_animal/cat{name = "Jerry"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) -"bXZ" = (/obj/structure/table,/obj/item/weapon/storage/pill_bottle/dice,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) +"bXY" = (/obj/machinery/shower{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) +"bXZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plating,/area/security/prison) "bYa" = (/obj/structure/table,/obj/machinery/librarycomp{pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "bYb" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 8},/area/hallway/secondary/entry{name = "Arrivals"}) "bYc" = (/obj/structure/stool/bed/chair,/obj/effect/landmark{name = "JoinLate"},/turf/simulated/shuttle/floor,/area/space) -"bYd" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 28; pixel_y = 0},/turf/simulated/shuttle/floor,/area/space) +"bYd" = (/obj/structure/table,/obj/item/device/analyzer/plant_analyzer,/turf/simulated/floor/plasteel,/area/security/prison) "bYe" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) "bYf" = (/obj/item/weapon/paper/pamphlet,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/table,/turf/simulated/floor/plasteel,/area/gateway) "bYg" = (/obj/machinery/recharger,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -28},/obj/structure/table,/turf/simulated/floor/plasteel,/area/gateway) @@ -5339,11 +5339,11 @@ "bYI" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "bYJ" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "bYK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) -"bYL" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/hydroponics/soil,/turf/simulated/floor/plasteel{dir = 9; icon_state = "green"},/area/security/prison) -"bYM" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/hydroponics/soil,/obj/item/seeds/grassseed,/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/security/prison) +"bYL" = (/obj/structure/table,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel,/area/security/prison) +"bYM" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/mob/living/simple_animal/cat{desc = "Security's infamous cat. Probably insane."; name = "Jerry"},/turf/simulated/floor/plasteel,/area/security/prison) "bYN" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/security/prison) -"bYO" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/hydroponics/soil,/obj/item/weapon/minihoe,/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/security/prison) -"bYP" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/hydroponics/soil,/turf/simulated/floor/plasteel{dir = 5; icon_state = "green"},/area/security/prison) +"bYO" = (/obj/structure/table,/obj/item/weapon/storage/pill_bottle/dice,/turf/simulated/floor/plasteel,/area/security/prison) +"bYP" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/hydroponics/soil,/turf/simulated/floor/fancy/grass,/area/security/prison) "bYQ" = (/obj/structure/sign/securearea{pixel_y = 32},/turf/simulated/wall/r_wall,/area/security/prison) "bYR" = (/obj/machinery/camera{c_tag = "Arrivals Bay 1 West"; dir = 8},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "bYS" = (/obj/structure/closet/wardrobe/mixed,/turf/simulated/shuttle/floor,/area/space) @@ -5359,7 +5359,7 @@ "bZc" = (/obj/structure/closet/emcloset,/obj/machinery/camera{c_tag = "Escape South"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "bZd" = (/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "bZe" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) -"bZf" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) +"bZf" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/hydroponics/soil,/obj/item/seeds/grassseed,/turf/simulated/floor/fancy/grass,/area/security/prison) "bZg" = (/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "bZh" = (/obj/item/weapon/minihoe,/turf/simulated/floor/plating,/area/security/prison) "bZi" = (/obj/item/seeds/potatoseed,/turf/simulated/floor/plating,/area/security/prison) @@ -5380,10 +5380,10 @@ "bZx" = (/obj/machinery/door/airlock/external{name = "Escape Airlock"},/turf/simulated/floor/plating,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "bZy" = (/obj/machinery/biogenerator,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "bZz" = (/obj/machinery/seed_extractor,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) -"bZA" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/machinery/hydroponics/soil,/obj/item/seeds/glowshroom,/turf/simulated/floor/plasteel{dir = 10; icon_state = "green"},/area/security/prison) -"bZB" = (/obj/machinery/hydroponics/soil,/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/security/prison) +"bZA" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/hydroponics/soil,/obj/item/weapon/minihoe,/turf/simulated/floor/fancy/grass,/area/security/prison) +"bZB" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel,/area/security/prison) "bZC" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plating,/area/security/prison) -"bZD" = (/obj/machinery/newscaster{pixel_y = -32},/obj/machinery/hydroponics/soil,/obj/item/seeds/carrotseed,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 6},/area/security/prison) +"bZD" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/machinery/hydroponics/soil,/obj/item/seeds/glowshroom,/turf/simulated/floor/fancy/grass,/area/security/prison) "bZE" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "bZF" = (/obj/structure/closet/wardrobe/green,/turf/simulated/shuttle/floor,/area/space) "bZG" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 27; pixel_y = 0},/turf/simulated/shuttle/floor,/area/space) @@ -5512,6 +5512,8 @@ "cbZ" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_sw"; name = "southwest of station"; turf_type = /turf/space; width = 18},/turf/space,/area/space) "cca" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_s"; name = "south of station"; turf_type = /turf/space; width = 18},/turf/space,/area/space) "ccb" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_se"; name = "southeast of station"; turf_type = /turf/space; width = 18},/turf/space,/area/space) +"ccc" = (/obj/machinery/hydroponics/soil,/turf/simulated/floor/fancy/grass,/area/security/prison) +"ccd" = (/obj/machinery/newscaster{pixel_y = -32},/obj/machinery/hydroponics/soil,/obj/item/seeds/carrotseed,/turf/simulated/floor/fancy/grass,/area/security/prison) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -5591,9 +5593,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccactaccaacaacaaaaacaacaaaaacaacaacaacaacaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaacabEabEacuacvacwacxacyaczacAacBacCabNacDacEacFabNabNaacaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacGacHacIacIacIacIacIacIacIacIacIacIacIacIacIacJaaaaaaaaaaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaacabEacKacLabEabEacMacNacOacPacQacRacSacRacTabNaacaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacUacVacWacXacYacZadaadbadcacYaddacYacYadeadfacUaacaaaaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaacaacadgadhadiadjadgadkadladmadnadkadkadoaacaacaacaacaacaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacUadpadqadradradradradradradradradradradradpacUaacaacaacaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaBaacaaaadgadsadtaduadvadwadxadyadzadAadAadAaacaaaaacaaaaacaaBaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacUadpadBadradCadDadDadDadEadDadDadDadDadradFacUaacaacaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaadgadGadHadIadgadJadKadLadMadNadOadNaacadPaacaaaaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacacUadpadQadradRadDadDadDadSadDadDadDadDadradTacUaacaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaacaaaaaaadgadgadgadgadgadUadVadWadXadYadAadZaacaaaaacaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacUadpadqadradradradradradradradradradradradpacUaacaacaacaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaBaacaaaadgadsadtaduadvadwadxadyadzadAadAadAabDaaaaacaaaaacaaBaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacUadpadBadradCadDadDadDadEadDadDadDadDadradFacUaacaacaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaacaacadgadGadHadIadgadJadKadLadMadNadOadNabDadPaacaacaacaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacacUadpadQadradRadDadDadDadSadDadDadDadDadradTacUaacaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaacaaaaaaadgadgadgadgadgadUadVadWadXadYadAadZabDaaaaacaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacUaeaaebadraecadDadDadDadDadDaedaeeaefadradpacUaaaaaaaaaaaaaacaacaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaegaehaeiaejaekaelaaaaaaaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUaemaenadradraeoadDadDadDadDaepaeoadradraeqacUaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaegaeraesaesaetaesaeuaevaaaaaaaacaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaegaewaexaaaaeyaaaaezaaaaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacUaeAaeBadraeCaeDaeEaeFaeGaeHaeIaeJaeKadradpacUaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaacaeLaeMaeNaeOaeOaeOaePaeQaeRaeRaeRaeSaeRaeRaeRaeSaeRaeRaeRaeSaeRaeRaeRaeSaeRaeRaeRaeSaeRaeRaeRaeSaeRaeRaeTaeUaeOaeOaeVaegaeWaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -5670,30 +5672,30 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaacaaAaaabxNbAqbwzbArbAsbAtbAubAvbAwbwCbAxbAybAzbAAbABbwCbhzaVxbwGbACbADbAEbAFbAGbAHbupbAIbzxbzDbAJbAKbALbAMbANbAObAPbzDbAQbARbASbATbAUbAUbzDbAVbAWbAXbAYbzFbsabAZbBabBbbBcbuFbBdbBebBfbBgbBhbBibxjbBjbwgbwgbxlbBkbyBbBlbBmbBnbBobBpbBqbBrbBsbBtbBubBvbBwbBxbBybBvbBvbBzblEbBAbBBbBCbBDbBEbjzbBFbrwbrwbrwbtYbBGbBHbsPbyVbyWbBIbBJbBKbBLbzbbsSaacaaaaaaaacbBMbBNbBOaacaacbvoaacaaaaaabjzbqkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaabxNbBPbBQbBQbBQbBRbBQbBSbBTbBUbBVbwCbBWbwCbwCbwCbBXbBYbBZbupbupbupbupbupbupbupbCabzxbCbbCcbCdbCebCfbCebCebCgbzDbAQbChbCibCjbCkbAUbzDbClbCmbCnbCobCpbsabCqbCrbCsbCtbCubCvbCwbCxbCybxhbxibCzbCAbwgbwgbxlbCBbzSbxpbCCbCDbwibCEbCFbCGbCHbCIbnhbCJbCKbnhbCLbCJbCJbyLbnhbnhbCMbjybjzbjzbjzbjzbjzbCNbCNbjzbCObCPbwvbjzbCQbCRbCSbCTbCTbCUbsSaacaaabCVaacaacaacaacaacaaaaaabCWaaaaaabjzbqkaacafnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbCXbCYbCZbDabDbbDcbDdbDebDfbDgbDhbDibDjbDkbDlbDmbDnbDobDpbDqbDrbDrbDqbDsbDtbDubDvbDwbDxbDybCebCebDzbCebDAbDBbCbbDCbDDbDEbDFbDGbDHbzDbDIbDJbDJbDKbDLbsabDMbDNbDObDPbuFbDQbDRbDSbDTbuCbDUbxjbDVbwgbwgbxlbDWbyBbDXbDYbDZbwibEabEbbjwbEcbjwbjwbEdbEebjwbfVbEfbjwbEgbEhbEibEjbEkbjzbElbElbElbEmbyYbyYbjzbEnbEobwvbowbjzbwwbjzbjzbsSbsSbsSaacaaaaaaaaaaacaaaaaaaaaaaaaaaaacaaaaaabjzbjzaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaAaaAaaAaaAahJaaAaaAaaAaaAaaAaaAaaAaaAaaAaaAahJaaAaaAaacaacaacaacaacaacaacaacaacbEpbEpbEqbErbEpbxNbEpbEsbEpbEtbEubEubEubEubEubEvbEubEwbExaVxbEybEzbEzbEAbwPbwPbEBbECbEDbEEbEFbEGbEGbEHbEIbEJbEIbEKbELbEMbENbEObEPbEQbzDbwVbwVbwVbERbESbsabETbBabDObEUbuFbuCbuCbEVbuCbuCbuFbuFbEWbwgbwgbyAbEXbEYbEZbFabFbbFcbFdbFebjwbfVbFfbjwbFgbsDbjwbFhbFibjwbFjbikbFkbFlbFmbjzbElbFnbFnbEmbyYbFobjzbFpbrwbFqbFrbFsbFtbFubsQbsRbsSbsSaacbvoaaaaaabvoaaaaaaaaaaaabvoaacaaaaaabjzbqkaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaAaaAaaAaaAahJaaAaaAaaAaaAaaAaaAaaAaaAaaAaaAahJaaAaaAaacaacaacaacaacaacaacaacaacbEpbEpbEqbErbEpbxNbEpbEsbEpbEtbEubEubEubEubEubEvbEubEwbExaVxbEybEzbEzbEAbwPbwPbEBbECbEDbEEbEFbEGbEGbEHbEIbEJbEIbEKbELbEMbENbEObEPbEQbzDbwVbwVbwVbERbESbsabETbBabDObEUbuFbuCbuCbEVbuCbuCbuFbuFbEWbwgbwgbyAbEXbEYbEZbFabFbbFcbFdbFebjwbfVbFfbjwbFgbHcbjwbFhbFibjwbFjbikbFkbFlbFmbjzbElbFnbFnbEmbyYbFobjzbFpbrwbFqbFrbFsbFtbFubsQbsRbsSbsSaacbvoaaaaaabvoaaaaaaaaaaaabvoaacaaaaaabjzbqkaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaaacaaaaaaaaaaacaacaaaaacaacaaaaaaaaaaaaaacaaaaaAaaaaaaaaaaacaacaaaaaaaaaaacbFvbFwbFxbFybEpbFzbFAbFBbFCbFDbEubFEbFFbFGbFHbFIbFJaVxaVxbFKbFLbykbykbFLbyibyjbyjbFMbFNbFObFPbCebCebFQbFRbFSbFTbFUbFVbFWbFXbFYbDGbFZbzDbGabGbbGcbGdbGebsabGfbBabGgbyvbyvbyvbGhbGibGjbGkbGlbGmbwfbwgbwgbxlbGnbGobGpbxpbGqbwibGrbGsbjwbGtbGubjwbjwbjwbjwbjwbjwbjwbjwbjwbjwbGvbGwbjzbFnbFnbFnbGxbyYbGybjzbGzbrwbrwbuabrwbGAbGBbsQbGCbsSaaaaacaacaacaacaacaacaacaacaacaacaacaaaaaabjzbqkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaabGDbGEbGFaaabGDbGEbGFaaabGDbGEbGFaaabGDbGEbGFaaaahJaacaaaaaaaacaaaaaaaaaaaaaacbFvbGGbEqbGHbEpbGIbGJbGKbGLbGMbEubGNbGObGPbFHbGQbFJaVxaVxbGRbGSbGTbGTbGTbGTbGTbGTbGUbGVbzDbGWbGXbzAbGYbzAbzCbzDbzDbzDbFWbGZbHabHbbHcbzDbHdbHebGcbHfbHgbsabHhbHibHjbHkbHlbHmbHnbHobHpbHpbHqbHrbxkbHsbHtbwibwibwibwibwibwibwibHubHvbjwbjwbjwbjwbHwbsDbBDbHxbHybHzbHAbHBbHAbHCbHDbjzbjzbjzbjzbjzbjzbjzbjzbHEbrwbsLbHFbHGbqabsPbsQbsRbsSaaaaaaaacaaaaaaaaaaaabHHaaaaaaaacaaaaaabqfbjzbqkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaabGDbGEbGFaaabGDbGEbGFaaabGDbGEbGFaaabGDbGEbGFaaaahJaacaaaaaaaacaaaaaaaaaaaaaacbFvbGGbEqbGHbEpbGIbGJbGKbGLbGMbEubGNbGObGPbFHbGQbFJaVxaVxbGRbGSbGTbGTbGTbGTbGTbGTbGUbGVbzDbGWbGXbzAbGYbzAbzCbzDbzDbzDbFWbGZbHabHbbMgbzDbHdbHebGcbHfbHgbsabHhbHibHjbHkbHlbHmbHnbHobHpbHpbHqbHrbxkbHsbHtbwibwibwibwibwibwibwibHubHvbjwbjwbjwbjwbHwbsDbBDbHxbHybHzbHAbHBbHAbHCbHDbjzbjzbjzbjzbjzbjzbjzbjzbHEbrwbsLbHFbHGbqabsPbsQbsRbsSaaaaaaaacaaaaaaaaaaaabHHaaaaaaaacaaaaaabqfbjzbqkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaabGDbHIbGFaaabGDbHIbGFaaabGDbHIbGFaaabGDbHIbGFaaaaaAaacaacaaaaacaaaaaaaaaaaaaaabFvbHJbEqbEpbEpbxNbHKbHLbHMbHNbHObHPbHQbHRbHSbHTbEuaVxaVxbwGbGSbHUbHVbHWbHXbHYbHZbIabIbbIcbIdbIebIebIfbIgbIhbIibIjbIkbIlbImbInbFWbIobzDbIpbIqbIrbHfbIsbsabItbBabIubIvbIwbIxbHnbHobIybHpbIzbIAbIBbICbICbICbICbICbICbICblEbIDbIEbIFbIGbIHbIIbIJbIJbIKbfVbfVbjwbILbIMbIMbjwbwnbINbIObIPbIObIObIObIObIQbIRbISbITbIUbIVbIWbrwbrzbjzbjzbjzbIXaaabIYbqfbqfbqfbqfbqfbqfbqfbIYbqfbIZbjzbjzbqkaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaabGDbJabGFaaabGDbJabGFaacbGDbJabGFaacbGDbJabGFaaaaaAaaaaacaacaacaaaaaaaaaaaaaaabEpbEpbJbbEpbJcbJdbJebJfbJgbJhbEubJibJjbJkbJlbJmbJnbJobbabwGbGSbHUbJpbJqbJrbJsbGTbJtbJubJvbJwbJxbJybJzbJAbJBbJBbJCbzDbzDbJDbJEbzDbzDbzDbsabsabsabJFbsabsabHnbBabIubHmbJGbHmbHnbHobJHbHpbJIbJJbJKbJLbJMbJNbJObJNbJPbJQbJRbHAbJSbJTbJUbJVbJWbjwbjwbJXbjwbIMbjwbJYbJZbKabjwbKbbHAbHAbHAbKcbKdbKebKfbKgbnnbKhbKibKjbKkbKlbKmbqbbKnbKobKnbKpbqfbKqbqfboBboCbKrboCboEbqfbKqbqfboFbjzbqkaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaabGDbHIbGFaaabGDbHIbGFaaabGDbHIbGFaaabGDbHIbGFaacaaAaaaaaaaaaaacaacaacaaaaaaaaaaacbEpbKsbEpbKtbKubKvbKvbKvbKvbKvbKvbKwbKvbKvbKvbKvbKxaVxbwGbGSbHUbJpbKybJrbKzbKAbKBbKCbKDbKEbKFbKGbKHbJBbJBbKIbKJbKKbKLbKMbKNbKObKPbKKbKQbHnbKRbKSbKTbKUbKVbKWbKXbyvbyvbyvbKYbKZbLabLbbLcbGmbwfbLdbLebLebLebLebLfbwgbLgbLgbLgbLhbLgbLibLjbjwbLkbLlbLmbLnbLobLpbLqbLrbjwbLsbLtbLubLvbLwbLxbLybLzbLzbjzbjzbLAbLBbjzbjzbjzbjzbjzbLCbjzbqhboCbLDboCbqjbjzbjzbjzbqhboCbqjboFboFbjzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbGDbJabGFaaabGDbJabGFaaabGDbJabGFaacbGDbJabGFafnaacaaaaaaaaaaaaaaaaacaacaacaaaaaabEpbLEbEpbLFbKubLGbLHbLIbLJbLKbLLbLMbLNbLNbLObLPbKxaVxbLQbGSbHUbLRbLSbLTbLUbLVbLWbLXbLYbJBbLZbMabMbbJBbJBbJBbMcbMdbMebMfbMgbMhbMibKKbMjbHnbMkbMlbMmbMmbMmbMnbMobMpbMqbMrbMrbMrbMsbMrbMrbMrbwfbLdbMtbMubMvbMwbLfbwgbMxbMybMzbMAbMBbMCbMDbjwbMEbMFbMGbMHbMIbMJbMKbMLbjwbjwbjwbjwbMMbMMbMMbjwbLzaacaacbsSbMNbMObMPbsSaacaacbjzbjzbjzbjzbjzbjzbjzbjzbjzbjzbjzbjzbjzbjzbjzbjzbjzaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbGDbJabGFaaabGDbJabGFaaabGDbJabGFaacbGDbJabGFafnaacaaaaaaaaaaaaaaaaacaacaacaaaaaabEpbLEbEpbLFbKubLGbLHbLIbLJbLKbLLbLMbLNbLNbLObLPbKxaVxbLQbGSbHUbLRbLSbLTbLUbLVbLWbLXbLYbJBbLZbMabMbbJBbJBbJBbMcbMdbMebMfbVWbMhbMibKKbMjbHnbMkbMlbMmbMmbMmbMnbMobMpbMqbMrbMrbMrbMsbMrbMrbMrbwfbLdbMtbMubMvbMwbLfbwgbMxbMybMzbMAbMBbMCbMDbjwbMEbMFbMGbMHbMIbMJbMKbMLbjwbjwbjwbjwbMMbMMbMMbjwbLzaacaacbsSbMNbMObMPbsSaacaacbjzbjzbjzbjzbjzbjzbjzbjzbjzbjzbjzbjzbjzbjzbjzbjzbjzaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbGDbJabGFaaabGDbJabGFaacbGDbJabGFaaabGDbJabGFaaaaacaacaacaacaacaaaaacbEpbEpbEpbEpbEpbEqbEpbMQbMRbMSbMTbMUbMVbMUbMWbMXbLNbLNbMYbLPbMZbrPbNabNbbHZbHZbNcbHZbNdbGTbNebNfbNgbNhbNibNibNjbNkbNkbNlbNmbNnbNobNpbNqbNpbNrbKKbNsbHnbNtbNubNvbNwbNxbNybNzbHnbNAbMrbNBbNCbNDbNEbNFbMrbwfbLdbNGbNHbNHbNIbLfbNJbMxbNKbNLbNMbLgbNNbjybjwbjwbjwbjwbjwbNObNPbLnbNQbNRbMMaaaaacaacaacaaaaacaacaacaacbsSbNSbNTbyYbsSaacaacaacaacaaaaaaaacaacaaaaacaacaaaaaaaaaaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaAafnaaabGDbJabGFaaabGDbJabGFaacbGDbJabGFaaabGDbJabGFaacaacaacaacbNUbNVbNVbNVbNVbNWbNXbNYbNZbOabObbOcbMRbOdbMTbLIbLJbLIbOebOfbLNbLNbOgbLPbKxaVxbOhbGSbOibOjbOkbOlbOmbOnbKBbOobOpbOqbOrbOsbOtbOubOvbOwbOxbMdbOybNpbOzbNpbNpbOAbOBbHnbNtbOCbODbOEbOFbOGbOHbOIbOIbOJbOKbOLbOMbONbOObMrbOPbLdbOQbNHbNHbOQbLfbNJbORbOSbOTbOUbLgbOVbjybOWbNRbOXbOYbjwbOZbPabPbbPbbPcbMMaaaaaaaacaaaaacagkaaaaaaaacbPdbPebPfbPgbPhaacafnaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaabGDbJabGFaaabGDbJabGFaaabGDbJabGFaacbGDbJabGFaacaaabNUbNUbNUbPibPjbPkbPlbEqbPmbPnbPobMTbMTbPpbMRbPqbMTbMUbPrbPsbLNbLNbLNbLNbLNbPtbKxaVxbhAbGSbPubPvbPvbPvbPwbPxbPxbPybPzbPAbPxbPxbPxbPxbPxbPxbPxbKKbPBbPCbPDbNpbPEbKKbPFbPGbMkbPHbPIbPJbPIbPKbPLbPMbPNbPObPPbPQbPRbPSbPTbMrbwfbLdbNGbPUbPVbNIbLfbNJbMxbPWbNLbPXbLgbPYbjybPZbQabQbbiibjwbQcbQdbQebQfbNRbMMaacaaaaaaaaaaaaaaaaaaaaaaacbQgbQhbQiaekaelaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbQjbQkbQlbQmbQnbQlbQmbQmbQnbQlbQmbQmbQnbQlbQmbQmbQnbQlbQmbQobQpbQqbQpbQrbQsbQtbQubQvbMTbMTbMTbMTbQwbQxbQybQzbMTbLIbQAbLNbLNbLNbQBbQCbQCbQDbQEbQFbQGbGSbOibOibOibQHbQIbPxbQJbQKbQLbQMbQNbQObQObQPbQQbQRbQSbKKbKKbKKbKKbQTbQUbKKbQVbQWbHnbQXbHnbQYbHnbHnbQZbRabRbbMrbRcbRdbRebPSbPTbMrbwfbLdbNGbRfbRgbNIbLfbwgbMxbRhbRibRjbRkbRlbjybRmbRnbRobRnbRpbRqbRrbRrbRsbRtbMMaacaacaaaaaaaaaaaaaaaaaaaaabRubRvaaaaacbRuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbGDbRwbGFaaabGDbRwbGFaacbGDbRwbGFaaabGDbRwbGFaacaaabNUbNUbNUbRxbRybRzbNVbRAbMTbRBbRCbRDbREbRFbRGbRHbRIbRJbRKbRLbRMbRNbRObLNbOgbLPbKxbRPbqxbGSbGSbGSbGSbGSbGTbPxbRQbRRbRSbRTbRUbRVbRWbRXbRYbRZbSabSbbScbSdbKKbSebSfbKKbSgbShbSibSjbSkbHnbSlbSmbSnbSobSpbMrbSqbSrbMrbMrbMrbMrbSsbStbSubSubSubSubSvbSwbLgbLgbSxbLgbLgbSybjybSzbSAbSBbSCbjwbSDbSEbSFbSGbSHbMMaacaaaaaaaaaaaaaaaaaaaaaaaabRubRvaaaaacbRuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaAaacaaabGDbRwbGFaaabGDbRwbGFaaabGDbRwbGFaacbGDbRwbGFaacaacaacaacbNUbNVbNVbNVbNVbSIbMTbSJbSKbMTbSLbSMbSNbSObMTbSPbLJbSQbSRbSSbLNbLNbMYbLPbKxaVxbqxbSTaaaaacaaabSUbScbPxbPxbSVbSWbPxbSXbSYbSWbSWbSXbSZbSWbSUbTabScbKKbKKbKKbKKbTbbTcbTdbTebTfbTgbThbTibTjbTkbTbbTlbTmbTnbTobTpbTobTqbwgbwgbTrbwgbwgbwgbwgbwgbTqbTobTsbjwbTtbTubTvblEblEblEblEblEbTwbjwbjwbMMbMMbMMaacaacaaaaaaaaaaaaaaaaaaaaabRubRvaaaaacbRuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbGDbRwbGFaaabGDbRwbGFafnbGDbRwbGFaacbGDbRwbGFaaaaacaacaacaacaacaaaaacbEpbEqbMTbTxbTybMTbTzbTAbTBbTCbTDbTEbTFbTGbTHbTIbLNbLNbMYbLPbKxaVxbTJbSTaacaacaaabSUbPxbPxbTKbTLbTMbPxbTNbTObTPbSWbTQbTObTRbSUbScbScbScbTSbScbPxbTTbTUbTVbTWbTXbTYbTZbUabUbbUcbUdbTlbUebUfbwgbUgbwgbwgbwgbwgbUhbUibUibUibUjbUkbUkbUlbUmbUnbUobUpbUqbUrbUsbUtbijbfVbUubMMaacaacaacaaaaacaaaaaaaaaaaaaaaaaaaaaaaabUvbRvaaaaacbUvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahJaaabGDbRwbGFaaabGDbRwbGFaacbGDbRwbGFaaabGDbRwbGFaacaacaaaafnaaaaaaaaaaaabEpbEqbMTbMTbUwbMTbMTbMTbUxbUxbMTbLIbUybUzbUAbUAbUBbUBbUAbUAbUCbUDbUEbUzbUzaacaacbSUbUFbPxbUGbUHbUIbPxbUGbTObUJbSWbUGbTObUKbSUbULbUMbUNbSUbUObPxaaaaacaaabUPbUbbUcbUbbUdaacaaaaaabLebUebUfbUQbURbUSbUTbUUbUVbUWbUXbUYbUTbUZbUTbVabUfbVbbVcbVdbVebVfbVgbVhbVibVibVibVjbViaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabRubRvaaaaacbRuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaAaacaaabGDbRwbGFaaabGDbRwbGFaaabGDbRwbGFaacbGDbRwbGFaacaacaacaacbNUbNVbNVbNVbNVbSIbMTbSJbSKbMTbSLbSMbSNbSObMTbSPbLJbSQbSRbSSbLNbLNbMYbLPbKxaVxbqxbSTaaaaacaaabSUbVZbPxbPxbSVbSWbPxbSXbSYbSWbSWbSXbSZbSWbSUbTabScbKKbKKbKKbKKbTbbTcbTdbTebTfbTgbThbTibTjbTkbTbbTlbTmbTnbTobTpbTobTqbwgbwgbTrbwgbwgbwgbwgbwgbTqbTobTsbjwbTtbTubTvblEblEblEblEblEbTwbjwbjwbMMbMMbMMaacaacaaaaaaaaaaaaaaaaaaaaabRubRvaaaaacbRuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbGDbRwbGFaaabGDbRwbGFafnbGDbRwbGFaacbGDbRwbGFaaaaacaacaacaacaacaaaaacbEpbEqbMTbTxbTybMTbTzbTAbTBbTCbTDbTEbTFbTGbTHbTIbLNbLNbMYbLPbKxaVxbTJbSTaacaacaaabSUbPxbPxbTKbTLbTMbPxbTNbWObTPbSWbTQbTObTRbSUbScbScbScbTSbScbPxbTTbTUbTVbTWbTXbTYbTZbUabUbbUcbUdbTlbUebUfbwgbUgbwgbwgbwgbwgbUhbUibUibUibUjbUkbUkbUlbUmbUnbUobUpbUqbUrbUsbUtbijbfVbUubMMaacaacaacaaaaacaaaaaaaaaaaaaaaaaaaaaaaabUvbRvaaaaacbUvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahJaaabGDbRwbGFaaabGDbRwbGFaacbGDbRwbGFaaabGDbRwbGFaacaacaaaafnaaaaaaaaaaaabEpbEqbMTbMTbUwbMTbMTbMTbUxbUxbMTbLIbUybUzbUAbUAbUBbUBbUAbUAbUCbUDbUEbUzbUzaacaacbSUbUFbPxbUGbUHbUIbPxbUGbTObUJbSWbXybTObUKbSUbULbUMbUNbSUbUObPxaaaaacaaabUPbUbbUcbUbbUdaacaaaaaabLebUebUfbUQbURbUSbUTbUUbUVbUWbUXbUYbUTbUZbUTbVabUfbVbbVcbVdbVebVfbVgbVhbVibVibVibVjbViaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabRubRvaaaaacbRuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaabGDbVkbGFaaabGDbVkbGFaacbGDbVkbGFaaabGDbVkbGFaaaaaAaaaaaaaaaaaaaaaaaabEpbVlbNZbVmbOabVnbVobVpbMYbMYbMYbMUbVqbUzbVrbVsbVtbVtbVtbVtbVubVvbVwbVxbUzaacaaabSUbVybPxbPxbVzbPxbPxbPxbVAbPxbSWbPxbVBbPxbSUaUnbVCaUnbSUbTSbPxaaaaacaaaaacaaaaacaaaaaaaacaaaaaabLebUebUfbVDbTlbTlbTlbVEbVEbVEbVEbVEbTlbTlbTlbVFbUfbVGbVHbVIbVJbVKbVLbVMbVNbVNbVNbVObViaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabRubRvaaaaacbRuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaabGDbRwbGFaaabGDbRwbGFaaabGDbRwbGFaacbGDbRwbGFaaaaaAaaaaaaaaaaaaaaaaacbEpbVPbVQbVRbVSbVTbVUbKvbMYbMYbVVbLIbUybUzbVWbVvbVvbVvbVvbVvbVubVvbVXbVYbUzaaaaaabSUbVZbWabTObUHbWbbTObTObTObTObWcbTObTObWdbSUaUnbWeaUnbSUabDbWfaaaaacafnaaaaaaaacaaaaaaaacaaaaaabLebWgbWhbWibVEaaabWjbWkbWlbWlbWlbWmbWnaaabVEbWobWpbWqbVibWrbWsbWtbWubWvbWwbWxbWybVNbViaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUvbRvaaaaacbUvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaabGDbRwbGFaaabGDbRwbGFaaabGDbRwbGFaaabGDbRwbGFaaaaaAaaaaaaaaaaaaaaaaacbEpbEpbEpbWzbWAbWzbEpbKvbKvbWBbKvbWCbWDbWEbWFbWGbVvbVvbVvbVvbWHbWIbWJbWKbUzaaaaaabSUbWLbWMbTObUHbTObTObWNbTObTObWObTObTObWPbSUaWybdaaWzaaaabDaacaaaaacaaaaaaaaaaaaaaaafnaaaaaaaacbLebWQbWRbWSbVEbVEbWTaSlbWUbWUbWUaSobWVbVEbVEbWSbWWbVGbWXbWYbWsbWZbXabXbbXcbXdbXebVNbViaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabRubRvaaaaacbRuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahJaaabGDbXfbGFaaabGDbXfbGFaacbGDbXfbGFaaabGDbXfbGFaaaaaAaacaaaaaaaacaacaacaacaacbEpbXgbXhbXgbEpaacbKvbXibXjbXkbXlbUzbXmbXnbXobXpbXqbXrbXsbXtbXubXvbUzaacaacbSUbSUbSUbXwbXxbTObTObXybXzbXAbTObXBbTObXCbSUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbVEbWQbUfbXDbXEbXDbXFaTzaTzaTzaTzaTzbXFbXDbXEbXDbUfbVGbWXbWsbXGbWsbWsbXHbXIbXJbXKbVNbViaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabRubRvaaaaacbRuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaacaacaaaaaaaaaaacaaaaaaaaaaaaaacaaaaaaaaaaacaaaaaAaacaacaacaacaaaaaaaaaaacbEpbEpbEpbEpbEpaaabKvbXLbXjbXjbXjbUzbXMbXNbXObXPbXQbXRbXSbXTbXUbXVbUzaaaaacbWfaacbSUbXWbXXbTObXAbXYbXZbTObTObXAbYabSUbSUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVEbYbbWRbVEbVEbVEaVAaTzbYcbYcbYcbYdaVAbVEbVEbVEbWWbYebVibYfbYgbYhbYibYjbYkbYlbVNbVNbViaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabRubRvaaaaacbRuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaAaaAaaAaaAaaAahJaaAaaAaaAaaAaaAaaAahJahJaaAaaAaaAahJaacaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaacaaaaacaaaaaabUzbXMbVvbVvbVvbVvbYmbVvbVvbVvbYnbUzaacagkaacaiabSUbYobYpbTObTObYqbTObTObTObTObYrbSUaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbVEbYsbYtbYubYvbVEaTAbYwaTzaTzaTzbYxaTAbVEbYybYubYzbYAbVibVibVibVibVibVibVibVibVibVibViaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYBbYCbYDbYEbYFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafnaaaaaaaaaaacaaaaaabUzbYGbVvbVvbVvbVvbVvbVvbVvbVvbYHbYIaaaaaaaacaiabSUbYJbYKbTObTObYLbYMbYNbYObYPbSUbYQaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbVEbYsbUfbwgbYRbVEaSmbYSbYcbYcbYcaTzaSmbVEbYTbwgbUfbwgbUgbwgbYUbwgbYVbYWbTlaacaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYXbYYbYZbZabZbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafnaaabUzbZcbVvbZdbVvbZdbZebZdbZdbZdbYHbYIaacaacaacaaabSUbZfbZgbTObTObZhbZibScbScbZjbSUaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbLebZkbZlbwgbZmbVEaSmbZnaTzbZoaTzaTzaSmbVEbZpbwgbZlbwgbUgbUTbUTbwgbUTbZqbTlaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaAaaBaacbZrbZsbZtbZubZraacaaBaaAaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUzbYIbZvbZwbZxbYIbYIbYIbYIbZwbZxbYIaaaaaaaacaaabSUbSUbZybZzbTObZAbZBbZCbZBbZDbSUaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbVEbYsbUQbUTbZEbVEaVAbZFbYcbYcbYcbZGaVAbVEbZHbUTbVabZIbZJbVEbVEbZKbVEbVEbTlaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaaaaacaaabZrbZLbZMbZNbZObZPaacaaaaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaabGDbRwbGFaaabGDbRwbGFaaabGDbRwbGFaacbGDbRwbGFaaaaaAaaaaaaaaaaaaaaaaacbEpbVPbVQbVRbVSbVTbVUbKvbMYbMYbVVbLIbUybUzbXzbVvbVvbVvbVvbVvbVubVvbVXbVYbUzaaaaaabSUbXYbWabWObUHbWbbTObTObTObTObWcbTObWObWdbSUaUnbWeaUnbSUabDbWfaaaaacafnaaaaaaaacaaaaaaaacaaaaaabLebWgbWhbWibVEaaabWjbWkbWlbWlbWlbWmbWnaaabVEbWobWpbWqbVibWrbWsbWtbWubWvbWwbWxbWybVNbViaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUvbRvaaaaacbUvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaabGDbRwbGFaaabGDbRwbGFaaabGDbRwbGFaaabGDbRwbGFaaaaaAaaaaaaaaaaaaaaaaacbEpbEpbEpbWzbWAbWzbEpbKvbKvbWBbKvbWCbWDbWEbWFbWGbVvbVvbVvbVvbWHbWIbWJbWKbUzaaaaaabSUbWLbWMbTObUHbTObTObWNbTObTObXZbTObTObWPbSUaWybdaaWzaaaabDaacaaaaacaaaaaaaaaaaaaaaafnaaaaaaaacbLebWQbWRbWSbVEbVEbWTaSlbWUbWUbWUaSobWVbVEbVEbWSbWWbVGbWXbWYbWsbWZbXabXbbXcbXdbXebVNbViaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabRubRvaaaaacbRuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahJaaabGDbXfbGFaaabGDbXfbGFaacbGDbXfbGFaaabGDbXfbGFaaaaaAaacaaaaaaaacaacaacaacaacbEpbXgbXhbXgbEpaacbKvbXibXjbXkbXlbUzbXmbXnbXobXpbXqbXrbXsbXtbXubXvbUzaacaacbSUbSUbSUbXwbXxbTObTObYdbYLbXAbTObXBbTObXCbSUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbVEbWQbUfbXDbXEbXDbXFaTzaTzaTzaTzaTzbXFbXDbXEbXDbUfbVGbWXbWsbXGbWsbWsbXHbXIbXJbXKbVNbViaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabRubRvaaaaacbRuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaacaacaaaaaaaaaaacaaaaaaaaaaaaaacaaaaaaaaaaacaaaaaAaacaacaacaacaaaaaaaaaaacbEpbEpbEpbEpbEpaaabKvbXLbXjbXjbXjbUzbXMbXNbXObXPbXQbXRbXSbXTbXUbXVbUzaaaaacbWfaacbSUbXWbXXbTObXAbYMbYObTObTObXAbYabSUbSUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVEbYbbWRbVEbVEbVEaVAaTzbYcbYcbYcaTzaVAbVEbVEbVEbWWbYebVibYfbYgbYhbYibYjbYkbYlbVNbVNbViaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabRubRvaaaaacbRuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaAaaAaaAaaAaaAahJaaAaaAaaAaaAaaAaaAahJahJaaAaaAaaAahJaacaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaacaaaaacaaaaaabUzbXMbVvbVvbVvbVvbYmbVvbVvbVvbYnbUzaacagkaacaiabSUbYobYpbTObTObYqbTObTObTObWObYrbSUaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbVEbYsbYtbYubYvbVEaTAbYwaTzaTzaTzbYxaTAbVEbYybYubYzbYAbVibVibVibVibVibVibVibVibVibVibViaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYBbYCbYDbYEbYFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafnaaaaaaaaaaacaaaaaabUzbYGbVvbVvbVvbVvbVvbVvbVvbVvbYHbYIaaaaaaaacaiabSUbYJbYKbTObTObYPbZfbYNbZAbYPbSUbYQaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbVEbYsbUfbwgbYRbVEaSmbYSbYcbYcbYcaTzaSmbVEbYTbwgbUfbwgbUgbwgbYUbwgbYVbYWbTlaacaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYXbYYbYZbZabZbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafnaaabUzbZcbVvbZdbVvbZdbZebZdbZdbZdbYHbYIaacaacaacaaabSUbZBbZgbTObTObZhbZibScbScbZjbSUaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbLebZkbZlbwgbZmbVEaSmbZnaTzbZoaTzaTzaSmbVEbZpbwgbZlbwgbUgbUTbUTbwgbUTbZqbTlaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaAaaBaacbZrbZsbZtbZubZraacaaBaaAaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUzbYIbZvbZwbZxbYIbYIbYIbYIbZwbZxbYIaaaaaaaacaaabSUbSUbZybZzbWObZDcccbZCcccccdbSUaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbVEbYsbUQbUTbZEbVEaVAbZFbYcbYcbYcbZGaVAbVEbZHbUTbVabZIbZJbVEbVEbZKbVEbVEbTlaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaaaaacaaabZrbZLbZMbZNbZObZPaacaaaaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbYIbZQbYIbZQbYIaacaaaaacbYIbZQbYIaaaaaaaaaafnaacbSUbZRbZSbZTbZSbZTbZSbZTbSUbSUaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVEbYsbZUbVEbVEbVEaTAbZVaTzaTzaTzaTzaTAbVEbVEbVEbZWbZXbVEaacbVEbXEbVEaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaabZYbZYbZYbZZcaacabcaccaccaccadbZYaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbYIbZQbYIbZQbYIaacaacaacbYIbZQbYIaaaaaaaaaaaaaaaaaaaacaaaaaaaacaaaaaaaacaacaacaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafnaaabVEbYsbwgbXDbXEbXDbXFaTzbYcbYcbYcaTzcaebXDbXEbXDbwgbZXbVEaaabWSbZKbVEaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaBaacbZYcafcagcahcaicajbZrcakcalcambZYaacaaBaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYIbZvcanbZxbYIaaaaacaaacanbZxbYIaaaaaaaaaaaaaaaaaaaacaacaaaaaaaaaaaaaaaaacaiaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbVEbUTbWibWSbVEbVEaVAaTzaTzaTzaTzaTzaVAbVEbVEbWSbWobUTbVEaaaaaacaoaaaaaaaaaafnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaabZYcapcaqcarcascatcaucavcawcaxbZYaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -5770,3 +5772,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} + diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 7d2e2dfb590..5a0ff4026b1 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -217,7 +217,7 @@ "aei" = (/obj/machinery/camera{c_tag = "Security Escape Pod"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "aej" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/space) "aek" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/space) -"ael" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/space) +"ael" = (/turf/space,/turf/simulated/shuttle/wall{dir = 2; icon_state = "swall_f10"; layer = 2},/area/space) "aem" = (/obj/structure/cable,/obj/machinery/power/solar{id = "auxsolareast"; name = "Port Auxiliary Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/auxstarboard) "aen" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/solar{id = "auxsolareast"; name = "Port Auxiliary Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/auxport) "aeo" = (/obj/structure/cable,/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxport) @@ -298,7 +298,7 @@ "afL" = (/obj/structure/sign/pods{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/security/main) "afM" = (/obj/structure/closet/emcloset,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "afN" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/space) -"afO" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/space) +"afO" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/space) "afP" = (/obj/structure/cable,/obj/machinery/power/solar{id = "auxsolareast"; name = "Port Auxiliary Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/auxport) "afQ" = (/obj/machinery/door/airlock/glass_security{name = "Insanity Ward"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/prison) "afR" = (/turf/simulated/wall,/area/security/brig) @@ -489,7 +489,7 @@ "aju" = (/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 5},/area/crew_quarters/courtroom) "ajv" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/crew_quarters/courtroom) "ajw" = (/obj/machinery/door/window/southleft{name = "Court Cell"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom) -"ajx" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/space) +"ajx" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/space) "ajy" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 1},/area/security/processing) "ajz" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel,/area/security/processing) "ajA" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/security/processing) @@ -719,7 +719,7 @@ "anQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "anR" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "anS" = (/turf/simulated/floor/plating,/area/maintenance/fpmaint2) -"anT" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/space) +"anT" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/space) "anU" = (/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/plating,/area/space) "anV" = (/obj/machinery/door/airlock/glass_security{name = "N2O Storage"; req_access_txt = "3"},/turf/simulated/floor/plating,/area/security/processing) "anW" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/security/processing) @@ -1511,8 +1511,8 @@ "aDc" = (/obj/structure/closet/wardrobe/mixed,/turf/simulated/shuttle/floor,/area/space) "aDd" = (/obj/structure/closet/wardrobe/grey,/turf/simulated/shuttle/floor,/area/space) "aDe" = (/obj/machinery/requests_console{department = "Arrival shuttle"; pixel_y = 30},/turf/simulated/shuttle/floor,/area/space) -"aDf" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/space) -"aDg" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 8},/turf/space,/area/space) +"aDf" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 8},/turf/simulated/shuttle/floor{icon = 'icons/turf/floors.dmi'; icon_state = "dark"},/area/space) +"aDg" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/floor{icon = 'icons/turf/floors.dmi'; icon_state = "dark"},/area/space) "aDh" = (/obj/machinery/power/apc{dir = 4; name = "Entry Hall APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable,/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry) "aDi" = (/obj/structure/closet,/obj/item/weapon/crowbar,/obj/item/device/flash/handheld,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/checkpoint2) "aDj" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/security/checkpoint2) @@ -1573,7 +1573,7 @@ "aEm" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/space) "aEn" = (/turf/simulated/shuttle/wall{icon_state = "swall1"; dir = 2},/area/space) "aEo" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark{name = "JoinLate"},/turf/simulated/shuttle/floor,/area/space) -"aEp" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space,/area/space) +"aEp" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/simulated/shuttle/floor{icon = 'icons/turf/floors.dmi'; icon_state = "dark"},/area/space) "aEq" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry) "aEr" = (/obj/machinery/camera{c_tag = "Security Checkpoint"; dir = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light_switch{pixel_x = 6; pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/checkpoint2) "aEs" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/checkpoint2) @@ -1805,7 +1805,7 @@ "aIK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "aIL" = (/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main) "aIM" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/shuttle/floor,/area/space) -"aIN" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 8},/turf/space,/area/space) +"aIN" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 8},/turf/simulated/shuttle/floor{icon = 'icons/turf/floors.dmi'; icon_state = "dark"},/area/space) "aIO" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 2},/area/hallway/secondary/entry) "aIP" = (/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/hallway/secondary/entry) "aIQ" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/secondary/entry) @@ -6532,11 +6532,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaztaqpazuatBavMavMavMavMavMavMatBazuavMaqpazvazwamHazxazyazzazAatGazBayuazCazDazEazFazGazHazCayuazIazJazKawdawdawdawdawdazLazMaxoaafazNazNazOazNazPazNazNaafaxoaxuaxvazQazRazSazTazQaxvazUazVazWazXazYazZaAaaAbaAcaAdaAeaAfayOayOayOaAgayQamwaAhacAaeUapTapTapTapTapTaAiaAjaAkayZayZayZayZayZaAlaAmaAnayZapWapWapWapWaAoaApapWaydaqcaqcaqcaqcaqcaydapWallamlaAqazhallaArallamlamlallamlarjallamlamlallamlamlallarjasjallamlamlallaAsamlarjawSaAtaroaroaroaroaroaroaroaroaroabtabtabtabtabtaafaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaylavMaaIaaIaaIaaIavMaylavMaaaaqpaAuaysaAvaAvaAwaAxaAvaAvaAyayuazCazEaAzaAAazEazEazCayuaqCaABaACaADaADaADaADaADaADaADaAEaaaazNaAFaAGaAHaAIaAJazNaaaaxoaxuaxvazQaAKaALaAMazQaxvawaazLaxxaANaAOaAPaAQaARaAbaASaATayOayOaAUayOaAgayQamwayRacAaeUapTaqOaqPaAVaqRaxOaAWayZaAXaAmaAYaAYayZaAlaAZaAnayZaBaaBbaBcaBdaBeaApaafaBfaBgaBgaBgaBgaBgaBhaaaallamlaBiaBjallallallallallallaBkaBlallallallallallallaBmaBnaBoaBpaBpaBpaBqaBraBsaBtaBuaBvaBwaBxaByaBzaBAaBBaBCaBDaBDaBDaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaajxaekaBEaekaeZaeZaeZaeZaekaBEaBFaelaqpaBGaBHaBIaBJaBKaBLaBMaBNaBOayuazCazEazEaBPazEazEazCayuaBQaBRaBSaBTaBUaBVaBWaBXaBYaBZaAEaafazNaCaaCbaCcaCdaCeazNaafaxoaxuaxvaCfaCgaChaCiaCjaxvapNaCkaxxaClaCmaCnayOaCnaCoaCpaCqaCraAgaxKaCsaxKayQamwayRacAaeUapTarQarRarSaCtarUaCuayZaCvaAmaAmaAmazaaCwaCxaCyayZaCzaCAaCBaCCaCDaApaaaaafaaaaafaaaaafaaaaafaaaallavuaCEaBsaCFaCGallasiamlavuarjamlallaaaallawTaBsaBsaCHaCIaCJaCJaCJaCJaCJaCKaCLaCMaCNaCOaCOaCOaCPaCQaCRaCSaCTaCUaCVaCWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajxaekaekaCXaCYalQaCZaDaaDbaDcaDdaDealQaDfaDgavMaBGaDhaAvaDiaDjaDkaDlaDmaDnayuaDoazEazEazEazEaDpaDqaDraDsaDtaDuaBYaBYaBYaBYaBYaBYaBYaAEaaaazNaDvaDwaDxaDyaDzazNaaaaxoaxuaxvaDAaDBaDCaDDaDEaxvapNaDFaxxaxxaDGaATaDHaATaDIaxxaxxaDJaDKaxKaDLaxKayQamwayRacAaeUapTapTapTapTapTaDMaDNaDOaDPaDQaDRaDRaDRaDSayZaDTayZaDUaDVaDWaBdaBeaApallallallallallallallallallallallallallaDXallallallallawTaBtaDYaDZaEaaDZaEbaEcaEdaEdaEeaEfaEfaEfaEfaEfaEgaEhaEiaEiaEiaEiaEiaEiaBDaEjaEkaElaBDaBDaBDaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZaEmaEmaEnalQaEoalQaEoalQaEoalQaEoalQaDfaEpavMaBGaEqaAvaEraEsaEtaEuaEvaEwayuaExazEaEyaEzaEzaEAaEBaECaEDaEEaEFaEGaEGaEGaEGaEGaEHaEIaAEaafazNaEJaDwaEKaELaEMazNaafaxoaENaEOaEPaEQaDCaERaESaETaEUaEVaxKaEWaEXaDJaDJaDJaEYaEZaxKaFaaFaaxKaDJaxKaFbaoeaFcacAaeUaeUaeUaeUaeUamXawvaFdaFeaFfaFgaFeaFhaFeaFiaFeaFjayZaFkaFlaFmaBdaFnaFoaFpaFqaFraFsaFtaFuaFuaFuaFuaFvaFwaFuaFuaFxaFyaFzaFAaBpaFBaFCaFDaFEaFFaFEaFGaFHaEfaEfaFIaEfaFJaFKaFLaEfaEiaFMaEiaFNaFOaFPaFQaFRaFSaFTaFUaFVaFWaFXaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZalQalQaGaalQaEoalQaEoaGbaEoalQaEoalQaDfaEpavMaBGaGcaAvaAvaGdaGeaGfaGgaAvayuayuayuayuaGhazEazEaGiayuaGjaGkaBYaBYaBYaGlaBYaBYaBYaGmaAEaaaazNazNaGnaGoaGnazNazNaaaaxoaxuaxvaGpaGqaGraGsaGtaxvapNaGuaxKaGvaEXaDJaDJaDJaEYaGwaxKaAgaAgaxKaCsaxKaGxaGyaGzacAamXacAacAacAacAacAaGAaGBayZaGCaAmayZaGDayZaGEayZaGFayZaGGaGHaFmaBdaGIaGJaGKaGLaGMaGMaGNaGMaGMaGOaGMaGPaGQauwauwauwauwaGRaGSaGTaGUaGVamlaGWaGWaGWaGWaGXaEfaGYaGZaHaaHbaHcaHdaEfaHeaHfaEiaHgaHhaHiaHjaFRaHkaEjaEkaCTaHlaHmaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZaHnaHnaHoalQaEoalQaEoalQaEoalQaEoalQaDfaEpavMaHpaHqaHraHsaHsaHtaHuaxaaHvaHwaHxaHyayuaHzazEazEaHAayuaHBaHCaBYaHDaHEaHFaHGaHHaHIaHJaAEaaaaafaaaaHKaHLaHKaaaaafaaaaxoaxuaxvaDCaHMaHNaHOaHPaxvapNasJaxKaHQaHRaDJaDJaDJaHSaHTaxKaaaaaaaHUaHVaHWaHXaHYaHZaIaaIbaHUaaaaaaaIcaIdaIeaIfayZaIgaAmaAmaAmaCxaAmaAmaAmayZaBdaIhaIiaBdaBdaApaIjaIkaIkaIlaImaInaIkaIoaIkaIpaIqaIpaIraIpaIsaGWaGWaItaGWaGWaGWaGWaIuaIvaGWaGXaEfaGZaIwaIxaIyaIzaIAaEfaIBaICaIDaIEaIFaIGaIHaIIaIJaBAaIKaFVaFWaILaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanTaekaekaCXaCYalQalQalQalQalQalQaIMalQaDfaINavMaBGaxaaIOaIPaIPaIPaIPaIPaIPaIPaIQaxaayuaIRaISaIRayuayuaITaIUaIVaADaADaADaADaIVaIWaIXaAEaIYaIZaIZaJaaJbaJaaIZaIZaJcaxoaJdaxvaJeaxvaJfaJfaJgaxvaJhaJiaxKaxKaxKaAgaDHaAgaxKaxKaxKaHUaHUaHUaJjaHYaHYaHYaHYaHYaJkaHUaHUaHUaIcaJlaIeaJmayZayZayZayZayZayZayZayZayZayZaJnaJoaJpaJqaJraJsaJtaJuaIkaJvaImaJwaJxaJwaIpaJyaJzaIpaJAaIpaJBaJCaJDaJEaJFaJFaJFaJGaJHaJIaGWaGXaEfaJJaIwaJKaIyaIzaJLaEfaJMaJNaJOaJPaJQaJRaJSaJTaJUaJVaJWaCTaHlaHmaFYaaaaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajxaekaekaCXaCYalQaCZaDaaDbaDcaDdaDealQaDgaDfavMaBGaDhaAvaDiaDjaDkaDlaDmaDnayuaDoazEazEazEazEaDpaDqaDraDsaDtaDuaBYaBYaBYaBYaBYaBYaBYaAEaaaazNaDvaDwaDxaDyaDzazNaaaaxoaxuaxvaDAaDBaDCaDDaDEaxvapNaDFaxxaxxaDGaATaDHaATaDIaxxaxxaDJaDKaxKaDLaxKayQamwayRacAaeUapTapTapTapTapTaDMaDNaDOaDPaDQaDRaDRaDRaDSayZaDTayZaDUaDVaDWaBdaBeaApallallallallallallallallallallallallallaDXallallallallawTaBtaDYaDZaEaaDZaEbaEcaEdaEdaEeaEfaEfaEfaEfaEfaEgaEhaEiaEiaEiaEiaEiaEiaBDaEjaEkaElaBDaBDaBDaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZaEmaEmaEnalQaEoalQaEoalQaEoalQaEoalQaDgaEpavMaBGaEqaAvaEraEsaEtaEuaEvaEwayuaExazEaEyaEzaEzaEAaEBaECaEDaEEaEFaEGaEGaEGaEGaEGaEHaEIaAEaafazNaEJaDwaEKaELaEMazNaafaxoaENaEOaEPaEQaDCaERaESaETaEUaEVaxKaEWaEXaDJaDJaDJaEYaEZaxKaFaaFaaxKaDJaxKaFbaoeaFcacAaeUaeUaeUaeUaeUamXawvaFdaFeaFfaFgaFeaFhaFeaFiaFeaFjayZaFkaFlaFmaBdaFnaFoaFpaFqaFraFsaFtaFuaFuaFuaFuaFvaFwaFuaFuaFxaFyaFzaFAaBpaFBaFCaFDaFEaFFaFEaFGaFHaEfaEfaFIaEfaFJaFKaFLaEfaEiaFMaEiaFNaFOaFPaFQaFRaFSaFTaFUaFVaFWaFXaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZalQalQaGaalQaEoalQaEoaGbaEoalQaEoalQaDgaEpavMaBGaGcaAvaAvaGdaGeaGfaGgaAvayuayuayuayuaGhazEazEaGiayuaGjaGkaBYaBYaBYaGlaBYaBYaBYaGmaAEaaaazNazNaGnaGoaGnazNazNaaaaxoaxuaxvaGpaGqaGraGsaGtaxvapNaGuaxKaGvaEXaDJaDJaDJaEYaGwaxKaAgaAgaxKaCsaxKaGxaGyaGzacAamXacAacAacAacAacAaGAaGBayZaGCaAmayZaGDayZaGEayZaGFayZaGGaGHaFmaBdaGIaGJaGKaGLaGMaGMaGNaGMaGMaGOaGMaGPaGQauwauwauwauwaGRaGSaGTaGUaGVamlaGWaGWaGWaGWaGXaEfaGYaGZaHaaHbaHcaHdaEfaHeaHfaEiaHgaHhaHiaHjaFRaHkaEjaEkaCTaHlaHmaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZaHnaHnaHoalQaEoalQaEoalQaEoalQaEoalQaDgaEpavMaHpaHqaHraHsaHsaHtaHuaxaaHvaHwaHxaHyayuaHzazEazEaHAayuaHBaHCaBYaHDaHEaHFaHGaHHaHIaHJaAEaaaaafaaaaHKaHLaHKaaaaafaaaaxoaxuaxvaDCaHMaHNaHOaHPaxvapNasJaxKaHQaHRaDJaDJaDJaHSaHTaxKaaaaaaaHUaHVaHWaHXaHYaHZaIaaIbaHUaaaaaaaIcaIdaIeaIfayZaIgaAmaAmaAmaCxaAmaAmaAmayZaBdaIhaIiaBdaBdaApaIjaIkaIkaIlaImaInaIkaIoaIkaIpaIqaIpaIraIpaIsaGWaGWaItaGWaGWaGWaGWaIuaIvaGWaGXaEfaGZaIwaIxaIyaIzaIAaEfaIBaICaIDaIEaIFaIGaIHaIIaIJaBAaIKaFVaFWaILaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanTaekaekaCXaCYalQalQalQalQalQalQaIMalQaDgaINavMaBGaxaaIOaIPaIPaIPaIPaIPaIPaIPaIQaxaayuaIRaISaIRayuayuaITaIUaIVaADaADaADaADaIVaIWaIXaAEaIYaIZaIZaJaaJbaJaaIZaIZaJcaxoaJdaxvaJeaxvaJfaJfaJgaxvaJhaJiaxKaxKaxKaAgaDHaAgaxKaxKaxKaHUaHUaHUaJjaHYaHYaHYaHYaHYaJkaHUaHUaHUaIcaJlaIeaJmayZayZayZayZayZayZayZayZayZayZaJnaJoaJpaJqaJraJsaJtaJuaIkaJvaImaJwaJxaJwaIpaJyaJzaIpaJAaIpaJBaJCaJDaJEaJFaJFaJFaJGaJHaJIaGWaGXaEfaJJaIwaJKaIyaIzaJLaEfaJMaJNaJOaJPaJQaJRaJSaJTaJUaJVaJWaCTaHlaHmaFYaaaaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanTaekaJXaekaeZaeZaeZaeZaekaBEaJYafOaqpaJZaxaaKaaKbaKbaKcaKbaKdarpaKeaKfaxaaKgaKhaKiaKiaKjaKiaKkaKlaKiaKiaKiaKiaKiaKiaKiaKmaKnaKoaKpaKqaKqaKraKsaKqaKqaKqaKtaKuaKvaKraKqaKqaKqaKwaGyaKxaHYaKyaKzaHZaIaaIaaIaaHXaHYaHYaKAaHYaKBaKCaKDaKEaKFaKGaKHaKIaHYaHYaKAaKJaKKaKLaKMaKNaKOaKPaKQaHYaKRaHYaBdaKSaKTaKUaJoaKVaKWaKXaKYaKZaLaaIkaLbaLcaLdaLeaLfaIpaLgaJzaLhaLiaIpaGWaLjaLkaLlaLmaLnaLoaLpaLqaLraGWaGXaEfaLsaLtaLuaLvaLwaLxaEfaLyaLzaEiaLAaLAaLAaLAaEiaLBaCRaJWaCTaBDaBDaBDaLCaLCaLCaLDaLDaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaylavMaaIaaIaaIaaIavMaylavMaaaaqpaAuaLEaKaaLFaLGaLHaLHaLIarpaLJaKfaLKaLLaKhaLMaLNaLOaLPaLQaLRaKiaKiaKiaKiaKiaKiaKiaKmaKiaKhaKiaKiaKiaLSaLTaLUaLUaLUaLUaLVaLUaLWaLUaLUaLXaKhaGyaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaKAaHYaLYaLZaMaaMbaMcaMdaMeaMfaHYaHYaKAaHYaHYaHYaHYaHYaHYaHYaHYaHYaMgaHYaBdaKUaKUaKUaMhaMiaMjaMkaMlaMmaMnaIkaMoaImaMpaIkaIkaIpaMqaJzaMraLiaMsaIpaGWaGWaGWaGWaGWaGWaMtaMuaMvaGWaGXaEfaMwaGZaMxaMyaGZaMzaEfaEiaEiaEiaEiaEiaEiaMAaEiaEjaMBaEkaCTaMCaMDaBDaMEaMFaMGaMHaMIaLDaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaztaqpavMatBavMavMavMavMavMavMatBavMavMaqpaBGaxaaKaaMJaMKaLHaLHaLIarpaMLaKfaxaaLLaKhaKiaMMaMNaMNaMNaMOaMPaMQaMNaMRaMNaMNaMNaMSaMNaMTaMNaMNaMNaMUaMVaMWaMXaMXaMYaMZaNaaNbaNcaKiaNdaKhaGyaHYaNeaHYaNfaNfaNfaNfaNfaNfaNfaNfaNgaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNhaNfaNfaNfaNfaNfaNfaNfaNfaHYaHYaHYaBdaNiaNiaNiaNiaNiaNjaNkaJsaKZaNlaIkaNmaNnaNoaIkaNpaIpaNqaNraNsaLiaNtaIpaGWaNuaNvaNwaNxaNwaNyaNzaNAaGWaGXaEfaNBaNBaNCaNDaNEaNEaNFaEfaNGaNHaNIaBDaNJaNKaNLaEjaEjaNMaNNaBDaNOaBDaNPaNQaNRaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm index bbf3f717a71..082608ae120 100644 --- a/code/LINDA/LINDA_fire.dm +++ b/code/LINDA/LINDA_fire.dm @@ -60,7 +60,7 @@ perform_exposure() /obj/effect/hotspot/proc/perform_exposure() - var/turf/simulated/floor/location = loc + var/turf/simulated/location = loc if(!istype(location)) return 0 if(volume > CELL_VOLUME*0.95) bypassing = 1 @@ -89,7 +89,7 @@ just_spawned = 0 return 0 - var/turf/simulated/floor/location = loc + var/turf/simulated/location = loc if(!istype(location)) Kill() return diff --git a/code/controllers/subsystem/shuttles/emergency.dm b/code/controllers/subsystem/shuttles/emergency.dm index 2db8fc516d0..745f23e39a7 100644 --- a/code/controllers/subsystem/shuttles/emergency.dm +++ b/code/controllers/subsystem/shuttles/emergency.dm @@ -49,9 +49,9 @@ if(SSshuttle.emergencyAlwaysFakeRecall) if((seclevel2num(get_security_level()) == SEC_LEVEL_RED)) - SSshuttle.emergencyFakeRecall = rand(0.2, 0.5) + SSshuttle.emergencyFakeRecall = rand(2, 5) * 0.1 else - SSshuttle.emergencyFakeRecall = rand(0.5, 0.8) + SSshuttle.emergencyFakeRecall = rand(5, 8) * 0.1 /obj/docking_port/mobile/emergency/cancel(area/signalOrigin) diff --git a/code/controllers/subsystem/shuttles/supply.dm b/code/controllers/subsystem/shuttles/supply.dm index 5afbc4b3508..0e1ac879780 100644 --- a/code/controllers/subsystem/shuttles/supply.dm +++ b/code/controllers/subsystem/shuttles/supply.dm @@ -292,13 +292,11 @@ temp = "Main Menu

Current approved orders:

" for(var/datum/supply_order/SO in SSshuttle.shoppinglist) temp += "[SO.object.name] approved by [SO.orderedby] [SO.comment ? "([SO.comment])":""]
" - temp += "
Main Menu" else if (href_list["viewrequests"]) - temp = "Current requests:

" + temp = "Main Menu

Current requests:

" for(var/datum/supply_order/SO in SSshuttle.requestlist) temp += "#[SO.ordernum] - [SO.object.name] requested by [SO.orderedby]
" - temp += "
Main Menu" else if (href_list["mainmenu"]) temp = null @@ -493,12 +491,11 @@ temp += "
Main Menu" */ else if (href_list["viewrequests"]) - temp = "Current requests:

" + temp = "Main Menu

Current requests:

" for(var/datum/supply_order/SO in SSshuttle.requestlist) - temp += "#[SO.ordernum] - [SO.object.name] requested by [SO.orderedby] [SSshuttle.supply.mode != SHUTTLE_IDLE ? "":SSshuttle.supply.getDockedId() == "supply_away" ? "":"Approve Remove"]
" + temp += "#[SO.ordernum] - [SO.object.name] requested by [SO.orderedby] [SSshuttle.supply.getDockedId() == "supply_away" ? "Approve Remove" : ""]
" temp += "
Clear list" - temp += "
Main Menu" else if (href_list["rreq"]) var/ordernum = text2num(href_list["rreq"]) diff --git a/code/datums/diseases/advance/symptoms/genetics.dm b/code/datums/diseases/advance/symptoms/genetics.dm index 065bf9d3ed1..0c230968227 100644 --- a/code/datums/diseases/advance/symptoms/genetics.dm +++ b/code/datums/diseases/advance/symptoms/genetics.dm @@ -24,7 +24,7 @@ Bonus transmittable = -3 level = 6 severity = 3 - var/good_mutations = 0 + var/list/possible_mutations var/archived_dna = null /datum/symptom/genetic_mutation/Activate(var/datum/disease/advance/A) @@ -34,12 +34,12 @@ Bonus switch(A.stage) if(4, 5) M << "[pick("Your skin feels itchy.", "You feel light headed.")]" - clean_randmut(M, good_mutations == 1 ? (good_se_blocks | op_se_blocks) : bad_se_blocks, 20) // Give them a random good/bad mutation. - domutcheck(M, null, 1) // Force the power to manifest + clean_randmut(M, possible_mutations) // Give them a random good/bad mutation. return // Archive their DNA before they were infected. /datum/symptom/genetic_mutation/Start(var/datum/disease/advance/A) + possible_mutations = (bad_mutations | not_good_mutations) - mutations_list[RACEMUT] var/mob/living/carbon/M = A.affected_mob if(M) if(!check_dna_integrity(M)) @@ -53,7 +53,7 @@ Bonus if(!check_dna_integrity(M)) return hardset_dna(M, se = archived_dna) - + domutcheck(M) /* ////////////////////////////////////// @@ -79,5 +79,8 @@ Bonus stage_speed = -7 transmittable = -7 level = 6 - good_mutations = 1 - severity = 0 \ No newline at end of file + severity = 0 + +/datum/symptom/genetic_mutation/powers/Start(var/datum/disease/advance/A) + ..() + possible_mutations = good_mutations \ No newline at end of file diff --git a/code/datums/mind.dm b/code/datums/mind.dm index fdd1842460d..af8be78dce7 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -900,7 +900,7 @@ C.dna = changeling.absorbed_dna[1] C.real_name = C.dna.real_name updateappearance(C) - domutcheck(C, null) + domutcheck(C) else if (href_list["nuclear"]) switch(href_list["nuclear"]) diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index 81ba278544f..b5f1279d655 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -19,17 +19,22 @@ /datum/mutation/human/proc/force_give(mob/living/carbon/human/owner) set_block(owner) - on_acquiring(owner) + . = on_acquiring(owner) -/datum/mutation/human/proc/set_se(se_string) +/datum/mutation/human/proc/force_lose(mob/living/carbon/human/owner) + set_block(owner, 0) + . = on_losing(owner) + +/datum/mutation/human/proc/set_se(se_string, on = 1) if(!se_string || lentext(se_string) < DNA_STRUC_ENZYMES_BLOCKS * DNA_BLOCK_SIZE) return var/before = copytext(se_string, 1, (dna_block * DNA_BLOCK_SIZE) + 1) - var/injection = num2hex(lowest_value + rand(1, 256 * 6)) + var/injection = num2hex(lowest_value + (rand(1, 256 * 6) * (on ? 1 : -1))) var/after = copytext(se_string, (dna_block * DNA_BLOCK_SIZE) + DNA_BLOCK_SIZE + 1) return before + injection + after -/datum/mutation/human/proc/set_block(mob/living/carbon/human/owner) - owner.dna.struc_enzymes = set_se(owner.dna.struc_enzymes) +/datum/mutation/human/proc/set_block(mob/living/carbon/owner, on = 1) + if(owner && istype(owner) && owner.dna) + owner.dna.struc_enzymes = set_se(owner.dna.struc_enzymes, on) /datum/mutation/human/proc/check_block_string(se_string) if(!se_string || lentext(se_string) < DNA_STRUC_ENZYMES_BLOCKS * DNA_BLOCK_SIZE) return 0 @@ -160,12 +165,10 @@ /datum/mutation/human/x_ray/on_life(mob/living/carbon/human/owner) owner.sight |= SEE_MOBS|SEE_OBJS|SEE_TURFS owner.see_in_dark = 8 - owner.see_invisible = SEE_INVISIBLE_LEVEL_TWO /datum/mutation/human/x_ray/on_losing(mob/living/carbon/human/owner) if(..()) return owner.see_in_dark = initial(owner.see_in_dark) - owner.see_invisible = initial(owner.see_invisible) owner.sight = initial(owner.sight) /datum/mutation/human/nearsight @@ -202,14 +205,18 @@ quality = NEGATIVE text_indication = "You feel strange." -/datum/mutation/human/bad_dna/on_acquiring(mob/living/carbon/human/owner) +/datum/mutation/human/bad_dna/on_acquiring(var/mob/living/carbon/human/owner) + var/mob/new_mob if(prob(95)) if(prob(50)) - randmutb(owner) + new_mob = randmutb(owner) else - randmuti(owner) + new_mob = randmuti(owner) else - randmutg(owner) + new_mob = randmutg(owner) + if(new_mob && ismob(new_mob)) + owner = new_mob + . = owner on_losing(owner) /datum/mutation/human/cough diff --git a/code/game/dna.dm b/code/game/dna.dm index 12771d535fe..e43a55fe024 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -30,6 +30,15 @@ if(new_holder && istype(new_holder)) holder = new_holder +/datum/dna/proc/transfer_identity(mob/living/carbon/destination) + if(check_dna_integrity(destination)) + destination.dna.unique_enzymes = unique_enzymes + destination.dna.uni_identity = uni_identity + destination.dna.blood_type = blood_type + destination.dna.species = species + destination.dna.real_name = real_name + destination.dna.mutations = mutations + /datum/dna/proc/add_mutation(mutation_name) var/datum/mutation/human/HM = mutations_list[mutation_name] HM.on_acquiring(holder) @@ -79,7 +88,7 @@ for(var/datum/mutation/human/A in good_mutations + bad_mutations + not_good_mutations) if(A.name == RACEMUT && istype(character,/mob/living/carbon/monkey)) sorting[A.dna_block] = num2hex(A.lowest_value + rand(0, 256 * 6), DNA_BLOCK_SIZE) - character.dna.mutations.Add(mutations_list[RACEMUT]) + character.dna.mutations.Add(A) else sorting[A.dna_block] = random_string(DNA_BLOCK_SIZE, L) @@ -129,7 +138,7 @@ return /proc/check_dna_integrity(mob/living/carbon/character) - if(!(istype(character, /mob/living/carbon/human) || istype(character, /mob/living/carbon/monkey))) //Evict xenos from carbon 2012 + if(!character || !(istype(character, /mob/living/carbon/human) || istype(character, /mob/living/carbon/monkey))) //Evict xenos from carbon 2012 return if(!character.dna) if(ready_dna(character)) @@ -159,6 +168,7 @@ /proc/create_dna(mob/living/carbon/C, datum/species/S) //don't use this unless you're about to use hardset_dna or ready_dna C.dna = new /datum/dna(C) + C.dna.holder = C if(S) C.dna.species = new S() // do not remove; this is here to prevent runtimes /////////////////////////// DNA DATUM @@ -193,20 +203,21 @@ /proc/randmut(mob/living/carbon/M, list/candidates, difficulty = 2) if(!check_dna_integrity(M)) return - var/num = pick(candidates) - var/newdna = setblock(M.dna.struc_enzymes, num, construct_block(difficulty,difficulty)) - M.dna.struc_enzymes = newdna + var/datum/mutation/human/num = pick(candidates) + . = num.force_give(M) return /proc/randmutb(mob/living/carbon/M) - var/datum/mutation/human/HM = pick(bad_mutations | not_good_mutations) - HM.on_acquiring(M) - return randmut(M, bad_se_blocks) + if(!check_dna_integrity(M)) + return + var/datum/mutation/human/HM = pick((bad_mutations | not_good_mutations) - mutations_list[RACEMUT]) + . = HM.force_give(M) /proc/randmutg(mob/living/carbon/M) + if(!check_dna_integrity(M)) + return var/datum/mutation/human/HM = pick(good_mutations) - HM.on_acquiring(M) - return randmut(M, good_se_blocks | op_se_blocks) + . = HM.force_give(M) /proc/randmuti(mob/living/carbon/M) if(!check_dna_integrity(M)) return @@ -218,6 +229,7 @@ /proc/clean_dna(mob/living/carbon/M) if(!check_dna_integrity(M)) return + M.dna.remove_all_mutations() M.dna.struc_enzymes = M.dna.generate_struc_enzymes(M) // Give clean DNA. /proc/clean_randmut(mob/living/carbon/M, list/candidates, difficulty = 2) @@ -231,7 +243,7 @@ for(var/i=1, i<=DNA_STRUC_ENZYMES_BLOCKS, i++) if(prob(probability)) M.dna.struc_enzymes = setblock(M.dna.struc_enzymes, i, random_string(DNA_BLOCK_SIZE, hex_characters)) - domutcheck(M, null) + domutcheck(M) if(ui) for(var/i=1, i<=DNA_UNI_IDENTITY_BLOCKS, i++) if(prob(probability)) @@ -261,7 +273,7 @@ H.update_hair() return 1 -/proc/domutcheck(mob/living/carbon/M, connected, inj) +/proc/domutcheck(mob/living/carbon/M) if(!check_dna_integrity(M)) return 0 @@ -777,7 +789,7 @@ if("se") if(buffer_slot["SE"]) viable_occupant.dna.struc_enzymes = buffer_slot["SE"] - domutcheck(viable_occupant, connected) + domutcheck(viable_occupant) if("ui") if(buffer_slot["UI"]) viable_occupant.dna.uni_identity = buffer_slot["UI"] @@ -883,7 +895,7 @@ last_change += "->[hex]" viable_occupant.dna.struc_enzymes = copytext(viable_occupant.dna.struc_enzymes, 1, num) + hex + copytext(viable_occupant.dna.struc_enzymes, num+1, 0) - domutcheck(viable_occupant, connected) + domutcheck(viable_occupant) else current_screen = "mainmenu" diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index 1cbf0f81d72..09d63f00e2f 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -74,7 +74,10 @@ H.hair_style = null H.update_hair() overlays = H.overlays - overlays += image('icons/mob/blob.dmi', icon_state = "blob_head") + var/image/I = image('icons/mob/blob.dmi', icon_state = "blob_head") + I.color = color + color = initial(color)//looks better. + overlays += I H.loc = src is_zombie = 1 loc.visible_message(" The corpse of [H.name] suddenly rises!") @@ -114,8 +117,8 @@ pass_flags = PASSBLOB health = 240 maxHealth = 240 - melee_damage_lower = 25 - melee_damage_upper = 25 + melee_damage_lower = 10 + melee_damage_upper = 10 attacktext = "hits" attack_sound = 'sound/effects/blobattack.ogg' faction = list("blob") @@ -132,14 +135,14 @@ force_threshold = 10 environment_smash = 3 mob_size = 2 + var/mob/camera/blob/overmind /mob/living/simple_animal/hostile/blobbernaut/AttackingTarget() ..() if(isliving(target)) - var/mob/living/L = target - if(L.reagents) - L.reagents.add_reagent("spore_burning", 10) + if(overmind) + overmind.blob_reagent_datum.reaction_mob(target, TOUCH) /mob/living/simple_animal/hostile/blobbernaut/blob_act() diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index a5c9f6a8d1c..4412b095858 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -1,7 +1,7 @@ /obj/effect/blob/core name = "blob core" icon = 'icons/mob/blob.dmi' - icon_state = "blob_core" + icon_state = "blank_blob" health = 200 fire_resist = 2 var/mob/camera/blob/overmind = null // the blob core's overmind @@ -14,10 +14,21 @@ SSobj.processing.Add(src) if(!overmind) create_overmind(new_overmind) + if(overmind) + adjustcolors(overmind.blob_reagent_datum.color) point_rate = new_rate ..(loc, h) +/obj/effect/blob/core/adjustcolors(var/a_color) + color = null + var/image/I = new('icons/mob/blob.dmi', "blob") + I.color = a_color + overlays += I + var/image/C = new('icons/mob/blob.dmi', "blob_core_overlay") + overlays += C + + /obj/effect/blob/core/Destroy() blob_cores -= src if(overmind) @@ -51,13 +62,15 @@ if(overmind) overmind.update_health() for(var/i = 1; i < 8; i += i) - Pulse(0, i) + Pulse(0, i, overmind.blob_reagent_datum.color) for(var/b_dir in alldirs) if(!prob(5)) continue var/obj/effect/blob/normal/B = locate() in get_step(src, b_dir) if(B) B.change_to(/obj/effect/blob/shield) + B.color = overmind.blob_reagent_datum.color + color = null ..() @@ -86,6 +99,7 @@ B.key = C.key B.blob_core = src src.overmind = B + color = overmind.blob_reagent_datum.color return 1 return 0 diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm index d5c26dcf904..4badc0cf315 100644 --- a/code/game/gamemodes/blob/blobs/factory.dm +++ b/code/game/gamemodes/blob/blobs/factory.dm @@ -7,6 +7,7 @@ var/list/spores = list() var/max_spores = 3 var/spore_delay = 0 + var/mob/camera/blob/overmind /obj/effect/blob/factory/update_icon() if(health <= 0) @@ -30,6 +31,8 @@ return 0 spore_delay = world.time + 100 // 10 seconds PulseAnimation(1) - new/mob/living/simple_animal/hostile/blobspore(src.loc, src) + var/mob/living/simple_animal/hostile/blobspore/BS = new/mob/living/simple_animal/hostile/blobspore(src.loc, src) + BS.color = color + overmind.blob_mobs.Add(BS) return 0 diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm index e2ec5fea7f3..4dee5d6517a 100644 --- a/code/game/gamemodes/blob/blobs/node.dm +++ b/code/game/gamemodes/blob/blobs/node.dm @@ -1,9 +1,10 @@ /obj/effect/blob/node name = "blob node" icon = 'icons/mob/blob.dmi' - icon_state = "blob_node" + icon_state = "blank_blob" health = 100 fire_resist = 2 + var/mob/camera/blob/overmind /obj/effect/blob/node/New(loc, var/h = 100) @@ -11,6 +12,14 @@ SSobj.processing.Add(src) ..(loc, h) +/obj/effect/blob/node/adjustcolors(var/a_color) + color = null + var/image/I = new('icons/mob/blob.dmi', "blob") + I.color = a_color + src.overlays += I + var/image/C = new('icons/mob/blob.dmi', "blob_node_overlay") + src.overlays += C + /obj/effect/blob/node/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) return @@ -21,8 +30,9 @@ /obj/effect/blob/node/Life() for(var/i = 1; i < 8; i += i) - Pulse(5, i) + Pulse(5, i, overmind.blob_reagent_datum.color) health = min(initial(health), health + 1) + color = null /obj/effect/blob/node/update_icon() if(health <= 0) diff --git a/code/game/gamemodes/blob/blobs/storage.dm b/code/game/gamemodes/blob/blobs/storage.dm new file mode 100644 index 00000000000..dcfb5ddf1ac --- /dev/null +++ b/code/game/gamemodes/blob/blobs/storage.dm @@ -0,0 +1,21 @@ +/obj/effect/blob/storage + name = "storage blob" + icon = 'icons/mob/blob.dmi' + icon_state = "blob_resource" + health = 30 + fire_resist = 2 + var/mob/camera/blob/overmind = null + +/obj/effect/blob/storage/update_icon() + if(health <= 0) + overmind.max_blob_points -= 50 + qdel(src) + +/obj/effect/blob/storage/PulseAnimation(var/activate = 0) + if(activate) + ..() + return + +/obj/effect/blob/storage/proc/update_max_blob_points(var/new_point_increase) + if(overmind) + overmind.max_blob_points += new_point_increase \ No newline at end of file diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index 0823430f4c0..99a5d1e8154 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -15,18 +15,25 @@ var/blob_points = 0 var/max_blob_points = 100 var/last_attack = 0 + var/datum/reagent/blob_reagent_datum = new/datum/reagent() + var/list/blob_mobs = list() /mob/camera/blob/New() var/new_name = "[initial(name)] ([rand(1, 999)])" name = new_name real_name = new_name last_attack = world.time + var/list/possible_reagents = list() + for(var/type in (typesof(/datum/reagent/blob) - /datum/reagent/blob)) + possible_reagents.Add(new type) + blob_reagent_datum = pick(possible_reagents) ..() /mob/camera/blob/Login() ..() sync_mind() src << "You are the overmind!" + src << "Your randomly chosen reagent is: [blob_reagent_datum.name]!" src << "You are the overmind and can control the blob! You can expand, which will attack people, and place new blob pieces such as..." src << "Normal Blob will expand your reach and allow you to upgrade into special blobs that perform certain functions." src << "Shield Blob is a strong and expensive blob which can take more damage. It is fireproof and can block air, use this to protect yourself from station fires." @@ -70,7 +77,7 @@ return var/message_a = say_quote(message) - var/rendered = "Blob Telepathy, [name] [message_a]" + var/rendered = "Blob Telepathy, [name]([blob_reagent_datum.name]) [message_a]" for (var/mob/M in mob_list) if(isovermind(M) || isobserver(M)) @@ -83,14 +90,11 @@ return /mob/camera/blob/Stat() - - statpanel("Status") ..() - if (client.statpanel == "Status") + if(statpanel("Status")) if(blob_core) stat(null, "Core Health: [blob_core.health]") stat(null, "Power Stored: [blob_points]/[max_blob_points]") - return /mob/camera/blob/Move(var/NewLoc, var/Dir = 0) var/obj/effect/blob/B = locate() in range("3x3", NewLoc) diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index 8919d3271ac..3c2b72e9b90 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -54,8 +54,9 @@ if(!can_buy(10)) return - + B.color = blob_reagent_datum.color B.change_to(/obj/effect/blob/shield) + return @@ -88,7 +89,7 @@ if(!can_buy(40)) return - + B.color = blob_reagent_datum.color B.change_to(/obj/effect/blob/resource) var/obj/effect/blob/resource/R = locate() in T if(R) @@ -124,8 +125,11 @@ if(!can_buy(60)) return - B.change_to(/obj/effect/blob/node) + var/obj/effect/blob/node/R = locate() in T + if(R) + R.adjustcolors(blob_reagent_datum.color) + R.overmind = src return @@ -157,6 +161,10 @@ return B.change_to(/obj/effect/blob/factory) + B.color = blob_reagent_datum.color + var/obj/effect/blob/factory/R = locate() in T + if(R) + R.overmind = src return @@ -185,7 +193,9 @@ var/mob/living/simple_animal/hostile/blobbernaut/blobber = new /mob/living/simple_animal/hostile/blobbernaut (get_turf(B)) if(blobber) B.Destroy() - + blobber.color = blob_reagent_datum.color + blobber.overmind = src + blob_mobs.Add(blobber) return @@ -264,7 +274,10 @@ if(!can_buy(5)) return last_attack = world.time - OB.expand(T, 0) + OB.expand(T, 0, blob_reagent_datum.color) + for(var/mob/living/L in T) + blob_reagent_datum.reaction_mob(L, TOUCH) + OB.color = blob_reagent_datum.color return @@ -292,3 +305,94 @@ BS.LoseTarget() BS.Goto(pick(surrounding_turfs), BS.move_to_delay) return + + +/mob/camera/blob/verb/split_consciousness() + set category = "Blob" + set name = "Split consciousness (100) (One use)" + set desc = "Expend resources to attempt to produce another sentient overmind" + + + var/client/C = null + var/list/candidates = get_candidates(BE_BLOB) + if(candidates.len) + C = pick(candidates) + + if(C) + if(!blob_nodes || !blob_nodes.len) + src << "A node is required to birth your offspring..." + return + var/obj/effect/blob/node/N = locate(/obj/effect/blob) in blob_nodes + if(!N) + src << "A node is required to birth your offspring..." + return + + if(!can_buy(100)) + return + + verbs -= /mob/camera/blob/verb/split_consciousness //we've used our split_consciousness + var/obj/effect/blob/core/new_core = new(get_turf(N), 200, C, blob_core.point_rate) + qdel(N) + var/mob/camera/blob/B = new(get_turf(new_core)) + B.key = C.key + B.blob_core = new_core + new_core.overmind = B + + if(ticker && ticker.mode.name == "blob") + var/datum/game_mode/blob/BL = ticker.mode + BL.blobwincount = initial(BL.blobwincount) * 2 + + else + src << "You weren't able to split your consciousness at this time..." + +/mob/camera/blob/verb/blob_broadcast() + set category = "Blob" + set name = "Blob Broadcast" + set desc = "Speak with your blob spores and blobbernauts as your mouthpieces. This action is free." + + var/speak_text = input(usr, "What would you like to say with your minions?", "Blob Broadcast", null) as text + + if(!speak_text) + return + else + usr << "You broadcast with your minions, [speak_text]" + for(var/mob/living/simple_animal/hostile/blob_minion in blob_mobs) + blob_minion.say(speak_text) + return + +/mob/camera/blob/verb/create_storage() + set category = "Blob" + set name = "Create Storage Blob (40)" + set desc = "Create a storage tower which will store extra resources for you. This increases your max resource cap by 50." + + + var/turf/T = get_turf(src) + + if(!T) + return + + var/obj/effect/blob/B = (locate(/obj/effect/blob) in T) + + if(!B)//We are on a blob + src << "There is no blob here!" + return + + if(!istype(B, /obj/effect/blob/normal)) + src << "Unable to use this blob, find a normal one." + return + + for(var/obj/effect/blob/storage/blob in orange(3, T)) + src << "There is a storage blob nearby, move more than 4 tiles away from it!" + return + + if(!can_buy(40)) + return + + B.color = blob_reagent_datum.color + B.change_to(/obj/effect/blob/storage) + var/obj/effect/blob/storage/R = locate() in T + if(R) + R.overmind = src + R.update_max_blob_points(50) + + return \ No newline at end of file diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 357bdd7c195..56e73d4e1bb 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -51,7 +51,8 @@ return /obj/effect/blob/proc/PulseAnimation() - flick("[icon_state]_glow", src) + if(!istype(src, /obj/effect/blob/core) || !istype(src, /obj/effect/blob/node)) + flick("[icon_state]_glow", src) return /obj/effect/blob/proc/RegenHealth() @@ -64,7 +65,7 @@ health_timestamp = world.time + 10 // 1 seconds -/obj/effect/blob/proc/Pulse(var/pulse = 0, var/origin_dir = 0)//Todo: Fix spaceblob expand +/obj/effect/blob/proc/Pulse(var/pulse = 0, var/origin_dir = 0, var/a_color)//Todo: Fix spaceblob expand set background = BACKGROUND_ENABLED @@ -88,9 +89,10 @@ var/turf/T = get_step(src, dirn) var/obj/effect/blob/B = (locate(/obj/effect/blob) in T) if(!B) - expand(T)//No blob here so try and expand + expand(T,1,a_color)//No blob here so try and expand return - B.Pulse((pulse+1),get_dir(src.loc,T)) + B.color = a_color + B.Pulse((pulse+1),get_dir(src.loc,T), a_color) return return @@ -99,7 +101,7 @@ return 0 -/obj/effect/blob/proc/expand(var/turf/T = null, var/prob = 1) +/obj/effect/blob/proc/expand(var/turf/T = null, var/prob = 1, var/a_color) if(prob && !prob(health)) return if(istype(T, /turf/space) && prob(75)) return if(!T) @@ -113,6 +115,7 @@ if(!T) return 0 var/obj/effect/blob/normal/B = new /obj/effect/blob/normal(src.loc, min(src.health, 30)) + B.color = a_color B.density = 1 if(T.Enter(B,src))//Attempt to move into the tile B.density = initial(B.density) @@ -184,9 +187,16 @@ /obj/effect/blob/proc/change_to(var/type) if(!ispath(type)) ERROR("[type] is an invalid type for the blob.") - new type(src.loc) + var/obj/effect/blob/B = new type(src.loc) + if(!istype(type, /obj/effect/blob/core) || !istype(type, /obj/effect/blob/node)) + B.color = color + else + B.adjustcolors(color) qdel(src) +/obj/effect/blob/proc/adjustcolors(var/a_color) + return + /obj/effect/blob/normal icon_state = "blob" luminosity = 0 diff --git a/code/game/gamemodes/changeling/powers/mimic_voice.dm b/code/game/gamemodes/changeling/powers/mimic_voice.dm index bb8ed8e6ea6..108e7d5fa01 100644 --- a/code/game/gamemodes/changeling/powers/mimic_voice.dm +++ b/code/game/gamemodes/changeling/powers/mimic_voice.dm @@ -16,7 +16,7 @@ user << "We return our vocal glands to their original position." return - var/mimic_voice = input("Enter a name to mimic.", "Mimic Voice", null) as text + var/mimic_voice = stripped_input(user, "Enter a name to mimic.", "Mimic Voice", null, MAX_NAME_LEN) if(!mimic_voice) return @@ -25,4 +25,4 @@ user << "We shape our glands to take the voice of [mimic_voice], this will stop us from regenerating chemicals while active." user << "Use this power again to return to our original voice and reproduce chemicals again." - feedback_add_details("changeling_powers","MV") \ No newline at end of file + feedback_add_details("changeling_powers","MV") diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm index b732844dc45..e567eaac5bf 100644 --- a/code/game/gamemodes/changeling/powers/transform.dm +++ b/code/game/gamemodes/changeling/powers/transform.dm @@ -20,7 +20,7 @@ user.dna.species = new chosen_dna.species.type(user) user.dna.mutant_color = chosen_dna.mutant_color updateappearance(user) - domutcheck(user, null) + domutcheck(user) feedback_add_details("changeling_powers","TR") return 1 diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 869ba3d9777..9f2cc367787 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -306,15 +306,15 @@ if("summonguns") feedback_add_details("wizard_spell_learned","SG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells rightandwrong(0, H, 0) - uses++ max_uses++ + uses = uses + 2 //refund plus a free point active_challenges += "summon guns" temp = "You have cast summon guns and gained an extra charge for your spellbook." if("summonmagic") feedback_add_details("wizard_spell_learned","SU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells rightandwrong(1, H, 0) - uses++ max_uses++ + uses = uses + 2 //refund plus a free point active_challenges += "summon magic" temp = "You have cast summon magic and gained an extra charge for your spellbook." if("summonevents") diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 88e83f4127e..5d68e0878bf 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -152,6 +152,17 @@ src.eject_wait = 0 var/mob/living/carbon/human/H = new /mob/living/carbon/human(src) + + if(efficiency > 2) + for(var/A in bad_se_blocks) + setblock(H.dna.struc_enzymes, A, construct_block(0,2)) + if(efficiency > 5 && prob(20)) + randmutg(H) + if(efficiency < 3 && prob(50)) + var/mob/M = randmutb(H) + if(ismob(M)) + H = M + H.silent = 20 //Prevents an extreme edge case where clones could speak if they said something at exactly the right moment. occupant = H @@ -175,14 +186,6 @@ hardset_dna(H, ui, se, null, null, mrace, mcolor) H.faction |= factions - if(efficiency > 2) - for(var/A in bad_se_blocks) - setblock(H.dna.struc_enzymes, A, construct_block(0,2)) - if(efficiency > 5 && prob(20)) - randmutg(H) - if(efficiency < 3 && prob(50)) - randmutb(H) - H.set_cloned_appearance() H.suiciding = 0 diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm index cc2d97ddd95..33da8023ba8 100644 --- a/code/game/machinery/computer/shuttle.dm +++ b/code/game/machinery/computer/shuttle.dm @@ -36,29 +36,33 @@ var/choice = alert(user, text("Would you like to (un)authorize a shortened launch time? [] authorization\s are still needed. Use abort to cancel all authorizations.", src.auth_need - src.authorized.len), "Shuttle Launch", "Authorize", "Repeal", "Abort") if(SSshuttle.emergency.mode != SHUTTLE_DOCKED || user.get_active_hand() != W) return 0 + + var/seconds = SSshuttle.emergency.timeLeft() + if(seconds <= 10) + return 0 + switch(choice) if("Authorize") - src.authorized |= W:registered_name - if (src.auth_need - src.authorized.len > 0) - message_admins("[key_name(user.client)](?) has authorized early shuttle launch in ([x],[y],[z] - JMP)",0,1) - log_game("[user.ckey]([user]) has authorized early shuttle launch in ([x],[y],[z])") - minor_announce("[src.auth_need - src.authorized.len] more authorization(s) needed until shuttle is launched early",null,1) - else - var/time = SSshuttle.emergency.timeLeft() - message_admins("[key_name(user.client)](?) has launched the emergency shuttle in ([x],[y],[z] - JMP) [time] seconds before launch.",0,1) - log_game("[user.ckey]([user]) has launched the emergency shuttle in ([x],[y],[z]) [time] seconds before launch.") - minor_announce("The emergency shuttle will launch in 10 seconds",null,1) - SSshuttle.emergency.setTimer(100) - authorized.Cut() + if(!authorized.Find(W:registered_name)) + authorized += W:registered_name + if(auth_need - authorized.len > 0) + message_admins("[key_name(user.client)](?) has authorized early shuttle launch in ([x],[y],[z] - JMP)",0,1) + log_game("[user.ckey]([user]) has authorized early shuttle launch in ([x],[y],[z])") + minor_announce("[auth_need - authorized.len] more authorization(s) needed until shuttle is launched early",null,1) + else + message_admins("[key_name(user.client)](?) has launched the emergency shuttle in ([x],[y],[z] - JMP) [seconds] seconds before launch.",0,1) + log_game("[user.ckey]([user]) has launched the emergency shuttle in ([x],[y],[z]) [seconds] seconds before launch.") + minor_announce("The emergency shuttle will launch in 10 seconds",null,1) + SSshuttle.emergency.setTimer(100) if("Repeal") - src.authorized -= W:registered_name - minor_announce("[src.auth_need - src.authorized.len] authorizations needed until shuttle is launched early") + if(authorized.Remove(W:registered_name)) + minor_announce("[auth_need - authorized.len] authorizations needed until shuttle is launched early") if("Abort") - minor_announce("All authorizations to launch the shuttle early have been revoked.") - src.authorized.len = 0 - src.authorized = list( ) + if(authorized.len) + minor_announce("All authorizations to launch the shuttle early have been revoked.") + authorized.Cut() /obj/machinery/computer/emergency_shuttle/emag_act(mob/user as mob) if(!emagged && SSshuttle.emergency.mode == SHUTTLE_DOCKED) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 050fe2af20d..aedbe164b60 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -31,7 +31,7 @@ s.start() obj:radiation += 50 randmutb(obj) - domutcheck(obj,null) + domutcheck(obj) qdel(src) /obj/effect/mine/proc/triggerstun(obj) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 00ea33f28ef..74bc14e63ca 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -158,7 +158,7 @@ */ /obj/item/device/transfer_valve/proc/toggle_valve() - if(valve_open==0 && (tank_one && tank_two)) + if(!valve_open && tank_one && tank_two) valve_open = 1 var/turf/bombturf = get_turf(src) var/area/A = get_area(bombturf) @@ -203,7 +203,7 @@ sleep(10) src.update_icon() - else if(valve_open==1 && (tank_one && tank_two)) + else if(valve_open && tank_one && tank_two) split_gases() valve_open = 0 src.update_icon() diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 1184fa296db..c3eb29eea81 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -24,7 +24,7 @@ M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2)) var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]" for(var/datum/mutation/human/HM in remove_mutations) - HM.on_losing(M) + HM.force_lose(M) for(var/datum/mutation/human/HM in add_mutations) if(HM.name == RACEMUT) message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] (MONKEY)") diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 8dfd2e32291..5bcefc888eb 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -74,8 +74,8 @@ if(user) var/obj/item/weapon/twohanded/O = user.get_inactive_hand() if(istype(O)) - O.unwield() - return unwield() + O.unwield(user) + return unwield(user) /obj/item/weapon/twohanded/update_icon() return diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 56c208db908..df7601e52d2 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -13,6 +13,8 @@ ..() levelupdate() +/turf/simulated/proc/burn_tile() + /turf/simulated/proc/MakeSlippery(var/wet_setting = 1) // 1 = Water, 2 = Lube if(wet >= wet_setting) return diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 4936f59d7dd..348c9d6b21f 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -100,7 +100,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," icon_state = pick(broken_states) broken = 1 -/turf/simulated/floor/proc/burn_tile() +/turf/simulated/floor/burn_tile() if(broken || burnt) return if(burnt_states.len) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 70177b99d16..716c923c789 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -684,7 +684,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || ticker.mode.name == "confliction") var/choice = input("The shuttle will just return if you call it. Call anyway?") in list("Confirm", "Cancel") if(choice == "Confirm") - SSshuttle.emergencyFakeRecall = rand(0.5,0.9) + SSshuttle.emergencyFakeRecall = rand(5,9) * 0.1 else return diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index eea5a10bb80..c8e2e45e854 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -115,8 +115,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/Stat() ..() - statpanel("Status") - if (client.statpanel == "Status") + if(statpanel("Status")) stat(null, "Station Time: [worldtime2text()]") if(ticker) if(ticker.mode) diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index a1bf4dc4974..039a69b6e9e 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -17,5 +17,8 @@ . = src.say_dead(message) /mob/dead/observer/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + if(radio_freq) + var/atom/movable/virtualspeaker/V = speaker + speaker = V.source src << "(F) [message]" diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index f9dbb63b948..6ad87f9871a 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -150,14 +150,11 @@ return 1 // Aliens can eat, and they can be fed food/drink /mob/living/carbon/alien/Stat() - - statpanel("Status") - stat(null, "Intent: [a_intent]") - stat(null, "Move Mode: [m_intent]") - ..() - if (client.statpanel == "Status") + if(statpanel("Status")) + stat(null, "Intent: [a_intent]") + stat(null, "Move Mode: [m_intent]") stat(null, "Plasma Stored: [getPlasma()]/[max_plasma]") /mob/living/carbon/alien/Stun(amount) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 515edc002a3..bee9cacd6e3 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -26,7 +26,8 @@ //This needs to be fixed /mob/living/carbon/alien/larva/Stat() ..() - stat(null, "Progress: [amount_grown]/[max_grown]") + if(statpanel("Status")) + stat(null, "Progress: [amount_grown]/[max_grown]") /mob/living/carbon/alien/larva/adjustToxLoss(amount) if(stat != DEAD) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index a3a955c56e0..db452bdd564 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1,8 +1,3 @@ -/mob/living/carbon/UnarmedAttack(var/atom/A, var/proximity_flag) - ..() - for(var/datum/mutation/human/HM in dna.mutations) - . += HM.on_attack_hand(A, src) - /mob/living/carbon/prepare_huds() ..() prepare_data_huds() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index e0496ef45fc..734d0aef70e 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -27,7 +27,6 @@ internal_organs += new /obj/item/organ/brain // for spawned humans; overwritten by other code - create_dna(src) ready_dna(src) randomize_human(src) @@ -52,8 +51,8 @@ /mob/living/carbon/human/Stat() ..() - statpanel("Status") - if (client.statpanel == "Status") + + if(statpanel("Status")) stat(null, "Intent: [a_intent]") stat(null, "Move Mode: [m_intent]") if(ticker && ticker.mode && ticker.mode.name == "AI malfunction") @@ -143,7 +142,7 @@ show_message(" The blob attacks you!") var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone)) - apply_damage(rand(20,30), BRUTE, affecting, run_armor_check(affecting, "melee")) + apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee")) return /mob/living/carbon/human/var/co2overloadtime = null diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index be47a15b67f..39ba01934e5 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -1,6 +1,8 @@ /mob/living/carbon/human/attack_hulk(mob/living/carbon/human/user) - adjustBruteLoss(5) - Weaken(4) + if(user.a_intent == "harm") + ..(user, 1) + adjustBruteLoss(5) + Weaken(4) /mob/living/carbon/human/attack_hand(mob/living/carbon/human/M) if(..()) //to allow surgery to return properly. diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index e8d5e681478..69c675dfe46 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -7,7 +7,6 @@ #define TINT_BLIND 3 //Threshold of tint level to obscure vision fully #define HUMAN_MAX_OXYLOSS 3 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it. -#define HUMAN_CRIT_MAX_OXYLOSS ( (last_tick_duration) /3) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 100HP to get through, so (1/3)*last_tick_duration per second. Breaths however only happen every 4 ticks. #define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point #define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point @@ -57,6 +56,10 @@ handle_regular_hud_updates() + //Status updates, death etc. + //TODO: optimise ~Carn + handle_regular_status_updates() + //No need to update all of these procs if the guy is dead. if(stat != DEAD) for(var/datum/mutation/human/HM in dna.mutations) @@ -93,8 +96,7 @@ //stuff in the stomach handle_stomach() - //Status updates, death etc. - handle_regular_status_updates() //TODO: optimise ~Carn + update_canmove() //Update our name based on whether our face is obscured/disfigured @@ -410,13 +412,11 @@ /mob/living/carbon/human/proc/handle_regular_status_updates() if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP - eye_blind = max(eye_blind, 1) silent = 0 else //ALIVE. LIGHTS ARE ON updatehealth() //TODO if(health <= config.health_threshold_dead || !getorgan(/obj/item/organ/brain)) death() - eye_blind = max(eye_blind, 1) silent = 0 return 1 @@ -425,13 +425,6 @@ if( (getOxyLoss() > 50) || (config.health_threshold_crit >= health) ) Paralyse(3) - /* Done by handle_breath() - if( health <= 20 && prob(1) ) - spawn(0) - emote("gasp") - if(!reagents.has_reagent("inaprovaline")) - adjustOxyLoss(1)*/ - if(hallucination) spawn handle_hallucinations() @@ -446,13 +439,11 @@ if(paralysis) AdjustParalysis(-1) - eye_blind = max(eye_blind, 1) stat = UNCONSCIOUS else if(sleeping) handle_dreams() adjustStaminaLoss(-10) sleeping = max(sleeping-1, 0) - eye_blind = max(eye_blind, 1) stat = UNCONSCIOUS if( prob(10) && health && !hal_crit ) spawn(0) @@ -462,7 +453,7 @@ stat = CONSCIOUS //Eyes - if(disabilities & BLIND) //disabled-blind, doesn't get better on its own + if(disabilities & BLIND || stat) //disabled-blind, doesn't get better on its own eye_blind = max(eye_blind, 1) else if(eye_blind) //blindness, heals slowly over time eye_blind = max(eye_blind-1,0) @@ -549,6 +540,9 @@ CheckStamina() + if(dna) + dna.species.handle_vision(src) + return 1 /mob/living/carbon/human/proc/handle_regular_hud_updates() @@ -639,7 +633,6 @@ if(!client.adminobs) reset_view(null) if(dna) - dna.species.handle_vision(src) dna.species.handle_hud_icons(src) return 1 @@ -688,4 +681,3 @@ mind.changeling.regenerate() #undef HUMAN_MAX_OXYLOSS -#undef HUMAN_CRIT_MAX_OXYLOSS diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index e80378256ff..97287f2f5e6 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -8,7 +8,7 @@ #define TINT_BLIND 3 #define HUMAN_MAX_OXYLOSS 3 -#define HUMAN_CRIT_MAX_OXYLOSS (SSmob.wait/3) +#define HUMAN_CRIT_MAX_OXYLOSS (SSmob.wait/30) #define HEAT_DAMAGE_LEVEL_1 2 #define HEAT_DAMAGE_LEVEL_2 3 @@ -475,11 +475,12 @@ if(H.seer) H.see_invisible = SEE_INVISIBLE_OBSERVER - if(H.mind && H.mind.changeling) - H.hud_used.lingchemdisplay.invisibility = 0 - H.hud_used.lingchemdisplay.maptext = "
[H.mind.changeling.chem_charges]
" - else - H.hud_used.lingchemdisplay.invisibility = 101 + if(H.mind) + if(H.mind.changeling) + H.hud_used.lingchemdisplay.invisibility = 0 + H.hud_used.lingchemdisplay.maptext = "
[H.mind.changeling.chem_charges]
" + else + H.hud_used.lingchemdisplay.invisibility = 101 if(H.glasses) if(istype(H.glasses, /obj/item/clothing/glasses)) diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 60d0172da01..19d19c45972 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -346,12 +346,10 @@ updatehealth() if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP - eye_blind = max(eye_blind, 1) silent = 0 else //ALIVE. LIGHTS ARE ON if(health < config.health_threshold_dead || !getorgan(/obj/item/organ/brain)) death() - eye_blind = max(eye_blind, 1) stat = DEAD silent = 0 return 1 @@ -367,11 +365,9 @@ if(paralysis) AdjustParalysis(-1) - eye_blind = max(eye_blind, 1) stat = UNCONSCIOUS else if(sleeping) sleeping = max(sleeping-1, 0) - eye_blind = max(eye_blind, 1) stat = UNCONSCIOUS if( prob(10) && health ) spawn(0) @@ -381,11 +377,10 @@ stat = CONSCIOUS //Eyes - if(disabilities & BLIND) //disabled-blind, doesn't get better on its own - eye_blind = max(eye_blind, 1) + if(disabilities & BLIND || stat) //disabled-blind, doesn't get better on its own + eye_blind = max(eye_blind, 2) else if(eye_blind) //blindness, heals slowly over time eye_blind = max(eye_blind-1,0) - eye_blind = max(eye_blind, 1) else if(eye_blurry) //blurry eyes heal slowly eye_blurry = max(eye_blurry-1, 0) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index cdef1652274..00cd806ec0f 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -174,11 +174,10 @@ /mob/living/carbon/monkey/Stat() ..() - statpanel("Status") - stat(null, "Intent: [a_intent]") - stat(null, "Move Mode: [m_intent]") - if(client && mind) - if (client.statpanel == "Status") + if(statpanel("Status")) + stat(null, "Intent: [a_intent]") + stat(null, "Move Mode: [m_intent]") + if(client && mind) if(mind.changeling) stat("Chemical Storage", "[mind.changeling.chem_charges]/[mind.changeling.chem_storage]") stat("Absorbed DNA", mind.changeling.absorbedcount) diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index 6228646562a..4e7020c3f3b 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -130,13 +130,12 @@ /mob/living/carbon/slime/Stat() ..() - statpanel("Status") - if(is_adult) - stat(null, "Health: [round((health / 200) * 100)]%") - else - stat(null, "Health: [round((health / 150) * 100)]%") + if(statpanel("Status")) + if(is_adult) + stat(null, "Health: [round((health / 200) * 100)]%") + else + stat(null, "Health: [round((health / 150) * 100)]%") - if (client.statpanel == "Status") stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]") if(amount_grown >= 10) if(is_adult) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index c939fd1809a..5455ab67e57 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -215,8 +215,7 @@ var/list/ai_list = list() /mob/living/silicon/ai/Stat() ..() - statpanel("Status") - if (client.statpanel == "Status") + if(statpanel("Status")) if(ticker.mode.name == "AI malfunction") var/datum/game_mode/malfunction/malf = ticker.mode for (var/datum/mind/malfai in malf.malf_ai) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 75ebc5f7491..f96b7223b00 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -78,8 +78,7 @@ /mob/living/silicon/pai/Stat() ..() - statpanel("Status") - if (src.client.statpanel == "Status") + if(statpanel("Status")) if(src.silence_time) var/timeleft = round((silence_time - world.timeofday)/10 ,1) stat(null, "Communications system reboot in -[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]") diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index c18183ec808..de11fbb0601 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -294,8 +294,7 @@ /mob/living/silicon/robot/Stat() ..() - statpanel("Status") - if (client.statpanel == "Status") + if(statpanel("Status")) if(ticker.mode.name == "AI malfunction") var/datum/game_mode/malfunction/malf = ticker.mode for (var/datum/mind/malfai in malf.malf_ai) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index cdd78ccaa3b..b886317a3eb 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -122,8 +122,9 @@ /mob/living/simple_animal/parrot/Stat() ..() - stat("Held Item", held_item) - stat("Mode",a_intent) + if(statpanel("Status")) + stat("Held Item", held_item) + stat("Mode",a_intent) /mob/living/simple_animal/parrot/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) if(speaker != src && prob(20)) //Dont imitate ourselves diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 14b9f3a920e..851768516d1 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -378,8 +378,8 @@ /mob/living/simple_animal/Stat() ..() - statpanel("Status") - stat(null, "Health: [round((health / maxHealth) * 100)]%") + if(statpanel("Status")) + stat(null, "Health: [round((health / maxHealth) * 100)]%") /mob/living/simple_animal/proc/Die() health = 0 // so /mob/living/simple_animal/Life() doesn't magically revive them diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 4c74063c68e..e4b923b5ea9 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -163,14 +163,14 @@ proc/isorgan(A) if(prob(probability)) return zone - var/t = rand(1, 17) // randomly pick a different zone, or maybe the same one + var/t = rand(1, 18) // randomly pick a different zone, or maybe the same one switch(t) if(1) return "head" if(2) return "chest" if(3 to 6) return "l_arm" if(7 to 10) return "r_arm" - if(10 to 13) return "l_leg" - if(14 to 17) return "r_leg" + if(11 to 14) return "l_leg" + if(15 to 18) return "r_leg" return zone diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 5834833dcbf..00cbe4f88c1 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -40,10 +40,11 @@ O.real_name = newname //handle DNA and other attributes - O.dna = dna - dna = null - if (!(tr_flags & TR_KEEPSE)) - O.dna.struc_enzymes = setblock(O.dna.struc_enzymes, RACEBLOCK, construct_block(BAD_MUTATION_DIFFICULTY,BAD_MUTATION_DIFFICULTY)) + if(dna) + dna.transfer_identity(O) + if(tr_flags & TR_KEEPSE) + O.dna.struc_enzymes = dna.struc_enzymes + if(suiciding) O.suiciding = suiciding O.loc = loc @@ -135,7 +136,13 @@ qdel(animation) O.gender = (deconstruct_block(getblock(dna.uni_identity, DNA_GENDER_BLOCK), 2)-1) ? FEMALE : MALE - O.dna = dna + + if(dna) + dna.transfer_identity(O) + O.update_icons() + if(tr_flags & TR_KEEPSE) + O.dna.struc_enzymes = dna.struc_enzymes + domutcheck(O) if(!dna.species) O.dna.species = new /datum/species/human() @@ -143,17 +150,13 @@ O.dna.species = new dna.species.type() dna = null - if (newname) //if there's a name as an argument, always take that one over the current name + if(newname) //if there's a name as an argument, always take that one over the current name O.real_name = newname else - if ( !(cmptext ("monkey",copytext(O.dna.real_name,1,7)) ) ) - O.real_name = O.dna.real_name - else - O.real_name = random_name(O.gender) - O.name = O.real_name - - if (!(tr_flags & TR_KEEPSE)) - O.dna.struc_enzymes = setblock(O.dna.struc_enzymes, RACEBLOCK, construct_block(1,BAD_MUTATION_DIFFICULTY)) + if(cmptext("monkey",copytext(O.dna.real_name,1,7))) + O.dna.real_name = random_name(O.gender) + O.real_name = O.dna.real_name + O.name = O.real_name if(suiciding) O.suiciding = suiciding diff --git a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm new file mode 100644 index 00000000000..43b13f3c0f9 --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm @@ -0,0 +1,151 @@ +// These can only be applied by blobs. They are what blobs are made out of. +// The 4 damage +datum/reagent/blob/boiling_oil + name = "Boiling Oil" + id = "boiling_oil" + description = "" + color = "#B68D00" + +datum/reagent/blob/boiling_oil/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + M.apply_damage(15, BURN) + M.adjust_fire_stacks(2) + M.IgniteMob() + M << "The blob splashes you with burning oil!" + M.emote("scream") + +datum/reagent/blob/toxic_goop + name = "Toxic Goop" + id = "toxic_goop" + description = "" + color = "#008000" + +datum/reagent/blob/toxic_goop/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + M.apply_damage(20, TOX) + M << "The blob strikes you, and you feel sick and nauseated!" + +datum/reagent/blob/skin_ripper + name = "Skin Ripper" + id = "skin_ripper" + description = "" + color = "#FF4C4C" + +datum/reagent/blob/skin_ripper/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + M.apply_damage(20, BRUTE) + M << "The blob strikes you, and you feel your skin ripping and tearing off!" + M.emote("scream") + +// Combo Reagents + +datum/reagent/blob/skin_melter + name = "Skin Melter" + id = "skin_melter" + description = "" + color = "#7F0000" + +datum/reagent/blob/skin_melter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + M.apply_damage(10, BRUTE) + M.apply_damage(10, BURN) + M.adjust_fire_stacks(2) + M.IgniteMob() + M << "The blob strikes you, and you feel your skin char and melt!" + M.emote("scream") + +datum/reagent/blob/lung_destroying_toxin + name = "Lung Destroying Toxin" + id = "lung_destroying_toxin" + description = "" + color = "#00FFC5" + +datum/reagent/blob/lung_destroying_toxin/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + M.apply_damage(20, OXY) + M.apply_damage(20, TOX) + M << "The blob strikes you, and your lungs feel heavy and weak!" +// Special Reagents + +datum/reagent/blob/acid + name = "Acidic Liquid" + id = "blob_acid" + description = "" + color = "#BD80F4" + +datum/reagent/blob/acid/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + M.acid_act(20,1,10) + M.apply_damage(10, BRUTE) + M << "The blob's tendrils melt though your equipment!" + +datum/reagent/blob/radioactive_liquid + name = "Radioactive Liquid" + id = "radioactive_liquid" + description = "" + color = "#00EE00" + +datum/reagent/blob/radioactive_liquid/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + if(istype(M, /mob/living/carbon/human)) + M.apply_damage(10, BRUTE) + M.apply_effect(10,IRRADIATE,0) + if(prob(33)) + randmuti(M) + if(prob(98)) + randmutb(M) + else + randmutg(M) + domutcheck(M, null) + updateappearance(M) + M << "The blob strikes you, and your skin feels papery and everything hurts!" + +datum/reagent/blob/dark_matter + name = "Dark Matter" + id = "dark_matter" + description = "" + color = "#61407E" + +datum/reagent/blob/dark_matter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + M.apply_damage(15, BRUTE) + reagent_vortex(M, 0) + M << "You feel a thrum as the blob strikes you, and everything flies at you!" + +datum/reagent/blob/b_sorium + name = "Sorium" + id = "b_sorium" + description = "" + color = "#808000" + +datum/reagent/blob/b_sorium/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + M.apply_damage(15, BRUTE) + M << "The blob slams into you, and sends you flying!" + reagent_vortex(M, 1) + + +datum/reagent/blob/explosive // I'm gonna burn in hell for this one + name = "Explosive Gelatin" + id = "explosive" + description = "" + color = "#FFA500" + +datum/reagent/blob/explosive/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + if(prob(75)) + M << "The blob strikes you, and its tendrils explode!" + explosion(M.loc, 0, 0, 1, 0, 0) + +/proc/reagent_vortex(var/mob/living/M as mob, var/setting_type) + var/turf/pull = get_turf(M) + for(var/atom/movable/X in orange(4,pull)) + if(istype(X, /atom/movable)) + if((X)) + if(setting_type) + step_away(X,pull) + step_away(X,pull) + step_away(X,pull) + step_away(X,pull) + else + X.throw_at(pull) \ No newline at end of file diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index e8d18906c53..d3b6127b375 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -546,7 +546,12 @@ /turf/proc/copyTurf(turf/T) if(T.type != type) + var/image/I + if(underlays.len) //we have underlays, which implies some sort of transparency, so we want to a snapshot of the previous turf as an underlay + I = image(T.icon, T.icon_state) T = new type(T) + if(I) + T.underlays.Add(I) if(T.icon_state != icon_state) T.icon_state = icon_state if(T.icon != icon) diff --git a/icons/mob/blob.dmi b/icons/mob/blob.dmi index 26510107829..7c8af9edad6 100644 Binary files a/icons/mob/blob.dmi and b/icons/mob/blob.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 611fe5f2ff5..fc9701ca9c6 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -285,6 +285,7 @@ #include "code\game\gamemodes\blob\blobs\node.dm" #include "code\game\gamemodes\blob\blobs\resource.dm" #include "code\game\gamemodes\blob\blobs\shield.dm" +#include "code\game\gamemodes\blob\blobs\storage.dm" #include "code\game\gamemodes\changeling\changeling.dm" #include "code\game\gamemodes\changeling\changeling_power.dm" #include "code\game\gamemodes\changeling\evolution_menu.dm" @@ -1275,6 +1276,7 @@ #include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_dispenser.dm" #include "code\modules\reagents\syringe_gun.dm" +#include "code\modules\reagents\Chemistry-Reagents\Blob-Reagents.dm" #include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents.dm" #include "code\modules\reagents\Chemistry-Reagents\Medicine-Reagents.dm" #include "code\modules\reagents\Chemistry-Reagents\Toxin-Reagents.dm"