diff --git a/code/__defines/_planes+layers.dm b/code/__defines/_planes+layers.dm index 3686518108..4d258cd91f 100644 --- a/code/__defines/_planes+layers.dm +++ b/code/__defines/_planes+layers.dm @@ -73,8 +73,9 @@ What is the naming convention for planes or layers? #define ABOVE_JUNK_LAYER 3.1 // Things that want to be slightly above common objects #define DOOR_CLOSED_LAYER 3.1 // Doors when closed #define WINDOW_LAYER 3.2 // Windows + #define ABOVE_WINDOW_LAYER 3.25 //Above full tile windows so wall items are clickable #define ON_WINDOW_LAYER 3.3 // Ontop of a window - + // Mob planes #define MOB_PLANE -25 #define BELOW_MOB_LAYER 3.9 // Should be converted to plane swaps @@ -90,11 +91,11 @@ What is the naming convention for planes or layers? //#define AREA_LAYER 1 //For easy recordkeeping; this is a byond define //#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define - + //#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define - + //#define MOB_LAYER 4 //For easy recordkeeping; this is a byond define - + //#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define #define HUD_LAYER 20 // Above lighting, but below obfuscation. For in-game HUD effects (whereas SCREEN_LAYER is for abstract/OOC things like inventory slots) diff --git a/code/__defines/holomap.dm b/code/__defines/holomap.dm new file mode 100644 index 0000000000..0b93e03ae0 --- /dev/null +++ b/code/__defines/holomap.dm @@ -0,0 +1,52 @@ +// +// Constants and standard colors for the holomap +// + +#define WORLD_ICON_SIZE 32 // Size of a standard tile in pixels (world.icon_size) +#define PIXEL_MULTIPLIER WORLD_ICON_SIZE/32 // Convert from normal icon size of 32 to whatever insane thing this server is using. +#define HOLOMAP_ICON 'icons/480x480.dmi' // Icon file to start with when drawing holomaps (to get a 480x480 canvas). +#define HOLOMAP_ICON_SIZE 480 // Pixel width & height of the holomap icon. Used for auto-centering etc. +#define ui_holomap "CENTER-7, CENTER-7" // Screen location of the holomap "hud" + +// Holomap colors +#define HOLOMAP_OBSTACLE "#FFFFFFDD" // Color of walls and barriers +#define HOLOMAP_PATH "#66666699" // Color of floors +#define HOLOMAP_ROCK "#66666644" // Color of mineral walls +#define HOLOMAP_HOLOFIER "#79FF79" // Whole map is multiplied by this to give it a green holoish look + +#define HOLOMAP_AREACOLOR_COMMAND "#0000F099" +#define HOLOMAP_AREACOLOR_SECURITY "#AE121299" +#define HOLOMAP_AREACOLOR_MEDICAL "#447FC299" +#define HOLOMAP_AREACOLOR_SCIENCE "#A154A699" +#define HOLOMAP_AREACOLOR_ENGINEERING "#F1C23199" +#define HOLOMAP_AREACOLOR_CARGO "#E06F0099" +#define HOLOMAP_AREACOLOR_HALLWAYS "#FFFFFF66" +#define HOLOMAP_AREACOLOR_ARRIVALS "#0000FFCC" +#define HOLOMAP_AREACOLOR_ESCAPE "#FF0000CC" +#define HOLOMAP_AREACOLOR_DORMS "#CCCC0099" + +#define LIST_NUMERIC_SET(L, I, V) if(!L) { L = list(); } if (L.len < I) { L.len = I; } L[I] = V + +// Handy defines to lookup the pixel offsets for this Z-level. Cache these if you use them in a loop tho. +#define HOLOMAP_PIXEL_OFFSET_X(zLevel) ((using_map.holomap_offset_x.len >= zLevel) ? using_map.holomap_offset_x[zLevel] : 0) +#define HOLOMAP_PIXEL_OFFSET_Y(zLevel) ((using_map.holomap_offset_y.len >= zLevel) ? using_map.holomap_offset_y[zLevel] : 0) +#define HOLOMAP_LEGEND_X(zLevel) ((using_map.holomap_legend_x.len >= zLevel) ? using_map.holomap_legend_x[zLevel] : 96) +#define HOLOMAP_LEGEND_Y(zLevel) ((using_map.holomap_legend_y.len >= zLevel) ? using_map.holomap_legend_y[zLevel] : 96) + +// VG stuff we probably won't use +// #define HOLOMAP_FILTER_DEATHSQUAD 1 +// #define HOLOMAP_FILTER_ERT 2 +// #define HOLOMAP_FILTER_NUKEOPS 4 +// #define HOLOMAP_FILTER_ELITESYNDICATE 8 +// #define HOLOMAP_FILTER_VOX 16 +// #define HOLOMAP_FILTER_STATIONMAP 32 +// #define HOLOMAP_FILTER_STATIONMAP_STRATEGIC 64//features markers over the captain's office, the armory, the SMES + +// #define HOLOMAP_MARKER_SMES "smes" +// #define HOLOMAP_MARKER_DISK "diskspawn" +// #define HOLOMAP_MARKER_SKIPJACK "skipjack" +// #define HOLOMAP_MARKER_SYNDISHUTTLE "syndishuttle" + +#define HOLOMAP_EXTRA_STATIONMAP "stationmapformatted" +#define HOLOMAP_EXTRA_STATIONMAPAREAS "stationareas" +#define HOLOMAP_EXTRA_STATIONMAPSMALL "stationmapsmall" \ No newline at end of file diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm index 44137b0431..c76bb80440 100644 --- a/code/__defines/subsystems.dm +++ b/code/__defines/subsystems.dm @@ -31,9 +31,10 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G #define INIT_ORDER_LIGHTING 0 #define INIT_ORDER_AIR -1 #define INIT_ORDER_PLANETS -4 +#define INIT_ORDER_HOLOMAPS -5 #define INIT_ORDER_OVERLAY -6 #define INIT_ORDER_XENOARCH -20 - + // Subsystem fire priority, from lowest to highest priority // If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index c63519c40f..b5a4e68d6f 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -14,7 +14,8 @@ var/list/global_huds = list( global_hud.thermal, global_hud.meson, global_hud.science, - global_hud.material + global_hud.material, + global_hud.holomap ) /datum/hud/var/obj/screen/grab_intent @@ -35,6 +36,7 @@ var/list/global_huds = list( var/obj/screen/meson var/obj/screen/science var/obj/screen/material + var/obj/screen/holomap /datum/global_hud/proc/setup_overlay(var/icon_state) var/obj/screen/screen = new /obj/screen() @@ -84,6 +86,18 @@ var/list/global_huds = list( science = setup_overlay("science_hud") material = setup_overlay("material_hud") + // The holomap screen object is actually totally invisible. + // Station maps work by setting it as an images location before sending to client, not + // actually changing the icon or icon state of the screen object itself! + // Why do they work this way? I don't know really, that is how /vg designed them, but since they DO + // work this way, we can take advantage of their immutability by making them part of + // the global_hud (something we have and /vg doesn't) instead of an instance per mob. + holomap = new /obj/screen() + holomap.name = "holomap" + holomap.icon = null + holomap.screen_loc = ui_holomap + holomap.mouse_opacity = 0 + var/obj/screen/O var/i //that nasty looking dither you get when you're short-sighted diff --git a/code/controllers/subsystems/holomaps.dm b/code/controllers/subsystems/holomaps.dm new file mode 100644 index 0000000000..5fcca27480 --- /dev/null +++ b/code/controllers/subsystems/holomaps.dm @@ -0,0 +1,24 @@ +// +// Holo-Minimaps Generation Subsystem handles initialization of the holo minimaps. +// Look in code/modules/holomap/generate_holomap.dm to find generateHoloMinimaps() +// +SUBSYSTEM_DEF(holomaps) + name = "HoloMiniMaps" + init_order = INIT_ORDER_HOLOMAPS + flags = SS_NO_FIRE + var/static/holomaps_initialized = FALSE + var/static/list/holoMiniMaps = list() + var/static/list/extraMiniMaps = list() + var/static/list/station_holomaps = list() + +/datum/controller/subsystem/holomaps/Recover() + flags |= SS_NO_INIT // Make extra sure we don't initialize twice. + +/datum/controller/subsystem/holomaps/Initialize(timeofday) + generateHoloMinimaps() + . = ..() + +/datum/controller/subsystem/holomaps/stat_entry(msg) + if (!Debug2) + return // Only show up in stat panel if debugging is enabled. + . = ..() diff --git a/code/modules/holomap/generate_holomap.dm b/code/modules/holomap/generate_holomap.dm new file mode 100644 index 0000000000..e4917e0ba0 --- /dev/null +++ b/code/modules/holomap/generate_holomap.dm @@ -0,0 +1,177 @@ +// +// Holomap generation. +// Based on /vg/station but trimmed down (without antag stuff) and massively optimized (you should have seen it before!) ~Leshana +// + +// Define what criteria makes a turf a path or not + +// Turfs that will be colored as HOLOMAP_ROCK +#define IS_ROCK(tile) (istype(tile, /turf/simulated/mineral) && tile.density) + +// Turfs that will be colored as HOLOMAP_OBSTACLE +#define IS_OBSTACLE(tile) ((!istype(tile, /turf/space) && istype(tile.loc, /area/mine/unexplored)) \ + || istype(tile, /turf/simulated/wall) \ + || istype(tile, /turf/unsimulated/mineral) \ + || (istype(tile, /turf/unsimulated/wall) && !istype(tile, /turf/unsimulated/wall/planetary)) \ + /*|| istype(tile, /turf/simulated/shuttle/wall)*/ \ + || (locate(/obj/structure/grille) in tile) \ + /*|| (locate(/obj/structure/window/full) in tile)*/) + +// Turfs that will be colored as HOLOMAP_PATH +#define IS_PATH(tile) ((istype(tile, /turf/simulated/floor) && !istype(tile, /turf/simulated/floor/outdoors)) \ + || istype(tile, /turf/unsimulated/floor) \ + /*|| istype(tile, /turf/simulated/shuttle/floor)*/ \ + || (locate(/obj/structure/catwalk) in tile)) + +/// Generates all the holo minimaps, initializing it all nicely, probably. +/datum/controller/subsystem/holomaps/proc/generateHoloMinimaps() + var/start_time = world.timeofday + // Build the base map for each z level + for (var/z = 1 to world.maxz) + holoMiniMaps |= z // hack, todo fix + holoMiniMaps[z] = generateHoloMinimap(z) + + // Generate the area overlays, small maps, etc for the station levels. + for (var/z in using_map.station_levels) + generateStationMinimap(z) + + if(using_map.holomap_smoosh) + for(var/smoosh_list in using_map.holomap_smoosh) + smooshTetherHolomaps(smoosh_list) + + holomaps_initialized = TRUE + admin_notice("Holomaps initialized in [round(0.1*(world.timeofday-start_time),0.1)] seconds.", R_DEBUG) + + // TODO - Check - They had a delayed init perhaps? + for (var/obj/machinery/station_map/S in station_holomaps) + S.setup_holomap() + +// Generates the "base" holomap for one z-level, showing only the physical structure of walls and paths. +/datum/controller/subsystem/holomaps/proc/generateHoloMinimap(var/zLevel = 1) + // Save these values now to avoid a bazillion array lookups + var/offset_x = HOLOMAP_PIXEL_OFFSET_X(zLevel) + var/offset_y = HOLOMAP_PIXEL_OFFSET_Y(zLevel) + + // Sanity checks - Better to generate a helpful error message now than have DrawBox() runtime + var/icon/canvas = icon(HOLOMAP_ICON, "blank") + if(world.maxx + offset_x > canvas.Width()) + crash_with("Minimap for z=[zLevel] : world.maxx ([world.maxx]) + holomap_offset_x ([offset_x]) must be <= [canvas.Width()]") + if(world.maxy + offset_y > canvas.Height()) + crash_with("Minimap for z=[zLevel] : world.maxy ([world.maxy]) + holomap_offset_y ([offset_y]) must be <= [canvas.Height()]") + + for(var/x = 1 to world.maxx) + for(var/y = 1 to world.maxy) + var/turf/tile = locate(x, y, zLevel) + if(tile && tile.loc:holomapAlwaysDraw()) + if(IS_ROCK(tile)) + canvas.DrawBox(HOLOMAP_ROCK, x + offset_x, y + offset_y) + if(IS_OBSTACLE(tile)) + canvas.DrawBox(HOLOMAP_OBSTACLE, x + offset_x, y + offset_y) + else if(IS_PATH(tile)) + canvas.DrawBox(HOLOMAP_PATH, x + offset_x, y + offset_y) + // Check sleeping after each row to avoid *completely* destroying the server + CHECK_TICK + return canvas + +// Okay, what does this one do? +// This seems to do the drawing thing, but draws only the areas, having nothing to do with the tiles. +// Leshana: I'm guessing this map will get overlayed on top of the base map at runtime? We'll see. +// Wait, seems we actually blend the area map on top of it right now! Huh. +/datum/controller/subsystem/holomaps/proc/generateStationMinimap(var/zLevel) + // Save these values now to avoid a bazillion array lookups + var/offset_x = HOLOMAP_PIXEL_OFFSET_X(zLevel) + var/offset_y = HOLOMAP_PIXEL_OFFSET_Y(zLevel) + + // Sanity checks - Better to generate a helpful error message now than have DrawBox() runtime + var/icon/canvas = icon(HOLOMAP_ICON, "blank") + if(world.maxx + offset_x > canvas.Width()) + crash_with("Minimap for z=[zLevel] : world.maxx ([world.maxx]) + holomap_offset_x ([offset_x]) must be <= [canvas.Width()]") + if(world.maxy + offset_y > canvas.Height()) + crash_with("Minimap for z=[zLevel] : world.maxy ([world.maxy]) + holomap_offset_y ([offset_y]) must be <= [canvas.Height()]") + + for(var/x = 1 to world.maxx) + for(var/y = 1 to world.maxy) + var/turf/tile = locate(x, y, zLevel) + if(tile && tile.loc) + var/area/areaToPaint = tile.loc + if(areaToPaint.holomap_color) + canvas.DrawBox(areaToPaint.holomap_color, x + offset_x, y + offset_y) + + // Save this nice area-colored canvas in case we want to layer it or something I guess + extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPAREAS]_[zLevel]"] = canvas + + var/icon/map_base = icon(holoMiniMaps[zLevel]) + map_base.Blend(HOLOMAP_HOLOFIER, ICON_MULTIPLY) + + // Generate the full sized map by blending the base and areas onto the backdrop + var/icon/big_map = icon(HOLOMAP_ICON, "stationmap") + big_map.Blend(map_base, ICON_OVERLAY) + big_map.Blend(canvas, ICON_OVERLAY) + extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAP]_[zLevel]"] = big_map + + // Generate the "small" map (I presume for putting on wall map things?) + var/icon/small_map = icon(HOLOMAP_ICON, "blank") + small_map.Blend(map_base, ICON_OVERLAY) + small_map.Blend(canvas, ICON_OVERLAY) + small_map.Scale(WORLD_ICON_SIZE, WORLD_ICON_SIZE) + + // And rotate it in every direction of course! + var/icon/actual_small_map = icon(small_map) + actual_small_map.Insert(new_icon = small_map, dir = SOUTH) + actual_small_map.Insert(new_icon = turn(small_map, 90), dir = WEST) + actual_small_map.Insert(new_icon = turn(small_map, 180), dir = NORTH) + actual_small_map.Insert(new_icon = turn(small_map, 270), dir = EAST) + extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[zLevel]"] = actual_small_map + +// For tiny multi-z maps like the tether, we want to smoosh em together into a nice big one! +/datum/controller/subsystem/holomaps/proc/smooshTetherHolomaps(var/list/zlevels) + var/icon/big_map = icon(HOLOMAP_ICON, "stationmap") + var/icon/small_map = icon(HOLOMAP_ICON, "blank") + // For each zlevel in turn, overlay them on top of each other + for(var/zLevel in zlevels) + var/icon/z_terrain = icon(holoMiniMaps[zLevel]) + z_terrain.Blend(HOLOMAP_HOLOFIER, ICON_MULTIPLY) + big_map.Blend(z_terrain, ICON_OVERLAY) + small_map.Blend(z_terrain, ICON_OVERLAY) + var/icon/z_areas = extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPAREAS]_[zLevel]"] + big_map.Blend(z_areas, ICON_OVERLAY) + small_map.Blend(z_areas, ICON_OVERLAY) + + // Then scale and rotate to make the actual small map we will use + small_map.Scale(WORLD_ICON_SIZE, WORLD_ICON_SIZE) + var/icon/actual_small_map = icon(small_map) + actual_small_map.Insert(new_icon = small_map, dir = SOUTH) + actual_small_map.Insert(new_icon = turn(small_map, 90), dir = WEST) + actual_small_map.Insert(new_icon = turn(small_map, 180), dir = NORTH) + actual_small_map.Insert(new_icon = turn(small_map, 270), dir = EAST) + + // Then assign this icon as the icon for all those levels! + for(var/zLevel in zlevels) + extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAP]_[zLevel]"] = big_map + extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[zLevel]"] = actual_small_map + +// TODO - Holomap Markers! +// /proc/generateMinimapMarkers(var/zLevel) +// // Save these values now to avoid a bazillion array lookups +// var/offset_x = HOLOMAP_PIXEL_OFFSET_X(zLevel) +// var/offset_y = HOLOMAP_PIXEL_OFFSET_Y(zLevel) + +// // TODO - Holomap markers +// for(var/filter in list(HOLOMAP_FILTER_STATIONMAP)) +// var/icon/canvas = icon(HOLOMAP_ICON, "blank") +// for(/datum/holomap_marker/holomarker in holomap_markers) +// if(holomarker.z == zLevel && holomarker.filter & filter) +// canvas.Blend(icon(holomarker.icon, holomarker.icon_state), ICON_OVERLAY, holomarker.x + offset_x, holomarker.y + offset_y) +// extraMiniMaps["[HOLOMAP_EXTRA_MARKERS]_[filter]_[zLevel]"] = canvas + +// /datum/holomap_marker +// var/x +// var/y +// var/z +// var/filter +// var/icon = 'icons/holomap_markers.dmi' +// var/icon_state + +#undef IS_ROCK +#undef IS_OBSTACLE +#undef IS_PATH diff --git a/code/modules/holomap/holomap_area.dm b/code/modules/holomap/holomap_area.dm new file mode 100644 index 0000000000..2cc755dfa5 --- /dev/null +++ b/code/modules/holomap/holomap_area.dm @@ -0,0 +1,80 @@ +/* +** Holomap vars and procs on /area +*/ + +/area + var/holomap_color = null // Color of this area on station holomap + +/area/rnd + holomap_color = HOLOMAP_AREACOLOR_SCIENCE +/area/outpost/research + holomap_color = HOLOMAP_AREACOLOR_SCIENCE +/area/server + holomap_color = HOLOMAP_AREACOLOR_SCIENCE +/area/assembly + holomap_color = HOLOMAP_AREACOLOR_SCIENCE + +/area/bridge + holomap_color = HOLOMAP_AREACOLOR_COMMAND +/area/teleporter + holomap_color = HOLOMAP_AREACOLOR_COMMAND +/area/teleporter/departing + holomap_color = null + +/area/security + holomap_color = HOLOMAP_AREACOLOR_SECURITY +/area/tether/surfacebase/security + holomap_color = HOLOMAP_AREACOLOR_SECURITY + +/area/medical + holomap_color = HOLOMAP_AREACOLOR_MEDICAL +/area/tether/surfacebase/medical + holomap_color = HOLOMAP_AREACOLOR_MEDICAL + +/area/engineering + holomap_color = HOLOMAP_AREACOLOR_ENGINEERING +/area/engineering/atmos/intake + holomap_color = null +/area/maintenance/substation/engineering + holomap_color = HOLOMAP_AREACOLOR_ENGINEERING +/area/storage/tech + holomap_color = HOLOMAP_AREACOLOR_ENGINEERING + +/area/quartermaster + holomap_color = HOLOMAP_AREACOLOR_CARGO +/area/tether/surfacebase/mining_main + holomap_color = HOLOMAP_AREACOLOR_CARGO + +/area/hallway + holomap_color = HOLOMAP_AREACOLOR_HALLWAYS +/area/bridge/hallway + holomap_color = HOLOMAP_AREACOLOR_HALLWAYS + +/area/crew_quarters/sleep + holomap_color = HOLOMAP_AREACOLOR_DORMS +/area/crew_quarters/sleep/cryo + holomap_color = null + +// Heads +/area/crew_quarters/captain + holomap_color = HOLOMAP_AREACOLOR_COMMAND +/area/crew_quarters/heads/hop + holomap_color = HOLOMAP_AREACOLOR_COMMAND +/area/crew_quarters/heads/hor + holomap_color = HOLOMAP_AREACOLOR_SCIENCE +/area/crew_quarters/heads/chief + holomap_color = HOLOMAP_AREACOLOR_ENGINEERING +/area/crew_quarters/heads/hos + holomap_color = HOLOMAP_AREACOLOR_SECURITY +/area/crew_quarters/heads/cmo + holomap_color = HOLOMAP_AREACOLOR_MEDICAL +/area/crew_quarters/medbreak + holomap_color = HOLOMAP_AREACOLOR_MEDICAL + + +// ### PROCS ### +// Whether the turfs in the area should be drawn onto the "base" holomap. +/area/proc/holomapAlwaysDraw() + return TRUE +/area/shuttle/holomapAlwaysDraw() + return FALSE \ No newline at end of file diff --git a/code/modules/holomap/holomap_datum.dm b/code/modules/holomap/holomap_datum.dm new file mode 100644 index 0000000000..af4cc6f274 --- /dev/null +++ b/code/modules/holomap/holomap_datum.dm @@ -0,0 +1,40 @@ +// Simple datum to keep track of a running holomap. Each machine capable of displaying the holomap will have one. +/datum/station_holomap + var/image/station_map + var/image/cursor + var/image/legend + +/datum/station_holomap/proc/initialize_holomap(var/turf/T, var/isAI = null, var/mob/user = null, var/reinit = FALSE) + if(!station_map || reinit) + station_map = image(SSholomaps.extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAP]_[T.z]"]) + if(!cursor || reinit) + cursor = image('icons/holomap_markers.dmi', "you") + if(!legend || reinit) + legend = image('icons/effects/64x64.dmi', "legend_sc") + + if(isAI) + T = get_turf(user.client.eye) + cursor.pixel_x = (T.x - 6 + HOLOMAP_PIXEL_OFFSET_X(T.z)) * PIXEL_MULTIPLIER + cursor.pixel_y = (T.y - 6 + HOLOMAP_PIXEL_OFFSET_Y(T.z)) * PIXEL_MULTIPLIER + + legend.pixel_x = HOLOMAP_LEGEND_X(T.z) + legend.pixel_y = HOLOMAP_LEGEND_Y(T.z) + + station_map.overlays |= cursor + station_map.overlays |= legend + +/datum/station_holomap/proc/initialize_holomap_bogus() + station_map = image('icons/480x480.dmi', "stationmap") + legend = image('icons/effects/64x64.dmi', "notfound") + legend.pixel_x = 7 * WORLD_ICON_SIZE + legend.pixel_y = 7 * WORLD_ICON_SIZE + station_map.overlays |= legend + +// TODO - Strategic Holomap support +// /datum/station_holomap/strategic/initialize_holomap(var/turf/T, var/isAI=null, var/mob/user=null) +// ..() +// station_map = image(SSholomaps.extraMiniMaps[HOLOMAP_EXTRA_STATIONMAP_STRATEGIC]) +// legend = image('icons/effects/64x64.dmi', "strategic") +// legend.pixel_x = 3*WORLD_ICON_SIZE +// legend.pixel_y = 3*WORLD_ICON_SIZE +// station_map.overlays |= legend diff --git a/code/modules/holomap/station_holomap.dm b/code/modules/holomap/station_holomap.dm new file mode 100644 index 0000000000..9de56229da --- /dev/null +++ b/code/modules/holomap/station_holomap.dm @@ -0,0 +1,251 @@ +// +// Wall mounted holomap of the station +// +/obj/machinery/station_map + name = "station holomap" + desc = "A virtual map of the surrounding station." + icon = 'icons/obj/machines/stationmap.dmi' + icon_state = "station_map" + anchored = 1 + density = 0 + use_power = 1 + idle_power_usage = 10 + active_power_usage = 500 + circuit = /obj/item/weapon/circuitboard/station_map + + // TODO - Port use_auto_lights from /vg - for now declare here + var/use_auto_lights = 1 + var/light_power_on = 1 + var/light_range_on = 2 + light_color = "#64C864" + + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER + + var/mob/watching_mob = null + var/image/small_station_map = null + var/image/floor_markings = null + var/image/panel = null + + var/original_zLevel = 1 // zLevel on which the station map was initialized. + var/bogus = TRUE // set to 0 when you initialize the station map on a zLevel that has its own icon formatted for use by station holomaps. + var/datum/station_holomap/holomap_datum + +/obj/machinery/station_map/New() + ..() + holomap_datum = new() + original_zLevel = loc.z + SSholomaps.station_holomaps += src + flags |= ON_BORDER // Why? It doesn't help if its not density + +/obj/machinery/station_map/initialize() + . = ..() + if(SSholomaps.holomaps_initialized) + spawn(1) // Tragically we need to spawn this in order to give the frame construcing us time to set pixel_x/y + setup_holomap() + +/obj/machinery/station_map/Destroy() + SSholomaps.station_holomaps -= src + stopWatching() + holomap_datum = null + . = ..() + +/obj/machinery/station_map/proc/setup_holomap() + . = ..() + bogus = FALSE + var/turf/T = get_turf(src) + original_zLevel = T.z + if(!("[HOLOMAP_EXTRA_STATIONMAP]_[original_zLevel]" in SSholomaps.extraMiniMaps)) + bogus = TRUE + holomap_datum.initialize_holomap_bogus() + update_icon() + return + + holomap_datum.initialize_holomap(T, reinit = TRUE) + + small_station_map = image(SSholomaps.extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[original_zLevel]"], dir = dir) + // small_station_map.plane = LIGHTING_PLANE // Not until we do planes ~Leshana + // small_station_map.layer = LIGHTING_LAYER+1 // Weird things will happen! + + floor_markings = image('icons/obj/machines/stationmap.dmi', "decal_station_map") + floor_markings.dir = src.dir + // floor_markings.plane = ABOVE_TURF_PLANE // Not until we do planes ~Leshana + // floor_markings.layer = DECAL_LAYER + update_icon() + +/obj/machinery/station_map/attack_hand(var/mob/user) + if(watching_mob && (watching_mob != user)) + to_chat(user, "Someone else is currently watching the holomap.") + return + if(user.loc != loc) + to_chat(user, "You need to stand in front of \the [src].") + return + startWatching(user) + +// Let people bump up against it to watch +/obj/machinery/station_map/Bumped(var/atom/movable/AM) + if(!watching_mob && isliving(AM) && AM.loc == loc) + startWatching(AM) + +// In order to actually get Bumped() we need to block movement. We're (visually) on a wall, so people +// couldn't really walk into us anyway. But in reality we are on the turf in front of the wall, so bumping +// against where we seem is actually trying to *exit* our real loc +/obj/machinery/station_map/CheckExit(atom/movable/mover as mob|obj, turf/target as turf) + // log_debug("[src] (dir=[dir]) CheckExit([mover], [target]) get_dir() = [get_dir(target, loc)]") + if(get_dir(target, loc) == dir) // Opposite of "normal" since we are visually in the next turf over + return FALSE + else + return TRUE + +/obj/machinery/station_map/proc/startWatching(var/mob/user) + // Okay, does this belong on a screen thing or what? + // One argument is that this is an "in game" object becuase its in the world. + // But I think it actually isn't. The map isn't holo projected into the whole room, (maybe strat one is!) + // But for this, the on screen object just represents you leaning in and looking at it closely. + // So it SHOULD be a screen object. + // But it is not QUITE a hud either. So I think it shouldn't go in /datum/hud + // Okay? Yeah. Lets use screen objects but manage them manually here in the item. + // That might be a mistake... I'd rather they be managed by some central hud management system. + // But the /vg code, while the screen obj is managed, its still adding and removing image, so this is + // just as good. + + // EH JUST HACK IT FOR NOW SO WE CAN SEE HOW IT LOOKS! STOP OBSESSING, ITS BEEN AN HOUR NOW! + + // TODO - This part!! ~Leshana + if(isliving(user) && anchored && !(stat & (NOPOWER|BROKEN))) + if(user.client) + holomap_datum.station_map.loc = global_hud.holomap // Put the image on the holomap hud + holomap_datum.station_map.alpha = 0 // Set to transparent so we can fade in + animate(holomap_datum.station_map, alpha = 255, time = 5, easing = LINEAR_EASING) + flick("station_map_activate", src) + // Wait, if wea re not modifying the holomap_obj... can't it be part of the global hud? + user.client.screen |= global_hud.holomap // TODO - HACK! This should be there permenently really. + user.client.images |= holomap_datum.station_map + + watching_mob = user + moved_event.register(watching_mob, src, /obj/machinery/station_map/proc/checkPosition) + dir_set_event.register(watching_mob, src, /obj/machinery/station_map/proc/checkPosition) + destroyed_event.register(watching_mob, src, /obj/machinery/station_map/proc/stopWatching) + update_use_power(2) + + if(bogus) + to_chat(user, "The holomap failed to initialize. This area of space cannot be mapped.") + else + to_chat(user, "A hologram of the station appears before your eyes.") + +/obj/machinery/station_map/attack_ai(var/mob/living/silicon/robot/user) + return // TODO - Implement for AI ~Leshana + // user.station_holomap.toggleHolomap(user, isAI(user)) + +/obj/machinery/station_map/process() + if((stat & (NOPOWER|BROKEN)) || !anchored) + stopWatching() + +/obj/machinery/station_map/proc/checkPosition() + if(!watching_mob || (watching_mob.loc != loc) || (dir != watching_mob.dir)) + stopWatching() + +/obj/machinery/station_map/proc/stopWatching() + if(watching_mob) + if(watching_mob.client) + animate(holomap_datum.station_map, alpha = 0, time = 5, easing = LINEAR_EASING) + var/mob/M = watching_mob + spawn(5) //we give it time to fade out + M.client.images -= holomap_datum.station_map + moved_event.unregister(watching_mob, src) + dir_set_event.unregister(watching_mob, src) + destroyed_event.unregister(watching_mob, src) + watching_mob = null + update_use_power(1) + +/obj/machinery/station_map/power_change() + . = ..() + update_icon() + // TODO - Port use_auto_lights from /vg - For now implement it manually here + if(stat & NOPOWER) + set_light(0) + else + set_light(light_range_on, light_power_on) + +/obj/machinery/station_map/proc/set_broken() + stat |= BROKEN + update_icon() + +/obj/machinery/station_map/update_icon() + overlays.Cut() + if(stat & BROKEN) + icon_state = "station_mapb" + else if((stat & NOPOWER) || !anchored) + icon_state = "station_map0" + else + icon_state = "station_map" + + if(bogus) + holomap_datum.initialize_holomap_bogus() + else + small_station_map.icon = SSholomaps.extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[original_zLevel]"] + overlays |= small_station_map + holomap_datum.initialize_holomap(get_turf(src)) + + // Put the little "map" overlay down where it looks nice + if(floor_markings) + floor_markings.dir = src.dir + floor_markings.pixel_x = -src.pixel_x + floor_markings.pixel_y = -src.pixel_y + overlays += floor_markings + + if(panel_open) + overlays += "station_map-panel" + else + overlays -= "station_map-panel" + +/obj/machinery/station_map/attackby(obj/item/weapon/W as obj, mob/user as mob) + src.add_fingerprint(user) + if(default_deconstruction_screwdriver(user, W)) + return + if(default_deconstruction_crowbar(user, W)) + return + return ..() + +/obj/machinery/station_map/ex_act(severity) + switch(severity) + if(1) + qdel(src) + if(2) + if (prob(50)) + qdel(src) + else + set_broken() + if(3) + if (prob(25)) + set_broken() + +/datum/frame/frame_types/station_map + name = "Station Map Frame" + frame_class = "display" + frame_size = 3 + frame_style = "wall" + x_offset = WORLD_ICON_SIZE + y_offset = WORLD_ICON_SIZE + circuit = /obj/item/weapon/circuitboard/station_map + icon_override = 'icons/obj/machines/stationmap.dmi' + +/datum/frame/frame_types/station_map/get_icon_state(var/state) + return "station_map_frame_[state]" + +/obj/structure/frame + layer = ABOVE_WINDOW_LAYER + +/obj/item/weapon/circuitboard/station_map + name = T_BOARD("Station Map") + board_type = new /datum/frame/frame_types/station_map + build_path = /obj/machinery/station_map + origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2) + req_components = list() + +// TODO +// //Portable holomaps, currently AI/Borg/MoMMI only + +// TODO +// OHHHH YEAH - STRATEGIC HOLOMAP! NICE! +// It will need to wait until later tho. diff --git a/icons/480x480.dmi b/icons/480x480.dmi index 90ea9fbd55..0b6d072855 100644 Binary files a/icons/480x480.dmi and b/icons/480x480.dmi differ diff --git a/icons/effects/64x64.dmi b/icons/effects/64x64.dmi new file mode 100644 index 0000000000..79eabaac4f Binary files /dev/null and b/icons/effects/64x64.dmi differ diff --git a/icons/holomap_markers.dmi b/icons/holomap_markers.dmi new file mode 100644 index 0000000000..3ea32c120d Binary files /dev/null and b/icons/holomap_markers.dmi differ diff --git a/icons/obj/machines/stationmap.dmi b/icons/obj/machines/stationmap.dmi new file mode 100644 index 0000000000..f57bf08913 Binary files /dev/null and b/icons/obj/machines/stationmap.dmi differ diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm index c600de3f11..a59a8294bb 100644 --- a/maps/southern_cross/southern_cross-1.dmm +++ b/maps/southern_cross/southern_cross-1.dmm @@ -1096,7 +1096,7 @@ "avd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/borderfloor/corner{dir = 1},/obj/effect/floor_decal/corner/green/bordercorner{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard) "ave" = (/obj/machinery/firealarm{pixel_y = 24},/obj/machinery/camera/network/first_deck{c_tag = "First Deck - Starboard Hallway Three"; dir = 2},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard) "avf" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard) -"avg" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard) +"avg" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/obj/machinery/station_map{pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard) "avh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals5,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard) "avi" = (/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard) "avj" = (/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals5,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard) @@ -1226,7 +1226,7 @@ "axD" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/green/border,/obj/structure/closet/medical_wall{pixel_y = -31},/obj/item/roller,/obj/item/bodybag/cryobag,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/pill_bottle/spaceacillin,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard) "axE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/green/bordercorner{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard) "axF" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/green/border,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard) -"axG" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/green/border,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard) +"axG" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/brown/border,/obj/machinery/station_map{dir = 1; pixel_y = -32},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/port) "axH" = (/obj/machinery/light,/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/green/bordercorner{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard) "axI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard) "axJ" = (/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/green/border,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard) @@ -2398,7 +2398,7 @@ "aUf" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating,/area/shuttle/escape_pod6/station) "aUg" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/firstdeck/ep_aftport) "aUh" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/firstdeck/ep_aftport) -"aUi" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/aft) +"aUi" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/green/border,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/starboard) "aUj" = (/obj/structure/stairs/east,/turf/simulated/floor/tiled/dark,/area/hallway/primary/firstdeck/aft) "aUk" = (/turf/simulated/wall,/area/hallway/primary/firstdeck/auxdockaft) "aUl" = (/obj/structure/sign/directions/bridge{dir = 1; pixel_y = 10},/obj/structure/sign/directions/science{dir = 1},/obj/structure/sign/directions/medical{dir = 1; pixel_y = -10},/turf/simulated/wall,/area/hallway/primary/firstdeck/auxdockaft) @@ -8814,7 +8814,7 @@ "dnz" = (/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/corner/green/bordercorner{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft) "dnA" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft) "dnB" = (/obj/effect/floor_decal/borderfloor/corner{dir = 1},/obj/effect/floor_decal/corner/green/bordercorner{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft) -"dnC" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft) +"dnC" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/machinery/station_map{dir = 4; pixel_x = -32},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/aft) "dnD" = (/obj/machinery/recharge_station,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/seconddeck/locker/locker_toilet) "dnE" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/seconddeck/locker/locker_toilet) "dnF" = (/obj/machinery/firealarm{pixel_y = 24},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/seconddeck/locker/locker_toilet) @@ -10144,7 +10144,7 @@ "dNd" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central) "dNe" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central) "dNf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central) -"dNg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central) +"dNg" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/station_map{dir = 1; pixel_y = -32},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/fpcenter) "dNh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central) "dNi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central) "dNj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central) @@ -10577,6 +10577,11 @@ "dVu" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/structure/table/rack{dir = 1},/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/thirddeck/foreport) "dVv" = (/obj/structure/table/rack,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/thirddeck/aftstarboard) "dVw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/starboard) +"dVx" = (/obj/machinery/station_map{pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/port) +"dVy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/paleblue/border,/obj/machinery/station_map{dir = 1; pixel_y = -32},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/starboard) +"dVz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/station_map{pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/apcenter) +"dVA" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/obj/machinery/station_map{dir = 8; pixel_x = 32},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft) +"dVB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/station_map{dir = 1; pixel_y = -32},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10707,7 +10712,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaakLasPapkakLasQasQasQasQasQarTasRasSasTasUasVasWasXasYapuasZapuapuapuapuataatbatcatdapCapCapCapCateadlarUarUadlatfarUatgathatiatjatkatlatmatmatnatmatmaurauraurauratoatoatoatoatoatpatqatratsattatuatvatwatpatxatyatzatAatBatCatDatEadFatDatDatDatDaqgaqgaqgaqgatFatGatHatIaqmaqmaqmaqmatJaqmatKatLatMatNatOatDatPatQatRatSatSatSatSatSalralOalOalraaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaafaaaaaaaaaatTatUapkakLasQasQasQasQasQatVatWatXatYatZauaaubaucaudatZaueaucaufatWaugauhauiaujaukaukaukaulaumaunauoaupauqauzausautauuaukauvauwauxauyauBauDauCauFauEavLauGavMauratoatoatoatoatoatpauIauJauKattauLauMauNatpauOauPauQauRauSauTauUauVauWauXauYauZavaavbauRavcauSauSavdasFauRaveavfavgavaavhauRaviavaavjavkauRavlavmauSavnatSatSatSatSatSalravoalOavpaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafatTapkavqakLasQasQasQasQasQavravsavtavuavuavvavwavwavxavyavzavwavAavwavwavBavCavDavwavwavyavwavwavAavwavEavFavGavHavwavIavwavwavJavKavwavNavPavOavRavQawOavSawQauratoatoatoatoatoatpavTavUavVavWavXavYavZatpawaawbawcawdawdaweawdawfawgawhawiawjawkawlawlawmawlawlawnawoawlawlawmawpawlawqawlawrawlawlawsawtawtawuawvawwatSatSatSatSatSalrawxalOavpaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaafaaaaaaaaaatTapkawyakLasQasQasQasQasQawzawAawBawCawDawEawFawGawHawIawJawKawAawAawLawMatbawNawAawAawPawAawRawAawSawTawUawVawWawXawYawZaxaaxbaxcauyaxdauDaxeaxgaxfaxiaxhaxjauratoatoatoatoatoatpaxkaxlaxmattavZaxnaxoatpaxpaxqaxrasGaxsaxtaxuaxvaxwauXaxxaxyaxzaxAaxBaxsaxDaxsaxEasFasGaxFaxsaxGaxHaxIasGaxJaxzaxKaxLasGaxMaxNaxsaxOatSatSatSatSatSalraxPalOavpaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaafaaaaaaaaaatTapkawyakLasQasQasQasQasQawzawAawBawCawDawEawFawGawHawIawJawKaxGawAawLawMatbawNawAawAawPawAawRawAawSawTawUawVawWawXawYawZaxaaxbaxcauyaxdauDaxeaxgaxfaxiaxhaxjauratoatoatoatoatoatpaxkaxlaxmattavZaxnaxoatpaxpaxqaxrasGaxsaxtaxuaxvaxwauXaxxaxyaxzaxAaxBaxsaxDaxsaxEasFasGaxFaxsaUiaxHaxIasGaxJaxzaxKaxLasGaxMaxNaxsaxOatSatSatSatSatSalraxPalOavpaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaakLapkapkakLaxQasQasQasQasQarTaxRaxSarUaxTaxUaxVaxWaxXaxVaxYaxVaxVaxVaxVaxZatbayaarUarUarUarUarUarUarUarUarUaybaycarUaydayeayfaygayhayiaxCatmatnayjatmatmatmatmauraynatoatoatoatoatpayoaypayqattatuazvatuatpayraysaytayuatPayvatDaywayxatDatDatDatDayyayyayyayyayzayAayBayCayDayDayDayDayEayDayFayGayHayIayJayKatPayLatRayMatSatSatSatSalrayNalOalraaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaakLayOapkakLakLakLakLakLakLarTarUarUarUayPapkaxVayQayRaySayTayUayRayVaxVayWayXayYaybayZazaazbazcazcazdazeazfazgazhaybasoasoaziazjazkazlaykazmaznazoazpaykaylaymauHauHazsaztazuauHatpatpatpatpatpatpaAlatpatpazwazxazyazzasyasyayxazAazBazCazDazEazFayyazGazHazIayyazJasFazKayDazLazMayDazNazOazPayDazQazRazSazTazTazTazUalralralralralralrarRalOalraaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaakLakLapkapkapkapkaqDaqDaqDaqDaqDazVazWazWazXaxVayQayRayRazYayRayRayVaxVazZaAaaAaaAbazbazbaAcaAcaAcaAcaAcaAcaAcaAdaybaaaaaaaAeaAfaAgaAhauAazrazqaAjaAiauAaAnaAoaApaAkaAraAsaAtaAuaAvaAwaAxaAyaAzaAAaABaACaAzaADaAEaAFaAGaaaaaaayxaAHazBaAIaAIaAIaAIaAJaAKaALaAMaANaAOaAPaAPayDaAQaARaASazNaATaAUayDaAVaAWaAXaAYaAZaBaaBbaBcaBdaBdaBearRarRarRalralraaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10741,7 +10746,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSRaRyaRyaRyaRyaRyaRyaSSaSTaRyaSUaSVaSWaSXaSYaSZaTaaTbaTcaTdaTeaTfaTgaREaThaTiaREaREaREaREaREaREaTjaaaaaaaaaaTkaaaaaaaaaaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRIaTlaTlaTmaTlaTnaRMaToaTpaTqaTraTbaTbaTbaTsaTbaTtaTuaTvaTwaTxaTyaTzaTAaTBaTCaSaaTDaTEaTFaTEaTEaSeaaaaaaaaaaTkaaaaaaaaaaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRIaTGaTHaTIaTJaTKaTLaTMaTNaRyaTOaTPaTQaTRaRnaTSaTTaTUaTcaTdaTVaTWaTXaREaTYaTZaUaaUbaUcaUdaUeaUfaSeaaaaaaaaaaTkaaaaaaaaaaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRIaTlaTlaTmaTlaTnaRMaUgaUhaRyaUiaKRaUjaUkaUlaUmaUnaUmaUoaUkaUpaUqaUraREaUsaUtaSaaTDaTEaTFaTEaTEaSeaaaaaaaaaaTkaTkaTkaTkaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRIaTlaTlaTmaTlaTnaRMaUgaUhaRydnCaKRaUjaUkaUlaUmaUnaUmaUoaUkaUpaUqaUraREaUsaUtaSaaTDaTEaTFaTEaTEaSeaaaaaaaaaaTkaTkaTkaTkaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUuaUvaUvaUvaUvaUvaRyaUwaUwaRMaUxaUkaUkaUkaUyaUzaUAaUzaUBaUkaUCaUCaUCaREaUDaUEaREaUvaUvaUvaUvaUvaUuaaaaTkaTkaTkaTkaTkaTkaTkaTkaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUFaUGaUHaUFaUIaUJaUKaULaUMaUNaUOaUPaUQaURaUSaUTaUUaUVaUWaUXaUYaULaUYaUZaUMaVaaVbaVcaVdaUFaVeaVfaUFaTkaTkaTkaTkaTkaTkaTkaTkaTkaTkaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVgaVhaViaVjaVkaVlaVmaVnaVoaVpaVqaVraVraVraVraVsaVtaVuaVraVraVraVraVvaVwaVxaVyaVmaVlaVzaVAaVBaVCaVDaTkaTkaTkaTkaTkaTkaTkaTkaTkaTkaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10954,7 +10959,7 @@ aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbA aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaadaadaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKLbMDbMDbKMbMDbKNbMFbOybOzbOAbOBbOCbODbHWbOEbKXbOFbOGbOHbOIbOJbOKbOLbOMbONbOObOPbOQbORbOSbOTbOKbOUbOVbLgbNhbOWbNjbOXbOYbOZbPabDybDybDzbPbbDzbDybIxbIxbPcbPdbNsbPebIxbPfbPgbAQbCrbymbuxaaaaaaaaaaaaaaabLCbLCbPhbPibPhbPjbPkbPlbNAbNAbPmbNDbHcbNEbPmbNHbNHbPnbPobPpbPqbPrbPqbIDbIDaaaaaaaaaaaaaaabvZbPsbPtbPubPvbPvbPwbPxbPwbPwbPwbPwbPybPzbCSbPAbPAbPAbPAbPBbPAbPAbPAbPAbPAbPAbPAbPCbPDbSWbPFbPFbPFbPFbPFbPFbPFbTabPHbPIbPJbPKbPLbJvbPMbPNbMubPObPPbPQbMybPRbPSbTCbMBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMCbKMbKMbKMbKMbKNbKObPUbPVbPVbPWbPXbPYbHWbPZbQabQbbQcbDibQdbQebQfbQgbQhbQibQhbQhbQjbQhbQgbQkbQlbQmbQnbQobQpbQkbQqbQrbQsbOZbQtbQubQvbQwbQxbQybQzbQAbQBbQCbQDbNsbQEbIxbQFbPgbAQbCrbQGbuxaaaaaaaaaaaabLCbLCbQHbQIbQJbQKbQLbQMbQNbQJbQObQPbQQbHcbQRbQPbQSbNEbQTbQUbQVbQWbNEbQXbQYbIDbIDaaaaaaaaaaaabvZbQZbvZbvZbPvbRabRbbRcbRdbRebRfbRgbRhbRibEsbRjbRkbRlbRmbRnbRobRpbRqbRrbRsbRtbPAbPCbRubRvbRwbRxbPFbRybRzbRAbPFbRBbRCbPIbPIbRDbREbRFbRGbRHbRIbRJbKBbKKbKBbKBbKBbKBbKGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabHWbRKbRLbRMbRNbRObRPbHWbRQbRRbQbbRSbDibRTbRUbQgbQgbRVbRWbRXbRYbRZbSabSbbQkbScbSdbSebSfbSgbShbSibSjbSkbEVbSlbSmbSnbSobSpbSqbSrbSsbStbStbSubStbStbStbStbuxbuxbCrbSvbuxaaaaaaaaabLCbLCbQHbQIbSwbSwbSxbSybSzbSAbSAbSBbSCbSDbSEbSFbSGbSHbSIbSJbSJbSKbSLbSMbSMbQXbQYbIDbIDaaaaaaaaabvZbSNbSObSPbPvbSQbSRbSSbSTbSUbSVbWObSXbSYbSZcdnbTbbTcbTdbTdbTdbTebTfbTgbThbTibTjbPCbTkbTlbTmbTnbTobTobTobTobPFbTpbTqbTrbPIbTsbTtbKBbTubTvbTwbTxbTybTzbTAbTBbJvaaaaaaaabaaaaaaaaaabcaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaafaaaaaaaaabKLbVibKLbVibKLbVibKLbVibKLbVibKLbViaafaafbTDbTEbTDbTDbTDbTDbTDbTEbTFbTGbTDbBEbTHbQbbTIbDibTJbTKbQgbTLbTMbTNbTObTPbTQbTRbTSbQkbTTbTUbTVbTWbTXbTYbTZbSjbUabEVbUbbUcbUdbUebUfbUgbUhbUibStbUjbUkbUlbUlbUmbStbUnbymbCrbUobGZaaaaaaaaabLCbUpbQIbSwbUqbUrbUsbUtbUubUvbUwbUxbUybUzbUAbUBbQPbUCbNEbUDbUEbUFbUGbUHbUIbSMbQXbUJbIDaaaaaaaaabvibUKbxibULbPvbUMbUNbUObUPbUQbURbUSbUTbUUbUVbRjbUWbUXbUYbUZbUYbVabTibVbbVcbVdbVebPCbVfbVgbVhbVxbVjbVkbTobVlbPFbVmbVnbVobPIbVpbVqbKBbVrbVsbVtbVtbVtbVsbVsbVubHVaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaafaaaaaaaaabKLbVibKLbVibKLbVibKLbVibKLbVibKLbViaafaafbTDbTEbTDbTDbTDbTDbTDbTEbTFbTGbTDbBEbTHbQbbTIbDibTJbTKbQgbTLbTMbTNbTObTPbTQbTRbTSbQkbTTbTUbTVbTWbTXbTYbTZbSjbUabEVbUbbUcbUdbUebUfbUgbUhbUibStbUjbUkbUlbUlbUmbStbUnbymbCrbUobGZaaaaaaaaabLCbUpbQIbSwbUqbUrbUsbUtbUubUvdNgbUxbUybUzbUAbUBbQPbUCbNEbUDbUEbUFbUGbUHbUIbSMbQXbUJbIDaaaaaaaaabvibUKbxibULbPvbUMbUNbUObUPbUQbURbUSbUTbUUbUVbRjbUWbUXbUYbUZbUYbVabTibVbbVcbVdbVebPCbVfbVgbVhbVxbVjbVkbTobVlbPFbVmbVnbVobPIbVpbVqbKBbVrbVsbVtbVtbVtbVsbVsbVubHVaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabVvbVwbVAbVwbVAbVwbVAbVwbVAbVwbVAbVwbVybVzbVEbVBbVCbVDbVBbXpbVBbVFbVGbVHbVIbBEbVJbVKbVLbVMbVNbVObQgbVPbTMbVQbVRbVSbVTbTRbVUbQkbVVbVWbVXbVYbVZbWabNjbWbbWcbWdbWebWfbWgbWhbWibWjbUhbWkbWlbWmbWnbWobWpbWqbStbWrbymbCrbWsbGZaaaaaabLBbLBbWtbQJbSwbWubWvbWwbWxbWybWxbWxbWzbWAbKjbWBbWCbWDbWDbWEbWFbWGbWDbWDbWHbUHbSMbNEbWIbLHbLHaaaaaabvibUKbxibWJbPvbWKbWLbWMbUPbWNbPvbPvbxHcfqbxHbPCbPCbWPbWQbWRbWSbVabWTbWUbWVbWWbWXbPCbWYbWZbXabXbbVjbXcbTobXdbPFbXebXfbXgbPIbXhbBvbKBbVrbXibXjbXkbXlbXmbXnbVubGsaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabMCbKMbKMbKMbKMbKMbKMbKMbKMbKMbKMbKMbVybXoccAbXqbXrbXsbXtbXrbXsbXubXvbXwbXxbBEbXybXzbKZbDibXAbXBbQgbXCbTMbTObXDbXEbTObTRbXFbQkbXGbXHbXIbXJbXKbXLbXMbXNbXObGLbXPbUcbQwbXQbXRbXRbXSbQwbStbXTbXUbXVbXWbXXbStbWrbymbCrbDLbGZaaaaaabLBbXYbXZbYabYbbYcbWwbWwbYdbYebYfbWwbYgbWAbWAbYhbWDbWDbYibYjbYkbYlbYmbWDbWDbYnbYobYpbYqbYrbLHaaaaaabvibUKbYscvCbPvbYtbYubYubYvbYwbUSbYxbYybYzbYAbYBbRjbYCbYDbYDbYDbYEbYFbYFbYGbYHbYFbYIbYJbYKbYLbYMbTobTobTobYNbPFbYObYPbYQbPIbRDbREbKBbYRbKBbKBbKBbKBbKBbKBbKBbKBbYSbYSaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaabKLbVibKLbVibKLbVibKLbVibKLbVibKLbViaadbYTbYUbYVbYWbYXbYVbYWbYXbXubYYbYZbZabBEbZbbZcbZbbDibZdbZebQgbZfbZgbZhbZibXEbZhbZjbZkbQkbZlbZmbZnbZobZpbZqbSibOXbEVbEVbSlbZrbZsbQwbQwbQwbQwbZtbStbZubStbZvbStbStbStbuxbymbCrbZwbuxaaaaaabLCbZxbZybZzbZAbZBbZCbZDbZEbZFbZGbWwbZHbZHbZIbZJbWDbZKbZLbZMbZMbZNbZObZPbWDbZQbZRbZSbYqbZTbIDaaaaaabvZbUKbAUbvZbPvbZUbZVbZWbZWbZXbZYbZZcaacabcaccadcaecafcagcagcagcahcaicajcakcalcambYIcancaocapcaqbPFcarcascatbPFcaucavcawbPIbRDbREcaxcaycazcaAcaBcaCcaDcaEcaFcaGcaHcaIcaIcaHcaHcaHcaHcaHaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10963,9 +10968,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabMCcdRbMCcdRbMCcdRbMCcdRbMCcdRbMCcdRaafaafbTDcehcdScdTcdUcdVcdTcdWcdXcdYcdZceacebceccedceebXAcefcegcfEceicejcekcekcekcekcekcekcekcekcekcelcemcenceocepceqceqcerbuxcescescetbDLceubymbAQbAQbvFbvGbuxcevbuxbuxbymbCrcewbuxaaaaaabLBcexccYbQJceycezceAceBceCceDceEceFceGceHceHceIceHceHceHceJceKceLceMceNbWDbNEceObNEcbObNGbLHaaaaaabvZcePceQceQceQceRceSbxiceTceUbvZceVceWceXceWceYceZcfacfbcfccfdcfebYIbYIcffcfgbYIbYIcfhcficficfjcfkcflcfmcfmcfmcdvcfnbxHcfocfpbOncoHcfrcfscftccrccsccscdIcdIcaFcaHcfucfvcfwcfxcfycfzcfAcfBcfCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaabTDcfDbXrcfFciGcfGcfHbXucfIcaMcaMcaMcaMcfJcfKcfLcfMcfNcfOcfOcfPcfQcfRcfRcfRcfRcfRcfRcfRcencencencfScfTcfUcfVcfWcfXcfYcfZcgacgbcgacgacgacgacgacgccgccgccgccgdcgccgccgccgecgfbuxbLCbLCbLBcggccYcghcgicgjcgkcglcglcgmceEcgnbWAbWAbWAbWAbWAbWAbWAcgnbWEcgocgpcgqbWDcgrcgscgtcgucgvbLHcgwcgwbvZbUKbxibAUbCCbCDcgxbxicgybxicgzcgAcgBcgCcgDcgAcgEcfacgFcgGcgHcgIcgJcgKcgLcgMcgNcgNcgOcdtcdtcdtcdtcdtcdtcdtcfmcdvcgPbxHcgQcgRcgScaxcgTcgUcgVccrccscdIcgWcgXcaFcaHcgYcgZchacaHcaIchbcaIcaHcaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaabTEbTDchcchcbTDchdchechfbXuchgchhchichjchkchlchmchnchochpchqchrchschtcfRchuchuchuchuchuchvchwchxcenchychzchAchBchCchDchEbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxchFchGchHchIbLBchJchKchLchMchNcgkcgkchOchPceEchQbWAchRchRchRchRchRbWAchSbWDchTchUbWDbWDchVchWchVchXchYchZciacibciccidbvgbvZbvZbvZbvZbvZbvZbvZbvZciecifcigcihcieceZceZceZciiceZceZceZceZcijcikcgNcilcimcinciociociociociocdtcdvcdvcaGbxHcoIbxHbxHcaxciqcaxcaxccrcaFcaGcaHcaHcaHcaHcircgZciscitciucivciwcixcaHcaHaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafciybTDcizciAciBciCciDciEciFcmCciHciIciJciKciLciMciNciOciPciQciRcfOciSciTcfRchuchuchuchuchuciUciVciWciXciYciZcjacjbcjccjdcjecjfcjgchCcjdcjhcjicjbcjjcjkcjlcjmcjbcjncjociWcjpcjqcjrcjscjtcjucjvbUwbUwcjwcjxcjycjzcgkceEceEceEcdcbWAchRchRchRchRchRbWAcgnbWDbWDbWDbWDciacjAcjBcjCcjDcjDcjEcjFcjGcjHcjIcjJcjKcjLcjMcjNcjOcjPcjQcjRcjNcjOcjScjTcjUcjVcjWcjXcjTcjYcjZckackbcijckcckdckeckfckgciociociociociocdtckhcdvckickjckkcklcaGckmcknckockpcaCckqckrcaHckscktcaHckucgZcdMcdMcdMcgZcdMckvckwcaIaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafciybTDcizciAciBciCciDciEciFcmCciHciIciJciKciLciMciNciOciPciQciRcfOciSciTcfRchuchuchuchuchuciUciVciWciXciYciZcjacjbcjccjdcjecjfcjgdVxcjdcjhcjicjbcjjcjkcjlcjmcjbcjncjociWcjpcjqcjrcjscjtcjucjvbUwbUwcjwcjxcjycjzcgkceEceEceEcdcbWAchRchRchRchRchRbWAcgnbWDbWDbWDbWDciacjAcjBcjCcjDcjDcjEcjFcjGcjHcjIcjJcjKcjLcjMcjNcjOcjPcjQcjRcjNcjOcjScjTcjUcjVcjWcjXcjTcjYcjZckackbcijckcckdckeckfckgciociociociociocdtckhcdvckickjckkcklcaGckmcknckockpcaCckqckrcaHckscktcaHckucgZcdMcdMcdMcgZcdMckvckwcaIaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackxckyckzckAckBckCckDckEckFckGckHckIckJckKckLckMchnbLgckNcfOcfOckOcencfRchuchuchuchuchuckPckQckRckSckTckUckVckWckXckWckYckUckZckUckUclaclbckUckUclccldcledhndhpdhqclhclicljclkcllclmcllcllcllcllcllclncloclpbYhclqclrceHclsbWAchRchRchRchRchRbWAcltbZJcluclvclwclxclyclzclAclAclAclAclAclBclCclDclEclFclGclHclIclHclHclJclKclHclIclLclHclMclHclHclNclHclHclOclPclJclQclRclSclTclUclVciociociociociocdtclWcdvclXclYclZcmacmbcmccmdcmecmfcmgcmhcmicmjcmkcmlcmmcmncmocmpcmqcmrcmscmtcdMcmucmvaafaafaafaadaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaaabTDcmwciAcmxcmycmzcmAcmBcrAcmDcmEcmFcmGcmHcmIcmJcmKcfOcfOcfOcmLcmMcmNcfRchuchuchuchuchucmOcmPciWciXcmQcmRcmScmTcjccmUcmVcmWcmXchCdhscmYcmZcmTcnacnbcnccndcngdhSdiqcnhcnicnjcnkcnlcnmcnncnobUwbUwcnpcnqcnrcnsbWAcntcnucddcddbWAchRchRchRchRchRbWAcnvcnwcnxcnybWAcnzcnAcnBcnCcnDcnDcnEcnFcnGcnHcnIcnJcjKcjLcjPcnKcjPcjPcnLcnMcnNcnOcnPcnQcnRcnRcnScnTcnLcnRcnUcnVcnWcnXckcckdcnYcnZcoaciociociociociocdtcobcoccaGcodcoecofcaGcogcohcogcoicojcokcolcaHcomconcaHcoocopcoqcdMcorcgZcdMcoscotcaIaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaaabTDcmwciAcmxcmycmzcmAcmBcrAcmDcmEcmFcmGcmHcmIcmJcmKcfOcfOcfOcmLcmMcmNcfRchuchuchuchuchucmOcmPciWciXcmQcmRcmScmTcjccmUcmVcmWcmXchCdhscmYcmZcmTcnacnbcnccndcngdhSdiqcnhcnicnjcnkcnlcnmcnncnobUwbUwcnpcnqcnrcnsbWAcntcnucddcddbWAchRchRchRchRchRbWAcnvcnwcnxcnybWAcnzcnAcnBcnCcnDcnDcnEcnFcnGcnHcnIcnJcjKcjLcjPcnKcjPcjPcnLcnMcnNcnOcnPcnQdVycnRcnScnTcnLcnRcnUcnVcnWcnXckcckdcnYcnZcoaciociociociociocdtcobcoccaGcodcoecofcaGcogcohcogcoicojcokcolcaHcomconcaHcoocopcoqcdMcorcgZcdMcoscotcaIaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaabTEbTDchcchcbTDcoucovcowbXucoxchhcoycozcoAcoBcoCcoDcoEcoFcoGcmLcrQcrOcfRchuchuchuchuchuchvcoJcoKcencencoLchEcoMchCcoNcoOcoPcoPcoPcoPcoPcoPcoQcoQcoRcoScoQdirdwgdwqditcoTcoVcoWchGcoXcnsbLBcoYchKchLcoZchNbLBbWAcgncpacpbcpcbWAchRchRchRchRchRcpdcpdcpecpdcpdcpdcpdcpfchWchVchXcpgchZcphcpiciccpjcpkcpkcpkcplcpmcpncpncpncpncpncpocpncpncpncpncpncpncppcpqcprcnVcpsciecptcgNcpuciecinciociociociociocdtcpvcdvcaGcpwcpxcpycpzcpzcpzcpAcpzcpBcpzcpzcaHcaHcaHcaHcpCcpDcpEcpFcpGcpHcpIcpJcaHcaHaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaabTDcpKcpLcpMcpNchecmDbXucpOcpPcpPcpQcpPcpRcpScpPcoEcmLcmLcmLcpUcpTcfRcfRcfRcfRcfRcfRcfRcencencencpVcpWcpXcpYcpZcqacpXcqbcqccqdcqecqfcqgcqhcqicqjcqkcqlcoQdwTdwWdwTdwUcqncqocoVbLCbLCcqpcqqcqrcqscqtcqubWzcqvcqwcqxcqxcqxcqycqycqzcqAcqBcqpcpdcqCcqDcqEcqFcqGcpdcqHcqIcjCcqJcqKchZcgwcgwcpkcqLcqMcqNcqOcqPcqPcqQcqRcqScqTcqUcqVcqWcqXcqYcqZcracracrbcrccrdcrecrfcrgcrhcrhcrhcricdtcdtcdtcdtcdtcdtcdtcfmcdvcrjcpwcrkcrlcrmcrncrocrpcrqcrrcrscrtcrucrvcrvcaHcrwcgZcrxcaHcaIcrycaIcaHcaHaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabKLbVibKLbVibKLbVibKLbVibKLbVibKLbViaafaafbTDcrzbXrctqcrBcrCcrDcrEcrFcrGcrHcrIcrJcrKcrLcpPcuXcrMcrNcrNcrPcuZcrRcrRcrRcrScrTcrUcrVcpVcpVcrWcpVcencrXcrXcrXcrXcrXcoPcrYcrZcsacsbcsccoQcsdcsecsfcsgcoQdyidypdybdwUcshcqocoVaaaaaacqpcsicqrcsjcskcslbWzcsmcsncqxcsocspcsqcsrcsjcsjcsjcsscstcsucsvcswcsxcsycpdcszcsAcjDcsBcsCchZaaaaaacpkcsDcsEcsFcpkcsGcsHcpncsIcsJcsKcsLcsMcsNcsOcsPcsQcsRcsScpncsTcsUcsVcsVcsWcrhcdvcdvcsXcfmcfmcfmcfmcfmcfmcfmcfmcdvcsYcpwcsZctacrmctbctcctdctectfctgcthcticrvcrvctjctkctlctmcaIctnctoctpcaHaaaaaaaaaaaaaadabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10974,7 +10979,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabMCcdRbMCcdRbMCcdRbMCcdRbMCcdRbMCcdRaadbYTcwQcwUcwScwTcxtcwScwTcwVcwWcwXcwYbTDcfRcrMcrNcrNcrNcwZctDcxacxccxdctDcvacxectHctHctIcxfcxgcxhcxicxjcxkcxlcxlcxlcxmcxncxocxpcxqcxrcxscFGcxucxvcxwcxxcvvcoQdwUdwUdwUdwUcoVcqocoVaaaaaactUcxycqrcxzcxAcxBbWzcxCcxDcqxcxEcxFcxGcsrcxHcxIcxJcvKcxKcxLcxMcxNcxOcxPcpdcvRcxQcxRcxScxTcgwaaaaaacpkcsDcuucxUcxVcxWcxXcxYcxZcyacybcyccuzcydcyecyfcygcyhcyicyjcykcylcymcyncyocypcyqcyrcyscyrcytcwwcyucyvcywcwAcyxcyycyzcwEcyAcyBcrmcrmcrmcrmcrmcrmcrmcrmcrmcpzcpzcaHcyCcaIcaHcaHcaHcaHcaHaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaadaaaaaaaaabKLbKMbKMbKMbKMbKMbKMbKMcyDbKMbKMbKMbVybXocyEcyFcyGcyHcyIcyJcyHcyKcyLcyLcyMbTDcfRcyNcmLcyOcyOcyPcyOctDcyRcyQctDctDcyTcyUcyVctIcyWcyXcyYcyZczaczbcxlcxlczcczdczeczfctOczgczhcziczjctOcoQcoQczkcoQcoQcqmcqmcqmcqmcoVcqoczlaaaaaacqpcsicqrczmcznczobWAbWAczpcqxcxEczqczrcsrcsjcvAcsjczscpdcztczuczvczwcpdcpdczxczyczzczAczBchZaaaaaaczCcsDcuuczDczEcxWczFczGcxZczHczIczJcuzczKcyeczLczMczNczOczPczQczRczSczTczUczVczWczXczYczXczZcAacAbcAccAdcwAcAecAfcAgcwEcAhcAicAjcAkcAlcAmcAncAocApcAqcArcAsbYScAtcAuaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabVvcczcdQcczcdQcczcdQcczcdQcczcdQcczbVyccBbTDbTDcAvcAwcAxbXpcAxcAycyLcyLcAzbTDcfRcyNcmLcyOcAAcABcACctDcAEcyScAFctDcAGcAHcAIctIcAJcAKcALcAMcANcAOcAPcAQcAQcARczecAScATcAUcAVcAWcAXctOcAYcAZcBacBbcBccqmcBdcqmcBecoVcqoczlaaaaaacqpcqpcBfcsjcuhcBgcBhbWAcBicqxcqxcqxcqxcBjcBkcBlcBkcBmcpdcpdcBncBocpdcpdcBpcBqcBrcjDcBschZchZaaaaaaczCcsDcuucuucBtcBucBvcBwcxZcBxcBycBzcuzcBAcBBcBCcBCcBDcBEcBFcBGcBHcBIcwocBJcypcBKcBLcBMcBNcBOcuGcBPcBQcBRcwAcBScBTcBUcwEcBVcBWcBXcBYcBYcAmcBZcCacCbcAmcAmcAsaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaabMCcdRbMCcdRbMCcdRbMCcdRbMCcdRbMCcdRaafaafaafbTEbTDbTDbTDbTDbTDbTDbTDbTDbTDbTDcfRcCccencyOcCdcABcCectDcCfcADcNpcCjcCkcClcCmctIcCncCocCpcCqctIcCrcCscCtcCtcCucCvcCwcxpcCxcCycxrcCzctOcAYcCAcCBcCCcBbcBbcqmcBdcqmcoVcqoczlaaaaaaaaactUcCDcCEcuhcCFcCGcCHcCIcCJcCKcCKcCLcCMcCNcskcCOcCMcCPcnDcCQcCRcCScCTcCUcCVcBrcCWcCXcgwaaaaaaaaaczCcsDcCYcuucCZcDacDbcDccxZcDdcDecDdcuzcDfcyecDgcDhcDicDjcDkcDlcwmcDmcwocDncypcDoczXcDpczXcDqcuGcDrcDscDtcwAcDucDvcDwcwEcDxcDycDzcDAcDBcDCcDDcDEcApcDFcDGcAsaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaabMCcdRbMCcdRbMCcdRbMCcdRbMCcdRbMCcdRaafaafaafbTEbTDbTDbTDbTDbTDbTDbTDbTDbTDbTDcfRcCccencyOcCdcABcCectDcCfcADcNpcCjcCkcClcCmctIcCncCocCpcCqctIcCrcCscCtcCtcCucCvcCwcxpcCxcCycxrcCzctOcAYcCAcCBcCCcBbcBbcqmcBdcqmcoVcqoczlaaaaaaaaactUcCDcCEcuhcCFcCGcCHcCIcCJdVzcCKcCLcCMcCNcskcCOcCMcCPcnDcCQcCRcCScCTcCUcCVcBrcCWcCXcgwaaaaaaaaaczCcsDcCYcuucCZcDacDbcDccxZcDdcDecDdcuzcDfcyecDgcDhcDicDjcDkcDlcwmcDmcwocDncypcDoczXcDpczXcDqcuGcDrcDscDtcwAcDucDvcDwcwEcDxcDycDzcDAcDBcDCcDDcDEcApcDFcDGcAsaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacDHcDIcDJcDKcDLcDLcDMcDNcXVcChcCgcPXcyOcDRcDScDTctDctDctDctDcDUcDVcDWcDUctIcDXctIcDYcDZctIcEacEbcEccEccEdcEecEactOcEfcEgcEhcEictOcEjcEjcEjcEkcEjcBbcBbcBbcqmcoVcqocoVaaaaaaaaactUctUcElcCEcuhcuhcEmcEncEocEocEpcEqcErcEscEtcEucErcEvcEwcExcExcEycEzcBrcBrcCWcEAcgwcgwaaaaaaaaacpkcsDcEBcuucuucECcEDcEEcxZcEFcEGcEHcuzcEIcEJcEKcELcEMcENcEOcEPcEQcERcEScETcuGcEUcEVcEWcEXcEYcuGcDOcFacFbcwAcFccFdcFecwEcFfcFgcFhcFicFjcAmcFkcFlcFmcAscAscAsaafaafaafabcaafaaaaaaaagaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacDHcFncFocFpcFqcDHcDHcDHcMXcEZcDPcFtcyOcyOcyOcyOcGTcFvcFwcFxcDUcFycFzcFAcFBcFCcFDcFEcFFctIcOlcFHcFIcFJcFKcFLcFMctOcxpcFNcxpcFOctOcFPcFQcFRcFScEjcoVcoVcFTcoVcoVcFUcoVaaaaaaaaaaaactUctUcElcCEcsjcFVcFWcFXcFYcsjcFZcGacGbcskcGccGacGdcjDcGecGfcGgcGhcjDcCWcEAcgwcgwaaaaaaaaaaaacpkcsDcGicGjcGkcGlcGmcGncGocGpcGqcGrcuzcGscuzcuzcGtcGucGtcuycuEcGvcuEcGwcuEcuGcwwcGxcGycwwcuGcuGcGzcGAcFrcwAcwEcGCcwEcwEcFfcFgcFhcGDcGEcAmcGFcGGcGHcAsaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacFpcGIcFpcGJcGKcGLcDHcGMcGBcLFcFscGPcGQcGRcGScGTcFucGUcGVcFxcDUcGWcGXcGYcGZcHacDUcHbcHccHdcHecHfcHgcHgcHhcHicHjcHkcHlcHmcHncHocEjcHpcHqcHrcHscEjcHtcHucBbcHvcHwcHxcoVaaaaaaaaaaaaaaactUctUcHycHzcHycHAcHBcHCcHDcHDcHEcslcskcslcHEcHFcHFcHGcHHcHIcHJcHKcHJcgwcgwaaaaaaaaaaaaaaacpkcHLcHMcGjcHNcHOcHPcHQcHRcHScHTcHUcHVcHWcHXcHYcHZcIacHUcIbcIccIdcIecIfcIgcIhcIicIjcIkcIlcImcIncIocIpcIqcIrcIscItcIucIvcIwcIxcIycIzcIAcAmcAmcIBcAmcAsaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11015,7 +11020,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUrcAYdltdiMdludjsdlvdjsdkYdlwdlxdlydlzdlAdlBdlCdlDdlDdlEdlFdlGdlHdiMdfkdlIdlJdlKdlLdlMdlNdlOdlPdlQdlRddzdlSdixdlTdlUdlVdixdlWdlWdlXdlYdlZdmadmbdmcdmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUrcUrcUrcUrcUrcUrcUrdmediMdiMdmfdmgdmhdkYdmidlxdmjdlzdmkdmldmjdmmdmndkxdmodmpdmqdiMdmrdmsdmtdmudmvdmwdmxdmydmzdmAdmBdmCdmDdixdixdixdixdixdixdixdixdixdmEdmFdmFdmFdmGdmGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdmHdmHdmIdmHdmHdmJdmKdmLdmMdiMdmNdmOdmOdmPdmQdiMdiMdiMdiMdiMdiMdiMdiMdiMdiMdiMdiMdmRdmSdcLdmTdmUdmUdmUdmUdmUdmUdmUdmUdmUdmUdmUdmVdmWdmVdmXdmYdmZdnadmVdnbdncdmFdnddnednfaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdrgdrgdrgdnidnidmKdnjdnkdnkdnldnkdnmdnndnodnpdnqdnrdnsdntdnudnvdnwdnxdnydnzdnAdnBdfkcUKdnCdmUdnDdnEdnFdnGdnHdnIdmUdnJdnKdmUdmXdmXdmXdmXdmXdmXdmXdmXdnLdnMdnNdnMdnOdnfaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdrgdrgdrgdnidnidmKdnjdnkdnkdnldnkdnmdnndnodnpdnqdnrdnsdntdnudnvdnwdnxdnydnzdnAdnBdfkcUKdVAdmUdnDdnEdnFdnGdnHdnIdmUdnJdnKdmUdmXdmXdmXdmXdmXdmXdmXdmXdnLdnMdnNdnMdnOdnfaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmIdnPdnQdnRdnRdnSdmIdnTdnUdnVdnWdnXdnYdnZdoadobdocdoddoedofdogdohdoidojdokdoldomdomdomdondoodopdmUdmUdmUdoqdordosdotdoudovdowdmUdoxdoydozdoAdoBdoCdoDdmXdnbdnMdmFdoEdoFdnfaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdoGdoHdoHdoIdoJdoKdoLdoMdoNdoOdoPdoQdoRdoPdoPdoOdoSdoTdoUdoVdoWdoXdoYdoZdpadpbdoYdfkdpcdpddmUdpedpfdpgdphdpidpjdmUdpkdnKdmUdpldpmdpndpodppdpqdprdmXdnbdpsdmFdmFdmGdmGaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdptdoHdoHdoIdoJdoKdoLdpudpvdoOdpwdpxdpydpzdpAdoOdpBdpBdpCdpBdpDdpEdpFdpGdpFdpHdpIdpJdpcdpKdmUdmUdmUdmUdpLdmUdmUdmUdmUdmUdmUdpMdpmdpndpNdpOdpmdpPdmXdpQdnMdVtdpRdmGaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11227,7 +11232,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdLhdLidLjdLkdLldLmdLndKFdLodKHdLpdLqdLrdLrdLsdLtdKLdLudLvdLwdKKdLxdLydLzdIedISdISdISdISdISdIedLAdLBdLCdKWdLDdLEdLFdKVdLGdLHdLIdLadAVdAVdIudLJdJhdLKdLLdLMdLNdLOdLPdLQdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdKAdKAdKBdKAdKCdLRdLSdLTdLUdLVdKHdKHdLWdLXdLYdLZdKLdMadMbdMcdKKdMddMedIedMfdMgdMhdMidMjdIedMkdIedMldMddKWdMmdMndModKVdMpdMqdMrdLadAVdAVdMsdMtdMudMvdMwdLedLfdLgdLfdLfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdMxdMxdMxdMxdMxdMydMzdKHdMAdMBdMCdMDdMDdMEdKLdMFdMGdMHdKKdMIdMJdMKdMLdMMdMNdMNdMNdMOdMPdMQdMNdMRdKWdMSdMTdMUdKVdMVdMWdMXdLaaaaaaadMYdMZdNadMYdMYdMYdMYdMYdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaadabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdNbdNcdKHdKHdKHdKHdKHdKHdKHdKKdKKdKKdKKdKKdNddNedNfdNgdNhdNhdNidNjdNkdNldNmdNndNodKWdKWdKWdKWdKWdLadLadLadLaaaaaaadMYdNpdNqdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdNbdNcdKHdKHdKHdKHdKHdKHdKHdKKdKKdKKdKKdKKdNddNedNfdVBdNhdNhdNidNjdNkdNldNmdNndNodKWdKWdKWdKWdKWdLadLadLadLaaaaaaadMYdNpdNqdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdNrdNsdMxaaaaaadNtdNudNvdNwdNxdNydNzdNAdNtdNBdNCdNDdNEdNFdNGdNHdNGdNEdNEdNDdNIdNJdNKdNLdNMdNNdNOdNKdNPdNQdNKaaaaaadMYdNRdNSdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaafaafaafaadaXGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdNbdNTdMxaaaaaadNtdNUdNVdNWdNXdNYdNZdOadNtdObdOcdIedOddOedHBdHAdHBdOfdOgdIedOhdOidNKdOjdOkdOldOmdOndOodOpdNKaaaaaadMYdOqdOrdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdNbdOsdOtaaaaaadOudNydOvdOwdOxdOydOzdOAdOBdOCdODdOEdOddOFdOGdOHdOIdHBdOJdOKdOLdOMdONdOOdOPdOQdORdNKdOSdOTdNKaaaaaadOUdOVdOWdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/southern_cross/southern_cross_areas.dm b/maps/southern_cross/southern_cross_areas.dm index ffa2ca4d1a..d65c2a9882 100644 --- a/maps/southern_cross/southern_cross_areas.dm +++ b/maps/southern_cross/southern_cross_areas.dm @@ -659,6 +659,7 @@ /area/tcomm/ icon_state = "tcomsatcham" ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') + holomap_color = HOLOMAP_AREACOLOR_COMMAND /area/tcomm/entrance name = "\improper Telecomms Teleporter" @@ -739,22 +740,27 @@ /area/crew_quarters/heads/sc/hop name = "\improper Command - HoP's Office" icon_state = "head_quarters" + holomap_color = HOLOMAP_AREACOLOR_COMMAND /area/crew_quarters/heads/sc/hor name = "\improper Research - RD's Office" icon_state = "head_quarters" + holomap_color = HOLOMAP_AREACOLOR_SCIENCE /area/crew_quarters/heads/sc/chief name = "\improper Engineering - CE's Office" icon_state = "head_quarters" + holomap_color = HOLOMAP_AREACOLOR_ENGINEERING /area/crew_quarters/heads/sc/hos name = "\improper Security - HoS' Office" icon_state = "head_quarters" + holomap_color = HOLOMAP_AREACOLOR_SECURITY /area/crew_quarters/heads/sc/cmo name = "\improper Medbay - CMO's Office" icon_state = "head_quarters" + holomap_color = HOLOMAP_AREACOLOR_MEDICAL /area/engineering/engineer_eva name = "\improper Engineering EVA" @@ -896,6 +902,9 @@ //Deck Three (Z-3) +/area/ai + holomap_color = HOLOMAP_AREACOLOR_COMMAND + /area/ai/ai_cyborg_station name = "\improper Cyborg Station" icon_state = "ai_cyborg" @@ -921,6 +930,7 @@ name = "\improper Command - Station Director's Office" icon_state = "captain" sound_env = MEDIUM_SOFTFLOOR + holomap_color = HOLOMAP_AREACOLOR_COMMAND area/crew_quarters/heads/sc/hop/quarters name = "\improper Command - HoP's Quarters" @@ -980,6 +990,7 @@ area/crew_quarters/heads/sc/hop/quarters /area/maintenance/solars icon_state = "SolarcontrolA" sound_env = SMALL_ENCLOSED + holomap_color = HOLOMAP_AREACOLOR_ENGINEERING /area/maintenance/solars/aftportsolar name = "Solar Maintenance - Aft Port" diff --git a/maps/southern_cross/southern_cross_defines.dm b/maps/southern_cross/southern_cross_defines.dm index 2fa51eef61..6010cac824 100644 --- a/maps/southern_cross/southern_cross_defines.dm +++ b/maps/southern_cross/southern_cross_defines.dm @@ -19,6 +19,11 @@ lobby_icon = 'icons/misc/title.dmi' lobby_screens = list("mockingjay00") // New lobby screen if possible. + holomap_smoosh = list(list( + Z_LEVEL_STATION_ONE, + Z_LEVEL_STATION_TWO, + Z_LEVEL_STATION_THREE)) + zlevel_datum_type = /datum/map_z_level/southern_cross station_name = "NLS Southern Cross" @@ -105,26 +110,40 @@ // Todo: Forest generation. return 1 +// For making the 6-in-1 holomap, we calculate some offsets +#define SOUTHERN_CROSS_MAP_SIZE 160 // Width and height of compiled in Southern Cross z levels. +#define SOUTHERN_CROSS_HOLOMAP_CENTER_GUTTER 40 // 40px central gutter between columns +#define SOUTHERN_CROSS_HOLOMAP_MARGIN_X ((HOLOMAP_ICON_SIZE - (2*SOUTHERN_CROSS_MAP_SIZE) - SOUTHERN_CROSS_HOLOMAP_CENTER_GUTTER) / 2) // 100 +#define SOUTHERN_CROSS_HOLOMAP_MARGIN_Y ((HOLOMAP_ICON_SIZE - (3*SOUTHERN_CROSS_MAP_SIZE)) / 2) // 60 + /datum/map_z_level/southern_cross/station flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES + holomap_legend_x = 220 + holomap_legend_y = 160 /datum/map_z_level/southern_cross/station/station_one z = Z_LEVEL_STATION_ONE name = "Deck 1" base_turf = /turf/space transit_chance = 6 + holomap_offset_x = SOUTHERN_CROSS_HOLOMAP_MARGIN_X - 40 + holomap_offset_y = SOUTHERN_CROSS_HOLOMAP_MARGIN_Y + SOUTHERN_CROSS_MAP_SIZE*0 /datum/map_z_level/southern_cross/station/station_two z = Z_LEVEL_STATION_TWO name = "Deck 2" base_turf = /turf/simulated/open transit_chance = 6 + holomap_offset_x = SOUTHERN_CROSS_HOLOMAP_MARGIN_X - 40 + holomap_offset_y = SOUTHERN_CROSS_HOLOMAP_MARGIN_Y + SOUTHERN_CROSS_MAP_SIZE*1 /datum/map_z_level/southern_cross/station/station_three z = Z_LEVEL_STATION_THREE name = "Deck 3" base_turf = /turf/simulated/open transit_chance = 6 + holomap_offset_x = HOLOMAP_ICON_SIZE - SOUTHERN_CROSS_HOLOMAP_MARGIN_X - SOUTHERN_CROSS_MAP_SIZE - 40 + holomap_offset_y = SOUTHERN_CROSS_HOLOMAP_MARGIN_Y + SOUTHERN_CROSS_MAP_SIZE*1 /datum/map_z_level/southern_cross/empty_space z = Z_LEVEL_EMPTY_SPACE diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm index 3abacab033..05153e5ba9 100644 --- a/maps/~map_system/maps.dm +++ b/maps/~map_system/maps.dm @@ -51,6 +51,12 @@ var/list/all_maps = list() //Also including them lets us override already created jobs, letting us keep the datums to a minimum mostly. //This is probably a lot longer explanation than it needs to be. + var/list/holomap_smoosh // List of lists of zlevels to smoosh into single icons + var/list/holomap_offset_x = list() + var/list/holomap_offset_y = list() + var/list/holomap_legend_x = list() + var/list/holomap_legend_y = list() + var/station_name = "BAD Station" var/station_short = "Baddy" var/dock_name = "THE PirateBay" @@ -157,6 +163,12 @@ var/list/all_maps = list() var/turf/base_turf // Type path of the base turf for this z var/transit_chance = 0 // Percentile chance this z will be chosen for map-edge space transit. +// Holomaps + var/holomap_offset_x = -1 // Number of pixels to offset the map right (for centering) for this z + var/holomap_offset_y = -1 // Number of pixels to offset the map up (for centering) for this z + var/holomap_legend_x = 96 // x position of the holomap legend for this z + var/holomap_legend_y = 96 // y position of the holomap legend for this z + // Default constructor applies itself to the parent map datum /datum/map_z_level/New(var/datum/map/map) if(!z) return @@ -176,6 +188,17 @@ var/list/all_maps = list() map.base_turf_by_z["[z]"] = base_turf if(transit_chance) map.accessible_z_levels["[z]"] = transit_chance + // Holomaps + // Auto-center the map if needed (Guess based on maxx/maxy) + if (holomap_offset_x < 0) + holomap_offset_x = ((HOLOMAP_ICON_SIZE - world.maxx) / 2) + if (holomap_offset_x < 0) + holomap_offset_y = ((HOLOMAP_ICON_SIZE - world.maxy) / 2) + // Assign them to the map lists + LIST_NUMERIC_SET(map.holomap_offset_x, z, holomap_offset_x) + LIST_NUMERIC_SET(map.holomap_offset_y, z, holomap_offset_y) + LIST_NUMERIC_SET(map.holomap_legend_x, z, holomap_legend_x) + LIST_NUMERIC_SET(map.holomap_legend_y, z, holomap_legend_y) /datum/map_z_level/Destroy(var/force) crash_with("Attempt to delete a map_z_level instance [log_info_line(src)]") diff --git a/polaris.dme b/polaris.dme index 587300118e..bc821cc85c 100644 --- a/polaris.dme +++ b/polaris.dme @@ -30,6 +30,7 @@ #include "code\__defines\damage_organs.dm" #include "code\__defines\dna.dm" #include "code\__defines\gamemode.dm" +#include "code\__defines\holomap.dm" #include "code\__defines\inventory_sizes.dm" #include "code\__defines\items_clothing.dm" #include "code\__defines\lighting.dm" @@ -184,6 +185,7 @@ #include "code\controllers\subsystems\airflow.dm" #include "code\controllers\subsystems\atoms.dm" #include "code\controllers\subsystems\garbage.dm" +#include "code\controllers\subsystems\holomaps.dm" #include "code\controllers\subsystems\lighting.dm" #include "code\controllers\subsystems\machines.dm" #include "code\controllers\subsystems\orbits.dm" @@ -1563,6 +1565,10 @@ #include "code\modules\holodeck\HolodeckControl.dm" #include "code\modules\holodeck\HolodeckObjects.dm" #include "code\modules\holodeck\HolodeckPrograms.dm" +#include "code\modules\holomap\generate_holomap.dm" +#include "code\modules\holomap\holomap_area.dm" +#include "code\modules\holomap\holomap_datum.dm" +#include "code\modules\holomap\station_holomap.dm" #include "code\modules\hydroponics\_hydro_setup.dm" #include "code\modules\hydroponics\grown.dm" #include "code\modules\hydroponics\grown_inedible.dm"