diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 7c3a2ba5ebd..8816fc4f674 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -855,8 +855,8 @@ "aqw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "aqx" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "aqy" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) -"aqz" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/fpmaint2) -"aqA" = (/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"aqz" = (/obj/effect/decal/cleanable/vomit,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"aqA" = (/obj/item/weapon/cigbutt/cigarbutt,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "aqB" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "aqC" = (/turf/simulated/wall,/area/maintenance/fpmaint) "aqD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fpmaint) @@ -965,7 +965,7 @@ "asC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/wall,/area/maintenance/fpmaint2) "asD" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/space) "asE" = (/obj/item/weapon/paper/crumpled,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/space) -"asF" = (/obj/machinery/atmospherics/components/binary/valve,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"asF" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "asG" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "asH" = (/obj/structure/grille,/obj/structure/window/fulltile{health = 35},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "asI" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) @@ -1028,7 +1028,7 @@ "atN" = (/obj/structure/mirror{icon_state = "mirror_broke"; pixel_y = 28; shattered = 1},/obj/item/weapon/shard{icon_state = "medium"},/obj/item/weapon/circuitboard/operating,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "atO" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/stool/bed/chair,/obj/item/weapon/reagent_containers/blood/random,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "atP" = (/obj/item/weapon/airlock_painter,/obj/structure/lattice,/obj/structure/closet,/turf/space,/area/space) -"atQ" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{tag = "icon-manifold (WEST)"; icon_state = "manifold"; dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"atQ" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "atR" = (/obj/machinery/atmospherics/components/unary/tank/air{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "atS" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "atT" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint) @@ -1079,7 +1079,7 @@ "auM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "auN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/maintenance/fpmaint) "auO" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/maintenance/fpmaint) -"auP" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (NORTH)"; dir = 1},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/maintenance/fpmaint) +"auP" = (/obj/structure/stool/bed,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/item/weapon/bedsheet,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "auQ" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (NORTH)"; dir = 1},/turf/simulated/wall,/area/maintenance/fpmaint) "auR" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "auS" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint) @@ -3772,7 +3772,7 @@ "buB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) "buC" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) "buD" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) -"buE" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"buE" = (/obj/machinery/computer/slot_machine{balance = 15; money = 500},/obj/item/weapon/coin/iron,/obj/item/weapon/coin/diamond,/obj/item/weapon/coin/diamond,/obj/item/weapon/coin/diamond,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "buF" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/poddoor{id = "QMLoaddoor"; name = "supply dock loading door"},/turf/simulated/floor/plating,/area/quartermaster/storage) "buG" = (/obj/structure/plasticflaps,/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor/plating,/area/quartermaster/storage) "buH" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage) @@ -4601,9 +4601,9 @@ "bKy" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay) "bKz" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/door_control{id = "medpriv1"; name = "Privacy Shutters"; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay) "bKA" = (/obj/structure/grille,/obj/machinery/door/poddoor/preopen{id = "medpriv1"; name = "privacy door"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/window/fulltile,/turf/simulated/floor/plating,/area/medical/medbay) -"bKB" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay) +"bKB" = (/obj/structure/stool/bed/chair{dir = 1},/obj/item/toy/sword,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "bKC" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay) -"bKD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (NORTH)"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay) +"bKD" = (/obj/structure/stool/bed/chair{dir = 1},/obj/structure/noticeboard{dir = 8; pixel_x = 27; pixel_y = 0},/obj/item/trash/plate,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "bKE" = (/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/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/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay) "bKF" = (/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/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bKG" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -4660,7 +4660,8 @@ "bLF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/medical/virology) "bLG" = (/turf/simulated/wall/r_wall,/area/medical/virology) "bLH" = (/turf/simulated/wall,/area/medical/virology) -"bLJ" = (/obj/structure/sign/biohazard,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/medical/virology) +"bLI" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{tag = "icon-manifold (WEST)"; icon_state = "manifold"; dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"bLJ" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "bLK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 13},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bLL" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Xenobiology Maintenance"; req_access_txt = "55"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology) "bLM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) @@ -4720,9 +4721,9 @@ "bMO" = (/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 29},/obj/machinery/camera{c_tag = "Virology Break Room"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "bMP" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "bMQ" = (/obj/item/weapon/bedsheet,/obj/structure/stool/bed,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) -"bMR" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/medical/virology) -"bMS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) -"bMT" = (/obj/structure/closet/emcloset,/obj/machinery/camera{c_tag = "Virology Airlock"; dir = 2; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/medical/virology) +"bMR" = (/obj/item/trash/sosjerky,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"bMS" = (/obj/item/weapon/airalarm_electronics,/obj/item/weapon/circuitboard/seed_extractor,/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 4; name = "4maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"bMT" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2) "bMU" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "bMV" = (/mob/living/carbon/monkey,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "bMW" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) @@ -4743,6 +4744,7 @@ "bNl" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 8},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/mixing) "bNm" = (/obj/item/target,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/toxins/test_area) "bNn" = (/obj/machinery/light_construct{dir = 8},/turf/simulated/floor/plating,/area/construction) +"bNo" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2) "bNp" = (/obj/machinery/light_construct{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/construction) "bNq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/construction) "bNr" = (/obj/structure/disposalpipe/segment,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) @@ -4939,6 +4941,7 @@ "bRa" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "bRb" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/virology{name = "Break Room"; req_access_txt = "39"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "bRc" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) +"bRd" = (/obj/effect/decal/cleanable/egg_smudge,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "bRe" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (EAST)"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "bRf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/firealarm{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "bRg" = (/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Virology APC"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/camera{c_tag = "Virology Module"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) @@ -5289,7 +5292,7 @@ "bXN" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/wall/r_wall,/area/medical/virology) "bXO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bXP" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"bXQ" = (/obj/structure/grille,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/window/reinforced/tinted/fulltile,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bXQ" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "bXR" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bXS" = (/obj/structure/rack{dir = 1},/obj/machinery/light/small{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bXT" = (/obj/structure/grille,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/engine,/area/toxins/xenobiology) @@ -5387,9 +5390,9 @@ "bZH" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bZI" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bZJ" = (/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access_txt = "12;24"},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bZK" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bZL" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bZM" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (EAST)"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bZK" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"bZL" = (/obj/structure/rack,/obj/item/weapon/circuitboard/monkey_recycler,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"bZM" = (/turf/simulated/floor/plasteel/airless,/area/space) "bZN" = (/obj/structure/grille,/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/engine,/area/toxins/xenobiology) "bZO" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio1"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/xenobiology) "bZP" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) @@ -5479,18 +5482,18 @@ "cbv" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/atmos) "cbw" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos) "cbx" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cby" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cby" = (/obj/structure/table,/obj/item/weapon/stamp,/obj/item/weapon/contraband/poster/legit,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "cbz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbA" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbB" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbC" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbD" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cbF" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cbF" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/fpmaint2) "cbG" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cbH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cbI" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cbJ" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cbH" = (/obj/machinery/monkey_recycler,/obj/item/weapon/reagent_containers/food/snacks/monkeycube,/obj/item/weapon/reagent_containers/food/snacks/monkeycube,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"cbI" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"cbJ" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 4; name = "4maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "cbK" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cbL" = (/obj/structure/disposalpipe/segment,/obj/structure/lattice,/turf/space,/area/space) "cbM" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -5533,7 +5536,7 @@ "ccx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "ccy" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/asmaint) "ccz" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/maintenance/asmaint) -"ccA" = (/obj/structure/disposalpipe/segment,/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"ccA" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "ccB" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint) "ccC" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/asmaint) "ccD" = (/obj/structure/disposalpipe/segment,/obj/structure/closet/l3closet,/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -5581,7 +5584,7 @@ "cdt" = (/obj/machinery/door/airlock/maintenance{name = "Firefighting equipment"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cdu" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) "cdv" = (/turf/simulated/wall/r_wall,/area/maintenance/portsolar) -"cdw" = (/obj/machinery/power/apc{dir = 8; name = "Engineering Maintenance APC"; pixel_x = -25; pixel_y = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/aft) +"cdw" = (/turf/indestructible{desc = "A wall impregnated with Fixium, able to withstand massive explosions with ease"; name = "hyper-reinforced wall"},/area/toxins/test_area) "cdx" = (/obj/structure/closet/wardrobe/black,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/aft) "cdy" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/aft) "cdz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft) @@ -5615,7 +5618,7 @@ "ceb" = (/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_x = 0; pixel_y = 32},/obj/structure/disposalpipe/trunk,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/incinerator) "cec" = (/obj/machinery/power/smes{capacity = 9e+006; charge = 10000},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/decal/cleanable/cobweb{tag = "icon-cobweb2"; icon_state = "cobweb2"},/turf/simulated/floor/plating,/area/maintenance/incinerator) "ced" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cee" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/general/hidden{tag = "icon-manifold (NORTH)"; icon_state = "manifold"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cee" = (/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay) "cef" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/components/binary/pump{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "ceg" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (NORTH)"; dir = 1},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/asmaint) "ceh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -5667,12 +5670,12 @@ "cfb" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 10},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cfc" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cfd" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/alarm{desc = "This particular atmos control unit appears to have no access restrictions."; dir = 8; icon_state = "alarm0"; locked = 0; name = "all-access air alarm"; pixel_x = 24; req_access = "0"; req_one_access = "0"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cfe" = (/obj/machinery/atmospherics/pipe/simple/general/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cfe" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay) "cff" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cfg" = (/obj/structure/disposalpipe/junction{dir = 2; icon_state = "pipe-y"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cfh" = (/obj/structure/disposalpipe/segment,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cfi" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cfj" = (/obj/structure/stool{pixel_y = 8},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cfj" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/medical/virology) "cfk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/wall,/area/maintenance/asmaint) "cfl" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cfm" = (/obj/structure/stool/bed/chair,/obj/item/weapon/storage/fancy/cigarettes,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -5735,15 +5738,15 @@ "cgr" = (/obj/machinery/atmospherics/components/binary/pump{dir = 4; name = "input port pump"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cgs" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cgt" = (/obj/effect/landmark{name = "blobstart"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/mob/living/simple_animal/mouse,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cgu" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 2},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"cgu" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/medical/virology) "cgv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cgw" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{name = "output gas connector port"},/obj/machinery/portable_atmospherics/canister,/obj/structure/sign/nosmoking_2{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cgx" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cgx" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/medical/virology) "cgy" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cgz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cgA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cgB" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cgC" = (/obj/machinery/light/small,/obj/structure/table,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cgC" = (/obj/structure/closet/emcloset,/obj/machinery/camera{c_tag = "Virology Airlock"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/medical/virology) "cgD" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cgE" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cgF" = (/obj/structure/rack,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -5880,7 +5883,7 @@ "cjg" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cjh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cji" = (/obj/machinery/atmospherics/pipe/simple/general/visible,/obj/machinery/doorButtons/airlock_controller{idExterior = "incinerator_airlock_exterior"; idSelf = "incinerator_access_control"; idInterior = "incinerator_airlock_interior"; name = "Incinerator Access Console"; pixel_x = 6; pixel_y = -26; req_access_txt = "12"},/obj/machinery/ignition_switch{id = "Incinerator"; pixel_x = -6; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cjj" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/lattice,/turf/space,/area/space) +"cjj" = (/obj/structure/barricade/wooden,/obj/structure/girder,/turf/simulated/floor/plating,/area/maintenance/aft) "cjk" = (/obj/structure/rack,/obj/structure/disposalpipe/segment,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cjl" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cjm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -5919,7 +5922,7 @@ "cjT" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 29},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "cjU" = (/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/wall/r_wall,/area/maintenance/incinerator) "cjV" = (/obj/structure/cable,/obj/machinery/power/tracker,/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/starboard) -"cjW" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"cjW" = (/turf/simulated/floor/plating,/area/space) "cjX" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint2) "cjY" = (/obj/structure/closet/toolcloset,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cjZ" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -5951,6 +5954,7 @@ "ckz" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/engine/engineering) "ckA" = (/obj/structure/closet/secure_closet/engineering_personal,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/engine/engineering) "ckB" = (/obj/structure/lattice,/obj/machinery/atmospherics/components/binary/pump{dir = 2; name = "Incinerator Output Pump"; on = 1},/turf/space,/area/space) +"ckC" = (/obj/machinery/vending/boozeomat,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/maintenance/aft) "ckD" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/maintenance/incinerator) "ckE" = (/obj/structure/closet/wardrobe/black,/turf/simulated/floor/plasteel/shuttle,/area/shuttle/arrival) "ckF" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -6401,7 +6405,7 @@ "cti" = (/obj/machinery/door/airlock/shuttle{name = "Arrivals Shuttle Airlock"},/turf/simulated/floor/plasteel/shuttle,/area/shuttle/arrival) "ctj" = (/turf/simulated/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/labor) "ctk" = (/obj/structure/shuttle/engine/propulsion/burst,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/plating,/area/shuttle/labor) -"ctl" = (/turf/simulated/wall/shuttle{icon_state = "wall3"},/area/toxins/test_area) +"ctl" = (/obj/effect/decal/cleanable/robot_debris/old,/turf/simulated/floor/wood,/area/maintenance/aft) "ctm" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plating,/area/aisat) "ctn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/light/small{dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) "cto" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior) @@ -6485,6 +6489,7 @@ "cuO" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/wall/shuttle{icon_state = "swall_f6"; dir = 2},/area/shuttle/pod_4) "cuP" = (/obj/machinery/door/airlock/engineering{name = "Telecommunications"; req_access_txt = "61"},/turf/simulated/floor/plasteel,/area/tcommsat/computer) "cuQ" = (/obj/structure/rack{dir = 1},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/weapon/pickaxe{pixel_x = 5},/obj/item/weapon/shovel{pixel_x = -5},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock) +"cuR" = (/turf/simulated/floor/wood,/area/maintenance/aft) "cuS" = (/obj/machinery/atmospherics/components/binary/pump{dir = 1; on = 1},/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/obj/machinery/doorButtons/access_button{idSelf = "incinerator_access_control"; idDoor = "incinerator_airlock_interior"; name = "Incinerator airlock control"; pixel_x = -8; pixel_y = 24},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine,/area/maintenance/incinerator) "cuT" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (NORTH)"; dir = 1},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "cuU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/quartermaster/storage) @@ -6502,6 +6507,79 @@ "cvg" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_exterior"; locked = 1; name = "Turbine Exterior Airlock"; req_access_txt = "32"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/maintenance/incinerator) "cvh" = (/obj/machinery/atmospherics/components/unary/heat_reservoir/heater{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cvi" = (/obj/machinery/camera{c_tag = "Engineering East"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (EAST)"; dir = 4},/obj/structure/closet/wardrobe/engineering_yellow,/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/engine/engineering) +"cvj" = (/turf/simulated/floor/wood{tag = "icon-wood-broken"; icon_state = "wood-broken"},/area/maintenance/aft) +"cvk" = (/obj/item/weapon/shard,/turf/simulated/floor/plating,/area/maintenance/aft) +"cvl" = (/obj/machinery/door/airlock/maintenance{name = "Maint Bar Access"; req_access_txt = "12"},/obj/structure/barricade/wooden{name = "wooden barricade (CLOSED)"},/turf/simulated/floor/plating,/area/maintenance/aft) +"cvm" = (/obj/effect/decal/cleanable/oil,/turf/simulated/floor/plating,/area/maintenance/aft) +"cvn" = (/obj/structure/girder,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"cvo" = (/obj/structure/table/wood,/obj/item/weapon/soap/nanotrasen,/turf/simulated/floor/wood{tag = "icon-wood-broken7"; icon_state = "wood-broken7"},/area/maintenance/aft) +"cvp" = (/obj/structure/table,/obj/machinery/chem_dispenser/drinks/beer,/turf/simulated/floor/wood,/area/maintenance/aft) +"cvq" = (/obj/structure/table/wood,/obj/effect/spawner/lootdrop/maintenance{lootcount = 4; name = "4maintenance loot spawner"},/turf/simulated/floor/wood,/area/maintenance/aft) +"cvr" = (/obj/structure/table/wood,/turf/simulated/floor/wood{tag = "icon-wood-broken5"; icon_state = "wood-broken5"},/area/maintenance/aft) +"cvs" = (/obj/machinery/space_heater,/turf/simulated/floor/wood,/area/maintenance/aft) +"cvt" = (/obj/structure/stool,/turf/simulated/floor/wood,/area/maintenance/aft) +"cvu" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/maintenance/aft) +"cvv" = (/turf/simulated/floor/wood{tag = "icon-wood-broken5"; icon_state = "wood-broken5"},/area/maintenance/aft) +"cvw" = (/obj/machinery/atmospherics/pipe/simple/general/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/wood{tag = "icon-wood-broken6"; icon_state = "wood-broken6"},/area/maintenance/aft) +"cvx" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; external_pressure_bound = 120; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/wood,/area/maintenance/aft) +"cvy" = (/obj/machinery/atmospherics/pipe/simple/general/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft) +"cvz" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/general/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft) +"cvA" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{tag = "icon-connector_map (WEST)"; icon_state = "connector_map"; dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/aft) +"cvB" = (/obj/structure/grille,/obj/structure/window/fulltile,/obj/machinery/atmospherics/pipe/simple/general/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"cvC" = (/obj/structure/door_assembly/door_assembly_mai,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cvD" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/aft) +"cvE" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/space) +"cvF" = (/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint) +"cvG" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cvH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cvI" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cvJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cvK" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cvL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cvM" = (/obj/machinery/power/apc{dir = 8; name = "Engineering Maintenance APC"; pixel_x = -25; pixel_y = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/aft) +"cvN" = (/obj/effect/spawner/lootdrop/maintenance,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/aft) +"cvO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/aft) +"cvP" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/maintenance/asmaint) +"cvQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/wall,/area/maintenance/aft) +"cvR" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/item/toy/minimeteor,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cvS" = (/obj/structure/disposalpipe/segment,/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/obj/item/weapon/reagent_containers/food/snacks/donkpocket,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cvT" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/obj/item/roller,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cvU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/weapon/c_tube,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cvV" = (/obj/structure/mopbucket,/obj/item/weapon/caution,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cvW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/aft) +"cvX" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint) +"cvY" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cvZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cwa" = (/obj/structure/disposalpipe/segment,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cwb" = (/obj/structure/disposalpipe/segment,/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cwc" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"cwd" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/barricade/wooden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cwe" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 2},/obj/item/weapon/cigbutt,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"cwf" = (/obj/structure/table,/obj/item/weapon/cartridge/medical,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cwg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet/firecloset/full,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cwh" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/item/latexballon,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cwi" = (/obj/structure/disposalpipe/segment,/obj/item/weapon/shard,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cwj" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/wall,/area/maintenance/asmaint) +"cwk" = (/obj/structure/disposalpipe/segment,/obj/item/weapon/cigbutt/roach,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cwl" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/general/hidden{tag = "icon-manifold (NORTH)"; icon_state = "manifold"; dir = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cwm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/airlock/external{name = "Solar Maintenance"; req_access = null; req_access_txt = "10; 13"},/turf/simulated/floor/plating,/area/space) +"cwn" = (/obj/machinery/atmospherics/pipe/simple/general/hidden{dir = 9},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cwo" = (/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cwp" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/asmaint2) +"cwq" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"cwr" = (/obj/effect/decal/cleanable/robot_debris/old,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"cws" = (/obj/machinery/light/small,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cwt" = (/obj/machinery/light/small,/obj/structure/table,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/spawner/lootdrop/maintenance,/obj/item/weapon/clipboard,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cwu" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/cleanable/ash,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"cwv" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/asmaint2) +"cww" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/wall,/area/maintenance/asmaint) +"cwx" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/asmaint2) +"cwy" = (/obj/structure/table,/obj/item/weapon/weldingtool,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"cwz" = (/obj/structure/table_frame,/obj/item/weapon/wirerod,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/asmaint2) +"cwA" = (/obj/machinery/atmospherics/components/unary/outlet_injector{dir = 1; name = "Scrubber Loop Ejector"; on = 1},/turf/simulated/floor/plating/airless,/area/space) +"cwB" = (/obj/machinery/door/airlock{name = "Observatory Access"},/turf/simulated/floor/plating,/area/maintenance/aft) +"cwC" = (/obj/machinery/door/airlock/external{name = "External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"cwD" = (/obj/machinery/door/airlock/external{name = "External Access"; req_access = null; req_access_txt = "13"},/obj/structure/sign/securearea{name = "EXTERNAL AIRLOCK"; desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; step_x = 28; step_y = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/asmaint2) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6573,40 +6651,40 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaiaaiaaBaaCaaDaaFaaEaasaasaauaaGaaiaafaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaiaaJaasaasaasaasaaKaasaasaaLaaMaaiaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaiaaQaaKaasaasaaRaaSaaKaasaaTaaUaaiaaaaaVaafaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaZaasaasaasaaKabaabbaasaasabcabdaaiaaiaaiaafaaaaaaaaaaaaaaaaafaaaaaVaaaaaaaaaaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabeabeabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaOaaWaaNaaXabiaasabjaasaasaasaasaasaasaauaasabkablaaiaafaafaafaafaafaafaafaafabmabmabmabnabmabmaboaboabpabpabpaboaboaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaYabraaPadhabuaasaasabvabwabxaasabyabzabAaasabBabCaaiaafaaaaafaafaafaafaaaaafabnabDabEaeIabFabGaboabIabHabKabJabLaboaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafabMaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaabfabfabeabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgabNabPabOadhabSabTabSabSabSabUabSabSabSabVabSabSabWaaiactactactactactactactactabmabXabEaeIabYabDaboacaabZaccacbacwaboaaaaafacdaagaagaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfaafaafaaaaceaaaacfaafabfabfabfabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgabQacgabRadhackaasaclabSacmacnacoabSacpacqacrabSacsaaiacMacNacOacOacPacQacRacSactacuabEaeIaecabDabpacyacxaczaccacUaboaaaaafacAacBacAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaafaaaaafaaaaaaaceaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacCaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaciacDabsacjacHaasacIabSacJacnacIabSacKacqacIabSacLaaiacMadkadladladladladmadnactacTabEaeIaecabDabpacWacVacXaccadpaboaafaafacAacYacAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacZacZacZacZacZaaaadaaaaacZacZacZacZacZaafabfaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadbadbadbadbaafaafaaaadcaaaaafaafabfabfabfabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafhaaHaaHaaHacFaddacGadhadfadgadhabSadfadiadhabSadfadjadhabSabSaaiafnaRFaNFadVaNFadWbhdbiGactadoabEaeIaecabDaboadradqadtadsaeeaboabnabmadvacBacAacAachaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadwadxadxadxadxadyadzadAadBadBadBadBadCaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaafaaaaafaaaaaaadcaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHabhadeadDadGadFadIadHadKadJadMadLadOadNadUadLaepadPadQadRaaiadSadTaNFboSaNFadXadYadZaeaabEabEaebaeTabmaboaedaboahPaboaefaboaegaehacAaeiacAarqanTanTahtaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaemaemaemaemaemaaaadzaaaaemaemaemaemaemaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaenaenaenaenaenaaaaeoaaaaenaenaenaenaenaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHadEaeqaeraeuaetaewaevafiaexavkaifaexaexaexaifaOyaOvaeyaezaaiaeAaeBaeCaeDaeEaeFaeGaeHactahoagSaeJahpabmaeLaeMaeNaeOaePaeQaeNaeRaeSaeVaeUaeVamoamIamJagPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaadzaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaafaafbafbafbafbafcafdafeaffaffaffaffafgaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaesaOzaRfbfTbfPabSbiEafjafkaflafmacEafoafpafpafpabSafqafraaiafsaftafuafvafwafxafyafzactacvabnafBafCabmafDafEafFafGafHafIafJafKafLacAafMacAaptanTanTagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacZacZacZacZacZaaaadzaaaacZacZacZacZacZaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafafPafPafPafPafPaaaafdaaaafPafPafPafPafPaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaHaaHbaMbOybkdaaHabSadhafQadfafRafRafRafRafRafRafRafSafTafUafVafWafXafYafZagaagbagcafUagdahSageagfaggaghagiafFagjafHagkaglagmabmadvacAacAacAachaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadwadxadxadxadxadyadzadAadBadBadBadBadCaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaafdaaaaaaaaaaafaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaHaaHaaHaaHaaHaaiagnagoagpafRagqagragsagtaguafRagvagwagxagyagzagAagBagaagCagbagDagEagFafFagGagHagIagJagKaeKafAagNagOagLagMagRanUagUacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaemaemaemaemaemaaaadzaaaaemaemaemaemaemaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaenaenaenaenaenaaaafdaaaaenaenaenaenaenaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaiagVagWagXafRagYagZahaahbahcafRagvahdaheahfahgahhahiahjahjahkahlahmahnaqqaPUaPTahqahrahsahTahVahuahvahWahwabmacAahxacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaadzaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaafaafbafbafbafbafcafdafeaffaffaffaffafgaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiahyagWaHeafRagYagZahzahbahAafRahBahCahDahEahFahGahHahIahJahKahLahMahNahObzKbzJahRcdlankaiaahUbuJahXaLjahYahZaibaicaidaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacZacZacZacZacZaaaadzaaaacZacZacZacZacZaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfacfafPafPafPafPafPaaaafdaaaafPafPafPafPafPaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaiaieagWaigafRaihaiiaiiaijahcafRaikailafUaimainaioaipaipaiqairafUafUaisaitaduaduaduabmabmabmabmabmabmabmabmabmaivaiwaidaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadwadxadxadxadxadyadzadAadBadBadBadBadCaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaafdaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaixaixaiyaixaizaiAafRafRafRafRafRafRaiBaiCafRaiDaiEaiFaiFaiFaiFaiFaiFaiFaiFaiGaiHaiIaiJaiFailaiAaiKaiLaiMaiNaiOaiPaiQaiRaiuaivaiwaidaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaemaemaemaemaemaaaadzaaaaemaemaemaemaemaiSabqaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaenaenaenaenaenaaaafdaaaaenaenaenaenaenaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaixaiTaiUaiVaiWaiXaiYaiZajaajbajcajdajeajfajgajhajiajjajkajjajjajjajjajjajjajlajjajiajmajkajnajoajpajqajrajsajtajuajvajwaiuaivaiwacAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaafaaaaafaaaaaaadzaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaafaafbafbafbafbafcafdafeaffaffaffaffafgaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaelaekaekaekaejaaaaafaizajyajzajAajBajCajDajEajFajGajHajIajJajMajLajIajJajKajLajIajJajQajOajOajOajPahCajNajRajSajTajUajVajWajVajVajVajXajYaiPaiuaivaiwaidaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaafaafaafaafaafadzaafaafaafaafaafabfabfabfaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaiSafPafPafPafPafPaaaafdaaaafPafPafPafPafPaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNakJalqalpafNaiyaiyakdakeakfakgakhaiAafRakiafRafRakjakkaklakmaknakoaklakmaknakpakqakmakraksakmaktakuakmakvakwakxaiAakyakzaiPakAaiPakBakCaiPaiuaivaiwaidaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaafaaaaaaakDaaaaaaaafaaaaaaaafaaaaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaafaaaaafaaaaaaakEaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaakcalralRalQamnakKakLakKakeakMakNakOaiAakPakQakPafRakRakSakTafRakUakSakTafRakUakSakTafRakVakWakXakYailafRakZalaalbaiAalcaldalealfalealgalhaliaiuaivaiwaidaafaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaafaaaaaaaljaaaaaaaafaaaaaaaafaaaaaaaaaaafaafaaaaaaaaaaaaaaaallalmallaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaafaafaafaafalnaloalnaafaafaafaafabfabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNakGakIakHafNaiyaiyaiyalsaltalualvaiAakPakQakPafRalwakSalxafRalyakSalzafRalAakSalBafRalCalDalEakYalFafRalGakSalHaiAalIalJalIalKalIalIalLalIaiuaivaiwacAacAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaaaalMalNalMaaaaafaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaallalOallaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaafaaaaafaaaaaaaafaaaalnalPalnaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNajxajxakFafNaaaaaaalSaixaiyalTalUaiAakPalVakPaiAalWalXalXalYalXalXalXalYalXalXalXalYalZamaambamcamdaiAaiAaiAaiAaiAameamfameaiRameameamgaiRaiuamhamiamjacAacAacAaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaalMamkalMaaaaafaafaafaafaaaaafaaaaaaaaaaafaafaaaaaaaaaallamlallaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaafalnalnammalnalnaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakcakbajxakaafNaiyaiyaiyampamqamramsaizaiAaiAaiAaiAamtamtamtamuamtamtamtamvamtamtamtamuamtamtamtamwamwamxamyamyamyamzameamfameaiRameameamgaiRacAaivamAaeUamBamCamBaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaafalMalMalNalMalMaafaaaaaaaafaaaaafaaaaaaaaaaaaaafaafaaaaaaallamlallaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaafaaaaaaaafamDamEamFamGamDamHamHaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNajZajxajxafOamKakLamKakeakMakNakMamLamwamwamwamMamwamwamNamwamwamwamwamwamwamwamOamwamwamwamQamwamwamwamwamwamwamRaiRamSamTamUamVaiRamWaiRamXamYamZanaanaanbacAaagaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaafancandaneanfancaafaaaaaaaafaaaaafaaaaafaaaaaaaaaaafallallallamlallallallallallallaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHamHamHamHamHaafaafamDanganhaniamDanjamHaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNaeZaeZaeZafNaiyaiyanlanmannanoanpaixanqanqanqanqanqanransanqanqanqanqanqanqanqantanuanuanuanvanwanuanxanyanzanAamzanBanCaiuaiuaiuaiuaiuaiuacAanDanEacAanFanGacAaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaafancanHanIanJancaafaaaaaaaafaaaaafaaaaafallalmallalmallanKamlamlamlamlamlamlanLallaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaamHamHamHamHanManNanOamHaaaaaaamDanPanQanRamDanSamHaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeYaeXaeXaeXaeWaaaaafaizaiyanVaixanWanXanXanYanZanYanXanXaoaaobaobaobaocaobaobaodaoeaofaoganaaohanaanaanaanaaoianaanaanaanaanaaojaokaolaomaonaonaooaopaoqaoraosacAaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaagaagaagaaaaafancaotaouaovancaowaowaowaowaowalmalmalmallaoxamlanLallallamlallallallallaoyallallaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaEoaGaaEpaaaaGbaHoaHnaafaaaaagaagaagaaaaaaaafamHaozaoAaoBanSaoCanSamHaoDaoDamDamDaoEaoFamDanSamHamHaoDaoDaoDamHamHaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaixaoGakLaixaoHanXaoIaoJaoJaoJaoKanXaoLaoMaoNaoOaoPaoQaobamtamwaoRaoSaoTagTagTagTagTagTaoUaoVagTagTagTagTagTaoWaoXaoYaoZapaapbapcacAapdapeacAaafapfapgapgaphapgapgapiaafaafaaaaaaaaaaafalmapjalmaaaaowancancapkaplancapmamlamlamlallapnamlapoallamlamlamlappallamlallapqaprallamlapsallaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaIMaINaIMaaaaJXaJYaJXaafaafaoDapuaoDaaaaaaaafamHapvapwapxapyapzapAamHapBanSapCapDapEanSanSanSanSanSanSanSanSanSamHaaaapFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaixaoGapGaixapHanXapIapKapJapLapManXapNaobapOapPapQapRapSamtamwamyaoSahxapTapTapTapTapTapUapVapTapTapTapTapTapTapTapTapWapXapYapZapZapZapZapZaqaaqbaqcaqcaqcaqcaqcaqbapWaafaaaaaaaaaaafaqdamlalmaaaaowaqeaqfaqgaqhamlamlamlallamlallaqiamlamlallamlaqjaqkaqlaoyamlallaqmaqnallamlaqoallaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqpaIMaOuaIMaqpaJXaYFaJXaqpaafaqranSaoDaaaaaaamHamHamHamHamHaqsaqtaquaquaqvaqwaqxaqwaqyaqzaqAaqBamHanSamHamHamHanSamHaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqCaqCaqCaqCaqCaqCaqCaqCaqDanXaqEapKaqFaqGaqHanXapNaqIaqJaqKaqLaqMapSamtamwaqNaoSahxapTaqPaqOaqQaqRaqSaqTapTaqUaqVaqWapTaqXaqYaqZapWaraarbarcardarearfargarhaqbaqcaqcaqcaqcaqcaqbapWaafaafaafaafalmalmapjalmalmaowariamlarjamlanKamlallallarkallallarlallallaqlarmarnamlallamlaroaroaroaroaroaroaroaroaroabtabtabtabtaaIabtabtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarpbEPbaWaZZarpbJUbHJbEQarpamHaoDapuaoDaoDaoDamHaruarvarvarvarvarvarvarwarxamHamHamHamHamHaryamHamHanSarzamHarAanSamHamHamHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaqCarBarCaqCarDarEarFaqCaqDanXarGarIarHarHarJarKarLarMarNarNarOarNapSamtamwarPaoSahxapTarRarQarSarTarUarVapTarWarXarYapTarXarZasaapWasbascasdaseaseaseasfasgaqbaqcaqcaqcaqcaqcaqbapWapWapWaaaaaaalmamlamlamlapmaowashaqlarjamlasiasjaskaoyamlamlamlamlaslamlamlarmasmamlasnamlaroasoaspasqaroasrassastaroaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarparpasuarparparpasuarparpasvanSanSaswaswarzasxasyaszasAasAasAasAasAasAasBasCasDaaIasEamHasFasGasHanSasxamHasIanSanSanSaoDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqCaqCaqCasJasJaqCasJasJasJaqCasKanXasLasMasNasOasPasQasRasSaobasTasUasVaobasWamwamyaoSahxapTapTapTapTapTasXasYapTasZataatbapTapTatcatbapWatdateamPatgatgathatiatjatkaqcaqcaqcaqcaqcatlatmatnatoaaaaaaalmamlamlatpamlaowatqamlatratsatsatsatsattatsatuamlamlamlamlamlamlamlamlallasjaroatvatwatwaroatxatyatzaroaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarpatAatBatCarpatDatBatCarpapAatEatFatGatGatGatHatIatJatKatLatMatNatOamHasyatJaaIatPasDaoDatQatRamHamHamHamHamHamHamHanSaoDaafaagaagaagaagaagaagaagaagaagatSatTatSasJasJaqCaqCatUaqCaqCasKanXanXanXatVanXanXanXatWatXaobaobaobaobaobatYamwatZaoSahxapTaqPaqOauaaqRaubaucaudaueaufaugauhauiaujaukaulaumateaunauoauoaupasfauqatoaqcaqcaqcaqcaqcatoaurausatoaafaafallamlamlallallaowaowaowaowaowaowaowaowaowallautauuallallallallallallallauvauwauxauyauzauAauBauCatvauDaroaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaafaqparpasuauEaqparpauFauEaqpamHauGamHamHamHamHamHasyatJanSauHauIanSanSamHasyatJauJaafauJamHapwatRamHauKauLamHasIapAaszauMasAauNauOauOauOauOauOauPauOauOauOauNauQauNauNauRauNauSauRauTauUauVauWauWauWauWauWauWauWauXauYauWauWauWauWauZavaavbavbavcavdapTarRarSarSavfarUavgavhatfavjaxZavlavmavnavoavpavqavraunauoauoaupasfaveatoaqcaqcaqcaqcaqcatoavtausatoaaaaaaallavuamlamlavvallavwanLavxavyanKallatqanKallavzamlallavAamlallavBavCavDavEatsatsavFavGavHavIavJavKavLaroabtabtaaIaaIabtabtabtabtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMavNavNavNavOavNavNavNavPavQavRavPavPavPavSamHavTatJaDravUavVanSavWamHasyavXasAasAasAasAasAasAasCanSavVavYanSanSavZawaawbawcawdawdawdaweawdawfawdawdawgawhawiawjawjawjawjawjawjawkawlawmawnawnawnawnawnawnawnawoawnawpawpawpawpawpawqawrawsawtawuapTapTapTapTapTawvawwawxawyawzawAawBaviawDawEawFawGawHawIawJawJavsawLawMawNaqcaqcaqcaqcaqcawOawPawQatoaaaaaaallamlamlamlamlamlamlavDatsatsatsatsatsatsatsawRamlamlamlamlasnamlamlarjawSawTawUawVawWawXatwatwatwawYaroaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaabfabfabeabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaZaasaasaasaaKabaabbaasaasabcabdaaiaaiaaiaafaaaaaaaaaaaaaaaaafaaaaaVaaaaaaaaaaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabeabeabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaOaaWaaNaaXabiaasabjaasaasaasaasaasaasaauaasabkablaaiaafaafaafaafaafaafaafaafabmabmabmabnabmabmaboaboabpabpabpaboaboaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacCaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaYabraaPadhabuaasaasabvabwabxaasabyabzabAaasabBabCaaiaafaaaaafaafaafaafaaaaafabnabDabEaeIabFabGaboabIabHabKabJabLaboaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafabMaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadbadbadbadbaafaafaaaadcaaaaafaafabfabfabfabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgabNabPabOadhabSabTabSabSabSabUabSabSabSabVabSabSabWaaiactactactactactactactactabmabXabEaeIabYabDaboacaabZaccacbacwaboaaaaafacdaagaagaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfaafaafaaaaceaaaacfaafabfabfabfabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaafaaaaafaaaaaaadcaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgabQacgabRadhackaasaclabSacmacnacoabSacpacqacrabSacsaaiacMacNacOacOacPacQacRacSactacuabEaeIaecabDabpacyacxaczaccacUaboaaaaafacAacBacAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaafaaaaafaaaaaaaceaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaenaenaenaenaenaaaaeoaaaaenaenaenaenaenaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaciacDabsacjacHaasacIabSacJacnacIabSacKacqacIabSacLaaiacMadkadladladladladmadnactacTabEaeIaecabDabpacWacVacXaccadpaboaafaafacAacYacAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacZacZacZacZacZaaaadaaaaacZacZacZacZacZaafabfaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaafaafbafbafbafbafcafdafeaffaffaffaffafgaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafhaaHaaHaaHacFaddacGadhadfadgadhabSadfadiadhabSadfadjadhabSabSaaiafnaRFaNFadVaNFadWbhdbiGactadoabEaeIaecabDaboadradqadtadsaeeaboabnabmadvacBacAacAachaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadwadxadxadxadxadyadzadAadBadBadBadBadCaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafafPafPafPafPafPaaaafdaaaafPafPafPafPafPaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHabhadeadDadGadFadIadHadKadJadMadLadOadNadUadLaepadPadQadRaaiadSadTaNFboSaNFadXadYadZaeaabEabEaebaeTabmaboaedaboahPaboaefaboaegaehacAaeiacAarqanTanTahtaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaemaemaemaemaemaaaadzaaaaemaemaemaemaemaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaafdaaaaaaaaaaafaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHadEaeqaeraeuaetaewaevafiaexavkaifaexaexaexaifaOyaOvaeyaezaaiaeAaeBaeCaeDaeEaeFaeGaeHactahoagSaeJahpabmaeLaeMaeNaeOaePaeQaeNaeRaeSaeVaeUaeVamoamIamJagPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaadzaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaenaenaenaenaenaaaafdaaaaenaenaenaenaenaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaesaOzaRfbfTbfPabSbiEafjafkaflafmacEafoafpafpafpabSafqafraaiafsaftafuafvafwafxafyafzactacvabnafBafCabmafDafEafFafGafHafIafJafKafLacAafMacAaptanTanTagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacZacZacZacZacZaaaadzaaaacZacZacZacZacZaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaafaafbafbafbafbafcafdafeaffaffaffaffafgaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaHaaHbaMbOybkdaaHabSadhafQadfafRafRafRafRafRafRafRafSafTafUafVafWafXafYafZagaagbagcafUagdahSageagfaggaghagiafFagjafHagkaglagmabmadvacAacAacAachaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadwadxadxadxadxadyadzadAadBadBadBadBadCaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfacfafPafPafPafPafPaaaafdaaaafPafPafPafPafPaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaHaaHaaHaaHaaHaaiagnagoagpafRagqagragsagtaguafRagvagwagxagyagzagAagBagaagCagbagDagEagFafFagGagHagIagJagKaeKafAagNagOagLagMagRanUagUacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaemaemaemaemaemaaaadzaaaaemaemaemaemaemaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaafdaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaiagVagWagXafRagYagZahaahbahcafRagvahdaheahfahgahhahiahjahjahkahlahmahnaqqaPUaPTahqahrahsahTahVahuahvahWahwabmacAahxacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaadzaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaenaenaenaenaenaaaafdaaaaenaenaenaenaenaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiahyagWaHeafRagYagZahzahbahAafRahBahCahDahEahFahGahHahIahJahKahLahMahNahObzKbzJahRcdlankaiaahUbuJahXaLjahYahZaibaicaidaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacZacZacZacZacZaaaadzaaaacZacZacZacZacZaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaafaafbafbafbafbafcafdafeaffaffaffaffafgaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaiaieagWaigafRaihaiiaiiaijahcafRaikailafUaimainaioaipaipaiqairafUafUaisaitaduaduaduabmabmabmabmabmabmabmabmabmaivaiwaidaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadwadxadxadxadxadyadzadAadBadBadBadBadCaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaiSafPafPafPafPafPaaaafdaaaafPafPafPafPafPaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaixaixaiyaixaizaiAafRafRafRafRafRafRaiBaiCafRaiDaiEaiFaiFaiFaiFaiFaiFaiFaiFaiGaiHaiIaiJaiFailaiAaiKaiLaiMaiNaiOaiPaiQaiRaiuaivaiwaidaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaemaemaemaemaemaaaadzaaaaemaemaemaemaemaiSabqaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaafaaaaafaaaaaaakEaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaixaiTaiUaiVaiWaiXaiYaiZajaajbajcajdajeajfajgajhajiajjajkajjajjajjajjajjajjajlajjajiajmajkajnajoajpajqajrajsajtajuajvajwaiuaivaiwacAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaafaaaaafaaaaaaadzaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaafaafaafaafalnaloalnaafaafaafaafabfabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaelaekaekaekaejaaaaafaizajyajzajAajBajCajDajEajFajGajHajIajJajMajLajIajJajKajLajIajJajQajOajOajOajPahCajNajRajSajTajUajVajWajVajVajVajXajYaiPaiuaivaiwaidaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaafaafaafaafaafadzaafaafaafaafaafabfabfabfaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaafaaaalnalPalnaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNakJalqalpafNaiyaiyakdakeakfakgakhaiAafRakiafRafRakjakkaklakmaknakoaklakmaknakpakqakmakraksakmaktakuakmakvakwakxaiAakyakzaiPakAaiPakBakCaiPaiuaivaiwaidaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaafaaaaaaakDaaaaaaaafaaaaaaaafaaaaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaafalnalnammalnalnaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaeaoDaoDaoDaoDaoDaaaakcalralRalQamnakKakLakKakeakMakNakOaiAakPakQakPafRakRakSakTafRakUakSakTafRakUakSakTafRakVakWakXakYailafRakZalaalbaiAalcaldalealfalealgalhaliaiuaivaiwaidaafaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaafaaaaaaaljaaaaaaaafaaaaaaaafaaaaaaaaaaafaafaaaaaaaaaaaaaaaallalmallaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaafamDamEamFamGamDamHamHamHamHamHamHamHamHamHaaaaaaaaaaaaaoDaqzasFaqAaoDaaaafNakGakIakHafNaiyaiyaiyalsaltalualvaiAakPakQakPafRalwakSalxafRalyakSalzafRalAakSalBafRalCalDalEakYalFafRalGakSalHaiAalIalJalIalKalIalIalLalIaiuaivaiwacAacAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaaaalMalNalMaaaaafaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaallalOallaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamDanganhaniamDatRatRamHatQanSauPamHbuEamHaaaaaaaaaaafamHbKBanSbKDamHaaaafNajxajxakFafNaaaaaaalSaixaiyalTalUaiAakPalVakPaiAalWalXalXalYalXalXalXalYalXalXalXalYalZamaambamcamdaiAaiAaiAaiAaiAameamfameaiRameameamgaiRaiuamhamiamjacAacAacAaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaalMamkalMaaaaafaafaafaafaaaaafaaaaaaaaaaafaafaaaaaaaaaallamlallaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamDanPanQanRamDbLIbLJaqsbMRanSbMSamHamHamHaoDamHaoDaoDamHbMTbNobMTamHaaaakcakbajxakaafNaiyaiyaiyampamqamramsaizaiAaiAaiAaiAamtamtamtamuamtamtamtamvamtamtamtamuamtamtamtamwamwamxamyamyamyamzameamfameaiRameameamgaiRacAaivamAaeUamBamCamBaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaafalMalMalNalMalMaafaaaaaaaafaaaaafaaaaaaaaaaaaaafaafaaaaaaallamlallaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaamDamDaoEaoFamDaryanSamHanSanSanSaqsanSanSbRdanSasFanSanSanSanSbXQaoDaaaafNajZajxajxafOamKakLamKakeakMakNakMamLamwamwamwamMamwamwamNamwamwamwamwamwamwamwamOamwamwamwamQamwamwamwamwamwamwamRaiRamSamTamUamVaiRamWaiRamXamYamZanaanaanbacAaagaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaafancandaneanfancaafaaaaaaaafaaaaafaaaaafaaaaaaaaaaafallallallamlallallallallallallaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHamHamHamHamHaafaafamHapDapEbZKapxbLJamHamHaoDaoDamHamHamHamHaoDamHaoDaoDamHatKanSbZLamHaaaafNaeZaeZaeZafNaiyaiyanlanmannanoanpaixanqanqanqanqanqanransanqanqanqanqanqanqanqantanuanuanuanvanwanuanxanyanzanAamzanBanCaiuaiuaiuaiuaiuaiuacAanDanEacAanFanGacAaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaafancanHanIanJancaafaaaaaaaafaaaaafaaaaafallalmallalmallanKamlamlamlamlamlamlanLallaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaamHamHamHamHanManNanOamHaaaaaaamHanSapEaryanSanjamHaaaaaaaafaaaaaaaafaafaaIaaIbZMbZMamHcbyanSapBamHaaaaeYaeXaeXaeXaeWaaaaafaizaiyanVaixanWanXanXanYanZanYanXanXaoaaobaobaobaocaobaobaodaoeaofaoganaaohanaanaanaanaaoianaanaanaanaanaaojaokaolaomaonaonaooaopaoqaoraosacAaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaagaagaagaaaaafancaotaouaovancaowaowaowaowaowalmalmalmallaoxamlanLallallamlallallallallaoyallallaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaEoaGaaEpaaaaGbaHoaHnaafaaaaagaagaagaaaaaaaafamHaozaoAaoBanSaoCanSamHaoDaoDamHasHapEaryasHamHamHamHaoDaoDaoDamHamHaaIapFaafaafaaIamHamHaqsamHamHaaaaaaaaaaaaaaaaaaaaaaafaixaoGakLaixaoHanXaoIaoJaoJaoJaoKanXaoLaoMaoNaoOaoPaoQaobamtamwaoRaoSaoTagTagTagTagTagTaoUaoVagTagTagTagTagTaoWaoXaoYaoZapaapbapcacAapdapeacAaafapfapgapgaphapgapgapiaafaafaaaaaaaaaaafalmapjalmaaaaowancancapkaplancapmamlamlamlallapnamlapoallamlamlamlappallamlallapqaprallamlapsallaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaIMaINaIMaaaaJXaJYaJXaafaafaoDapuaoDaaaaaaaafamHapvapwapxapyapzapAamHapBanSapCanSapEaryanSanSanSanSanSanSanSanSamHamHamHaafaaIaafaaIaoDanSaoDaaaaaaaaaaaaaaaaaaaaaaaaaafaixaoGapGaixapHanXapIapKapJapLapManXapNaobapOapPapQapRapSamtamwamyaoSahxapTapTapTapTapTapUapVapTapTapTapTapTapTapTapTapWapXapYapZapZapZapZapZaqaaqbaqcaqcaqcaqcaqcaqbapWaafaaaaaaaaaaafaqdamlalmaaaaowaqeaqfaqgaqhamlamlamlallamlallaqiamlamlallamlaqjaqkaqlaoyamlallaqmaqnallamlaqoallaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqpaIMaOuaIMaqpaJXaYFaJXaqpaafaqranSaoDaaaaaaamHamHamHamHamHaqsaqtaquaquaqvaqwaqxaqwaqycbFarAaqBamHanSamHamHamHanSamHcbHamHaaIaafaaaaafaoDanSaoDaaaaaaaaaaaaaaaaqCaqCaqCaqCaqCaqCaqCaqCaqDanXaqEapKaqFaqGaqHanXapNaqIaqJaqKaqLaqMapSamtamwaqNaoSahxapTaqPaqOaqQaqRaqSaqTapTaqUaqVaqWapTaqXaqYaqZapWaraarbarcardarearfargarhaqbaqcaqcaqcaqcaqcaqbapWaafaafaafaafalmalmapjalmalmaowariamlarjamlanKamlallallarkallallarlallallaqlarmarnamlallamlaroaroaroaroaroaroaroaroaroabtabtabtabtaaIabtabtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarpbEPbaWaZZarpbJUbHJbEQarpamHaoDapuaoDaoDaoDamHaruarvarvarvarvarvarvarwarxamHamHamHamHamHanSamHamHanSarzamHarAanSamHamHamHamHaaaaaaaaaaoDanSaoDaaaaaaaaaaafaafaqCarBarCaqCarDarEarFaqCaqDanXarGarIarHarHarJarKarLarMarNarNarOarNapSamtamwarPaoSahxapTarRarQarSarTarUarVapTarWarXarYapTarXarZasaapWasbascasdaseaseaseasfasgaqbaqcaqcaqcaqcaqcaqbapWapWapWaaaaaaalmamlamlamlapmaowashaqlarjamlasiasjaskaoyamlamlamlamlaslamlamlarmasmamlasnamlaroasoaspasqaroasrassastaroaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarparpasuarparparpasuarparpasvanSanSaswaswarzasxasyaszasAasAasAasAasAasAasBasCasDaaIasEamHanSasGasHarAasxamHasIanSanSanScbIauOaaaaaaaafaoDanSaoDaaaaaaaaaaqCaqCaqCasJasJaqCasJasJasJaqCasKanXasLasMasNasOasPasQasRasSaobasTasUasVaobasWamwamyaoSahxapTapTapTapTapTasXasYapTasZataatbapTapTatcatbapWatdateamPatgatgathatiatjatkaqcaqcaqcaqcaqcatlatmatnatoaaaaaaalmamlamlatpamlaowatqamlatratsatsatsatsattatsatuamlamlamlamlamlamlamlamlallasjaroatvatwatwaroatxatyatzaroaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarpatAatBatCarpatDatBatCarpapAatEatFatGatGatGatHatIatJatKatLatMatNatOamHasyatJaaIatPasDaoDanSarzamHamHamHamHamHamHamHcbJcbIauOaafaaaaafaoDanSaoDaagaagaagatSatTatSasJasJaqCaqCatUaqCaqCasKanXanXanXatVanXanXanXatWatXaobaobaobaobaobatYamwatZaoSahxapTaqPaqOauaaqRaubaucaudaueaufaugauhauiaujaukaulaumateaunauoauoaupasfauqatoaqcaqcaqcaqcaqcatoaurausatoaafaafallamlamlallallaowaowaowaowaowaowaowaowaowallautauuallallallallallallallauvauwauxauyauzauAauBauCatvauDaroaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaafaqparpasuauEaqparpauFauEaqpamHauGamHamHamHamHamHasyatJanSauHauIanSanSamHasyatJauJaafauJamHanSccAamHauKauLamHasIapAaszasAasAauNauOauOauOasAauMaytauOauOauOauNauQauNauNauRauNauSauRauTauUauVauWauWauWauWauWauWauWauXauYauWauWauWauWauZavaavbavbavcavdapTarRarSarSavfarUavgavhatfavjaxZavlavmavnavoavpavqavraunauoauoaupasfaveatoaqcaqcaqcaqcaqcatoavtausapWaaaaaaallavuamlamlavvallavwanLavxavyanKallatqanKallavzamlallavAamlallavBavCavDavEatsatsavFavGavHavIavJavKavLaroabtabtaaIaaIabtabtabtabtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMavNavNavNavOavNavNavNavPavQavRavPavPavPavSamHavTatJaDravUavVanSavWamHasyavXasAasAasAasAauMasAasCanSavVavYanSanSavZawaawbawcawdawdawdaweawdawfawdawdawgawhawiawjawjawjawjawjawjawkawlawmawnawnawnawnawnawnawnawoawnawpawpawpawpawpawqawrawsawtawuapTapTapTapTapTawvawwawxawyawzawAawBaviawDawEawFawGawHawIawJawJavsawLawMawNaqcaqcaqcaqcaqcawOawPawQapWaaaaaaallamlamlamlamlamlamlavDatsatsatsatsatsatsatsawRamlamlamlamlasnamlamlarjawSawTawUawVawWawXatwatwatwawYaroaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMawZaxaawZaxbaxaaxaaxcawZaxaaxdaxeaxfaxfaxgamHavTatJaxhanSanSaxiaxjamHaxkarvarvarvarvarvarvaxlatJaxmanSamHasvasvaxnapNaqCaxoaxpaxqaxqaxraxqaxsaxqaxqaxtaxoaxuaxvaxvaxvaxvaxvaxvaxvavZaxwaxxaxyaxzaxAaxBaxCaxDaxEaxFaxGaxHaxIaxJaxKaxLamwaxMacAaeUapTaqPaqOaxNaqRaxOaxPaxQaxQaxQaxRaxSaxTaxUaxVaulaxWaxXaxYaHFayaaybatiaycaydaqcaqcaqcaqcaqcaydapWapWapWallallallanKallallaoyallallarjallallayeallallaoyallarjavuallallaoyallamlavuarjawSayfaroaygavGayhayiayjavGaykaroaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarpavMaylavMaBGaxaaxaaMBavMaylavMayqayraxbaysamHavTavXaytasAasAasCayuayuallasnallayuayuayuayuayvaywauQauNauNauNauNayxapNarBaxoaaaaafaaaayyaaaayzaaaaafaaaaxoaxuaxvayAayBayCayDayEaxvavZayFayGayHayIayJayKayLayMayMayNayOayOayOayPaxKayQamwayRacAaeUapTarRarSarSaySarUayTayUayVayWayXayYayZayZazaayZapWazbazcazdazeazfazgapWaydaqcaqcaqcaqcaqcaydallaqoamlawTazhallallallaqoamlallaqoarjallaziamlallazjamlallazkazlallazmamlallaoyaoyarjaznazoaroazpavGazqazrazqavGazsaroaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaztaqpazuatBavMaymaynawCaypavMatBazuavMaqpazvazwamHazxazyazzazAatGazBayuazCazDazEazFazGazHazCayuazIazJazKawdawdawdawdawdazLazMaxoaafazNazNazOazNazPazNazNaafaxoaxuaxvazQazRazSazTazQaxvazUazVazWazXazYazZaAaaAbaAcaAdaAeaAfayOayOayOaAgayQamwaAhacAaeUapTapTapTapTapTaAiaAjaAkayZayZayZayZayZaAlaAmaAnayZapWapWapWapWaAoaApapWaydaqcaqcaqcaqcaqcaydallallamlaAqazhallaArallamlamlallamlarjallamlamlallamlamlallarjasjallamlamlallaAsamlarjawSaAtaroaroaroaroaroaroaroaroaroabtabtabtabtabtaafaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6646,8 +6724,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtobqxbqybqxbmlbtpbjxbjxbtqbjxbtpcuWbjxbjxbqAbtraYpbtsbttbnGbtubtvbecbpbbjEbtwbtxbmzbsnbqHaWUbpibtyblibtzbtAbtBbtCbmGbliaaaaaaaafbtDbtEbnUbtFbtGaafaaaaaabqVbtHbtIbtJbtKbtLbtMbtNbpubtOaHYaHYbmSbmSbtPbtQbpGbtRbtSbtTbtUbtVbtWbtXbtWbtXbtWbtXbtWbtXbtYbtZbsPbuabubbucbudbuebufbugbuhbuibujbncbukbulbumbnmbunbhJbhJbuobhJbhJbupbuqburbusbutbtcbuubuvbuwbuxbuxbuxbuybuybuybuybuybwcbwbbwebwdbwebwfbwebrVbsbbgxbwgbqvbwhbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabuFbuGbuFbuHbuIbuHbuHbuHbuHbuHcuXbuKbjxbqAbuLaYpbuMbaHbuNbuObuPbuQbuRbuRbuRbuQbuQbuSbqHaJkbuTbpjblibuUbuVbuWbuXbuYbliaaaaaaaafbuZbvabqRbvbbvcaafaaaaaabqVbvdbvebvfbvgbtLbtMbtNbpubvhaHYaHYbvibvjbvkbvlbvmbvnbtXbvobvpbvqbvrbvsbDibvubvvbvubFzbtXbhkbjZbsPbvxbvybvzbvAbvBbvCbvDbvEbvEbvFbvGbvHbvIbvJbvKbvLbvMbvNbvMbvMbvObvMbvMbvPbvQbvRbvRbvSbvTbqibuxbvUbvVbvWbvXbvYbambuybxjbxibzCbyAbzDbxibAVbrVbsbbgxcjgbsebsebjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbkNaYpbkNbkNbkNbwibwicuYbwibwjbwkbwkbwibwibwlbwlbwmbwnbuQbwobwpbwqbwrbuQbsnbqHaHZaIcaIcbliblibwsbliblibwtbliaHUaHUaHUbwubwvbsubwwbwxaHUaHUaHUbpubpubpubpubpubpubpubpubpubvhaHYbwybtXbtXbtXbwzbtXbtXbtXbwAbvpbwBbwCbwDbwEbwFbwGbwHbwIbwDbhkbjZbsPbwJbwKbwLbwMbwNbwObrAbrAbrAbwPbwQbwRbwSbwTbwTbwTbwTbwUbwTbwTbwTbwVbwVbwWbwXbwYbwYbwZbxabqibuxbxbbxcbxdbxeahQbxgbxhbrVbrVbFBbFBbFBbrVcfYbrVbsbbgxbwgbqvcvhbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwicuZbxlbxmbxnbxobxpbwkbxqbxrbxsbxtbxubxvbxwbxxbxybuQbsnbqHaHYaHYaHYbxzaKQbxAaKAbxBbxCbxDaVLaVLaVLbxEbxFbxGbxHbxIaHYaHYaHYaHYaKQaHYaKAaHYaHYaHYbxzaHYbvhaHYbxJbtXbxKbxLbxMbxNbxObtXbxPbxQbxRbxSbwDbwEbwEbxTbxUbxVbwDbhkbxWbsPbrAbxXbxYbxZbwQbyabybbycbydbncbncbeHbyebwTbyfbygbyhbyibyjbykbwTbylbymbynbyobypbwYbyqbyrbysbytbyubyvbywbyxbyybyzbxhchfchfchfchfchfchfchfbrVbsbbgxbsdbsebseabtaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwkbyBbyCbyDbyEbyFbyGbyHbyIbyJbyKbyLbyMbyNbyObxxbyPbuQbsnbyQaHYaHYaHYaHYaHYaHYaKAaHYbqHaHYaHYaHYaHYaHYbyRbySbyTaHYaHYaHYaHYaHYaHYaHYaKAbyUaHYaHYaHYaHYbvhbyVbyWbtSbyXbyYbyZbyYbzabtXbzbbvpbvqbzcbtXbzdbzebzfbzgbzhbtXbhkbjZbsPbsPbsPbsPbsPbncbncbncbncbncbncbzibgibzjbwTbzkbzlbzmbznbzobzpbwTbzqbzrbzsbztbzubwYbyqbzvbzwbzxbzybzzbzzbzzbzAbzBbxhchfchfctEctDchfchfchfbrVbsbbgxbsdbsebsebjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaabwicuZbxlbxmbxnbxobxpbwkbxqbxrbxsbxtbxubxvbxwbxxbxybuQbsnbqHaHYaHYaHYbxzaKQbxAaKAbxBbxCbxDaVLaVLaVLbxEbxFbxGbxHbxIaHYaHYaHYaHYaKQaHYaKAaHYaHYaHYbxzaHYbvhaHYbxJbtXbxKbxLbxMbxNbxObtXbxPbxQbxRbxSbwDbwEbwEbxTbxUbxVbwDbhkbxWbsPbrAbxXbxYbxZbwQbyabybbycbydbncbncbeHbyebwTbyfbygbyhbyibyjbykbwTbylbymbynbyobypbwYbyqbyrbysbytbyubyvbywbyxbyybyzbxhchfchfchfchfchfchfchfbrVbsbbgxbsdbsebseabtaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaabwkbyBbyCbyDbyEbyFbyGbyHbyIbyJbyKbyLbyMbyNbyObxxbyPbuQbsnbyQaHYaHYaHYaHYaHYaHYaKAaHYbqHaHYaHYaHYaHYaHYbyRbySbyTaHYaHYaHYaHYaHYaHYaHYaKAbyUaHYaHYaHYaHYbvhbyVbyWbtSbyXbyYbyZbyYbzabtXbzbbvpbvqbzcbtXbzdbzebzfbzgbzhbtXbhkbjZbsPbsPbsPbsPbsPbncbncbncbncbncbncbzibgibzjbwTbzkbzlbzmbznbzobzpbwTbzqbzrbzsbztbzubwYbyqbzvbzwbzxbzybzzbzzbzzbzAbzBbxhchfchfctEctDchfchfchfbrVbsbbgxbsdbsebsebjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibzEbzFbzGbzHbzIcvbcvacvccvcbAZbzLbuRbzMbzNbzObzPbuQbzQbzRbzSbzSbzSbzTbzSbzSbzUbzSbzVaHYbzWbzXbzYbzYcuBbAabAbbAcbAdbAeaVLaVLbAfaVLbAgbAhaVLbAibAjbAkbAlaHYaHYbtXbAmbAnbAobtWbApbtXbtWbAqbArbtXbtXbtXbtXbtXbtXbtXbtXbhkbjZbfXbAsbAtbAubAvbAwbAxbAybAzbAAbAwbzibgibABbwTbACbADbAEbAFbAGbAHbwTbAIbAJbAKbALbAMbwYbyqbANbAObuybAPbxfbARbASbATbAUbxhchfchfchfbscchfchfchfbrVbsbbqtbAWbqvbqwbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibwibwkbwkbwkbwkbwibwibAXbAYbAZbBabuQbuQbuQbuQbuQbuQbBbbBcaIcaIcaIcaIcbBdbBdbBdbBdbBdbBdbBdbBdbBdbBdbBebBfbBgbBhbBhbBhbBhbBhbBibBhbBhbBjbBhbyebBkbyeaIdaJlbBlbtXbBmbBnbBobBpbBqbtXbBrbxQbBsbBtbBubBvbBwbBxbBybBzbBAbBBbBCbBDbBDbBEbBFbBGbBHbBIbBJbBKbBLbAwbzibgibBMbBMbBMbBMbBMbBMbBMbBMbBMbBNbBNbBNbBNbBNbBNbBObBPbBQbuybuybuybuybuybuybuybxhbrVbrVbrVbrVbrVbrVbrVbrVbsbbgxbBRbBSbjobjoaafaafaafaagaagaagaagaagaagaagaagaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBTaaaaaaaaaaafaaaaaabwlbBUbBVbBWbBXbBYbBZbCabCbbCcbCdbCebCfaaaaaaaafaaabBdbCgbChbCibCjbCkbClbCmbCnbCobCpbCqbCrbBhbCsbCtcuDbCubCwbCvbCvbCxbCybCzbCAbyebyebyebyebtXbCBbCCbCDbCCbCEbtXbCFbvpbCGbCHbCIbCJbCIbCIbCKbCLbCMbCNbCObCObCObCPbCQbvlbCRbCSbCTbCUbCVbAwbzibgibBMbCWbCWbCWbCXbCWbCWbCWbBMbCYbCYbCZbCYbCYbBNbDabDbbqibDcbDdbDebDfbDgbDhbJqbDjbDkbDlbDmbDnbDobsmbtnbtnbvwbDsbDdbDdbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6655,45 +6733,45 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNcuCctMcuCafNbERbERbERbwlbESbxrbETbEUbEVbEWbwlbBcbEXbBcbBcbEYbEZaaabFabFbbFcbFdbDIbDIbFebDIbFfbFgbFhbDIbBdbDLbFibFjbBhaGfbFlbFmbFnbFobCvbFpbBjbzibFqbFrbFsbFrbFtbFubtXbFvbCIbFwbCIbFxbtSbFybCJbFAbtXbFCbCCbCCbCCbCCbGNbmSbPIbFEbFFbFGbBEbFHbvlbFIbBKbBKbFJbFKbFLbFMbFNbBMbCWbCWbCWbCWbCWbCWbCWbBMbFObFPbFQbFRbFSbFTbFUbFVbtbbFWbFXbEDbFYbEDbEDbEDbEDbEDbEDbEDbDnbFZbDpbGbbGcbGdbGebGfbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbGgbENbEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaekajxctyajxaekbERbGhbGibwlbGjbxrbGkbxrbxrbEWbwlbGlbGmbGnbBcbEYbEZaafbFabGobGpbGqbGrbGsbGrbGrbGtbGubGrbGrbGvbGwbGxbGybBhbGzbBhbBhbBhbBhbGAbGBbGCbGDbGEbGFbGGbGHbGIbGIbtXbGJbGKcltbGMbGQbtXbGObGPbGSbtXbGRbDqbEHbDrbFDbGWbmSbGXbGYbpFbGZbHabHbbHcbCRbHdbAQbBKbHebAwbzibgibBMbBMbHfbCWbCWbHgbHfbBMbBMbHhbHibHjbHkbHlbBNbHmbHnbtbbHobHpbHqbHqbHrbHsbHtbHqbHubHvbHwbHxbHybGabHAbHBbHCbHDbHEbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObHGbHHbHIbEObHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNajxajxajxctLbHKbxrbxrbHLbGjbxrbxrbxrbxrbEWbwlbHMbGnbHNbBcbEYbEZaaabFabHObHPbHQbDIbDIbHRbDIbHSbHTbHUbHVbBdbHWbHXbHYbHZbIabIbbIbbIbbIbbIbbIcbIbbIdbIebIfbIgbIhbIibIjbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbMNbMNbMNbMNbMNbMNbOnbOCbmSbmSbmSbmSbIlbImbhjbAwbAwbAwbAwbAwbAwbzibgibBMbInbIobIpbIqbIrbIsbInbItbHhbHibHjbIubIvbIwbIxbIybuwbIzbDdclFbIAbIBbICbIDbIEbEDbEDbIFbDnbIGbGLbIIbDdbIJbIKbIKbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObILbIMbIMbIMbINbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaekctyctyctyaekbERbIObIPbIQbIRbxrcuQbISbITbIUbwlbBcbBcbBcbBcbEYbDCaafbIVbDEbIWbDGbIXbDIbIYbDIbDIbDIbDIbDIbBdbDLbIZbJabJbbJcbJcbJcbJcbJcbJcbJdbJebJfbJgbJhbJibJjbJkbJlbJmbJnbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJobJpbmSbGXcqlbBDbJrbBEbJsbJtbJubJvbJvbJwbJxbJgbJybJzbBMbJAbJBbJCbJDbJEbJFbJGbItbItbItbItbItbItbJHbJIbJJbJKbJLbDdbDnbDnbDnbDnbDnbDnbJMbEDbEDbDnbjobvZbgxbDdbJNbJObJPbJQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJRbJSbJRbIMbJTbIMctxctlbENaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNajZctzctAafNbERbERbERbwlbwlbERbERbERbwlbwlbwlaaaaaaaaabJYbJZbEZaaaaaaaafaaabBdbKabKbbKcbDIbKdbKebKfbKgbKhbKibKjbKkbKlbKmbKnbKobKpbKqbKmbKmbKmbKmbKmbKrbKsbKmbKmbKtbKmbKubKmbKmbKmbKmbKmbyebyebyebyebyebyebyebyebKvbKwbmSbKxbKybKzbKAbKBbKCbKDbKEbKFbKFbKGbKFbKFbKHbKIbBMbKJbKKbKLbKKbKMbKKbKNbKObKPbKQbKRbKSbKTbKUbyqbHnbqibKVaafbKWbKXbKYbKZbLabKZbLbbLcbLdbDnbLebsbbLfbDdbDdbDdbDdbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObLgbIMbIMbIMbLhbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeYctjctkctjaeWaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaafbJYbEYbEZaafaafaafaafbBdbBdbBdbBdbBdbBdbBdbBdbBdbBdbLjbLkbLlbLmbKmbKnbKobKpbKqbLnbLnbLobLpbLqbLrbLsbLtbLubLvbLwbLxbLybLzbLAbLBaVQbLDbLDbLDbLDbLDbLDbLEbyebKvbLFbLGbLGbLGbLGbLGbLHbpobLJbLGbLGbLGbLGbLGbLGbLFbLKbLLbLMbLNbLObLNbLPbLQbLRbLSbLSbLSbLSbLSbLSbLTbLUbLVbqibKVaafbKWbLWbLWcuEbLYcuFbMabMbbMcbDnbMdbsbbkFbjobMebMfbjoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObMgbMhbMibMjbHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaaabJYbEYbEZaaaaaaaaaaafbMkbMlbMlbMmbMnbMobMobMpbMpbMkbDLbMqbKkbMrbKmbMsbMtbMtbMubMvbLnbMwbMxbMybMzbMAbMBbMCbMDbMEbMFbMGbMFbMHbMIbMJaafbMKbMKbMKbMKbMKbMLbyebKvbMMcqzbMObMPbMQbLGbMRbMSbMTbLGbMUbMVbMWbMVbMUbLFbMXbBMbKKbKKbKKbMYbKKbKKbMZbNabNbbNbbNcbNbbNbbNdbNebNfbNgbKVaafbKWbLWbNhbKZbNibKZbNjbNkbNlbDnbsebsbbkFbjobsebsebjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbNmbENbMjaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbBcbBcbJYbJYbJYbBcbBcaaaaaaaaaaaabJYbEYbEZaaaaaaaaaaafbMkbNnbMmbMmbMmbMmbMobYnbNpbNqbNrbKjbNsbNtbNubNvbNwbNxbNybNzbNAbNwbNwbNwbNybNBbNCbNDbNEbNFbLBbNGbNHbNIbNJbNKbLDbNLbNMbNNbNObMKbMLbNPbKvbLFbNQbMUbMUcrqbLGbNRbNSbNTbLGbMVbNUbMVbNVbNWbNXbNYbBMbNZbOabObbOcbOdbOebOfbOgbOhbOibOjbOkbOlbItbOmbZlbOobOpbOpbDnbDnbDnbDnbDnbDnbDdbDdbDdbDnbsebsbbOqbsebsebOrbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbENbEObENaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBcbOsbGnbOtbGnbOubBcaaaaaaaaaaaabJYbJZbEZaaaaafbJYbJYbMkbMmbMmbOwbOvbMmbOxbMobMobOzbDLbMqbOAbOBbZmbODbOEbOFbOGbOHbOIbOFbOJbOFbOKbOLbOMbLubONbOObOPbOQbORbOSbOTbOUaafbOVbOWbNObOXbMKbMLbNPbKvbLFbOYbOZbMUbPabLGbpCbPcbPdbLGbMUbPebPfbMUbMUbLFbKvbBMbItbItbItbItbJHbPgbPhbPibJHbItbItbItbItbItbPjbPkbPlbPmbPnbPobPpbPqbPpbPrbOpbPsbPtbPubPvbPwbsbbkFbjobjobjobjoabtaafaafaafaagaagaagaagaagaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbBcbPxbGnbGnbGnbPybBcaaaaaaaaaaaabJYbEYbEZaaaaafbJYbPzbPAbPBbMmbMmcbdbPDbPDbPDbPEbPFcbebMqbOAbPHccdbPJbPKbMFbPLbPMbPNbPObPPbPQbPRbPSbPSbPTbPUbLBbPVbPWbPXbPYbPZbQabQbbNLbQcbNObNObMKbMLbNPbKvbLFbQdbMUbQebLHbLGbLGbQfbLGbLGbQgbQhbQibQgbQgbLFbKvbBMbQjbQkbQkbQlbQmbKKbQnbQobQpbQqbCWbCWbCWbItbQrbQsbQtbQubQvbPobQwbQxbQybQzbOmbPtbQAbPtbPvbBRbGTbGUbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaabBcbPxbGnbGnbQDbQEbBcaaaaafaaaaaabJYbEYbDCbBcbBcbBcbQFbMkbQGbMmbMmcqmbQHbQIbQJbQKbMkcqnbMqbOAbPHcqobQLbQMbMFbMFbQNbLnbQObQPbQQbQRbMFbMFbLubQSbQTbQUbQVbQWbQXbQWbQYaafbMKbMKbMKbMKbMKbMLbyebKvbLFbQZbRabRabRbbRcbxkbRebRfbRgbMUbPebMUbMUcqpbLFbKvbBMbCWbUobCWbRhbRibKKbRjbKKbRkbRlbCWbUobCWbItbRmbRnbRobRpbRqbRrbRsbRtbRrbRubOpbRvbPtbRwbPvbOpbSsbGVbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafbRzaafaafaafbBcbBcbBcbBcbBcbBcbBcbBcbBcbBcbRAbBcbBcbBcbJYbJYbJYbRBbRCbRDbREbRFbRGbRCbRHbPFbPFbPFbPFcqrbMkbMkbMkbMkbMkcqtbRKbOAbRLbKmbRMbRNbPNbRObPNbLnbMFbMFbMFbQRbRPbRQbRQbRRbRSbRTbNGbRUbRVbRWbNKbLDbNLbRXbRYbRYbMKbMLbyebKvbRZbSabSabSabSbbScbMUbSdbMUbMUbMUbPebMUbMUbMUbLFbKvbBMbCWbCWbCWbSebSfbQobSgbKKbShbSibQkbQkbSjbItbSkbSlbPlbSmbSnbPobQybSobRrbSpbOpbSqbSqbSqbPvbSrbSsbGVbjoaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabStbSubSubSubSubSvbSwbSwbSxbSybSzbSAbSBbSCbSDbSEbBcbGnbGnbGnbGnbGnbGnbGnbSFbSGbSHbSIbSJbSKbSKbSKbSKbSLbSMbSMbSMbSNcqubSObDybDybSPbBccqnbMqbOAbSQbSRbSSbSTbRQbRQbSUbSVbRQbRQbSWbSXbSYbMFbSZbTabTbbTcbMFbTdbTebTfbOUaafbOVbTgbThbTibMKbMLbNPbTjbTkbTkbTkbTlbLFbTmbQZbTnbTobTpbTqbTrbTsbTsbTtbLFbKvbBMbItbItbItbItbTubTvbRjbTwbTubItbItbItbItbItbTxbTybTzbTAbTBbTCbTCbTCbTCbTDbOmbSqbSqbTEbPvbTFbSsbGVbjobjobjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaaaaafaaaaaabJYbJYbJYbGnbTHbTIbTJbTKbTLbBcbTMbJYbJYbJYbJYbJYbJYbJYbJYbDCbTNbTObTObTObTObTObTObTObTObTPbTPcqxbTPbTPbTQbTRbBccqnbMqbOAbSQbTSbTTbTUbTVbPSbTWbTXbPSbPSbTYbTZbUabUbbUcbUdbUebUfbMFbTdbUgbUhbQabQbbNLbUibRYbRYbMKbMLbNPbUjbyebyebyebNYbLFbUkbMUbMUbUlbUmbUnbVibUpbVibUnbLFbKvbBMbQjbQkbQkbUqbQmbKKbQnbQobUrbUsbCWbCWbCWbItbUtbUubUvbUwbRnbRpbUxbUybUzbUAbOpbSqbSqbSqbPvbTFbSsbGVbsebsebjoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaagaagaagaagbUDbGnbUDbGnbUEbTIbTIbUFbGnbBcbGnbJYaaaaaaaafaaaaaaaafaaabDCbTNbTObUGbUHbUIbUJbUKbULbUGbUMbUNcqCcqybTPbTPbTRbBccqDbMqbOAbURbUSbUTbUTbUUbKmbKmbKmbKmbKmbUVbUWbLnbLnbLnbUXbMFbTbbMFbTdbTebUYbOUaafbMKbMKbMKbMKbMKbMLbNPbUjbyebUZbzibNYbMMbVabVbbVcbVdbVebVfbVgbUpbVgbVhbLFbKvbBMbCWcqUbCWbVjbRibKKbRjbKKbRkbVkbCWcqUbCWbItbVlbVmbVnbVobVpbVqbVrbVsbVtbVubOmbVvbVwbVxbPvbSqbSsbHzbjobsebjobjobjoaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbJYbJYbJYbVzbVAbVBbVCbVDbGnbVEbGnbJYaaaaaaaafaaaaaaaafaaabDCbTNbTObUGbVFbVGbVHbVIbVJbUGbVKbVLcqEbVNbVObTPbTRbBccqnbMqbOAbVPbVQbKmbVRbVSbKmbVTbVUbVVbKmbVWbQRbVXbLnbVYbUfbMFbUdbVZbWabRVbWbbNKbLDbNLbWcbWdbWebMKbMLbyebUjbyebABbzibNYbLFbWfbWgbWhbWibUmbWgbWjbUpbWjbNVbNXbKvbBMbCWbCWbCWbWkbWlbQobSgbKKbShbWmbQkbQkbSjbBMbPvbWnbWobWobPvbPvbWpbWqbWrbWsbWtbWubTCbWvbSqbSqbSsbGVbjobWwbjobWxbjoaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbJYbWybWzbWzbWAbTLbWBbBcbJYbJYaaaaaaaaaaaaaaaaaaaaabDCbTNbTObWCbWDbWEbVHbWFbWCbWCbVKbWGcqGcqFbWIbTPbTRbBccqnbMqbWJbWKbWKbWLbWMbWNbWObWPbWQbWRbKmbMFbQRbWSbWTbVYbWUbMFbUdbVZbTdbTebWVbOUaafbOVbWWbWXbWYbMKbMLbyebUjbyebGHbGHbNYbLFbLGbWZbXabLGbXbbLGbLGbLGbLGbLGbLFbKvbBMbItbItbItbItbTubXcbRjbXdbTubItbItbItbItbBMbRrbXebRrbRrbRrbPvbWpbWqbXfbXgbXhbXibUwbXjbPvbSqbSsbGVbjobsebsebsebXkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafbBcbBcbBcbBcbBcbBcbVEbBcbBcbBcbBcaafaaaaaabXlaaaaaaaaaaaaaaabEZbTNbTObWCbWCbXmbXnbXobWCbXpbXqbXrcqIcqHbXsbTPbTRbBccqJbXwbCrbWKbXxbXybXybXzbXAbXBbXCbXDbKmbXEbXFbVXbLnbVYbXGbMFbXHbVZbTdbXIbXJbQabQbbNLbXKbWdbWdbMKbMLbNPbUjbyebXLbzibNYbXMbSabSabXNbLGbIHbIkbQBbyebXRbXSbKwbKvbBMbQjbQkbQkbXTbQmbKKbQnbQobXUbXVbCWbCWbCWbBMbXWbRrbRrbRrbRrbPvbXXbXXbXYbXZbOpbOpbUwbOpbPvbOpbSsbGVbjobYabYbbYcbXkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabfabfabfabfabqabfabfabfabfabfaaaaaabBcbGnbGnbGnbGnbGnbGnbGnbGnbWBbJYaafaaaaaaaafaaIbYdaaaaaaaaabEZbTNbTObYebYfbYgbYhbYibYjbYkbYlbYmcqMcqKbYobTPbYpbYqbYrbYsbGybWKbYtbXybYubYvbYwbYxbYybYzbYAbNFbYBbLnbLnbLnbYCbMFbYDbYEbTdbTebMFbOUaafbMKbMKbMKbMKbMKbMLbNPbUjbyebYFbzibYGbYHbTkbYIbYJbyebRybQCbTGbyebYNbKFbYObYPbBMbCWbUobCWbYQbRibKKbRjbKKbRkbYRbCWbUobCWbBMbYSbRrbYTbRrbRrbYUbYVbYWbYXbYYbOpbUwbUwbYZbPvbBRbZabUBbjobZcbZdbsebXkaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaafaaaaafaaaacfaaaaafaaaaafaaaabfaafaafbBcbZebGnbBcbBcbBcbRAbBcbBcbBcbBcaaaaaaaaaaaIbZfbZgaaIaaIaafbEZbTNbTObZhbWCbUGbUGbUGbWCbZibZjbZkcqGcqNcqPbTPbBcbBcbZnbZobZpbWKbWKbZqbXybZrbZsbZtbZsbZubKmbMFbZvbZwbZxbZybONbZzbZAbZBbWabRVbZCbNKbLDbNLbZDbZEbZEbMKbMLbNPbUjbyebyebyebZFbZGbyebZHbZIbyebyebZJbyebyebZIbZKbZLbZMbBMbCWbCWbCWbZNbZObQobZPbKKbShbZQbQkbQkbSjbBMbRrbRrbZRbRrbRrbPvbXXbXXbZSbZTbOpbZUbZVbZWbPvboUbZabGVbjobjobjobsebjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXbZYbZZaaabZXbZYbZZaaabZXbZYbZZaaaabfaaaaaabBccaacabbBccacbGnbGncadbOucaebBcaaaaaaaaacafaaIaaIaafaaaaaabEZbTNbTObWCcagcahbUGcaibWCbWCbVKcajcqGcqKcakbTPcalcamcancaocapcaqcarcascatcascatcaucatcavbKmcawcaxcaybPSbPSbPUbRPcazbRUbPVbTecaAbOUaafbOVcaBcaCcaDbMKbMLbyebUjbzicaEcaFbZFcaGbyebZHcaHcaIcaJcaKcaLcaIcaMbZHbgxcaNbBMbBMbBMbBMbBMbBMcaOcaPcaObBMbBMbBMbBMbBMbBMbPvbPvbPvbPvbPvbPvcaQcaQcaRcaSbPvbPvbPvbPvbPvbjobRxbGVbjocaTcaUbsebjoaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafbZXcaVbZZaaabZXcaVbZZaaabZXcaVbZZaafaafaaaaaabBcbJYbJYbBcbBccaWcaXbOubGnbQDbBcaaaaaaaaaaaaaafaaaaaaaaaaaabDCbTNbTObUGcaYcaZbUGcbacbbbUGbVKcbccqEcqQcqVcuPcqXcqWbOAaZDcbgcbhcbicbjcbkcblcbmcbnbXycbobKmcbpbMFbZvbRPbRQcbqcbrcbscbtbLAcbucbvbQabQbbNLcbwbZEbZEbMKbMLbyecbxcbycbzcbAcbBcbCbyecbDcbEcbFcbGcbHcbGcbIcbEcbJbgxcbKbjoaaaaaaaaaaafaaaaaacbLaaaaafaaaaaaaaaaaabjocbMbMfbkGcbNcbNbPvcbOcbOcaRbQtcbPcbQbsebsebsebBRbRxbHzbjocbRbsebsebjobjobjoaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXcaVbZZaafbZXcaVbZZaafbZXcaVbZZaaaaafaafaafaafaafaafaafbBcbBcbBcbBcbRAbBcbBcaaaaaaaaaaaaaafaaaaaaaafaaabDCbTNbTObUGcbScbTcbUcbVcbWbUGcbXcbYcbZccaccbbTPccccqYcceccfccgcchcciccjcckcclccmccnccoccpccqccrbMFbZvcctbMFbMFbMFcctcctcctbTeaVSaVRaafbMKbMKbMKbMKbMKbMLbyebYFccuccvccwccxccybyebyecczccAccBbKwccCccDbyebyebgxcbKbjoaaaaaaaaaaafaaaaaacbLaaaaafaaaaaaaaaaaabjobseccEbqvccFccGbPvccHccHccIbQtbPvbOpbjoccJccKbBRbRxbGVbsebsebsebUCbkHbVybkHaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbZXcaVbZZaaabZXcaVbZZaaabZXcaVbZZaafaafaaaaaaaaaaaaaaaaaabBcccRbBcbGnbGnbBcaafaaaaafaaaaaaaafaaaaaaaafaaabDCbTNbTObTObTObTObTObTObTObTObTPbTPbTPbTPbTPbTPbBcccSbBcccTccUccUccUccVccWccXccUccYccZcdabKmbMFbOQccscctbMFbMFbMFbMHbSYcctbTecctbKmaafaafaafaafaafaafbMLcdjcdjcdjcdkcvdcdjcdjcdjcdmbyecdncdncdocdncdnbyebABbZGcbKbjobXkbXkbXkbjobXkbXkcdpbXkbjobXkbXkbXkbXkbjobjobRxcdqbjobjobPvbPvbPvcdrcdsbPvbBRbjobYcbseboTbRxbUBbjobjocdtbjobjobjobjoaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaafaaabZXcaVbZZaaabZXcaVbZZaaabZXcaVbZZaaaaafaaaaaacducdvcdvcdvcdvbBcbBccdwbGnbBcbJYbJYbJYbJYbJYbJYbJYbJYbJYbBcbDCbTNbBccdxcdycdzcdzcdzcdzcdzcdzcdzcdzcdzcdAcdAcdzcdBcaWccTcdCcdDcdEcdFcdGcdHccUcdIcdJcdKbKmcdbcdcbPXcddcdecdfcdecddcdgcddcdhcctbKmbKmbKmaaaaaaaafaaacdVcdWcdXcdYcdZceacebceccdjcedceecefcegcehccBccBbzibzibZGbntceiceiceiceiceiceiceicejcekcekcekcekcekcekcelcekcemcekcekcenceocepceqbXOcesbjobjocetceoceuceocevbGVbjocewbsebsebjoaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaaaaaacexaaaaaaaaacexaaaaaaaaacexaaaaaaaafcducducduceycezceAceBceCbGnceDceEceFceEceEceEceEceEceEceEceEceEceEceGceHbRGceIceJceKceKceKceKceKceKceKceKceKceKceKceKceKceKccTccUceLceMceNceOcePceQceRceSceTceKcdbcdLcdMcdNcdOcdPcdQcdRbMFcdScdTcdUbLCcdibLCaaaaaaaafaaacdjceXceYceZcfacfbcfccfdcdjcedcfeccBcffcfgcfhcfibDZcfjcfkcflcflcflcflcflcflcflcfmcfncflcflcflcflcflcflcfocfpcfqbmicfrcfscftcftcftbXPbYKbXQbYMbYLcbfbZbbZbccLccMbjocaUbsecfCbjoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafalkcfEcfEcfFcfGcfGcfGcfGcfGcfGcfGcfGcfGcfGcfGcfHcfIcfJcfIcfKcfLcfMcfNceEcfOcfPbOubBcbJYbJYbJYbJYbJYbJYbJYbJYbJYbBcbBccfQbSKcfRcfSceKcfTcfTcfUceKcfVcfWcfXctHcfZcgacgbcgccgdcgeccUcgfcggcghcgicgjcgkcglcgmcgnceKbKmcsKbLuceVbLuceUbLuceVbLuceWbLucsNbKmbKmbKmaafaafaafaaacdjcgqcgrcgscgtcgucgvcgwcdjbzicgxcgycgzcgAcgBbDZcgCcgDbyebjobXkbXkbXkbXkbjobXkbXkbXkbXkbjobXkbXkbXkbXkbjocgEbsebjocgFcgGbjobjobXkbXkbjobjocgHbZacgIbjocgJcgKboRbjobjobjobjobjoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaaaaaacgLaaaaaaaaacgLaaaaaaaaacgLaaaaaaaafcducducducgMcgNcgOcdvbGnbGnbGnbGnbBcaaaaaaaafaaaaaaaafaaaaaaaafaaabBccgPbBccgQcgRceKcgScgTcgUcgVcgWcgXceRceRceRcgYcgZchachbcgXccUchcchdchecgictIccUchgchhchiceKaafcgoaafbMLaafcgoaafbMLaafcgpaafcgpaafaafaaaaaaaaaaafaafcdjchmchnchochpchqchrchschtchuchubFMchvchwbFMchxbyebyebyeaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaabjochybLebjochzbZabjoaaaaaaaaaaaabjobsebZachAchBchBchCchDchBaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaafaaabZXchEbZZaaabZXchEbZZaaabZXchEbZZaaaaafaaaaaacducdvcdvcdvcdvchFbWBbGnbGnbBcaafaafchGchGchGchGchGchGchGaafbBcbBcbBcchHchIceKchJcgUcgUcgVchKchLchLchMchNchOchPchPchQceRccUchRchSchTchUchVccUchWcdJchXceKbMKchjbOVchjbMKchjbOVchjbMKchkbOVchlbMKaaaaaaaaaaaaaaaaafcihciichncijcikcilcimcincdjaafbyecczciobNPbNPbyebyeaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaabjocipbjobjociqbZabjobjobXkbXkbjobjobsecircischBcitciucivchBaaaaaaaafaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbZXchEbZZaaabZXchEbZZaaabZXchEbZZaafaafaafaaaaaaaaaaaaaagbBcbBcbBcciwbGnbBcaaaaaachGcixciycizciyciAchGaaabBcbQDbGnciBchIceKciCciCciDceKciEciFciGciHceSciIciJciKciLciLccUciMciNciOciPciQciRciSciTciUceKbMKchYchZciabMKcibciccidbMKciecifcigbMKaaaaaaaaaaaaaaaaaacdjcjccjdcjecjfcvecjhcjicdjaafaafaafcjjaaaaaaaafaaaaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXkbXkbXkbjocjkbBRbjocjlcjmcjnceocjncjncjncjncjocjpcjqchBcjrcjscjtchBaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXchEbZZaafbZXchEbZZaafbZXchEbZZaaaaafaafaafaaaaaaaaaaagcjucjvcjubGnbGnbBcaaaaaachGcjwcjxcjycjzcjAchGaaabBccaXbGnciBchIceKciCciCciDceKcjBcgccjCcjDcjEcjFcjCcgccjCcjCcgccjGcjHcjIciIcjJcjKcjLceScjMceKbMKciVciWciVbMKciXciYciXbMKciZcjacjbbMKaafaafaafaafcnDaafcdjcdjcdjcjQcjRcjScvfcjUcjRaafaaaaafcfDaaaaaaaaaaaaaaaabtaafaafaafaafaafaafaaaaaaaaaaaaaaaaaabXkbsecjWbjocjXbsebjocjYbmhbmhcjZbmhbmibmibmickackackbchBckcckdckechBaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafbZXchEbZZaaabZXchEbZZaaabZXchEbZZaafaafaaaaafaafaaaaaaaagbBcbBcbBcbBcbGnbBcaafaafchGckfckgckhckickfchGaafbBcceKckjckkcklceKciCciDciDceKckmcknckockpceSckqckrcksckrckrcktckuckvckwckxckyckyckyckzckAceKbMKciVcjNciVbMKciXcjOciXbMKcjbcjPcjbbMKaaaaaaaafaafaaaaaaaaaaaaaaackBcjRbFkckDcuScjRaafaafaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXkckFbsebWwcgEbsebjobjobjobjobjobsebjoaafaaaaaaaaaaafckGckGckHckGckGaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabZXckIbZZaaabZXckIbZZaaabZXckIbZZaaaabfaaaaaaaafaafaaaaaaaaaaaaaaabJYbGnbJYaaaaaachGccNckKckLckMckNchGchGchGceKckOckkckPceKceKceKceKceKckQceRckRciHceSceRceRceRckSckTckUceSceSciHceRckVceRceRckWckXceKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKaaaaafaafaaaaaaaaaaaaaaaaaackYcjRcjScvgcjUcjRaaaaafaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXkbsebuEbjoclabsebsebsebsebsebsebsebjoaafaaaaaaaaaaafaaackGclbckGaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaafaaaaafaaaaafaaaaafaaaaafaaaabfaaaaaaaaaaafaafaaaaaaaaaaaabJYbGnbJYaaaaaachGclccldcleclfclgclhclicljclhclkcllclmclncloclpclqclrclschLcqqcluclvclwclxclyclzclyclzclAclBclCchLchLclDchLclEcviceKceKceKceKceKcgccgccgccgcceKaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaackYcjRclGclHclIclJaaaaafaafaafaafaaeaafaaaaaaaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaabXkbXkbXkbjocipbjobjoclKclLbLebMdbjobjoaafaaaaaaaaaaafaaackGckHckGaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabqabfabfabfabfabfabfabfabfabfaaaaaaaaaaaaaafaafaaaaaaaafbJYbGnbJYaafaafchGclMclNclOclPclQclRclSclTclRclUclVclWclXclYclZcmaclZcmbcmccmdcmecmfcmgcmhcmicmjcmkcmjcmlcmmcmnchPcmecmochPcmpcmqchPcmrceRcmsceKcmtcgccuOcuLcuLcuNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackYcjRcjRcmvcjRcjRaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaafcmwaafbjobjobXkbXkbjobjoaaaaafaaaaaaaaaaafaaaaaacmxaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaabJYbGnbJYaaaaaachGcmycmzcmAcmBcmCchGcmDcmEchGcmFceRcmGciHceScmHcjCcmIciIcmJcmKcmLcmLcmLcmMcmNcmOcmPcmQcmRcmMcmScmSckUceRckVciIcmTcmUcmVchLcmWcmXcgUcmXcuGcuJcuIcuHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackYaagcjRcmZcjRcnaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaeaaaaaaaaaaaaaaaaafcnbaafaaaaafaaaaaaaafaaaaaaaafaaaaaaaaaaafaaaaaacmxaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbBcbBcbRAbBcbBcaaachGcnccndcnechGchGchGchGchGceKcnfceRcmGcngcnhcnicjCcnjciIcnkcnlcnmcnncnoceKcnpcnqcnrcnscntceKcnucnvcnvcnlcnkciIcnwcnxceSceRcnyceKcnzcgccuKcuLcuLcuMaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaacfDaagcnBcnCcnBaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafcnDaafaaaaafaaaaaaaafaaaabfabfabfabqaafaafaafaafcmxaafaafaafaafaafabqabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbBccgPbGncnEbBcaafchGchGchGchGchGaafaaaaaaaafceKcnFceRcnGcnHcnHcnIcgccgccnJceKcnKcnLcnLcnLceKcnMcnNcnOcnPcnQceKcnLcnLcnLcnKceKcnJcgccnRceSceRceKceKcgccgccgccgcceKaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaafaagaaaaaaaaaaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaaaaaaaafaaaaaaaafaaaabfaaaaaaaafaaaaafaaaaaacnSaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJYcnTcnUcnVbBcaafaaaaaaaafaaaaaaaafaaaaaaaafceKcnWcnXciIcnYcnZcoacgccobcocceKcodcoecofcoecogcohcoicojcokcnQcogcoecoecoecolceKcomconckkceScoochWcopceRcoqcogaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaabfaafcorcorcorcorcoraaacosaaacorcorcorcorcoraafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJYcotcoubHMbBccgcccOccOccOccOccOccOccOccOcgcceKcowcoxcoycozcowceKceKceKcnJceKceKcogcogcogcogcoAcoBcoCcoBcoDcogcogcogcogceKceKcnJceKckkcoEcoFcoGcoHceRcoIcogaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaabfaaacoJcoKcoKcoKcoKcoLcoscoMcoNcoNcoNcoNcoOaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJYbJYbJYbJYbBcaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceKcoPcoQcoRaaaaaaaaacogcogcogcogcogcogcogcogcogaaaaaaaaacoScoTcoUcoVcoWclyclycoXcoYcoZcogaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaabfacfcpacpacpacpacpaaaacosaaacpacpacpacpacpaaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceKcpbcpccpcaaaaaaaafaafaafaafaafaafaafaafaafaafaafaaaaaacpccpdcpbceKcpecpfceKcgccgccpgcgcaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaabfaaaaaaaaaaafaaaaaaaaacosaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaekctyctyctyaekbERbIObIPbIQbIRbxrcuQbISbITbIUbwlbBcbBcbBcbBcbEYbDCaafbIVbDEbIWbDGbIXbDIbIYbDIbDIbDIbDIbDIbBdbDLbIZbJabJbbJcbJcbJcbJcbJcbJcbJdbJebJfbJgbJhbJibJjbJkbJlbJmbJnbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJobJpbmSbGXcqlbBDbJrbBEbJsbJtbJubJvbJvbJwbJxbJgbJybJzbBMbJAbJBbJCbJDbJEbJFbJGbItbItbItbItbItbItbJHbJIbJJbJKbJLbDdbDnbDnbDnbDnbDnbDnbJMbEDbEDbDnbjobvZbgxbDdbJNbJObJPbJQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJRbJSbJRbIMbJTbIMctxcdwbENaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNajZctzctAafNbERbERbERbwlbwlbERbERbERbwlbwlbwlbWBbBcaaabJYbJZbEZaaaaaaaafaaabBdbKabKbbKcbDIbKdbKebKfbKgbKhbKibKjbKkbKlbKmbKnbKobKpbKqbKmbKmbKmbKmbKmbKrbKsbKmbKmbKtbKmbKubKmbKmbKmbKmbKmbyebyebyebyebyebyebyebyebKvbKwbmSbKxbKybKzbKAceebKCcfebKEbKFbKFbKGbKFbKFbKHbKIbBMbKJbKKbKLbKKbKMbKKbKNbKObKPbKQbKRbKSbKTbKUbyqbHnbqibKVaafbKWbKXbKYbKZbLabKZbLbbLcbLdbDnbLebsbbLfbDdbDdbDdbDdbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObLgbIMbIMbIMbLhbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaeYctjctkctjaeWaaaaaaaaaaafaaIaafaaaaafaaIaafbJYbGnbJYaafbJYbEYbEZaafaafaafaafbBdbBdbBdbBdbBdbBdbBdbBdbBdbBdbLjbLkbLlbLmbKmbKnbKobKpbKqbLnbLnbLobLpbLqbLrbLsbLtbLubLvbLwbLxbLybLzbLAbLBaVQbLDbLDbLDbLDbLDbLDbLEbyebKvbLFbLGbLGbLGbLGbLGcfjbpocgubLGbLGbLGbLGbLGbLGbLFbLKbLLbLMbLNbLObLNbLPbLQbLRbLSbLSbLSbLSbLSbLSbLTbLUbLVbqibKVaafbKWbLWbLWcuEbLYcuFbMabMbbMcbDnbMdbsbbkFbjobMebMfbjoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObMgbMhbMibMjbHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaafaaaaafaaIaafbJYbGnbJYbJYbJYbEYbEZaaaaaaaaaaafbMkbMlbMlbMmbMnbMobMobMpbMpbMkbDLbMqbKkbMrbKmbMsbMtbMtbMubMvbLnbMwbMxbMybMzbMAbMBbMCbMDbMEbMFbMGbMFbMHbMIbMJaafbMKbMKbMKbMKbMKbMLbyebKvbMMcqzbMObMPbMQbLGcgxbNScgCbLGbMUbMVbMWbMVbMUbLFbMXbBMbKKbKKbKKbMYbKKbKKbMZbNabNbbNbbNcbNbbNbbNdbNebNfbNgbKVaafbKWbLWbNhbKZbNibKZbNjbNkbNlbDnbsebsbbkFbjobsebsebjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbNmbENbMjaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbBcbBcbBcbJYbBcbJYbBcbBcbBcbBcbBcbBcbJYbJYbJYbBcbBcbBcbGnbGncjWcjjbEYbEZaaaaaaaaaaafbMkbNnbMmbMmbMmbMmbMobYnbNpbNqbNrbKjbNsbNtbNubNvbNwbNxbNybNzbNAbNwbNwbNwbNybNBbNCbNDbNEbNFbLBbNGbNHbNIbNJbNKbLDbNLbNMbNNbNObMKbMLbNPbKvbLFbNQbMUbMUcrqbLGbNRbNSbNTbLGbMVbNUbMVbNVbNWbNXbNYbBMbNZbOabObbOcbOdbOebOfbOgbOhbOibOjbOkbOlbItbOmbZlbOobOpbOpbDnbDnbDnbDnbDnbDnbDdbDdbDdbDnbsebsbbOqbsebsebOrbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbENbEObENaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBcckCcuRctlcuRcvjcvlcvkcvmbGncvnbOsbOubOtbGnbGncjjbGnbGnbJYbJYbJYbJZbEZaaaaafbJYbJYbMkbMmbMmbOwbOvbMmbOxbMobMobOzbDLbMqbOAbOBbZmbODbOEbOFbOGbOHbOIbOFbOJbOFbOKbOLbOMbLubONbOObOPbOQbORbOSbOTbOUaafbOVbOWbNObOXbMKbMLbNPbKvbLFbOYbOZbMUbPabLGbpCbPcbPdbLGbMUbPebPfbMUbMUbLFbKvbBMbItbItbItbItbJHbPgbPhbPibJHbItbItbItbItbItbPjbPkbPlbPmbPnbPobPpbPqbPpbPrbOpbPsbPtbPubPvbPwbsbbkFbjobjobjobjoabtaafaafaafaagaagaagaagaagaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBcbBccvpcvocvrcvqbBcbGnbBcbGnaoybPxbGnbGnbGnbPybBcbJYbJYbBcaaabJYbEYbEZaaaaafbJYbPzbPAbPBbMmbMmcbdbPDbPDbPDbPEbPFcbebMqbOAbPHccdbPJbPKbMFbPLbPMbPNbPObPPbPQbPRbPSbPSbPTbPUbLBbPVbPWbPXbPYbPZbQabQbbNLbQcbNObNObMKbMLbNPbKvbLFbQdbMUbQebLHbLGbLGbQfbLGbLGbQgbQhbQibQgbQgbLFbKvbBMbQjbQkbQkbQlbQmbKKbQnbQobQpbQqbCWbCWbCWbItbQrbQsbQtbQubQvbPobQwbQxbQybQzbOmbPtbQAbPtbPvbBRbGTbGUbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaagaagaagaagaagaagaagbJYcvscuRcvtcvtcvtbBccvubBccacbBcbPxbGnbGnbQDbQEbBcaaaaafaaaaaabJYbEYbDCbBcbBcbBcbQFbMkbQGbMmbMmcqmbQHbQIbQJbQKbMkcqnbMqbOAbPHcqobQLbQMbMFbMFbQNbLnbQObQPbQQbQRbMFbMFbLubQSbQTbQUbQVbQWbQXbQWbQYaafbMKbMKbMKbMKbMKbMLbyebKvbLFbQZbRabRabRbbRcbxkbRebRfbRgbMUbPebMUbMUcqpbLFbKvbBMbCWbUobCWbRhbRibKKbRjbKKbRkbRlbCWbUobCWbItbRmbRnbRobRpbRqbRrbRsbRtbRrbRubOpbRvbPtbRwbPvbOpbSsbGVbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBcbBccuRcvvcvxcvwcvzcvycvBcvAbBcbBcbBcbRAbBcbBcbBcbJYbJYbJYbRBbRCbRDbREbRFbRGbRCbRHbPFbPFbPFbPFcqrbMkbMkbMkbMkbMkcqtbRKbOAbRLbKmbRMbRNbPNbRObPNbLnbMFbMFbMFbQRbRPbRQbRQbRRbRSbRTbNGbRUbRVbRWbNKbLDbNLbRXbRYbRYbMKbMLbyebKvbRZbSabSabSabSbbScbMUbSdbMUbMUbMUbPebMUbMUbMUbLFbKvbBMbCWbCWbCWbSebSfbQobSgbKKbShbSibQkbQkbSjbItbSkbSlbPlbSmbSnbPobQybSobRrbSpbOpbSqbSqbSqbPvbSrbSsbGVbjoaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafbRzaaabBcbBcbBcbBcbBcbBcbBcbBcbBcbBcbGnbGnbGnbGnbGnbGnbGnbSFbSGbSHbSIbSJbSKbSKbSKbSKbSLbSMbSMbSMbSNcqubSObDybDybSPbBccqnbMqbOAbSQbSRbSSbSTbRQbRQbSUbSVbRQbRQbSWbSXbSYbMFbSZbTabTbbTcbMFbTdbTebTfbOUaafbOVbTgbThbTibMKbMLbNPbTjbTkbTkbTkbTlbLFbTmbQZbTnbTobTpbTqbTrbTsbTsbTtbLFbKvbBMbItbItbItbItbTubTvbRjbTwbTubItbItbItbItbItbTxbTybTzbTAbTBbTCbTCbTCbTCbTDbOmbSqbSqbTEbPvbTFbSsbGVbjobjobjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabStbSubSubSubSubSvbSwbSwbSxbSybSzbSAbSBbSCbSDbSEbBcbTMbJYbJYbJYbJYbJYbJYbJYbJYbDCbTNbTObTObTObTObTObTObTObTObTPbTPcqxbTPbTPbTQbTRbBccqnbMqbOAbSQbTSbTTbTUbTVbPSbTWbTXbPSbPSbTYbTZbUabUbbUcbUdbUebUfbMFbTdbUgbUhbQabQbbNLbUibRYbRYbMKbMLbNPbUjbyebyebyebNYbLFbUkbMUbMUbUlbUmbUnbVibUpbVibUnbLFbKvbBMbQjbQkbQkbUqbQmbKKbQnbQobUrbUsbCWbCWbCWbItbUtbUubUvbUwbRnbRpbUxbUybUzbUAbOpbSqbSqbSqbPvbTFbSsbGVbsebsebjoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaaaaafaaaaaabJYbJYbJYbGnbTHbTIbTJbTKbTLbBcbGnbJYaaaaaaaafaaaaaaaafaaabDCbTNbTObUGbUHbUIbUJbUKbULbUGbUMbUNcqCcqybTPbTPbTRbBccqDbMqbOAbURbUSbUTbUTbUUbKmbKmbKmbKmbKmbUVbUWbLnbLnbLnbUXbMFbTbbMFbTdbTebUYbOUaafbMKbMKbMKbMKbMKbMLbNPbUjcvCbzibzibNYbMMbVabVbbVcbVdbVebVfbVgbUpbVgbVhbLFbKvbBMbCWcqUbCWbVjbRibKKbRjbKKbRkbVkbCWcqUbCWbItbVlbVmbVnbVobVpbVqbVrbVsbVtbVubOmbVvbVwbVxbPvbSqbSsbHzbjobsebjobjobjoaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaagaagaagaagbUDbGnbUDbGnbUEcvDbTIbUFbGnbBcbGnbJYaaaaaaaafaaaaaaaafaaabDCbTNbTObUGbVFbVGbVHbVIbVJbUGbVKbVLcqEbVNbVObTPbTRbBccqnbMqbOAbVPbVQbKmbVRbVSbKmbVTbVUbVVbKmbVWbQRbVXbLnbVYbUfbMFbUdbVZbWabRVbWbbNKbLDbNLbWcbWdbWebMKbMLbyebUjbyebABbUZbNYbLFbWfbWgbWhbWibUmbWgbWjbUpbWjbNVbNXbKvbBMbCWbCWbCWbWkbWlbQobSgbKKbShbWmbQkbQkbSjbBMbPvbWnbWobWobPvbPvbWpbWqbWrbWsbWtbWubTCbWvbSqbSqbSsbGVbjobWwbjobWxbjoaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbJYbJYbJYbVzbVAbVBbVCbVDbGnbVEbGnbJYaaaaaaaaaaaaaaaaaaaaabDCbTNbTObWCbWDbWEbVHbWFbWCbWCbVKbWGcqGcqFbWIbTPbTRbBccqnbMqbWJbWKbWKbWLbWMbWNbWObWPbWQbWRbKmbMFbQRbWSbWTbVYbWUbMFbUdbVZbTdbTebWVbOUaafbOVbWWbWXbWYbMKbMLbyebUjbyebGHbGHbNYbLFbLGbWZbXabLGbXbbLGbLGbLGbLGbLGbLFbKvbBMbItbItbItbItbTubXcbRjbXdbTubItbItbItbItbBMbRrbXebRrbRrbRrbPvbWpbWqbXfbXgbXhbXibUwbXjbPvbSqbSsbGVbjobsebsebsebXkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaafaafaafbJYbWybWzbWzbWAbTLbWBbBccvEcvEaaabXlaaaaaaaaaaaaaaabEZbTNbTObWCbWCbXmbXnbXobWCbXpbXqbXrcqIcqHbXsbTPbTRbBccqJbXwbCrbWKbXxbXybXybXzbXAbXBbXCbXDbKmbXEbXFbVXbLnbVYbXGbMFbXHbVZbTdbXIbXJbQabQbbNLbXKbWdbWdbMKbMLbNPbUjcvFbyebXLbNYbXMbSabSabXNbLGbIHbIkbQBbyebXRbXSbKwbKvbBMbQjbQkbQkbXTbQmbKKbQnbQobXUbXVbCWbCWbCWbBMbXWbRrbRrbRrbRrbPvbXXbXXbXYbXZbOpbOpbUwbOpbPvbOpbSsbGVbjobYabYbbYcbXkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabfabfabfabfabqabfabfabfabfabfaaaaaabBcbBcbBcbBcbBcbBcbVEbBcbBcbBcbBcaafaaaaaaaafaaIbYdaaaaaaaaabEZbTNbTObYebYfbYgbYhbYibYjbYkbYlbYmcqMcqKbYobTPbYpbYqbYrbYsbGybWKbYtbXybYubYvbYwbYxbYybYzbYAbNFbYBbLnbLnbLnbYCbMFbYDbYEbTdbTebMFbOUaafbMKbMKbMKbMKbMKbMLbNPcbxcvGbyebYFbYGbYHbTkbYIbYJbyebRybQCbTGbyebYNbKFbYObYPbBMbCWbUobCWbYQbRibKKbRjbKKbRkbYRbCWbUobCWbBMbYSbRrbYTbRrbRrbYUbYVbYWbYXbYYbOpbUwbUwbYZbPvbBRbZabUBbjobZcbZdbsebXkaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaafaaaaafaaaacfaaaaafaaaaafaaaabfaafaafbBcbGnbGnbGnbGnbGnbGnbGnbGnbWBbJYaaaaaaaaaaaIbZfbZgaaIaaIaafbEZbTNbTObZhbWCbUGbUGbUGbWCbZibZjbZkcqGcqNcqPbTPbBcbBcbZnbZobZpbWKbWKbZqbXybZrbZsbZtbZsbZubKmbMFbZvbZwbZxbZybONbZzbZAbZBbWabRVbZCbNKbLDbNLbZDbZEbZEbMKbMLbNPbyecvHbyebyebZFbZGbyebZHbZIbyebyebZJbyebyebZIbDZcgzcvIbBMbCWbCWbCWbZNbZObQobZPbKKbShbZQbQkbQkbSjbBMbRrbRrbZRbRrbRrbPvbXXbXXbZSbZTbOpbZUbZVbZWbPvboUbZabGVbjobjobjobsebjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXbZYbZZaaabZXbZYbZZaaabZXbZYbZZaaaabfaaaaaabJYbZebGnbBcbBcbBcbRAbBcbBcbBcbBcaaaaaaaaacafaaIaaIaafaaaaaabEZbTNbTObWCcagcahbUGcaibWCbWCbVKcajcqGcqKcakbTPcalcamcancaocapcaqcarcascatcascatcaucatcavbKmcawcaxcaybPSbPSbPUbRPcazbRUbPVbTecaAbOUaafbOVcaBcaCcaDbMKbMLbyebzibUjcaEcaFbZFcaGbyebZHcaHcaIcaJcaKcaLcaIcaMccBbgxcaNbBMbBMbBMbBMbBMbBMcaOcaPcaObBMbBMbBMbBMbBMbBMbPvbPvbPvbPvbPvbPvcaQcaQcaRcaSbPvbPvbPvbPvbPvbjobRxbGVbjocaTcaUbsebjoaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafbZXcaVbZZaaabBccaVbZZaaabZXcaVbZZaafaafaaaaaabJYcaacabbBccacbGnbGncadbOucaebBcaaaaaaaaaaaaaafaaaaaaaaaaaabDCbTNbTObUGcaYcaZbUGcbacbbbUGbVKcbccqEcqQcqVcuPcqXcqWbOAaZDcbgcbhcbicbjcbkcblcbmcbnbXycbobKmcbpbMFbZvbRPbRQcbqcbrcbscbtbLAcbucbvbQabQbbNLcbwbZEbZEbMKbMLbyebzicvJcbzcbAcbBcbCbyecbDcbEcvKccBcvLccBbDZbFMcfibgxcbKbjoaaaaaaaaaaafaaaaaacbLaaaaafaaaaaaaaaaaabjocbMbMfbkGcbNcbNbPvcbOcbOcaRbQtcbPcbQbsebsebsebBRbRxbHzbjocbRbsebsebjobjobjoaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXcaVbZZaafbZXcaVbZZaafbZXcaVbZZaaaaafaafaafbBcbJYbBcbBcbBccvMcvOcvNbGnbQDbBcaaaaaaaaaaaaaafaaaaaaaafaaabDCbTNbTObUGcbScbTcbUcbVcbWbUGcbXcbYcbZccaccbbTPccccqYcceccfccgcchcciccjcckcclccmccnccoccpccqccrbMFbZvcctbMFbMFbMFcctcctcctbTeaVSaVRaafbMKbMKbMKbMKbMKbMLbyebYFccuccvccwccxccybyebyecczcvPcdnbKwccCccDbyebyebgxcbKbjoaaaaaaaaaaafaaaaaacbLaaaaafaaaaaaaaaaaabjobseccEbqvccFccGbPvccHccHccIbQtbPvbOpbjoccJccKbBRbRxbGVbsebsebsebUCbkHbVybkHaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbZXcaVbZZaaabZXcaVbZZaaabZXcaVbZZaafaafaaaaaaaafaafbBcccRbBccaWcaXcvQbRAbBcbBcaaaaafaaaaaaaafaaaaaaaafaaabDCbTNbTObTObTObTObTObTObTObTObTPbTPbTPbTPbTPbTPbBcccSbBcccTccUccUccUccVccWccXccUccYccZcdabKmbMFbOQccscctbMFbMFbMFbMHbSYcctbTecctbKmaafaafaafaafaafaafbMLcdjcdjcdjcdkcvdcdjcdjcdjcvRcvTcvScdncvUcdncdnbyecvVbZGcbKbjobXkbXkbXkbjobXkbXkcdpbXkbjobXkbXkbXkbXkbjobjobRxcdqbjobjobPvbPvbPvcdrcdsbPvbBRbjobYcbseboTbRxbUBbjobjocdtbjobjobjobjoaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaafaaabZXcaVbZZaaabZXcaVbZZaaabZXcaVbZZaaaaafaaaaaacducdvcdvcdvcdvbBcbBccvWbGnbBcbJYbJYbJYbJYbJYbJYbJYbJYbJYbBcbDCbTNbBccdxcdycdzcdzcdzcdzcdzcdzcdzcdzcdzcdAcdAcdzcdBcaWccTcdCcdDcdEcdFcdGcdHccUcdIcdJcdKbKmcdbcdcbPXcddcdecdfcdecddcdgcddcdhcctbKmbKmbKmaaaaaaaafaaacdVcdWcdXcdYcdZceacebceccdjcvXbzicvYcwacvZcwbcbGbJxbJxcwdcwcceiceiceiceiceiceiceicejcekcekcekcekcekcekcelcekcemcekcekcenceocepceqbXOcesbjobjocetceoceuceocevbGVbjocewbsebsebjoaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaaaaaacexaaaaaaaaacexaaaaaaaaacexaaaaaaaafcducducduceycezceAceBceCbGnceDceEceFceEceEceEceEceEceEceEceEceEceEceGceHbRGceIceJceKceKceKceKceKceKceKceKceKceKceKceKceKceKccTccUceLceMceNceOcePceQceRceSceTceKcdbcdLcdMcdNcdOcdPcdQcdRbMFcdScdTcdUbLCcdibLCaaaaaaaafaaacdjceXceYceZcfacfbcfccfdcdjbzibzicdncdnbZGcdnccBbDZbFMcfkcflcflcflcflcflcflcflcfmcfncflcflcflcflcflcflcfocfpcfqbmicfrcfscftcftcftbXPbYKbXkbYMbYLcbfbZbbZbccLccMbjocaUbsecfCbjoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafalkcfEcfEcfFcfGcfGcfGcfGcfGcfGcfGcfGcfGcfGcfGcfHcfIcfJcfIcfKcfLcfMcfNceEcfOcfPbOubBcbJYbJYbJYbJYbJYbJYbJYbJYbJYbBcbBccfQbSKcfRcfSceKcfTcfTcfUceKcfVcfWcfXctHcfZcgacgbcgccgdcgeccUcgfcggcghcgicgjcgkcglcgmcgnceKbKmcsKbLuceVbLuceUbLuceVbLuceWbLucsNbKmbKmbKmaafaafaafaaacdjcgqcgrcgscgtcwecgvcgwcdjcwfbziccBccBcwgcdnccBccBcwhbyebjobXkbXkbXkbXkbjobXkbXkbXkbXkbjobXkbXkbXkbXkbjocgEbsebjocgFcgGbjobjobXkbXkbjobjocgHbZacgIbjocgJcgKboRbjobjobjobjobjoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaaaaaacgLaaaaaaaaacgLaaaaaaaaacgLaaaaaaaafcducducducgMcgNcgOcdvbGnbGnbGnbGnbBcaaaaaaaafaaaaaaaafaaaaaaaafaaabBccgPbBccgQcgRceKcgScgTcgUcgVcgWcgXceRceRceRcgYcgZchachbcgXccUchcchdchecgictIccUchgchhchiceKaafcgoaafbMLaafcgoaafbMLaafcgpaafcgpaafaafaaaaaaaaaaafaafcdjchmchnchochpchqchrchschtchucwjcwiccBbKwccBcwkcdnbyebyeaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaabjochybLebjochzbZabjoaaaaaaaaaaaabjobsebZachAchBchBchCchDchBaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaafaaabZXchEbZZaaabZXchEbZZaaabZXchEbZZaaaaafaaaaaacducdvcdvcdvcdvchFbWBbGnbGnbBcbBcbJYchGchGchGchGchGchGchGaafbBcbBcbBcchHchIceKchJcgUcgUcgVchKchLchLchMchNchOchPchPchQceRccUchRchSchTchUchVccUchWcdJchXceKbMKchjbOVchjbMKchjbOVchjbMKchkbOVchlbMKaaaaaaaaaaaaaaaaafcihciichncijcikcilcimcincdjcdmcdncdncdncdocdncdncdnbABabtcvEcvEaagaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaabjocipbjobjociqbZabjobjobXkbXkbjobjobsecircischBcitciucivchBaaaaaaaafaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbZXchEbZZaaabZXchEbZZaaabZXchEbZZaafaafaafaaaaaaaaaaaaaagbBcbBcbBcciwbGnbBcciwbHNchGcixciycizciyciAchGaaabBcbQDbGnciBchIceKciCciCciDceKciEciFciGciHceSciIciJciKciLciLccUciMciNciOciPciQciRciSciTciUceKbMKchYchZciabMKcibciccidbMKciecifcigbMKaaaaaaaaaaaaaaaaaacdjcjccjdcjecjfcvecjhcjicdjcedcwlcefcegcehccBccBccBbzicwmcjWcwmaagaaaaaaaafaaabXkbXkbXkbjobjobjobjobjobjocjkbBRbjocjlcjmcjnceocjncjncjncjncjocjpcjqchBcjrcjscjtchBaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXchEbZZaafbZXchEbZZaafbZXchEbZZaaaaafaafaafaaaaaaaaaaagcjucjvcjubGnbGnceFbGnbZechGcjwcjxcjycjzcjAchGaaabBccaXbGnciBchIceKciCciCciDceKcjBcgccjCcjDcjEcjFcjCcgccjCcjCcgccjGcjHcjIciIcjJcjKcjLceScjMceKbMKciVciWciVbMKciXciYciXbMKciZcjacjbbMKaafaafaafaafcnDaafcdjcdjcdjcjQcjRcjScvfcjUcjRcedcwnccBcffcfgcfhcficcBcwoabtcvEcvEaagaafaafaafaaabXkckFcwpbjobsecwqcwrclKbjocjXbsebjocjYbmhbmhcjZbmhbmibmibmickackackbchBckcckdckechBaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafbZXchEbZZaaabZXchEbZZaaabZXchEbZZaafaafaaaaafaafaaaaaaaagbBcbBcbBcbBcbGnbBcbBcbBcchGckfckgckhckickfchGaafbBcceKckjckkcklceKciCciDciDceKckmcknckockpceSckqckrcksckrckrcktckuckvckwckxckyckyckyckzckAceKbMKciVcjNciVbMKciXcjOciXbMKcjbcjPcjbbMKaaaaaaaafaafaaaaaaaaaaaaaaackBcjRbFkckDcuScjRbzicwscgycgzcgAcgBbDZcwtcgDabtaaaaaaaaaaaaaaaaafaaabXkcwucwvbWwbseccKbsebsebWwcgEbsebjobjobjobjobjobsebjoaafaaaaaaaaaaafckGckGckHckGckGaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabZXckIbZZaaabZXckIbZZaaabZXckIbZZaaaabfaaaaaaaafaafaaaaaaaaaaaaaaabJYbGnbJYaaaaaachGccNckKckLckMckNchGchGchGceKckOckkckPceKceKceKceKceKckQceRckRciHceSceRceRceRckSckTckUceSceSciHceRckVceRceRckWckXceKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKaaaaafaafaaaaaaaaaaaaaaaaaackYcjRcjScvgcjUcjRbyecwwbFMchvchwbFMchxbyebyeabtaaaaaaaaaaaaaaaaafaaabXkckFcwxbjoclKbsebsecwybjoclabsebsebsebsebsebsebsebjoaafaaaaaaaaaaafaaackGclbckGaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaafaaaaafaaaaafaaaaafaaaaafaaaabfaaaaaaaaaaafaafaaaaaaaaaaaabJYbGnbJYaaaaaachGclccldcleclfclgclhclicljclhclkcllclmclncloclpclqclrclschLcqqcluclvclwclxclyclzclyclzclAclBclCchLchLclDchLclEcviceKceKceKceKceKcgccgccgccgcceKaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaackYcjRclGclHclIclJaafbyecczciobNPbNPbyebyeaaaaafaaaaaaaaaaaaaaaaafaafbXkbXkbXkbjobjobjobsebjobjocipbjobjoclKclLbLebMdbjobjoaafaaaaaaaaaaafaaackGckHckGaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabqabfabfabfabfabfabfabfabfabfaaaaaaaaaaaaaafaafaaaaaaaafbJYbGnbJYaafaafchGclMclNclOclPclQclRclSclTclRclUclVclWclXclYclZcmaclZcmbcmccmdcmecmfcmgcmhcmicmjcmkcmjcmlcmmcmnchPcmecmochPcmpcmqchPcmrceRcmsceKcmtcgccuOcuLcuLcuNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackYcjRcjRcmvcjRcjRaaaaafaaackYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaabjocwvcwzbjocmwaafbjobjobXkbXkbjobjoaaaaafaaaaaaaaaaafaaaaaacmxaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaabJYbGnbJYaaaaaachGcmycmzcmAcmBcmCchGcmDcmEchGcmFceRcmGciHceScmHcjCcmIciIcmJcmKcmLcmLcmLcmMcmNcmOcmPcmQcmRcmMcmScmSckUceRckVciIcmTcmUcmVchLcmWcmXcgUcmXcuGcuJcuIcuHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackYaagcjRcmZcjRcnaaafaafaaacwAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaeaaaaaabjocwvcwqbjocnbaafaaaaafaaaaaaaafaaaaaaaafaaaaaaaaaaafaaaaaacmxaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbBcbBccwBbBcbBcaaachGcnccndcnechGchGchGchGchGceKcnfceRcmGcngcnhcnicjCcnjciIcnkcnlcnmcnncnoceKcnpcnqcnrcnscntceKcnucnvcnvcnlcnkciIcnwcnxceSceRcnyceKcnzcgccuKcuLcuLcuMaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaacfDaagcnBcnCcnBaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaabXkcwCbXkbXkcnDaafaaaaafaaaaaaaafaaaabfabfabfabqaafaafaafaafcmxaafaafaafaafaafabqabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbBccgPbGncnEbBcaafchGchGchGchGchGaafaaaaaaaafceKcnFceRcnGcnHcnHcnIcgccgccnJceKcnKcnLcnLcnLceKcnMcnNcnOcnPcnQceKcnLcnLcnLcnKceKcnJcgccnRceSceRceKceKcgccgccgccgcceKaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaafaagaaaaaaaaaaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabXkbsebXkaaaaaaaaaaaaaafaaaaaaaafaaaabfaaaaaaaafaaaaafaaaaaacnSaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJYcnTcnUcnVbBcaafaaaaaaaafaaaaaaaafaaaaaaaafceKcnWcnXciIcnYcnZcoacgccobcocceKcodcoecofcoecogcohcoicojcokcnQcogcoecoecoecolceKcomconckkceScoochWcopceRcoqcogaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaabXkcwDbXkaaaaaaaaaaaaaafaaaaaaaafaaaabfaafcorcorcorcorcoraaacosaaacorcorcorcorcoraafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJYcotcoubHMbBccgcccOccOccOccOccOccOccOccOcgcceKcowcoxcoycozcowceKceKceKcnJceKceKcogcogcogcogcoAcoBcoCcoBcoDcogcogcogcogceKceKcnJceKckkcoEcoFcoGcoHceRcoIcogaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaagaagaagaaaaaaaaaaaaaaaaaaaaaaafaaaabfaaacoJcoKcoKcoKcoKcoLcoscoMcoNcoNcoNcoNcoOaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJYbJYbJYbJYbBcaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceKcoPcoQcoRaaaaaaaaacogcogcogcogcogcogcogcogcogaaaaaaaaacoScoTcoUcoVcoWclyclycoXcoYcoZcogaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaafaaaabfacfcpacpacpacpacpaaaacosaaacpacpacpacpacpaaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceKcpbcpccpcaaaaaaaafaafaafaafaafaafaafaafaafaafaafaaaaaacpccpdcpbceKcpecpfceKcgccgccpgcgcaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaabfaaaaaaaaaaafaaaaaaaaacosaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceKcphcpicpjaafaafaafcpkaaaaaaaaaaaacpkaaaaaacpkaafaafaafcplcpmcpnceKcpocdIcgcaafaaacppcpqaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafcorcorcorcorcoraaacosaaacorcorcorcorcoraafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceKcpbcpccpraaaaaaaafaaaaaaaaaaaaaaacpsaaaaaaaaaaafaaaaaacpccpccpbceKaagaagaagaafaaacptcpucpvcpwcpxcpwcpvcpwcpxcpwcpvcpwcpxcpwcpvcpwcpxcpycpzaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaacoJcoKcoKcoKcoKcoLcoscoMcoNcoNcoNcoNcoOaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceKcpAcpBcpcaaaaaaaafaaaaaaaafaafaafaafaafaaaaaaaafaaaaaacpccpCcpDceKaaaaaaaagaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaafaaaaaacptcpEcpqcnDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafcpacpacpacpacpaaaacosaaacpacpacpacpacpaaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 9ddae527eec..0da4f75e1bf 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -42,11 +42,12 @@ the atom/checkpass() proc uses them (tables will call movable atom checkpass(PASSTABLE) for example) */ //flags for pass_flags -#define PASSTABLE 1 -#define PASSGLASS 2 -#define PASSGRILLE 4 -#define PASSBLOB 8 -#define PASSMOB 16 +#define PASSTABLE 1 +#define PASSGLASS 2 +#define PASSGRILLE 4 +#define PASSBLOB 8 +#define PASSMOB 16 +#define LETPASSTHROW 32 //flags for species diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 8a0b055d4b2..21626590306 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -379,3 +379,4 @@ var/dest_y = src_y + distance*cos(rotation); return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y) + diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index f8a2cf29db5..0de55b127be 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -45,20 +45,21 @@ return adjacencies /proc/smooth_icon(atom/A) - if(A && A.smooth) - var/adjacencies = calculate_adjacencies(A) + spawn(0) //don't remove this, otherwise smoothing breaks + if(A && A.smooth) + var/adjacencies = calculate_adjacencies(A) - clear_overlays(A) + clear_overlays(A) - A.top_left_corner = make_nw_corner(adjacencies) - A.top_right_corner = make_ne_corner(adjacencies) - A.bottom_left_corner = make_sw_corner(adjacencies) - A.bottom_right_corner = make_se_corner(adjacencies) + A.top_left_corner = make_nw_corner(adjacencies) + A.top_right_corner = make_ne_corner(adjacencies) + A.bottom_left_corner = make_sw_corner(adjacencies) + A.bottom_right_corner = make_se_corner(adjacencies) - A.overlays += A.top_left_corner - A.overlays += A.top_right_corner - A.overlays += A.bottom_right_corner - A.overlays += A.bottom_left_corner + A.overlays += A.top_left_corner + A.overlays += A.top_right_corner + A.overlays += A.bottom_right_corner + A.overlays += A.bottom_left_corner /proc/make_nw_corner(adjacencies) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 57527a2aa61..d72e5a9049e 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -672,7 +672,7 @@ Turf and target are seperate in case you want to teleport some distance from a t else return get_step(ref, base_dir) -/proc/do_mob(mob/user , mob/target, time = 30, numticks = 5, stealth = 0) //This is quite an ugly solution but i refuse to use the old request system. +/proc/do_mob(mob/user , mob/target, time = 30, numticks = 5, uninterruptible = 0) //This is quite an ugly solution but i refuse to use the old request system. if(!user || !target) return 0 if(numticks == 0) @@ -691,7 +691,7 @@ Turf and target are seperate in case you want to teleport some distance from a t if(user && user.client) user.client.images -= progbar return 0 - if ( user.loc != user_loc || target.loc != target_loc || user.get_active_hand() != holding || user.incapacitated() || user.lying ) + if (!uninterruptible && (user.loc != user_loc || target.loc != target_loc || user.get_active_hand() != holding || user.incapacitated() || user.lying )) if(user && user.client) user.client.images -= progbar return 0 diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index f1db0379efc..2c2b87f9c5f 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -23,7 +23,7 @@ * If you are in the same turf, always true * If you are vertically/horizontally adjacent, ensure there are no border objects * If you are diagonally adjacent, ensure you can pass through at least one of the mutually adjacent square. - * Passing through in this case ignores anything with the throwpass flag, such as tables, racks, and morgue trays. + * Passing through in this case ignores anything with the LETPASSTHROW pass flag, such as tables, racks, and morgue trays. */ /turf/Adjacent(var/atom/neighbor, var/atom/target = null) var/turf/T0 = get_turf(neighbor) @@ -80,28 +80,18 @@ /* This checks if you there is uninterrupted airspace between that turf and this one. - This is defined as any dense ON_BORDER object, or any dense object without throwpass. + This is defined as any dense ON_BORDER object, or any dense object without LETPASSTHROW. The border_only flag allows you to not objects (for source and destination squares) */ /turf/proc/ClickCross(target_dir, border_only, target_atom = null) for(var/obj/O in src) - if( !O.density || O == target_atom || O.throwpass) //check if there's a dense object present on the turf - continue // throwpass is used for anything you can click through (or the firedoor special case, see above) + if( !O.density || O == target_atom || (O.pass_flags & LETPASSTHROW)) //check if there's a dense object present on the turf + continue // LETPASSTHROW is used for anything you can click through (or the firedoor special case, see above) - if( O.flags&ON_BORDER) // windows have throwpass but are on border, check them first + if( O.flags&ON_BORDER) // windows are on border, check them first if( O.dir & target_dir || O.dir & (O.dir-1) ) // full tile windows are just diagonals mechanically return 0 //O.dir&(O.dir-1) is false for any cardinal direction, but true for diagonal ones else if( !border_only ) // dense, not on border, cannot pass over return 0 return 1 - -/* - Aside: throwpass does not do what I thought it did originally, and is only used for checking whether or not - a thrown object should stop after already successfully entering a square. Currently the throw code involved - only seems to affect hitting mobs, because the checks performed against objects are already performed when - entering or leaving the square. Since throwpass isn't used on mobs, but only on objects, it is effectively - useless. Throwpass may later need to be removed and replaced with a passcheck (bitfield on movable atom passflags). - - Since I don't want to complicate the click code rework by messing with unrelated systems it won't be changed here. -*/ \ No newline at end of file diff --git a/code/controllers/subsystem/procqueue.dm b/code/controllers/subsystem/procqueue.dm index daf762927c9..be9323e5638 100644 --- a/code/controllers/subsystem/procqueue.dm +++ b/code/controllers/subsystem/procqueue.dm @@ -9,38 +9,53 @@ var/datum/subsystem/procqueue/procqueue /datum/subsystem/procqueue/fire() if (queue.len) var/list/L = list() - var/key for (var/datum/procqueue_item/item in queue) - key = "[item.ref]_[item.procname]" + if (!item.runafter || item.runafter-- <= 0) + if (!(item.id in L)) + if (item.args) call(item.ref, item.procname)(arglist(item.args)) + else call(item.ref, item.procname)() - if (item.args) - key += "(" - var/first = 1 - for (var/a in item.args) - if (!first) key += "," - key += "[a]" - first = 0 - key += ")" + L.Add(item.id) - if (!(key in L)) - if (item.args) call(item.ref, item.procname)(arglist(item.args)) - else call(item.ref, item.procname)() - - L.Add(key) - - queue.Cut() + queue.Remove(item) /datum/subsystem/procqueue/proc/queue(ref, procname, ...) + var/list/L = args.Copy() + + L.Insert(1, 0) + + src.schedule(arglist(L)) + +/datum/subsystem/procqueue/proc/schedule(time, ref, procname, ...) var/datum/procqueue_item/item = new/datum/procqueue_item item.ref = ref item.procname = procname - if (args.len > 2) - item.args = args.Copy(3) + if (args.len > 3) + item.args = args.Copy(4) + + if (time > 0) item.runafter = time / 10 + + item.id = "[item.ref]_[item.procname]" + + if (item.args) + item.id += "(" + var/first = 1 + for (var/a in item.args) + if (!first) item.id += "," + item.id += "[a]" + first = 0 + item.id += ")" + + for (var/datum/procqueue_item/candidate in queue) + if (candidate.id == item.id) + return src.queue.Insert(1, item) +/datum/procqueue_item/var/id +/datum/procqueue_item/var/runafter /datum/procqueue_item/var/ref /datum/procqueue_item/var/procname -/datum/procqueue_item/var/list/args \ No newline at end of file +/datum/procqueue_item/var/list/args diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 599563b1c81..8c8583cd28d 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -41,6 +41,9 @@ var/datum/subsystem/ticker/ticker var/totalPlayers = 0 //used for pregame stats on statpanel var/totalPlayersReady = 0 //used for pregame stats on statpanel + var/queue_delay = 0 + var/list/queued_players = list() //used for join queues when the server exceeds the hard population cap + var/obj/screen/cinematic = null //used for station explosion cinematic @@ -97,6 +100,7 @@ var/datum/subsystem/ticker/ticker if(GAME_STATE_PLAYING) mode.process(wait * 0.1) + check_queue() if(!mode.explosion_in_progress && mode.check_finished() || force_ending) current_state = GAME_STATE_FINISHED @@ -370,8 +374,7 @@ var/datum/subsystem/ticker/ticker world << "
[TAB]Total Population: [joined_player_list.len]" if(station_evacuated) world << "
[TAB]Evacuation Rate: [num_escapees] ([round((num_escapees/joined_player_list.len)*100, 0.1)]%)" - else - world << "
[TAB]Survival Rate: [num_survivors] ([round((num_survivors/joined_player_list.len)*100, 0.1)]%)" + world << "
[TAB]Survival Rate: [num_survivors] ([round((num_survivors/joined_player_list.len)*100, 0.1)]%)" world << "
" //Silicon laws report @@ -432,3 +435,24 @@ var/datum/subsystem/ticker/ticker if(randomtips.len) world << "Tip of the round: [html_encode(pick(randomtips))]" +/datum/subsystem/ticker/proc/check_queue() + if(!queued_players.len || !config.hard_popcap) + return + + queue_delay++ + var/mob/new_player/next_in_line = queued_players[1] + + switch(queue_delay) + if(5) //every 5 ticks check if there is a slot available + if(living_player_count() < config.hard_popcap) + if(next_in_line && next_in_line.client) + next_in_line << "A slot has opened! You have approximately 20 seconds to join. \>\>Join Game\<\<" + next_in_line << sound('sound/misc/notice1.ogg') + next_in_line.LateChoices() + return + queued_players -= next_in_line //Client disconnected, remove he + queue_delay = 0 //No vacancy: restart timer + if(25 to INFINITY) //No response from the next in line when a vacancy exists, remove he + next_in_line << "No response recieved. You have been removed from the line." + queued_players -= next_in_line + queue_delay = 0 \ No newline at end of file diff --git a/code/datums/spells/lightning.dm b/code/datums/spells/lightning.dm index 54d0a3378b7..3fbefee6c16 100644 --- a/code/datums/spells/lightning.dm +++ b/code/datums/spells/lightning.dm @@ -10,7 +10,7 @@ cooldown_min = 30 selection_type = "view" random_target = 1 - var/energy = 0 + var/start_time = 0 var/ready = 0 var/image/halo = null var/sound/Snd // so far only way i can think of to stop a sound, thank MSO for the idea. @@ -18,7 +18,7 @@ action_icon_state = "lightning" /obj/effect/proc_holder/spell/targeted/lightning/Click() - if(!ready && energy==0) + if(!ready && start_time==0) if(cast_check()) StartChargeup() else @@ -33,16 +33,14 @@ halo = image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = EFFECTS_LAYER) user.overlays.Add(halo) playsound(get_turf(usr), Snd, 50, 0) - spawn(0) - while(ready) - energy++ - if(energy >= 100 && ready) - Discharge() - sleep(1) + start_time = world.time + if(do_mob(user,user,100,uninterruptible=1)) + if(ready) + Discharge() /obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr) ready = 0 - energy = 0 + start_time = 0 if(halo) user.overlays.Remove(halo) @@ -72,26 +70,18 @@ playsound(get_turf(usr), 'sound/magic/lightningbolt.ogg', 50, 1) user.Beam(target,icon_state="lightning",icon='icons/effects/effects.dmi',time=5) - switch(energy) - if(1 to 25) - target.electrocute_act(10,"Lightning Bolt") - playsound(get_turf(target), 'sound/magic/LightningShock.ogg', 50, 1, -1) - if(25 to 75) - target.electrocute_act(25,"Lightning Bolt") - playsound(get_turf(target), 'sound/magic/LightningShock.ogg', 50, 1, -1) - if(75 to 100) - //CHAIN LIGHTNING - Bolt(user,target,energy,user) + var/energy = min(world.time - start_time,100) + Bolt(user,target,max(15,energy/2),5,user) //5 bounces for energy/2 burn Reset(user) -/obj/effect/proc_holder/spell/targeted/lightning/proc/Bolt(mob/origin,mob/target,bolt_energy,mob/user = usr) +/obj/effect/proc_holder/spell/targeted/lightning/proc/Bolt(mob/origin,mob/target,bolt_energy,bounces,mob/user = usr) origin.Beam(target,icon_state="lightning",icon='icons/effects/effects.dmi',time=5) var/mob/living/carbon/current = target - if(bolt_energy < 75) - current.electrocute_act(25,"Lightning Bolt") + if(bounces < 1) + current.electrocute_act(bolt_energy,"Lightning Bolt",safety=1) playsound(get_turf(current), 'sound/magic/LightningShock.ogg', 50, 1, -1) else - current.electrocute_act(25,"Lightning Bolt") + current.electrocute_act(bolt_energy,"Lightning Bolt",safety=1) playsound(get_turf(current), 'sound/magic/LightningShock.ogg', 50, 1, -1) var/list/possible_targets = new for(var/mob/living/M in view_or_range(range,target,"view")) @@ -102,4 +92,4 @@ return var/mob/living/next = pick(possible_targets) if(next) - Bolt(current,next,bolt_energy-6,user) // 5 max bounces \ No newline at end of file + Bolt(current,next,bolt_energy,bounces-1,user) \ No newline at end of file diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 739a747f967..de15d5c356c 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -183,7 +183,7 @@ var/list/uplink_items = list() name = "Toy Submachine Gun" desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade rounds with a 20-round magazine." item = /obj/item/weapon/gun/projectile/automatic/c20r/toy - cost = 12 + cost = 8 gamemodes = list(/datum/game_mode/nuclear) surplus = 0 @@ -191,7 +191,7 @@ var/list/uplink_items = list() name = "Toy Machine Gun" desc = "A fully-loaded Donksoft belt-fed machine gun. This weapon has a massive 50-round magazine of devastating riot grade darts, that can briefly incapacitate someone in just one volley." item = /obj/item/weapon/gun/projectile/automatic/l6_saw/toy - cost = 30 + cost = 12 gamemodes = list(/datum/game_mode/nuclear) surplus = 0 @@ -357,7 +357,7 @@ var/list/uplink_items = list() name = "Toy Gun (with Stun Darts)" desc = "An innocent looking toy pistol designed to fire foam darts. Comes loaded with riot grade darts, to incapacitate a target." item = /obj/item/weapon/gun/projectile/automatic/toy/pistol/riot - cost = 10 + cost = 6 surplus = 10 excludefrom = list(/datum/game_mode/gang) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 5d29949d6d7..ba8f7708085 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -6,8 +6,6 @@ var/list/fingerprintshidden var/fingerprintslast = null var/list/blood_DNA - var/last_bumped = 0 - var/throwpass = 0 ///Chemistry. var/datum/reagents/reagents = null @@ -50,26 +48,6 @@ return 0 -/atom/proc/throw_impact(atom/hit_atom,mob/thrower) - if(istype(hit_atom,/mob/living)) - var/mob/living/M = hit_atom - M.hitby(src,thrower) - - else if(isobj(hit_atom)) - var/obj/O = hit_atom - if(!O.anchored) - step(O, src.dir) - O.hitby(src) - - else if(isturf(hit_atom)) - var/turf/T = hit_atom - if(T.density) - spawn(2) - step(src, turn(src.dir, 180)) - if(istype(src,/mob/living)) - var/mob/living/M = src - M.take_organ_damage(20) - /atom/proc/attack_hulk(mob/living/carbon/human/hulk, do_attack_animation = 0) if(do_attack_animation) hulk.changeNext_move(CLICK_CD_MELEE) @@ -280,9 +258,10 @@ its easier to just keep the beam vertical. /atom/proc/fire_act() return -/atom/proc/hitby(atom/movable/AM as mob|obj) - return - +/atom/proc/hitby(atom/movable/AM, skip, var/hitpush) + if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav. + spawn(2) + step(AM, turn(AM.dir, 180)) var/list/blood_splatter_icons = list() diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index d1a70ec7e96..30108fcd62a 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -93,12 +93,12 @@ /atom/movable/Crossed(atom/movable/AM) return -/atom/movable/Bump(var/atom/A as mob|obj|turf|area, yes) - if(throwing) - throw_impact(A) - throwing = 0 - if ((A && yes)) - A.last_bumped = world.time +/atom/movable/Bump(atom/A, yes) //the "yes" arg is to differentiate our Bump proc from byond's, without it every Bump() call would become a double Bump(). + if((A && yes)) + if(throwing) + throwing = 0 + throw_impact(A) + . = 1 A.Bumped(src) @@ -143,7 +143,6 @@ if(!direction) return 1 - var/old_dir = dir . = step(src, direction) dir = old_dir @@ -151,70 +150,99 @@ /atom/movable/proc/checkpass(passflag) return pass_flags&passflag -/atom/movable/proc/hit_check(mob/thrower) // todo: this is partly obsolete due to passflags already, add throwing stuff to mob CanPass and finish it - if(src.throwing) - for(var/atom/A in get_turf(src)) - if(A == src) continue - if(istype(A,/mob/living)) - if(A:lying) continue - src.throw_impact(A,thrower) - if(src.throwing == 1) - src.throwing = 0 - if(isobj(A)) - if(A.density && !A.throwpass) // **TODO: Better behaviour for windows which are dense, but shouldn't always stop movement - src.throw_impact(A,thrower) - src.throwing = 0 +/atom/movable/proc/throw_impact(atom/hit_atom) + return hit_atom.hitby(src) -/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, var/spin = 1) +/atom/movable/hitby(atom/movable/AM, skip, var/hitpush = 1) + if(!anchored && hitpush) + step(src, AM.dir) + return ..() + +/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0) if(!target || !src || (flags & NODROP)) return 0 //use a modified version of Bresenham's algorithm to get from the atom's current position to that of the target - src.throwing = 1 - if(spin) // turns out 1000+ spinning objects being thrown at the singularity creates lag - Iamgoofball + throwing = 1 + if(spin) //if we don't want the /atom/movable to spin. SpinAnimation(5, 1) + + var/dist_travelled = 0 + var/dist_since_sleep = 0 + var/dist_x = abs(target.x - src.x) var/dist_y = abs(target.y - src.y) var/dx = (target.x > src.x) ? EAST : WEST var/dy = (target.y > src.y) ? NORTH : SOUTH - var/dist_travelled = 0 - var/dist_since_sleep = 0 - var/tdist_x = dist_x; - var/tdist_y = dist_y; - var/tdx = dx; - var/tdy = dy; + var/pure_diagonal = 0 + if(dist_x == dist_y) + pure_diagonal = 1 if(dist_x <= dist_y) - tdist_x = dist_y; - tdist_y = dist_x; - tdx = dy; - tdy = dx; + var/olddist_x = dist_x + var/olddx = dx + dist_x = dist_y + dist_y = olddist_x + dx = dy + dy = olddx - var/error = tdist_x/2 - tdist_y - while(target && (((((dist_x > dist_y) && ((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST))) || ((dist_x <= dist_y) && ((src.y < target.y && dy == NORTH) || (src.y > target.y && dy == SOUTH))) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || !has_gravity(src))) - // only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up - if(!src.throwing) break - if(!istype(src.loc, /turf)) break + var/error = dist_x/2 - dist_y //used to decide whether our next move should be forward or diagonal. + var/atom/finalturf = get_turf(target) + var/hit = 0 + var/init_dir = get_dir(src, target) - var/atom/step = get_step(src, (error < 0) ? tdy : tdx) + while(target && ((dist_travelled < range && loc != finalturf) || !has_gravity(src))) //stop if we reached our destination (or max range) and aren't floating + + if(!istype(loc, /turf)) + hit = 1 + break + + var/atom/step + if(dist_travelled < max(dist_x, dist_y)) //if we haven't reached the target yet we home in on it, otherwise we use the initial direction + step = get_step(src, get_dir(src, finalturf)) + else + step = get_step(src, init_dir) + + if(!pure_diagonal && !diagonals_first) // not a purely diagonal trajectory and we don't want all diagonal moves to be done first + if(error >= 0 && max(dist_x,dist_y) - dist_travelled != 1) //we do a step forward unless we're right before the target + step = get_step(src, dx) + error += (error < 0) ? dist_x/2 : -dist_y if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge break - src.Move(step, get_dir(loc, step)) - hit_check(thrower) - error += (error < 0) ? tdist_x : -tdist_y; + Move(step, get_dir(loc, step)) + if(!throwing) // we hit something during our move + hit = 1 + break dist_travelled++ dist_since_sleep++ if(dist_since_sleep >= speed) dist_since_sleep = 0 sleep(1) - //done throwing, either because it hit something or it finished moving - src.throwing = 0 - if(isobj(src)) - src.throw_impact(get_turf(src),thrower) + if(!dist_since_sleep && hitcheck()) //to catch sneaky things moving on our tile during our sleep(1) + hit = 1 + break + //done throwing, either because it hit something or it finished moving + throwing = 0 + if(!hit) + for(var/atom/A in get_turf(src)) //looking for our target on the turf we land on. + if(A == target) + hit = 1 + throw_impact(A) + return 1 + + throw_impact(get_turf(src)) // we haven't hit something yet and we still must, let's hit the ground. return 1 +/atom/movable/proc/hitcheck() + for(var/atom/movable/AM in get_turf(src)) + if(AM == src) + continue + if(AM.density && !(AM.pass_flags & LETPASSTHROW) && !(AM.flags & ON_BORDER)) + throwing = 0 + throw_impact(AM) + return 1 //Overlays /atom/movable/overlay diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index 6a05e76d97a..dd5229b7c2c 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -133,9 +133,8 @@ desc = "We force ourselves into the body of another form, pushing their consciousness into the form we left behind." helptext = "We will bring all our abilities with us, but we will lose our old form DNA in exchange for the new one. The process will seem suspicious to any observers." chemical_cost = 40 - dna_cost = 2 + dna_cost = 1 req_human = 1 //Monkeys can't grab - genetic_damage = 50 /obj/effect/proc_holder/changeling/swap_form/can_sting(mob/living/carbon/user) if(!..()) diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm index 7eb4f1eebac..fb25c4401c0 100644 --- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm +++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm @@ -9,7 +9,9 @@ dna_cost = 2 //Would be 1 without thermal vision var/active = 0 //Whether or not vision is enhanced -/obj/effect/proc_holder/changeling/augmented_eyesight/sting_action(mob/user) +/obj/effect/proc_holder/changeling/augmented_eyesight/sting_action(mob/living/carbon/human/user) + if(!istype(user)) + return active = !active if(active) user << "We feel a minute twitch in our eyes, and darkness creeps away." @@ -17,12 +19,12 @@ user.sight |= SEE_MOBS user.permanent_sight_flags |= SEE_MOBS user.see_in_dark = 8 - user.see_invisible = SEE_INVISIBLE_MINIMUM + user.dna.species.invis_sight = SEE_INVISIBLE_MINIMUM else user << "Our vision dulls. Shadows gather." user.weakeyes = 0 - user.sight -= SEE_MOBS - user.permanent_sight_flags -= SEE_MOBS + user.sight &= ~SEE_MOBS + user.permanent_sight_flags &= ~SEE_MOBS user.see_in_dark = 0 - user.see_invisible = SEE_INVISIBLE_LIVING + user.dna.species.invis_sight = initial(user.dna.species.invis_sight) return 1 diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index 01bab649c0c..aaac82f87df 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -24,17 +24,6 @@ name = "desk" desc = "A desk covered in arcane manuscripts and tomes in unknown languages. Looking at the text makes your skin crawl" icon_state = "tomealtar" -// luminosity = 5 - -//sprites for this no longer exist -Pete -//(they were stolen from another game anyway) -/* -/obj/structure/cult/pillar - name = "Pillar" - desc = "This should not exist" - icon_state = "pillar" - icon = 'magic_pillar.dmi' -*/ /obj/effect/gateway name = "gateway" @@ -44,13 +33,3 @@ density = 1 unacidable = 1 anchored = 1.0 - -/obj/effect/gateway/Bumped(mob/M as mob|obj) - spawn(0) - return - return - -/obj/effect/gateway/Crossed(AM as mob|obj) - spawn(0) - return - return \ No newline at end of file diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 56b4044c7f2..6fe3cb03d0b 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -750,11 +750,11 @@ var/list/sacrificed = list() if (cultist.handcuffed) cultist.handcuffed.loc = cultist.loc cultist.handcuffed = null - cultist.update_inv_handcuffed(0) + cultist.update_inv_handcuffed() if (cultist.legcuffed) cultist.legcuffed.loc = cultist.loc cultist.legcuffed = null - cultist.update_inv_legcuffed(0) + cultist.update_inv_legcuffed() if (istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle)) cultist.unEquip(cultist.wear_mask) if(istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded) diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm index 99fce43f8e6..f7c4d935b64 100644 --- a/code/game/gamemodes/gang/gang_datum.dm +++ b/code/game/gamemodes/gang/gang_datum.dm @@ -90,7 +90,7 @@ if("Leather Overcoats") outfit_path = /obj/item/clothing/suit/jacket/leather/overcoat if("Military Jackets") - outfit_path = /obj/item/clothing/suit/miljacket + outfit_path = /obj/item/clothing/suit/jacket/miljacket if("Soviet Uniforms") outfit_path = /obj/item/clothing/under/soviet if("Tactical Turtlenecks") diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 179ba2c0fb1..452288e8ffd 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -280,10 +280,12 @@ return 0 if(isbrain(owner.current)) return 0 - if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) - return 0 if(!owner.current || owner.current.stat == DEAD) return 0 + if(ticker.force_ending) //This one isn't their fault, so lets just assume good faith + return 1 + if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) + return 0 var/turf/location = get_turf(owner.current) if(!location) return 0 diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index c198a583328..f2b121456ff 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -244,14 +244,19 @@ //Deals with players being converted from the revolution (Not a rev anymore)// // Modified to handle borged MMIs. Accepts another var if the target is being borged at the time -- Polymorph. ////////////////////////////////////////////////////////////////////////////// /datum/game_mode/proc/remove_revolutionary(datum/mind/rev_mind , beingborged) - if(rev_mind in revolutionaries) + var/remove_head = 0 + if(beingborged && (rev_mind in head_revolutionaries)) + head_revolutionaries -= rev_mind + remove_head = 1 + + if((rev_mind in revolutionaries) || remove_head) revolutionaries -= rev_mind rev_mind.special_role = null rev_mind.current.attack_log += "\[[time_stamp()]\] Has renounced the revolution!" if(beingborged) - rev_mind.current << "The frame's firmware detects and deletes your neural reprogramming! You remember nothing but the name of the one who flashed you." - message_admins("[key_name_admin(rev_mind.current)] ? (FLW) has been borged while being a member of the revolution.") + rev_mind.current << "The frame's firmware detects and deletes your neural reprogramming! You remember nothing[remove_head ? "." : " but the name of the one who flashed you."]" + message_admins("[key_name_admin(rev_mind.current)] ? (FLW) has been borged while being a [remove_head ? "leader" : " member"] of the revolution.") else rev_mind.current.Paralyse(5) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 6c157589fd2..d222919684c 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -280,8 +280,8 @@ var/global/list/multiverse = list() log_game("[M.key] was made a multiverse traveller with the objective to help [usr.real_name] hijack.") else var/datum/objective/protect/new_objective = new /datum/objective/protect - new_objective.owner = M:mind - new_objective:target = usr:mind + new_objective.owner = M.mind + new_objective.target = usr.mind new_objective.explanation_text = "Protect [usr.real_name], your copy, and help them defend the innocent from the mobs of multiverse clones." M.mind.objectives += new_objective M << "Objective #[1]: [new_objective.explanation_text]" @@ -295,7 +295,7 @@ var/global/list/multiverse = list() sword.faction = list("[assigned]") sword.evil = evil - var/randomize = pick("mobster","roman","wizard","cyborg","syndicate","assistant", "animu", "cultist", "highlander", "clown", "killer", "pirate", "soviet") + var/randomize = pick("mobster","roman","wizard","cyborg","syndicate","assistant", "animu", "cultist", "highlander", "clown", "killer", "pirate", "soviet", "officer", "gladiator") switch(randomize) if("mobster") @@ -340,6 +340,7 @@ var/global/list/multiverse = list() M.organs += new /obj/item/organ/limb/robot/r_leg M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses) M.equip_to_slot_or_del(sword, slot_r_hand) + if("syndicate") M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) @@ -349,29 +350,34 @@ var/global/list/multiverse = list() M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M),slot_wear_mask) M.equip_to_slot_or_del(sword, slot_r_hand) + if("assistant") M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(M), slot_shoes) M.equip_to_slot_or_del(sword, slot_r_hand) + if("animu") M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears) M.equip_to_slot_or_del(new /obj/item/clothing/head/kitty(M), slot_head) M.equip_to_slot_or_del(new /obj/item/clothing/under/schoolgirl/red(M), slot_w_uniform) M.equip_to_slot_or_del(sword, slot_r_hand) + if("cultist") M.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(M), slot_head) M.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears) M.equip_to_slot_or_del(sword, slot_r_hand) + if("highlander") M.equip_to_slot_or_del(new /obj/item/clothing/under/kilt(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears) M.equip_to_slot_or_del(new /obj/item/clothing/head/beret(M), slot_head) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) M.equip_to_slot_or_del(sword, slot_r_hand) + if("clown") M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears) @@ -379,6 +385,7 @@ var/global/list/multiverse = list() M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask) M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_l_store) M.equip_to_slot_or_del(sword, slot_r_hand) + if("killer") M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/white(M), slot_shoes) @@ -393,13 +400,15 @@ var/global/list/multiverse = list() for(var/obj/item/carried_item in M.contents) if(!istype(carried_item, /obj/item/weapon/implant)) carried_item.add_blood(M) + if("pirate") M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/brown(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(M), slot_head) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses) - M.equip_to_slot_or_del(sword, slot_r_hand) M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears) + M.equip_to_slot_or_del(sword, slot_r_hand) + if("soviet") M.equip_to_slot_or_del(new /obj/item/clothing/head/hgpiratecap(M), slot_head) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) @@ -407,6 +416,26 @@ var/global/list/multiverse = list() M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears) M.equip_to_slot_or_del(new /obj/item/clothing/suit/hgpirate(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform) + M.equip_to_slot_or_del(sword, slot_r_hand) + + if("officer") + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/beret(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/havana(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/jacket/miljacket(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses) + M.equip_to_slot_or_del(sword, slot_r_hand) + + if("gladiator") + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/gladiator(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/under/gladiator(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes) + M.equip_to_slot_or_del(sword, slot_r_hand) + else return @@ -420,6 +449,7 @@ var/global/list/multiverse = list() all_species += speciestype hardset_dna(M, null, null, null, null, pick(all_species)) M.update_icons() + M.update_augments() var/obj/item/weapon/card/id/W = new /obj/item/weapon/card/id W.icon_state = "centcom" diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 2f56fa82206..5b8100857c1 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -181,6 +181,7 @@ Power regulator: - - The bolts are too tight for you to unscrew!" + return if(on) user << "Turn it off first!" return @@ -210,16 +214,10 @@ Power regulator: - You [anchored ? "wrench" : "unwrench"] \the [src]." - return + else if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) + atmosanalyzer_scan(air_contents, user) - ..() /obj/machinery/portable_atmospherics/scrubber/huge/stationary name = "stationary air scrubber" - -/obj/machinery/portable_atmospherics/scrubber/huge/stationary/attackby(obj/item/weapon/W, mob/user) - if(istype(W, /obj/item/weapon/wrench)) - user << "The bolts are too tight for you to unscrew!" - return - - ..() \ No newline at end of file + stationary = 0 diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm index 8aaf4173d49..140fc457c41 100644 --- a/code/game/machinery/bots/ed209bot.dm +++ b/code/game/machinery/bots/ed209bot.dm @@ -397,14 +397,6 @@ Auto Patrol[]"}, return 1 return 0 -/* terrible -/obj/machinery/bot/ed209/Bumped(atom/movable/M as mob|obj) - spawn(0) - if (M) - var/turf/T = get_turf(src) - M:loc = T -*/ - /obj/machinery/bot/ed209/explode() walk_to(src,0) visible_message("[src] blows apart!") diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index ffaecb88a14..6a96b8ac0fb 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -410,6 +410,7 @@ var/mob/living/carbon/M = hit_atom playsound(src, 'sound/items/dodgeball.ogg', 50, 1) M.apply_damage(10, STAMINA) + loc = get_turf(hit_atom) //drop at the target's feet if(prob(5)) M.Weaken(3) visible_message("[M] is knocked right off \his feet!", 3) @@ -421,7 +422,6 @@ icon_state = "hoop" anchored = 1 density = 1 - throwpass = 1 /obj/structure/holohoop/attackby(obj/item/weapon/W, mob/user, params) if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) diff --git a/code/game/machinery/computer/crew.css b/code/game/machinery/computer/crew.css index 49c0c92437a..2ebb2e2dda8 100644 --- a/code/game/machinery/computer/crew.css +++ b/code/game/machinery/computer/crew.css @@ -1,6 +1,6 @@ body { - padding-left: 490px; + padding-left: 53%; cursor: default; } @@ -15,11 +15,19 @@ body top: 8px; left: 8px; border: 2px inset #888; + overflow: hidden; + min-width: 480px; + min-height: 480px; + width: 53%; + height: 100%; + max-width: 480px; + max-height: 480px; } #textbased { width: 100%; + padding-left: 20px; } #textbased table @@ -51,11 +59,10 @@ body clear: both; } -a { display: none; } - .health { width: 16px; + height: 16px; background-color: #FFF; border: 1px solid #434343; position: relative; @@ -69,6 +76,12 @@ a { display: none; } .health-1 { background-color: #e74c3c; } .health-0 { background-color: #ed2814; } +.health > div +{ + margin-left: 20px; + margin-top: -4px; +} + .tt { position: relative; @@ -106,7 +119,6 @@ a { display: none; } .dot { - transition: .2s all; position: absolute; width: 3px; height: 3px; @@ -122,4 +134,21 @@ a { display: none; } height: 8px; margin-top: -2px; margin-left: -3px; +} + +.zoom +{ + position: fixed; + left: 53%; + top: 10px; + display: block; + width: 24px; + height: 24px; + text-align: center; + margin-left: 20px !important; +} + +.zoom.in +{ + margin-left: -3px !important; } \ No newline at end of file diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 53b62bee531..3f2c3d52e75 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -97,12 +97,16 @@ var/global/datum/crewmonitor/crewmonitor = new hi = src.interfaces["[z]"] - hi.updateContent("content", "Switch to mini map Switch to text-based
") + hi.updateContent("content", "
+-
") src.update(z, TRUE) else hi = src.interfaces["[z]"] + // Debugging purposes + mob << browse_rsc(file("code/game/machinery/computer/crew.js"), "crew.js") + mob << browse_rsc(file("code/game/machinery/computer/crew.css"), "crew.css") + hi = src.interfaces["[z]"] hi.show(mob) src.updateFor(mob, hi, z) @@ -110,13 +114,13 @@ var/global/datum/crewmonitor/crewmonitor = new /datum/crewmonitor/proc/updateFor(hclient_or_mob, datum/html_interface/hi, z) // This check will succeed if updateFor is called after showing to the player, but will fail // on regular updates. Since we only really need this once we don't care if it fails. - var/list/parameters = list(ismob(hclient_or_mob) && isAI(hclient_or_mob) ? "true" : "false") - - hi.callJavaScript("clearAll", parameters, hclient_or_mob) + hi.callJavaScript("clearAll", null, hclient_or_mob) for (var/list/L in data) hi.callJavaScript("add", L, hclient_or_mob) + hi.callJavaScript("onAfterUpdate", null, hclient_or_mob) + /datum/crewmonitor/proc/update(z, ignore_unused = FALSE) if (src.interfaces["[z]"]) var/datum/html_interface/hi = src.interfaces["[z]"] @@ -234,17 +238,6 @@ var/global/datum/crewmonitor/crewmonitor = new if (AI && AI.eyeobj && current_loc == AI.eyeobj.loc) AI.switchCamera(C) -/* -/proc/crewscan() - var/list/tracked = list() - for(var/mob/living/carbon/human/H in mob_list) - if(istype(H.w_uniform, /obj/item/clothing/under)) - var/obj/item/clothing/under/U = H.w_uniform - if(U.has_sensor && U.sensor_mode) - tracked.Add(H) - return tracked -*/ - /mob/living/carbon/human/Move() if (src.w_uniform) var/old_z = src.z @@ -257,7 +250,7 @@ var/global/datum/crewmonitor/crewmonitor = new return ..() /datum/crewmonitor/proc/queueUpdate(z) - procqueue.queue(crewmonitor, "update", z) + procqueue.schedule(50, crewmonitor, "update", z) /datum/crewmonitor/proc/generateMiniMaps() spawn diff --git a/code/game/machinery/computer/crew.js b/code/game/machinery/computer/crew.js index 6db71d7d3c4..e29fda21061 100644 --- a/code/game/machinery/computer/crew.js +++ b/code/game/machinery/computer/crew.js @@ -207,34 +207,177 @@ * Crew manifest script */ -var isAI = null; +var minimap_height = 480; var scale_x; var scale_y; +var zoom_factor = null; +var minimap_mousedown = false; +var minimap_mousedown_scrollLeft; +var minimap_mousedown_scrollTop; +var minimap_mousedown_clientX; +var minimap_mousedown_clientY; +var minimap_mousedown_counter = 0; function disableSelection(){ return false; }; $(window).on("onUpdateContent", function() { - $("#textbased").html("

Name

 

Position

"); + $("#textbased").html("

Name

 

Position

"); - $("#minimap").append(""); + $("#minimap").append(""); $("body")[0].onselectstart = disableSelection; - var width = $("#minimap").width(); - - scale_x = width / (maxx * tile_size); - scale_y = width / (maxy * tile_size); // height is assumed to be the same - $("#minimap").on("click", function(e) { - var x = ((((e.clientX - 8) / scale_x) / tile_size) + 1).toFixed(0); - var y = ((maxy - (((e.clientY - 8) / scale_y) / tile_size)) + 1).toFixed(0); + if (!$(e.target).is(".zoom,.dot")) + { + var x = ((((e.clientX + this.scrollLeft - 8) / scale_x) / tile_size) + 1).toFixed(0); + var y = ((maxy - (((e.clientY + this.scrollTop - 8) / scale_y) / tile_size)) + 1).toFixed(0); - window.location.href = "byond://?src=" + hSrc + "&action=select_position&x=" + x + "&y=" + y; + window.location.href = "byond://?src=" + hSrc + "&action=select_position&x=" + x + "&y=" + y; + } + }).on("mousedown", function(e) + { + minimap_mousedown_scrollLeft = this.scrollLeft; + minimap_mousedown_scrollTop = this.scrollTop; + minimap_mousedown_clientX = e.clientX; + minimap_mousedown_clientY = e.clientY; + + var c = ++minimap_mousedown_counter; + setTimeout(function() + { + if (c == minimap_mousedown_counter) + { + minimap_mousedown = true; + $("#minimap").css("cursor", "move"); + } + }, 100); }); + + $(document).on("mousemove", function(e) + { + if (minimap_mousedown) + { + var offsetX = minimap_mousedown_clientX - e.clientX; + var offsetY = minimap_mousedown_clientY - e.clientY; + + var minimap = document.getElementById("minimap"); + minimap.scrollLeft = minimap_mousedown_scrollLeft + offsetX; + minimap.scrollTop = minimap_mousedown_scrollTop + offsetY; + } + }).on("mouseup", function() + { + ++minimap_mousedown_counter; + if (minimap_mousedown) + { + document.body.focus(); + minimap_mousedown = false; + $("#minimap").css("cursor", ""); + } + }); + + $(window).on("resize", onResize); + + scaleMinimap(1.00); }); +function zoomIn() +{ + scaleMinimap(Math.min(6.00, zoom_factor + 1.00)); +} + +function zoomOut() +{ + scaleMinimap(Math.max(1.00, zoom_factor - 1.00)); +} + +function scaleMinimap(factor) +{ + var $minimap = $("#minimap"); + + if (factor != zoom_factor) + { + zoom_factor = factor; + + var old_map_width = $minimap.width(); + var old_map_height = $minimap.height(); + var old_canvas_size = $("#minimap > img").height(); // height is assumed to be the same + var new_canvas_size = minimap_height * factor; // ditto + + var old_scrollLeft = $minimap[0].scrollLeft; + var old_scrollTop = $minimap[0].scrollTop; + + var old_factor = old_canvas_size / minimap_height; + var diff_factor = factor - old_factor; + + var old_centerX = ((old_map_width / 2) * diff_factor) + old_scrollLeft; + var old_centerY = ((old_map_height / 2) * diff_factor) + old_scrollTop; + + $("#minimap > img").css("height", new_canvas_size + "px"); + $minimap.css("max-width", new_canvas_size + "px"); + + var new_map_width = $minimap.width(); + var new_map_height = $minimap.height(); + + var new_centerX = (new_map_width / 2) + old_centerX; + var new_centerY = (new_map_height / 2) + old_centerY; + + var scrollLeft = new_centerX - (new_map_width / 2); + var scrollTop = new_centerY - (new_map_height / 2); + + scale_x = new_canvas_size / (maxx * tile_size); + scale_y = new_canvas_size / (maxy * tile_size); + + onResize(); + + $minimap[0].scrollLeft = scrollLeft; + $minimap[0].scrollTop = scrollTop; + + $(".dot").each(function() + { + var $this = $(this); + var tx = translateX(parseInt($this.attr("data-x"))); + var ty = translateY(parseInt($this.attr("data-y"))); + + // Workaround for IE bug where it doesn't modify the positions. + setTimeout(function(){ $this.css({ "top": ty + "px", "left": tx + "px" });}, 0); + }); + } +} + +function onResize() +{ + if (zoom_factor == 1.00) + { + $(".zoom").css("left", "442px"); + $("#minimap").css("max-height", Math.min($(window).height() - 16, 480) + "px"); + } + else + { + $(".zoom").css("left", ($("#minimap").width() - 34) + "px"); + $("#minimap").css("max-height", Math.min($(window).height() - 16, $("#minimap > img").height()) + "px"); + } + + if (expandHealth()) + { + $(".colhealth").css("width", "150px"); + $(".health").removeClass("tt"); + } + else + { + $(".colhealth").css("width", "24px"); + $(".health").addClass("tt"); + } + + $("body").css("padding-left", Math.min($(window).width() - 400, $("#minimap").width() - 10) + "px"); +} + +function expandHealth() +{ + return $("#textbased").width() > 510; +} + var updateMap = true; function switchTo(i) @@ -251,13 +394,20 @@ function switchTo(i) } } -function clearAll(ai) +var orig_scrollTop = 0; + +function clearAll() { - if (isAI === null) { isAI = (ai == "true"); } + orig_scrollTop = $(window).scrollTop(); $("#textbased-tbody").empty(); $("#minimap .dot").remove(); } +function onAfterUpdate() +{ + $(window).scrollTop(orig_scrollTop); +} + function isHead(ijob) { return (ijob % 10 == 0); // head roles always end in 0 @@ -291,21 +441,17 @@ function add(name, assignment, ijob, life_status, dam1, dam2, dam3, dam4, area, var avg_dam = parseInt(dam1) + parseInt(dam2) + parseInt(dam3) + parseInt(dam4); var i; - if (isAI) { i = -1; } - else - { - if (avg_dam <= 0) { i = 5; } - else if (avg_dam <= 25) { i = 4; } - else if (avg_dam <= 50) { i = 3; } - else if (avg_dam <= 75) { i = 2; } - else { i = 0; } - } + if (avg_dam <= 0) { i = 5; } + else if (avg_dam <= 25) { i = 4; } + else if (avg_dam <= 50) { i = 3; } + else if (avg_dam <= 75) { i = 2; } + else { i = 0; } - healthHTML = "
(" + dam1 + "/" + dam2 + "/" + dam3 + "/" + dam4 + ")
"; + healthHTML = "
(" + dam1 + "/" + dam2 + "/" + dam3 + "/" + dam4 + ")
"; } else { - healthHTML = "
Not Available
"; + healthHTML = "
Not Available
"; } var trElem = $("").attr("data-ijob", ijob); @@ -341,14 +487,21 @@ function add(name, assignment, ijob, life_status, dam1, dam2, dam3, dam4, area, trElem.append(tdElem); - tdElem = $(""); + tdElem = $(""); tdElem.html(healthHTML); trElem.append(tdElem); tdElem = $(""); - if (area && pos_x && pos_y) { tdElem.append($("
").text(area).addClass("tt").append($("
").append($("").text("(" + pos_x + ", " + pos_y + ")")))); } + if (area && pos_x && pos_y) + { + tdElem.append($("
").text(area).addClass("tt").append($("
").append($("").text("(" + pos_x + ", " + pos_y + ")")))); + tdElem.css("cursor", "pointer").on("click", function() + { + window.clipboardData.setData("Text", pos_x + ", " + pos_y); + }); + } else { tdElem.text("Not Available"); } trElem.append(tdElem); @@ -363,20 +516,24 @@ function add(name, assignment, ijob, life_status, dam1, dam2, dam3, dam4, area, var x = parseInt(pos_x); var y = maxy - parseInt(pos_y); - var tx = (translate(x - 1, scale_x) - 1.5).toFixed(0); - var ty = (translate(y - 1, scale_y) + 3).toFixed(0); + var tx = translateX(x); + var ty = translateY(y); - var dotElem = $("
"); + var dotElem = $("
"); $("#minimap").append(dotElem); + var counter = 0; + function enable() { + ++counter; dotElem.addClass("active").css({ "border-color": color }); } function disable() { + ++counter; dotElem.removeClass("active").css({ "border-color": "transparent" }); } @@ -388,7 +545,27 @@ function add(name, assignment, ijob, life_status, dam1, dam2, dam3, dam4, area, window.location.href = "byond://?src=" + hSrc + "&action=select_person&name=" + encodeURIComponent(name); } - trElem.on("mouseover", enable).on("mouseout", disable).on("click", click); + trElem.on("mouseover", function() + { + enable(); + + if (zoom_factor > 1.00) + { + var c = counter; + setTimeout(function() + { + if (c == counter) + { + var minimap = document.getElementById("minimap"); + var half = $(minimap).height() / 2; + var offset = $(dotElem).offset(); + + minimap.scrollLeft = offset.left + minimap.scrollLeft - half; + minimap.scrollTop = offset.top + minimap.scrollTop - half; + } + }, 100); + } + }).on("mouseout", disable).on("click", click); dotElem.on("mouseover", function() { trElem.addClass("hover"); @@ -402,6 +579,9 @@ function add(name, assignment, ijob, life_status, dam1, dam2, dam3, dam4, area, } } +function translateX(n) { return (translate(n - 1.5, scale_x) ).toFixed(0); } +function translateY(n) { return (translate(n + 0.75, scale_y) ).toFixed(0); } + function translate(n, scale) { return (n * tile_size) * scale; diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm index 1911b1067b3..20ea8b55b91 100644 --- a/code/game/machinery/computer/power.dm +++ b/code/game/machinery/computer/power.dm @@ -68,19 +68,35 @@ t += "Area Eqp./Lgt./Env. Load Cell
" - var/list/S = list(" Off","AOff"," On", " AOn") - var/list/chg = list("N","C","F") + var/list/S = list(" Off","AOff"," On", " AOn") + var/list/chg = list("N","C","F") + + var/percent = 0 + var/c = "" for(var/obj/machinery/power/apc/A in L) - t += copytext(add_tspace("\The [A.area]", 30), 1, 30) - t += " [S[A.equipment+1]] [S[A.lighting+1]] [S[A.environ+1]] [add_lspace(A.lastused_total, 6)] [A.cell ? "[add_lspace(round(A.cell.percent()), 3)]% [chg[A.charging+1]]" : " N/C"]
" + t += copytext(add_tspace("[format_text(A.area.name)]", 30), 1, 30) + t += " [S[A.equipment+1]] [S[A.lighting+1]] [S[A.environ+1]] [add_lspace(A.lastused_total, 6)]" + + if (A.cell) + percent = round(A.cell.percent()) + + c = "bad" + if (percent > 50) + c = "good" + else if (percent > 25) + c = "average" + + t += "[add_lspace(percent, 4)]% [chg[A.charging+1]]
" + else + t += " N/C
" t += "" //user << browse(t, "window=powcomp;size=420x900") //onclose(user, "powcomp") - var/datum/browser/popup = new(user, "powcomp", name, 420, 450) + var/datum/browser/popup = new(user, "powcomp", name, 500, 450) popup.set_content(t) popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) popup.open() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 53c8a341d23..e023131b2f6 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1096,7 +1096,7 @@ About the new airlock wires panel: spawn(150) autoclose() else if(autoclose && !normalspeed) - spawn(5) + spawn(11) autoclose() return ..() @@ -1148,8 +1148,9 @@ About the new airlock wires panel: operating = 0 air_update_turf(1) update_freelook_sight() - if(locate(/mob/living) in get_turf(src)) - open() + if(safe) + if(locate(/mob/living) in get_turf(src)) + open() return 1 /obj/machinery/door/airlock/New() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 87ad6c9728c..129d03039b9 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -45,8 +45,8 @@ /obj/machinery/door/Bumped(atom/AM) if(operating || emagged) return - if(ismob(AM)) - var/mob/M = AM + if(isliving(AM)) + var/mob/living/M = AM if(world.time - M.last_bumped <= 10) return //Can bump-open one airlock per second. This is to prevent shock spam. M.last_bumped = world.time if(!M.restrained()) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index d60c8bf9e9b..917e92f7f7e 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -1,3 +1,9 @@ +#define CONSTRUCTION_COMPLETE 0 //No construction done - functioning as normal +#define CONSTRUCTION_PANEL_OPEN 1 //Maintenance panel is open, still functioning +#define CONSTRUCTION_WIRES_EXPOSED 2 //Cover plate is removed, wires are available +#define CONSTRUCTION_GUTTED 3 //Wires are removed, circuit ready to remove +#define CONSTRUCTION_NOCIRCUIT 4 //Circuit board removed, can safely weld apart + /var/const/OPEN = 1 /var/const/CLOSED = 2 @@ -16,8 +22,10 @@ closingLayer = 3.11 /obj/machinery/door/firedoor/Bumped(atom/AM) - if(p_open || operating) return - if(!density) return ..() + if(p_open || operating) + return + if(!density) + return ..() return 0 @@ -33,6 +41,7 @@ /obj/machinery/door/firedoor/attackby(obj/item/weapon/C, mob/user, params) add_fingerprint(user) if(operating) return//Already doing something. + if(istype(C, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/W = C if(W.remove_fuel(0, user)) @@ -41,6 +50,22 @@ update_icon() return + if(istype(C, /obj/item/weapon/wrench) && panel_open) + playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) + user.visible_message("[user] starts undoing [src]'s bolts...", \ + "You start unfastening [src]'s floor bolts...") + if(!do_after(user, 50, target = src)) return + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + user.visible_message("[user] unfastens [src]'s bolts.", \ + "You undo [src]'s floor bolts.") + var/obj/structure/firelock_frame/F = new(get_turf(src)) + if(istype(src, /obj/machinery/door/firedoor/heavy)) + F.reinforced = 1 + F.constructionStep = CONSTRUCTION_PANEL_OPEN + F.update_icon() + qdel(src) + return + if(istype(C, /obj/item/weapon/crowbar) || (istype(C,/obj/item/weapon/twohanded/fireaxe) && C:wielded == 1)) if(blocked || operating) return if(density) @@ -49,6 +74,11 @@ else //close it up again //fucking 10/10 commenting here einstein close() return + + if(istype(C, /obj/item/weapon/screwdriver)) + default_deconstruction_screwdriver(user, icon_state, icon_state, C) + return + return /obj/machinery/door/firedoor/attack_ai(mob/user) @@ -140,4 +170,155 @@ icon = 'icons/obj/doors/Doorfire.dmi' glass = 0 +/obj/item/weapon/firelock_board + name = "firelock circuitry" + desc = "A circuit board used in construction of firelocks." + icon = 'icons/obj/module.dmi' + icon_state = "mainboard" + w_class = 2 + materials = list(MAT_METAL = 50, MAT_GLASS = 50) +/obj/structure/firelock_frame + name = "firelock frame" + desc = "A partially completed firelock." + icon = 'icons/obj/doors/Doorfire.dmi' + icon_state = "frame1" + anchored = 0 + density = 1 + var/constructionStep = CONSTRUCTION_NOCIRCUIT + var/reinforced = 0 + +/obj/structure/firelock_frame/examine(mob/user) + ..() + switch(constructionStep) + if(CONSTRUCTION_PANEL_OPEN) + user << "There is a small metal plate covering the wires." + if(CONSTRUCTION_WIRES_EXPOSED) + user << "Wires are trailing from the maintenance panel." + if(CONSTRUCTION_GUTTED) + user << "The circuit board is visible." + if(CONSTRUCTION_NOCIRCUIT) + user << "There are no electronics in the frame." + +/obj/structure/firelock_frame/update_icon() + ..() + icon_state = "frame[constructionStep]" + +/obj/structure/firelock_frame/attackby(obj/item/weapon/C, mob/user) + switch(constructionStep) + if(CONSTRUCTION_PANEL_OPEN) + if(istype(C, /obj/item/weapon/crowbar)) + playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) + user.visible_message("[user] starts prying something out from [src]...", \ + "You begin prying out the wire cover...") + if(!do_after(user, 50, target = src)) return + if(constructionStep != CONSTRUCTION_PANEL_OPEN) return + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + user.visible_message("[user] pries out a metal plate from [src], exposing the wires.", \ + "You remove the cover plate from [src], exposing the wires.") + constructionStep = CONSTRUCTION_WIRES_EXPOSED + update_icon() + return + if(istype(C, /obj/item/weapon/wrench)) + playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) + user.visible_message("[user] starts bolting down [src]...", \ + "You begin bolting [src]...") + if(!do_after(user, 30, target = src)) return + user.visible_message("[user] finishes the firelock.", \ + "You finish the firelock.") + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + if(reinforced) + new /obj/machinery/door/firedoor/heavy(get_turf(src)) + else + new /obj/machinery/door/firedoor(get_turf(src)) + qdel(src) + return + if(CONSTRUCTION_WIRES_EXPOSED) + if(istype(C, /obj/item/weapon/wirecutters)) + playsound(get_turf(src), 'sound/items/Wirecutter.ogg', 50, 1) + user.visible_message("[user] starts cutting the wires from [src]...", \ + "You begin removing [src]'s wires...") + if(!do_after(user, 60, target = src)) return + if(constructionStep != CONSTRUCTION_WIRES_EXPOSED) return + user.visible_message("[user] removes the wires from [src].", \ + "You remove the wiring from [src], exposing the circuit board.") + var/obj/item/stack/cable_coil/B = new(get_turf(src)) + B.amount = 5 + constructionStep = CONSTRUCTION_GUTTED + update_icon() + return + if(istype(C, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/W = C + if(W.remove_fuel(1, user)) + playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1) + user.visible_message("[user] starts welding a metal plate into [src]...", \ + "You begin welding the cover plate back onto [src]...") + if(!do_after(user, 80, target = src)) return + if(constructionStep != CONSTRUCTION_WIRES_EXPOSED) return + playsound(get_turf(src), 'sound/items/Welder2.ogg', 50, 1) + user.visible_message("[user] welds the metal plate into [src].", \ + "You weld [src]'s cover plate into place, hiding the wires.") + constructionStep = CONSTRUCTION_PANEL_OPEN + update_icon() + return + if(CONSTRUCTION_GUTTED) + if(istype(C, /obj/item/weapon/crowbar)) + user.visible_message("[user] begins removing the circuit board from [src]...", \ + "You begin prying out the circuit board from [src]...") + playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) + if(!do_after(user, 50, target = src)) return + if(constructionStep != CONSTRUCTION_GUTTED) return + user.visible_message("[user] removes [src]'s circuit board.", \ + "You remove the circuit board from [src].") + new /obj/item/weapon/firelock_board(get_turf(src)) + playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) + constructionStep = CONSTRUCTION_NOCIRCUIT + update_icon() + return + if(istype(C, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/B = C + if(B.amount < 5) + user << "You need more wires to add wiring to [src]." + return + user.visible_message("[user] begins wiring [src]...", \ + "You begin adding wires to [src]...") + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + if(!do_after(user, 60, target = src)) return + if(constructionStep != CONSTRUCTION_GUTTED) return + user.visible_message("[user] adds wires to [src].", \ + "You wire [src].") + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + B.use(5) + constructionStep = CONSTRUCTION_WIRES_EXPOSED + update_icon() + return + if(CONSTRUCTION_NOCIRCUIT) + if(istype(C, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/W = C + if(W.remove_fuel(1,user)) + playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1) + user.visible_message("[user] begins cutting apart [src]'s frame...", \ + "You begin slicing [src] apart...") + if(!do_after(user, 80, target = src)) return + if(constructionStep != CONSTRUCTION_NOCIRCUIT) return + user.visible_message("[user] cuts apart [src]!", \ + "You cut [src] into metal.") + playsound(get_turf(src), 'sound/items/Welder2.ogg', 50, 1) + var/obj/item/stack/sheet/metal/M = new(get_turf(src)) + M.amount = 3 + qdel(src) + return + if(istype(C, /obj/item/weapon/firelock_board)) + user.visible_message("[user] starts adding [C] to [src]...", \ + "You begin adding a circuit board to [src]...") + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + if(!do_after(user, 40, target = src)) return + if(constructionStep != CONSTRUCTION_NOCIRCUIT) return + user.drop_item() + qdel(C) + user.visible_message("[user] adds a circuit to [src].", \ + "You insert and secure [C].") + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + constructionStep = CONSTRUCTION_GUTTED + update_icon() + return diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index a970cbbad17..be2f33815a8 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -88,7 +88,7 @@ if (get_dist(src, L) > range) continue - if(L.flash_eyes()) + if(L.flash_eyes(affect_silicon = 1)) L.Weaken(strength) if(L.weakeyes) L.Weaken(strength * 1.5) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 38fe78bd912..9e4b3da49d0 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -101,6 +101,8 @@ var/const/SAFETY_COOLDOWN = 100 if(stat & (BROKEN|NOPOWER)) return + if(!anchored) + return if(safety_mode) return diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 659fa906fc9..c4df97166da 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -19,7 +19,7 @@ /obj/machinery/syndicatebomb/process() if(active && !defused && (timer > 0)) //Tick Tock - var/volume = (timer <= 10 ? 30 : 5) // Tick louder when the bomb is closer to being detonated. + var/volume = (timer <= 10 ? 40 : 10) // Tick louder when the bomb is closer to being detonated. playsound(loc, beepsound, volume, 0) timer-- if(active && !defused && (timer <= 0)) //Boom @@ -188,7 +188,7 @@ if(adminlog) message_admins(adminlog) log_game(adminlog) - explosion(get_turf(src),2,5,11, flame_range = 11) + explosion(get_turf(src),3,9,17, flame_range = 17) if(src.loc && istype(src.loc,/obj/machinery/syndicatebomb/)) qdel(src.loc) qdel(src) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index ba110550f4e..0841e57cab5 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -720,7 +720,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C product_ads = "Float like an astronaut, sting like a bullet!;Express your second ammendment today!;Guns don't kill people, but you can!;Who needs responsibilities when you have guns?" vend_reply = "Remember the name: Liberation Station!" products = list(/obj/item/weapon/gun/projectile/automatic/pistol/deagle/gold = 2,/obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo = 2, - /obj/item/weapon/gun/projectile/automatic/pistol/m1911 = 2,/obj/item/weapon/gun/projectile/automatic/proto = 2, + /obj/item/weapon/gun/projectile/automatic/pistol/m1911 = 2,/obj/item/weapon/gun/projectile/automatic/proto/unrestricted = 2, /obj/item/weapon/gun/projectile/shotgun/automatic/combat = 2,/obj/item/weapon/gun/projectile/automatic/gyropistol = 1, /obj/item/weapon/gun/projectile/shotgun = 2,/obj/item/weapon/gun/projectile/automatic/ar = 2) premium = list(/obj/item/ammo_box/magazine/smgm9mm = 2,/obj/item/ammo_box/magazine/m50 = 4,/obj/item/ammo_box/magazine/m45 = 2,/obj/item/ammo_box/magazine/m75 = 2) @@ -855,7 +855,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C /obj/item/clothing/mask/fakemoustache = 1,/obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 1,/obj/item/clothing/head/plaguedoctorhat = 1,/obj/item/clothing/mask/gas/plaguedoctor = 1, /obj/item/clothing/suit/toggle/owlwings = 1, /obj/item/clothing/under/owl = 1,/obj/item/clothing/mask/gas/owl_mask = 1, /obj/item/clothing/suit/toggle/owlwings/griffinwings = 1, /obj/item/clothing/under/griffin = 1, /obj/item/clothing/shoes/griffin = 1, /obj/item/clothing/head/griffin = 1, - /obj/item/clothing/suit/apron = 1,/obj/item/clothing/under/waiter = 1,/obj/item/clothing/suit/miljacket = 1, + /obj/item/clothing/suit/apron = 1,/obj/item/clothing/under/waiter = 1,/obj/item/clothing/suit/jacket/miljacket = 1, /obj/item/clothing/under/pirate = 1,/obj/item/clothing/suit/pirate = 1,/obj/item/clothing/head/pirate = 1,/obj/item/clothing/head/bandana = 1, /obj/item/clothing/head/bandana = 1,/obj/item/clothing/under/soviet = 1,/obj/item/clothing/head/ushanka = 1,/obj/item/clothing/suit/imperium_monk = 1, /obj/item/clothing/mask/gas/cyborg = 1,/obj/item/clothing/suit/holidaypriest = 1,/obj/item/clothing/head/wizard/marisa/fake = 1, @@ -950,7 +950,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C /obj/item/clothing/under/sl_suit=1,/obj/item/clothing/under/pants/jeans=3,/obj/item/clothing/under/pants/classicjeans=2, /obj/item/clothing/under/pants/camo = 1,/obj/item/clothing/under/pants/blackjeans=2,/obj/item/clothing/under/pants/khaki=2, /obj/item/clothing/under/pants/white=2,/obj/item/clothing/under/pants/red=1,/obj/item/clothing/under/pants/black=2, - /obj/item/clothing/under/pants/tan=2,/obj/item/clothing/under/pants/track=1,/obj/item/clothing/suit/miljacket = 1, + /obj/item/clothing/under/pants/tan=2,/obj/item/clothing/under/pants/track=1,/obj/item/clothing/suit/jacket/miljacket = 1, /obj/item/clothing/tie/blue=1, /obj/item/clothing/tie/red=1, /obj/item/clothing/tie/black=1, /obj/item/clothing/tie/horrible=1, /obj/item/clothing/tie/scarf/red=1,/obj/item/clothing/tie/scarf/green=1,/obj/item/clothing/tie/scarf/darkblue=1, /obj/item/clothing/tie/scarf/purple=1,/obj/item/clothing/tie/scarf/yellow=1,/obj/item/clothing/tie/scarf/orange=1, diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 6d9f0eef8b0..182c5f3005b 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -133,7 +133,11 @@ equipment.Cut() cell = null internal_tank = null - qdel(cabin_air) + if(loc) + loc.assume_air(cabin_air) + air_update_turf() + else + del(cabin_air) cabin_air = null qdel(spark_system) spark_system = null @@ -234,6 +238,7 @@ var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10) if(loc) loc.assume_air(leaked_gas) + air_update_turf() else del(leaked_gas) diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index e6d498dd0f4..b379692d619 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -71,12 +71,12 @@ take_damage(damage) check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) visible_message("[user] [user.attacktext] [src]!") - add_logs(user, src, "attacked", admin=0) + add_logs(user, src, "attacked") else src.log_append_to_last("Armor saved.") playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) visible_message("The [user] rebounds off [src.name]'s armor!") - add_logs(user, src, "attacked", admin=0) + add_logs(user, src, "attacked") return /obj/mecha/attack_tk() diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index e1c0f16074a..4c159f7a431 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -15,17 +15,14 @@ if(isanimal(AM)) var/mob/living/simple_animal/SA = AM if(!SA.flying) - Bumped(SA) + triggermine(SA) else - Bumped(AM) - -/obj/effect/mine/Bumped(AM as mob|obj) - - if(triggered) return - visible_message("[AM] sets off \icon[src] [src]!") - triggermine(AM) + triggermine(AM) /obj/effect/mine/proc/triggermine(mob/victim) + if(triggered) + return + visible_message("[victim] sets off \icon[src] [src]!") var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) s.start() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 2b1e95fc358..ce2a1fc1875 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -55,6 +55,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s var/suittoggled = 0 var/hooded = 0 + var/mob/thrownby = null + /obj/item/mouse_drag_pointer = MOUSE_ACTIVE_POINTER //the icon to indicate this object is being dragged //So items can have custom embedd values @@ -469,26 +471,17 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s if(!findtext(desc, "it looks slightly melted...")) //it looks slightly melted... it looks slightly melted... it looks slightly melted... etc. desc += " it looks slightly melted..." //needs a space at the start, formatting +/obj/item/throw_impact(atom/A) + var/itempush = 1 + if(w_class < 4) + itempush = 0 //too light to push anything + return A.hitby(src,thrownby, 0, itempush) - -/obj/item/throw_impact(A) - if(throw_speed >= EMBED_THROWSPEED_THRESHOLD) - if(istype(A, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = A - if(can_embed(src)) - if(prob(embed_chance) && !(PIERCEIMMUNE in H.dna.species.specflags)) - H.throw_alert("embeddedobject") - var/obj/item/organ/limb/L = pick(H.organs) - L.embedded_objects |= src - add_blood(H)//it embedded itself in you, of course it's bloody! - loc = H - L.take_damage(w_class*embedded_impact_pain_multiplier) - H.visible_message("\the [name] embeds itself in [H]'s [L.getDisplayName()]!","\the [name] embeds itself in your [L.getDisplayName()]!") - return - - //Reset regardless of if we hit a human. +/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1) + thrownby = thrower + . = ..() throw_speed = initial(throw_speed) //explosions change this. - ..() + /obj/item/proc/remove_item_from_storage(atom/newLoc) //please use this if you're going to snowflake an item out of a obj/item/weapon/storage if(!newLoc) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 13b9ad4be67..7d780f9bdd1 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -28,6 +28,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ new/datum/stack_recipe("computer frame", /obj/structure/computerframe, 5, time = 25, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 50, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("machine frame", /obj/machinery/constructable_frame/machine_frame, 5, time = 25, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1), \ null, \ diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 0b1b452afc5..a340ca49274 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -44,41 +44,40 @@ /obj/item/toy/balloon/afterattack(atom/A as mob|obj, mob/user, proximity) if(!proximity) return - if (istype(A, /obj/structure/reagent_dispensers/watertank) && get_dist(src,A) <= 1) - A.reagents.trans_to(src, 10) - user << "You fill the balloon with the contents of [A]." - src.desc = "A translucent balloon with some form of liquid sloshing around in it." - src.update_icon() - return + if (istype(A, /obj/structure/reagent_dispensers)) + var/obj/structure/reagent_dispensers/RD = A + if(RD.reagents.total_volume <= 0) + user << "[RD] is empty." + else if(reagents.total_volume >= 10) + user << "[src] is full." + else + A.reagents.trans_to(src, 10) + user << "You fill the balloon with the contents of [A]." + desc = "A translucent balloon with some form of liquid sloshing around in it." + update_icon() /obj/item/toy/balloon/attackby(obj/O, mob/user, params) if(istype(O, /obj/item/weapon/reagent_containers/glass)) if(O.reagents) - if(O.reagents.total_volume < 1) - user << "The [O] is empty." - else if(O.reagents.total_volume >= 1) - if(O.reagents.has_reagent("facid", 1)) - user << "The acid chews through the balloon!" - O.reagents.reaction(user) - qdel(src) - else - src.desc = "A translucent balloon with some form of liquid sloshing around in it." - user << "You fill the balloon with the contents of [O]." - O.reagents.trans_to(src, 10) - src.update_icon() - return + if(O.reagents.total_volume <= 0) + user << "[O] is empty." + else if(reagents.total_volume >= 10) + user << "[src] is full." + else + desc = "A translucent balloon with some form of liquid sloshing around in it." + user << "You fill the balloon with the contents of [O]." + O.reagents.trans_to(src, 10) + update_icon() /obj/item/toy/balloon/throw_impact(atom/hit_atom) - if(src.reagents.total_volume >= 1) - src.visible_message("\The [src] bursts!","You hear a pop and a splash.") - src.reagents.reaction(get_turf(hit_atom)) - for(var/atom/A in get_turf(hit_atom)) - src.reagents.reaction(A) - src.icon_state = "burst" - spawn(5) - if(src) - qdel(src) - return + if(!..()) //was it caught by a mob? + if(reagents.total_volume >= 1) + visible_message("[src] bursts!","You hear a pop and a splash.") + reagents.reaction(get_turf(hit_atom)) + for(var/atom/A in get_turf(hit_atom)) + reagents.reaction(A) + icon_state = "burst" + qdel(src) /obj/item/toy/balloon/update_icon() if(src.reagents.total_volume >= 1) @@ -514,20 +513,24 @@ icon_state = "snappop" w_class = 1 -/obj/item/toy/snappop/fire_act() - throw_impact() - return - -/obj/item/toy/snappop/throw_impact(atom/hit_atom) - ..() +/obj/item/toy/snappop/proc/pop_burst() var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) s.start() - new /obj/effect/decal/cleanable/ash(src.loc) - src.visible_message("The [src.name] explodes!","You hear a snap!") + new /obj/effect/decal/cleanable/ash(loc) + visible_message("The [src.name] explodes!","You hear a snap!") playsound(src, 'sound/effects/snap.ogg', 50, 1) qdel(src) +/obj/item/toy/snappop/fire_act() + pop_burst() + return + +/obj/item/toy/snappop/throw_impact(atom/hit_atom) + if(!..()) + pop_burst() + + /obj/item/toy/snappop/Crossed(H as mob|obj) if((ishuman(H))) //i guess carp and shit shouldn't set them off var/mob/living/carbon/M = H @@ -1100,12 +1103,12 @@ w_class = 2.0 /obj/item/toy/minimeteor/throw_impact(atom/hit_atom) - ..() - playsound(src, 'sound/effects/meteorimpact.ogg', 40, 1) - for(var/mob/M in range(10, src)) - if(!M.stat && !istype(M, /mob/living/silicon/ai))\ - shake_camera(M, 3, 1) - qdel(src) + if(!..()) + playsound(src, 'sound/effects/meteorimpact.ogg', 40, 1) + for(var/mob/M in range(10, src)) + if(!M.stat && !istype(M, /mob/living/silicon/ai))\ + shake_camera(M, 3, 1) + qdel(src) /* * Carp plushie diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index eaf995a9285..89b86d8b737 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -39,7 +39,7 @@ AI MODULES //The proc other things should be calling /obj/item/weapon/aiModule/proc/install(mob/living/silicon/reciever, mob/user) - if(!laws.len || laws[1] == "") //So we don't loop trough an empty list and end up with runtimes. + if(!bypass_law_amt_check && (!laws.len || laws[1] == "")) //So we don't loop trough an empty list and end up with runtimes. user << "ERROR: No laws found on board." return @@ -227,7 +227,6 @@ AI MODULES var/targetName = "name" desc = "An AI Module for removing all non-core laws." origin_tech = "programming=3;materials=4" - laws = list("This is a bug.") //This won't give the AI a message reading "these are now your laws: 1. this is a bug" because this list is only read in aiModule's subtypes. bypass_law_amt_check = 1 /obj/item/weapon/aiModule/reset/transmitInstructions(mob/living/silicon/ai/target, mob/sender) diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 8af07589f9c..07c8af45854 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -195,9 +195,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM //can't think of any other way to update the overlays :< if(ismob(loc)) var/mob/M = loc - M.update_inv_wear_mask(0) - M.update_inv_l_hand(0) - M.update_inv_r_hand(0) + M.update_inv_wear_mask() + M.update_inv_l_hand() + M.update_inv_r_hand() /obj/item/clothing/mask/cigarette/proc/handle_reagents() @@ -365,7 +365,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM lit = 0 icon_state = icon_off item_state = icon_off - M.update_inv_wear_mask(0) + M.update_inv_wear_mask() packeditem = 0 name = "empty [initial(name)]" SSobj.processing.Remove(src) diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 11490f263d4..3d5800ae934 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -56,7 +56,7 @@ /obj/item/weapon/dice/attack_self(mob/user) diceroll(user) -/obj/item/weapon/dice/throw_at(atom/target, range, speed, mob/user) +/obj/item/weapon/dice/throw_at(atom/target, range, speed, mob/user, spin=1) if(!..()) return diceroll(user) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 9f17b250993..d93940987eb 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -34,8 +34,7 @@ M.Stun(15) M.eye_stat += 8 - if(M.flash_eyes()) - M.eye_stat += rand(1, 3) + if(M.flash_eyes(affect_silicon = 1)) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index 9edf321b7e8..b5a6a1968e6 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -14,8 +14,8 @@ // Make a quick flash var/turf/T = get_turf(src) playsound(T, 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(T, null)) - M.flash_eyes() + for(var/mob/living/carbon/C in viewers(T, null)) + C.flash_eyes() for(var/i=1, i<=deliveryamt, i++) var/atom/movable/x = new spawner_type diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index f8a00e2fd38..6aad3fe9b6c 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -193,7 +193,7 @@ if(!C.legcuffed) //beartrap can't cuff your leg if there's already a beartrap or legcuffs. C.legcuffed = src src.loc = C - C.update_inv_legcuffed(0) + C.update_inv_legcuffed() feedback_add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart. else if(isanimal(L)) var/mob/living/simple_animal/SA = L diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 75f5e0d2f52..0ec9e10f923 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -162,6 +162,7 @@ var/max_fuel = 20 //The max amount of fuel the welder can hold var/change_icons = 1 var/can_off_process = 0 + var/light_intensity = 2 //how powerful the emitted light is when used. /obj/item/weapon/weldingtool/New() ..() @@ -289,7 +290,7 @@ reagents.remove_reagent("welding_fuel", amount) check_fuel() if(M) - M.flash_eyes(2) + M.flash_eyes(light_intensity) return 1 else if(M) @@ -409,7 +410,7 @@ /obj/item/weapon/weldingtool/experimental name = "experimental welding tool" - desc = "An experimental welder capable of self-fuel generation." + desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes." icon_state = "exwelder" item_state = "exwelder" max_fuel = 40 @@ -418,6 +419,7 @@ var/last_gen = 0 change_icons = 0 can_off_process = 1 + light_intensity = 1 //Proc to make the experimental welder generate fuel, optimized as fuck -Sieve diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index a72592a458e..e41fac7870f 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -79,15 +79,20 @@ return 1 /obj/structure/closet/proc/dump_contents() - for(var/obj/O in src) O.loc = loc + if(throwing) //you keep some momentum when getting out of a thrown closet + step(O, dir) for(var/mob/M in src) M.loc = loc if(M.client) M.client.eye = M.client.mob M.client.perspective = MOB_PERSPECTIVE + if(throwing) + step(M, dir) + if(throwing) + throwing = 0 /obj/structure/closet/proc/take_contents() @@ -100,14 +105,13 @@ return 0 if(!can_open()) return 0 - dump_contents() - opened = 1 if(istype(src, /obj/structure/closet/body_bag)) playsound(loc, 'sound/items/zip.ogg', 15, 1, -3) else playsound(loc, 'sound/machines/click.ogg', 15, 1, -3) density = 0 + dump_contents() update_icon() return 1 diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 23be1ce7c31..fe14690944a 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -65,9 +65,9 @@ /obj/structure/mineral_door/proc/TryToSwitchState(atom/user) if(isSwitchingStates) return - if(ismob(user)) - var/mob/M = user - if(world.time - user.last_bumped <= 60) return //NOTE do we really need that? + if(isliving(user)) + var/mob/living/M = user + if(world.time - M.last_bumped <= 60) return //NOTE do we really need that? if(M.client) if(iscarbon(M)) var/mob/living/carbon/C = M diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index d3565376d41..3bd5ef645d2 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -226,7 +226,7 @@ Crematorium Switch layer = 2.9 var/obj/structure/bodycontainer/connected = null anchored = 1.0 - throwpass = 1 + pass_flags = LETPASSTHROW /obj/structure/tray/Destroy() if(connected) @@ -278,3 +278,12 @@ Crematorium Switch desc = "Apply corpse before closing." icon_state = "morguet" +/obj/structure/tray/m_tray/CanPass(atom/movable/mover, turf/target, height=0) + if(height==0) return 1 + + if(istype(mover) && mover.checkpass(PASSTABLE)) + return 1 + if(locate(/obj/structure/table) in get_turf(mover)) + return 1 + else + return 0 diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 00ec5462738..f58f8fbce8c 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -199,10 +199,20 @@ /obj/structure/statue/plasma/bullet_act(obj/item/projectile/Proj) + var/burn = FALSE if(istype(Proj,/obj/item/projectile/beam)) PlasmaBurn(2500) + burn = TRUE else if(istype(Proj,/obj/item/projectile/ion)) PlasmaBurn(500) + burn = TRUE + if(burn) + if(Proj.firer) + message_admins("Plasma statue ignited by [key_name_admin(Proj.firer)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) + log_game("Plasma statue ignited by [key_name(Proj.firer)] in ([x],[y],[z])") + else + message_admins("Plasma statue ignited by [Proj]. No known firer.(?) (FLW) in ([x],[y],[z] - JMP)",0,1) + log_game("Plasma statue ignited by [Proj] in ([x],[y],[z]). No known firer.") ..() /obj/structure/statue/plasma/attackby(obj/item/weapon/W, mob/user, params) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 1dbf75a2ee8..47eef2e9eb7 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -20,7 +20,7 @@ density = 1 anchored = 1.0 layer = 2.8 - throwpass = 1 //You can throw objects over this, despite it's density.") + pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.") var/frame = /obj/structure/table_frame var/framestack = /obj/item/stack/rods var/buildstack = /obj/item/stack/sheet/metal @@ -364,7 +364,7 @@ icon_state = "rack" density = 1 anchored = 1.0 - throwpass = 1 //You can throw objects over this, despite it's density. + pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density. var/health = 5 /obj/structure/rack/ex_act(severity, target) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index aeb0602a5d6..1daf245f01b 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -283,34 +283,34 @@ if(H.head) if(H.head.clean_blood()) - H.update_inv_head(0) + H.update_inv_head() if(H.wear_suit) if(H.wear_suit.clean_blood()) - H.update_inv_wear_suit(0) + H.update_inv_wear_suit() else if(H.w_uniform) if(H.w_uniform.clean_blood()) - H.update_inv_w_uniform(0) + H.update_inv_w_uniform() if(washgloves) clean_blood() if(H.shoes && washshoes) if(H.shoes.clean_blood()) - H.update_inv_shoes(0) + H.update_inv_shoes() if(H.wear_mask) if(washmask) if(H.wear_mask.clean_blood()) - H.update_inv_wear_mask(0) + H.update_inv_wear_mask() else H.lip_style = null H.update_body() if(H.glasses && washglasses) if(H.glasses.clean_blood()) - H.update_inv_glasses(0) + H.update_inv_glasses() if(H.ears && washears) if(H.ears.clean_blood()) - H.update_inv_ears(0) + H.update_inv_ears() if(H.belt) if(H.belt.clean_blood()) - H.update_inv_belt(0) + H.update_inv_belt() else if(M.wear_mask) //if the mob is not human, it cleans the mask without asking for bitflags if(M.wear_mask.clean_blood()) diff --git a/code/game/objects/weapons.dm b/code/game/objects/weapons.dm index 803f29cb1aa..e85375ba5ed 100644 --- a/code/game/objects/weapons.dm +++ b/code/game/objects/weapons.dm @@ -9,8 +9,3 @@ hitsound = 'sound/items/welder.ogg' if(damtype == "brute") hitsound = "swing_hit" - -/obj/item/weapon/Bump(mob/M) - spawn(0) - ..() - return \ No newline at end of file diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm index 4d664e2b4ba..e2a05273664 100644 --- a/code/game/turfs/simulated/walls_misc.dm +++ b/code/game/turfs/simulated/walls_misc.dm @@ -62,4 +62,15 @@ T.color = color if(T.dir != dir) T.dir = dir - return T \ No newline at end of file + T.transform = transform + return T + +/turf/simulated/wall/shuttle/copyTurf(turf/T) + . = ..() + T.transform = transform + +//why don't shuttle walls habe smoothwall? now i gotta do rotation the dirty way +/turf/simulated/wall/shuttle/shuttleRotate(rotation) + var/matrix/M = transform + M.Turn(rotation) + transform = M \ No newline at end of file diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 9d8c74ea4f8..71e35f2ff89 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -221,21 +221,21 @@ var/global/floorIsLava = 0 if(6) dat+="ERROR: Could not submit Feed story to Network.

" if(src.admincaster_feed_channel.channel_name=="") - dat+="•Invalid receiving channel name.
" + dat+="•Invalid receiving channel name.
" if(src.admincaster_feed_message.returnBody(-1) == "" || src.admincaster_feed_message.returnBody(-1) == "\[REDACTED\]") - dat+="•Invalid message body.
" + dat+="•Invalid message body.
" dat+="
Return
" if(7) dat+="ERROR: Could not submit Feed Channel to Network.

" if(src.admincaster_feed_channel.channel_name =="" || src.admincaster_feed_channel.channel_name == "\[REDACTED\]") - dat+="•Invalid channel name.
" + dat+="•Invalid channel name.
" var/check = 0 for(var/datum/newscaster/feed_channel/FC in news_network.network_channels) if(FC.channel_name == src.admincaster_feed_channel.channel_name) check = 1 break if(check) - dat+="•Channel name already in use.
" + dat+="•Channel name already in use.
" dat+="
Return
" if(9) dat+="[admincaster_feed_channel.channel_name]: \[created by: [admincaster_feed_channel.returnAuthor(-1)]\]
" @@ -336,9 +336,9 @@ var/global/floorIsLava = 0 if(16) dat+="ERROR: Wanted Issue rejected by Network.

" if(src.admincaster_wanted_message.criminal =="" || src.admincaster_wanted_message.criminal == "\[REDACTED\]") - dat+="•Invalid name for person wanted.
" + dat+="•Invalid name for person wanted.
" if(src.admincaster_wanted_message.body == "" || src.admincaster_wanted_message.body == "\[REDACTED\]") - dat+="•Invalid description.
" + dat+="•Invalid description.
" dat+="
Return
" if(17) dat+="Wanted Issue successfully deleted from Circulation
" @@ -406,7 +406,7 @@ var/global/floorIsLava = 0 /datum/admins/proc/restart() set category = "Server" - set name = "Restart" + set name = "Hard Restart" set desc="Restarts the world immediately" if (!usr.client.holder) return @@ -418,6 +418,20 @@ var/global/floorIsLava = 0 feedback_add_details("admin_verb","R") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! world.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10) +/datum/admins/proc/end_round() + set category = "Server" + set name = "End Round" + set desc = "Attempts to produce a round end report and then restart the server organically." + + if (!usr.client.holder) + return + var/confirm = alert("End the round and restart the game world?", "End Round", "Yes", "Cancel") + if(confirm == "Cancel") + return + if(confirm == "Yes") + ticker.force_ending = 1 + feedback_add_details("admin_verb","ER") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /datum/admins/proc/announce() set category = "Special Verbs" @@ -790,4 +804,4 @@ var/global/floorIsLava = 0 tomob.ckey = frommob.ckey qdel(frommob) - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 194a4437e55..e9164a44db9 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -98,6 +98,7 @@ var/list/admin_verbs_spawn = list( var/list/admin_verbs_server = list( /datum/admins/proc/startnow, /datum/admins/proc/restart, + /datum/admins/proc/end_round, /datum/admins/proc/delay, /datum/admins/proc/toggleaban, /client/proc/toggle_log_hrefs, @@ -127,7 +128,8 @@ var/list/admin_verbs_debug = list( /client/proc/debugNatureMapGenerator, /client/proc/check_bomb_impacts, /proc/machine_upgrade, - /client/proc/populate_world + /client/proc/populate_world, + /client/proc/cmd_display_del_log ) var/list/admin_verbs_possess = list( /proc/possess, @@ -205,7 +207,8 @@ var/list/admin_verbs_hideable = list( /client/proc/reset_all_tcs, /client/proc/panicbunker, /client/proc/admin_change_sec_level, - /client/proc/toggle_nuke + /client/proc/toggle_nuke, + /client/proc/cmd_display_del_log ) /client/proc/add_admin_verbs() diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 5c290f9ba11..1320ae695c2 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -194,7 +194,7 @@ Player panel
- Hover over a line to see more information - Check antagonists - Kick everyone/AFKers in lobby + Hover over a line to see more information - Check antagonists - Kick everyone/AFKers in lobby

diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index 3aa09ecd6b3..737f1110cb8 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -166,11 +166,6 @@ dat += "[sig]
" usr << browse(dat, "window=lawchanges;size=800x500") - if("check_antagonist") - if(!check_rights(R_ADMIN)) - return - check_antagonists() - if("moveminingshuttle") if(!check_rights(R_ADMIN)) return @@ -198,23 +193,6 @@ message_admins("[key_name_admin(usr)] moved the centcom ferry") log_admin("[key_name(usr)] moved the centcom ferry") - if("kick_all_from_lobby") - if(!check_rights(R_ADMIN)) - return - if(ticker && ticker.current_state == GAME_STATE_PLAYING) - var/afkonly = text2num(href_list["afkonly"]) - if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby??","Message","Yes","Cancel") != "Yes") - usr << "Kick clients from lobby aborted" - return - var/list/listkicked = kick_clients_in_lobby("The admin [usr.ckey] issued a 'kick all clients from lobby' command.", afkonly) - var/strkicked = "" - for(var/name in listkicked) - strkicked += "[name], " - message_admins("[key_name_admin(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]") - log_admin("[key_name(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]") - else - usr << "You may only use this when the game is running" - if("showailaws") if(!check_rights(R_ADMIN)) return diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 062cc7f9378..eec40beca16 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -352,7 +352,6 @@ message_admins("[key_name_admin(usr)] is considering ending the round.") if(alert(usr, "This will end the round, are you SURE you want to do this?", "Confirmation", "Yes", "No") == "Yes") - spawn(200) //I wish you would step back from that ledge my friend if(alert(usr, "Final Confirmation: End the round NOW?", "Confirmation", "Yes", "No") == "Yes") message_admins("[key_name_admin(usr)] has ended the round.") ticker.force_ending = 1 //Yeah there we go APC destroyed mission accomplished @@ -2056,3 +2055,26 @@ var/datum/newscaster/feed_message/FM = locate(href_list["ac_lock_comment"]) FM.locked ^= 1 src.access_news_network() + + else if(href_list["check_antagonist"]) + if(!check_rights(R_ADMIN)) + return + check_antagonists() + + else if(href_list["kick_all_from_lobby"]) + if(!check_rights(R_ADMIN)) + return + if(ticker && ticker.current_state == GAME_STATE_PLAYING) + var/afkonly = text2num(href_list["afkonly"]) + if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby??","Message","Yes","Cancel") != "Yes") + usr << "Kick clients from lobby aborted" + return + var/list/listkicked = kick_clients_in_lobby("You were kicked from the lobby by an Administrator.", afkonly) + + var/strkicked = "" + for(var/name in listkicked) + strkicked += "[name], " + message_admins("[key_name_admin(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]") + log_admin("[key_name(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]") + else + usr << "You may only use this when the game is running" \ No newline at end of file diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 504752196c5..d947599c6d5 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -113,7 +113,7 @@ var/intercom_range_display_status = 0 if (!(F in view(7,I.loc))) qdel(F) feedback_add_details("admin_verb","mIRD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - + /client/proc/cmd_show_at_list() set category = "Mapping" set name = "Show roundstart AT list" @@ -121,14 +121,14 @@ var/intercom_range_display_status = 0 var/dat = {"Coordinate list of Active Turfs at Roundstart
Real-time Active Turfs list you can see in Air Subsystem at active_turfs var
"} - + for(var/i=1; i<=active_turfs_startlist.len; i++) dat += active_turfs_startlist[i] dat += "
" usr << browse(dat, "window=at_list") - - feedback_add_details("admin_verb","mATL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + feedback_add_details("admin_verb","mATL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/enable_debug_verbs() set category = "Debug" @@ -158,7 +158,6 @@ var/intercom_range_display_status = 0 src.verbs += /client/proc/disable_communication src.verbs += /client/proc/print_pointers src.verbs += /client/proc/count_movable_instances - src.verbs += /client/proc/cmd_display_del_log src.verbs += /client/proc/cmd_show_at_list //src.verbs += /client/proc/cmd_admin_rejuvenate diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 4b6c9ff0881..89e24aa3672 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -21,7 +21,9 @@ return icon_state = "off" - +//prevents shuttles attempting to rotate this since it messes up sprites +/obj/machinery/gateway/shuttleRotate() + return //this is da important part wot makes things go /obj/machinery/gateway/centerstation diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 26c6cced4ef..1997ac51b41 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -259,7 +259,7 @@ BLIND // can't see anything if(istype(loc, /mob/living/carbon/human)) var/mob/living/carbon/human/H = loc - H.update_inv_w_uniform(0) + H.update_inv_w_uniform() return 1 @@ -390,7 +390,7 @@ atom/proc/generate_female_clothing(index,t_color,icon,type) if(istype(loc, /mob/living/carbon/human)) var/mob/living/carbon/human/H = loc - H.update_inv_w_uniform(0) + H.update_inv_w_uniform() /obj/item/clothing/proc/weldingvisortoggle() //Malk: proc to toggle welding visors on helmets, masks, goggles, etc. if(can_use(usr)) @@ -414,11 +414,11 @@ atom/proc/generate_female_clothing(index,t_color,icon,type) tint = 0 if(istype(src, /obj/item/clothing/head)) //makes the mob-overlays update - usr.update_inv_head(0) + usr.update_inv_head() if(istype(src, /obj/item/clothing/glasses)) - usr.update_inv_glasses(0) + usr.update_inv_glasses() if(istype(src, /obj/item/clothing/mask)) - usr.update_inv_wear_mask(0) + usr.update_inv_wear_mask() /obj/item/clothing/proc/can_use(mob/user) if(user && ismob(user)) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 2d2ca4ff400..5bdf5f9eaff 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -58,14 +58,14 @@ flags_inv |= (visor_flags_inv) icon_state = initial(icon_state) usr << "[toggle_message] \the [src]." - usr.update_inv_head(0) + usr.update_inv_head() else up = !up flags &= ~(visor_flags) flags_inv &= ~(visor_flags_inv) icon_state = "[initial(icon_state)]up" usr << "[alt_toggle_message] \the [src]" - usr.update_inv_head(0) + usr.update_inv_head() if(active_sound) while(up) playsound(src.loc, "[active_sound]", 100, 0, 4) @@ -180,7 +180,7 @@ if(istype(loc, /mob/living/carbon/human)) var/mob/living/carbon/human/H = loc - H.update_inv_head(0) + H.update_inv_head() return @@ -214,7 +214,7 @@ update_helmlight(user) S.update_brightness(user) update_icon() - usr.update_inv_head(0) + usr.update_inv_head() verbs -= /obj/item/clothing/head/helmet/proc/toggle_helmlight return diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 8c7fa5b2204..0f6e39d72cf 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -38,7 +38,7 @@ else icon_state = "[item_color]soft" user << "You flip the hat back in normal position." - usr.update_inv_head(0) //so our mob-overlays update + usr.update_inv_head() //so our mob-overlays update /obj/item/clothing/head/soft/examine(mob/user) ..() diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 843f69e25c5..7759f4bd7e6 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -29,7 +29,7 @@ magpulse = !magpulse icon_state = "[magboot_state][magpulse]" user << "You [magpulse ? "enable" : "disable"] the mag-pulse traction system." - user.update_inv_shoes(0) //so our mob-overlays update + user.update_inv_shoes() //so our mob-overlays update user.update_gravity(user.mob_has_gravity()) /obj/item/clothing/shoes/magboots/negates_gravity() diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 015e70defc7..0369bcab18d 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -240,6 +240,7 @@ item_state = "hostrench" burn_state = -1 //Not Burnable max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/weapon/gun/projectile/automatic/pistol,/obj/item/weapon/gun/projectile/revolver,/obj/item/weapon/gun/projectile/revolver/detective) /obj/item/clothing/suit/jacket/leather/overcoat name = "leather overcoat" @@ -264,6 +265,13 @@ cold_protection = CHEST|GROIN armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 30, rad = 0) +/obj/item/clothing/suit/jacket/miljacket + name = "military jacket" + desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable." + icon_state = "militaryjacket" + item_state = "militaryjacket" + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/weapon/gun/projectile/automatic/pistol,/obj/item/weapon/gun/projectile/revolver,/obj/item/weapon/gun/projectile/revolver/detective) + /obj/item/clothing/suit/xenos name = "xenos suit" desc = "A suit made out of chitinous alien hide." @@ -347,8 +355,3 @@ allowed = list(/obj/item/weapon/pickaxe,/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter) armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) -/obj/item/clothing/suit/miljacket - name = "military jacket" - desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable." - icon_state = "militaryjacket" - item_state = "militaryjacket" diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm index 10ca2b4b64e..eb47c8581a9 100644 --- a/code/modules/events/anomaly_bluespace.dm +++ b/code/modules/events/anomaly_bluespace.dm @@ -43,9 +43,9 @@ priority_announce("Massive bluespace translocation detected.", "Anomaly Alert") var/list/flashers = list() - for(var/mob/living/carbon/human/M in viewers(TO, null)) - if(M.flash_eyes()) - flashers += M + for(var/mob/living/carbon/C in viewers(TO, null)) + if(C.flash_eyes()) + flashers += C var/y_distance = TO.y - FROM.y var/x_distance = TO.x - FROM.x diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index c819175a48e..8ad8c75980a 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -171,47 +171,6 @@ Gunshots/explosions/opening doors/less rare audio (done) name = "alien hunter ([rand(1, 1000)])" return -/obj/effect/hallucination/simple/xeno/throw_at(atom/target, range, speed) // TODO : Make diagonal trhow into proc/property - if(!target || !src || (flags & NODROP)) return 0 - - src.throwing = 1 - - var/dist_x = abs(target.x - src.x) - var/dist_y = abs(target.y - src.y) - var/dist_travelled = 0 - var/dist_since_sleep = 0 - - var/tdist_x = dist_x; - var/tdist_y = dist_y; - - if(dist_x <= dist_y) - tdist_x = dist_y; - tdist_y = dist_x; - - var/error = tdist_x/2 - tdist_y - while(target && (((((dist_x > dist_y) && ((src.x < target.x) || (src.x > target.x))) || ((dist_x <= dist_y) && ((src.y < target.y) || (src.y > target.y))) || (src.x > target.x)) && dist_travelled < range) || !has_gravity(src))) - - if(!src.throwing) break - if(!istype(src.loc, /turf)) break - - var/atom/step = get_step(src, get_dir(src,target)) - if(!step) - break - src.Move(step, get_dir(src, step)) - hit_check() - error += (error < 0) ? tdist_x : -tdist_y; - dist_travelled++ - dist_since_sleep++ - if(dist_since_sleep >= speed) - dist_since_sleep = 0 - sleep(1) - - - src.throwing = 0 - src.throw_impact(get_turf(src)) - - return 1 - /obj/effect/hallucination/simple/xeno/throw_impact(A) update_icon("alienh_pounce") if(A == target) @@ -232,10 +191,10 @@ Gunshots/explosions/opening doors/less rare audio (done) xeno = new(pump.loc,target) sleep(10) xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) - xeno.throw_at(target,7,1) + xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1) sleep(10) xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) - xeno.throw_at(pump,7,1) + xeno.throw_at(pump,7,1, spin = 0, diagonals_first = 1) sleep(10) var/xeno_name = xeno.name target << "[xeno_name] begins climbing into the ventilation system..." diff --git a/code/modules/food&drinks/food/snacks_egg.dm b/code/modules/food&drinks/food/snacks_egg.dm index 6a17202d6f0..473ad4ebde5 100644 --- a/code/modules/food&drinks/food/snacks_egg.dm +++ b/code/modules/food&drinks/food/snacks_egg.dm @@ -18,10 +18,11 @@ filling_color = "#F0E68C" /obj/item/weapon/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom) - ..() - new/obj/effect/decal/cleanable/egg_smudge(src.loc) - reagents.reaction(hit_atom, TOUCH) - del(src) // Not qdel, because it'll hit other mobs then the floor for runtimes. + if(!..()) //was it caught by a mob? + var/turf/T = get_turf(hit_atom) + new/obj/effect/decal/cleanable/egg_smudge(T) + reagents.reaction(hit_atom, TOUCH) + qdel(src) /obj/item/weapon/reagent_containers/food/snacks/egg/attackby(obj/item/weapon/W, mob/user, params) if(istype( W, /obj/item/toy/crayon )) diff --git a/code/modules/food&drinks/food/snacks_pie.dm b/code/modules/food&drinks/food/snacks_pie.dm index e4fe6700f67..6a9be926630 100644 --- a/code/modules/food&drinks/food/snacks_pie.dm +++ b/code/modules/food&drinks/food/snacks_pie.dm @@ -23,10 +23,11 @@ list_reagents = list("nutriment" = 6, "banana" = 5, "vitamin" = 2) /obj/item/weapon/reagent_containers/food/snacks/pie/cream/throw_impact(atom/hit_atom) - ..() - new/obj/effect/decal/cleanable/pie_smudge(src.loc) - reagents.reaction(hit_atom, TOUCH) - del(src) // Not qdel, because it'll hit other mobs then the floor for runtimes. + if(!..()) //was it caught by a mob? + var/turf/T = get_turf(hit_atom) + new/obj/effect/decal/cleanable/pie_smudge(T) + reagents.reaction(hit_atom, TOUCH) + qdel(src) /obj/item/weapon/reagent_containers/food/snacks/pie/berryclafoutis diff --git a/code/modules/html_interface/bootstrap.min.css b/code/modules/html_interface/css/bootstrap.min.css similarity index 100% rename from code/modules/html_interface/bootstrap.min.css rename to code/modules/html_interface/css/bootstrap.min.css diff --git a/code/modules/html_interface/html_interface.css b/code/modules/html_interface/css/html_interface.css similarity index 100% rename from code/modules/html_interface/html_interface.css rename to code/modules/html_interface/css/html_interface.css diff --git a/code/modules/html_interface/html_interface.dm b/code/modules/html_interface/html_interface.dm index 2e3359e80c4..ffc04407f66 100644 --- a/code/modules/html_interface/html_interface.dm +++ b/code/modules/html_interface/html_interface.dm @@ -127,11 +127,11 @@ mob/verb/test() /datum/html_interface/proc/specificRenderTitle(datum/html_interface_client/hclient, ignore_cache = FALSE) /datum/html_interface/proc/sendResources(client/client) - client << browse_rsc('jquery.min.js') - client << browse_rsc('bootstrap.min.js') - client << browse_rsc('bootstrap.min.css') - client << browse_rsc('html_interface.css') - client << browse_rsc('html_interface.js') + client << browse_rsc('js/jquery.min.js', "jquery.min.js") + client << browse_rsc('js/bootstrap.min.js', "bootstrap.min.js") + client << browse_rsc('css/bootstrap.min.css', "bootstrap.min.css") + client << browse_rsc('css/html_interface.css', "html_interface.css") + client << browse_rsc('js/html_interface.js', "html_interface.js") /datum/html_interface/proc/createWindow(datum/html_interface_client/hclient) winclone(hclient.client, "window", "browser_\ref[src]") @@ -212,14 +212,15 @@ mob/verb/test() // causing file not found errors. // src.sendResources(hclient.client) - if (winexists(hclient.client, "browser_\ref[src]")) - src._renderTitle(hclient, TRUE) - src._renderLayout(hclient) - else + if (!winexists(hclient.client, "browser_\ref[src]")) src.createWindow(hclient) - hclient.is_loaded = FALSE - hclient.client << output(replacetextEx(replacetextEx(file2text('html_interface.html'), "\[hsrc\]", "\ref[src]"), "", "[head]"), "browser_\ref[src].browser") - winshow(hclient.client, "browser_\ref[src]", TRUE) + //src._renderTitle(hclient, TRUE) + //src._renderLayout(hclient) + + hclient.is_loaded = FALSE + hclient.client << output(replacetextEx(replacetextEx(file2text('html_interface.html'), "\[hsrc\]", "\ref[src]"), "", "[head]"), "browser_\ref[src].browser") + + winshow(hclient.client, "browser_\ref[src]", TRUE) while (hclient.client && hclient.active && !hclient.is_loaded) sleep(2) diff --git a/code/modules/html_interface/html_interface.html b/code/modules/html_interface/html_interface.html index 1231c21df53..4bf76c6180a 100644 --- a/code/modules/html_interface/html_interface.html +++ b/code/modules/html_interface/html_interface.html @@ -8,6 +8,7 @@ + diff --git a/code/modules/html_interface/bootstrap.min.js b/code/modules/html_interface/js/bootstrap.min.js similarity index 100% rename from code/modules/html_interface/bootstrap.min.js rename to code/modules/html_interface/js/bootstrap.min.js diff --git a/code/modules/html_interface/html_interface.js b/code/modules/html_interface/js/html_interface.js similarity index 100% rename from code/modules/html_interface/html_interface.js rename to code/modules/html_interface/js/html_interface.js diff --git a/code/modules/html_interface/jquery.min.js b/code/modules/html_interface/js/jquery.min.js similarity index 100% rename from code/modules/html_interface/jquery.min.js rename to code/modules/html_interface/js/jquery.min.js diff --git a/code/modules/html_interface/nanotrasen/nanotrasen.dm b/code/modules/html_interface/nanotrasen/nanotrasen.dm index 1196b221785..3c1cfa47ef6 100644 --- a/code/modules/html_interface/nanotrasen/nanotrasen.dm +++ b/code/modules/html_interface/nanotrasen/nanotrasen.dm @@ -21,7 +21,7 @@ The client is optional and may be a /mob, /client or /html_interface_client obje src.head = src.head + "" src.updateLayout("") -/datum/html_interface/updateLayout(layout) +/datum/html_interface/nanotrasen/updateLayout(layout) // Wrap the layout in our custom HTML return ..("

[layout]
") diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 6c11a41934e..f27866be2d2 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -806,17 +806,16 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/add_juice() bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/proc/squish(atom/target) - new splat(src.loc) - src.visible_message("The [src.name] has been squashed.","You hear a smack.") + var/turf/T = get_turf(target) + new splat(T) + visible_message("The [src.name] has been squashed.","You hear a smack.") for(var/atom/A in get_turf(target)) - src.reagents.reaction(A) + reagents.reaction(A) /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/throw_impact(atom/hit_atom) - ..() - squish(hit_atom) - del(src) // Not qdel, because it'll hit other mobs then the floor for runtimes. - return - + if(!..()) //was it caught by a mob? + squish(hit_atom) + qdel(src) /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/killer seed = /obj/item/seeds/killertomatoseed @@ -906,7 +905,8 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/add_juice() ..() var/teleport_radius = potency / 10 if(isliving(squishee)) - new /obj/effect/decal/cleanable/molten_item(squishee.loc) //Leave a pile of goo behind for dramatic effect... + var/turf/T = get_turf(squishee) + new /obj/effect/decal/cleanable/molten_item(T) //Leave a pile of goo behind for dramatic effect... do_teleport(squishee, get_turf(squishee), teleport_radius) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 4e0a620168d..8c8ab32c83b 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -30,7 +30,7 @@ W.equipped(src,slot_l_hand) if(client) client.screen |= W if(pulling == W) stop_pulling() - update_inv_l_hand(0) + update_inv_l_hand() W.pixel_x = initial(W.pixel_x) W.pixel_y = initial(W.pixel_y) return 1 @@ -49,7 +49,7 @@ W.equipped(src,slot_r_hand) if(client) client.screen |= W if(pulling == W) stop_pulling() - update_inv_r_hand(0) + update_inv_r_hand() W.pixel_x = initial(W.pixel_x) W.pixel_y = initial(W.pixel_y) return 1 diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index fa0f58d7f07..7f1e5337575 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -1,5 +1,5 @@ /mob/living/carbon/alien/hitby(atom/movable/AM) - ..(AM, 1) + ..(AM, skip = 1) /*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other. diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 08e276eb289..7d255e2116b 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -94,7 +94,7 @@ Doesn't work on other aliens/AI.*/ action_icon_state = "alien_whisper" /obj/effect/proc_holder/alien/whisper/fire(mob/living/carbon/alien/user) - var/mob/M = input("Select who to whisper to:","Whisper to?",null) as mob in oview(user) + var/mob/living/M = input("Select who to whisper to:","Whisper to?",null) as mob in oview(user) if(!M) return 0 var/msg = sanitize(input("Message:", "Alien Whisper") as text|null) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index 68fda08c934..dd900163da0 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -82,11 +82,11 @@ else //Maybe uses plasma in the future, although that wouldn't make any sense... leaping = 1 update_icons() - throw_at(A,MAX_ALIEN_LEAP_DIST,1) + throw_at(A,MAX_ALIEN_LEAP_DIST,1, spin=0, diagonals_first = 1) leaping = 0 update_icons() -/mob/living/carbon/alien/humanoid/hunter/throw_impact(A) +/mob/living/carbon/alien/humanoid/hunter/throw_impact(atom/A) if(!leaping) return ..() @@ -103,60 +103,19 @@ pounce_cooldown = !pounce_cooldown spawn(pounce_cooldown_time) //3s by default pounce_cooldown = !pounce_cooldown - else + else if(A.density && !A.CanPass(src)) visible_message("[src] smashes into [A]!", "[src] smashes into [A]!") weakened = 2 if(leaping) leaping = 0 + update_icons() update_canmove() - /mob/living/carbon/alien/humanoid/float(on) if(leaping) return ..() -//Modified throw_at() that will use diagonal dirs where appropriate -//instead of locking it to cardinal dirs -/mob/living/carbon/alien/humanoid/throw_at(atom/target, range, speed) - if(!target || !src || (flags & NODROP)) return 0 - - src.throwing = 1 - - var/dist_x = abs(target.x - src.x) - var/dist_y = abs(target.y - src.y) - var/dist_travelled = 0 - var/dist_since_sleep = 0 - - var/tdist_x = dist_x; - var/tdist_y = dist_y; - - if(dist_x <= dist_y) - tdist_x = dist_y; - tdist_y = dist_x; - - var/error = tdist_x/2 - tdist_y - while(target && (((((dist_x > dist_y) && ((src.x < target.x) || (src.x > target.x))) || ((dist_x <= dist_y) && ((src.y < target.y) || (src.y > target.y))) || (src.x > target.x)) && dist_travelled < range) || !has_gravity(src))) - - if(!src.throwing) break - if(!istype(src.loc, /turf)) break - - var/atom/step = get_step(src, get_dir(src,target)) - if(!step) - break - src.Move(step, get_dir(src, step)) - hit_check() - error += (error < 0) ? tdist_x : -tdist_y; - dist_travelled++ - dist_since_sleep++ - if(dist_since_sleep >= speed) - dist_since_sleep = 0 - sleep(1) - - - src.throwing = 0 - - return 1 diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm index 85a63338919..65d84763147 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm @@ -1,12 +1,3 @@ -//Xeno Overlays Indexes////////// -#define X_L_HAND_LAYER 1 -#define X_R_HAND_LAYER 2 -#define X_FIRE_LAYER 3 -#define X_TOTAL_LAYERS 3 -///////////////////////////////// - -/mob/living/carbon/alien/humanoid - var/list/overlays_standing[X_TOTAL_LAYERS] /mob/living/carbon/alien/humanoid/update_icons() update_hud() //TODO: remove the need for this to be here @@ -50,15 +41,10 @@ pixel_y = get_standard_pixel_y_offset(lying) /mob/living/carbon/alien/humanoid/regenerate_icons() - ..() - if (notransform) return - - update_inv_r_hand(0) - update_inv_l_hand(0) - update_hud() -// update_icons() //Handled in update_transform(), leaving this here as a reminder - update_fire() - update_transform() + if(!..()) + update_hud() + // update_icons() //Handled in update_transform(), leaving this here as a reminder + update_transform() /mob/living/carbon/alien/humanoid/update_transform() //The old method of updating lying/standing was update_icons(). Aliens still expect that. if(lying > 0) @@ -67,47 +53,12 @@ update_icons() - -/mob/living/carbon/alien/humanoid/update_hud() - if(client) - client.screen |= contents - - -/mob/living/carbon/alien/humanoid/update_inv_r_hand(update_icons = 1) - if(r_hand) - var/t_state = r_hand.item_state - if(!t_state) - t_state = r_hand.icon_state - r_hand.screen_loc = ui_rhand - overlays_standing[X_R_HAND_LAYER] = image("icon" = r_hand.righthand_file, "icon_state" = t_state) - else - overlays_standing[X_R_HAND_LAYER] = null - if(update_icons) - update_icons() - -/mob/living/carbon/alien/humanoid/update_inv_l_hand(update_icons = 1) - if(l_hand) - var/t_state = l_hand.item_state - if(!t_state) - t_state = l_hand.icon_state - l_hand.screen_loc = ui_lhand - overlays_standing[X_L_HAND_LAYER] = image("icon" = l_hand.lefthand_file, "icon_state" = t_state) - else - overlays_standing[X_L_HAND_LAYER] = null - if(update_icons) - update_icons() - -/mob/living/carbon/alien/humanoid/update_fire() - overlays -= overlays_standing[X_FIRE_LAYER] - if(on_fire) - overlays_standing[X_FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing", "layer"= -X_FIRE_LAYER) - overlays += overlays_standing[X_FIRE_LAYER] - return - else - overlays_standing[X_FIRE_LAYER] = null - -//Xeno Overlays Indexes////////// -#undef X_L_HAND_LAYER -#undef X_R_HAND_LAYER -#undef X_FIRE_LAYER -#undef X_TOTAL_LAYERS +#undef FACEMASK_LAYER +#undef HEAD_LAYER +#undef BACK_LAYER +#undef LEGCUFF_LAYER +#undef HANDCUFF_LAYER +#undef L_HAND_LAYER +#undef R_HAND_LAYER +#undef FIRE_LAYER +#undef TOTAL_LAYERS \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/larva/update_icons.dm b/code/modules/mob/living/carbon/alien/larva/update_icons.dm index 104811c4fc1..dba2774866a 100644 --- a/code/modules/mob/living/carbon/alien/larva/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/larva/update_icons.dm @@ -22,4 +22,7 @@ icon_state = "larva[state]" /mob/living/carbon/alien/larva/update_transform() //All this is handled in update_icons() - return update_icons() \ No newline at end of file + return update_icons() + +/mob/living/carbon/larva/update_inv_handcuffed() + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 99b7a1af49d..6c4d86d89ae 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -153,7 +153,7 @@ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) -/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0) +/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0) var/damage = intensity - check_eye_prot() if(..()) // we've been flashed if(weakeyes) @@ -433,13 +433,13 @@ var/const/GALOSHES_DONT_HELP = 8 handcuffed = null if(buckled && buckled.buckle_requires_restraints) buckled.unbuckle_mob() - update_inv_handcuffed(0) + update_inv_handcuffed() return if(legcuffed) legcuffed.loc = loc legcuffed.dropped() legcuffed = null - update_inv_legcuffed(0) + update_inv_legcuffed() else src << "You fail to remove [I]!" @@ -456,11 +456,11 @@ var/const/GALOSHES_DONT_HELP = 8 if(handcuffed) handcuffed = null - update_inv_handcuffed(0) + update_inv_handcuffed() return else legcuffed = null - update_inv_legcuffed(0) + update_inv_legcuffed() else src << "You fail to break [I]!" @@ -470,7 +470,7 @@ var/const/GALOSHES_DONT_HELP = 8 handcuffed = null if (buckled && buckled.buckle_requires_restraints) buckled.unbuckle_mob() - update_inv_handcuffed(0) + update_inv_handcuffed() if (client) client.screen -= W if (W) @@ -481,7 +481,7 @@ var/const/GALOSHES_DONT_HELP = 8 if (legcuffed) var/obj/item/weapon/W = legcuffed legcuffed = null - update_inv_legcuffed(0) + update_inv_legcuffed() if (client) client.screen -= W if (W) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 7ef10003c95..9b705841a82 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -8,8 +8,8 @@ put_in_active_hand(I) visible_message("[src] catches [I]!") throw_mode_off() - return - ..() + return 1 + return ..() /mob/living/carbon/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 939fbf76081..679fb191dc1 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -791,11 +791,11 @@ var/mob/living/carbon/human/H = src if(H.gloves) if(H.gloves.clean_blood()) - H.update_inv_gloves(0) + H.update_inv_gloves() else ..() // Clear the Blood_DNA list if(H.bloody_hands) H.bloody_hands = 0 H.bloody_hands_mob = null - H.update_inv_gloves(0) + H.update_inv_gloves() update_icons() //apply the now updated overlays to the mob \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 72a5d682d0c..06944984cf5 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -170,10 +170,10 @@ emp_act if(get_dist(H, src) <= 1) //people with TK won't get smeared with blood if(H.wear_suit) H.wear_suit.add_blood(src) - H.update_inv_wear_suit(0) //updates mob overlays to show the new blood (no refresh) + H.update_inv_wear_suit() //updates mob overlays to show the new blood (no refresh) else if(H.w_uniform) H.w_uniform.add_blood(src) - H.update_inv_w_uniform(0) //updates mob overlays to show the new blood (no refresh) + H.update_inv_w_uniform() //updates mob overlays to show the new blood (no refresh) if (H.gloves) var/obj/item/clothing/gloves/G = H.gloves G.add_blood(H) @@ -194,13 +194,13 @@ emp_act if(bloody) //Apply blood if(wear_mask) wear_mask.add_blood(src) - update_inv_wear_mask(0) + update_inv_wear_mask() if(head) head.add_blood(src) - update_inv_head(0) + update_inv_head() if(glasses && prob(33)) glasses.add_blood(src) - update_inv_glasses(0) + update_inv_glasses() if("chest") //Easier to score a stun but lasts less time if(stat == CONSCIOUS && I.force && prob(I.force + 10)) @@ -211,10 +211,10 @@ emp_act if(bloody) if(wear_suit) wear_suit.add_blood(src) - update_inv_wear_suit(0) + update_inv_wear_suit() if(w_uniform) w_uniform.add_blood(src) - update_inv_w_uniform(0) + update_inv_w_uniform() if(Iforce > 10 || Iforce >= 5 && prob(33)) forcesay(hit_appends) //forcesay checks stat already @@ -455,4 +455,18 @@ emp_act else ..() - return +/mob/living/carbon/human/hitby(atom/movable/AM) + if(throw_speed >= EMBED_THROWSPEED_THRESHOLD) + if(istype(AM, /obj/item)) + var/obj/item/I = AM + if(can_embed(I)) + if(prob(I.embed_chance) && !(dna && (PIERCEIMMUNE in dna.species.specflags))) + throw_alert("embeddedobject") + var/obj/item/organ/limb/L = pick(organs) + L.embedded_objects |= I + I.add_blood(src)//it embedded itself in you, of course it's bloody! + I.loc = src + L.take_damage(I.w_class*I.embedded_impact_pain_multiplier) + visible_message("\the [I.name] embeds itself in [src]'s [L.getDisplayName()]!","\the [I.name] embeds itself in your [L.getDisplayName()]!") + return + return ..() diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index b0078a13719..664933c175b 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -45,7 +45,7 @@ return shoes && shoes.negates_gravity() /mob/living/carbon/human/Move(NewLoc, direct) - ..() + . = ..() if(dna) for(var/datum/mutation/human/HM in dna.mutations) HM.on_move(src, NewLoc) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index a86275539aa..30f90b8c51a 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -167,9 +167,9 @@ return if(H.equip_to_appropriate_slot(I)) if(hand) - update_inv_l_hand(0) + update_inv_l_hand() else - update_inv_r_hand(0) + update_inv_r_hand() else if(s_active && s_active.can_be_inserted(I,1)) //if storage active insert there s_active.handle_item_insertion(I) else if(istype(S, /obj/item/weapon/storage) && S.can_be_inserted(I,1)) //see if we have box in other hand @@ -250,7 +250,7 @@ wear_suit = null if(I.flags_inv & HIDEJUMPSUIT) update_inv_w_uniform() - update_inv_wear_suit(0) + update_inv_wear_suit() else if(I == w_uniform) if(r_store) unEquip(r_store, 1) //Again, makes sense for pockets to drop. @@ -262,45 +262,45 @@ unEquip(belt) w_uniform = null update_suit_sensors() - update_inv_w_uniform(0) + update_inv_w_uniform() else if(I == gloves) gloves = null - update_inv_gloves(0) + update_inv_gloves() else if(I == glasses) glasses = null - update_inv_glasses(0) + update_inv_glasses() else if(I == ears) ears = null - update_inv_ears(0) + update_inv_ears() else if(I == shoes) shoes = null - update_inv_shoes(0) + update_inv_shoes() else if(I == belt) belt = null - update_inv_belt(0) + update_inv_belt() else if(I == wear_mask) wear_mask = null if(I.flags & BLOCKHAIR) - update_hair(0) //rebuild hair + update_hair() //rebuild hair if(internal) if(internals) internals.icon_state = "internal0" internal = null sec_hud_set_ID() - update_inv_wear_mask(0) + update_inv_wear_mask() else if(I == wear_id) wear_id = null sec_hud_set_ID() - update_inv_wear_id(0) + update_inv_wear_id() else if(I == r_store) r_store = null - update_inv_pockets(0) + update_inv_pockets() else if(I == l_store) l_store = null - update_inv_pockets(0) + update_inv_pockets() else if(I == s_store) s_store = null - update_inv_s_store(0) + update_inv_s_store() //This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() //set redraw_mob to 0 if you don't wish the hud to be updated - if you're doing it manually in your own proc. diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 887f52a85d4..4d4876bb4db 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -578,17 +578,17 @@ if(H.overeatduration < 100) H << "You feel fit again!" H.disabilities &= ~FAT - H.update_inv_w_uniform(0) + H.update_inv_w_uniform() H.update_inv_wear_suit() else if(H.overeatduration > 500) H << "You suddenly feel blubbery!" H.disabilities |= FAT - H.update_inv_w_uniform(0) + H.update_inv_w_uniform() H.update_inv_wear_suit() // nutrition decrease and satiety - if (H.nutrition > 0 && H.stat != 2) + if (H.nutrition > 0 && H.stat != DEAD) var/hunger_rate = HUNGER_FACTOR if(H.satiety > 0) H.satiety-- @@ -1016,10 +1016,10 @@ if(get_dist(H, H) <= 1) //people with TK won't get smeared with blood if(H.wear_suit) H.wear_suit.add_blood(H) - H.update_inv_wear_suit(0) //updates mob overlays to show the new blood (no refresh) + H.update_inv_wear_suit() //updates mob overlays to show the new blood (no refresh) else if(H.w_uniform) H.w_uniform.add_blood(H) - H.update_inv_w_uniform(0) //updates mob overlays to show the new blood (no refresh) + H.update_inv_w_uniform() //updates mob overlays to show the new blood (no refresh) if (H.gloves) var/obj/item/clothing/gloves/G = H.gloves G.add_blood(H) @@ -1042,13 +1042,13 @@ if(bloody) //Apply blood if(H.wear_mask) H.wear_mask.add_blood(H) - H.update_inv_wear_mask(0) + H.update_inv_wear_mask() if(H.head) H.head.add_blood(H) - H.update_inv_head(0) + H.update_inv_head() if(H.glasses && prob(33)) H.glasses.add_blood(H) - H.update_inv_glasses(0) + H.update_inv_glasses() if("chest") //Easier to score a stun but lasts less time if(H.stat == CONSCIOUS && I.force && prob(I.force + 10)) @@ -1059,10 +1059,10 @@ if(bloody) if(H.wear_suit) H.wear_suit.add_blood(H) - H.update_inv_wear_suit(0) + H.update_inv_wear_suit() if(H.w_uniform) H.w_uniform.add_blood(H) - H.update_inv_w_uniform(0) + H.update_inv_w_uniform() if(Iforce > 10 || Iforce >= 5 && prob(33)) H.forcesay(hit_appends) //forcesay checks stat already. diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index aa276babfbd..8866d7fccf9 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -47,8 +47,7 @@ If you have any questions/constructive-comments/bugs-to-report Please contact me on #coderbus IRC. ~Carnie x //Carn can sometimes be hard to reach now. However IRC is still your best bet for getting help. */ - -//Human Overlays Indexes///////// +// Human Overlays Indexes ///////////////// #define SPECIES_LAYER 26 // mutantrace colors... these are on a seperate layer in order to prvent #define BODY_BEHIND_LAYER 25 #define BODY_LAYER 24 //underwear, undershirts, socks, eyes, lips(makeup) @@ -65,21 +64,11 @@ Please contact me on #coderbus IRC. ~Carnie x #define GLASSES_LAYER 13 #define BELT_LAYER 12 //Possible make this an overlay of somethign required to wear a belt? #define SUIT_STORE_LAYER 11 -#define BACK_LAYER 10 -#define HAIR_LAYER 9 //TODO: make part of head layer? -#define FACEMASK_LAYER 8 -#define HEAD_LAYER 7 -#define HANDCUFF_LAYER 6 -#define LEGCUFF_LAYER 5 -#define L_HAND_LAYER 4 -#define R_HAND_LAYER 3 //Having the two hands seperate seems rather silly, merge them together? It'll allow for code to be reused on mobs with arbitarily many hands -#define BODY_FRONT_LAYER 2 -#define FIRE_LAYER 1 //If you're on fire -#define TOTAL_LAYERS 26 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; -////////////////////////////////// +#define HAIR_LAYER 10 //TODO: make part of head layer? +#define BODY_FRONT_LAYER 9 -/mob/living/carbon/human - var/list/overlays_standing[TOTAL_LAYERS] +//KEEP THE TOTAL_LAYER DEFINE UPDATED ! +////////////////////////////////////////// /mob/living/carbon/human/proc/update_base_icon_state() //var/race = dna ? dna.mutantrace : null @@ -94,17 +83,6 @@ Please contact me on #coderbus IRC. ~Carnie x icon_state = "[base_icon_state]_s" -/mob/living/carbon/human/proc/apply_overlay(cache_index) - var/image/I = overlays_standing[cache_index] - - if(I) - overlays += I - -/mob/living/carbon/human/proc/remove_overlay(cache_index) - if(overlays_standing[cache_index]) - overlays -= overlays_standing[cache_index] - overlays_standing[cache_index] = null - //UPDATES OVERLAYS FROM OVERLAYS_STANDING //TODO: Remove all instances where this proc is called. It used to be the fastest way to swap between standing/lying. /mob/living/carbon/human/update_icons() @@ -174,12 +152,7 @@ Please contact me on #coderbus IRC. ~Carnie x dna.species.handle_body(src) /mob/living/carbon/human/update_fire() - - remove_overlay(FIRE_LAYER) - if(on_fire) - overlays_standing[FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing", "layer"=-FIRE_LAYER) - - apply_overlay(FIRE_LAYER) + ..("Standing") /mob/living/carbon/human/proc/update_augments() @@ -212,33 +185,28 @@ Please contact me on #coderbus IRC. ~Carnie x /* --------------------------------------- */ //For legacy support. /mob/living/carbon/human/regenerate_icons() - ..() - if(notransform) return - update_body() - update_hair() - update_inv_w_uniform() - update_inv_wear_id() - update_inv_gloves() - update_inv_glasses() - update_inv_ears() - update_inv_shoes() - update_inv_s_store() - update_inv_wear_mask() - update_inv_head() - update_inv_belt() - update_inv_back() - update_inv_wear_suit() - update_inv_r_hand() - update_inv_l_hand() - update_inv_handcuffed() - update_inv_legcuffed() - update_inv_pockets() - update_fire() - update_transform() - //Hud Stuff - update_hud() - // Mutantrace colors - update_mutcolor() + + if(!..()) + update_body() + update_hair() + update_inv_w_uniform() + update_inv_wear_id() + update_inv_gloves() + update_inv_glasses() + update_inv_ears() + update_inv_shoes() + update_inv_s_store() + update_inv_wear_mask() + update_inv_head() + update_inv_belt() + update_inv_back() + update_inv_wear_suit() + update_inv_pockets() + update_transform() + //Hud Stuff + update_hud() + // Mutantrace colors + update_mutcolor() /* --------------------------------------- */ //vvvvvv UPDATE_INV PROCS vvvvvv @@ -414,27 +382,12 @@ Please contact me on #coderbus IRC. ~Carnie x /mob/living/carbon/human/update_inv_head() - remove_overlay(HEAD_LAYER) - - if(head) + var/obj/item/H = ..() + if(H) if(client && hud_used && hud_used.hud_shown) if(hud_used.inventory_shown) //if the inventory is open ... - head.screen_loc = ui_head //TODO //...draw the item in the inventory screen - client.screen += head //Either way, add the item to the HUD - - var/image/standing - if(head.alternate_worn_icon) - standing = image("icon"=head.alternate_worn_icon, "icon_state"="[head.icon_state]", "layer"=-HEAD_LAYER) - if(!standing) - standing = image("icon"='icons/mob/head.dmi', "icon_state"="[head.icon_state]", "layer"=-HEAD_LAYER) - standing.color = head.color // For now, this is here solely for kitty ears, but everything should do this eventually - standing.alpha = head.alpha - - overlays_standing[HEAD_LAYER] = standing - - if(head.blood_DNA) - standing.overlays += image("icon"='icons/effects/blood.dmi', "icon_state"="helmetblood") - + H.screen_loc = ui_head //TODO //...draw the item in the inventory screen + client.screen += H //Either way, add the item to the HUD apply_overlay(HEAD_LAYER) @@ -491,6 +444,7 @@ Please contact me on #coderbus IRC. ~Carnie x apply_overlay(SUIT_LAYER) + /mob/living/carbon/human/update_inv_pockets() if(l_store) l_store.screen_loc = ui_storage1 //TODO @@ -503,125 +457,41 @@ Please contact me on #coderbus IRC. ~Carnie x /mob/living/carbon/human/update_inv_wear_mask() - remove_overlay(FACEMASK_LAYER) - - if(istype(wear_mask, /obj/item/clothing/mask)) + var/obj/item/clothing/mask/M = ..() + if(M) if(client && hud_used && hud_used.hud_shown) if(hud_used.inventory_shown) //if the inventory is open ... - wear_mask.screen_loc = ui_mask //TODO //...draw the item in the inventory screen - client.screen += wear_mask //Either way, add the item to the HUD - - var/image/standing - if(wear_mask.alternate_worn_icon) - standing = image("icon"=wear_mask.alternate_worn_icon, "icon_state"="[wear_mask.icon_state]", "layer"=-FACEMASK_LAYER) - if(!standing) - standing = image("icon"='icons/mob/mask.dmi', "icon_state"="[wear_mask.icon_state]", "layer"=-FACEMASK_LAYER) - - overlays_standing[FACEMASK_LAYER] = standing - - if(wear_mask.blood_DNA && !istype(wear_mask, /obj/item/clothing/mask/cigarette)) - standing.overlays += image("icon"='icons/effects/blood.dmi', "icon_state"="maskblood") - + M.screen_loc = ui_mask //TODO //...draw the item in the inventory screen + client.screen += M //Either way, add the item to the HUD update_mutant_bodyparts() - apply_overlay(FACEMASK_LAYER) + /mob/living/carbon/human/update_inv_back() - remove_overlay(BACK_LAYER) - - if(back) - back.screen_loc = ui_back + var/obj/item/B = ..() + if(B) + B.screen_loc = ui_back if(client && hud_used && hud_used.hud_shown) - client.screen += back - - var/image/standing - if(back.alternate_worn_icon) - standing = image("icon"=back.alternate_worn_icon, "icon_state"="[back.icon_state]", "layer"=-BACK_LAYER) - if(!standing) - standing = image("icon"='icons/mob/back.dmi', "icon_state"="[back.icon_state]", "layer"=-BACK_LAYER) - - overlays_standing[BACK_LAYER] = standing - + client.screen += B apply_overlay(BACK_LAYER) - - -/mob/living/carbon/human/update_hud() //TODO: do away with this if possible - if(client) - client.screen |= contents - if(hud_used) - hud_used.hidden_inventory_update() //Updates the screenloc of the items on the 'other' inventory bar - - /mob/living/carbon/human/update_inv_handcuffed() - remove_overlay(HANDCUFF_LAYER) - - if(handcuffed) - drop_r_hand() - drop_l_hand() - stop_pulling() //TODO: should be handled elsewhere - if(hud_used) //hud handcuff icons - var/obj/screen/inventory/R = hud_used.adding[3] - var/obj/screen/inventory/L = hud_used.adding[4] - R.overlays += image("icon"='icons/mob/screen_gen.dmi', "icon_state"="markus") - L.overlays += image("icon"='icons/mob/screen_gen.dmi', "icon_state"="gabrielle") - - overlays_standing[HANDCUFF_LAYER] = image("icon"='icons/mob/mob.dmi', "icon_state"="handcuff1", "layer"=-HANDCUFF_LAYER) - else - if(hud_used) - var/obj/screen/inventory/R = hud_used.adding[3] - var/obj/screen/inventory/L = hud_used.adding[4] - R.overlays = null - L.overlays = null - - apply_overlay(HANDCUFF_LAYER) - + if(..()) + overlays_standing[HANDCUFF_LAYER] = image("icon"='icons/mob/mob.dmi', "icon_state"="handcuff1", "layer"=-HANDCUFF_LAYER) + apply_overlay(HANDCUFF_LAYER) /mob/living/carbon/human/update_inv_legcuffed() remove_overlay(LEGCUFF_LAYER) - if(legcuffed) - overlays_standing[LEGCUFF_LAYER] = image("icon"='icons/mob/mob.dmi', "icon_state"="legcuff1", "layer"=-LEGCUFF_LAYER) - + overlays_standing[LEGCUFF_LAYER] = image("icon"='icons/mob/mob.dmi', "icon_state"="legcuff1", "layer"=-LEGCUFF_LAYER) apply_overlay(LEGCUFF_LAYER) +/mob/living/carbon/human/update_hud() //TODO: do away with this if possible + if(..()) + if(hud_used) + hud_used.hidden_inventory_update() //Updates the screenloc of the items on the 'other' inventory bar -/mob/living/carbon/human/update_inv_r_hand() - remove_overlay(R_HAND_LAYER) - if (handcuffed) - drop_r_hand() - return - if(r_hand) - r_hand.screen_loc = ui_rhand //TODO - if(client) - client.screen += r_hand - - var/t_state = r_hand.item_state - if(!t_state) t_state = r_hand.icon_state - - overlays_standing[R_HAND_LAYER] = image("icon" = r_hand.righthand_file, "icon_state"="[t_state]", "layer"=-R_HAND_LAYER) - - apply_overlay(R_HAND_LAYER) - - - -/mob/living/carbon/human/update_inv_l_hand() - remove_overlay(L_HAND_LAYER) - if (handcuffed) - drop_l_hand() - return - if(l_hand) - l_hand.screen_loc = ui_lhand //TODO - if(client) - client.screen += l_hand - - var/t_state = l_hand.item_state - if(!t_state) t_state = l_hand.icon_state - - overlays_standing[L_HAND_LAYER] = image("icon" = l_hand.lefthand_file, "icon_state"="[t_state]", "layer"=-L_HAND_LAYER) - - apply_overlay(L_HAND_LAYER) /mob/living/carbon/human/proc/wear_female_version(t_color, icon, layer, type) var/index = "[t_color]_s" @@ -652,15 +522,7 @@ Please contact me on #coderbus IRC. ~Carnie x #undef EARS_LAYER #undef SUIT_LAYER #undef GLASSES_LAYER -#undef FACEMASK_LAYER #undef BELT_LAYER #undef SUIT_STORE_LAYER -#undef BACK_LAYER #undef HAIR_LAYER -#undef HEAD_LAYER -#undef HANDCUFF_LAYER -#undef LEGCUFF_LAYER -#undef L_HAND_LAYER -#undef R_HAND_LAYER -#undef FIRE_LAYER #undef TOTAL_LAYERS diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 876f23fc37a..44ba92c73f2 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -25,22 +25,22 @@ if(I == head) head = null if(I.flags & BLOCKHAIR) - update_hair(0) - update_inv_head(0) + update_hair() + update_inv_head() else if(I == back) back = null - update_inv_back(0) + update_inv_back() else if(I == wear_mask) if(istype(src, /mob/living/carbon/human)) //If we don't do this hair won't be properly rebuilt. return wear_mask = null - update_inv_wear_mask(0) + update_inv_wear_mask() else if(I == handcuffed) handcuffed = null if(buckled && buckled.buckle_requires_restraints) buckled.unbuckle_mob() - update_inv_handcuffed(0) + update_inv_handcuffed() else if(I == legcuffed) legcuffed = null - update_inv_legcuffed(0) + update_inv_legcuffed() diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm index 3e47c990d9d..03e2f721a9c 100644 --- a/code/modules/mob/living/carbon/monkey/update_icons.dm +++ b/code/modules/mob/living/carbon/monkey/update_icons.dm @@ -1,31 +1,13 @@ -//Monkey Overlays Indexes//////// -#define M_FIRE_LAYER 7 -#define M_MASK_LAYER 6 -#define M_HEAD_LAYER 5 -#define M_BACK_LAYER 4 -#define M_HANDCUFF_LAYER 3 -#define M_L_HAND_LAYER 2 -#define M_R_HAND_LAYER 1 -#define M_TOTAL_LAYERS 7 -///////////////////////////////// - -/mob/living/carbon/monkey - var/list/overlays_standing[M_TOTAL_LAYERS] /mob/living/carbon/monkey/regenerate_icons() - ..() - update_inv_wear_mask(0) - update_inv_head(0) - update_inv_back(0) - update_inv_r_hand(0) - update_inv_l_hand(0) - update_inv_handcuffed(0) - update_fire() - update_icons() - update_transform() - //Hud Stuff - update_hud() - return + if(!..()) + update_inv_wear_mask() + update_inv_head() + update_inv_back() + update_icons() + update_transform() + //Hud Stuff + update_hud() /mob/living/carbon/monkey/update_icons() update_hud() @@ -35,138 +17,43 @@ overlays += I //////// -/mob/living/carbon/monkey/update_inv_wear_mask(update_icons=1) - if(wear_mask && istype(wear_mask, /obj/item/clothing/mask) ) - wear_mask.screen_loc = ui_monkey_mask +/mob/living/carbon/monkey/update_inv_wear_mask() + var/obj/item/clothing/mask/M = ..() + if(M) + M.screen_loc = ui_monkey_mask if(client && hud_used) - client.screen += wear_mask - overlays -= overlays_standing[M_MASK_LAYER] - var/image/standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]", "layer" = -M_MASK_LAYER) - if(!istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA ) - standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "maskblood") - overlays_standing[M_MASK_LAYER] = standing - overlays += overlays_standing[M_MASK_LAYER] - else - overlays -= overlays_standing[M_MASK_LAYER] - overlays_standing[M_MASK_LAYER] = null - if(update_icons) update_icons() + client.screen += M + apply_overlay(FACEMASK_LAYER) -/mob/living/carbon/monkey/update_inv_head(update_icons=1) - if(head) - head.screen_loc = ui_monkey_head +/mob/living/carbon/monkey/update_inv_head() + var/obj/item/H = ..() + if(H) + H.screen_loc = ui_monkey_head if(client && hud_used) - client.screen += head - overlays -= overlays_standing[M_HEAD_LAYER] - var/image/standing = image("icon" = 'icons/mob/head.dmi', "icon_state" = "[head.icon_state]", "layer" = -M_HEAD_LAYER) - overlays_standing[M_HEAD_LAYER] = standing - overlays += overlays_standing[M_HEAD_LAYER] - else - overlays -= overlays_standing[M_HEAD_LAYER] - overlays_standing[M_HEAD_LAYER] = null - if(update_icons) update_icons() + client.screen += H + apply_overlay(HEAD_LAYER) - -/mob/living/carbon/monkey/update_inv_r_hand(update_icons=1) - if (handcuffed) - drop_r_hand() - return - if(r_hand) - r_hand.screen_loc = ui_rhand +/mob/living/carbon/monkey/update_inv_back() + var/obj/item/B = ..() + if(B) + B.screen_loc = ui_monkey_back if(client && hud_used) - client.screen += r_hand - var/t_state = r_hand.item_state - if(!t_state) t_state = r_hand.icon_state - overlays -= overlays_standing[M_R_HAND_LAYER] - var/image/standing = image("icon" = r_hand.righthand_file, "icon_state" = t_state, "layer" = -M_R_HAND_LAYER) - standing.pixel_y = 2 - overlays_standing[M_R_HAND_LAYER] = standing - overlays += overlays_standing[M_R_HAND_LAYER] - else - overlays -= overlays_standing[M_R_HAND_LAYER] - overlays_standing[M_R_HAND_LAYER] = null - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_inv_l_hand(update_icons=1) - if (handcuffed) - drop_l_hand() - return - if(l_hand) - l_hand.screen_loc = ui_lhand - if(client && hud_used) - client.screen += l_hand - var/t_state = l_hand.item_state - if(!t_state) t_state = l_hand.icon_state - overlays -= overlays_standing[M_L_HAND_LAYER] - var/image/standing = image("icon" = l_hand.lefthand_file, "icon_state" = t_state, "layer" = -M_L_HAND_LAYER) - standing.pixel_y = 2 - overlays_standing[M_L_HAND_LAYER] = standing - overlays += overlays_standing[M_L_HAND_LAYER] - else - overlays -= overlays_standing[M_L_HAND_LAYER] - overlays_standing[M_L_HAND_LAYER] = null - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_inv_back(update_icons=1) - if(back) - back.screen_loc = ui_monkey_back - if(client && hud_used) - client.screen += back - overlays -= overlays_standing[M_BACK_LAYER] - overlays_standing[M_BACK_LAYER] = image("icon" = 'icons/mob/back.dmi', "icon_state" = "[back.icon_state]", "layer" = -M_BACK_LAYER) - overlays += overlays_standing[M_BACK_LAYER] - else - overlays -= overlays_standing[M_BACK_LAYER] - overlays_standing[M_BACK_LAYER] = null - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_inv_handcuffed(update_icons=1) - if(handcuffed) - drop_r_hand() - drop_l_hand() - stop_pulling() - if(hud_used) //hud handcuff icons - var/obj/screen/inventory/R = hud_used.adding[4] - var/obj/screen/inventory/L = hud_used.adding[5] - R.overlays += image("icon" = 'icons/mob/screen_gen.dmi', "icon_state" = "markus") - L.overlays += image("icon" = 'icons/mob/screen_gen.dmi', "icon_state" = "gabrielle") - overlays -= overlays_standing[M_HANDCUFF_LAYER] - overlays_standing[M_HANDCUFF_LAYER] = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "handcuff1", "layer" = -M_HANDCUFF_LAYER) - overlays += overlays_standing[M_HANDCUFF_LAYER] - else - if(hud_used) - var/obj/screen/inventory/R = hud_used.adding[4] - var/obj/screen/inventory/L = hud_used.adding[5] - R.overlays = null - L.overlays = null - overlays -= overlays_standing[M_HANDCUFF_LAYER] - overlays_standing[M_HANDCUFF_LAYER] = null - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_hud() - if(client) - client.screen |= contents + client.screen += B + apply_overlay(BACK_LAYER) /mob/living/carbon/monkey/update_fire() - overlays -= overlays_standing[M_FIRE_LAYER] - if(on_fire) - overlays_standing[M_FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing", "layer"= -M_FIRE_LAYER) - overlays += overlays_standing[M_FIRE_LAYER] - return - else - overlays_standing[M_FIRE_LAYER] = null + ..("Monkey_burning") +/mob/living/carbon/monkey/update_inv_handcuffed() + if(..()) + overlays_standing[HANDCUFF_LAYER] = image("icon"='icons/mob/mob.dmi', "icon_state"="handcuff1", "layer"=-HANDCUFF_LAYER) + apply_overlay(HANDCUFF_LAYER) -//Monkey Overlays Indexes//////// -#undef M_FIRE_LAYER -#undef M_MASK_LAYER -#undef M_BACK_LAYER -#undef M_HANDCUFF_LAYER -#undef M_L_HAND_LAYER -#undef M_R_HAND_LAYER -#undef M_TOTAL_LAYERS - +/mob/living/carbon/monkey/update_inv_legcuffed() + remove_overlay(LEGCUFF_LAYER) + if(legcuffed) + var/image/standing = image("icon"='icons/mob/mob.dmi', "icon_state"="legcuff1", "layer"=-LEGCUFF_LAYER) + standing.pixel_y = 8 + overlays_standing[LEGCUFF_LAYER] = standing + apply_overlay(LEGCUFF_LAYER) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 2b2c3470a04..95724c27f01 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -1,6 +1,18 @@ -//LOOK G-MA, I'VE JOINED CARBON PROCS THAT ARE IDENTICAL IN ALL CASES INTO ONE PROC, I'M BETTER THAN LIFE() -//I thought about mob/living but silicons and simple_animals don't want this just yet. -//Right now just handles lying down, but could handle other cases later. + + +//Carbon Overlays Indexes///////// +#define FACEMASK_LAYER 8 +#define HEAD_LAYER 7 +#define BACK_LAYER 6 +#define LEGCUFF_LAYER 5 +#define HANDCUFF_LAYER 4 +#define L_HAND_LAYER 3 +#define R_HAND_LAYER 2 //Having the two hands seperate seems rather silly, merge them together? It'll allow for code to be reused on mobs with arbitarily many hands +#define FIRE_LAYER 1 //If you're on fire +#define TOTAL_LAYERS 26 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; +////////////////////////////////// + + //IMPORTANT: Multiple animate() calls do not stack well, so try to do them all at once if you can. /mob/living/carbon/update_transform() var/matrix/ntransform = matrix(transform) //aka transform.Copy() @@ -27,4 +39,137 @@ if(changed) animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, dir = final_dir, easing = EASE_IN|EASE_OUT) - floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life(). \ No newline at end of file + floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life(). + + +/mob/living/carbon + var/list/overlays_standing[TOTAL_LAYERS] + +/mob/living/carbon/proc/apply_overlay(cache_index) + var/image/I = overlays_standing[cache_index] + if(I) + overlays += I + +/mob/living/carbon/proc/remove_overlay(cache_index) + if(overlays_standing[cache_index]) + overlays -= overlays_standing[cache_index] + overlays_standing[cache_index] = null + +/mob/living/carbon/update_inv_r_hand() + remove_overlay(R_HAND_LAYER) + if (handcuffed) + drop_r_hand() + return + if(r_hand) + r_hand.screen_loc = ui_rhand + if(client && hud_used) + client.screen += r_hand + var/t_state = r_hand.item_state + if(!t_state) + t_state = r_hand.icon_state + overlays_standing[R_HAND_LAYER] = image("icon" = r_hand.righthand_file, "icon_state"="[t_state]", "layer"=-R_HAND_LAYER) + + apply_overlay(R_HAND_LAYER) + +/mob/living/carbon/update_inv_l_hand() + remove_overlay(L_HAND_LAYER) + if (handcuffed) + drop_l_hand() + return + if(l_hand) + l_hand.screen_loc = ui_lhand + if(client && hud_used) + client.screen += l_hand + var/t_state = l_hand.item_state + if(!t_state) + t_state = l_hand.icon_state + overlays_standing[L_HAND_LAYER] = image("icon" = l_hand.lefthand_file, "icon_state"="[t_state]", "layer"=-L_HAND_LAYER) + + apply_overlay(L_HAND_LAYER) + +/mob/living/carbon/update_fire(var/fire_icon = "Generic_mob_burning") + remove_overlay(FIRE_LAYER) + if(on_fire) + overlays_standing[FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"= fire_icon, "layer"=-FIRE_LAYER) + + apply_overlay(FIRE_LAYER) + +/mob/living/carbon/update_hud() + if(client) + client.screen |= contents + return 1 + +/mob/living/carbon/regenerate_icons() + if(notransform) + return 1 + update_inv_r_hand() + update_inv_l_hand() + update_inv_handcuffed() + update_inv_legcuffed() + update_fire() + +/mob/living/carbon/update_inv_wear_mask() + remove_overlay(FACEMASK_LAYER) + if(istype(wear_mask, /obj/item/clothing/mask)) + var/image/standing + if(wear_mask.alternate_worn_icon) + standing = image("icon"=wear_mask.alternate_worn_icon, "icon_state"="[wear_mask.icon_state]", "layer"=-FACEMASK_LAYER) + if(!standing) + standing = image("icon"='icons/mob/mask.dmi', "icon_state"="[wear_mask.icon_state]", "layer"=-FACEMASK_LAYER) + + overlays_standing[FACEMASK_LAYER] = standing + + if(wear_mask.blood_DNA && (wear_mask.body_parts_covered & HEAD)) + standing.overlays += image("icon"='icons/effects/blood.dmi', "icon_state"="maskblood") + return wear_mask + +/mob/living/carbon/human/update_inv_back() + remove_overlay(BACK_LAYER) + if(back) + var/image/standing + if(back.alternate_worn_icon) + standing = image("icon"=back.alternate_worn_icon, "icon_state"="[back.icon_state]", "layer"=-BACK_LAYER) + if(!standing) + standing = image("icon"='icons/mob/back.dmi', "icon_state"="[back.icon_state]", "layer"=-BACK_LAYER) + + overlays_standing[BACK_LAYER] = standing + return back + + +/mob/living/carbon/human/update_inv_head() + remove_overlay(HEAD_LAYER) + if(head) + var/image/standing + if(head.alternate_worn_icon) + standing = image("icon"=head.alternate_worn_icon, "icon_state"="[head.icon_state]", "layer"=-HEAD_LAYER) + if(!standing) + standing = image("icon"='icons/mob/head.dmi', "icon_state"="[head.icon_state]", "layer"=-HEAD_LAYER) + standing.color = head.color // For now, this is here solely for kitty ears, but everything should do this eventually + standing.alpha = head.alpha + + overlays_standing[HEAD_LAYER] = standing + + if(head.blood_DNA) + standing.overlays += image("icon"='icons/effects/blood.dmi', "icon_state"="helmetblood") + return head + +/mob/living/carbon/update_inv_handcuffed() + remove_overlay(HANDCUFF_LAYER) + if(handcuffed) + drop_r_hand() + drop_l_hand() + stop_pulling() //TODO: should be handled elsewhere + if(hud_used) //hud handcuff icons + var/obj/screen/inventory/R = hud_used.r_hand_hud_object + var/obj/screen/inventory/L = hud_used.l_hand_hud_object + R.overlays += image("icon"='icons/mob/screen_gen.dmi', "icon_state"="markus") + L.overlays += image("icon"='icons/mob/screen_gen.dmi', "icon_state"="gabrielle") + return 1 + else + if(hud_used) + var/obj/screen/inventory/R = hud_used.r_hand_hud_object + var/obj/screen/inventory/L = hud_used.l_hand_hud_object + R.overlays = null + L.overlays = null + + diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index b137657b148..bbcdc72c6aa 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -52,13 +52,14 @@ Sorry Giacom. Please don't be mad :( //Generic Bump(). Override MobBump() and ObjBump() instead of this. /mob/living/Bump(atom/A, yes) + if(..()) //we are thrown onto something + return if (buckled || !yes || now_pushing) return if(ismob(A)) var/mob/M = A if(MobBump(M)) return - ..() if(isobj(A)) var/obj/O = A if(ObjBump(O)) @@ -68,6 +69,10 @@ Sorry Giacom. Please don't be mad :( if(PushAM(AM)) return +/mob/living/Bumped(atom/movable/AM) + ..() + last_bumped = world.time + //Called when we bump onto a mob /mob/living/proc/MobBump(mob/M) //Even if we don't push/swap places, we "touched" them, so spread fire @@ -376,7 +381,7 @@ Sorry Giacom. Please don't be mad :( return 0 -/mob/living/proc/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0) +/mob/living/proc/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0, safety = 0) return 0 //only carbon liveforms have this proc /mob/living/emp_act(severity) @@ -687,7 +692,7 @@ Sorry Giacom. Please don't be mad :( floating = 0 //called when the mob receives a bright flash -/mob/living/proc/flash_eyes(intensity = 1, override_blindness_check = 0) +/mob/living/proc/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0) if(check_eye_prot() < intensity && (override_blindness_check || !(disabilities & BLIND))) flick("e_flash", flash) return 1 diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index c620bda6767..43e2c2735bf 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -44,7 +44,13 @@ else return 0 -/mob/living/hitby(atom/movable/AM,mob/thrower)//Standardization and logging -Sieve +/mob/living/throw_impact(atom/hit_atom) + . = ..() + if(hit_atom.density) + Weaken(1) + take_organ_damage(10) + +/mob/living/hitby(atom/movable/AM) if(istype(AM, /obj/item)) var/obj/item/I = AM var/zone = ran_zone("chest", 65)//Hits a random part of the body, geared towards the chest @@ -71,9 +77,11 @@ "[src] has been hit by [I].") var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].",I.armour_penetration) apply_damage(I.throwforce, dtype, zone, armor, I) - - if(thrower) - add_logs(thrower, src, "hit", I) + if(I.thrownby) + add_logs(I.thrownby, src, "hit", I) + else + playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1) + return ..() /mob/living/mech_melee_attack(obj/mecha/M) if(M.occupant.a_intent == "harm") diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 096da4e0b0d..56c0426c5bc 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -47,4 +47,6 @@ var/smoke_delay = 0 //used to prevent spam with smoke reagent reaction on mob. - var/list/say_log = list() //a log of what we've said, plain text, no spans or junk, essentially just each individual "message" \ No newline at end of file + var/list/say_log = list() //a log of what we've said, plain text, no spans or junk, essentially just each individual "message" + + var/last_bumped = 0 diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index cac929c3681..3f601c0810f 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -823,3 +823,6 @@ var/list/ai_list = list() loc = card//Throw AI into the card. src << "You have been downloaded to a mobile storage device. Remote device connection severed." user << "Transfer successful: [name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory." + +/mob/living/silicon/ai/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0) + return // no eyes, no flashing \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 858e4f42e97..ecb7eca0247 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -48,15 +48,19 @@ var/obj/item/radio/integrated/signal/sradio // AI's signaller -/mob/living/silicon/pai/New(var/obj/item/device/paicard) +/mob/living/silicon/pai/New(var/obj/item/device/paicard/P) make_laws() canmove = 0 - src.loc = paicard - card = paicard + if(!istype(P)) //when manually spawning a pai, we create a card to put it into. + var/newcardloc = P + P = new /obj/item/device/paicard(newcardloc) + P.setPersonality(src) + loc = P + card = P sradio = new(src) if(card) if(!card.radio) - card.radio = new /obj/item/device/radio(src.card) + card.radio = new /obj/item/device/radio(card) radio = card.radio //PDA diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index bb3a9dce86a..fed748e1a3d 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -192,9 +192,9 @@ return /mob/living/silicon/robot/update_fire() - overlays -= image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing") + overlays -= image("icon"='icons/mob/OnFire.dmi', "icon_state"="Generic_mob_burning") if(on_fire) - overlays += image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing") + overlays += image("icon"='icons/mob/OnFire.dmi', "icon_state"="Generic_mob_burning") /mob/living/silicon/robot/fire_act() if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 0fca94e2b05..b0e916f11a9 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -876,16 +876,16 @@ if(cleaned_human.lying) if(cleaned_human.head) cleaned_human.head.clean_blood() - cleaned_human.update_inv_head(0) + cleaned_human.update_inv_head() if(cleaned_human.wear_suit) cleaned_human.wear_suit.clean_blood() - cleaned_human.update_inv_wear_suit(0) + cleaned_human.update_inv_wear_suit() else if(cleaned_human.w_uniform) cleaned_human.w_uniform.clean_blood() - cleaned_human.update_inv_w_uniform(0) + cleaned_human.update_inv_w_uniform() if(cleaned_human.shoes) cleaned_human.shoes.clean_blood() - cleaned_human.update_inv_shoes(0) + cleaned_human.update_inv_shoes() cleaned_human.clean_blood() cleaned_human << "[src] cleans your face!" return diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index c3ec3215993..92749a073a2 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -422,12 +422,13 @@ /mob/living/silicon/setEarDamage() return -/mob/living/silicon/check_eye_prot() - return 2 - /mob/living/silicon/proc/GetPhoto() if (aicamera) return aicamera.selectpicture(aicamera) /mob/living/silicon/grabbedby(mob/living/user) - return \ No newline at end of file + return + +/mob/living/silicon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0) + if(affect_silicon) + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index af1520d2d42..4b349ee1ddb 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -173,8 +173,9 @@ if(cleared) src << "--- [class] alarm in [A.name] has been cleared." -/mob/living/simple_animal/drone/check_eye_prot() - return 2 - /mob/living/simple_animal/drone/handle_temperature_damage() return + +/mob/living/simple_animal/drone/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0) + if(affect_silicon) + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm index faf63c739c4..a739daac976 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm @@ -125,9 +125,9 @@ return if(equip_to_appropriate_slot(I)) if(hand) - update_inv_l_hand(0) + update_inv_l_hand() else - update_inv_r_hand(0) + update_inv_r_hand() else if(s_active && s_active.can_be_inserted(I,1)) //if storage active insert there s_active.handle_item_insertion(I) else if(istype(S, /obj/item/weapon/storage) && S.can_be_inserted(I,1)) //see if we have box in other hand diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 9d5fc402615..8ff2d451a10 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -198,10 +198,19 @@ /obj/effect/proc_holder/spell/targeted/night_vision/cast(list/targets) for(var/mob/living/target in targets) - if(target.see_invisible == SEE_INVISIBLE_LIVING) - target.see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING - name = "Toggle Nightvision \[ON\]" + if(istype(target, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = target + if(H.dna.species.invis_sight == SEE_INVISIBLE_LIVING) + H.dna.species.invis_sight = SEE_INVISIBLE_OBSERVER_NOLIGHTING + name = "Toggle Nightvision \[ON]" + else + H.dna.species.invis_sight = SEE_INVISIBLE_LIVING + name = "Toggle Nightvision \[OFF]" + else - target.see_invisible = SEE_INVISIBLE_LIVING - name = "Toggle Nightvision \[OFF\]" - return \ No newline at end of file + if(target.see_invisible == SEE_INVISIBLE_LIVING) + target.see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING + name = "Toggle Nightvision \[ON]" + else + target.see_invisible = SEE_INVISIBLE_LIVING + name = "Toggle Nightvision \[OFF]" diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 6e9e8ccd996..b2415704445 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -421,12 +421,12 @@ var/list/slot_equipment_priority = list( \ var/obj/item/W = l_hand if (W) W.attack_self(src) - update_inv_l_hand(0) + update_inv_l_hand() else var/obj/item/W = r_hand if (W) W.attack_self(src) - update_inv_r_hand(0) + update_inv_r_hand() return /* @@ -963,4 +963,8 @@ var/list/slot_equipment_priority = list( \ spell.action.background_icon_state = spell.action_background_icon_state if(isliving(src)) spell.action.Grant(src) - return \ No newline at end of file + return + +//override to avoid rotating pixel_xy on mobs +/mob/shuttleRotate(rotation) + dir = angle2dir(rotation+dir2angle(dir)) \ No newline at end of file diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index c5f8a272d8b..d65438f65e7 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -1,18 +1,16 @@ /mob/CanPass(atom/movable/mover, turf/target, height=0) - if(height==0) return 1 - - if(istype(mover) && mover.checkpass(PASSMOB)) + if(height==0) return 1 - if(istype(mover, /obj/item/projectile)) + if(istype(mover, /obj/item/projectile) || mover.throwing) return (!density || lying) + if(mover.checkpass(PASSMOB)) + return 1 if(ismob(mover)) var/mob/moving_mob = mover if ((other_mobs && moving_mob.other_mobs)) return 1 - return (!mover.density || !density || lying) - else - return (!mover.density || !density || lying) - return + return (!mover.density || !density || lying) + /client/Northeast() diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 009ecd8ab0f..0b5158f6085 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -82,6 +82,13 @@ if(!client) return 0 + //Determines Relevent Population Cap + var/relevant_cap + if(config.hard_popcap && config.extreme_popcap) + relevant_cap = min(config.hard_popcap, config.extreme_popcap) + else + relevant_cap = max(config.hard_popcap, config.extreme_popcap) + if(href_list["show_preferences"]) client.prefs.ShowChoices(src) return 1 @@ -126,13 +133,22 @@ if(!ticker || ticker.current_state != GAME_STATE_PLAYING) usr << "The round is either not ready, or has already finished..." return - var/relevant_cap - if(config.hard_popcap && config.extreme_popcap) - relevant_cap = min(config.hard_popcap, config.extreme_popcap) - else - relevant_cap = max(config.hard_popcap, config.extreme_popcap) - if(relevant_cap && living_player_count() >= relevant_cap && !(ckey(key) in admin_datums)) + + if(href_list["late_join"] == "override") + LateChoices() + return + + if(ticker.queued_players.len || (relevant_cap && living_player_count() >= relevant_cap && !(ckey(key) in admin_datums))) usr << "[config.hard_popcap_message]" + + var/queue_position = ticker.queued_players.Find(usr) + if(queue_position == 1) + usr << "You are next in line to join the game. You will be notified when a slot opens up." + else if(queue_position) + usr << "There are [queue_position-1] players in front of you in the queue to join the game." + else + ticker.queued_players += usr + usr << "You have been added to the queue to join the game. Your position in queue is [ticker.queued_players.len]." return LateChoices() @@ -145,6 +161,11 @@ usr << "There is an administrative lock on entering the game!" return + if(ticker.queued_players.len && !(ckey(key) in admin_datums)) + if((living_player_count() >= relevant_cap) || (src != ticker.queued_players[1])) + usr << "Server is full." + return + AttemptLateSpawn(href_list["SelectedJob"]) return @@ -234,6 +255,10 @@ src << alert("[rank] is not available. Please try another.") return 0 + //Remove the player from the join queue if he was in one and reset the timer + ticker.queued_players -= src + ticker.queue_delay = 4 + SSjob.AssignRole(src, rank, 1) var/mob/living/carbon/human/character = create_character() //creates the human and transfers vars and mind diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 5c63a5cc097..be09fdadd38 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -36,6 +36,10 @@ var/const/GRAV_NEEDS_WRENCH = 3 ..() icon_state = "[get_status()]_[sprite_number]" +//prevents shuttles attempting to rotate this since it messes up sprites +/obj/machinery/gravity_generator/shuttleRotate() + return + /obj/machinery/gravity_generator/proc/get_status() return "off" diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index fb0a69a9be2..08278a00ea7 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -43,7 +43,7 @@ /obj/machinery/field/containment/Crossed(obj/mover) if(istype(mover, /obj/machinery) || istype(mover, /obj/structure) || istype(mover, /obj/mecha)) - bump(mover) + bump_field(mover) /obj/machinery/field/containment/proc/set_master(master1,master2) if(!master1 || !master2) @@ -77,7 +77,7 @@ if((istype(mover, /obj/machinery) && !istype(mover, /obj/singularity)) || \ istype(mover, /obj/structure) || \ istype(mover, /obj/mecha)) - bump(mover) + bump_field(mover) return 0 return ..() @@ -106,13 +106,13 @@ "You hear an electrical crack.") user.updatehealth() - bump(user) + bump_field(user) spawn(5) hasShocked = 0 return -/obj/machinery/field/proc/bump(atom/movable/AM as mob|obj) +/obj/machinery/field/proc/bump_field(atom/movable/AM as mob|obj) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, AM.loc) s.start() diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 9c9f3c0f948..550567bca53 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -356,6 +356,6 @@ field_generator power level display if(fields.len) ..() -/obj/machinery/field/generator/bump(atom/movable/AM as mob|obj) +/obj/machinery/field/generator/bump_field(atom/movable/AM as mob|obj) if(fields.len) ..() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 480fb8380b2..ab650dfa411 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -223,33 +223,36 @@ /obj/item/solar_assembly/attackby(obj/item/weapon/W, mob/user, params) - if(!anchored && isturf(loc)) - if(istype(W, /obj/item/weapon/wrench)) - anchored = 1 + if(istype(W, /obj/item/weapon/wrench) && isturf(loc)) + if(isinspace()) + user << "You can't secure [src] here." + return + anchored = !anchored + if(anchored) user.visible_message("[user] wrenches the solar assembly into place.", "You wrench the solar assembly into place.") playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - return 1 - else - if(istype(W, /obj/item/weapon/wrench)) - anchored = 0 + else user.visible_message("[user] unwrenches the solar assembly from its place.", "You unwrench the solar assembly from its place.") playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - return 1 + return 1 - if(istype(W, /obj/item/stack/sheet/glass) || istype(W, /obj/item/stack/sheet/rglass)) - var/obj/item/stack/sheet/S = W - if(S.use(2)) - glass_type = W.type - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - user.visible_message("[user] places the glass on the solar assembly.", "You place the glass on the solar assembly.") - if(tracker) - new /obj/machinery/power/tracker(get_turf(src), src) - else - new /obj/machinery/power/solar(get_turf(src), src) + if(istype(W, /obj/item/stack/sheet/glass) || istype(W, /obj/item/stack/sheet/rglass)) + if(!anchored) + user << "You need to secure the assembly before you can add glass." + return + var/obj/item/stack/sheet/S = W + if(S.use(2)) + glass_type = W.type + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + user.visible_message("[user] places the glass on the solar assembly.", "You place the glass on the solar assembly.") + if(tracker) + new /obj/machinery/power/tracker(get_turf(src), src) else - user << "You need two sheets of glass to put them into a solar panel!" - return - return 1 + new /obj/machinery/power/solar(get_turf(src), src) + else + user << "You need two sheets of glass to put them into a solar panel!" + return + return 1 if(!tracker) if(istype(W, /obj/item/weapon/tracker_electronics)) diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 586102cbe70..26b4bc77e99 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -174,12 +174,11 @@ /obj/item/ammo_casing/shotgun/dart/bioterror/New() ..() - reagents.add_reagent("neurotoxin", 5) - reagents.add_reagent("morphine", 5) - reagents.add_reagent("spore", 5) - reagents.add_reagent("mutetoxin", 5) //;HELP OPS IN MAINT - reagents.add_reagent("initropidril", 5) - reagents.add_reagent("sodium_thiopental", 5) + reagents.add_reagent("neurotoxin", 6) + reagents.add_reagent("spore", 6) + reagents.add_reagent("mutetoxin", 6) //;HELP OPS IN MAINT + reagents.add_reagent("coniine", 6) + reagents.add_reagent("sodium_thiopental", 6) /obj/item/ammo_casing/a762 desc = "A 7.62mm bullet casing." diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index ae4f0f5c7b4..0a89745dfcf 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -5,7 +5,6 @@ projectile_type = /obj/item/projectile/energy var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot. var/select_name = "energy" - var/mod_name = null fire_sound = 'sound/weapons/Laser.ogg' /obj/item/ammo_casing/energy/laser @@ -87,13 +86,11 @@ /obj/item/ammo_casing/energy/flora/yield projectile_type = /obj/item/projectile/energy/florayield - select_name = "increase yield" - mod_name = "yield" + select_name = "yield" /obj/item/ammo_casing/energy/flora/mut projectile_type = /obj/item/projectile/energy/floramut - select_name = "induce mutations" - mod_name = "mut" + select_name = "mutation" /obj/item/ammo_casing/energy/temp projectile_type = /obj/item/projectile/temp diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index e692bd7bb97..cc5bd988992 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -49,6 +49,11 @@ var/list/upgrades = list() + var/ammo_x_offset = 0 //used for positioning ammo count overlay on sprite + var/ammo_y_offset = 0 + var/flight_x_offset = 0 + var/flight_y_offset = 0 + /obj/item/weapon/gun/New() ..() if(pin) @@ -224,9 +229,9 @@ semicd = 0 if(user.hand) - user.update_inv_l_hand(0) + user.update_inv_l_hand() else - user.update_inv_r_hand(0) + user.update_inv_r_hand() feedback_add_details("gun_fired","[src.name]") /obj/item/weapon/gun/attack(mob/M as mob, mob/user) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 15115001e06..e1a143f2f5d 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -10,6 +10,7 @@ var/list/ammo_type = list(/obj/item/ammo_casing/energy) var/select = 1 //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next. var/can_charge = 1 //Can it be charged in a recharger? + ammo_x_offset = 2 /obj/item/weapon/gun/energy/emp_act(severity) power_supply.use(round(power_supply.charge / severity)) @@ -72,25 +73,31 @@ return /obj/item/weapon/gun/energy/update_icon() - var/ratio = power_supply.charge / power_supply.maxcharge - ratio = min(Ceiling(ratio*4) * 25, 100) - var/obj/item/ammo_casing/energy/shot = ammo_type[select] - if(power_supply.charge < shot.e_cost) - ratio = 0 //so the icon changes to empty if the charge isn't zero but not enough for a shot. - switch(modifystate) - if (0) - icon_state = "[initial(icon_state)][ratio]" - if (1) - icon_state = "[initial(icon_state)][shot.mod_name][ratio]" - if (2) - icon_state = "[initial(icon_state)][shot.select_name][ratio]" overlays.Cut() + var/ratio = Ceiling((power_supply.charge / power_supply.maxcharge) * 4) + var/obj/item/ammo_casing/energy/shot = ammo_type[select] + var/iconState = "[icon_state]_charge" + var/itemState = null + if(!initial(item_state)) + itemState = icon_state + if (modifystate) + overlays += "[icon_state]_[shot.select_name]" + iconState += "_[shot.select_name]" + if(itemState) + itemState += "[shot.select_name]" + if(power_supply.charge < shot.e_cost) + overlays += "[icon_state]_empty" + ratio = 0 + for(var/i = ratio, i >= 1, i--) + overlays += image(icon = icon, icon_state = iconState, pixel_x = ammo_x_offset * (i -1)) if(F) + var/iconF = "flight" if(F.on) - overlays += "flight-[initial(icon_state)]-on" - else - overlays += "flight-[initial(icon_state)]" - return + iconF = "flight_on" + overlays += image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset) + if(itemState) + itemState += "[ratio]" + item_state = itemState /obj/item/weapon/gun/energy/ui_action_click() toggle_gunlight() diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index b04057fb82b..a3312bbe75e 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -7,6 +7,7 @@ materials = list(MAT_METAL=2000) origin_tech = "combat=3;magnets=2" ammo_type = list(/obj/item/ammo_casing/energy/lasergun) + ammo_x_offset = 1 /obj/item/weapon/gun/energy/laser/practice @@ -20,6 +21,7 @@ name ="retro laser" icon_state = "retro" desc = "An older model of the basic lasergun, no longer used by Nanotrasen's private security or military forces. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws." + ammo_x_offset = 3 /obj/item/weapon/gun/energy/laser/captain @@ -29,6 +31,7 @@ force = 10 origin_tech = null var/charge_tick = 0 + ammo_x_offset = 3 /obj/item/weapon/gun/energy/laser/captain/New() ..() @@ -87,6 +90,7 @@ origin_tech = "combat=4;materials=3;powerstorage=3" ammo_type = list(/obj/item/ammo_casing/energy/laser/heavy) pin = null + ammo_x_offset = 3 /obj/item/weapon/gun/energy/xray name = "xray laser gun" @@ -96,6 +100,7 @@ origin_tech = "combat=5;materials=3;magnets=2;syndicate=2" ammo_type = list(/obj/item/ammo_casing/energy/xray) pin = null + ammo_x_offset = 3 ////////Laser Tag//////////////////// @@ -109,6 +114,7 @@ needs_permit = 0 var/charge_tick = 0 pin = /obj/item/device/firing_pin/tag/blue + ammo_x_offset = 2 /obj/item/weapon/gun/energy/laser/bluetag/New() ..() @@ -140,6 +146,7 @@ needs_permit = 0 var/charge_tick = 0 pin = /obj/item/device/firing_pin/tag/red + ammo_x_offset = 2 /obj/item/weapon/gun/energy/laser/redtag/New() ..() diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 90e201e2a61..e11357de9a7 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -7,6 +7,9 @@ origin_tech = "combat=3;magnets=2" modifystate = 2 can_flashlight = 1 + ammo_x_offset = 3 + flight_x_offset = 15 + flight_y_offset = 10 /obj/item/weapon/gun/energy/gun/attack_self(mob/living/user) select_fire(user) @@ -15,7 +18,6 @@ /obj/item/weapon/gun/energy/gun/hos desc = "This is a expensive, modern recreation of a antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time." icon_state = "hoslaser" - item_state = null force = 10 ammo_type = list(/obj/item/ammo_casing/energy/electrode/hos, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/disabler) @@ -23,22 +25,36 @@ name = "DRAGnet" desc = "The \"Dynamic Rapid-Apprehension of the Guilty\" net is a revolution in law enforcement technology." icon_state = "dragnet" - item_state = null origin_tech = "combat=3;magnets=3;materials=4; bluespace=4" ammo_type = list(/obj/item/ammo_casing/energy/net, /obj/item/ammo_casing/energy/trap) can_flashlight = 0 + ammo_x_offset = 1 + +/obj/item/weapon/gun/energy/gun/turret + name = "hybrid turret gun" + desc = "A heavy hybrid energy cannon with two settings: Stun and kill." + icon_state = "turretlaser" + item_state = "turretlaser" + slot_flags = null + w_class = 5 + ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser) + heavy_weapon = 1 + can_flashlight = 0 + trigger_guard = 0 + ammo_x_offset = 2 /obj/item/weapon/gun/energy/gun/nuclear name = "advanced energy gun" desc = "An energy gun with an experimental miniaturized nuclear reactor that automatically charges the internal power cell." icon_state = "nucgun" + item_state = "nucgun" origin_tech = "combat=3;materials=5;powerstorage=3" - var/lightfail = 0 + var/fail_state = 0 var/charge_tick = 0 - modifystate = 0 can_flashlight = 0 pin = null can_charge = 0 + ammo_x_offset = 1 /obj/item/weapon/gun/energy/gun/nuclear/New() ..() @@ -63,7 +79,7 @@ /obj/item/weapon/gun/energy/gun/nuclear/proc/failcheck() - lightfail = 0 + fail_state = 0 if (prob(src.reliability)) return 1 //No failure if (prob(src.reliability)) for (var/mob/living/M in range(0,src)) //Only a minor failure, enjoy your radiation if you're in the same tile or carrying it @@ -72,68 +88,22 @@ else M << "You feel a warm sensation." M.irradiate(rand(3,120)) - lightfail = 1 + fail_state = 1 else for (var/mob/living/M in range(rand(1,4),src)) //Big failure, TIME FOR RADIATION BITCHES if (src in M.contents) M << "Your gun's reactor overloads!" M << "You feel a wave of heat wash over you." M.irradiate(300) - crit_fail = 1 //break the gun so it stops recharging + fail_state = 2 //break the gun so it stops recharging SSobj.processing.Remove(src) update_icon() return 0 - -/obj/item/weapon/gun/energy/gun/nuclear/proc/update_charge() - if (crit_fail) - overlays += "nucgun-whee" - return - var/ratio = power_supply.charge / power_supply.maxcharge - ratio = Ceiling(ratio*4) * 25 - overlays += "nucgun-[ratio]" - - -/obj/item/weapon/gun/energy/gun/nuclear/proc/update_reactor() - if(crit_fail) - overlays += "nucgun-crit" - return - if(lightfail) - overlays += "nucgun-medium" - else if ((power_supply.charge/power_supply.maxcharge) <= 0.5) - overlays += "nucgun-light" - else - overlays += "nucgun-clean" - - -/obj/item/weapon/gun/energy/gun/nuclear/proc/update_mode() - if (select == 1) - overlays += "nucgun-stun" - else if (select == 2) - overlays += "nucgun-kill" - - /obj/item/weapon/gun/energy/gun/nuclear/emp_act(severity) ..() reliability -= round(15/severity) - /obj/item/weapon/gun/energy/gun/nuclear/update_icon() - overlays.Cut() - update_charge() - update_reactor() - update_mode() - -/obj/item/weapon/gun/energy/gun/turret - name = "hybrid turret gun" - desc = "A heavy hybrid energy cannon with two settings: Stun and kill." - icon_state = "turretlaser" - slot_flags = null - w_class = 5 - ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser) - heavy_weapon = 1 - can_flashlight = 0 - trigger_guard = 0 - -/obj/item/weapon/gun/energy/gun/turret/update_icon() - icon_state = initial(icon_state) \ No newline at end of file + ..() + overlays += "[icon_state]_fail_[fail_state]" diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 734b408bfba..18706908c93 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -28,6 +28,8 @@ item_state = "pulse" cell_type = "/obj/item/weapon/stock_parts/cell/pulse/carbine" can_flashlight = 1 + flight_x_offset = 18 + flight_y_offset = 12 /obj/item/weapon/gun/energy/pulse/carbine/loyalpin pin = /obj/item/device/firing_pin/implant/loyalty diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 78d77697bab..45e936f8867 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -9,7 +9,9 @@ flags = CONDUCT slot_flags = SLOT_BACK ammo_type = list(/obj/item/ammo_casing/energy/ion) - + ammo_x_offset = 3 + flight_x_offset = 17 + flight_y_offset = 9 /obj/item/weapon/gun/energy/ionrifle/emp_act(severity) return @@ -18,11 +20,13 @@ name = "ion carbine" desc = "The MK.II Prototype Ion Projector is a lightweight carbine version of the larger ion rifle, built to be ergonomic and efficient." icon_state = "ioncarbine" - item_state = "ioncarbine" origin_tech = "combat=4;magnets=4;materials=4" w_class = 3 slot_flags = SLOT_BELT pin = null + ammo_x_offset = 2 + flight_x_offset = 18 + flight_y_offset = 11 /obj/item/weapon/gun/energy/decloner name = "biological demolecularisor" @@ -31,6 +35,13 @@ origin_tech = "combat=5;materials=4;powerstorage=3" ammo_type = list(/obj/item/ammo_casing/energy/declone) pin = null + ammo_x_offset = 1 + +/obj/item/weapon/gun/energy/decloner/update_icon() + ..() + var/obj/item/ammo_casing/energy/shot = ammo_type[select] + if(power_supply.charge > shot.e_cost) + overlays += "decloner_spin" /obj/item/weapon/gun/energy/floragun name = "floral somatoray" @@ -41,7 +52,6 @@ origin_tech = "materials=2;biotech=3;powerstorage=3" modifystate = 1 var/charge_tick = 0 - var/mode = 0 //0 = mutate, 1 = yield boost /obj/item/weapon/gun/energy/floragun/New() ..() @@ -115,6 +125,7 @@ desc = "A prototype weapon recovered from the ruins of Research-Station Epsilon." icon_state = "xray" ammo_type = list(/obj/item/ammo_casing/energy/mindflayer) + ammo_x_offset = 2 /obj/item/weapon/gun/energy/kinetic_accelerator name = "proto-kinetic accelerator" @@ -151,6 +162,13 @@ update_icon() return +/obj/item/weapon/gun/energy/kinetic_accelerator/update_icon() + var/obj/item/ammo_casing/energy/shot = ammo_type[select] + if(power_supply.charge < shot.e_cost) + icon_state = "[initial(icon_state)]_empty" + else + icon_state = initial(icon_state) + /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow name = "mini energy crossbow" desc = "A weapon favored by syndicate stealth specialists." @@ -205,51 +223,15 @@ else ..() +/obj/item/weapon/gun/energy/plasmacutter/update_icon() + return + /obj/item/weapon/gun/energy/plasmacutter/adv name = "advanced plasma cutter" icon_state = "adv_plasmacutter" origin_tech = "combat=3;materials=4;magnets=3;plasmatech=3;engineering=2" ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv) -/obj/item/weapon/gun/energy/disabler - name = "disabler" - desc = "A self-defense weapon that exhausts organic targets, weakening them until they collapse." - icon_state = "disabler" - item_state = null - ammo_type = list(/obj/item/ammo_casing/energy/disabler) - -/obj/item/weapon/gun/energy/disabler/cyborg - name = "cyborg disabler" - desc = "An integrated disabler that draws from a cyborg's power cell. This weapon contains a limiter to prevent the cyborg's power cell from overheating." - var/charge_tick = 0 - var/recharge_time = 2.5 - can_charge = 0 - -/obj/item/weapon/gun/energy/disabler/cyborg/New() - ..() - SSobj.processing |= src - - -/obj/item/weapon/gun/energy/disabler/cyborg/Destroy() - SSobj.processing.Remove(src) - ..() - -/obj/item/weapon/gun/energy/disabler/cyborg/process() //Every [recharge_time] ticks, recharge a shot for the cyborg - charge_tick++ - if(charge_tick < recharge_time) return 0 - charge_tick = 0 - - if(!power_supply) return 0 //sanity - if(isrobot(src.loc)) - var/mob/living/silicon/robot/R = src.loc - if(R && R.cell) - var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot - if(R.cell.use(shot.e_cost)) //Take power from the borg... - power_supply.give(shot.e_cost) //... to recharge the shot - - update_icon() - return 1 - /obj/item/weapon/gun/energy/wormhole_projector name = "bluespace wormhole projector" desc = "A projector that emits high density quantum-coupled bluespace beams." @@ -261,6 +243,7 @@ /obj/item/weapon/gun/energy/wormhole_projector/update_icon() icon_state = "[initial(icon_state)][select]" + item_state = icon_state return /obj/item/weapon/gun/energy/wormhole_projector/attack_self(mob/living/user) @@ -333,3 +316,17 @@ power_supply.give(shot.e_cost) //...to recharge the shot return 1 + +/obj/item/weapon/gun/energy/temperature + name = "temperature gun" + icon_state = "freezegun" + desc = "A gun that changes temperatures." + origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2" + ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot) + cell_type = "/obj/item/weapon/stock_parts/cell/high" + pin = null + +/obj/item/weapon/gun/energy/temperature/attack_self(mob/living/user) + select_fire(user) + update_icon() + return diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 413dff9ad14..6659fe329cd 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -1,18 +1,20 @@ - /obj/item/weapon/gun/energy/taser name = "taser gun" desc = "A low-capacity, energy-based stun gun used by security teams to subdue targets at range." icon_state = "taser" item_state = null //so the human update icon uses the icon_state instead. ammo_type = list(/obj/item/ammo_casing/energy/electrode) + ammo_x_offset = 3 /obj/item/weapon/gun/energy/stunrevolver name = "stun revolver" desc = "A high-tech revolver that fires internal, reusable taser cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers." icon_state = "stunrevolver" + item_state = "gun" ammo_type = list(/obj/item/ammo_casing/energy/electrode/gun) can_flashlight = 0 pin = null + ammo_x_offset = 1 /obj/item/weapon/gun/energy/gun/advtaser name = "hybrid taser" @@ -20,6 +22,7 @@ icon_state = "advtaser" ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler) origin_tech = null + ammo_x_offset = 2 /obj/item/weapon/gun/energy/gun/advtaser/cyborg name = "cyborg taser" @@ -52,3 +55,43 @@ update_icon() return 1 + +/obj/item/weapon/gun/energy/disabler + name = "disabler" + desc = "A self-defense weapon that exhausts organic targets, weakening them until they collapse." + icon_state = "disabler" + item_state = null + ammo_type = list(/obj/item/ammo_casing/energy/disabler) + ammo_x_offset = 3 + +/obj/item/weapon/gun/energy/disabler/cyborg + name = "cyborg disabler" + desc = "An integrated disabler that draws from a cyborg's power cell. This weapon contains a limiter to prevent the cyborg's power cell from overheating." + var/charge_tick = 0 + var/recharge_time = 2.5 + can_charge = 0 + +/obj/item/weapon/gun/energy/disabler/cyborg/New() + ..() + SSobj.processing |= src + + +/obj/item/weapon/gun/energy/disabler/cyborg/Destroy() + SSobj.processing.Remove(src) + ..() + +/obj/item/weapon/gun/energy/disabler/cyborg/process() //Every [recharge_time] ticks, recharge a shot for the cyborg + charge_tick++ + if(charge_tick < recharge_time) return 0 + charge_tick = 0 + + if(!power_supply) return 0 //sanity + if(isrobot(src.loc)) + var/mob/living/silicon/robot/R = src.loc + if(R && R.cell) + var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot + if(R.cell.use(shot.e_cost)) //Take power from the borg... + power_supply.give(shot.e_cost) //... to recharge the shot + + update_icon() + return 1 \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/temperature.dm b/code/modules/projectiles/guns/energy/temperature.dm deleted file mode 100644 index cdf7625e393..00000000000 --- a/code/modules/projectiles/guns/energy/temperature.dm +++ /dev/null @@ -1,14 +0,0 @@ -/obj/item/weapon/gun/energy/temperature - name = "temperature gun" - icon_state = "freezegun" - desc = "A gun that changes temperatures." - origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2" - ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot) - cell_type = "/obj/item/weapon/stock_parts/cell/high" - pin = null - - -/obj/item/weapon/gun/energy/temperature/attack_self(mob/living/user) - select_fire(user) - update_icon() - return \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index a08f9b37260..45660958359 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -15,6 +15,9 @@ mag_type = /obj/item/ammo_box/magazine/smgm9mm pin = null +/obj/item/weapon/gun/projectile/automatic/proto/unrestricted + pin = /obj/item/device/firing_pin + /obj/item/weapon/gun/projectile/automatic/update_icon() ..() overlays.Cut() @@ -130,6 +133,10 @@ fire_delay = 3 pin = /obj/item/device/firing_pin/implant/pindicate +/obj/item/weapon/gun/projectile/automatic/l6_saw/unrestricted + pin = /obj/item/device/firing_pin + + /obj/item/weapon/gun/projectile/automatic/l6_saw/attack_self(mob/user) cover_open = !cover_open user << "You [cover_open ? "open" : "close"] [src]'s cover." diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index cda97e37feb..cc253a9e66e 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -262,6 +262,9 @@ pin = /obj/item/device/firing_pin/implant/pindicate action_button_name = null +/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/unrestricted + pin = /obj/item/device/firing_pin + /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/New() ..() update_icon() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 29931e4e7bc..0a1eddc7eb5 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -92,7 +92,7 @@ return 50 //if the projectile doesn't do damage, play its hitsound at 50% volume /obj/item/projectile/Bump(atom/A, yes) - if(!yes) //prevents multi bumps. + if(!yes) //prevents double bumps. return if(A == firer || A == src) loc = A.loc diff --git a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm index 923dfa759b9..2ebceebbd64 100644 --- a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm @@ -576,21 +576,21 @@ C.l_hand.clean_blood() if(C.wear_mask) if(C.wear_mask.clean_blood()) - C.update_inv_wear_mask(0) + C.update_inv_wear_mask() if(ishuman(M)) var/mob/living/carbon/human/H = C if(H.head) if(H.head.clean_blood()) - H.update_inv_head(0) + H.update_inv_head() if(H.wear_suit) if(H.wear_suit.clean_blood()) - H.update_inv_wear_suit(0) + H.update_inv_wear_suit() else if(H.w_uniform) if(H.w_uniform.clean_blood()) - H.update_inv_w_uniform(0) + H.update_inv_w_uniform() if(H.shoes) if(H.shoes.clean_blood()) - H.update_inv_shoes(0) + H.update_inv_shoes() M.clean_blood() /datum/reagent/cryptobiolin diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 26955d0284d..5dc555550e2 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -67,8 +67,8 @@ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/H in viewers(get_turf(holder.my_atom), null)) - H.flash_eyes() + for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) + C.flash_eyes() for(var/i = 1, i <= amount_to_spawn, i++) var/chosen = pick(critters) var/mob/living/simple_animal/hostile/C = new chosen diff --git a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm index 49048502ad0..46f1d7a1e74 100644 --- a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm +++ b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm @@ -159,8 +159,8 @@ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - M.flash_eyes() + for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) + C.flash_eyes() for(var/i = 1, i <= 4 + rand(1,2), i++) var/chosen = pick(borks) @@ -191,7 +191,7 @@ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) + for(var/mob/living/carbon/M in viewers(get_turf(holder.my_atom), null)) M.flash_eyes() for(var/i = 1, i <= 4 + rand(1,2), i++) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index c75e6c3e82d..b64d21f6c14 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -79,8 +79,8 @@ reagents.handle_reactions() ..() -/obj/item/weapon/reagent_containers/throw_impact(atom/target,mob/thrower) - ..() +/obj/item/weapon/reagent_containers/throw_impact(atom/target) + . = ..() if(!reagents.total_volume || !spillable) return @@ -96,12 +96,11 @@ R += A.id + " (" R += num2text(A.volume) + ")," - + if(thrownby) + add_logs(thrownby, M, "splashed", R) reagents.reaction(target, TOUCH) - if(thrower) - add_logs(thrower, M, "splashed", R) - else if((!target.density || target.throwpass) && thrower && thrower.mind && thrower.mind.assigned_role == "Bartender") + else if((target.CanPass(src, get_turf(src))) && thrownby && thrownby.mind && thrownby.mind.assigned_role == "Bartender") visible_message("[src] lands onto the [target.name] without spilling a single drop.") return diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index f8a3630e062..5a68e76e7e2 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -107,7 +107,7 @@ category = list("initial", "Electronics") /datum/design/apc_board - name = "APC Power Control Module" + name = "APC module" id = "power control" build_type = AUTOLATHE materials = list(MAT_METAL = 100, MAT_GLASS = 100) @@ -122,6 +122,14 @@ build_path = /obj/item/weapon/airlock_electronics category = list("initial", "Electronics") +/datum/design/firelock_board + name = "Firelock circuitry" + id = "firelock_board" + build_type = AUTOLATHE + materials = list(MAT_METAL = 50, MAT_GLASS = 50) + build_path = /obj/item/weapon/firelock_board + category = list("initial", "Electronics") + /datum/design/airalarm_electronics name = "Air alarm electronics" id = "airalarm_electronics" diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index dfbb6085368..ce79b1e6ec6 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -22,7 +22,8 @@ /obj/docking_port/Destroy() return QDEL_HINT_LETMELIVE - +/obj/docking_port/shuttleRotate() + return //we don't rotate with shuttles via this code. //returns a list(x0,y0, x1,y1) where points 0 and 1 are bounding corners of the projected rectangle /obj/docking_port/proc/return_coords(_x, _y, _dir) if(!_dir) @@ -267,6 +268,27 @@ else WARNING("shuttle \"[id]\" could not enter transit space. S0=[S0 ? S0.id : "null"] S1=[S1 ? S1.id : "null"]") +//default shuttleRotate +/atom/proc/shuttleRotate(rotation) + //rotate our direction + dir = angle2dir(rotation+dir2angle(dir)) + + //resmooth if need be. + if(smooth) + smooth_icon(src) + + //rotate the pixel offsets too. + if (pixel_x || pixel_y) + if (rotation < 0) + rotation += 360 + for (var/turntimes=rotation/90;turntimes>0;turntimes--) + var/oldPX = pixel_x + var/oldPY = pixel_y + pixel_x = oldPY + pixel_y = (oldPX*(-1)) + + + //this is the main proc. It instantly moves our mobile port to stationary port S1 //it handles all the generic behaviour, such as sanity checks, closing doors on the shuttle, stunning mobs, etc /obj/docking_port/mobile/proc/dock(obj/docking_port/stationary/S1) @@ -296,6 +318,13 @@ var/list/L0 = return_ordered_turfs(x, y, z, dir, areaInstance) var/list/L1 = return_ordered_turfs(S1.x, S1.y, S1.z, S1.dir) + var/rotation = dir2angle(S1.dir)-dir2angle(dir) + if ((rotation % 90) != 0) + rotation += (rotation % 90) //diagonal rotations not allowed, round up + rotation = SimplifyDegrees(rotation) + + + //remove area surrounding docking port if(areaInstance.contents.len) var/area/A0 = locate("[area_type]") @@ -324,55 +353,64 @@ Ts1.copy_air_with_tile(T0) //move mobile to new location - loc = S1.loc - dir = S1.dir - //move all objects - for(var/obj/O in T0) - if(O.invisibility >= 101) - continue - if(O == T0.lighting_object) - continue - O.loc = T1 - //close open doors - if(istype(O, /obj/machinery/door)) - var/obj/machinery/door/Door = O - spawn(-1) - if(Door) - Door.close() - for(var/mob/M in T0) - if(!M.move_on_shuttle) - continue - M.loc = T1 + for(var/atom/movable/AM in T0) + if (rotation) + AM.shuttleRotate(rotation) - //docking turbulence - if(M.client) - spawn(0) - if(M.buckled) - shake_camera(M, 2, 1) // turn it down a bit come on - else - shake_camera(M, 7, 1) - if(istype(M, /mob/living/carbon)) - if(!M.buckled) - M.Weaken(3) + if (istype(AM,/obj)) + var/obj/O = AM + if(O.invisibility >= 101) + continue + if(O == T0.lighting_object) + continue + O.loc = T1 - T0.ChangeTurf(turf_type) + //close open doors + if(istype(O, /obj/machinery/door)) + var/obj/machinery/door/Door = O + spawn(-1) + if(Door) + Door.close() + else if (istype(AM,/mob)) + var/mob/M = AM + if(!M.move_on_shuttle) + continue + M.loc = T1 - //air system updates - for(var/turf/T1 in L1) + //docking turbulence + if(M.client) + spawn(0) + if(M.buckled) + shake_camera(M, 2, 1) // turn it down a bit come on + else + shake_camera(M, 7, 1) + if(istype(M, /mob/living/carbon)) + if(!M.buckled) + M.Weaken(3) + + + if (rotation) + T1.shuttleRotate(rotation) + + //lighting stuff T1.redraw_lighting() SSair.remove_from_active(T1) T1.CalculateAdjacentTurfs() SSair.add_to_active(T1,1) - for(var/turf/T0 in L0) + T0.ChangeTurf(turf_type) + T0.redraw_lighting() SSair.remove_from_active(T0) T0.CalculateAdjacentTurfs() SSair.add_to_active(T0,1) + loc = S1.loc + dir = S1.dir + /* if(istype(S1, /obj/docking_port/stationary/transit)) var/d = turn(dir, 180 + travelDir) @@ -381,6 +419,8 @@ T.update_icon() */ + + /obj/docking_port/mobile/proc/findTransitDock() var/obj/docking_port/stationary/transit/T = SSshuttle.getDock("[id]_transit") if(T && !canDock(T)) diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm index 589731a3635..811ef4d991f 100644 --- a/code/modules/telesci/bscrystal.dm +++ b/code/modules/telesci/bscrystal.dm @@ -28,13 +28,14 @@ do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg') /obj/item/bluespace_crystal/throw_impact(atom/hit_atom) - ..() - visible_message("[src] fizzles and disappears upon impact!") - PoolOrNew(/obj/effect/effect/sparks, loc) - playsound(src.loc, "sparks", 50, 1) - if(isliving(hit_atom)) - blink_mob(hit_atom) - qdel(src) + if(!..()) // not caught in mid-air + visible_message("[src] fizzles and disappears upon impact!") + var/turf/T = get_turf(hit_atom) + PoolOrNew(/obj/effect/effect/sparks, T) + playsound(src.loc, "sparks", 50, 1) + if(isliving(hit_atom)) + blink_mob(hit_atom) + qdel(src) // Artifical bluespace crystal, doesn't give you much research. diff --git a/html/changelog.html b/html/changelog.html index 83389ce270f..c71fef2dfb1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,38 @@ -->
+

21 July 2015

+

Fayrik updated:

+ +

Xhuis updated:

+ +

phil235 updated:

+ + +

20 July 2015

+

AnturK updated:

+ +

KorPaheron updated:

+ +

phil235 updated:

+ +

19 July 2015

Gun Hog updated: