diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 1301895facd..0e64cefc7aa 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -11703,7 +11703,7 @@ }) "auD" = ( /obj/machinery/light_construct/small, -/obj/item/toolbox_tiles_sensor, +/obj/item/toolbox_tiles/sensor, /turf/simulated/floor/plating, /area/maintenance/fpmaint2{ name = "Port Maintenance" diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 606fabcc4b5..15154bd85d3 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -9787,6 +9787,7 @@ pixel_y = 2 }, /obj/item/stamp/law, +/obj/item/pen/multi, /turf/simulated/floor/plasteel{ tag = "icon-cult"; icon_state = "cult"; diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index b138d19b513..8171efa7825 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -28,6 +28,46 @@ Thus, the two variables affect pump operation are set in New(): var/id = null var/datum/radio_frequency/radio_connection +/obj/machinery/atmospherics/binary/pump/CtrlClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + toggle() + return ..() + +/obj/machinery/atmospherics/binary/pump/AICtrlClick() + toggle() + return ..() + +/obj/machinery/atmospherics/binary/pump/AltClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + set_max() + return + +/obj/machinery/atmospherics/binary/pump/AIAltClick() + set_max() + return ..() + +/obj/machinery/atmospherics/binary/pump/proc/toggle() + if(powered()) + on = !on + update_icon() + +/obj/machinery/atmospherics/binary/pump/proc/set_max() + if(powered()) + target_pressure = MAX_OUTPUT_PRESSURE + update_icon() + /obj/machinery/atmospherics/binary/pump/Destroy() if(SSradio) SSradio.remove_object(src, frequency) @@ -203,7 +243,15 @@ Thus, the two variables affect pump operation are set in New(): update_icon() /obj/machinery/atmospherics/binary/pump/attackby(obj/item/W, mob/user, params) - if(!istype(W, /obj/item/wrench)) + if(istype(W, /obj/item/pen)) + var/t = copytext(stripped_input(user, "Enter the name for the pump.", "Rename", name), 1, MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && loc != usr) + return + name = t + return + else if(!istype(W, /obj/item/wrench)) return ..() if(!(stat & NOPOWER) && on) to_chat(user, "You cannot unwrench this [src], turn it off first.") diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index 11874172340..6633c1ac10d 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -28,6 +28,46 @@ Thus, the two variables affect pump operation are set in New(): var/id = null var/datum/radio_frequency/radio_connection +/obj/machinery/atmospherics/binary/volume_pump/CtrlClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + toggle() + return ..() + +/obj/machinery/atmospherics/binary/volume_pump/AICtrlClick() + toggle() + return ..() + +/obj/machinery/atmospherics/binary/volume_pump/AltClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + set_max() + return + +/obj/machinery/atmospherics/binary/volume_pump/AIAltClick() + set_max() + return ..() + +/obj/machinery/atmospherics/binary/volume_pump/proc/toggle() + if(powered()) + on = !on + update_icon() + +/obj/machinery/atmospherics/binary/volume_pump/proc/set_max() + if(powered()) + transfer_rate = MAX_TRANSFER_RATE + update_icon() + /obj/machinery/atmospherics/binary/volume_pump/Destroy() if(SSradio) SSradio.remove_object(src, frequency) @@ -199,7 +239,15 @@ Thus, the two variables affect pump operation are set in New(): update_icon() /obj/machinery/atmospherics/binary/volume_pump/attackby(obj/item/W, mob/user, params) - if(!istype(W, /obj/item/wrench)) + if(istype(W, /obj/item/pen)) + var/t = copytext(stripped_input(user, "Enter the name for the volume pump.", "Rename", name), 1, MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && loc != usr) + return + name = t + return + else if(!istype(W, /obj/item/wrench)) return ..() if(!(stat & NOPOWER) && on) to_chat(user, "You cannot unwrench this [src], turn it off first.") diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index c6720e45f6e..a778b01ea86 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -22,6 +22,45 @@ Filter types: var/frequency = 0 var/datum/radio_frequency/radio_connection +/obj/machinery/atmospherics/trinary/filter/CtrlClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + toggle() + return ..() + +/obj/machinery/atmospherics/trinary/filter/AICtrlClick() + toggle() + return ..() + +/obj/machinery/atmospherics/trinary/filter/AltClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + set_max() + return + +/obj/machinery/atmospherics/trinary/filter/AIAltClick() + set_max() + return ..() + +/obj/machinery/atmospherics/trinary/filter/proc/toggle() + if(powered()) + on = !on + update_icon() + +/obj/machinery/atmospherics/trinary/filter/proc/set_max() + if(powered()) + target_pressure = MAX_OUTPUT_PRESSURE + update_icon() /obj/machinery/atmospherics/trinary/filter/Destroy() if(SSradio) @@ -211,4 +250,16 @@ Filter types: . = TRUE update_icon() - SSnanoui.update_uis(src) \ No newline at end of file + SSnanoui.update_uis(src) + +/obj/machinery/atmospherics/trinary/filter/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/pen)) + var/t = copytext(stripped_input(user, "Enter the name for the filter.", "Rename", name), 1, MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && loc != usr) + return + name = t + return + else + return ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index 0c64804b6da..e7c91172e3b 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -12,10 +12,50 @@ //node 3 is the outlet, nodes 1 & 2 are intakes +/obj/machinery/atmospherics/trinary/mixer/CtrlClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + toggle() + return ..() + +/obj/machinery/atmospherics/trinary/mixer/AICtrlClick() + toggle() + return ..() + +/obj/machinery/atmospherics/trinary/mixer/AltClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + set_max() + return + +/obj/machinery/atmospherics/trinary/mixer/AIAltClick() + set_max() + return ..() + /obj/machinery/atmospherics/trinary/mixer/flipped icon_state = "mmap" flipped = 1 +/obj/machinery/atmospherics/trinary/mixer/proc/toggle() + if(powered()) + on = !on + update_icon() + +/obj/machinery/atmospherics/trinary/mixer/proc/set_max() + if(powered()) + target_pressure = MAX_OUTPUT_PRESSURE + update_icon() + /obj/machinery/atmospherics/trinary/mixer/update_icon(safety = 0) if(flipped) icon_state = "m" @@ -176,4 +216,16 @@ . = TRUE update_icon() - SSnanoui.update_uis(src) \ No newline at end of file + SSnanoui.update_uis(src) + +/obj/machinery/atmospherics/trinary/mixer/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/pen)) + var/t = copytext(stripped_input(user, "Enter the name for the mixer.", "Rename", name), 1, MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && loc != usr) + return + name = t + return + else + return ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index b4a0cd9ba7b..43082c38ded 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -22,7 +22,7 @@ A.nullifyPipenet(src) return ..() -/datum/pipeline/proc/process()//This use to be called called from the pipe networks +/datum/pipeline/process()//This use to be called called from the pipe networks if(update) update = 0 reconcile_air() diff --git a/code/__DEFINES/MC.dm b/code/__DEFINES/MC.dm index 1c4c12c243d..cbcf2c1dd90 100644 --- a/code/__DEFINES/MC.dm +++ b/code/__DEFINES/MC.dm @@ -21,7 +21,6 @@ #define START_PROCESSING(Processor, Datum) if (!Datum.isprocessing) {Datum.isprocessing = TRUE;Processor.processing += Datum} #define STOP_PROCESSING(Processor, Datum) Datum.isprocessing = FALSE;Processor.processing -= Datum -#define START_DEFERRED_PROCESSING(Processor, Datum) if (!Datum.isprocessing) {Datum.isprocessing = TRUE;Processor.processing.Insert(1,Datum)} //SubSystem flags (Please design any new flags so that the default is off, to make adding flags to subsystems easier) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 5ee80535780..ba0d1858616 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -13,6 +13,8 @@ //Objects #define isitem(A) (istype(A, /obj/item)) +#define ismachinery(A) (istype(A, /obj/machinery)) + #define ismecha(A) (istype(A, /obj/mecha)) #define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 5ade3b0baef..29a93ae94f9 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -61,6 +61,8 @@ #define INIT_ORDER_LANGUAGE 6 #define INIT_ORDER_MACHINES 5 #define INIT_ORDER_CIRCUIT 4 +#define INIT_ORDER_HOLIDAY 3 +#define INIT_ORDER_ALARMS 2 #define INIT_ORDER_TIMER 1 #define INIT_ORDER_DEFAULT 0 #define INIT_ORDER_AIR -1 diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index fd5fd510e40..c567ba7adb2 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -491,7 +491,7 @@ GLOBAL_LIST_INIT(do_after_once_tracker, list()) to_chat(user, "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];") to_chat(user, "Location = [location_description];") to_chat(user, "[special_role_description]") - to_chat(user, "(PM) ([ADMIN_PP(M,"PP")]) ([ADMIN_VV(M,"VV")]) ([ADMIN_SM(M,"SM")]) ([ADMIN_FLW(M,"FLW")]) (CA)") + to_chat(user, "(PM) ([ADMIN_PP(M,"PP")]) ([ADMIN_VV(M,"VV")]) ([ADMIN_SM(M,"SM")]) ([ADMIN_FLW(M,"FLW")]) (CA)") // Gets the first mob contained in an atom, and warns the user if there's not exactly one /proc/get_mob_in_atom_with_warning(atom/A, mob/user = usr) diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index 930a8ee9de5..5b90cda376e 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -49,10 +49,10 @@ var/religion_name = null name = "" // Prefix - for(var/holiday_name in holiday_master.holidays) + for(var/holiday_name in SSholiday.holidays) if(holiday_name == "Friday the 13th") random = 13 - var/datum/holiday/holiday = holiday_master.holidays[holiday_name] + var/datum/holiday/holiday = SSholiday.holidays[holiday_name] name = holiday.getStationPrefix() //get normal name if(!name) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 5b639cc80f8..b90f7502e65 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -113,9 +113,14 @@ /proc/typing_input(mob/user, message = "", title = "", default = "") if(user.client.checkTyping()) // Prevent double windows return null - user.client.typing = TRUE + var/client/C = user.client // Save it in a var in case the client disconnects from the mob + C.typing = TRUE var/msg = input(user, message, title, default) as text|null - user.client.typing = FALSE + if(!C) + return null + C.typing = FALSE + if(!user || C != user.client) // User got out of the mob for some reason or the mob is gone + return null return msg //Filters out undesirable characters from names diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 436970567a0..968a2f4d577 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -27,7 +27,5 @@ Due to BYOND features used in this codebase, you must update to version 510 or l This may require updating to a beta release. #endif -var/global/list/processing_objects = list() //This has to be initialized BEFORE world - // Macros that must exist before world.dm -#define to_chat to_chat_filename=__FILE__;to_chat_line=__LINE__;to_chat_src=src;__to_chat +#define to_chat to_chat_filename=__FILE__;to_chat_line=__LINE__;to_chat_src=src;__to_chat \ No newline at end of file diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index 1e35e150a25..6dc18d4fdff 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -3,7 +3,7 @@ var/datum/configuration/config = null var/host = null var/join_motd = null GLOBAL_VAR(join_tos) -var/game_version = "Custom ParaCode" +var/game_version = "ParaCode" var/changelog_hash = md5('html/changelog.html') //used to check if the CL changed var/game_year = (text2num(time2text(world.realtime, "YYYY")) + 544) diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index c7217221585..e6f463d6f23 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -19,8 +19,6 @@ GLOBAL_LIST_INIT(navigation_computers, list()) GLOBAL_LIST_INIT(all_areas, list()) GLOBAL_LIST_INIT(machines, list()) -GLOBAL_LIST_INIT(fast_processing, list()) -GLOBAL_LIST_INIT(processing_power_items, list()) //items that ask to be called every cycle GLOBAL_LIST_INIT(rcd_list, list()) //list of Rapid Construction Devices. GLOBAL_LIST_INIT(apcs, list()) diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index f0bb813a336..77443fb4ab2 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -1,8 +1,9 @@ var/global/obj/effect/overlay/plmaster = null var/global/obj/effect/overlay/slmaster = null -// Event Manager, the manager for events. -var/datum/event_manager/event_manager = new() +GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule +GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) + // Announcer intercom, because too much stuff creates an intercom for one message then hard del()s it. var/global/obj/item/radio/intercom/global_announcer = create_global_announcer() var/global/obj/item/radio/intercom/command/command_announcer = create_command_announcer() diff --git a/code/_globalvars/station.dm b/code/_globalvars/station.dm index 2d635996b30..e997a672e1f 100644 --- a/code/_globalvars/station.dm +++ b/code/_globalvars/station.dm @@ -1,6 +1,3 @@ var/global/datum/datacore/data_core = null -var/CELLRATE = 0.002 // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second) -var/CHARGELEVEL = 0.001 // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) - var/map_name = "Unknown" //The name of the map that is loaded. Assigned in world/New() \ No newline at end of file diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index c84a64722c5..22921f5228d 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -49,7 +49,7 @@ if(!can_see(A)) if(isturf(A)) //On unmodified clients clicking the static overlay clicks the turf underneath return // So there's no point messaging admins - message_admins("[key_name_admin(src)] might be running a modified client! (failed can_see on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))") + add_attack_logs(src, src, "[key_name_admin(src)] might be running a modified client! (failed can_see on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))", ATKLOG_ALL) var/message = "[key_name(src)] might be running a modified client! (failed can_see on AI click of [A]([COORD(pixel_turf)]))" log_admin(message) send2irc_adminless_only("NOCHEAT", "[key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)]))") @@ -64,7 +64,7 @@ else if(pixel_turf.obscured) log_admin("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)])") - message_admins("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))") + add_attack_logs(src, src, "[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))", ATKLOG_ALL) send2irc_adminless_only("NOCHEAT", "[key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)]))") return diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 24e58b502ad..286f8ce7095 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -122,6 +122,10 @@ throw_item(A) return + if(isLivingSSD(A)) + if(client && client.send_ssd_warning(A)) + return + var/obj/item/W = get_active_hand() if(W == A) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 24a2442faeb..e3d423130e5 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -154,6 +154,12 @@ #define ui_bot_radio "EAST-1:28,SOUTH:7" #define ui_bot_pull "EAST-2:26,SOUTH:7" +//Ghosts +#define ui_ghost_jumptomob "SOUTH:6,CENTER-2:24" +#define ui_ghost_orbit "SOUTH:6,CENTER-1:24" +#define ui_ghost_reenter_corpse "SOUTH:6,CENTER:24" +#define ui_ghost_teleport "SOUTH:6,CENTER+1:24" + //HUD styles. Please ensure HUD_VERSIONS is the same as the maximum index. Index order defines how they are cycled in F12. #define HUD_STYLE_STANDARD 1 #define HUD_STYLE_REDUCED 2 diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 32a9d7cf46d..5780e86a298 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -17,6 +17,7 @@ //Hide/Show Action Buttons ... Button /obj/screen/movable/action_button/hide_toggle name = "Hide Buttons" + desc = "Shift-click any button to reset its position. Alt-click to reset all buttons to their default positions." icon = 'icons/mob/actions/actions.dmi' icon_state = "bg_default" var/hidden = 0 @@ -24,8 +25,18 @@ /obj/screen/movable/action_button/hide_toggle/Click(location,control,params) var/list/modifiers = params2list(params) if(modifiers["shift"]) - moved = 0 - return 1 + moved = FALSE + usr.update_action_buttons(TRUE) + return TRUE + if(modifiers["alt"]) + for(var/V in usr.actions) + var/datum/action/A = V + var/obj/screen/movable/action_button/B = A.button + B.moved = FALSE + moved = FALSE + usr.update_action_buttons(TRUE) + to_chat(usr, "Action button positions have been reset.") + return TRUE usr.hud_used.action_buttons_hidden = !usr.hud_used.action_buttons_hidden hidden = usr.hud_used.action_buttons_hidden @@ -36,6 +47,15 @@ UpdateIcon() usr.update_action_buttons() +/obj/screen/movable/action_button/hide_toggle/AltClick(mob/user) + for(var/V in user.actions) + var/datum/action/A = V + var/obj/screen/movable/action_button/B = A.button + B.moved = FALSE + if(moved) + moved = FALSE + user.update_action_buttons(TRUE) + to_chat(user, "Action button positions have been reset.") /obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(mob/living/user) if(isalien(user)) diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm new file mode 100644 index 00000000000..4e92395f4cc --- /dev/null +++ b/code/_onclick/hud/ghost.dm @@ -0,0 +1,61 @@ +/mob/dead/observer/create_mob_hud() + if(client && !hud_used) + hud_used = new /datum/hud/ghost(src) + +/obj/screen/ghost + icon = 'icons/mob/screen_ghost.dmi' + +/obj/screen/ghost/MouseEntered() + flick(icon_state + "_anim", src) + +/obj/screen/ghost/jumptomob + name = "Jump to mob" + icon_state = "jumptomob" + +/obj/screen/ghost/jumptomob/Click() + var/mob/dead/observer/G = usr + G.jumptomob() + +/obj/screen/ghost/orbit + name = "Orbit" + icon_state = "orbit" + +/obj/screen/ghost/orbit/Click() + var/mob/dead/observer/G = usr + G.follow() + +/obj/screen/ghost/reenter_corpse + name = "Re-enter corpse" + icon_state = "reenter_corpse" + +/obj/screen/ghost/reenter_corpse/Click() + var/mob/dead/observer/G = usr + G.reenter_corpse() + +/obj/screen/ghost/teleport + name = "Teleport" + icon_state = "teleport" + +/obj/screen/ghost/teleport/Click() + var/mob/dead/observer/G = usr + G.dead_tele() + +/datum/hud/ghost/New(mob/owner) + ..() + var/obj/screen/using + + using = new /obj/screen/ghost/jumptomob() + using.screen_loc = ui_ghost_jumptomob + static_inventory += using + + using = new /obj/screen/ghost/orbit() + using.screen_loc = ui_ghost_orbit + static_inventory += using + + using = new /obj/screen/ghost/reenter_corpse() + using.screen_loc = ui_ghost_reenter_corpse + static_inventory += using + + using = new /obj/screen/ghost/teleport() + using.screen_loc = ui_ghost_teleport + static_inventory += using diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm index 134eaec96a6..f997109f90b 100644 --- a/code/controllers/ProcessScheduler/core/process.dm +++ b/code/controllers/ProcessScheduler/core/process.dm @@ -158,7 +158,7 @@ /datum/controller/process/proc/setup() -/datum/controller/process/proc/process() +/datum/controller/process/proc/process_decrepit() started() doWork() finished() diff --git a/code/controllers/ProcessScheduler/core/processScheduler.dm b/code/controllers/ProcessScheduler/core/processScheduler.dm index 9fcf6d13759..66d101d178e 100644 --- a/code/controllers/ProcessScheduler/core/processScheduler.dm +++ b/code/controllers/ProcessScheduler/core/processScheduler.dm @@ -72,9 +72,9 @@ var/global/datum/controller/processScheduler/processScheduler scheduler_sleep_interval = world.tick_lag updateStartDelays() spawn(0) - process() + process_decrepit() -/datum/controller/processScheduler/proc/process() +/datum/controller/processScheduler/proc/process_decrepit() while(isRunning) checkRunningProcesses() queueProcesses() @@ -154,7 +154,7 @@ var/global/datum/controller/processScheduler/processScheduler /datum/controller/processScheduler/proc/runProcess(var/datum/controller/process/process) spawn(0) - process.process() + process.process_decrepit() /datum/controller/processScheduler/proc/processStarted(var/datum/controller/process/process) setRunningProcessState(process) diff --git a/code/controllers/Processes/alarm.dm b/code/controllers/Processes/alarm.dm deleted file mode 100644 index 068ef0c1213..00000000000 --- a/code/controllers/Processes/alarm.dm +++ /dev/null @@ -1,37 +0,0 @@ -// We manually initialize the alarm handlers instead of looping over all existing types -// to make it possible to write: camera.triggerAlarm() rather than alarm_manager.managers[datum/alarm_handler/camera].triggerAlarm() or a variant thereof. -/var/global/datum/alarm_handler/atmosphere/atmosphere_alarm = new() -/var/global/datum/alarm_handler/burglar/burglar_alarm = new() -/var/global/datum/alarm_handler/camera/camera_alarm = new() -/var/global/datum/alarm_handler/fire/fire_alarm = new() -/var/global/datum/alarm_handler/motion/motion_alarm = new() -/var/global/datum/alarm_handler/power/power_alarm = new() - -// Alarm Manager, the manager for alarms. -var/datum/controller/process/alarm/alarm_manager - -/datum/controller/process/alarm - var/list/datum/alarm/all_handlers - -/datum/controller/process/alarm/setup() - name = "alarm" - schedule_interval = 20 // every 2 seconds - all_handlers = list(atmosphere_alarm, burglar_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) - -/datum/controller/process/alarm/doWork() - for(var/datum/alarm_handler/AH in all_handlers) - AH.process() - -DECLARE_GLOBAL_CONTROLLER(alarm, alarm_manager) - -/datum/controller/process/alarm/proc/active_alarms() - var/list/all_alarms = new - for(var/datum/alarm_handler/AH in all_handlers) - var/list/alarms = AH.alarms - all_alarms += alarms - - return all_alarms - -/datum/controller/process/alarm/proc/number_of_active_alarms() - var/list/alarms = active_alarms() - return alarms.len diff --git a/code/controllers/Processes/event.dm b/code/controllers/Processes/event.dm deleted file mode 100644 index 42e8c4bcc1d..00000000000 --- a/code/controllers/Processes/event.dm +++ /dev/null @@ -1,48 +0,0 @@ -/datum/controller/process/event/setup() - name = "event" - schedule_interval = 20 // every 2 seconds - if(!holiday_master) - holiday_master = new - holiday_master.Setup() - -/datum/controller/process/event/doWork() - event_manager.process() - holiday_master.process() - -///////// -//Holiday controller -///////// - -var/global/datum/controller/holiday/holiday_master //This has to be defined before world. - -/datum/controller/holiday - var/list/holidays - -/datum/controller/holiday/proc/Setup() - getHoliday() - -/datum/controller/holiday/proc/process() - if(holiday_master.holidays) - for(var/datum/holiday/H in holiday_master.holidays) - if(H.eventChance) - if(prob(H.eventChance)) - H.handle_event() - -/datum/controller/holiday/proc/getHoliday() - if(!config.allow_holidays) return //Holiday stuff was not enabled in the config! - - var/YY = text2num(time2text(world.timeofday, "YY")) // get the current year - var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month - var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day - - for(var/H in subtypesof(/datum/holiday)) - var/datum/holiday/holiday = new H() - if(holiday.shouldCelebrate(DD, MM, YY)) - holiday.celebrate() - if(!holidays) - holidays = list() - holidays[holiday.name] = holiday - - if(holidays) - holidays = shuffle(holidays) - world.update_status() diff --git a/code/controllers/Processes/fast_process.dm b/code/controllers/Processes/fast_process.dm deleted file mode 100644 index c27a749f526..00000000000 --- a/code/controllers/Processes/fast_process.dm +++ /dev/null @@ -1,17 +0,0 @@ -/datum/controller/process/fast_process/setup() - name = "fast processing" - schedule_interval = 2 //every 0.2 seconds - start_delay = 9 - log_startup_progress("Fast Processing starting up.") - -/datum/controller/process/fast_process/statProcess() - ..() - stat(null, "[GLOB.fast_processing.len] fast processes") - -/datum/controller/process/fast_process/doWork() - for(last_object in GLOB.fast_processing) - var/obj/O = last_object - try - O.process() - catch(var/exception/e) - catchException(e, O) \ No newline at end of file diff --git a/code/controllers/Processes/obj.dm b/code/controllers/Processes/obj.dm deleted file mode 100644 index 454709b6194..00000000000 --- a/code/controllers/Processes/obj.dm +++ /dev/null @@ -1,28 +0,0 @@ -/datum/controller/process/obj/setup() - name = "obj" - schedule_interval = 20 // every 2 seconds - start_delay = 8 - -/datum/controller/process/obj/started() - ..() - if(!processing_objects) - processing_objects = list() - -/datum/controller/process/obj/statProcess() - ..() - stat(null, "[processing_objects.len] objects") - -/datum/controller/process/obj/doWork() - for(last_object in processing_objects) - var/datum/O = last_object - if(istype(O) && !QDELETED(O)) - try - // Reagent datums get shoved in here, but the process proc isn't on the - // base datum type, so we just call it blindly. - O:process() - catch(var/exception/e) - catchException(e, O) - SCHECK - else - catchBadType(O) - processing_objects -= O diff --git a/code/controllers/Processes/ticker.dm b/code/controllers/Processes/ticker.dm index 8fc476116e5..578c2725710 100644 --- a/code/controllers/Processes/ticker.dm +++ b/code/controllers/Processes/ticker.dm @@ -30,7 +30,7 @@ DECLARE_GLOBAL_CONTROLLER(ticker, tickerProcess) lastTickerTime = currentTime - ticker.process() + ticker.process_decrepit() /datum/controller/process/ticker/proc/getLastTickerTimeDuration() return lastTickerTimeDuration diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index ad9cb166970..a424fb1ac55 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -1,5 +1,7 @@ /datum/configuration var/server_name = null // server name (for world name / status) + var/server_tag_line = null // server tagline (for showing on hub entry) + var/server_extra_features = null // server-specific extra features (for hub entry) var/server_suffix = 0 // generate numeric suffix based on server port var/minimum_client_build = 1421 // Build 1421 due to the middle mouse button exploit @@ -53,7 +55,6 @@ var/humans_need_surnames = 0 var/allow_random_events = 0 // enables random events mid-round when set to 1 var/allow_ai = 1 // allow ai job - var/hostedby = null var/respawn = 0 var/guest_jobban = 1 var/usewhitelist = 0 @@ -69,6 +70,9 @@ var/assistantlimit = 0 //enables assistant limiting var/assistantratio = 2 //how many assistants to security members + var/auto_cryo_ssd_mins = 0 + var/ssd_warning = 0 + var/prob_free_golems = 75 //chance for free golems spawners to appear roundstart var/unrestricted_free_golems = FALSE //if true, free golems can appear on all roundtypes @@ -301,6 +305,11 @@ if("shadowling_max_age") config.shadowling_max_age = text2num(value) + if("auto_cryo_ssd_mins") + config.auto_cryo_ssd_mins = text2num(value) + if("ssd_warning") + config.ssd_warning = 1 + if("ipintel_email") if(value != "ch@nge.me") config.ipintel_email = value @@ -408,6 +417,12 @@ if("servername") config.server_name = value + if("server_tag_line") + config.server_tag_line = value + + if("server_extra_features") + config.server_extra_features = value + if("serversuffix") config.server_suffix = 1 @@ -417,9 +432,6 @@ if("nudge_script_path") config.nudge_script_path = value - if("hostedby") - config.hostedby = value - if("server") config.server = value diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 8fbed1f0b0f..79de45c3248 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -67,7 +67,7 @@ SUBSYSTEM_DEF(air) setup_allturfs() setup_atmos_machinery(GLOB.machines) setup_pipenets(GLOB.machines) - ..() + return ..() /datum/controller/subsystem/air/fire(resumed = 0) diff --git a/code/controllers/subsystem/alarm.dm b/code/controllers/subsystem/alarm.dm new file mode 100644 index 00000000000..90e3ff960f1 --- /dev/null +++ b/code/controllers/subsystem/alarm.dm @@ -0,0 +1,30 @@ +SUBSYSTEM_DEF(alarms) + name = "Alarms" + init_order = INIT_ORDER_ALARMS // 2 + var/datum/alarm_handler/atmosphere/atmosphere_alarm = new() + var/datum/alarm_handler/burglar/burglar_alarm = new() + var/datum/alarm_handler/camera/camera_alarm = new() + var/datum/alarm_handler/fire/fire_alarm = new() + var/datum/alarm_handler/motion/motion_alarm = new() + var/datum/alarm_handler/power/power_alarm = new() + var/list/datum/alarm/all_handlers + +/datum/controller/subsystem/alarms/Initialize(start_timeofday) + all_handlers = list(SSalarms.atmosphere_alarm, SSalarms.burglar_alarm, SSalarms.camera_alarm, SSalarms.fire_alarm, SSalarms.motion_alarm, SSalarms.power_alarm) + return ..() + +/datum/controller/subsystem/alarms/fire() + for(var/datum/alarm_handler/AH in all_handlers) + AH.process() + +/datum/controller/subsystem/alarms/proc/active_alarms() + var/list/all_alarms = new () + for(var/datum/alarm_handler/AH in all_handlers) + var/list/alarms = AH.alarms + all_alarms += alarms + + return all_alarms + +/datum/controller/subsystem/alarms/proc/number_of_active_alarms() + var/list/alarms = active_alarms() + return alarms.len diff --git a/code/controllers/subsystem/assets.dm b/code/controllers/subsystem/assets.dm index 1423c6cf9bd..cd531db614a 100644 --- a/code/controllers/subsystem/assets.dm +++ b/code/controllers/subsystem/assets.dm @@ -14,4 +14,4 @@ SUBSYSTEM_DEF(assets) for(var/client/C in GLOB.clients) addtimer(CALLBACK(GLOBAL_PROC, .proc/getFilesSlow, C, preload, FALSE), 10) - ..() \ No newline at end of file + return ..() \ No newline at end of file diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index a0b2d49d958..cbe8806fc15 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -19,6 +19,7 @@ SUBSYSTEM_DEF(atoms) setupgenetics() initialized = INITIALIZATION_INNEW_MAPLOAD InitializeAtoms() + return ..() diff --git a/code/modules/events/event_manager.dm b/code/controllers/subsystem/events.dm similarity index 73% rename from code/modules/events/event_manager.dm rename to code/controllers/subsystem/events.dm index 1545ddbbdf0..95553ab0d7e 100644 --- a/code/modules/events/event_manager.dm +++ b/code/controllers/subsystem/events.dm @@ -1,19 +1,25 @@ -/datum/event_manager +SUBSYSTEM_DEF(events) + name = "Events" + init_order = INIT_ORDER_EVENTS + runlevels = RUNLEVEL_GAME + // Report events at the end of the rouund + var/report_at_round_end = 0 + + // UI vars var/window_x = 700 var/window_y = 600 - var/report_at_round_end = 0 var/table_options = " align='center'" var/head_options = " style='font-weight:bold;'" var/row_options1 = " width='85px'" var/row_options2 = " width='260px'" var/row_options3 = " width='150px'" + + // Event vars var/datum/event_container/selected_event_container = null - - var/list/datum/event/active_events = list() - var/list/datum/event/finished_events = list() - - var/list/datum/event/allEvents - var/list/datum/event_container/event_containers = list( + var/list/active_events = list() + var/list/finished_events = list() + var/list/allEvents + var/list/event_containers = list( EVENT_LEVEL_MUNDANE = new/datum/event_container/mundane, EVENT_LEVEL_MODERATE = new/datum/event_container/moderate, EVENT_LEVEL_MAJOR = new/datum/event_container/major @@ -21,18 +27,19 @@ var/datum/event_meta/new_event = new -/datum/event_manager/New() +/datum/controller/subsystem/events/Initialize() allEvents = subtypesof(/datum/event) + return ..() -/datum/event_manager/proc/process() - for(var/datum/event/E in event_manager.active_events) +/datum/controller/subsystem/events/fire() + for(var/datum/event/E in active_events) E.process() for(var/i = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR) var/list/datum/event_container/EC = event_containers[i] EC.process() -/datum/event_manager/proc/event_complete(var/datum/event/E) +/datum/controller/subsystem/events/proc/event_complete(var/datum/event/E) if(!E.event_meta) // datum/event is used here and there for random reasons, maintaining "backwards compatibility" log_debug("Event of '[E.type]' with missing meta-data has completed.") return @@ -57,11 +64,11 @@ log_debug("Event '[EM.name]' has completed at [station_time_timestamp()].") -/datum/event_manager/proc/delay_events(var/severity, var/delay) +/datum/controller/subsystem/events/proc/delay_events(var/severity, var/delay) var/list/datum/event_container/EC = event_containers[severity] EC.next_event_time += delay -/datum/event_manager/proc/Interact(var/mob/living/user) +/datum/controller/subsystem/events/proc/Interact(var/mob/living/user) var/html = GetInteractWindow() @@ -69,7 +76,7 @@ popup.set_content(html) popup.open() -/datum/event_manager/proc/RoundEnd() +/datum/controller/subsystem/events/proc/RoundEnd() if(!report_at_round_end) return @@ -89,7 +96,7 @@ to_chat(world, message) -/datum/event_manager/proc/GetInteractWindow() +/datum/controller/subsystem/events/proc/GetInteractWindow() var/html = "Refresh" if(selected_event_container) @@ -197,7 +204,7 @@ return html -/datum/event_manager/Topic(href, href_list) +/datum/controller/subsystem/events/Topic(href, href_list) if(..()) return @@ -290,123 +297,3 @@ EC.next_event = null Interact(usr) - -/client/proc/forceEvent(var/type in event_manager.allEvents) - set name = "Trigger Event (Debug Only)" - set category = "Debug" - - if(!holder) - return - - if(ispath(type)) - new type(new /datum/event_meta(EVENT_LEVEL_MAJOR)) - message_admins("[key_name_admin(usr)] has triggered an event. ([type])", 1) - -/client/proc/event_manager_panel() - set name = "Event Manager Panel" - set category = "Event" - if(event_manager) - event_manager.Interact(usr) - feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - return - -/proc/findEventArea() //Here's a nice proc to use to find an area for your event to land in! - var/area/candidate = null - - var/list/safe_areas = list( - /area/turret_protected/ai, - /area/turret_protected/ai_upload, - /area/engine, - /area/solar, - /area/holodeck, - /area/shuttle/arrival, - /area/shuttle/escape, - /area/shuttle/escape_pod1/station, - /area/shuttle/escape_pod2/station, - /area/shuttle/escape_pod3/station, - /area/shuttle/escape_pod5/station, - /area/shuttle/specops/station, - /area/shuttle/prison/station, - /area/shuttle/administration/station - ) - - //These are needed because /area/engine has to be removed from the list, but we still want these areas to get fucked up. - var/list/danger_areas = list( - /area/engine/break_room, - /area/engine/chiefs_office) - - var/list/event_areas = list() - - for(var/areapath in the_station_areas) - event_areas += typesof(areapath) - for(var/areapath in safe_areas) - event_areas -= typesof(areapath) - for(var/areapath in danger_areas) - event_areas += typesof(areapath) - - while(event_areas.len > 0) - var/list/event_turfs = null - candidate = locate(pick_n_take(event_areas)) - event_turfs = get_area_turfs(candidate) - if(event_turfs.len > 0) - break - - return candidate - -/datum/event/proc/num_players() - var/players = 0 - for(var/mob/living/carbon/human/P in GLOB.player_list) - if(P.client) - players++ - return players - -// Returns how many characters are currently active(not logged out, not AFK for more than 10 minutes) -// with a specific role. -// Note that this isn't sorted by department, because e.g. having a roboticist shouldn't make meteors spawn. -/proc/number_active_with_role() - var/list/active_with_role = list() - active_with_role["Engineer"] = 0 - active_with_role["Medical"] = 0 - active_with_role["Security"] = 0 - active_with_role["Scientist"] = 0 - active_with_role["AI"] = 0 - active_with_role["Cyborg"] = 0 - active_with_role["Janitor"] = 0 - active_with_role["Botanist"] = 0 - active_with_role["Any"] = GLOB.player_list.len - - for(var/mob/M in GLOB.player_list) - if(!M.mind || !M.client || M.client.inactivity > 10 * 10 * 60) // longer than 10 minutes AFK counts them as inactive - continue - - if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "engineering robot module") - active_with_role["Engineer"]++ - if(M.mind.assigned_role in list("Chief Engineer", "Station Engineer")) - active_with_role["Engineer"]++ - - if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "medical robot module") - active_with_role["Medical"]++ - if(M.mind.assigned_role in list("Chief Medical Officer", "Medical Doctor")) - active_with_role["Medical"]++ - - if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "security robot module") - active_with_role["Security"]++ - if(M.mind.assigned_role in security_positions) - active_with_role["Security"]++ - - if(M.mind.assigned_role in list("Research Director", "Scientist")) - active_with_role["Scientist"]++ - - if(M.mind.assigned_role == "AI") - active_with_role["AI"]++ - - if(M.mind.assigned_role == "Cyborg") - active_with_role["Cyborg"]++ - - if(M.mind.assigned_role == "Janitor") - active_with_role["Janitor"]++ - - if(M.mind.assigned_role == "Botanist") - active_with_role["Botanist"]++ - - return active_with_role diff --git a/code/controllers/subsystem/holiday.dm b/code/controllers/subsystem/holiday.dm new file mode 100644 index 00000000000..be9d6d4fc7d --- /dev/null +++ b/code/controllers/subsystem/holiday.dm @@ -0,0 +1,31 @@ +SUBSYSTEM_DEF(holiday) + name = "Holiday" + init_order = INIT_ORDER_HOLIDAY // 3 + flags = SS_NO_FIRE + var/list/holidays + +/datum/controller/subsystem/holiday/Initialize(start_timeofday) + if(!config.allow_holidays) + return ..() //Holiday stuff was not enabled in the config! + + var/YY = text2num(time2text(world.timeofday, "YY")) // get the current year + var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month + var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day + + for(var/H in subtypesof(/datum/holiday)) + var/datum/holiday/holiday = new H() + if(holiday.shouldCelebrate(DD, MM, YY)) + holiday.celebrate() + if(!holidays) + holidays = list() + holidays[holiday.name] = holiday + + if(holidays) + holidays = shuffle(holidays) + world.update_status() + for(var/datum/holiday/H in holidays) + if(H.eventChance) + if(prob(H.eventChance)) + H.handle_event() + + return ..() \ No newline at end of file diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm index 65260e5af55..531b6af2e78 100644 --- a/code/controllers/subsystem/icon_smooth.dm +++ b/code/controllers/subsystem/icon_smooth.dm @@ -29,4 +29,4 @@ SUBSYSTEM_DEF(icon_smooth) smooth_icon(A) CHECK_TICK - ..() + return ..() diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index 3639db6bbd2..02f2681b22d 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -8,6 +8,8 @@ SUBSYSTEM_DEF(jobs) var/list/name_occupations = list() //Dict of all jobs, keys are titles var/list/type_occupations = list() //Dict of all jobs, keys are types var/list/prioritized_jobs = list() // List of jobs set to priority by HoP/Captain + var/list/id_change_records = list() // List of all job transfer records + var/list/id_change_counter = 1 //Players who need jobs var/list/unassigned = list() //Debug info @@ -17,7 +19,7 @@ SUBSYSTEM_DEF(jobs) if(!occupations.len) SetupOccupations() LoadJobs("config/jobs.txt") - ..() + return ..() /datum/controller/subsystem/jobs/proc/SetupOccupations(var/list/faction = list("Station")) occupations = list() @@ -601,3 +603,84 @@ SUBSYSTEM_DEF(jobs) spawn(0) to_chat(H, "Your account number is: [M.account_number], your account pin is: [M.remote_access_pin]") + +/datum/controller/subsystem/jobs/proc/format_jobs_for_id_computer(obj/item/card/id/tgtcard) + var/list/jobs_to_formats = list() + if(tgtcard) + var/mob/M = tgtcard.getPlayer() + for(var/datum/job/job in occupations) + if(tgtcard.assignment && tgtcard.assignment == job.title) + jobs_to_formats[job.title] = "disabled" // the job they already have is pre-selected + else if(!job.would_accept_job_transfer_from_player(M)) + jobs_to_formats[job.title] = "linkDiscourage" // karma jobs they don't have available are discouraged + else if(job.total_positions && !job.current_positions && job.title != "Civilian") + jobs_to_formats[job.title] = "linkEncourage" // jobs with nobody doing them at all are encouraged + else if(job.total_positions >= 0 && job.current_positions >= job.total_positions) + jobs_to_formats[job.title] = "linkDiscourage" // jobs that are full (no free positions) are discouraged + return jobs_to_formats + + +/datum/controller/subsystem/jobs/proc/log_job_transfer(transferee, oldvalue, newvalue, whodidit) + id_change_records["[id_change_counter]"] = list("transferee" = transferee, "oldvalue" = oldvalue, "newvalue" = newvalue, "whodidit" = whodidit, "timestamp" = station_time_timestamp()) + id_change_counter++ + +/datum/controller/subsystem/jobs/proc/slot_job_transfer(oldtitle, newtitle) + var/datum/job/oldjobdatum = SSjobs.GetJob(oldtitle) + var/datum/job/newjobdatum = SSjobs.GetJob(newtitle) + if(istype(oldjobdatum) && oldjobdatum.current_positions > 0 && istype(newjobdatum)) + if(!(oldjobdatum.title in command_positions) && !(newjobdatum.title in command_positions)) + oldjobdatum.current_positions-- + newjobdatum.current_positions++ + + +/datum/controller/subsystem/jobs/proc/fetch_transfer_record_html(var/centcom) + var/record_html = "" + + var/table_headers = list("Crewman", "Old Rank", "New Rank", "Authorized By", "Time") + var/hidden_fields = list("deletedby") + if(centcom) + table_headers += "Deleted By" + record_html += "" + for(var/thisheader in table_headers) + record_html += "" + record_html += "" + + var/visible_record_count = 0 + for(var/thisid in id_change_records) + var/thisrecord = id_change_records[thisid] + + if(thisrecord["deletedby"] && !centcom) + continue + + record_html += "" + for(var/lkey in thisrecord) + if(lkey in hidden_fields) + if(centcom) + record_html += "" + else + continue + else + record_html += "" + record_html += "" + visible_record_count++ + + record_html += "
[thisheader]
[thisrecord[lkey]][thisrecord[lkey]]
" + + if(!visible_record_count) + return "No records on file yet." + return record_html + +/datum/controller/subsystem/jobs/proc/delete_log_records(sourceuser, delete_all) + . = 0 + if(!sourceuser) + return + var/list/new_id_change_records = list() + for(var/thisid in id_change_records) + var/thisrecord = id_change_records[thisid] + if(!thisrecord["deletedby"]) + if(delete_all || thisrecord["whodidit"] == sourceuser) + thisrecord["deletedby"] = sourceuser + .++ + new_id_change_records["[id_change_counter]"] = thisrecord + id_change_counter++ + id_change_records = new_id_change_records \ No newline at end of file diff --git a/code/controllers/subsystem/machinery.dm b/code/controllers/subsystem/machinery.dm index af6898c39bd..9a73c1dbabb 100644 --- a/code/controllers/subsystem/machinery.dm +++ b/code/controllers/subsystem/machinery.dm @@ -17,7 +17,7 @@ SUBSYSTEM_DEF(machines) /datum/controller/subsystem/machines/Initialize() makepowernets() fire() - ..() + return ..() /datum/controller/subsystem/machines/proc/makepowernets() for(var/datum/powernet/PN in powernets) @@ -64,23 +64,6 @@ SUBSYSTEM_DEF(machines) if(MC_TICK_CHECK) return -/datum/controller/subsystem/machines/proc/process_premachines(resumed = 0) - /* Literally exists as snowflake for fucking powersinks goddamnit */ - if(!resumed) - src.currentrun = GLOB.processing_power_items.Copy() - //cache for sanid speed (lists are references anyways) - var/list/currentrun = src.currentrun - while(currentrun.len) - var/obj/item/I = currentrun[currentrun.len] - currentrun.len-- - if(!QDELETED(I)) - if(!I.pwr_drain()) - GLOB.processing_power_items.Remove(I) - else - GLOB.processing_power_items.Remove(I) - if(MC_TICK_CHECK) - return - /datum/controller/subsystem/machines/proc/process_machines(resumed = 0) var/seconds = wait * 0.1 if(!resumed) @@ -113,13 +96,6 @@ SUBSYSTEM_DEF(machines) if(state != SS_RUNNING) return resumed = 0 - currentpart = SSMACHINES_PREMACHINERY - - if(currentpart == SSMACHINES_PREMACHINERY || !resumed) - process_premachines(resumed) - if(state != SS_RUNNING) - return - resumed = 0 currentpart = SSMACHINES_MACHINERY if(currentpart == SSMACHINES_MACHINERY || !resumed) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 43c2f406365..d08fba5ff4f 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -28,7 +28,7 @@ SUBSYSTEM_DEF(mapping) // Populate mining Z-level hidden rooms for(var/i=0, i= max_spores) - return 0 + return if(spore_delay > world.time) - return 0 + return + flick("blob_factory_glow", src) spore_delay = world.time + 100 // 10 seconds var/mob/living/simple_animal/hostile/blob/blobspore/BS = new/mob/living/simple_animal/hostile/blob/blobspore(src.loc, src) BS.color = overmind.blob_reagent_datum.complementary_color BS.overmind = overmind overmind.blob_mobs.Add(BS) - return 0 - diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm index e1a08555a10..4a2699802c1 100644 --- a/code/game/gamemodes/blob/blobs/node.dm +++ b/code/game/gamemodes/blob/blobs/node.dm @@ -9,7 +9,7 @@ /obj/structure/blob/node/New(loc, var/h = 100) blob_nodes += src - processing_objects.Add(src) + START_PROCESSING(SSobj, src) ..(loc, h) /obj/structure/blob/node/adjustcolors(var/a_color) @@ -26,7 +26,7 @@ /obj/structure/blob/node/Destroy() blob_nodes -= src - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/structure/blob/node/Life(seconds, times_fired) diff --git a/code/game/gamemodes/blob/blobs/resource.dm b/code/game/gamemodes/blob/blobs/resource.dm index 7198d3ef081..14c240f681b 100644 --- a/code/game/gamemodes/blob/blobs/resource.dm +++ b/code/game/gamemodes/blob/blobs/resource.dm @@ -13,13 +13,9 @@ qdel(src) /obj/structure/blob/resource/run_action() - if(resource_delay > world.time) - return 0 - + return + flick("blob_resource_glow", src) resource_delay = world.time + 40 // 4 seconds - if(overmind) overmind.add_points(1) - return 0 - diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index ca1dffbfa74..7ec1ec3b3f0 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -98,7 +98,7 @@ if(isovermind(M) || isobserver(M)) M.show_message(rendered, 2) -/mob/camera/blob/emote(var/act,var/m_type=1,var/message = null) +/mob/camera/blob/emote(act, m_type = 1, message = null, force) return /mob/camera/blob/blob_act() diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index 748823829b5..61196c9862f 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -331,17 +331,13 @@ /mob/camera/blob/verb/rally_spores_power() set category = "Blob" - set name = "Rally Spores (5)" + set name = "Rally Spores" set desc = "Rally the spores to move to your location." var/turf/T = get_turf(src) rally_spores(T) /mob/camera/blob/proc/rally_spores(var/turf/T) - - if(!can_buy(5)) - return - to_chat(src, "You rally your spores.") var/list/surrounding_turfs = block(locate(T.x - 1, T.y - 1, T.z), locate(T.x + 1, T.y + 1, T.z)) @@ -373,12 +369,12 @@ if(!N) to_chat(src, "A node is required to birth your offspring...") return - + if(!can_buy(100)) return split_used = TRUE - + new /obj/structure/blob/core/ (get_turf(N), 200, null, blob_core.point_rate, "offspring") qdel(N) @@ -399,7 +395,8 @@ else to_chat(usr, "You broadcast with your minions, [speak_text]") for(var/mob/living/simple_animal/hostile/blob_minion in blob_mobs) - blob_minion.say(speak_text) + if(blob_minion.stat == CONSCIOUS) + blob_minion.say(speak_text) return /mob/camera/blob/verb/create_storage() @@ -478,4 +475,4 @@ to_chat(src, "Node Blobs are blobs which grow, like the core. Like the core it can activate resource and factory blobs.") to_chat(src, "In addition to the buttons on your HUD, there are a few click shortcuts to speed up expansion and defense.") to_chat(src, "Shortcuts: Click = Expand Blob | CTRL Click = Create Shield Blob | Middle Mouse Click = Rally Spores | Alt Click = Remove Blob") - to_chat(src, "Attempting to talk will send a message to all other overminds, allowing you to coordinate with them.") \ No newline at end of file + to_chat(src, "Attempting to talk will send a message to all other overminds, allowing you to coordinate with them.") diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index 21d97863105..f6f7c16fd21 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -13,10 +13,10 @@ /obj/effect/proc_holder/changeling/fleshmend/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/effect/proc_holder/changeling/fleshmend/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/effect/proc_holder/changeling/fleshmend/process() diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index 6288bed2964..4b5560fe333 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -433,7 +433,7 @@ ..() if(ismob(loc)) loc.visible_message("[loc.name]\'s flesh rapidly inflates, forming a bloated mass around [loc.p_their()] body!", "We inflate our flesh, creating a spaceproof suit!", "You hear organic matter ripping and tearing!") - processing_objects += src + START_PROCESSING(SSobj, src) /obj/item/clothing/suit/space/changeling/process() if(ishuman(loc)) diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm index 2fbbcdc413d..e93556ca843 100644 --- a/code/game/gamemodes/cult/cult_comms.dm +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -39,7 +39,7 @@ my_message = "Harbringer of the Slaughter: [message]" else my_message = "[(ishuman(user) ? "Acolyte" : "Construct")] [user]: [message]" - for(var/mob/M in GLOB.mob_list) + for(var/mob/M in GLOB.player_list) if(iscultist(M)) to_chat(M, my_message) else if(M in GLOB.dead_mob_list) diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index 63e0626f481..60f878257db 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -193,11 +193,11 @@ var/list/blacklisted_pylon_turfs = typecacheof(list( return /obj/structure/cult/functional/pylon/New() - processing_objects |= src + START_PROCESSING(SSobj, src) ..() /obj/structure/cult/functional/pylon/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/structure/cult/functional/pylon/process() diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 535823ebfee..5f3ed489107 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -88,7 +88,7 @@ ///process() ///Called by the gameticker -/datum/game_mode/proc/process() +/datum/game_mode/process() return 0 //Called by the gameticker diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index c2268063822..972075ceece 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -172,10 +172,10 @@ var/round_start_time = 0 to_chat(world, "Enjoy the game!") world << sound('sound/AI/welcome.ogg')// Skie - if(holiday_master.holidays) + if(SSholiday.holidays) to_chat(world, "and...") - for(var/holidayname in holiday_master.holidays) - var/datum/holiday/holiday = holiday_master.holidays[holidayname] + for(var/holidayname in SSholiday.holidays) + var/datum/holiday/holiday = SSholiday.holidays[holidayname] to_chat(world, "

[holiday.greet()]

") spawn(0) // Forking dynamic room selection @@ -400,7 +400,7 @@ var/round_start_time = 0 if(m) to_chat(world, "Tip of the round: [html_encode(m)]") -/datum/controller/gameticker/proc/process() +/datum/controller/gameticker/proc/process_decrepit() if(current_state != GAME_STATE_PLAYING) return 0 @@ -506,7 +506,13 @@ var/round_start_time = 0 mode.declare_station_goal_completion() //Ask the event manager to print round end information - event_manager.RoundEnd() + SSevents.RoundEnd() + + // Add AntagHUD to everyone, see who was really evil the whole time! + for(var/datum/atom_hud/antag/H in huds) + for(var/m in GLOB.player_list) + var/mob/M = m + H.add_hud_to(M) return 1 diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 830ae26f3c1..bfde102ca35 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -56,7 +56,7 @@ var/announced = 0 /obj/machinery/doomsday_device/Destroy() - GLOB.fast_processing -= src + STOP_PROCESSING(SSfastprocess, src) SSshuttle.emergencyNoEscape = 0 if(SSshuttle.emergency.mode == SHUTTLE_STRANDED) SSshuttle.emergency.mode = SHUTTLE_DOCKED @@ -67,7 +67,7 @@ /obj/machinery/doomsday_device/proc/start() detonation_timer = world.time + default_timer timing = 1 - GLOB.fast_processing += src + START_PROCESSING(SSfastprocess, src) SSshuttle.emergencyNoEscape = 1 /obj/machinery/doomsday_device/proc/seconds_remaining() @@ -84,7 +84,7 @@ priority_announcement.Announce("Hostile environment resolved. You have 3 minutes to board the Emergency Shuttle.", "Priority Announcement", 'sound/AI/shuttledock.ogg') qdel(src) if(!timing) - GLOB.fast_processing -= src + STOP_PROCESSING(SSfastprocess, src) return var/sec_left = seconds_remaining() if(sec_left <= 0) diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 92ac300cc00..827eefb569d 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -110,15 +110,15 @@ M.SetStunned(0) M.SetWeakened(0) combat_cooldown = 0 - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/clothing/suit/armor/abductor/vest/process() combat_cooldown++ if(combat_cooldown==initial(combat_cooldown)) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) /obj/item/clothing/suit/armor/abductor/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) for(var/obj/machinery/abductor/console/C in GLOB.machines) if(C.vest == src) C.vest = null diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index 8f058a872e6..fbe1774525f 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -373,11 +373,11 @@ /obj/effect/cocoon/abductor/proc/Start() hatch_time = world.time + 600 - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/effect/cocoon/abductor/process() if(world.time > hatch_time) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) for(var/mob/M in contents) src.visible_message("[src] hatches!") M.forceMove(get_turf(src)) diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index 34d1f64f0d0..fa797ac929b 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -32,7 +32,7 @@ return FALSE return B.host.say_understands(other, speaking) -/mob/living/captive_brain/emote(var/message) +/mob/living/captive_brain/emote(act, m_type = 1, message = null, force) return /mob/living/captive_brain/resist() @@ -157,7 +157,7 @@ if(!istype(S.speaking, /datum/language/corticalborer) && loc == host && !talk_inside_host) to_chat(src, "You've disabled audible speech while inside a host! Re-enable it under the borer tab, or stick to borer communications.") return - + . = ..() /mob/living/simple_animal/borer/verb/Communicate() @@ -475,7 +475,7 @@ set category = "Borer" set name = "Dominate Victim" set desc = "Freeze the limbs of a potential host with supernatural fear." - + if(world.time - used_dominate < 150) to_chat(src, "You cannot use that ability again so soon.") return @@ -487,22 +487,22 @@ if(stat) to_chat(src, "You cannot do that in your current state.") return - + if(attempting_to_dominate) to_chat(src, "You're already targeting someone!") return - + var/list/choices = list() for(var/mob/living/carbon/C in view(3,src)) if(C.stat != DEAD) choices += C - + if(world.time - used_dominate < 300) to_chat(src, "You cannot use that ability again so soon.") return - + attempting_to_dominate = TRUE - + var/mob/living/carbon/M = input(src,"Who do you wish to dominate?") in null|choices if(!M) @@ -519,8 +519,8 @@ if(incapacitated()) attempting_to_dominate = FALSE - return - + return + if(get_dist(src, M) > 7) //to avoid people remotely doing from across the map etc, 7 is the default view range to_chat(src, "You're too far away!") attempting_to_dominate = FALSE @@ -760,10 +760,9 @@ to_chat(src, "Your host twitches and quivers as you rapdly excrete several larvae from your sluglike body.") visible_message("[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!") B.chemicals -= 100 - - new /obj/effect/decal/cleanable/vomit(get_turf(src)) - playsound(loc, 'sound/effects/splat.ogg', 50, 1) - new /mob/living/simple_animal/borer(get_turf(src),B.generation + 1) + var/turf/T = get_turf(src) + T.add_vomit_floor() + new /mob/living/simple_animal/borer(T, B.generation + 1) else to_chat(src, "You need 100 chemicals to reproduce!") diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index bde3f7ee8e9..54b01ff38ce 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -2,7 +2,9 @@ //"Ghosts" that are invisible and move like ghosts, cannot take damage while invsible //Don't hear deadchat and are NOT normal ghosts //Admin-spawn or random event + #define INVISIBILITY_REVENANT 50 +#define REVENANT_NAME_FILE "revenant_names.json" /mob/living/simple_animal/revenant name = "revenant" @@ -124,9 +126,17 @@ ghost_darkness_images |= ghostimage updateallghostimages() remove_from_all_data_huds() + random_revenant_name() addtimer(CALLBACK(src, .proc/firstSetupAttempt), 15 SECONDS) // Give admin 15 seconds to put in a ghost (Or wait 15 seconds before giving it objectives) +/mob/living/simple_animal/revenant/proc/random_revenant_name() + var/built_name = "" + built_name += pick(strings(REVENANT_NAME_FILE, "spirit_type")) + built_name += " of " + built_name += pick(strings(REVENANT_NAME_FILE, "adjective")) + built_name += pick(strings(REVENANT_NAME_FILE, "theme")) + name = built_name /mob/living/simple_animal/revenant/proc/firstSetupAttempt() if(mind) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 94190149848..2e36488cc8a 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -407,7 +407,7 @@ var/bomb_set /obj/item/disk/nuclear/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) GLOB.poi_list |= src /obj/item/disk/nuclear/process() @@ -437,7 +437,7 @@ var/bomb_set message_admins("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - JMP":"nonexistent location"]).") log_game("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z]":"nonexistent location"]).") GLOB.poi_list.Remove(src) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() if(blobstart.len > 0) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 30c79798b2f..ea95f62af57 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -335,7 +335,7 @@ include_user = 1 var/blind_smoke_acquired var/screech_acquired - var/drainLifeAcquired + var/nullChargeAcquired var/reviveThrallAcquired action_icon_state = "collective_mind" @@ -370,10 +370,11 @@ It will create a choking cloud that will blind any non-thralls who enter.") target.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/blindness_smoke(null)) - if(thralls >= CEILING(7 * ticker.mode.thrall_ratio, 1) && !drainLifeAcquired) - drainLifeAcquired = 1 - to_chat(target, "The power of your thralls has granted you the Drain Life ability. You can now drain the health of nearby humans to heal yourself.") - target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/drainLife(null)) + if(thralls >= CEILING(7 * ticker.mode.thrall_ratio, 1) && !nullChargeAcquired) + nullChargeAcquired = 1 + to_chat(user, "The power of your thralls has granted you the Null Charge ability. This ability will drain an APC's contents to the void, preventing it from recharging \ + or sending power until repaired.") + target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/null_charge(null)) if(thralls >= CEILING(9 * ticker.mode.thrall_ratio, 1) && !reviveThrallAcquired) reviveThrallAcquired = 1 @@ -491,45 +492,57 @@ for(var/obj/structure/window/W in T.contents) W.take_damage(rand(80, 100)) -/obj/effect/proc_holder/spell/aoe_turf/drainLife - name = "Drain Life" - desc = "Damages nearby humans, draining their life and healing your own wounds." +/obj/effect/proc_holder/spell/aoe_turf/null_charge + name = "Null Charge" + desc = "Empties an APC, preventing it from recharging until fixed." panel = "Shadowling Abilities" - range = 3 - charge_max = 100 - clothes_req = 0 - var/targetsDrained - var/list/nearbyTargets - action_icon_state = "drain_life" + charge_max = 600 + clothes_req = FALSE + action_icon_state = "null_charge" -/obj/effect/proc_holder/spell/aoe_turf/drainLife/cast(list/targets, mob/user = usr) +/obj/effect/proc_holder/spell/aoe_turf/null_charge/cast(mob/user = usr) if(!shadowling_check(user)) charge_counter = charge_max return - var/mob/living/carbon/human/U = usr - targetsDrained = 0 - nearbyTargets = list() - for(var/turf/T in targets) - for(var/mob/living/carbon/M in T.contents) - if(M == src) - continue - targetsDrained++ - nearbyTargets.Add(M) - if(!targetsDrained) + + var/list/local_objs = view(1, user) + var/obj/machinery/power/apc/target_apc + for(var/object in local_objs) + if(istype(object, /obj/machinery/power/apc)) + target_apc = object + break + + if(!target_apc) + to_chat(user, "You must stand next to an APC to drain it!") charge_counter = charge_max - to_chat(U, "There were no nearby humans for you to drain.") return - for(var/mob/living/carbon/M in nearbyTargets) - U.heal_organ_damage(10, 10) - U.adjustToxLoss(-10) - U.adjustOxyLoss(-10) - U.adjustStaminaLoss(-20) - U.AdjustWeakened(-1) - U.AdjustStunned(-1) - M.adjustOxyLoss(20) - M.adjustStaminaLoss(20) - to_chat(M, "You feel a wave of exhaustion and a curious draining sensation directed towards [U]!") - to_chat(U, "You draw life from those around you to heal your wounds.") + + if(target_apc.cell?.charge == 0) + to_chat(user, "APC must have a power to drain!") + charge_counter = charge_max + return + + target_apc.operating = 0 + target_apc.update() + target_apc.update_icon() + target_apc.visible_message("The [target_apc] flickers and begins to grow dark.") + + to_chat(user, "You dim the APC's screen and carefully begin siphoning its power into the void.") + if(!do_after(user, 200, target=target_apc)) + //Whoops! The APC's powers back on + to_chat(user, "Your concentration breaks and the APC suddenly repowers!") + target_apc.operating = 1 + target_apc.update() + target_apc.update_icon() + target_apc.visible_message("The [target_apc] begins glowing brightly!") + else + //We did it! + to_chat(user, "You sent the APC's power to the void while overloading all it's lights!") + target_apc.cell?.charge = 0 //Sent to the shadow realm + target_apc.chargemode = 0 //Won't recharge either until an someone hits the button + target_apc.charging = 0 + target_apc.null_charge() + target_apc.update_icon() diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index f78520ac7eb..5e7b8f9a237 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -226,6 +226,7 @@ target.Weaken(5) target.stuttering = 20 to_chat(target, "You are blinded by [user]'s glare.") + add_attack_logs(user, target, "(Vampire) Glared at") /obj/effect/proc_holder/spell/vampire/self/shapeshift name = "Shapeshift (50)" diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index dbe3146dd7f..243f4e3a3fa 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -153,9 +153,13 @@ src.spawn_amt_left = spawn_amt src.desc = desc - processing_objects.Add(src) + START_PROCESSING(SSobj, src) //return +/obj/effect/rend/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + /obj/effect/rend/process() for(var/mob/M in loc) return diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 66cdff69b3f..0a1340d885b 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -469,6 +469,24 @@ dat += "Already cast!
" return dat +/datum/spellbook_entry/summon/ghosts + name = "Summon Ghosts" + desc = "Spook the crew out by making them see dead people. Be warned, ghosts are capricious and occasionally vindicative, and some will use their incredibly minor abilities to frustrate you." + cost = 0 + +/datum/spellbook_entry/summon/ghosts/IsAvailible() + if(!ticker.mode) + return FALSE + else + return TRUE + +/datum/spellbook_entry/summon/ghosts/Buy(mob/living/carbon/human/user, obj/item/spellbook/book) + new /datum/event/wizard/ghost() + active = TRUE + to_chat(user, "You have cast summon ghosts!") + playsound(get_turf(user), 'sound/effects/ghost2.ogg', 50, 1) + return TRUE + /datum/spellbook_entry/summon/guns name = "Summon Guns" category = "Rituals" diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 9e06d662053..eebe4f2e9e4 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -256,6 +256,8 @@ if(H.mind && H.mind.initial_account) C.associated_account_number = H.mind.initial_account.account_number + C.owner_uid = H.UID() + C.owner_ckey = H.ckey /datum/outfit/job/proc/imprint_pda(mob/living/carbon/human/H) var/obj/item/pda/PDA = H.wear_pda @@ -265,3 +267,10 @@ PDA.ownjob = C.assignment PDA.ownrank = C.rank PDA.name = "PDA-[H.real_name] ([PDA.ownjob])" + +/datum/job/proc/would_accept_job_transfer_from_player(mob/player) + if(!guest_jobbans(title)) // actually checks if job is a whitelisted position + return TRUE + if(!istype(player)) + return FALSE + return is_job_whitelisted(player, title) diff --git a/code/game/jobs/job_exp.dm b/code/game/jobs/job_exp.dm index 6f5be69280a..7c228ba554f 100644 --- a/code/game/jobs/job_exp.dm +++ b/code/game/jobs/job_exp.dm @@ -257,13 +257,14 @@ var/global/list/role_playtime_requirements = list( play_records[rtype] = text2num(read_records[rtype]) else play_records[rtype] = 0 - if(mob.stat == CONSCIOUS && mob.mind.assigned_role) + var/myrole = mob.mind.playtime_role ? mob.mind.playtime_role : mob.mind.assigned_role + if(mob.stat == CONSCIOUS && myrole) play_records[EXP_TYPE_LIVING] += minutes if(announce_changes) to_chat(mob,"You got: [minutes] Living EXP!") for(var/category in exp_jobsmap) if(exp_jobsmap[category]["titles"]) - if(mob.mind.assigned_role in exp_jobsmap[category]["titles"]) + if(myrole in exp_jobsmap[category]["titles"]) play_records[category] += minutes if(announce_changes) to_chat(mob,"You got: [minutes] [category] EXP!") diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 95e609ee524..e392b468557 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -371,7 +371,15 @@ update_flag SSnanoui.update_uis(src) // Update all NanoUIs attached to src - +/obj/machinery/portable_atmospherics/canister/replace_tank(mob/living/user, close_valve) + . = ..() + if(.) + if(close_valve) + valve_open = FALSE + update_icon() + investigate_log("Valve was closed by [key_name(user)].
", "atmos") + else if(valve_open && holding) + investigate_log("[key_name(user)] started a transfer into [holding].
", "atmos") /obj/machinery/portable_atmospherics/canister/attack_ai(var/mob/user as mob) src.add_hiddenprint(user) diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index dfecc3a4409..71e1310f96b 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -82,16 +82,49 @@ /obj/machinery/portable_atmospherics/portableConnectorReturnAir() return air_contents -/obj/machinery/portable_atmospherics/attackby(var/obj/item/W as obj, var/mob/user as mob, params) - if((istype(W, /obj/item/tank) && !( src.destroyed ))) - if(src.holding) - return - var/obj/item/tank/T = W - user.drop_item() - T.loc = src - src.holding = T - update_icon() +/obj/machinery/portable_atmospherics/AltClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") return + if(!in_range(src, user)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + if(holding) + to_chat(user, "You remove [holding] from [src].") + replace_tank(user, TRUE) + +/obj/machinery/portable_atmospherics/examine(mob/user) + ..() + if(holding) + to_chat(user, "\The [src] contains [holding]. Alt-click [src] to remove it.") + +/obj/machinery/portable_atmospherics/proc/replace_tank(mob/living/user, close_valve, obj/item/tank/new_tank) + if(holding) + holding.forceMove(drop_location()) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(holding) + if(new_tank) + holding = new_tank + else + holding = null + update_icon() + return TRUE + +/obj/machinery/portable_atmospherics/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/tank)) + if(!(stat & BROKEN)) + if(!user.drop_item()) + return + var/obj/item/tank/T = W + user.drop_item() + if(src.holding) + to_chat(user, "[holding ? "In one smooth motion you pop [holding] out of [src]'s connector and replace it with [T]" : "You insert [T] into [src]"].") + replace_tank(user, FALSE) + T.loc = src + src.holding = T + update_icon() + return else if(istype(W, /obj/item/wrench)) if(connected_port) diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index a7680e815ff..5bd441f6748 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -95,6 +95,16 @@ /obj/machinery/portable_atmospherics/pump/return_air() return air_contents +/obj/machinery/portable_atmospherics/pump/replace_tank(mob/living/user, close_valve) + . = ..() + if(.) + if(close_valve) + if(on) + on = FALSE + update_icon() + else if(on && holding && direction_out) + investigate_log("[key_name(user)] started a transfer into [holding].
", "atmos") + /obj/machinery/portable_atmospherics/pump/attack_ai(var/mob/user as mob) src.add_hiddenprint(user) return src.attack_hand(user) @@ -139,10 +149,14 @@ if(href_list["power"]) on = !on + if(on && direction_out) + investigate_log("[key_name(usr)] started a transfer into [holding].
", "atmos") update_icon() if(href_list["direction"]) direction_out = !direction_out + if(on && holding) + investigate_log("[key_name(usr)] started a transfer into [holding].
", "atmos") if(href_list["remove_tank"]) if(holding) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 7535381197a..0eb627d1e62 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -295,10 +295,10 @@ to_chat(O, "The screen bursts into static.") /obj/machinery/camera/proc/triggerCameraAlarm() - camera_alarm.triggerAlarm(loc, src) + SSalarms.camera_alarm.triggerAlarm(loc, src) /obj/machinery/camera/proc/cancelCameraAlarm() - camera_alarm.clearAlarm(loc, src) + SSalarms.camera_alarm.clearAlarm(loc, src) /obj/machinery/camera/proc/can_use() if(!status) diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index eeb9eeb60d3..17f64c07cb8 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -45,7 +45,7 @@ if(!status || (stat & NOPOWER)) return 0 if(detectTime == -1) - motion_alarm.clearAlarm(loc, src) + SSalarms.motion_alarm.clearAlarm(loc, src) detectTime = 0 return 1 @@ -53,7 +53,7 @@ if(!status || (stat & NOPOWER)) return 0 if(!detectTime) return 0 - motion_alarm.triggerAlarm(loc, src) + SSalarms.motion_alarm.triggerAlarm(loc, src) detectTime = -1 return 1 diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 6d360a2ddb3..54841a78a08 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -470,7 +470,7 @@ M.nutrition -= 50 //lose a lot of food var/turf/location = usr.loc if(istype(location, /turf/simulated)) - location.add_vomit_floor(src, 1) + location.add_vomit_floor(TRUE) if(ORION_TRAIL_FLUX) if(prob(75)) M.Weaken(3) diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index f2137d2ee8f..f8c2979e043 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -12,10 +12,10 @@ var/global/list/minor_air_alarms = list() /obj/machinery/computer/atmos_alert/New() ..() - atmosphere_alarm.register(src, /obj/machinery/computer/station_alert/update_icon) + SSalarms.atmosphere_alarm.register(src, /obj/machinery/computer/station_alert/update_icon) /obj/machinery/computer/atmos_alert/Destroy() - atmosphere_alarm.unregister(src) + SSalarms.atmosphere_alarm.unregister(src) return ..() /obj/machinery/computer/atmos_alert/attack_hand(mob/user) @@ -33,10 +33,10 @@ var/global/list/minor_air_alarms = list() var/major_alarms[0] var/minor_alarms[0] - for(var/datum/alarm/alarm in atmosphere_alarm.major_alarms()) + for(var/datum/alarm/alarm in SSalarms.atmosphere_alarm.major_alarms()) major_alarms[++major_alarms.len] = list("name" = sanitize(alarm.alarm_name()), "ref" = "\ref[alarm]") - for(var/datum/alarm/alarm in atmosphere_alarm.minor_alarms()) + for(var/datum/alarm/alarm in SSalarms.atmosphere_alarm.minor_alarms()) minor_alarms[++minor_alarms.len] = list("name" = sanitize(alarm.alarm_name()), "ref" = "\ref[alarm]") data["priority_alarms"] = major_alarms @@ -45,11 +45,11 @@ var/global/list/minor_air_alarms = list() return data /obj/machinery/computer/atmos_alert/update_icon() - var/list/alarms = atmosphere_alarm.major_alarms() + var/list/alarms = SSalarms.atmosphere_alarm.major_alarms() if(alarms.len) icon_screen = "alert:2" else - alarms = atmosphere_alarm.minor_alarms() + alarms = SSalarms.atmosphere_alarm.minor_alarms() if(alarms.len) icon_screen = "alert:1" else @@ -61,7 +61,7 @@ var/global/list/minor_air_alarms = list() return 1 if(href_list["clear_alarm"]) - var/datum/alarm/alarm = locate(href_list["clear_alarm"]) in atmosphere_alarm.alarms + var/datum/alarm/alarm = locate(href_list["clear_alarm"]) in SSalarms.atmosphere_alarm.alarms if(alarm) for(var/datum/alarm_source/alarm_source in alarm.sources) var/obj/machinery/alarm/air_alarm = alarm_source.source diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 2b294db78c9..c9e5e8ba676 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -56,6 +56,17 @@ /obj/item/circuitboard/machine board_type = "machine" +/obj/item/circuitboard/examine(mob/user) + ..() + if(LAZYLEN(req_components)) + var/list/nice_list = list() + for(var/B in req_components) + var/atom/A = B + if(!ispath(A)) + continue + nice_list += list("[req_components[A]] [initial(A.name)]") + to_chat(user,"Required components: [english_list(nice_list)].") + /obj/item/circuitboard/message_monitor name = "Circuit board (Message Monitor)" build_path = /obj/machinery/computer/message_monitor diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 5cb19358358..f4d21cbd125 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -66,14 +66,15 @@ var/time_last_changed_position = 0 /obj/machinery/computer/card/proc/get_target_rank() return modify && modify.assignment ? modify.assignment : "Unassigned" -/obj/machinery/computer/card/proc/format_jobs(list/jobs) +/obj/machinery/computer/card/proc/format_jobs(list/jobs, targetrank, list/jobformats) var/list/formatted = list() for(var/job in jobs) if(job_in_department(SSjobs.GetJob(job))) formatted.Add(list(list( "display_name" = replacetext(job, " ", " "), - "target_rank" = get_target_rank(), - "job" = job))) + "target_rank" = targetrank, + "job" = job, + "jlinkformat" = jobformats[job] ? jobformats[job] : null))) return formatted @@ -117,12 +118,14 @@ var/time_last_changed_position = 0 if(!usr.get_active_hand() && Adjacent(usr)) usr.put_in_hands(scan) scan = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else if(modify) to_chat(usr, "You remove \the [modify] from \the [src].") modify.forceMove(get_turf(src)) if(!usr.get_active_hand() && Adjacent(usr)) usr.put_in_hands(modify) modify = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else to_chat(usr, "There is nothing to remove from the console.") @@ -134,10 +137,12 @@ var/time_last_changed_position = 0 user.drop_item() id_card.loc = src scan = id_card + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else if(!modify) user.drop_item() id_card.loc = src modify = id_card + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) SSnanoui.update_uis(src) attack_hand(user) @@ -242,6 +247,7 @@ var/time_last_changed_position = 0 data["target_owner"] = modify && modify.registered_name ? modify.registered_name : "-----" data["target_rank"] = get_target_rank() data["scan_name"] = scan ? scan.name : "-----" + data["scan_owner"] = scan && scan.registered_name ? scan.registered_name : null data["authenticated"] = is_authenticated(user) data["has_modify"] = !!modify data["account_number"] = modify ? modify.associated_account_number : null @@ -249,15 +255,19 @@ var/time_last_changed_position = 0 data["all_centcom_access"] = null data["regions"] = null data["target_dept"] = target_dept + data["card_is_owned"] = modify && modify.owner_ckey - data["engineering_jobs"] = format_jobs(engineering_positions) - data["medical_jobs"] = format_jobs(medical_positions) - data["science_jobs"] = format_jobs(science_positions) - data["security_jobs"] = format_jobs(security_positions) - data["support_jobs"] = format_jobs(support_positions) - data["civilian_jobs"] = format_jobs(civilian_positions) - data["special_jobs"] = format_jobs(whitelisted_positions) - data["centcom_jobs"] = format_jobs(get_all_centcom_jobs()) + var/list/job_formats = SSjobs.format_jobs_for_id_computer(modify) + + data["top_jobs"] = format_jobs(list("Captain", "Custom"), data["target_rank"], job_formats) + data["engineering_jobs"] = format_jobs(engineering_positions, data["target_rank"], job_formats) + data["medical_jobs"] = format_jobs(medical_positions, data["target_rank"], job_formats) + data["science_jobs"] = format_jobs(science_positions, data["target_rank"], job_formats) + data["security_jobs"] = format_jobs(security_positions, data["target_rank"], job_formats) + data["support_jobs"] = format_jobs(support_positions, data["target_rank"], job_formats) + data["civilian_jobs"] = format_jobs(civilian_positions, data["target_rank"], job_formats) + data["special_jobs"] = format_jobs(whitelisted_positions, data["target_rank"], job_formats) + data["centcom_jobs"] = format_jobs(get_all_centcom_jobs(), data["target_rank"], job_formats) data["card_skins"] = format_card_skins(get_station_card_skins()) data["job_slots"] = format_job_slots() @@ -268,6 +278,9 @@ var/time_last_changed_position = 0 data["cooldown_mins"] = mins data["cooldown_secs"] = (seconds < 10) ? "0[seconds]" : seconds + if(mode == 3 && is_authenticated(user)) + data["id_change_html"] = SSjobs.fetch_transfer_record_html(is_centcom()) + if(modify) data["current_skin"] = modify.icon_state @@ -315,15 +328,18 @@ var/time_last_changed_position = 0 if(!usr.get_active_hand() && Adjacent(usr)) usr.put_in_hands(modify) modify = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else modify.forceMove(get_turf(src)) modify = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else if(Adjacent(usr)) var/obj/item/I = usr.get_active_hand() if(istype(I, /obj/item/card/id)) usr.drop_item() I.forceMove(src) modify = I + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) if("scan") if(scan) @@ -332,15 +348,18 @@ var/time_last_changed_position = 0 if(!usr.get_active_hand() && Adjacent(usr)) usr.put_in_hands(scan) scan = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else scan.forceMove(get_turf(src)) scan = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else if(Adjacent(usr)) var/obj/item/I = usr.get_active_hand() if(istype(I, /obj/item/card/id)) usr.drop_item() I.forceMove(src) scan = I + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) if("access") if(href_list["allowed"] && !target_dept) @@ -361,7 +380,7 @@ var/time_last_changed_position = 0 if("assign") if(is_authenticated(usr) && modify) var/t1 = href_list["assign_target"] - if(target_dept && modify.assignment == "Unassigned") + if(target_dept && modify.assignment == "Demoted") visible_message("[src]: Demoted individuals must see the HoP for a new job.") return 0 if(!job_in_department(SSjobs.GetJob(modify.rank), FALSE)) @@ -373,11 +392,12 @@ var/time_last_changed_position = 0 var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,MAX_MESSAGE_LEN)) //let custom jobs function as an impromptu alt title, mainly for sechuds if(temp_t && modify) + SSjobs.log_job_transfer(modify.registered_name, modify.getRankAndAssignment(), temp_t, scan.registered_name) modify.assignment = temp_t log_game("[key_name(usr)] has given \"[modify.registered_name]\" the custom job title \"[temp_t]\".") else var/list/access = list() - if(is_centcom()) + if(is_centcom() && islist(get_centcom_access(t1))) access = get_centcom_access(t1) else var/datum/job/jobdatum @@ -397,6 +417,16 @@ var/time_last_changed_position = 0 if(t1 == "Civilian") message_admins("[key_name_admin(usr)] has reassigned \"[modify.registered_name]\" from \"[jobnamedata]\" to \"[t1]\".") + SSjobs.log_job_transfer(modify.registered_name, jobnamedata, t1, scan.registered_name) + SSjobs.slot_job_transfer(modify.rank, t1) + + var/mob/living/carbon/human/H = modify.getPlayer() + if(istype(H)) + if(jobban_isbanned(H, t1)) + message_admins("[ADMIN_FULLMONTY(H)] has been assigned the job [t1], in possible violation of their job ban.") + if(H.mind) + H.mind.playtime_role = t1 + modify.access = access modify.rank = t1 modify.assignment = t1 @@ -426,6 +456,20 @@ var/time_last_changed_position = 0 if("mode") mode = text2num(href_list["mode_target"]) + if("wipe_my_logs") + if(is_authenticated(usr) && is_centcom()) + var/delcount = SSjobs.delete_log_records(scan.registered_name, FALSE) + if(delcount) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + SSnanoui.update_uis(src) + + if("wipe_all_logs") + if(is_authenticated(usr) && !target_dept) + var/delcount = SSjobs.delete_log_records(scan.registered_name, TRUE) + if(delcount) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + SSnanoui.update_uis(src) + if("print") if(!printing && !target_dept) printing = 1 @@ -464,14 +508,15 @@ var/time_last_changed_position = 0 var/jobnamedata = modify.getRankAndAssignment() log_game("[key_name(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".") message_admins("[key_name_admin(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".") + SSjobs.log_job_transfer(modify.registered_name, jobnamedata, "Terminated", scan.registered_name) modify.assignment = "Terminated" modify.access = list() callHook("terminate_employee", list(modify)) if("demote") if(is_authenticated(usr)) - if(modify.assignment == "Unassigned") - visible_message("[src]: Unassigned crew cannot be demoted any further. If further action is warranted, ask the Captain about Termination.") + if(modify.assignment == "Demoted") + visible_message("[src]: Demoted crew cannot be demoted any further. If further action is warranted, ask the Captain about Termination.") return 0 if(!job_in_department(SSjobs.GetJob(modify.rank), FALSE)) visible_message("[src]: Heads may only demote members of their own department.") @@ -482,12 +527,13 @@ var/time_last_changed_position = 0 access = jobdatum.get_access() var/jobnamedata = modify.getRankAndAssignment() - log_game("[key_name(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" to \"Civilian (Unassigned)\".") - message_admins("[key_name_admin(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" to \"Civilian (Unassigned)\".") + log_game("[key_name(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" to \"Civilian (Demoted)\".") + message_admins("[key_name_admin(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" to \"Civilian (Demoted)\".") + SSjobs.log_job_transfer(modify.registered_name, jobnamedata, "Demoted", scan.registered_name) modify.access = access modify.rank = "Civilian" - modify.assignment = "Unassigned" + modify.assignment = "Demoted" modify.icon_state = "id" if("make_job_available") diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm index a5198da6e56..b39c005855c 100644 --- a/code/game/machinery/computer/power.dm +++ b/code/game/machinery/computer/power.dm @@ -38,7 +38,7 @@ if(isturf(T)) attached = locate() in T if(attached) - return attached.get_powernet() + return attached.powernet /obj/machinery/computer/monitor/attack_ai(mob/user) attack_hand(user) diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 8fefabbf877..75c4e466a79 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -54,6 +54,7 @@ /obj/machinery/disco/Destroy() dance_over() selection = null + STOP_PROCESSING(SSobj, src) return ..() /obj/machinery/disco/attackby(obj/item/O, mob/user, params) @@ -128,7 +129,7 @@ active = TRUE update_icon() dance_setup() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) lights_spin() updateUsrDialog() else if(active) @@ -472,7 +473,7 @@ L.stop_sound_channel(CHANNEL_JUKEBOX) else if(active) active = FALSE - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) dance_over() playsound(src,'sound/machines/terminal_off.ogg',50,1) icon_state = "disco0" diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 496d8942bcc..5a53381ef07 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -39,8 +39,7 @@ if(command_completed(cur_command)) cur_command = null else - if(!isprocessing) - START_PROCESSING(SSmachines, src) + START_PROCESSING(SSmachines, src) /obj/machinery/door/airlock/proc/do_command(command) switch(command) diff --git a/code/game/machinery/embedded_controller/embedded_program_base.dm b/code/game/machinery/embedded_controller/embedded_program_base.dm index 1fe527df13b..5bd46b2f3e0 100644 --- a/code/game/machinery/embedded_controller/embedded_program_base.dm +++ b/code/game/machinery/embedded_controller/embedded_program_base.dm @@ -17,8 +17,8 @@ /datum/computer/file/embedded_program/proc/receive_signal(datum/signal/signal, receive_method, receive_param) return -/datum/computer/file/embedded_program/proc/process() - return +/datum/computer/file/embedded_program/process() + return FALSE /datum/computer/file/embedded_program/proc/post_signal(datum/signal/signal, comm_line) if(master) diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index f1651d5bb99..835b0264229 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -143,7 +143,7 @@ FIRE ALARM alarm() time = 0 timing = 0 - processing_objects -= src + STOP_PROCESSING(SSobj, src) updateDialog() last_process = world.timeofday @@ -206,9 +206,9 @@ FIRE ALARM last_process = world.timeofday if(oldTiming != timing) if(timing) - processing_objects += src + START_PROCESSING(SSobj, src) else - processing_objects -= src + STOP_PROCESSING(SSobj, src) else if(href_list["tp"]) var/tp = text2num(href_list["tp"]) time += tp @@ -220,7 +220,7 @@ FIRE ALARM var/area/A = get_area(src) A.fire_reset() for(var/obj/machinery/firealarm/FA in A) - fire_alarm.clearAlarm(loc, FA) + SSalarms.fire_alarm.clearAlarm(loc, FA) return /obj/machinery/firealarm/proc/alarm(var/duration = 0) @@ -228,7 +228,7 @@ FIRE ALARM return var/area/A = get_area(src) for(var/obj/machinery/firealarm/FA in A) - fire_alarm.triggerAlarm(loc, FA, duration) + SSalarms.fire_alarm.triggerAlarm(loc, FA, duration) update_icon() //playsound(loc, 'sound/ambience/signal.ogg', 75, 0) return diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index c74ee23d25c..91dcb43ab57 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -118,25 +118,22 @@ Class Procs: var/use_log = list() var/list/settagwhitelist = list()//WHITELIST OF VARIABLES THAT THE set_tag HREF CAN MODIFY, DON'T PUT SHIT YOU DON'T NEED ON HERE, AND IF YOU'RE GONNA USE set_tag (format_tag() proc), ADD TO THIS LIST. atom_say_verb = "beeps" - var/defer_process = 0 var/siemens_strength = 0.7 // how badly will it shock you? -/obj/machinery/Initialize() - addAtProcessing() +/obj/machinery/Initialize(mapload) + if(!armor) + armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0) . = ..() - power_change() + GLOB.machines += src -/obj/machinery/proc/addAtProcessing() if(use_power) myArea = get_area(src) if(!speed_process) - if(!defer_process) - START_PROCESSING(SSmachines, src) - else - START_DEFERRED_PROCESSING(SSmachines, src) + START_PROCESSING(SSmachines, src) else - GLOB.fast_processing += src - isprocessing = TRUE // all of these isprocessing = TRUE can be removed when the PS is dead + START_PROCESSING(SSfastprocess, src) + + power_change() // gotta go fast /obj/machinery/makeSpeedProcess() @@ -144,7 +141,7 @@ Class Procs: return speed_process = TRUE STOP_PROCESSING(SSmachines, src) - GLOB.fast_processing += src + START_PROCESSING(SSfastprocess, src) // gotta go slow /obj/machinery/makeNormalProcess() @@ -152,20 +149,16 @@ Class Procs: return speed_process = FALSE START_PROCESSING(SSmachines, src) - GLOB.fast_processing -= src - -/obj/machinery/New() //new - if(!armor) - armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0) - GLOB.machines += src - ..() + STOP_PROCESSING(SSfastprocess, src) /obj/machinery/Destroy() if(myArea) myArea = null - GLOB.fast_processing -= src - STOP_PROCESSING(SSmachines, src) - GLOB.machines -= src + GLOB.machines.Remove(src) + if(!speed_process) + STOP_PROCESSING(SSmachines, src) + else + STOP_PROCESSING(SSfastprocess, src) return ..() /obj/machinery/proc/locate_machinery() diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 1b3dfe19001..bb5847fc6fb 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -2,8 +2,8 @@ name = "Pipe Dispenser" icon = 'icons/obj/stationobjs.dmi' icon_state = "pipe_d" - density = 1 - anchored = 1 + density = TRUE + anchored = TRUE var/unwrenched = 0 var/wait = 0 @@ -75,29 +75,25 @@ /obj/machinery/pipedispenser/Topic(href, href_list) if(..() || unwrenched) - return 1 + return usr.set_machine(src) add_fingerprint(usr) + if(world.time < wait + 4) + return + wait = world.time if(href_list["make"]) - if(!wait) - var/p_type = text2num(href_list["make"]) - var/p_dir = text2num(href_list["dir"]) - var/obj/item/pipe/P = new (loc, pipe_type=p_type, dir=p_dir) - P.update() - P.add_fingerprint(usr) - wait = world.time + 10 + var/p_type = text2num(href_list["make"]) + var/p_dir = text2num(href_list["dir"]) + var/obj/item/pipe/P = new (loc, pipe_type=p_type, dir=p_dir) + P.update() + P.add_fingerprint(usr) if(href_list["makemeter"]) - if(wait < world.time) - new /obj/item/pipe_meter(loc) - wait = world.time + 15 + new /obj/item/pipe_meter(loc) if(href_list["makegsensor"]) - if(!wait) - new /obj/item/pipe_gsensor(loc) - wait = 1 - spawn(15) - wait = 0 + new /obj/item/pipe_gsensor(loc) + return TRUE /obj/machinery/pipedispenser/attackby(var/obj/item/W as obj, var/mob/user as mob, params) add_fingerprint(usr) @@ -140,8 +136,6 @@ name = "Disposal Pipe Dispenser" icon = 'icons/obj/stationobjs.dmi' icon_state = "pipe_d" - density = 1 - anchored = 1.0 //Allow you to drag-drop disposal pipes into it /obj/machinery/pipedispenser/disposal/MouseDrop_T(var/obj/structure/disposalconstruct/pipe, mob/usr) @@ -182,16 +176,10 @@ popup.open() /obj/machinery/pipedispenser/disposal/Topic(href, href_list) - if(..() || unwrenched) - return 1 - - usr.set_machine(src) - add_fingerprint(usr) - - if(wait < world.time) + if(!..()) + return + if(href_list["dmake"]) var/p_type = text2num(href_list["dmake"]) var/obj/structure/disposalconstruct/C = new(loc, p_type) if(p_type in list(PIPE_DISPOSALS_BIN, PIPE_DISPOSALS_OUTLET, PIPE_DISPOSALS_CHUTE)) C.density = TRUE - C.add_fingerprint(usr) - wait = world.time + 15 diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 304dc7dc639..6422e94dc74 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -188,11 +188,11 @@ /obj/machinery/power/singularity_beacon/process() if(!active) return PROCESS_KILL + + if(surplus() >= 1500) + add_load(1500) else - if(surplus() > 1500) - draw_power(1500) - else - Deactivate() + Deactivate() /obj/machinery/power/singularity_beacon/syndicate icontype = "beaconsynd" diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index f02b8411e38..9f664eaad76 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -39,7 +39,7 @@ /obj/machinery/syndicatebomb/process() if(!active) - GLOB.fast_processing -= src + STOP_PROCESSING(SSfastprocess, src) detonation_timer = null next_beep = null countdown.stop() @@ -73,7 +73,7 @@ if(defused && payload in src) payload.defuse() countdown.stop() - GLOB.fast_processing -= src + STOP_PROCESSING(SSfastprocess, src) /obj/machinery/syndicatebomb/New() wires = new(src) @@ -86,7 +86,7 @@ /obj/machinery/syndicatebomb/Destroy() QDEL_NULL(wires) QDEL_NULL(countdown) - GLOB.fast_processing -= src + STOP_PROCESSING(SSfastprocess, src) return ..() /obj/machinery/syndicatebomb/examine(mob/user) @@ -205,7 +205,7 @@ /obj/machinery/syndicatebomb/proc/activate() active = TRUE - GLOB.fast_processing += src + START_PROCESSING(SSfastprocess, src) countdown.start() next_beep = world.time + 10 detonation_timer = world.time + (timer_set * 10) diff --git a/code/game/machinery/telecomms/ntsl2.dm b/code/game/machinery/telecomms/ntsl2.dm index f01f173ebb3..604fcdfbe7e 100644 --- a/code/game/machinery/telecomms/ntsl2.dm +++ b/code/game/machinery/telecomms/ntsl2.dm @@ -10,109 +10,109 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) */ /datum/nttc_configuration // ALL OF THE JOB CRAP - // Dict of all jobs and their colors + // Dict of all jobs and their department color classes var/all_jobs = list( // AI - "AI" = "#FF00FF", - "Android" = "#FF00FF", - "Cyborg" = "#FF00FF", - "Personal AI" = "#FF00FF", - "Robot" = "#FF00FF", + "AI" = "airadio", + "Android" = "airadio", + "Cyborg" = "airadio", + "Personal AI" = "airadio", + "Robot" = "airadio", // Civilian + Varients - "Assistant" = "#408010", - "Businessman" = "#408010", - "Civilian" = "#408010", - "Tourist" = "#408010", - "Trader" = "#408010", + "Assistant" = "radio", + "Businessman" = "radio", + "Civilian" = "radio", + "Tourist" = "radio", + "Trader" = "radio", // Command (Solo command, not department heads) - "Blueshield" = "#204090", - "Captain" = "#204090", - "Head of Personnel" = "#204090", - "Nanotrasen Representative" = "#204090", + "Blueshield" = "comradio", + "Captain" = "comradio", + "Head of Personnel" = "comradio", + "Nanotrasen Representative" = "comradio", // Engineeering - "Atmospheric Technician" = "#A66300", - "Chief Engineer" = "#A66300", - "Electrician" = "#A66300", - "Engine Technician" = "#A66300", - "Life Support Specialist" = "#A66300", - "Maintenance Technician" = "#A66300", - "Mechanic" = "#A66300", - "Station Engineer" = "#A66300", + "Atmospheric Technician" = "engradio", + "Chief Engineer" = "engradio", + "Electrician" = "engradio", + "Engine Technician" = "engradio", + "Life Support Specialist" = "engradio", + "Maintenance Technician" = "engradio", + "Mechanic" = "engradio", + "Station Engineer" = "engradio", // ERT - "Emergency Response Team Engineer" = "#5C5C7C", - "Emergency Response Team Leader" = "#5C5C7C", - "Emergency Response Team Medic" = "#5C5C7C", - "Emergency Response Team Member" = "#5C5C7C", - "Emergency Response Team Officer" = "#5C5C7C", + "Emergency Response Team Engineer" = "dsquadradio", // I know this says deathsquad but the class for responseteam is neon green. No. + "Emergency Response Team Leader" = "dsquadradio", + "Emergency Response Team Medic" = "dsquadradio", + "Emergency Response Team Member" = "dsquadradio", + "Emergency Response Team Officer" = "dsquadradio", // Medical - "Chemist" = "#009190", - "Chief Medical Officer" = "#009190", - "Coroner" = "#009190", - "Medical Doctor" = "#009190", - "Microbiologist" = "#009190", - "Nurse" = "#009190", - "Paramedic" = "#009190", - "Pharmacologist" = "#009190", - "Pharmacist" = "#009190", - "Psychiatrist" = "#009190", - "Psychologist" = "#009190", - "Surgeon" = "#009190", - "Therapist" = "#009190", - "Virologist" = "#009190", + "Chemist" = "medradio", + "Chief Medical Officer" = "medradio", + "Coroner" = "medradio", + "Medical Doctor" = "medradio", + "Microbiologist" = "medradio", + "Nurse" = "medradio", + "Paramedic" = "medradio", + "Pharmacologist" = "medradio", + "Pharmacist" = "medradio", + "Psychiatrist" = "medradio", + "Psychologist" = "medradio", + "Surgeon" = "medradio", + "Therapist" = "medradio", + "Virologist" = "medradio", // Science - "Anomalist" = "#993399", - "Biomechanical Engineer" = "#993399", - "Chemical Researcher" = "#993399", - "Geneticist" = "#993399", - "Mechatronic Engineer" = "#993399", - "Plasma Researcher" = "#993399", - "Research Director" = "#993399", - "Roboticist" = "#993399", - "Scientist" = "#993399", - "Xenoarcheologist" = "#993399", - "Xenobiologist" = "#993399", + "Anomalist" = "sciradio", + "Biomechanical Engineer" = "sciradio", + "Chemical Researcher" = "sciradio", + "Geneticist" = "sciradio", + "Mechatronic Engineer" = "sciradio", + "Plasma Researcher" = "sciradio", + "Research Director" = "sciradio", + "Roboticist" = "sciradio", + "Scientist" = "sciradio", + "Xenoarcheologist" = "sciradio", + "Xenobiologist" = "sciradio", // Security - "Brig Physician" = "#A30000", - "Detective" = "#A30000", - "Forensic Technician" = "#A30000", - "Head of Security" = "#A30000", - "Human Resources Agent" = "#A30000", - "Internal Affairs Agent" = "#A30000", - "Magistrate" = "#A30000", - "Security Officer" = "#A30000", - "Security Pod Pilot" = "#A30000", - "Warden" = "#A30000", + "Brig Physician" = "secradio", + "Detective" = "secradio", + "Forensic Technician" = "secradio", + "Head of Security" = "secradio", + "Human Resources Agent" = "secradio", + "Internal Affairs Agent" = "secradio", + "Magistrate" = "secradio", + "Security Officer" = "secradio", + "Security Pod Pilot" = "secradio", + "Warden" = "secradio", // Supply - "Quartermaster" = "#7F6539", - "Cargo Technician" = "#7F6539", - "Shaft Miner" = "#7F6539", - "Spelunker" = "#7F6539", + "Quartermaster" = "supradio", + "Cargo Technician" = "supradio", + "Shaft Miner" = "supradio", + "Spelunker" = "supradio", // Service - "Barber" = "#80A000", - "Bartender" = "#80A000", - "Beautician" = "#80A000", - "Botanical Researcher" = "#80A000", - "Botanist" = "#80A000", - "Butcher" = "#80A000", - "Chaplain" = "#80A000", - "Chef" = "#80A000", - "Clown" = "#80A000", - "Cook" = "#80A000", - "Culinary Artist" = "#80A000", - "Custodial Technician" = "#80A000", - "Hair Stylist" = "#80A000", - "Hydroponicist" = "#80A000", - "Janitor" = "#80A000", - "Journalist" = "#80A000", - "Librarian" = "#80A000", - "Mime" = "#80A000", + "Barber" = "srvradio", + "Bartender" = "srvradio", + "Beautician" = "srvradio", + "Botanical Researcher" = "srvradio", + "Botanist" = "srvradio", + "Butcher" = "srvradio", + "Chaplain" = "srvradio", + "Chef" = "srvradio", + "Clown" = "srvradio", + "Cook" = "srvradio", + "Culinary Artist" = "srvradio", + "Custodial Technician" = "srvradio", + "Hair Stylist" = "srvradio", + "Hydroponicist" = "srvradio", + "Janitor" = "srvradio", + "Journalist" = "srvradio", + "Librarian" = "srvradio", + "Mime" = "srvradio", ) // Just command members var/heads = list("Captain", "Head of Personnel", "Nanotrasen Representative", "Blueshield", "Chief Engineer", "Chief Medical Officer", "Research Director", "Head of Security") // Just ERT var/ert_jobs = list("Emergency Response Team Officer", "Emergency Response Team Engineer", "Emergency Response Team Medic", "Emergency Response Team Leader", "Emergency Response Team Member") // Defined so code compiles and incase someone has a non-standard job - var/job_color = "#000000" + var/job_class = "radio" // NOW FOR ACTUAL TOGGLES /* Simple Toggles */ var/toggle_activated = TRUE @@ -274,10 +274,10 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) // All job and coloring shit if(toggle_job_color || toggle_name_color) var/job = signal.data["job"] - job_color = all_jobs[job] + job_class = all_jobs[job] if(toggle_name_color) - var/new_name = "" + signal.data["name"] + "" + var/new_name = "" + signal.data["name"] + "" signal.data["name"] = new_name signal.data["realname"] = new_name // this is required because the broadcaster uses this directly if the speaker doesn't have a voice changer on @@ -289,13 +289,13 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) if(toggle_job_color) switch(job_indicator_type) if(JOB_STYLE_1) - new_name = signal.data["name"] + " ([job]) " + new_name = signal.data["name"] + " ([job]) " if(JOB_STYLE_2) - new_name = signal.data["name"] + " - [job] " + new_name = signal.data["name"] + " - [job] " if(JOB_STYLE_3) - new_name = "\[[job]\] " + signal.data["name"] + " " + new_name = "\[[job]\] " + signal.data["name"] + " " if(JOB_STYLE_4) - new_name = "([job]) " + signal.data["name"] + " " + new_name = "([job]) " + signal.data["name"] + " " else switch(job_indicator_type) if(JOB_STYLE_1) diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 8014a149cf4..54bd17920bd 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -166,10 +166,10 @@ name = "Automatic X-Ray 5000" desc = "A large metalic machine with an entrance and an exit. A sign on the side reads, 'backpack go in, backpack come out', 'human go in, irradiated human come out'." -/obj/machinery/transformer/xray/New() +/obj/machinery/transformer/xray/Initialize(mapload) + . = ..() // On us new /obj/machinery/conveyor/auto(loc, EAST) - addAtProcessing() /obj/machinery/transformer/xray/conveyor/New() ..() diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index f1ad010ea93..8a910670201 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -4,7 +4,7 @@ /obj/item/mecha_parts/mecha_equipment/medical/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/mecha_parts/mecha_equipment/medical/can_attach(obj/mecha/medical/M) @@ -13,19 +13,19 @@ /obj/item/mecha_parts/mecha_equipment/medical/attach(obj/mecha/M) ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/mecha_parts/mecha_equipment/medical/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/mecha_parts/mecha_equipment/medical/process() if(!chassis) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return 1 /obj/item/mecha_parts/mecha_equipment/medical/detach() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/mecha_parts/mecha_equipment/medical/sleeper @@ -66,7 +66,7 @@ return target.forceMove(src) patient = target - processing_objects.Add(src) + START_PROCESSING(SSobj, src) update_equip_info() occupant_message("[target] successfully loaded into [src]. Life support functions engaged.") chassis.visible_message("[chassis] loads [target] into [src].") @@ -90,7 +90,7 @@ patient.forceMove(get_turf(src)) occupant_message("[patient] ejected. Life support functions disabled.") log_message("[patient] ejected. Life support functions disabled.") - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) patient = null update_equip_info() @@ -98,7 +98,7 @@ if(patient) occupant_message("Unable to detach [src] - equipment occupied!") return - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/mecha_parts/mecha_equipment/medical/sleeper/get_equip_info() @@ -221,7 +221,7 @@ set_ready_state(1) log_message("Deactivated.") occupant_message("[src] deactivated - no power.") - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return var/mob/living/carbon/M = patient if(!M) @@ -263,11 +263,11 @@ processed_reagents = new /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/detach() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/critfail() @@ -374,7 +374,7 @@ m++ if(processed_reagents.len) message += " added to production" - processing_objects.Add(src) + START_PROCESSING(SSobj, src) occupant_message(message) occupant_message("Reagent processing started.") log_message("Reagent processing started.") @@ -513,7 +513,7 @@ if(!processed_reagents.len || reagents.total_volume >= reagents.maximum_volume || !chassis.has_charge(energy_drain)) occupant_message("Reagent processing stopped.") log_message("Reagent processing stopped.") - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return var/amount = synth_speed / processed_reagents.len for(var/reagent in processed_reagents) diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index b1a110813e8..edeb2424711 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -116,14 +116,14 @@ /obj/item/mecha_parts/mecha_equipment/mining_scanner/attach(obj/mecha/M) . = ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) M.occupant_sight_flags |= SEE_TURFS if(M.occupant) M.occupant.update_sight() /obj/item/mecha_parts/mecha_equipment/mining_scanner/detach() chassis.occupant_sight_flags &= ~SEE_TURFS - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) if(chassis.occupant) chassis.occupant.update_sight() return ..() diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index a42e76015c1..4cfbc5c8143 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -193,7 +193,7 @@ selectable = 0 /obj/item/mecha_parts/mecha_equipment/repair_droid/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) if(chassis) chassis.overlays -= droid_overlay return ..() @@ -205,7 +205,7 @@ /obj/item/mecha_parts/mecha_equipment/repair_droid/detach() chassis.overlays -= droid_overlay - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) /obj/item/mecha_parts/mecha_equipment/repair_droid/get_equip_info() if(!chassis) return @@ -217,12 +217,12 @@ if(href_list["toggle_repairs"]) chassis.overlays -= droid_overlay if(equip_ready) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) droid_overlay = new(icon, icon_state = "repair_droid_a") log_message("Activated.") set_ready_state(0) else - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) droid_overlay = new(icon, icon_state = "repair_droid") log_message("Deactivated.") set_ready_state(1) @@ -232,7 +232,7 @@ /obj/item/mecha_parts/mecha_equipment/repair_droid/process() if(!chassis) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) set_ready_state(1) return var/h_boost = health_boost @@ -250,10 +250,10 @@ repaired = 1 if(repaired) if(!chassis.use_power(energy_drain)) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) set_ready_state(1) else //no repair needed, we turn off - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) set_ready_state(1) chassis.overlays -= droid_overlay droid_overlay = new(icon, icon_state = "repair_droid") @@ -273,11 +273,11 @@ selectable = 0 /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/detach() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) ..() /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/proc/get_charge() @@ -302,11 +302,11 @@ ..() if(href_list["toggle_relay"]) if(equip_ready) //inactive - processing_objects.Add(src) + START_PROCESSING(SSobj, src) set_ready_state(0) log_message("Activated.") else - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) set_ready_state(1) log_message("Deactivated.") @@ -317,12 +317,12 @@ /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/process() if(!chassis || chassis.internal_damage & MECHA_INT_SHORT_CIRCUIT) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) set_ready_state(1) return var/cur_charge = chassis.get_charge() if(isnull(cur_charge) || !chassis.cell) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) set_ready_state(1) occupant_message("No powercell detected.") return @@ -358,11 +358,11 @@ /obj/item/mecha_parts/mecha_equipment/generator/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/mecha_parts/mecha_equipment/generator/detach() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) ..() /obj/item/mecha_parts/mecha_equipment/generator/Topic(href, href_list) @@ -370,11 +370,11 @@ if(href_list["toggle"]) if(equip_ready) //inactive set_ready_state(0) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) log_message("Activated.") else set_ready_state(1) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) log_message("Deactivated.") /obj/item/mecha_parts/mecha_equipment/generator/get_equip_info() @@ -447,11 +447,11 @@ /obj/item/mecha_parts/mecha_equipment/generator/process() if(!chassis) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) set_ready_state(1) return if(fuel_amount<=0) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) log_message("Deactivated - no fuel.") set_ready_state(1) return @@ -460,7 +460,7 @@ set_ready_state(1) occupant_message("No powercell detected.") log_message("Deactivated.") - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return var/use_fuel = fuel_per_cycle_idle if(cur_charge < chassis.cell.maxcharge) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 6cfd1d63942..35b94e2eed2 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -118,7 +118,7 @@ smoke_system.attach(src) add_cell() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) GLOB.poi_list |= src log_message("[src] created.") GLOB.mechas_list += src //global mech list @@ -670,7 +670,7 @@ QDEL_NULL(cell) QDEL_NULL(internal_tank) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) GLOB.poi_list.Remove(src) equipment.Cut() cell = null diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 59533b338a4..b44c4e3dd1b 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -24,7 +24,7 @@ spawn(3 + metal*3) process() spawn(120) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) sleep(30) if(metal) diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 405a0ec46f7..ddce32f68fa 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -30,15 +30,15 @@ /obj/effect/particle_effect/smoke/New() ..() - processing_objects |= src + START_PROCESSING(SSobj, src) lifetime += rand(-1,1) /obj/effect/particle_effect/smoke/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/effect/particle_effect/smoke/proc/kill_smoke() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) INVOKE_ASYNC(src, .proc/fade_out) QDEL_IN(src, 10) diff --git a/code/game/objects/effects/snowcloud.dm b/code/game/objects/effects/snowcloud.dm index 08a64d62f17..5723b66bc04 100644 --- a/code/game/objects/effects/snowcloud.dm +++ b/code/game/objects/effects/snowcloud.dm @@ -9,12 +9,12 @@ /obj/effect/snowcloud/New(turf, obj/machinery/snow_machine/SM) ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) if(SM && istype(SM)) parent_machine = SM /obj/effect/snowcloud/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/effect/snowcloud/process() @@ -73,12 +73,12 @@ anchored = TRUE /obj/effect/snow/New() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) icon_state = "snow[rand(1,6)]" ..() /obj/effect/snow/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/effect/snow/process() diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index f0233bb0f9e..d4336aa6cf3 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -107,7 +107,7 @@ ..() pixel_x = rand(3,-3) pixel_y = rand(3,-3) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/structure/spider/eggcluster/process() amount_grown += rand(0,2) @@ -140,10 +140,10 @@ ..() pixel_x = rand(6,-6) pixel_y = rand(6,-6) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/structure/spider/spiderling/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) entry_vent = null return ..() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 77b263fb8f2..9d199a404d0 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -100,6 +100,10 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/trip_walksafe = TRUE var/trip_tiles = 0 + //Tooltip vars + var/in_inventory = FALSE //is this item equipped into an inventory slot or hand of a mob? + var/tip_timer = 0 + /obj/item/New() ..() for(var/path in actions_types) @@ -340,11 +344,13 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d A.Remove(user) if(flags & DROPDEL) qdel(src) + in_inventory = FALSE SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user) // called just as an item is picked up (loc is not yet changed) /obj/item/proc/pickup(mob/user) SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user) + in_inventory = TRUE return TRUE // called when this item is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called. @@ -374,6 +380,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/datum/action/A = X if(item_action_slot_check(slot, user)) //some items only give their actions buttons when in a specific slot. A.Grant(user) + in_inventory = TRUE /obj/item/proc/item_action_slot_check(slot, mob/user) return 1 @@ -532,6 +539,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d if(callback) //call the original callback . = callback.Invoke() throw_speed = initial(throw_speed) //explosions change this. + in_inventory = FALSE /obj/item/proc/pwr_drain() return 0 // Process Kill @@ -578,4 +586,17 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d return TRUE /obj/item/attack_hulk(mob/living/carbon/human/user) - return FALSE \ No newline at end of file + return FALSE + +/obj/item/proc/openTip(location, control, params, user) + openToolTip(user, src, params, title = name, content = "[desc]", theme = "") + +/obj/item/MouseEntered(location, control, params) + if(in_inventory) + var/timedelay = 5 + var/user = usr + tip_timer = addtimer(CALLBACK(src, .proc/openTip, location, control, params, user), timedelay, TIMER_STOPPABLE) + +/obj/item/MouseExited() + deltimer(tip_timer) //delete any in-progress timer if the mouse is moved off the item before it finishes + closeToolTip(usr) diff --git a/code/game/objects/items/ashtray.dm b/code/game/objects/items/ashtray.dm index b32176cb155..8e85709ef97 100644 --- a/code/game/objects/items/ashtray.dm +++ b/code/game/objects/items/ashtray.dm @@ -28,7 +28,6 @@ var/obj/item/clothing/mask/cigarette/cig = W if(cig.lit == 1) src.visible_message("[user] crushes [cig] in [src], putting it out.") - processing_objects.Remove(cig) var/obj/item/butt = new cig.type_butt(src) cig.transfer_fingerprints_to(butt) qdel(cig) diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 85780484264..5ea13308de5 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -18,7 +18,7 @@ light(show_message = 0) /obj/item/candle/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/candle/update_icon() @@ -62,7 +62,7 @@ if(show_message) usr.visible_message(show_message) set_light(CANDLE_LUM) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) update_icon() diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index 575ce0cb6d6..7bf80244072 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -32,7 +32,7 @@ /obj/item/camera_bug/New() ..() - processing_objects += src + START_PROCESSING(SSobj, src) /obj/item/camera_bug/Destroy() get_cameras() diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 27132b75346..5fa2bd692e0 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -227,7 +227,7 @@ return PROCESS_KILL /obj/item/borg_chameleon/proc/activate(mob/living/silicon/robot/syndicate/saboteur/user) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) S = user user.base_icon = disguise user.icon_state = disguise @@ -236,7 +236,7 @@ user.update_icons() /obj/item/borg_chameleon/proc/deactivate(mob/living/silicon/robot/syndicate/saboteur/user) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) S = user user.base_icon = initial(user.base_icon) user.icon_state = initial(user.icon_state) diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index d0b8637b280..2fb1aae8ff0 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -207,10 +207,10 @@ /obj/item/flash/cameraflash/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/flash/cameraflash/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/flash/cameraflash/process() //this and the two parts above are part of the charge system. diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 24c8cbcd3b7..e65c9a683a7 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -183,10 +183,10 @@ turn_off() if(!fuel) src.icon_state = "[initial(icon_state)]-empty" - processing_objects -= src + STOP_PROCESSING(SSobj, src) /obj/item/flashlight/flare/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/flashlight/flare/proc/turn_off() @@ -222,7 +222,7 @@ user.visible_message("[user] activates [src].", "You activate [src].") src.force = on_damage src.damtype = "fire" - processing_objects += src + START_PROCESSING(SSobj, src) // GLOWSTICKS @@ -307,6 +307,9 @@ brightness_on = 7 icon_state = "torch" item_state = "torch" + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' + light_color = LIGHT_COLOR_ORANGE on_damage = 10 /obj/item/flashlight/slime @@ -344,10 +347,10 @@ /obj/item/flashlight/emp/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/flashlight/emp/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/flashlight/emp/process() diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 32b548c38aa..43b22eb4979 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -167,7 +167,7 @@ if(energy <= max_energy) if(!recharging) recharging = 1 - processing_objects.Add(src) + START_PROCESSING(SSobj, src) if(energy <= 0) to_chat(user, "You've overused the battery of [src], now it needs time to recharge!") recharge_locked = 1 diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index d142136ed23..62fc36863fc 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -47,10 +47,10 @@ /obj/item/multitool/ai_detect/New() ..() - processing_objects += src + START_PROCESSING(SSobj, src) /obj/item/multitool/ai_detect/Destroy() - processing_objects -= src + STOP_PROCESSING(SSobj, src) return ..() /obj/item/multitool/ai_detect/process() diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 0d0475df8ee..562800c2ce0 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -1,3 +1,7 @@ +#define DISCONNECTED 0 +#define CLAMPED_OFF 1 +#define OPERATING 2 + // Powersink - used to drain station power /obj/item/powersink @@ -13,28 +17,55 @@ throw_range = 2 materials = list(MAT_METAL=750) origin_tech = "powerstorage=5;syndicate=5" - var/drain_rate = 1600000 // amount of power to drain per tick - var/apc_drain_rate = 50 // Max. amount drained from single APC. In Watts. - var/dissipation_rate = 20000 // Passive dissipation of drained power. In Watts. - var/power_drained = 0 // Amount of power drained. - var/max_power = 1e10 // Detonation point. - var/mode = 0 // 0 = off, 1=clamped (off), 2=operating - var/drained_this_tick = 0 // This is unfortunately necessary to ensure we process powersinks BEFORE other machinery such as APCs. - var/admins_warned = 0 // stop spam, only warn the admins once that we are about to go boom + var/drain_rate = 2000000 // amount of power to drain per tick + var/power_drained = 0 // has drained this much power + var/max_power = 6e8 // maximum power that can be drained before exploding + var/mode = 0 // 0 = off, 1=clamped (off), 2=operating + var/admins_warned = FALSE // stop spam, only warn the admins once that we are about to boom - var/datum/powernet/PN // Our powernet var/obj/structure/cable/attached // the attached cable /obj/item/powersink/Destroy() - processing_objects.Remove(src) - GLOB.processing_power_items.Remove(src) - PN = null + STOP_PROCESSING(SSobj, src) attached = null return ..() -/obj/item/powersink/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/screwdriver)) - if(mode == 0) +/obj/item/powersink/update_icon() + icon_state = "powersink[mode == OPERATING]" + +/obj/item/powersink/proc/set_mode(value) + if(value == mode) + return + switch(value) + if(DISCONNECTED) + attached = null + if(mode == OPERATING) + STOP_PROCESSING(SSobj, src) + anchored = FALSE + density = FALSE + + if(CLAMPED_OFF) + if(!attached) + return + if(mode == OPERATING) + STOP_PROCESSING(SSobj, src) + anchored = TRUE + density = TRUE + + if(OPERATING) + if(!attached) + return + START_PROCESSING(SSobj, src) + anchored = TRUE + density = TRUE + + mode = value + update_icon() + set_light(0) + +/obj/item/powersink/attackby(obj/item/I, mob/user) + if(isscrewdriver(I)) + if(mode == DISCONNECTED) var/turf/T = loc if(isturf(T) && !T.intact) attached = locate() in T @@ -42,98 +73,81 @@ to_chat(user, "No exposed cable here to attach to.") return else - anchored = 1 - mode = 1 - src.visible_message("[user] attaches [src] to the cable!") + set_mode(CLAMPED_OFF) + visible_message("[user] attaches [src] to the cable!") message_admins("Power sink activated by [key_name_admin(user)] at ([x],[y],[z] - JMP)") log_game("Power sink activated by [key_name(user)] at ([x],[y],[z])") - return else to_chat(user, "Device must be placed over an exposed cable to attach to it.") - return else - if(mode == 2) - processing_objects.Remove(src) // Now the power sink actually stops draining the station's power if you unhook it. --NeoFite - GLOB.processing_power_items.Remove(src) - anchored = 0 - mode = 0 + set_mode(DISCONNECTED) src.visible_message("[user] detaches [src] from the cable!") - set_light(0) - icon_state = "powersink0" - - return else - ..() + return ..() /obj/item/powersink/attack_ai() return /obj/item/powersink/attack_hand(var/mob/user) switch(mode) - if(0) + if(DISCONNECTED) ..() - if(1) - src.visible_message("[user] activates [src]!") - mode = 2 - icon_state = "powersink1" - processing_objects.Add(src) - GLOB.processing_power_items.Add(src) - if(2) //This switch option wasn't originally included. It exists now. --NeoFite - src.visible_message("[user] deactivates [src]!") - mode = 1 - set_light(0) - icon_state = "powersink0" - processing_objects.Remove(src) - GLOB.processing_power_items.Remove(src) - -/obj/item/powersink/pwr_drain() - if(!attached) - return 0 - - if(drained_this_tick) - return 1 - drained_this_tick = 1 - - var/drained = 0 - - if(!PN) - return 1 - - set_light(12) - PN.trigger_warning() - // found a powernet, so drain up to max power from it - drained = PN.draw_power(drain_rate) - // if tried to drain more than available on powernet - // now look for APCs and drain their cells - if(drained < drain_rate) - for(var/obj/machinery/power/terminal/T in PN.nodes) - // Enough power drained this tick, no need to torture more APCs - if(drained >= drain_rate) - break - if(istype(T.master, /obj/machinery/power/apc)) - var/obj/machinery/power/apc/A = T.master - if(A.operating && A.cell) - A.cell.charge = max(0, A.cell.charge - apc_drain_rate) - drained += apc_drain_rate - if(A.charging == 2) // If the cell was full - A.charging = 1 // It's no longer full - power_drained += drained - return 1 + if(CLAMPED_OFF) + user.visible_message( \ + "[user] activates \the [src]!", \ + "You activate \the [src].", + "You hear a click.") + message_admins("Power sink activated by [ADMIN_LOOKUPFLW(user)] at [ADMIN_VERBOSEJMP(src)]") + log_game("Power sink activated by [key_name(user)] at [AREACOORD(src)]") + set_mode(OPERATING) + if(OPERATING) + user.visible_message( \ + "[user] deactivates \the [src]!", \ + "You deactivate \the [src].", + "You hear a click.") + set_mode(CLAMPED_OFF) /obj/item/powersink/process() - drained_this_tick = 0 - power_drained -= min(dissipation_rate, power_drained) + if(!attached) + set_mode(DISCONNECTED) + return + + var/datum/powernet/PN = attached.powernet + if(PN) + set_light(5) + + // found a powernet, so drain up to max power from it + + var/drained = min (drain_rate, attached.newavail()) + attached.add_delayedload(drained) + power_drained += drained + + // if tried to drain more than available on powernet + // now look for APCs and drain their cells + if(drained < drain_rate) + for(var/obj/machinery/power/terminal/T in PN.nodes) + if(istype(T.master, /obj/machinery/power/apc)) + var/obj/machinery/power/apc/A = T.master + if(A.operating && A.cell) + A.cell.charge = max(0, A.cell.charge - 50) + power_drained += 50 + if(A.charging == 2) // If the cell was full + A.charging = 1 // It's no longer full + if(drained >= drain_rate) + break + if(power_drained > max_power * 0.98) - if(!admins_warned) - admins_warned = 1 + if (!admins_warned) + admins_warned = TRUE message_admins("Power sink at ([x],[y],[z] - JMP) is 95% full. Explosion imminent.") playsound(src, 'sound/effects/screech.ogg', 100, 1, 1) + if(power_drained >= max_power) + STOP_PROCESSING(SSobj, src) explosion(src.loc, 4,8,16,32) qdel(src) - return - if(attached && attached.powernet) - PN = attached.powernet - else - PN = null + +#undef DISCONNECTED +#undef CLAMPED_OFF +#undef OPERATING \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 62057880b9b..3064b0ae3c8 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -49,7 +49,7 @@ ..() buildstage = building if(buildstage) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else if(ndir) pixel_x = (ndir & EAST|WEST) ? (ndir == EAST ? 28 : -28) : 0 @@ -105,7 +105,7 @@ ) /obj/item/radio/intercom/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) GLOB.global_intercoms.Remove(src) return ..() @@ -150,7 +150,7 @@ b_stat = 1 buildstage = 1 update_icon() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return 1 else return ..() if(2) @@ -163,7 +163,7 @@ buildstage = 3 to_chat(user, "You secure the electronics!") update_icon() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) for(var/i, i<= 5, i++) wires.UpdateCut(i,1) return 1 diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 4a20a52fa04..9bb036c4d05 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -34,7 +34,7 @@ REAGENT SCANNER /obj/item/t_scanner/Destroy() if(on) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/t_scanner/attack_self(mob/user) @@ -43,12 +43,12 @@ REAGENT SCANNER icon_state = copytext(icon_state, 1, length(icon_state))+"[on]" if(on) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/t_scanner/process() if(!on) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return null scan() diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 064b66b78f4..0b9f6c3aca9 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -256,7 +256,7 @@ /obj/item/borg/upgrade/selfrepair/Destroy() cyborg = null - processing_objects -= src + STOP_PROCESSING(SSobj, src) on = 0 return ..() @@ -264,10 +264,10 @@ on = !on if(on) to_chat(cyborg, "You activate the self-repair module.") - processing_objects |= src + START_PROCESSING(SSobj, src) else to_chat(cyborg, "You deactivate the self-repair module.") - processing_objects -= src + STOP_PROCESSING(SSobj, src) update_icon() /obj/item/borg/upgrade/selfrepair/update_icon() @@ -280,7 +280,7 @@ icon_state = "cyborg_upgrade5" /obj/item/borg/upgrade/selfrepair/proc/deactivate() - processing_objects -= src + STOP_PROCESSING(SSobj, src) on = 0 update_icon() diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 5cab26e062b..b0a1286d3b2 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -54,7 +54,7 @@ to_chat(user, "There are [amount] [singular_name]\s in the stack.") else to_chat(user, "There are [amount] [name]\s in the stack.") - to_chat(user,"Ctrl-Shift-click to take a custom amount.") + to_chat(user,"Alt-click to take a custom amount.") /obj/item/stack/proc/add(newamount) amount += newamount @@ -263,7 +263,7 @@ else ..() -/obj/item/stack/CtrlShiftClick(mob/living/user) +/obj/item/stack/AltClick(mob/living/user) if(!istype(user) || user.incapacitated()) to_chat(user, "You can't do that right now!") return @@ -276,7 +276,7 @@ //get amount from user var/min = 0 var/max = get_amount() - var/stackmaterial = round(input(user, "How many sheets do you wish to take out of this stack? (Maximum: [max])") as num) + var/stackmaterial = round(input(user, "How many sheets do you wish to take out of this stack? (Maximum: [max])") as null|num) if(stackmaterial == null || stackmaterial <= min || stackmaterial > get_amount()) return change_stack(user,stackmaterial) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 150b21692f2..74318bfa16d 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -98,6 +98,8 @@ //alt titles are handled a bit weirdly in order to unobtrusively integrate into existing ID system var/assignment = null //can be alt title or the actual job var/rank = null //actual job + var/owner_uid + var/owner_ckey var/dorm = 0 // determines if this ID has claimed a dorm already var/sex @@ -195,6 +197,19 @@ jobnamedata += " (" + assignment + ")" return jobnamedata +/obj/item/card/id/proc/getPlayer() + if(owner_uid) + var/mob/living/carbon/human/H = locateUID(owner_uid) + if(istype(H) && H.ckey == owner_ckey) + return H + owner_uid = null + if(owner_ckey) + for(var/mob/M in GLOB.player_list) + if(M.ckey && M.ckey == owner_ckey) + owner_uid = M.UID() + return M + owner_ckey = null + /obj/item/card/id/proc/is_untrackable() return untrackable diff --git a/code/game/objects/items/weapons/caution.dm b/code/game/objects/items/weapons/caution.dm index a4599a2e79f..b1b573f77ad 100644 --- a/code/game/objects/items/weapons/caution.dm +++ b/code/game/objects/items/weapons/caution.dm @@ -26,7 +26,7 @@ return timing = !timing if(timing) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else armed = 0 timepassed = 0 @@ -34,7 +34,7 @@ /obj/item/caution/proximity_sign/process() if(!timing) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) timepassed++ if(timepassed >= 15 && !armed) armed = 1 diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm index 58c2dd2594f..7e7f1642e3a 100644 --- a/code/game/objects/items/weapons/chrono_eraser.dm +++ b/code/game/objects/items/weapons/chrono_eraser.dm @@ -177,7 +177,7 @@ update_icon() desc = initial(desc) + "
It appears to contain [target.name]." - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/effect/chrono_field/Destroy() if(gun && gun.field_check(src)) diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index 1378b5c004d..ce9f5d916a2 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -48,7 +48,7 @@ LIGHTERS ARE IN LIGHTERS.DM /obj/item/clothing/mask/cigarette/Destroy() QDEL_NULL(reagents) - processing_objects -= src + STOP_PROCESSING(SSobj, src) return ..() /obj/item/clothing/mask/cigarette/attack(mob/living/M, mob/living/user, def_zone) @@ -161,7 +161,7 @@ LIGHTERS ARE IN LIGHTERS.DM var/turf/T = get_turf(src) T.visible_message(flavor_text) set_light(2, 0.25, "#E38F46") - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/clothing/mask/cigarette/process() @@ -213,7 +213,7 @@ LIGHTERS ARE IN LIGHTERS.DM var/mob/living/M = loc to_chat(M, "Your [name] goes out.") M.unEquip(src, 1) //Force the un-equip so the overlays update - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) qdel(src) @@ -341,7 +341,7 @@ LIGHTERS ARE IN LIGHTERS.DM if(flavor_text) var/turf/T = get_turf(src) T.visible_message(flavor_text) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/clothing/mask/cigarette/pipe/process() var/turf/location = get_turf(src) @@ -355,7 +355,7 @@ LIGHTERS ARE IN LIGHTERS.DM icon_state = icon_off item_state = icon_off M.update_inv_wear_mask(0) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return smoke() return @@ -366,7 +366,7 @@ LIGHTERS ARE IN LIGHTERS.DM lit = 0 icon_state = icon_off item_state = icon_off - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return if(smoketime <= 0) to_chat(user, "You refill the pipe with tobacco.") diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 666c14801d8..40fc1bf7d56 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -112,10 +112,9 @@ /obj/item/dice/attack_self(mob/user as mob) diceroll(user) -/obj/item/dice/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) - if(!..()) - return - diceroll(thrower) +/obj/item/dice/throw_impact(atom/target) + diceroll(thrownby) + . = ..() /obj/item/dice/proc/diceroll(mob/user) result = rand(1, sides) diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 75d29c7c6be..dd67d7c67a4 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -33,7 +33,7 @@ /obj/item/flamethrower/process() if(!lit) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return null var/turf/location = loc if(istype(location, /mob/)) @@ -141,7 +141,7 @@ if(!status) return lit = !lit if(lit) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) if(href_list["remove"]) if(!ptank) return usr.put_in_hands(ptank) diff --git a/code/game/objects/items/weapons/garrote.dm b/code/game/objects/items/weapons/garrote.dm index dd65df1ea3f..4bddaf551ea 100644 --- a/code/game/objects/items/weapons/garrote.dm +++ b/code/game/objects/items/weapons/garrote.dm @@ -44,7 +44,7 @@ strangling = null update_icon() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) else ..() @@ -97,7 +97,7 @@ M.AdjustSilence(1) garrote_time = world.time + 10 - processing_objects.Add(src) + START_PROCESSING(SSobj, src) strangling = M update_icon() @@ -113,14 +113,14 @@ if(!strangling) // Our mark got gibbed or similar update_icon() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return if(!istype(loc, /mob/living/carbon/human)) strangling = null update_icon() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return var/mob/living/carbon/human/user = loc @@ -138,7 +138,7 @@ strangling = null update_icon() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return @@ -148,7 +148,7 @@ strangling = null update_icon() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index 9e471583d3b..a20dd86c897 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -402,10 +402,10 @@ /obj/item/nullrod/tribal_knife/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/nullrod/tribal_knife/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/nullrod/tribal_knife/process() @@ -432,10 +432,10 @@ /obj/item/nullrod/rosary/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/nullrod/rosary/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/nullrod/rosary/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 9a7c3f0e27c..88dc4ed6542 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -14,7 +14,7 @@ flags = DROPDEL -/obj/item/implant/proc/trigger(emote, mob/source) +/obj/item/implant/proc/trigger(emote, mob/source, force) return /obj/item/implant/proc/activate() diff --git a/code/game/objects/items/weapons/implants/implant_abductor.dm b/code/game/objects/items/weapons/implants/implant_abductor.dm index a86545f8722..64bb7345f7a 100644 --- a/code/game/objects/items/weapons/implants/implant_abductor.dm +++ b/code/game/objects/items/weapons/implants/implant_abductor.dm @@ -13,7 +13,7 @@ if(cooldown == total_cooldown) home.Retrieve(imp_in,1) cooldown = 0 - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else to_chat(imp_in, "You must wait [(total_cooldown - cooldown)*2] seconds to use [src] again!") @@ -21,7 +21,7 @@ if(cooldown < total_cooldown) cooldown++ if(cooldown == total_cooldown) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) /obj/item/implant/abductor/implant(mob/source, mob/user) if(..()) diff --git a/code/game/objects/items/weapons/implants/implant_chem.dm b/code/game/objects/items/weapons/implants/implant_chem.dm index 5f0fea79da9..f1c4dd4126b 100644 --- a/code/game/objects/items/weapons/implants/implant_chem.dm +++ b/code/game/objects/items/weapons/implants/implant_chem.dm @@ -33,8 +33,8 @@ -/obj/item/implant/chem/trigger(emote, mob/source) - if(emote == "deathgasp") +/obj/item/implant/chem/trigger(emote, mob/source, force) + if(force && emote == "deathgasp") activate(reagents.total_volume) /obj/item/implant/chem/activate(cause) diff --git a/code/game/objects/items/weapons/implants/implant_death_alarm.dm b/code/game/objects/items/weapons/implants/implant_death_alarm.dm index dea34b2ba91..68c8e111520 100644 --- a/code/game/objects/items/weapons/implants/implant_death_alarm.dm +++ b/code/game/objects/items/weapons/implants/implant_death_alarm.dm @@ -18,7 +18,7 @@ return dat /obj/item/implant/death_alarm/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/implant/death_alarm/process() @@ -61,12 +61,12 @@ /obj/item/implant/death_alarm/implant(mob/target) if(..()) mobname = target.real_name - processing_objects.Add(src) + START_PROCESSING(SSobj, src) return 1 return 0 /obj/item/implant/death_alarm/removed(mob/target) if(..()) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return 1 return 0 diff --git a/code/game/objects/items/weapons/implants/implant_explosive.dm b/code/game/objects/items/weapons/implants/implant_explosive.dm index 30113ea4e96..f37e148bee6 100644 --- a/code/game/objects/items/weapons/implants/implant_explosive.dm +++ b/code/game/objects/items/weapons/implants/implant_explosive.dm @@ -20,8 +20,8 @@ "} return dat -/obj/item/implant/explosive/trigger(emote, mob/source) - if(emote == "deathgasp") +/obj/item/implant/explosive/trigger(emote, mob/source, force) + if(force && emote == "deathgasp") activate("death") /obj/item/implant/explosive/activate(cause) @@ -148,8 +148,8 @@ "} return dat -/obj/item/implant/dust/trigger(emote, mob/source) - if(emote == "deathgasp") +/obj/item/implant/dust/trigger(emote, mob/source, force) + if(force && emote == "deathgasp") activate("death") /obj/item/implant/dust/activate(cause) diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index 297966525f0..66e0ba6b110 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -152,8 +152,14 @@ breakouttime = 35//easy to apply, easy to break out of gender = NEUTER origin_tech = "engineering=3;combat=1" + hitsound = 'sound/effects/snap.ogg' var/weaken = 0 +/obj/item/restraints/legcuffs/bola/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) + playsound(loc,'sound/weapons/bolathrow.ogg', 50, TRUE) + if(!..()) + return + /obj/item/restraints/legcuffs/bola/throw_impact(atom/hit_atom) if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed, return//abort @@ -166,6 +172,7 @@ feedback_add_details("handcuffs","B") to_chat(C, "[src] ensnares you!") C.Weaken(weaken) + playsound(loc, hitsound, 50, TRUE) /obj/item/restraints/legcuffs/bola/tactical //traitor variant name = "reinforced bola" diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm index a2d8b03da84..ab946de5f0f 100644 --- a/code/game/objects/items/weapons/lighters.dm +++ b/code/game/objects/items/weapons/lighters.dm @@ -58,7 +58,7 @@ user.visible_message("After a few attempts, [user] manages to light the [src], [user.p_they()] however burn[user.p_s()] [user.p_their()] finger in the process.") set_light(2) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else lit = 0 w_class = WEIGHT_CLASS_TINY @@ -74,7 +74,7 @@ user.visible_message("[user] quietly shuts off the [src].") set_light(0) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) else return ..() return @@ -181,7 +181,7 @@ name = "lit match" desc = "A match. This one is lit." attack_verb = list("burnt","singed") - processing_objects.Add(src) + START_PROCESSING(SSobj, src) update_icon() return TRUE @@ -196,7 +196,7 @@ name = "burnt match" desc = "A match. This one has seen better days." attack_verb = list("flicked") - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return TRUE /obj/item/match/dropped(mob/user) diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index e642e3b994a..7c5c6f9421f 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -89,14 +89,14 @@ /obj/item/mop/advanced/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/mop/advanced/attack_self(mob/user) refill_enabled = !refill_enabled if(refill_enabled) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) to_chat(user, "You set the condenser switch to the '[refill_enabled ? "ON" : "OFF"]' position.") playsound(user, 'sound/machines/click.ogg', 30, 1) @@ -111,7 +111,7 @@ /obj/item/mop/advanced/Destroy() if(refill_enabled) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 03cf28b25ed..e8a181a197b 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -107,7 +107,7 @@ /obj/item/storage/bag/plasticbag/equipped(var/mob/user, var/slot) if(slot==slot_head) storage_slots = 0 - processing_objects.Add(src) + START_PROCESSING(SSobj, src) return /obj/item/storage/bag/plasticbag/process() @@ -120,7 +120,7 @@ H.AdjustLoseBreath(1) else storage_slots = 7 - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return // ----------------------------- diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index abf68deb765..e406b097bee 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -642,9 +642,13 @@ new /obj/item/grenade/smokebomb(src) new /obj/item/restraints/legcuffs/bola(src) new /obj/item/restraints/legcuffs/bola(src) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) cooldown = world.time +/obj/item/storage/belt/bluespace/owlman/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + /obj/item/storage/belt/bluespace/owlman/process() if(cooldown < world.time - 600) smokecount = 0 diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index d533a7e595b..c44264c6529 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -27,13 +27,13 @@ air_contents.volume = volume //liters air_contents.temperature = T20C - processing_objects.Add(src) + START_PROCESSING(SSobj, src) return /obj/item/tank/Destroy() QDEL_NULL(air_contents) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 98f97b66f53..7afb1885ea2 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -377,7 +377,7 @@ damtype = "brute" update_icon() if(!can_off_process) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return //Welders left on now use up fuel, but lets not have them run out quite that fast if(1) @@ -539,7 +539,7 @@ damtype = "fire" hitsound = 'sound/items/welder.ogg' update_icon() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else to_chat(user, "You need more fuel!") switched_off(user) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 29f2c2dd488..4053f747af5 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -557,10 +557,10 @@ /obj/item/twohanded/singularityhammer/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/twohanded/singularityhammer/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/twohanded/singularityhammer/process() @@ -664,10 +664,10 @@ /obj/item/twohanded/knighthammer/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/twohanded/knighthammer/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/twohanded/knighthammer/process() diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 6506a5fdf2e..c2428dd8d97 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -66,17 +66,14 @@ // Nada /obj/Destroy() - GLOB.machines -= src - processing_objects -= src - GLOB.fast_processing -= src + if(!ismachinery(src)) + if(!speed_process) + STOP_PROCESSING(SSobj, src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists + else + STOP_PROCESSING(SSfastprocess, src) SSnanoui.close_uis(src) return ..() -/obj/proc/process() - set waitfor = 0 - processing_objects.Remove(src) - return 0 - //user: The mob that is suiciding //damagetype: The type of damage the item will inflict on the user //BRUTELOSS = 1 @@ -300,15 +297,15 @@ a { if(speed_process) return speed_process = TRUE - processing_objects.Remove(src) - GLOB.fast_processing.Add(src) + STOP_PROCESSING(SSobj, src) + START_PROCESSING(SSfastprocess, src) /obj/proc/makeNormalProcess() if(!speed_process) return speed_process = FALSE - processing_objects.Add(src) - GLOB.fast_processing.Remove(src) + START_PROCESSING(SSobj, src) + STOP_PROCESSING(SSfastprocess, src) /obj/vv_get_dropdown() . = ..() diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 0692c90ec6d..909ee79e1ab 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -41,7 +41,7 @@ qdel(src) return - processing_objects.Add(src) + START_PROCESSING(SSobj, src) ..() /obj/structure/closet/statue/process() @@ -53,7 +53,7 @@ M.setOxyLoss(intialOxy) if(timer <= 0) dump_contents() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) qdel(src) /obj/structure/closet/statue/dump_contents() diff --git a/code/game/objects/structures/depot.dm b/code/game/objects/structures/depot.dm index b286749f908..a3dc4ac7007 100644 --- a/code/game/objects/structures/depot.dm +++ b/code/game/objects/structures/depot.dm @@ -87,7 +87,7 @@ /obj/effect/overload/New() . = ..() // Do not attempt to put the code below into Initialize() or even LateInitialize() with a "return INITIALIZE_HINT_LATELOAD". It won't work! - processing_objects.Add(src) + START_PROCESSING(SSobj, src) depotarea = areaMaster if(istype(depotarea)) if(!depotarea.used_self_destruct) @@ -122,6 +122,6 @@ for(var/obj/mecha/E in range(30, T)) E.Destroy() explosion(get_turf(src), 25, 35, 45, 55, 1, 1, 60, 0, 0) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) qdel(src) diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 568fb0ededc..303862ff66f 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -28,6 +28,22 @@ else has_extinguisher = new/obj/item/extinguisher +/obj/structure/extinguisher_cabinet/examine(mob/user) + ..() + to_chat(user, "Alt-click to [opened ? "close":"open"] it.") + +/obj/structure/extinguisher_cabinet/AltClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user)) + return + if(!iscarbon(usr)) + return + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) + opened = !opened + update_icon() + /obj/structure/extinguisher_cabinet/Destroy() QDEL_NULL(has_extinguisher) return ..() @@ -37,11 +53,16 @@ return if(istype(O, /obj/item/extinguisher)) if(!has_extinguisher && opened) + if(!user.drop_item()) + return user.drop_item(O) contents += O has_extinguisher = O + update_icon() to_chat(user, "You place [O] in [src].") + return TRUE else + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) opened = !opened else if(istype(O, /obj/item/weldingtool)) if(has_extinguisher) @@ -65,6 +86,7 @@ new material_drop(T) qdel(src) else + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) opened = !opened update_icon() @@ -81,21 +103,27 @@ to_chat(user, "You try to move your [temp.name], but cannot!") return if(has_extinguisher) + if(icon_state == "extinguisher_closed") + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) user.put_in_hands(has_extinguisher) to_chat(user, "You take [has_extinguisher] from [src].") has_extinguisher = null opened = 1 else + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) opened = !opened update_icon() /obj/structure/extinguisher_cabinet/attack_tk(mob/user) if(has_extinguisher) + if(icon_state == "extinguisher_closed") + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) has_extinguisher.loc = loc to_chat(user, "You telekinetically remove [has_extinguisher] from [src].") has_extinguisher = null opened = 1 else + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) opened = !opened update_icon() diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 154d4438530..1e3cb331cd1 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -273,8 +273,8 @@ var/obj/structure/cable/C = T.get_cable_node() if(C) playsound(loc, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5) - tesla_zap(src, 3, C.powernet.avail * 0.01) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot. - C.powernet.load += C.powernet.avail * 0.0375 // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock. + tesla_zap(src, 3, C.newavail() * 0.01) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot. + C.add_delayedload(C.newavail() * 0.0375) // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock. return ..() /obj/structure/grille/broken // Pre-broken grilles for map placement diff --git a/code/game/objects/structures/misc.dm b/code/game/objects/structures/misc.dm index 6be7bf072d8..01fab63dd57 100644 --- a/code/game/objects/structures/misc.dm +++ b/code/game/objects/structures/misc.dm @@ -92,11 +92,11 @@ last_ghost_alert = world.time attack_atom = src if(active) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/structure/ghost_beacon/Destroy() if(active) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) attack_atom = null return ..() @@ -111,9 +111,9 @@ return to_chat(user, "You [active ? "disable" : "enable"] \the [src].") if(active) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) else - processing_objects.Add(src) + START_PROCESSING(SSobj, src) active = !active /obj/structure/ghost_beacon/process() diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index f0a0c89880f..1bb19a81bd2 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -14,7 +14,7 @@ GLOBAL_LIST_EMPTY(safes) desc = "A huge chunk of metal with a dial embedded in it. Fine print on the dial reads \"Scarborough Arms tumbler safe, guaranteed thermite resistant, explosion resistant, and assistant resistant.\"" icon = 'icons/obj/structures.dmi' icon_state = "safe" - + anchored = TRUE density = TRUE resistance_flags = LAVA_PROOF | FIRE_PROOF @@ -159,14 +159,14 @@ GLOBAL_LIST_EMPTY(safes) drill_start_time = world.time drill.soundloop.start() update_icon() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) if("Turn Off") if(do_after(user, 2 SECONDS, target = src)) deltimer(drill_timer) drill_timer = null drill.soundloop.stop() update_icon() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) if("Remove Drill") if(drill_timer) to_chat(user, "You cant remove the drill while it's running!") @@ -208,7 +208,7 @@ GLOBAL_LIST_EMPTY(safes) if(current_tick == 2) to_chat(user, "The sounds from [src] are too fast and blend together.") - + if(total_ticks == 1 || prob(10)) to_chat(user, "You hear a [pick(sounds)] from [src].") @@ -252,7 +252,7 @@ GLOBAL_LIST_EMPTY(safes) var/invalid_turn = current_tumbler_index % 2 == 0 || current_tumbler_index > number_of_tumblers if(invalid_turn) // The moment you turn the wrong way or go too far, the tumblers reset current_tumbler_index = 1 - + if(!invalid_turn && dial == tumblers[current_tumbler_index]) notify_user(user, canhear, list("tink", "krink", "plink"), ticks, i) current_tumbler_index++ @@ -308,7 +308,7 @@ GLOBAL_LIST_EMPTY(safes) drill_timer = null drill.soundloop.stop() update_icon() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) /obj/structure/safe/attackby(obj/item/I, mob/user, params) if(open) diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 810659d81bb..04271015f4c 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -19,10 +19,10 @@ /obj/structure/transit_tube/station/New() ..() - processing_objects += src + START_PROCESSING(SSobj, src) /obj/structure/transit_tube/station/Destroy() - processing_objects -= src + STOP_PROCESSING(SSobj, src) return ..() // Stations which will send the tube in the opposite direction after their stop. diff --git a/code/game/world.dm b/code/game/world.dm index 4681f46498a..86ca6d883bd 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -374,26 +374,28 @@ var/world_topic_spam_protect_time = world.timeofday // apply some settings from config.. /world/proc/update_status() + status = get_status_text() + +/proc/get_world_status_text() + return world.get_status_text() + +/world/proc/get_status_text() var/s = "" if(config && config.server_name) s += "[config.server_name] — " + s += "[station_name()] " + if(config && config.githuburl) + s+= "([game_version])" - s += "[station_name()]"; - s += " (" - s += "" //Change this to wherever you want the hub to link to. - s += "[game_version]" - s += "" - s += ")" - s += "
The Perfect Mix of RP & Action
" - - - + if(config && config.server_tag_line) + s += "
[config.server_tag_line]" + s += "
" var/list/features = list() if(ticker) - if(master_mode) + if(master_mode && master_mode != "secret") features += master_mode else features += "STARTING" @@ -401,39 +403,22 @@ var/world_topic_spam_protect_time = world.timeofday if(!enter_allowed) features += "closed" - features += abandon_allowed ? "respawn" : "no respawn" + if(config && config.server_extra_features) + features += config.server_extra_features if(config && config.allow_vote_mode) features += "vote" - if(config && config.allow_ai) - features += "AI allowed" + if(config && config.wikiurl) + features += "Wiki" - var/n = 0 - for(var/mob/M in GLOB.player_list) - if(M.client) - n++ - - if(n > 1) - features += "~[n] players" - else if(n > 0) - features += "~[n] player" - - /* - is there a reason for this? the byond site shows 'hosted by X' when there is a proper host already. - if(host) - features += "hosted by [host]" - */ - -// if(!host && config && config.hostedby) -// features += "hosted by [config.hostedby]" + if(abandon_allowed) + features += "respawn" if(features) - s += ": [jointext(features, ", ")]" + s += "[jointext(features, ", ")]" - /* does this help? I do not know */ - if(src.status != s) - src.status = s + return s #define FAILED_DB_CONNECTION_CUTOFF 5 var/failed_db_connections = 0 diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index c15600f7bb6..4fcf95dbfd2 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -78,7 +78,7 @@ var/global/nologevent = 0 body += "VV - " body += "[ADMIN_TP(M,"TP")] - " if(M.client) - body += "PM - " + body += "PM - " body += "[ADMIN_SM(M,"SM")] - " if(ishuman(M) && M.mind) body += "HM -" @@ -950,9 +950,6 @@ var/gamma_ship_location = 1 // 0 = station , 1 = space for(var/obj/machinery/mech_bay_recharge_port/P in toArea) P.update_recharge_turf() - for(var/obj/machinery/power/apc/A in toArea) - A.init() - if(gamma_ship_location) gamma_ship_location = 0 else @@ -1096,7 +1093,7 @@ var/gamma_ship_location = 1 // 0 = station , 1 = space dat += "" + id + "" dat += "" + ckey + "" dat += "Unlink" - + dat += "" usr << browse(dat, "window=duplicates;size=500x480") \ No newline at end of file diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index e7078cb6877..6b4072a800b 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -224,6 +224,8 @@ var/list/admin_verbs_snpc = list( var/list/admin_verbs_ticket = list( /client/proc/openAdminTicketUI, /client/proc/toggleticketlogs, + /client/proc/openMentorTicketUI, + /client/proc/toggleMentorTicketLogs, /client/proc/resolveAllAdminTickets, /client/proc/resolveAllMentorTickets ) @@ -926,10 +928,10 @@ var/list/admin_verbs_ticket = list( to_chat(usr, "You now will get admin log messages.") /client/proc/toggleMentorTicketLogs() - set name = "Toggle Mentor Ticket Messgaes" + set name = "Toggle Mentor Ticket Messages" set category = "Preferences" - if(!check_rights(R_MENTOR)) + if(!check_rights(R_MENTOR|R_ADMIN)) return prefs.toggles ^= CHAT_NO_MENTORTICKETLOGS diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index f50bae146c3..36c0e5cf90d 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -61,7 +61,7 @@ } - function expand(id,job,name,real_name,image,key,ip,antagonist,UID,eyeUID){ + function expand(id,job,name,real_name,image,key,ip,antagonist,mobUID,clientUID,eyeUID){ clearAll(); @@ -75,13 +75,13 @@ body += ""; - body += "PP - " + body += "PP - " body += "N - " - body += "VV - " - body += "TP - " - body += "PM - " - body += "SM - " - body += "FLW" + body += "VV - " + body += "TP - " + body += "PM - " + body += "SM - " + body += "FLW" if(eyeUID) body += "|EYE" body += "
" @@ -293,6 +293,7 @@ var/mob/living/silicon/ai/A = M if(A.client && A.eyeobj) // No point following clientless AI eyes M_eyeUID = "[A.eyeobj.UID()]" + var/clientUID = M.client ? M.client.UID() : null //output for each mob dat += {" @@ -300,7 +301,7 @@ [M_name] - [M_rname] - [M_key] ([M_job]) @@ -371,7 +372,7 @@ dat += {"[(M.client ? "[M.client]" : "No client")] X - PM + PM "} switch(is_special_character(M)) if(0) @@ -398,7 +399,7 @@ dname = M return {"[dname][caption][logout_status][M.stat == 2 ? " (DEAD)" : ""] - PM[close ? "" : ""]"} + PM[close ? "" : ""]"} /datum/admins/proc/check_antagonists() if(!check_rights(R_ADMIN)) return @@ -473,7 +474,7 @@ var/mob/M = blob.current if(M) dat += "[ADMIN_PP(M,"[M.real_name]")][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]" - dat += "PM" + dat += "PM" else dat += "Blob not found!" dat += "" diff --git a/code/modules/admin/tickets/mentorticketsverbs.dm b/code/modules/admin/tickets/mentorticketsverbs.dm index 765a1afb9da..1122b770107 100644 --- a/code/modules/admin/tickets/mentorticketsverbs.dm +++ b/code/modules/admin/tickets/mentorticketsverbs.dm @@ -5,7 +5,7 @@ set name = "Open Mentor Ticket Interface" set category = "Admin" - if(!holder || !check_rights(R_MENTOR)) + if(!holder || !check_rights(R_MENTOR|R_ADMIN)) return SSmentor_tickets.showUI(usr) diff --git a/code/modules/alarm/alarm.dm b/code/modules/alarm/alarm.dm index 1d4a570999a..798c5176770 100644 --- a/code/modules/alarm/alarm.dm +++ b/code/modules/alarm/alarm.dm @@ -29,7 +29,7 @@ cameras() // Sets up both cameras and last alarm area. set_source_data(source, duration, severity) -/datum/alarm/proc/process() +/datum/alarm/process() // Has origin gone missing? if(!origin && !end_time) end_time = world.time + ALARM_RESET_DELAY diff --git a/code/modules/alarm/alarm_handler.dm b/code/modules/alarm/alarm_handler.dm index cd09ebe4427..56a673bb5b4 100644 --- a/code/modules/alarm/alarm_handler.dm +++ b/code/modules/alarm/alarm_handler.dm @@ -7,7 +7,7 @@ var/list/datum/alarm/alarms_assoc = new // Associative list of alarms, to efficiently acquire them based on origin. var/list/listeners = new // A list of all objects interested in alarm changes. -/datum/alarm_handler/proc/process() +/datum/alarm_handler/process() for(var/datum/alarm/A in alarms) A.process() check_alarm_cleared(A) diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index a5dfb44aae2..5e0b463af30 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -125,7 +125,7 @@ ..() /obj/item/assembly/process() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) /obj/item/assembly/examine(mob/user) ..() diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm index 853733784fa..3a543e38f72 100644 --- a/code/modules/assembly/health.dm +++ b/code/modules/assembly/health.dm @@ -21,10 +21,10 @@ /obj/item/assembly/health/toggle_secure() secured = !secured if(secured && scanning) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else scanning = FALSE - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) update_icon() return secured @@ -66,9 +66,9 @@ return FALSE scanning = !scanning if(scanning) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return /obj/item/assembly/health/interact(mob/user)//TODO: Change this to the wires thingy diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 91f8da7cc4b..d6da1fb4d0e 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -42,12 +42,12 @@ /obj/item/assembly/infra/toggle_secure() secured = !secured if(secured) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else on = FALSE if(first) qdel(first) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) update_icon() return secured diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index 80e486170c2..e6ae3ec7bc4 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -28,11 +28,11 @@ /obj/item/assembly/prox_sensor/toggle_secure() secured = !secured if(secured) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else scanning = 0 timing = 0 - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) update_icon() return secured diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index 5b7eb6ca50a..2c2216fa9d0 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -29,10 +29,10 @@ /obj/item/assembly/timer/toggle_secure() secured = !secured if(secured) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else timing = FALSE - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) update_icon() return secured diff --git a/code/modules/atmos_automation/statements.dm b/code/modules/atmos_automation/statements.dm index 31ee71b7a7d..72937e18eae 100644 --- a/code/modules/atmos_automation/statements.dm +++ b/code/modules/atmos_automation/statements.dm @@ -29,7 +29,7 @@ var/global/automation_types = subtypesof(/datum/automation) /datum/automation/proc/OnRemove() return -/datum/automation/proc/process() +/datum/automation/process() return /datum/automation/proc/Evaluate() diff --git a/code/modules/awaymissions/snpc.dm b/code/modules/awaymissions/snpc.dm index 04e3bf19b8e..8d65aa44a92 100644 --- a/code/modules/awaymissions/snpc.dm +++ b/code/modules/awaymissions/snpc.dm @@ -47,7 +47,7 @@ var/list/squad /obj/effect/spawner/snpc_squad/New() - processing_objects += src + START_PROCESSING(SSobj, src) squad = squads[squad_type] if(!squad) @@ -57,7 +57,7 @@ /obj/effect/spawner/snpc_squad/Destroy() squad = null - processing_objects -= src + STOP_PROCESSING(SSobj, src) return ..() /obj/effect/spawner/snpc_squad/process() diff --git a/code/modules/awaymissions/zvis.dm b/code/modules/awaymissions/zvis.dm index 03adaeda629..3697a4678df 100644 --- a/code/modules/awaymissions/zvis.dm +++ b/code/modules/awaymissions/zvis.dm @@ -58,11 +58,11 @@ owner = o if(args.len >= 3) params = args.Copy(3) - processing_objects += src + START_PROCESSING(SSobj, src) trigger() /obj/effect/portal_sensor/Destroy() - processing_objects -= src + STOP_PROCESSING(SSobj, src) return ..() /obj/effect/portal_sensor/Crossed(A) diff --git a/code/modules/busy_space/air_traffic.dm b/code/modules/busy_space/air_traffic.dm index de0b37ed3c3..b5cbf8e6fda 100644 --- a/code/modules/busy_space/air_traffic.dm +++ b/code/modules/busy_space/air_traffic.dm @@ -17,7 +17,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller next_message = world.time + rand(delay_min, delay_max) process() -/datum/lore/atc_controller/proc/process() +/datum/lore/atc_controller/process() if(world.time >= next_message) if(squelched) next_message = world.time + backoff_delay diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index b9a6df2be00..8f57b49092e 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -46,7 +46,7 @@ var/received_irc_pm = -99999 var/irc_admin //IRC admin that spoke with them last. var/mute_irc = 0 - + var/ssd_warning_acknowledged = FALSE //////////////////////////////////// //things that require the database// diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index a597d0f0e3a..aa6a95f8328 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -9,6 +9,7 @@ #define MIN_CLIENT_VERSION 0 //Just an ambiguously low version for now, I don't want to suddenly stop people playing. //I would just like the code ready should it ever need to be used. #define SUGGESTED_CLIENT_VERSION 511 // only integers (e.g: 510, 511) useful here. Does not properly handle minor versions (e.g: 510.58, 511.848) +#define SSD_WARNING_TIMER 30 // cycles, not seconds, so 30=60s /* When somebody clicks a link in game, this Topic is called first. @@ -73,9 +74,7 @@ //Admin PM if(href_list["priv_msg"]) var/client/C = locate(href_list["priv_msg"]) - if(ismob(C)) //Old stuff can feed-in mobs instead of clients - var/mob/M = C - C = M.client + if(!C) // Might be a stealthmin ID, so pass it in straight C = href_list["priv_msg"] else if(C.UID() != href_list["priv_msg"]) @@ -227,6 +226,9 @@ vote_on_poll(pollid, optionid, 1) src << browse(null, "window=playerpoll") handle_player_polling() + if(href_list["ssdwarning"]) + ssd_warning_acknowledged = TRUE + to_chat(src, "SSD warning acknowledged.") switch(href_list["action"]) if("openLink") @@ -785,3 +787,16 @@ winset(src, "rpane.changelog", "background-color=#40628a;text-color=#FFFFFF") else winset(src, "rpane.changelog", "background-color=none;text-color=#000000") + + +/client/proc/send_ssd_warning(mob/M) + if(!config.ssd_warning) + return FALSE + if(ssd_warning_acknowledged) + return FALSE + if(M && M.player_logged < SSD_WARNING_TIMER) + return FALSE + to_chat(src, "Interacting with SSD players is against server rules unless you've ahelped first for permission. If you have, confirm that and proceed.") + return TRUE + +#undef SSD_WARNING_TIMER \ No newline at end of file diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 484151de797..9613ce173af 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -627,38 +627,6 @@ BLIND // can't see anything ..() -/obj/item/clothing/under/attack_hand(mob/user as mob) - //only forward to the attached accessory if the clothing is equipped (not in a storage) - if(accessories.len && src.loc == user) - for(var/obj/item/clothing/accessory/A in accessories) - A.attack_hand(user) - return - - if(ishuman(usr) && src.loc == user) //make it harder to accidentally undress yourself - return - - ..() - -/obj/item/clothing/under/MouseDrop(obj/over_object as obj) - if(ishuman(usr)) - //makes sure that the clothing is equipped so that we can't drag it into our hand from miles away. - if(!(src.loc == usr)) - return - if(!( usr.restrained() ) && !( usr.stat ) && ( over_object )) - if(!usr.canUnEquip(src)) - to_chat(usr, "[src] appears stuck on you!") - return - switch(over_object.name) - if("r_hand") - usr.unEquip(src) - usr.put_in_r_hand(src) - if("l_hand") - usr.unEquip(src) - usr.put_in_l_hand(src) - src.add_fingerprint(usr) - return - return - /obj/item/clothing/under/examine(mob/user) ..(user) switch(src.sensor_mode) diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index ba1b74aad66..ab0dffee5dc 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -94,7 +94,7 @@ /obj/item/clothing/head/cakehat/process() if(!onfire) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return var/turf/location = src.loc @@ -113,7 +113,7 @@ src.force = 3 src.damtype = "fire" src.icon_state = "cake1" - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else src.force = null src.damtype = "brute" diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 88f94e5b50a..fdd871a3448 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -122,7 +122,7 @@ else new_camera(user) else - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) /obj/item/clothing/suit/space/chronos/proc/activate() if(!activating && !activated && !teleporting) @@ -143,7 +143,7 @@ to_chat(user, "\[ ok \] Starting ui display driver") to_chat(user, "\[ ok \] Initializing chronowalk4-view") new_camera(user) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) activated = 1 else to_chat(user, "\[ fail \] Mounting /dev/helmet") diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 382ff910277..9a0354b6b0f 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -633,7 +633,7 @@ owner.visible_message("[owner]'s shields deflect [attack_text] in a shower of sparks!") current_charges-- recharge_cooldown = world.time + recharge_delay - processing_objects |= src + START_PROCESSING(SSobj, src) if(current_charges <= 0) owner.visible_message("[owner]'s shield overloads!") shield_state = "broken" @@ -643,7 +643,7 @@ /obj/item/clothing/suit/space/hardsuit/shielded/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/clothing/suit/space/hardsuit/shielded/process() @@ -652,7 +652,7 @@ playsound(loc, 'sound/magic/charge.ogg', 50, 1) if(current_charges == max_charges) playsound(loc, 'sound/machines/ding.ogg', 50, 1) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) shield_state = "[shield_on]" if(istype(loc, /mob/living/carbon/human)) var/mob/living/carbon/human/C = loc diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index c65ea335c4d..913e65af734 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -110,7 +110,7 @@ spark_system.set_up(5, 0, src) spark_system.attach(src) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) if(initial_modules && initial_modules.len) for(var/path in initial_modules) @@ -166,7 +166,7 @@ if(istype(M)) M.unEquip(piece) qdel(piece) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) QDEL_NULL(wires) QDEL_NULL(spark_system) return ..() diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 3499bce8e49..13ef3e074da 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -186,10 +186,10 @@ /obj/item/clothing/suit/corgisuit/super_hero/en/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/clothing/suit/corgisuit/super_hero/en/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/clothing/suit/corgisuit/super_hero/en/process() @@ -883,7 +883,7 @@ /obj/item/clothing/suit/advanced_protective_suit/Destroy() if(on) on = 0 - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/clothing/suit/advanced_protective_suit/ui_action_click() @@ -893,7 +893,7 @@ else on = 1 to_chat(usr, "You turn the suit's special processes on.") - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/clothing/suit/advanced_protective_suit/IsReflect() @@ -912,7 +912,7 @@ if(user.reagents.get_reagent_amount("syndicate_nanites") < 15) user.reagents.add_reagent("syndicate_nanites", 15) else - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) //Syndicate Chaplain Robe (WOLOLO!) /obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe @@ -924,22 +924,22 @@ if(linked_staff) //delink on destruction linked_staff.robes = null linked_staff = null - processing_objects -= src //probably is cleared in a parent call already, but just in case we're gonna do it here + STOP_PROCESSING(SSobj, src) //probably is cleared in a parent call already, but just in case we're gonna do it here return ..() /obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe/equipped(mob/living/carbon/human/H, slot) if(!istype(H) || slot != slot_wear_suit) - processing_objects -= src + STOP_PROCESSING(SSobj, src) return else - processing_objects |= src + START_PROCESSING(SSobj, src) /obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe/process() if(!linked_staff) //if we don't have a linked staff, the rest of this is useless return if(!ishuman(loc)) //if we somehow try to process while not on a human, remove ourselves from processing and return - processing_objects -= src + STOP_PROCESSING(SSobj, src) return var/mob/living/carbon/human/H = loc diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 6b08e2e4e49..b1da17677de 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -574,7 +574,7 @@ /obj/item/clothing/accessory/petcollar/Destroy() QDEL_NULL(access_id) - processing_objects -= src + STOP_PROCESSING(SSobj, src) return ..() /obj/item/clothing/accessory/petcollar/attack_self(mob/user as mob) @@ -617,10 +617,10 @@ /obj/item/clothing/accessory/petcollar/equipped(mob/living/simple_animal/user) if(istype(user)) - processing_objects |= src + START_PROCESSING(SSobj, src) /obj/item/clothing/accessory/petcollar/dropped(mob/living/simple_animal/user) - processing_objects -= src + STOP_PROCESSING(SSobj, src) /obj/item/clothing/accessory/petcollar/process() var/mob/living/simple_animal/M = loc @@ -636,7 +636,7 @@ else a.autosay("[M] has been vandalized in [t.name]!", "[M]'s Death Alarm") qdel(a) - processing_objects -= src + STOP_PROCESSING(SSobj, src) /proc/english_accessory_list(obj/item/clothing/under/U) if(!istype(U) || !U.accessories.len) diff --git a/code/modules/countdown/countdown.dm b/code/modules/countdown/countdown.dm index d860ba9c4cd..8769e5e321a 100644 --- a/code/modules/countdown/countdown.dm +++ b/code/modules/countdown/countdown.dm @@ -28,13 +28,13 @@ /obj/effect/countdown/proc/start() if(!started) - GLOB.fast_processing += src + START_PROCESSING(SSfastprocess, src) started = TRUE /obj/effect/countdown/proc/stop() if(started) maptext = null - GLOB.fast_processing -= src + STOP_PROCESSING(SSfastprocess, src) started = FALSE /obj/effect/countdown/proc/get_value() @@ -57,7 +57,7 @@ /obj/effect/countdown/Destroy() attached_to = null - GLOB.fast_processing -= src + STOP_PROCESSING(SSfastprocess, src) return ..() /obj/effect/countdown/ex_act(severity) //immune to explosions diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 5116abf32e6..bc99aa07b0e 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -117,8 +117,8 @@ /datum/crafting_recipe/floorbot name = "Floorbot" result = /mob/living/simple_animal/bot/floorbot - reqs = list(/obj/item/storage/toolbox/mechanical = 1, - /obj/item/stack/tile/plasteel = 1, + reqs = list(/obj/item/storage/toolbox = 1, + /obj/item/stack/tile/plasteel = 10, /obj/item/assembly/prox_sensor = 1, /obj/item/robot_parts/r_arm = 1) time = 40 diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 23206e8b9b3..d2b32f720cf 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -760,10 +760,10 @@ /obj/item/clothing/head/pirate/fluff/stumpy/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/clothing/head/pirate/fluff/stumpy/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/clothing/head/pirate/fluff/stumpy/process() @@ -1773,4 +1773,16 @@ /obj/item/clothing/gloves/ring/fluff/benjaminfallout //Benjaminfallout: Pretzel Brassheart name = "Pretzel's Ring" desc = "A small platinum ring with a large light blue diamond. Engraved inside the band are the words: 'To my lovely Pristine Princess. Forever yours, Savinien.'" - icon_state = "benjaminfallout_ring" \ No newline at end of file + icon_state = "benjaminfallout_ring" + +/obj/item/clothing/under/fluff/voxbodysuit //Gangelwaefre: Kikeri + name = "Vox Bodysuit" + desc = "A shimmering bodysuit custom-fit to a vox. Has shorts sewn in." + lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi' + righthand_file = 'icons/mob/inhands/fluff_righthand.dmi' + icon = 'icons/mob/inhands/fluff_righthand.dmi' + icon_state = "voxbodysuit" + item_state = "voxbodysuit" + item_color = "voxbodysuit" + body_parts_covered = HEAD|UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + species_fit = list("Vox") \ No newline at end of file diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index 6f23bbc5fcd..2c2fdfbab84 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -6,6 +6,7 @@ event_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg') /datum/event/blob/start() + processing = FALSE //so it won't fire again in next tick var/turf/T = pick(blobstart) if(!T) return kill() @@ -23,4 +24,5 @@ B.key = M.key to_chat(B, "You are now a mouse, infected with blob spores. Find somewhere isolated... before you burst and become the blob! Use ventcrawl (alt-click on vents) to move around.") var/image/alert_overlay = image('icons/mob/blob.dmi', "blank_blob") - notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B, alert_overlay = alert_overlay) \ No newline at end of file + notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B, alert_overlay = alert_overlay) + processing = TRUE // Let it naturally end, if it runs successfully \ No newline at end of file diff --git a/code/modules/events/event.dm b/code/modules/events/event.dm index 0f5c43059e8..1186da902f0 100644 --- a/code/modules/events/event.dm +++ b/code/modules/events/event.dm @@ -105,7 +105,7 @@ //Do not override this proc, instead use the appropiate procs. //This proc will handle the calls to the appropiate procs. -/datum/event/proc/process() +/datum/event/process() if(!processing) return @@ -137,12 +137,12 @@ end() endedAt = world.time - event_manager.active_events -= src - event_manager.event_complete(src) + SSevents.active_events -= src + SSevents.event_complete(src) /datum/event/New(var/datum/event_meta/EM) // event needs to be responsible for this, as stuff like APLUs currently make their own events for curious reasons - event_manager.active_events += src + SSevents.active_events += src if(!EM) EM = new /datum/event_meta(EVENT_LEVEL_MAJOR, "Unknown, Most likely admin called", src.type) diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 6cc12faf1b4..3f86b88924c 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -22,7 +22,7 @@ var/list/event_last_fired = list() var/last_world_time = 0 -/datum/event_container/proc/process() +/datum/event_container/process() if(!next_event_time) set_event_delay() diff --git a/code/modules/events/event_procs.dm b/code/modules/events/event_procs.dm new file mode 100644 index 00000000000..02ae1454597 --- /dev/null +++ b/code/modules/events/event_procs.dm @@ -0,0 +1,120 @@ + +/client/proc/forceEvent(var/type in SSevents.allEvents) + set name = "Trigger Event (Debug Only)" + set category = "Debug" + + if(!holder) + return + + if(ispath(type)) + new type(new /datum/event_meta(EVENT_LEVEL_MAJOR)) + message_admins("[key_name_admin(usr)] has triggered an event. ([type])", 1) + +/client/proc/event_manager_panel() + set name = "Event Manager Panel" + set category = "Event" + if(SSevents) + SSevents.Interact(usr) + feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + return + +/proc/findEventArea() //Here's a nice proc to use to find an area for your event to land in! + var/area/candidate = null + + var/list/safe_areas = list( + /area/turret_protected/ai, + /area/turret_protected/ai_upload, + /area/engine, + /area/solar, + /area/holodeck, + /area/shuttle/arrival, + /area/shuttle/escape, + /area/shuttle/escape_pod1/station, + /area/shuttle/escape_pod2/station, + /area/shuttle/escape_pod3/station, + /area/shuttle/escape_pod5/station, + /area/shuttle/specops/station, + /area/shuttle/prison/station, + /area/shuttle/administration/station + ) + + //These are needed because /area/engine has to be removed from the list, but we still want these areas to get fucked up. + var/list/danger_areas = list( + /area/engine/break_room, + /area/engine/chiefs_office) + + var/list/event_areas = list() + + for(var/areapath in the_station_areas) + event_areas += typesof(areapath) + for(var/areapath in safe_areas) + event_areas -= typesof(areapath) + for(var/areapath in danger_areas) + event_areas += typesof(areapath) + + while(event_areas.len > 0) + var/list/event_turfs = null + candidate = locate(pick_n_take(event_areas)) + event_turfs = get_area_turfs(candidate) + if(event_turfs.len > 0) + break + + return candidate + +// Returns how many characters are currently active(not logged out, not AFK for more than 10 minutes) +// with a specific role. +// Note that this isn't sorted by department, because e.g. having a roboticist shouldn't make meteors spawn. +/proc/number_active_with_role() + var/list/active_with_role = list() + active_with_role["Engineer"] = 0 + active_with_role["Medical"] = 0 + active_with_role["Security"] = 0 + active_with_role["Scientist"] = 0 + active_with_role["AI"] = 0 + active_with_role["Cyborg"] = 0 + active_with_role["Janitor"] = 0 + active_with_role["Botanist"] = 0 + active_with_role["Any"] = GLOB.player_list.len + + for(var/mob/M in GLOB.player_list) + if(!M.mind || !M.client || M.client.inactivity > 10 * 10 * 60) // longer than 10 minutes AFK counts them as inactive + continue + + if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "engineering robot module") + active_with_role["Engineer"]++ + if(M.mind.assigned_role in list("Chief Engineer", "Station Engineer")) + active_with_role["Engineer"]++ + + if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "medical robot module") + active_with_role["Medical"]++ + if(M.mind.assigned_role in list("Chief Medical Officer", "Medical Doctor")) + active_with_role["Medical"]++ + + if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "security robot module") + active_with_role["Security"]++ + if(M.mind.assigned_role in security_positions) + active_with_role["Security"]++ + + if(M.mind.assigned_role in list("Research Director", "Scientist")) + active_with_role["Scientist"]++ + + if(M.mind.assigned_role == "AI") + active_with_role["AI"]++ + + if(M.mind.assigned_role == "Cyborg") + active_with_role["Cyborg"]++ + + if(M.mind.assigned_role == "Janitor") + active_with_role["Janitor"]++ + + if(M.mind.assigned_role == "Botanist") + active_with_role["Botanist"]++ + + return active_with_role + +/datum/event/proc/num_players() + var/players = 0 + for(var/mob/living/carbon/human/P in GLOB.player_list) + if(P.client) + players++ + return players diff --git a/code/modules/events/false_alarm.dm b/code/modules/events/false_alarm.dm index e63805d6a1d..a0aa17596fd 100644 --- a/code/modules/events/false_alarm.dm +++ b/code/modules/events/false_alarm.dm @@ -4,7 +4,7 @@ /datum/event/falsealarm/announce() var/weight = pickweight(list(EVENT_LEVEL_MUNDANE = 60, EVENT_LEVEL_MODERATE = 30, EVENT_LEVEL_MAJOR = 10)) - var/datum/event_container/container = event_manager.event_containers[weight] + var/datum/event_container/container = SSevents.event_containers[weight] var/datum/event/E = container.acquire_event() var/datum/event/Event = new E message_admins("False Alarm: [Event]") diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 7d52d7cd969..ced084f05a3 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -539,7 +539,7 @@ /obj/structure/spacevine_controller/New(loc, list/muts, potency, production) color = "#ffffff" spawn_spacevine_piece(loc, , muts) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) init_subtypes(/datum/spacevine_mutation/, mutations_list) if(potency != null && potency > 0) // 1 mutativeness at 10 potency @@ -567,7 +567,7 @@ return /obj/structure/spacevine_controller/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/structure/spacevine_controller/proc/spawn_spacevine_piece(turf/location, obj/structure/spacevine/parent, list/muts) diff --git a/code/modules/events/wizard/ghost.dm b/code/modules/events/wizard/ghost.dm new file mode 100644 index 00000000000..11529e3080d --- /dev/null +++ b/code/modules/events/wizard/ghost.dm @@ -0,0 +1,5 @@ +/datum/event/wizard/ghost //The spook is real + +/datum/event/wizard/ghost/start() + var/msg = "You suddenly feel extremely obvious..." + set_observer_default_invisibility(0, msg) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 855ac60666b..e937ec25ef9 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -138,7 +138,7 @@ Gunshots/explosions/opening doors/less rare audio (done) if(target.client) target.client.images |= flood_images next_expand = world.time + FAKE_FLOOD_EXPAND_TIME - processing_objects += src + START_PROCESSING(SSobj, src) /obj/effect/hallucination/fake_flood/process() if(next_expand <= world.time) @@ -162,7 +162,7 @@ Gunshots/explosions/opening doors/less rare audio (done) target.client.images |= flood_images /obj/effect/hallucination/fake_flood/Destroy() - processing_objects -= src + STOP_PROCESSING(SSobj, src) flood_turfs.Cut() if(target.client) target.client.images.Remove(flood_images) diff --git a/code/modules/holiday/holiday.dm b/code/modules/holiday/holiday.dm index 414df7f7589..f87422e2ad1 100644 --- a/code/modules/holiday/holiday.dm +++ b/code/modules/holiday/holiday.dm @@ -345,9 +345,9 @@ if(!istype(H)) return H.celebrate() - if(!holiday_master.holidays) - holiday_master.holidays = list() - holiday_master.holidays[H.name] = H + if(!SSholiday.holidays) + SSholiday.holidays = list() + SSholiday.holidays[H.name] = H //update our hub status world.update_status() diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index 371822643a1..21ba7cb89e2 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -47,11 +47,11 @@ /obj/structure/beebox/Initialize(mapload) . = ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/structure/beebox/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) for(var/mob/living/simple_animal/hostile/poison/bees/B in bees) B.beehome = null bees.Cut() diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 67979b61dd7..cc6c6115097 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -15,8 +15,8 @@ var/productivity = 0 var/max_items = 40 var/datum/research/files - var/list/show_categories = list("Food", "Botany Chemicals", "Leather and Cloth") - var/list/timesFiveCategories = list("Food", "Botany Chemicals") + var/list/show_categories = list("Food", "Botany Chemicals", "Organic Materials", "Leather and Cloth") + var/list/timesFiveCategories = list("Food", "Botany Chemicals", "Organic Materials") /obj/machinery/biogenerator/New() ..() diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 4ed9d963274..90725f8e46e 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -151,7 +151,7 @@ burning = 1 set_light(6, l_color = "#ED9200") Burn() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/structure/bonfire/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) ..() @@ -186,7 +186,7 @@ icon_state = "bonfire" burning = 0 set_light(0) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) /obj/structure/bonfire/buckle_mob(mob/living/M, force = 0) if(..()) diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index b0eafcbc8bb..38d5436ecfb 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -701,8 +701,7 @@ H.nutrition -= 20 H.adjustToxLoss(-3) var/turf/T = get_turf(H) - T.add_vomit_floor(H) - playsound(H, 'sound/effects/splat.ogg', 50, 1) + T.add_vomit_floor() else visible_message("[src] flickers and fails, due to bluespace interference!") qdel(src) diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm index f657fa6ec5f..fd8b8dfa4ef 100644 --- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm +++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm @@ -35,14 +35,14 @@ /obj/item/melee/ghost_sword/New() ..() spirits = list() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) GLOB.poi_list |= src /obj/item/melee/ghost_sword/Destroy() for(var/mob/dead/observer/G in spirits) G.invisibility = initial(G.invisibility) spirits.Cut() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) GLOB.poi_list -= src . = ..() diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm index c3887fe4660..d7c6232121f 100644 --- a/code/modules/mining/lavaland/loot/colossus_loot.dm +++ b/code/modules/mining/lavaland/loot/colossus_loot.dm @@ -436,7 +436,7 @@ ..() if(isanimal(loc)) holder_animal = loc - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/structure/closet/stasis/Entered(atom/A) if(isliving(A) && holder_animal) @@ -450,7 +450,7 @@ holder_animal.verbs -= /mob/living/verb/pulled /obj/structure/closet/stasis/dump_contents(var/kill = 1) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) for(var/mob/living/L in src) L.disabilities &= ~MUTE L.status_flags &= ~GODMODE diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index dfd4e1e3332..b7c301f7387 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -3,6 +3,8 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for things ghosts should still be able to see when they toggle darkness +GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) + /mob/dead/observer name = "ghost" desc = "It's a g-g-g-g-ghooooost!" //jinkies! @@ -29,6 +31,8 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi var/ghost_orbit = GHOST_ORBIT_CIRCLE /mob/dead/observer/New(var/mob/body=null, var/flags=1) + set_invisibility(GLOB.observer_default_invisibility) + sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF see_invisible = SEE_INVISIBLE_OBSERVER_AI_EYE see_in_dark = 100 @@ -384,7 +388,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(usr, "AntagHud Toggled OFF") M.antagHUD = 0 -/mob/dead/observer/proc/dead_tele(A in ghostteleportlocs) +/mob/dead/observer/proc/dead_tele() set category = "Ghost" set name = "Teleport" set desc= "Teleport to a location" @@ -393,12 +397,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(usr, "Not when you're not dead!") return - usr.verbs -= /mob/dead/observer/proc/dead_tele - spawn(30) - usr.verbs += /mob/dead/observer/proc/dead_tele - + var/area/A = input("Area to jump to", "BOOYEA") as null|anything in ghostteleportlocs var/area/thearea = ghostteleportlocs[A] - if(!thearea) return + + if(!thearea) + return var/list/L = list() for(var/turf/T in get_area_turfs(thearea.type)) @@ -406,17 +409,19 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!L || !L.len) to_chat(usr, "No area available.") + return usr.forceMove(pick(L)) following = null -/mob/dead/observer/verb/follow(input in getmobs()) +/mob/dead/observer/verb/follow() set category = "Ghost" set name = "Orbit" // "Haunt" set desc = "Follow and orbit a mob." - var/target = getmobs()[input] - if(!target) return + var/list/mobs = getpois(skip_mindless=1) + var/input = input("Please, select a mob!", "Haunt", null, null) as null|anything in mobs + var/mob/target = mobs[input] ManualFollow(target) // This is the ghost's follow verb with an argument @@ -484,24 +489,29 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp update_following() return ..() -/mob/dead/observer/verb/jumptomob(target in getmobs()) //Moves the ghost instead of just changing the ghosts's eye -Nodrak +/mob/dead/observer/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak set category = "Ghost" set name = "Jump to Mob" set desc = "Teleport to a mob" - if(istype(usr, /mob/dead/observer)) //Make sure they're an observer! + if(isobserver(usr)) //Make sure they're an observer! + var/list/dest = list() //List of possible destinations (mobs) + var/target = null //Chosen target. - if(!target)//Make sure we actually have a target + dest += getpois(mobs_only=1) //Fill list, prompt user with list + target = input("Please, select a mob!", "Jump to Mob", null, null) as null|anything in dest + + if(!target) //Make sure we actually have a target return else - var/mob/M = getmobs()[target] //Destination mob + var/mob/M = dest[target] //Destination mob + var/mob/A = src //Source mob var/turf/T = get_turf(M) //Turf of the destination mob if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. - forceMove(T) - following = null + A.forceMove(T) else - to_chat(src, "This mob is not located in the game world.") + to_chat(A, "This mob is not located in the game world.") /* Now a spell. See spells.dm @@ -742,6 +752,26 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/is_literate() return TRUE + +/mob/dead/observer/proc/set_invisibility(value) + invisibility = value + if(!value) + set_light(1, 2) + else + set_light(0, 0) + +/mob/dead/observer/vv_edit_var(var_name, var_value) + . = ..() + if(var_name == "invisibility") + set_invisibility(invisibility) // updates light + +/proc/set_observer_default_invisibility(amount, message=null) + for(var/mob/dead/observer/G in GLOB.player_list) + G.set_invisibility(amount) + if(message) + to_chat(G, message) + GLOB.observer_default_invisibility = amount + /mob/dead/observer/proc/open_spawners_menu() set name = "Mob spawners menu" set desc = "See all currently available ghost spawners" diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index ab47a84ee76..41c1d89f603 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -17,7 +17,7 @@ . = src.say_dead(message) -/mob/dead/observer/emote(var/act, var/type, var/message) +/mob/dead/observer/emote(act, type, message, force) message = sanitize(copytext(message, 1, MAX_MESSAGE_LEN)) if(!message) diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 0ec193c69e8..989decdb395 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -2,15 +2,20 @@ //Emote Cooldown System (it's so simple!) /mob/proc/handle_emote_CD(cooldown = EMOTE_COOLDOWN) - if(emote_cd == 2) return 1 // Cooldown emotes were disabled by an admin, prevent use - if(src.emote_cd == 1) return 1 // Already on CD, prevent use + if(emote_cd == 3) //Spam those emotes + return FALSE + if(emote_cd == 2) // Cooldown emotes were disabled by an admin, prevent use + return TRUE + if(emote_cd == 1) // Already on CD, prevent use + return TRUE - src.emote_cd = 1 // Starting cooldown + emote_cd = TRUE // Starting cooldown spawn(cooldown) - if(emote_cd == 2) return 1 // Don't reset if cooldown emotes were disabled by an admin during the cooldown - src.emote_cd = 0 // Cooldown complete, ready for more! + if(emote_cd == 2) + return TRUE // Don't reset if cooldown emotes were disabled by an admin during the cooldown + emote_cd = FALSE // Cooldown complete, ready for more! + return FALSE // Proceed with emote - return 0 // Proceed with emote //--FalseIncarnate /mob/proc/handle_emote_param(var/target, var/not_self, var/vicinity, var/return_mob) //Only returns not null if the target param is valid. diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 3a6c4d22a67..ee9a3c3cca2 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -7,10 +7,10 @@ /obj/item/holder/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/holder/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/holder/process() diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm index f159abebbe4..7412120cff0 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/alien/humanoid/emote(var/act,var/m_type=1,var/message = null) +/mob/living/carbon/alien/humanoid/emote(act, m_type = 1, message = null, force) var/param = null if(findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) @@ -25,7 +25,7 @@ if("flip") on_CD = handle_emote_CD() - if(on_CD) + if(!force && on_CD == 1) return switch(act) @@ -138,4 +138,4 @@ playsound(src.loc, 'sound/voice/hiss1.ogg', 30, 1, 1) if(act == "gnarl") playsound(src.loc, 'sound/voice/hiss4.ogg', 30, 1, 1) - ..(act, m_type, message) \ No newline at end of file + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/larva/emote.dm b/code/modules/mob/living/carbon/alien/larva/emote.dm index 82ebcf943f6..3b18889176b 100644 --- a/code/modules/mob/living/carbon/alien/larva/emote.dm +++ b/code/modules/mob/living/carbon/alien/larva/emote.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/alien/larva/emote(var/act,var/m_type=1,var/message = null) +/mob/living/carbon/alien/larva/emote(act, m_type = 1, message = null, force) var/param = null if(findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 087ca959902..04f5cd53d00 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -107,7 +107,7 @@ /obj/item/organ/internal/brain/necrotize(update_sprite = TRUE) //Brain also has special handling for when it necrotizes damage = max_damage status |= ORGAN_DEAD - processing_objects -= src + STOP_PROCESSING(SSobj, src) if(dead_icon && !is_robotic()) icon_state = dead_icon if(owner && vital) diff --git a/code/modules/mob/living/carbon/brain/emote.dm b/code/modules/mob/living/carbon/brain/emote.dm index bf7962464da..dd1876e223f 100644 --- a/code/modules/mob/living/carbon/brain/emote.dm +++ b/code/modules/mob/living/carbon/brain/emote.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/brain/emote(var/act,var/m_type=1,var/message = null) +/mob/living/carbon/brain/emote(act,m_type = 1, message = null, force) if(!(container && istype(container, /obj/item/mmi)))//No MMI, no emotes return @@ -48,4 +48,4 @@ to_chat(src, "alarm, alert, notice, flash,blink, whistle, beep, boop") if(message && !stat) - ..(act, m_type, message) \ No newline at end of file + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 277bbbd8789..77373021727 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -109,7 +109,7 @@ adjustBruteLoss(3) else if(T) - T.add_vomit_floor(src) + T.add_vomit_floor() nutrition -= lost_nutrition if(stun) adjustToxLoss(-3) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 7259a455154..6d245674fd1 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -93,7 +93,7 @@ /mob/living/carbon/human/death(gibbed) if(can_die() && !gibbed && deathgasp_on_death) - emote("deathgasp") //let the world KNOW WE ARE DEAD + emote("deathgasp", force = TRUE) //let the world KNOW WE ARE DEAD // Only execute the below if we successfully died . = ..(gibbed) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 442d7aaf044..416fd911777 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/emote(var/act,var/m_type=1,var/message = null,var/force) +/mob/living/carbon/human/emote(act, m_type = 1, message = null, force) if((stat == DEAD) || (status_flags & FAKEDEATH)) return // No screaming bodies @@ -13,22 +13,22 @@ if(muzzled) var/obj/item/clothing/mask/muzzle/M = wear_mask if(M.mute == MUZZLE_MUTE_NONE) - muzzled = 0 //Not all muzzles block sound + muzzled = FALSE //Not all muzzles block sound if(!can_speak()) - muzzled = 1 + muzzled = TRUE //var/m_type = 1 for(var/obj/item/implant/I in src) if(I.implanted) - I.trigger(act, src) + I.trigger(act, src, force) - var/miming = 0 + var/miming = FALSE if(mind) miming = mind.miming //Emote Cooldown System (it's so simple!) - // proc/handle_emote_CD() located in [code\modules\mob\emote.dm] - var/on_CD = 0 + //handle_emote_CD() located in [code\modules\mob\emote.dm] + var/on_CD = FALSE act = lowertext(act) switch(act) //Cooldown-inducing emotes @@ -61,16 +61,16 @@ else return if("squish", "squishes") - var/found_slime_bodypart = 0 + var/found_slime_bodypart = FALSE if(isslimeperson(src)) //Only Slime People can squish on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm' - found_slime_bodypart = 1 + found_slime_bodypart = TRUE else for(var/obj/item/organ/external/L in bodyparts) // if your limbs are squishy you can squish too! if(istype(L.dna.species, /datum/species/slime)) on_CD = handle_emote_CD() - found_slime_bodypart = 1 + found_slime_bodypart = TRUE break if(!found_slime_bodypart) //Everyone else fails, skip the emote attempt @@ -118,9 +118,9 @@ on_CD = handle_emote_CD() //Everything else, including typos of the above emotes else - on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown + on_CD = FALSE //If it doesn't induce the cooldown, we won't check for the cooldown - if(on_CD == 1) // Check if we need to suppress the emote attempt. + if(!force && on_CD == 1) // Check if we need to suppress the emote attempt. return // Suppress emote, you're still cooling off. switch(act) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 903c8ef80d3..d6c667b1b74 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -38,6 +38,7 @@ regenerate_icons() // Make sure the inventory updates handle_ghosted() + handle_ssd() /mob/living/carbon/human/proc/handle_ghosted() if(player_ghosted > 0 && stat == CONSCIOUS && job && !restrained()) @@ -48,6 +49,22 @@ if(player_ghosted % 150 == 0) force_cryo_human(src) +/mob/living/carbon/human/proc/handle_ssd() + if(player_logged > 0 && stat != DEAD && job) + player_logged++ + if(istype(loc, /obj/machinery/cryopod)) + return + if(config.auto_cryo_ssd_mins && (player_logged >= (config.auto_cryo_ssd_mins * 30)) && player_logged % 30 == 0) + var/turf/T = get_turf(src) + if(!is_station_level(T.z)) + return + var/area/A = get_area(src) + if(cryo_ssd(src)) + var/obj/effect/portal/P = new /obj/effect/portal(T, null, null, 40) + P.name = "NT SSD Teleportation Portal" + if(A.fast_despawn) + force_cryo_human(src) + /mob/living/carbon/human/calculate_affecting_pressure(var/pressure) ..() var/pressure_difference = abs( pressure - ONE_ATMOSPHERE ) diff --git a/code/modules/mob/living/carbon/slime/emote.dm b/code/modules/mob/living/carbon/slime/emote.dm index a07f1ba3b2e..c938ac17214 100644 --- a/code/modules/mob/living/carbon/slime/emote.dm +++ b/code/modules/mob/living/carbon/slime/emote.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/slime/emote(act, m_type = 1, message = null) +/mob/living/carbon/slime/emote(act, m_type = 1, message = null, force) if(findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) //param = copytext(act, t1 + 1, length(act) + 1) diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 003b5c3d4fe..37077881350 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -57,7 +57,7 @@ SetLoseBreath(0) if(!gibbed && deathgasp_on_death) - emote("deathgasp") + emote("deathgasp", force = TRUE) if(mind && suiciding) mind.suicided = TRUE diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index cf5fff66caa..95b44b15862 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -275,7 +275,7 @@ proc/get_radio_key_from_channel(var/channel) /mob/living/proc/GetVoice() return name -/mob/living/emote(var/act, var/type, var/message) //emote code is terrible, this is so that anything that isn't already snowflaked to shit can call the parent and handle emoting sanely +/mob/living/emote(act, type, message, force) //emote code is terrible, this is so that anything that isn't already snowflaked to shit can call the parent and handle emoting sanely if(client) if(client.prefs.muted & MUTE_IC) to_chat(src, "You cannot speak in IC (Muted).") @@ -284,7 +284,7 @@ proc/get_radio_key_from_channel(var/channel) if(stat) return 0 - if(..(act, type, message)) + if(..()) return 1 if(act && type && message) //parent call @@ -306,7 +306,8 @@ proc/get_radio_key_from_channel(var/channel) return 1 else //everything else failed, emote is probably invalid - if(act == "help") return //except help, because help is handled individually + if(act == "help") + return //except help, because help is handled individually to_chat(src, "Unusable emote '[act]'. Say *help for a list.") /mob/living/whisper(message as text) diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm index 2f662169551..63b206debba 100644 --- a/code/modules/mob/living/silicon/death.dm +++ b/code/modules/mob/living/silicon/death.dm @@ -42,3 +42,9 @@ animation.icon = 'icons/mob/mob.dmi' animation.master = src QDEL_IN(animation, 15) + +/mob/living/silicon/death(gibbed) + . = ..() + if(!gibbed) + if(death_sound) + playsound(get_turf(src), death_sound, 200, 1) diff --git a/code/modules/mob/living/silicon/emote.dm b/code/modules/mob/living/silicon/emote.dm index 3385c4ce622..1b1ee4f7f48 100644 --- a/code/modules/mob/living/silicon/emote.dm +++ b/code/modules/mob/living/silicon/emote.dm @@ -1,4 +1,4 @@ -/mob/living/silicon/emote(var/act, var/m_type=1, var/message = null) +/mob/living/silicon/emote(act, m_type=1, message = null, force) var/param = null if(findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) @@ -6,7 +6,7 @@ act = copytext(act, 1, t1) //Emote Cooldown System (it's so simple!) - // proc/handle_emote_CD() located in [code\modules\mob\emote.dm] + //handle_emote_CD() located in [code\modules\mob\emote.dm] var/on_CD = 0 act = lowertext(act) switch(act) @@ -20,7 +20,7 @@ else on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown - if(on_CD == 1) // Check if we need to suppress the emote attempt. + if(!force && on_CD == 1) // Check if we need to suppress the emote attempt. return // Suppress emote, you're still cooling off. //--FalseIncarnate @@ -78,4 +78,4 @@ if("help") to_chat(src, "yes, no, beep, ping, buzz, scream, buzz2") - ..(act, m_type, message) + ..() diff --git a/code/modules/mob/living/silicon/pai/emote.dm b/code/modules/mob/living/silicon/pai/emote.dm deleted file mode 100644 index a418c0972d5..00000000000 --- a/code/modules/mob/living/silicon/pai/emote.dm +++ /dev/null @@ -1,2 +0,0 @@ -/mob/living/silicon/pai/emote(var/act, var/m_type=1, var/message = null) - ..(act, m_type, message) diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index fec27db5df8..ff859853ea5 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -28,7 +28,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates if(candidate) if(!istype(candidate)) - message_admins("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate is not a pAI)") + message_admins("Warning: possible href exploit by [key_name_admin(usr)] (paiController/Topic, candidate is not a pAI)") log_debug("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate is not a pAI)") return @@ -55,13 +55,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates pai_candidates -= candidate usr << browse(null, "window=findPai") - - - if(candidate) - if(candidate.key && usr.key && candidate.key != usr.key) - message_admins("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr are different mobs)") - log_debug("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr are different mobs)") - return + return if("signup" in href_list) var/mob/dead/observer/O = locate(href_list["signup"]) @@ -75,6 +69,11 @@ var/datum/paiController/paiController // Global handler for pAI candidates recruitWindow(O) return + if(candidate) + if(candidate.key && usr.key && candidate.key != usr.key) + message_admins("Warning: possible href exploit by [key_name_admin(usr)] (paiController/Topic, candidate and usr have different keys)") + log_debug("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr have different keys)") + return if(href_list["new"]) var/option = href_list["option"] diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index 21a09eed8a8..7402c4a65c9 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -50,7 +50,7 @@ /mob/living/silicon/robot/death(gibbed) if(can_die()) if(!gibbed && deathgasp_on_death) - emote("deathgasp") + emote("deathgasp", force = TRUE) if(module) module.handle_death(gibbed) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 80014c44f8b..e94f9e072b4 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -248,9 +248,9 @@ death() /mob/living/silicon/robot/drone/proc/full_law_reset() - clear_supplied_laws() - clear_inherent_laws() - clear_ion_laws() + clear_supplied_laws(TRUE) + clear_inherent_laws(TRUE) + clear_ion_laws(TRUE) laws = new /datum/ai_laws/drone //Reboot procs. diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 9c130780d81..bec1e1ae668 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -1,4 +1,4 @@ -/mob/living/silicon/robot/emote(var/act, var/m_type=1, var/message = null) +/mob/living/silicon/robot/emote(act, m_type=1, message = null, force) var/param = null if(findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) @@ -6,7 +6,7 @@ act = copytext(act, 1, t1) //Emote Cooldown System (it's so simple!) - //proc/handle_emote_CD() located in [code\modules\mob\emote.dm] + //handle_emote_CD() located in [code\modules\mob\emote.dm] var/on_CD = 0 act = lowertext(act) switch(act) @@ -17,7 +17,7 @@ else on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown - if(on_CD == 1) // Check if we need to suppress the emote attempt. + if(!force && on_CD == 1) // Check if we need to suppress the emote attempt. return // Suppress emote, you're still cooling off. //--FalseIncarnate @@ -160,7 +160,7 @@ if("help") to_chat(src, "salute, bow-(none)/mob, clap, flap, aflap, twitch, twitches, nod, deathgasp, glare-(none)/mob, stare-(none)/mob, look,\n law, halt") - ..(act, m_type, message) + ..() /mob/living/silicon/robot/verb/powerwarn() set category = "Robot Commands" diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 17a7e67adf7..8092947919f 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -103,7 +103,7 @@ return return 1 -/mob/living/silicon/ai/emote(var/act, var/type, var/message) +/mob/living/silicon/ai/emote(act, type, message, force) var/obj/machinery/hologram/holopad/T = current if(istype(T) && T.masters[src])//Is the AI using a holopad? src.holopad_emote(message) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 5c19dcb0d7a..1c82e9e8779 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -19,6 +19,7 @@ var/speak_exclamation = "declares" var/speak_query = "queries" var/pose //Yes, now AIs can pose too. + var/death_sound = 'sound/voice/borg_deathsound.ogg' //var/sensor_mode = 0 //Determines the current HUD. diff --git a/code/modules/mob/living/silicon/subsystems.dm b/code/modules/mob/living/silicon/subsystems.dm index fa3dcfd2cfa..8f7c2316768 100644 --- a/code/modules/mob/living/silicon/subsystems.dm +++ b/code/modules/mob/living/silicon/subsystems.dm @@ -41,7 +41,7 @@ if(!register_alarms) return - var/list/register_to = list(atmosphere_alarm, burglar_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) + var/list/register_to = list(SSalarms.atmosphere_alarm, SSalarms.burglar_alarm, SSalarms.camera_alarm, SSalarms.fire_alarm, SSalarms.motion_alarm, SSalarms.power_alarm) for(var/datum/alarm_handler/AH in register_to) AH.register(src, /mob/living/silicon/proc/receive_alarm) queued_alarms[AH] = list() // Makes sure alarms remain listed in consistent order diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 2737781bd08..77eb74e5696 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -210,23 +210,29 @@ var/robot_arm = /obj/item/robot_parts/l_arm throw_range = 5 w_class = WEIGHT_CLASS_NORMAL var/created_name = "Floorbot" + var/toolbox = /obj/item/storage/toolbox/mechanical + var/toolbox_color = "" //Blank for blue, r for red, y for yellow, etc. -/obj/item/toolbox_tiles_sensor +/obj/item/toolbox_tiles/sensor desc = "It's a toolbox with tiles sticking out the top and a sensor attached" name = "tiles, toolbox and sensor arrangement" - icon = 'icons/obj/aibots.dmi' icon_state = "toolbox_tiles_sensor" - force = 3 - throwforce = 10 - throw_speed = 2 - throw_range = 5 - w_class = WEIGHT_CLASS_NORMAL - var/created_name = "Floorbot" -/obj/item/storage/toolbox/mechanical/attackby(obj/item/stack/tile/plasteel/T, mob/user, params) +/obj/item/storage/toolbox/attackby(obj/item/stack/tile/plasteel/T, mob/user, params) + var/list/allowed_toolbox = list(/obj/item/storage/toolbox/emergency, //which toolboxes can be made into floorbots + /obj/item/storage/toolbox/electrical, + /obj/item/storage/toolbox/mechanical, + /obj/item/storage/toolbox/green, + /obj/item/storage/toolbox/syndicate, + /obj/item/storage/toolbox/fakesyndi) + if(!istype(T, /obj/item/stack/tile/plasteel)) ..() return + if(!is_type_in_list(src, allowed_toolbox)) + return + if(type == /obj/item/storage/toolbox/green/memetic) + return if(contents.len >= 1) to_chat(user, "They won't fit in, as there is already stuff inside.") return @@ -234,6 +240,23 @@ var/robot_arm = /obj/item/robot_parts/l_arm if(user.s_active) user.s_active.close(user) var/obj/item/toolbox_tiles/B = new /obj/item/toolbox_tiles + B.toolbox = type + switch(B.toolbox) + if(/obj/item/storage/toolbox/mechanical/old) + B.toolbox_color = "ob" + if(/obj/item/storage/toolbox/emergency) + B.toolbox_color = "r" + if(/obj/item/storage/toolbox/emergency/old) + B.toolbox_color = "or" + if(/obj/item/storage/toolbox/electrical) + B.toolbox_color = "y" + if(/obj/item/storage/toolbox/green) + B.toolbox_color = "g" + if(/obj/item/storage/toolbox/syndicate) + B.toolbox_color = "s" + if(/obj/item/storage/toolbox/fakesyndi) + B.toolbox_color = "s" + B.icon_state = "[B.toolbox_color]toolbox_tiles" user.put_in_hands(B) to_chat(user, "You add the tiles into the empty toolbox. They protrude from the top.") user.unEquip(src, 1) @@ -246,8 +269,10 @@ var/robot_arm = /obj/item/robot_parts/l_arm ..() if(isprox(W)) qdel(W) - var/obj/item/toolbox_tiles_sensor/B = new /obj/item/toolbox_tiles_sensor() + var/obj/item/toolbox_tiles/sensor/B = new /obj/item/toolbox_tiles/sensor() B.created_name = created_name + B.toolbox_color = src.toolbox_color + B.icon_state = "[B.toolbox_color]toolbox_tiles_sensor" user.put_in_hands(B) to_chat(user, "You add the sensor to the toolbox and tiles.") user.unEquip(src, 1) @@ -263,12 +288,11 @@ var/robot_arm = /obj/item/robot_parts/l_arm created_name = t log_game("[key_name(user)] has renamed a robot to [t]") -/obj/item/toolbox_tiles_sensor/attackby(obj/item/W, mob/user, params) +/obj/item/toolbox_tiles/sensor/attackby(obj/item/W, mob/user, params) ..() if(istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm)) qdel(W) - var/turf/T = get_turf(user.loc) - var/mob/living/simple_animal/bot/floorbot/A = new /mob/living/simple_animal/bot/floorbot(T) + var/mob/living/simple_animal/bot/floorbot/A = new(drop_location(), toolbox_color) A.name = created_name A.robot_arm = W.type to_chat(user, "You add the robot arm to the odd looking toolbox assembly. Boop beep!") @@ -287,10 +311,9 @@ var/robot_arm = /obj/item/robot_parts/l_arm //Medbot Assembly /obj/item/storage/firstaid/attackby(obj/item/I, mob/user, params) if(!istype(I, /obj/item/robot_parts/l_arm) && !istype(I, /obj/item/robot_parts/r_arm)) - return ..() + return ..() else robot_arm = I.type - //Making a medibot! if(contents.len) @@ -298,7 +321,7 @@ var/robot_arm = /obj/item/robot_parts/l_arm return var/obj/item/firstaid_arm_assembly/A = new /obj/item/firstaid_arm_assembly(loc, med_bot_skin) - + A.req_one_access = req_one_access A.syndicate_aligned = syndicate_aligned A.treatment_oxy = treatment_oxy @@ -492,7 +515,7 @@ var/robot_arm = /obj/item/robot_parts/l_arm //General Griefsky - else if((istype(I, /obj/item/wrench)) && (build_step == 3)) + else if((istype(I, /obj/item/wrench)) && (build_step == 3)) var/obj/item/griefsky_assembly/A = new /obj/item/griefsky_assembly user.put_in_hands(A) to_chat(user, "You adjust the arm slots for extra weapons!.") @@ -516,12 +539,12 @@ var/robot_arm = /obj/item/robot_parts/l_arm build_step++ to_chat(user, "You add an energy sword to [src]!.") qdel(I) - + else if((istype(I, /obj/item/melee/energy/sword)) && (build_step == 3)) if(!user.unEquip(I)) return to_chat(user, "You complete General Griefsky!.") - var/mob/living/simple_animal/bot/secbot/griefsky/S = new /mob/living/simple_animal/bot/secbot/griefsky + var/mob/living/simple_animal/bot/secbot/griefsky/S = new /mob/living/simple_animal/bot/secbot/griefsky S.forceMove(get_turf(src)) qdel(I) qdel(src) @@ -537,7 +560,7 @@ var/robot_arm = /obj/item/robot_parts/l_arm if(!user.unEquip(I)) return to_chat(user, "You complete Genewul Giftskee!.") - var/mob/living/simple_animal/bot/secbot/griefsky/toy/S = new /mob/living/simple_animal/bot/secbot/griefsky/toy + var/mob/living/simple_animal/bot/secbot/griefsky/toy/S = new /mob/living/simple_animal/bot/secbot/griefsky/toy S.forceMove(get_turf(src)) qdel(I) qdel(src) diff --git a/code/modules/mob/living/simple_animal/bot/emote.dm b/code/modules/mob/living/simple_animal/bot/emote.dm index eb6a18e8657..c59e044cc67 100644 --- a/code/modules/mob/living/simple_animal/bot/emote.dm +++ b/code/modules/mob/living/simple_animal/bot/emote.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/bot/emote(act, m_type=1, message = null) +/mob/living/simple_animal/bot/emote(act, m_type = 1, message = null, force) var/param = null if(findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) @@ -9,7 +9,7 @@ act = copytext(act,1,length(act)) //Emote Cooldown System (it's so simple!) - //proc/handle_emote_CD() located in [code\modules\mob\emote.dm] + //handle_emote_CD() located in [code\modules\mob\emote.dm] var/on_CD = 0 act = lowertext(act) switch(act) @@ -22,7 +22,7 @@ else on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown - if(on_CD == 1) // Check if we need to suppress the emote attempt. + if(!force && on_CD == 1) // Check if we need to suppress the emote attempt. return // Suppress emote, you're still cooling off. //--FalseIncarnate @@ -71,4 +71,4 @@ if("help") to_chat(src, "scream(s), yes, no, beep, buzz, ping") - ..(act, m_type, message) + ..() diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index c22d37eed19..21967bd202b 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/aibots.dmi' icon_state = "floorbot0" density = 0 - anchored = 0 + anchored = FALSE health = 25 maxHealth = 25 @@ -32,6 +32,7 @@ var/max_targets = 50 var/turf/target var/oldloc = null + var/toolbox_color = "" #define HULL_BREACH 1 #define BRIDGE_MODE 2 @@ -40,12 +41,16 @@ #define REPLACE_TILE 5 #define TILE_EMAG 6 -/mob/living/simple_animal/bot/floorbot/New() +/mob/living/simple_animal/bot/floorbot/New(mapload, new_toolbox_color) ..() + toolbox_color = new_toolbox_color update_icon() var/datum/job/engineer/J = new/datum/job/engineer access_card.access += J.get_access() prev_access = access_card.access + if(toolbox_color == "s") + health = 50 + maxHealth = 50 /mob/living/simple_animal/bot/floorbot/bot_reset() ..() @@ -53,7 +58,7 @@ oldloc = null ignore_list = list() nagged = 0 - anchored = 0 + anchored = FALSE update_icon() /mob/living/simple_animal/bot/floorbot/set_custom_texts() @@ -235,7 +240,7 @@ repair(target) else if(emagged == 2 && istype(target,/turf/simulated/floor)) var/turf/simulated/floor/F = target - anchored = 1 + anchored = TRUE mode = BOT_REPAIRING if(prob(90)) F.break_tile_to_plating() @@ -244,7 +249,7 @@ audible_message("[src] makes an excited booping sound.") spawn(50) amount ++ - anchored = 0 + anchored = FALSE mode = BOT_IDLE target = null path = list() @@ -272,11 +277,11 @@ if(HULL_BREACH) //The most common job, patching breaches in the station's hull. if(is_hull_breach(scan_target)) //Ensure that the targeted space turf is actually part of the station, and not random space. result = scan_target - anchored = 1 //Prevent the floorbot being blown off-course while trying to reach a hull breach. + anchored = TRUE //Prevent the floorbot being blown off-course while trying to reach a hull breach. if(BRIDGE_MODE) //Only space turfs in our chosen direction are considered. if(get_dir(src, scan_target) == targetdirection) result = scan_target - anchored = 1 + anchored = TRUE if(REPLACE_TILE) F = scan_target if(istype(F, /turf/simulated/floor/plating)) //The floor must not already have a tile. @@ -306,9 +311,10 @@ mode = BOT_IDLE target = null return - anchored = 1 - icon_state = "floorbot-c" + anchored = TRUE + icon_state = "[toolbox_color]floorbot-c" if(istype(target_turf, /turf/space/)) //If we are fixing an area not part of pure space, it is + icon_state = "[toolbox_color]floorbot-c" visible_message("[targetdirection ? "[src] begins installing a bridge plating." : "[src] begins to repair the hole."] ") mode = BOT_REPAIRING spawn(50) @@ -320,11 +326,12 @@ mode = BOT_IDLE amount -= 1 update_icon() - anchored = 0 + anchored = FALSE target = null else var/turf/simulated/floor/F = target_turf mode = BOT_REPAIRING + icon_state = "[toolbox_color]floorbot-c" visible_message("[src] begins repairing the floor.") spawn(50) if(mode == BOT_REPAIRING) @@ -334,7 +341,7 @@ mode = BOT_IDLE amount -= 1 update_icon() - anchored = 0 + anchored = FALSE target = null /mob/living/simple_animal/bot/floorbot/proc/eattile(obj/item/stack/tile/plasteel/T) @@ -380,9 +387,9 @@ /mob/living/simple_animal/bot/floorbot/update_icon() if(amount > 0) - icon_state = "floorbot[on]" + icon_state = "[toolbox_color]floorbot[on]" else - icon_state = "floorbot[on]e" + icon_state = "[toolbox_color]floorbot[on]e" /mob/living/simple_animal/bot/floorbot/explode() on = 0 diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 9532daabab8..38787198a5f 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -147,7 +147,7 @@ stop_automated_movement = 1 walk_to(src,movement_target,0,3) -/mob/living/simple_animal/pet/cat/emote(act, m_type=1, message = null) +/mob/living/simple_animal/pet/cat/emote(act, m_type = 1, message = null, force) if(stat != CONSCIOUS) return @@ -163,9 +163,9 @@ else on_CD = 0 - if(on_CD == 1) + if(!force && on_CD == 1) return - + switch(act) if("meow") message = "[src] [pick(emote_hear)]!" @@ -225,9 +225,9 @@ maxHealth = 50 harm_intent_damage = 10 butcher_results = list( - /obj/item/organ/internal/brain = 1, - /obj/item/organ/internal/heart = 1, - /obj/item/reagent_containers/food/snacks/birthdaycakeslice = 3, + /obj/item/organ/internal/brain = 1, + /obj/item/organ/internal/heart = 1, + /obj/item/reagent_containers/food/snacks/birthdaycakeslice = 3, /obj/item/reagent_containers/food/snacks/meat/slab = 2 ) response_harm = "takes a bite out of" diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 832d92c9d8f..3ff26f7850c 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -368,7 +368,7 @@ name = "Definitely Not [real_name]" desc = "That's Definitely Not [real_name]" valid = 1 - + if(/obj/item/clothing/head/beret/centcom/officer, /obj/item/clothing/head/beret/centcom/officer/navy) name = "Blueshield [real_name]" desc = "Will stand by you until the bitter end." @@ -407,7 +407,7 @@ playsound(src, yelp_sound, 75, 1) ..() -/mob/living/simple_animal/pet/corgi/emote(act, m_type=1, message = null) +/mob/living/simple_animal/pet/corgi/emote(act, m_type = 1, message = null, force) if(stat != CONSCIOUS) return @@ -421,9 +421,9 @@ else on_CD = 0 - if(on_CD == 1) + if(!force && on_CD == 1) return - + switch(act) if("bark") message = "[src] [pick(src.speak_emote)]!" diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm index 07a5fcf0131..355d756288b 100644 --- a/code/modules/mob/living/simple_animal/friendly/diona.dm +++ b/code/modules/mob/living/simple_animal/friendly/diona.dm @@ -60,7 +60,7 @@ /datum/action/innate/diona/merge/Activate() var/mob/living/simple_animal/diona/user = owner user.merge() - + /datum/action/innate/diona/evolve name = "Evolve" icon_icon = 'icons/obj/cloning.dmi' @@ -109,7 +109,7 @@ forceMove(M) else get_scooped(M) - else + else ..() /mob/living/simple_animal/diona/proc/merge() @@ -151,7 +151,7 @@ to_chat(loc, "You feel a pang of loss as [src] splits away from your biomass.") to_chat(src, "You wiggle out of the depths of [loc]'s biomass and plop to the ground.") forceMove(T) - + var/hasMobs = FALSE for(var/atom/A in D.contents) if(istype(A, /mob/) || istype(A, /obj/item/holder)) @@ -163,9 +163,9 @@ return TRUE /mob/living/simple_animal/diona/proc/evolve() - if(stat != CONSCIOUS) + if(stat != CONSCIOUS) return FALSE - + if(donors.len < evolve_donors) to_chat(src, "You need more blood in order to ascend to a new state of consciousness...") return FALSE @@ -176,7 +176,7 @@ if(isdiona(loc) && !split()) //if it's merged with diona, needs to able to split before evolving return FALSE - + visible_message("[src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.","You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.") var/mob/living/carbon/human/diona/adult = new(get_turf(loc)) @@ -202,14 +202,14 @@ qdel(src) return TRUE -/mob/living/simple_animal/diona/proc/steal_blood() - if(stat != CONSCIOUS) +/mob/living/simple_animal/diona/proc/steal_blood() + if(stat != CONSCIOUS) return FALSE - + var/list/choices = list() for(var/mob/living/carbon/human/H in oview(1,src)) if(Adjacent(H) && H.dna && !(NO_BLOOD in H.dna.species.species_traits)) - choices += H + choices += H if(!choices.len) to_chat(src, "No suitable blood donors nearby.") @@ -260,7 +260,7 @@ to_chat(src, "You don't have any hands!") return -/mob/living/simple_animal/diona/emote(act, m_type=1, message = null) +/mob/living/simple_animal/diona/emote(act, m_type = 1, message = null, force) if(stat != CONSCIOUS) return @@ -272,7 +272,7 @@ else on_CD = 0 - if(on_CD == 1) + if(!force && on_CD == 1) return switch(act) //IMPORTANT: Emotes MUST NOT CONFLICT anywhere along the chain. @@ -283,4 +283,4 @@ if("help") to_chat(src, "scream, chirp") - ..(act, m_type, message) \ No newline at end of file + ..() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index dd0c5b9f72a..85e48c9a4d3 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -299,7 +299,7 @@ var/global/chicken_count = 0 E.pixel_y = rand(-6,6) if(eggsFertile) if(chicken_count < MAX_CHICKENS && prob(25)) - processing_objects.Add(E) + START_PROCESSING(SSobj, E) /obj/item/reagent_containers/food/snacks/egg/var/amount_grown = 0 /obj/item/reagent_containers/food/snacks/egg/process() @@ -308,10 +308,10 @@ var/global/chicken_count = 0 if(amount_grown >= 100) visible_message("[src] hatches with a quiet cracking sound.") new /mob/living/simple_animal/chick(get_turf(src)) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) qdel(src) else - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) /mob/living/simple_animal/pig diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index c84947c7363..ae19106e1af 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -109,7 +109,7 @@ if(client) client.time_died_as_mouse = world.time -/mob/living/simple_animal/mouse/emote(act, m_type=1, message = null) +/mob/living/simple_animal/mouse/emote(act, m_type = 1, message = null, force) if(stat != CONSCIOUS) return @@ -121,7 +121,7 @@ else on_CD = 0 - if(on_CD == 1) + if(!force && on_CD == 1) return switch(act) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 02f15a59709..b4019cff988 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -258,7 +258,7 @@ adjustBruteLoss(20) return -/mob/living/simple_animal/emote(var/act, var/m_type=1, var/message = null) +/mob/living/simple_animal/emote(act, m_type = 1, message = null, force) if(stat) return act = lowertext(act) @@ -269,7 +269,7 @@ if("help") to_chat(src, "scream") - ..(act, m_type, message) + ..() /mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) if(!Proj) diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index fc265722f4a..0a1346fd0ed 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -19,10 +19,10 @@ spawn() alert("You have logged in already with another key this round, please log out of this one NOW or risk being banned!") if(matches) if(M.client) - message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].", 1) + message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].", 1) log_adminwarn("Notice: [key_name(src)] has the same [matches] as [key_name(M)].") else - message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)] (no longer logged in). ", 1) + message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)] (no longer logged in). ", 1) log_adminwarn("Notice: [key_name(src)] has the same [matches] as [key_name(M)] (no longer logged in).") /mob/Login() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index ee04e624f02..482bf85491d 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -901,13 +901,18 @@ var/list/slot_equipment_priority = list( \ /mob/MouseDrop(mob/M as mob) ..() if(M != usr) return - if(isliving(M)) // Ewww + if(isliving(M)) var/mob/living/L = M if(L.mob_size <= MOB_SIZE_SMALL) return // Stops pAI drones and small mobs (borers, parrots, crabs) from stripping people. --DZD - if(!M.can_strip) return - if(usr == src) return - if(!Adjacent(usr)) return + if(!M.can_strip) + return + if(usr == src) + return + if(!Adjacent(usr)) + return + if(isLivingSSD(src) && M.client && M.client.send_ssd_warning(src)) + return show_inv(usr) /mob/proc/can_use_hands() @@ -1176,12 +1181,11 @@ var/list/slot_equipment_priority = list( \ if(green) if(!no_text) visible_message("[src] vomits up some green goo!","You vomit up some green goo!") - new /obj/effect/decal/cleanable/vomit/green(location) + location.add_vomit_floor(FALSE, TRUE) else if(!no_text) visible_message("[src] pukes all over [p_them()]self!","You puke all over yourself!") - location.add_vomit_floor(src, 1) - playsound(location, 'sound/effects/splat.ogg', 50, 1) + location.add_vomit_floor(TRUE) /mob/proc/AddSpell(obj/effect/proc_holder/spell/S) mob_spell_list += S @@ -1299,6 +1303,7 @@ var/list/slot_equipment_priority = list( \ .["Show player panel"] = "?_src_=vars;mob_player_panel=[UID()]" .["Give Spell"] = "?_src_=vars;give_spell=[UID()]" + .["Give Martial Art"] = "?_src_=vars;givemartialart=[UID()]" .["Give Disease"] = "?_src_=vars;give_disease=[UID()]" .["Toggle Godmode"] = "?_src_=vars;godmode=[UID()]" .["Toggle Build Mode"] = "?_src_=vars;build_mode=[UID()]" diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index aeb6d8f14bf..93eb035b187 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -98,7 +98,7 @@ return verb -/mob/proc/emote(var/act, var/type, var/message) +/mob/proc/emote(act, type, message, force) if(act == "me") return custom_emote(type, message) @@ -184,7 +184,7 @@ var/current = prefix_locations[i] // ["Common", keypos] // There are a few things that will make us want to ignore all other languages in - namely, HIVEMIND languages. - var/datum/language/L = current[1] + var/datum/language/L = current[1] if(L && L.flags & HIVEMIND) . = new /datum/multilingual_say_piece(L, trim(strip_prefixes(message))) break diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index e978a2b4798..75aa563dd86 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -50,7 +50,7 @@ if(!physical) physical = src ..() - processing_objects += src + START_PROCESSING(SSobj, src) all_components = list() idle_threads = list() @@ -64,7 +64,7 @@ all_components.Remove(CH.device_type) qdel(CH) physical = null - processing_objects -= src + STOP_PROCESSING(SSobj, src) return ..() diff --git a/code/modules/modular_computers/computers/item/computer_power.dm b/code/modules/modular_computers/computers/item/computer_power.dm index d43a5f6d00c..0a7955cfe52 100644 --- a/code/modules/modular_computers/computers/item/computer_power.dm +++ b/code/modules/modular_computers/computers/item/computer_power.dm @@ -13,10 +13,10 @@ if(battery_module && battery_module.battery && battery_module.battery.charge) var/obj/item/stock_parts/cell/cell = battery_module.battery - if(cell.use(amount * CELLRATE)) + if(cell.use(amount * GLOB.CELLRATE)) return TRUE else // Discharge the cell anyway. - cell.use(min(amount*CELLRATE, cell.charge)) + cell.use(min(amount*GLOB.CELLRATE, cell.charge)) return FALSE return FALSE diff --git a/code/modules/modular_computers/file_system/programs/command/card.dm b/code/modules/modular_computers/file_system/programs/command/card.dm index 38a42222c63..81d5fb03823 100644 --- a/code/modules/modular_computers/file_system/programs/command/card.dm +++ b/code/modules/modular_computers/file_system/programs/command/card.dm @@ -137,18 +137,17 @@ return 1 return -1 -/datum/computer_file/program/card_mod/proc/format_jobs(list/jobs) +/datum/computer_file/program/card_mod/proc/format_jobs(list/jobs, targetrank, list/jobformats) var/obj/item/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD] if(!card_slot || !card_slot.stored_card) return null - var/obj/item/card/id/id_card = card_slot.stored_card var/list/formatted = list() for(var/job in jobs) formatted.Add(list(list( "display_name" = replacetext(job, " ", " "), - "target_rank" = id_card && id_card.assignment ? id_card.assignment : "Unassigned", - "job" = job))) - + "target_rank" = targetrank, + "job" = job, + "jlinkformat" = jobformats[job] ? jobformats[job] : null))) return formatted @@ -225,11 +224,12 @@ var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,MAX_MESSAGE_LEN)) //let custom jobs function as an impromptu alt title, mainly for sechuds if(temp_t && modify) + SSjobs.log_job_transfer(modify.registered_name, modify.getRankAndAssignment(), temp_t, scan.registered_name) modify.assignment = temp_t log_game("[key_name(usr)] has given \"[modify.registered_name]\" the custom job title \"[temp_t]\".") else var/list/access = list() - if(is_centcom) + if(is_centcom && islist(get_centcom_access(t1))) access = get_centcom_access(t1) else var/datum/job/jobdatum @@ -249,6 +249,16 @@ if(t1 == "Civilian") message_admins("[key_name_admin(usr)] has reassigned \"[modify.registered_name]\" from \"[jobnamedata]\" to \"[t1]\".") + SSjobs.log_job_transfer(modify.registered_name, jobnamedata, t1, scan.registered_name) + SSjobs.slot_job_transfer(modify.rank, t1) + + var/mob/living/carbon/human/H = modify.getPlayer() + if(istype(H)) + if(jobban_isbanned(H, t1)) + message_admins("[ADMIN_FULLMONTY(H)] has been assigned the job [t1], in possible violation of their job ban.") + if(H.mind) + H.mind.playtime_role = t1 + modify.access = access modify.assignment = t1 modify.rank = t1 @@ -271,6 +281,18 @@ if("PRG_mode") mode = text2num(href_list["mode_target"]) + if("PRG_wipe_my_logs") + if(is_authenticated(usr) && is_centcom) + var/delcount = SSjobs.delete_log_records(scan.registered_name, FALSE) + if(delcount) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + + if("PRG_wipe_all_logs") + if(is_authenticated(usr)) + var/delcount = SSjobs.delete_log_records(scan.registered_name, TRUE) + if(delcount) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + if("PRG_print") if(!printing && computer) printing = 1 @@ -312,6 +334,7 @@ var/jobnamedata = modify.getRankAndAssignment() log_game("[key_name(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".") message_admins("[key_name_admin(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".") + SSjobs.log_job_transfer(modify.registered_name, jobnamedata, "Terminated", scan.registered_name) modify.assignment = "Terminated" modify.access = list() callHook("terminate_employee", list(modify)) @@ -398,6 +421,7 @@ data["target_owner"] = modify && modify.registered_name ? modify.registered_name : "-----" data["target_rank"] = get_target_rank() data["scan_name"] = scan ? scan.name : "-----" + data["scan_owner"] = scan && scan.registered_name ? scan.registered_name : null data["authenticated"] = is_authenticated(user) data["has_modify"] = !!modify data["account_number"] = modify ? modify.associated_account_number : null @@ -405,14 +429,17 @@ data["all_centcom_access"] = null data["regions"] = null - data["engineering_jobs"] = format_jobs(engineering_positions) - data["medical_jobs"] = format_jobs(medical_positions) - data["science_jobs"] = format_jobs(science_positions) - data["security_jobs"] = format_jobs(security_positions) - data["support_jobs"] = format_jobs(support_positions) - data["civilian_jobs"] = format_jobs(civilian_positions) - data["special_jobs"] = format_jobs(whitelisted_positions) - data["centcom_jobs"] = format_jobs(get_all_centcom_jobs()) + var/list/job_formats = SSjobs.format_jobs_for_id_computer(modify) + + data["top_jobs"] = format_jobs(list("Captain", "Custom"), data["target_rank"], job_formats) + data["engineering_jobs"] = format_jobs(engineering_positions, data["target_rank"], job_formats) + data["medical_jobs"] = format_jobs(medical_positions, data["target_rank"], job_formats) + data["science_jobs"] = format_jobs(science_positions, data["target_rank"], job_formats) + data["security_jobs"] = format_jobs(security_positions, data["target_rank"], job_formats) + data["support_jobs"] = format_jobs(support_positions, data["target_rank"], job_formats) + data["civilian_jobs"] = format_jobs(civilian_positions, data["target_rank"], job_formats) + data["special_jobs"] = format_jobs(whitelisted_positions, data["target_rank"], job_formats) + data["centcom_jobs"] = format_jobs(get_all_centcom_jobs(), data["target_rank"], job_formats) data["card_skins"] = format_card_skins(get_station_card_skins()) data["job_slots"] = format_job_slots() @@ -423,6 +450,9 @@ data["cooldown_mins"] = mins data["cooldown_secs"] = (seconds < 10) ? "0[seconds]" : seconds + if(mode == 3 && is_authenticated(user)) + data["id_change_html"] = SSjobs.fetch_transfer_record_html(is_centcom) + if(modify) data["current_skin"] = modify.icon_state diff --git a/code/modules/modular_computers/file_system/programs/engineering/alarm.dm b/code/modules/modular_computers/file_system/programs/engineering/alarm.dm index 5fcaf9b03fd..226511e2c09 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/alarm.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/alarm.dm @@ -11,7 +11,7 @@ /datum/computer_file/program/alarm_monitor/New() ..() - alarm_handlers = list(atmosphere_alarm, fire_alarm, power_alarm) + alarm_handlers = list(SSalarms.atmosphere_alarm, SSalarms.fire_alarm, SSalarms.power_alarm) for(var/datum/alarm_handler/AH in alarm_handlers) AH.register(src, /datum/computer_file/program/alarm_monitor/proc/update_icon) diff --git a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm index 2efe872a7f5..783ae9fa947 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm @@ -39,7 +39,7 @@ data["powermonitor"] = attached ? TRUE : FALSE if(attached) - var/datum/powernet/powernet = attached.get_powernet() + var/datum/powernet/powernet = attached.powernet data["poweravail"] = powernet.avail data["powerload"] = powernet.viewload data["powerdemand"] = powernet.load diff --git a/code/modules/modular_computers/hardware/recharger.dm b/code/modules/modular_computers/hardware/recharger.dm index 688d689cf67..418a9736528 100644 --- a/code/modules/modular_computers/hardware/recharger.dm +++ b/code/modules/modular_computers/hardware/recharger.dm @@ -20,7 +20,7 @@ return if(use_power(charge_rate, charging=1)) - holder.give_power(charge_rate * CELLRATE) + holder.give_power(charge_rate * GLOB.CELLRATE) /obj/item/computer_hardware/recharger/APC diff --git a/code/modules/nano/modules/alarm_monitor.dm b/code/modules/nano/modules/alarm_monitor.dm index e4dd848dac6..dc52841a367 100644 --- a/code/modules/nano/modules/alarm_monitor.dm +++ b/code/modules/nano/modules/alarm_monitor.dm @@ -5,15 +5,15 @@ /datum/nano_module/alarm_monitor/all/New() ..() - alarm_handlers = list(atmosphere_alarm, burglar_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) + alarm_handlers = list(SSalarms.atmosphere_alarm, SSalarms.burglar_alarm, SSalarms.camera_alarm, SSalarms.fire_alarm, SSalarms.motion_alarm, SSalarms.power_alarm) /datum/nano_module/alarm_monitor/engineering/New() ..() - alarm_handlers = list(atmosphere_alarm, fire_alarm, power_alarm) + alarm_handlers = list(SSalarms.atmosphere_alarm, SSalarms.fire_alarm, SSalarms.power_alarm) /datum/nano_module/alarm_monitor/security/New() ..() - alarm_handlers = list(burglar_alarm, camera_alarm, motion_alarm) + alarm_handlers = list(SSalarms.burglar_alarm, SSalarms.camera_alarm, SSalarms.motion_alarm) /datum/nano_module/alarm_monitor/proc/register(var/object, var/procName) for(var/datum/alarm_handler/AH in alarm_handlers) diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 87649f97512..1dbdcc05b92 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -506,7 +506,7 @@ nanoui is used to open and update nano browser uis * * @return nothing */ -/datum/nanoui/proc/process(update = 0) +/datum/nanoui/process(update = 0) if(!src_object || !user) close() return diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index e1ae7da26f5..dc16101eac7 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -131,13 +131,13 @@ obj/item/clipboard/proc/penPlacement(mob/user, obj/item/pen/P, placing) else penPlacement(usr, containedpen, FALSE) else if(href_list["remove"]) - var/obj/item/P = locate(href_list["remove"]) + var/obj/item/P = locate(href_list["remove"]) in src if(isPaperwork(P)) usr.put_in_hands(P) to_chat(usr, "You remove [P] from [src].") checkTopPaper() //So we don't accidentally make the top sheet not be on the clipboard else if(href_list["viewOrWrite"]) - var/obj/item/P = locate(href_list["viewOrWrite"]) + var/obj/item/P = locate(href_list["viewOrWrite"]) in src if(!isPaperwork(P)) return if(is_pen(I) && isPaperwork(P) != PHOTO) //Because you can't write on photos that aren't in your hand @@ -148,7 +148,7 @@ obj/item/clipboard/proc/penPlacement(mob/user, obj/item/pen/P, placing) var/obj/item/photo/Ph = P Ph.show(usr) else if(href_list["topPaper"]) - var/obj/item/P = locate(href_list["topPaper"]) + var/obj/item/P = locate(href_list["topPaper"]) in src if(P == toppaper) return to_chat(usr, "You flick the pages so that [P] is on top.") diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index d5ca6b0b0f8..c40cb1667ad 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -108,7 +108,7 @@ /obj/item/paper/attack_self(mob/living/user as mob) user.examinate(src) - if(rigged && (holiday_master.holidays && holiday_master.holidays[APRIL_FOOLS])) + if(rigged && (SSholiday.holidays && SSholiday.holidays[APRIL_FOOLS])) if(spam_flag == 0) spam_flag = 1 playsound(loc, 'sound/items/bikehorn.ogg', 50, 1) @@ -621,11 +621,11 @@ /obj/item/paper/evilfax/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/paper/evilfax/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) if(mytarget && !used) var/mob/living/carbon/target = mytarget target.ForceContractDisease(new /datum/disease/transformation/corgi(0)) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index e8643c97cff..c9169a09757 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -72,7 +72,7 @@ papers.Remove(P) else P = new /obj/item/paper - if(holiday_master.holidays && holiday_master.holidays[APRIL_FOOLS]) + if(SSholiday.holidays && SSholiday.holidays[APRIL_FOOLS]) if(prob(30)) P.info = "HONK HONK HONK HONK HONK HONK HONK
HOOOOOOOOOOOOOOOOOOOOOONK
APRIL FOOLS
" P.rigged = 1 diff --git a/code/modules/pda/mob_hunt_game_app.dm b/code/modules/pda/mob_hunt_game_app.dm index c08e64b7ae3..2bb28ba0264 100644 --- a/code/modules/pda/mob_hunt_game_app.dm +++ b/code/modules/pda/mob_hunt_game_app.dm @@ -21,12 +21,12 @@ /datum/data/pda/app/mob_hunter_game/start() ..() - processing_objects.Add(pda) + START_PROCESSING(SSobj, pda) /datum/data/pda/app/mob_hunter_game/stop() ..() disconnect("Program Terminated") - processing_objects.Remove(pda) + STOP_PROCESSING(SSobj, pda) /datum/data/pda/app/mob_hunter_game/proc/scan_nearby() if(!SSmob_hunt || !connected) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index e8aab46dbbe..a3186b115a4 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -46,7 +46,6 @@ name = "area power controller" desc = "A control terminal for the area electrical systems." icon_state = "apc0" - anchored = 1 use_power = NO_POWER_USE req_access = list(access_engine_equip) siemens_strength = 1 @@ -55,7 +54,7 @@ var/areastring = null var/obj/item/stock_parts/cell/cell var/start_charge = 90 // initial cell charge % - var/cell_type = 2500 + var/cell_type = 2500 //Base cell has 2500 capacity. Enter the path of a different cell you want to use. cell determines charge rates, max capacity, ect. These can also be changed with other APC vars, but isn't recommended to minimize the risk of accidental usage of dirty editted APCs var/opened = 0 //0=closed, 1=opened, 2=cover removed var/shorted = 0 var/lighting = 3 @@ -137,40 +136,35 @@ /obj/machinery/power/apc/connect_to_network() //Override because the APC does not directly connect to the network; it goes through a terminal. //The terminal is what the power computer looks for anyway. - if(!terminal) - make_terminal() if(terminal) terminal.connect_to_network() -/obj/machinery/power/apc/New(turf/loc, var/ndir, var/building=0) +/obj/machinery/power/apc/New(turf/loc, ndir, building = 0) if(!armor) armor = list(melee = 20, bullet = 20, laser = 10, energy = 100, bomb = 30, bio = 100, rad = 100) ..() GLOB.apcs += src GLOB.apcs = sortAtom(GLOB.apcs) - wires = new(src) + wires = new(src) // offset 24 pixels in direction of dir // this allows the APC to be embedded in a wall, yet still inside an area if(building) - dir = ndir - src.tdir = dir // to fix Vars bug - dir = SOUTH + setDir(ndir) + tdir = dir // to fix Vars bug + setDir(SOUTH) pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 24 : -24) pixel_y = (src.tdir & 3)? (src.tdir ==1 ? 24 : -24) : 0 - if(building==0) - init() - else + if(building) area = get_area(src) area.apc |= src opened = 1 operating = 0 name = "[area.name] APC" stat |= MAINT - src.update_icon() - spawn(5) - src.update() + update_icon() + addtimer(CALLBACK(src, .proc/update), 5) /obj/machinery/power/apc/Destroy() GLOB.apcs -= src @@ -193,14 +187,17 @@ // create a terminal object at the same position as original turf loc // wires will attach to this terminal = new/obj/machinery/power/terminal(src.loc) - terminal.dir = tdir + terminal.setDir(tdir) terminal.master = src -/obj/machinery/power/apc/proc/init() +/obj/machinery/power/apc/Initialize(mapload) + . = ..() + if(!mapload) + return has_electronics = 2 //installed and secured // is starting with a power cell installed, create it and set its charge level if(cell_type) - src.cell = new/obj/item/stock_parts/cell(src) + cell = new/obj/item/stock_parts/cell(src) cell.maxcharge = cell_type // cell_type is maximum charge (old default was 1000 or 2500 (values one and two respectively) cell.charge = start_charge * cell.maxcharge / 100 // (convert percentage to actual value) @@ -219,12 +216,12 @@ area = get_area_name(areastring) name = "\improper [area.name] APC" area.apc |= src + update_icon() make_terminal() - spawn(5) - src.update() + addtimer(CALLBACK(src, .proc/update), 5) /obj/machinery/power/apc/examine(mob/user) if(..(user, 1)) @@ -1084,14 +1081,9 @@ else return 0 -//Returns 1 if the APC should attempt to charge -/obj/machinery/power/apc/proc/attempt_charging() - return (chargemode && charging == 1 && operating) - -/obj/machinery/power/apc/draw_power(var/amount) +/obj/machinery/power/apc/add_load(amount) if(terminal && terminal.powernet) - return terminal.powernet.draw_power(amount) - return 0 + terminal.add_load(amount) /obj/machinery/power/apc/avail() if(terminal) @@ -1100,7 +1092,6 @@ return 0 /obj/machinery/power/apc/process() - if(stat & (BROKEN|MAINT)) return if(!area.requires_power) @@ -1136,18 +1127,21 @@ if(cell && !shorted) // draw power from cell as before to power the area - var/cellused = min(cell.charge, CELLRATE * lastused_total) // clamp deduction to a max, amount left in cell + var/cellused = min(cell.charge, GLOB.CELLRATE * lastused_total) // clamp deduction to a max, amount left in cell cell.use(cellused) if(excess > lastused_total) // if power excess recharge the cell // by the same amount just used - var/draw = draw_power(cellused/CELLRATE) // draw the power needed to charge this cell - cell.give(draw * CELLRATE) + cell.give(cellused) + add_load(cellused/GLOB.CELLRATE) // add the load used to recharge the cell + + else // no excess, and not enough per-apc - if( (cell.charge/CELLRATE + excess) >= lastused_total) // can we draw enough from cell+grid to cover last usage? - var/draw = draw_power(excess) - cell.charge = min(cell.maxcharge, cell.charge + CELLRATE * draw) //recharge with what we can + if((cell.charge/GLOB.CELLRATE + excess) >= lastused_total) // can we draw enough from cell+grid to cover last usage? + cell.charge = min(cell.maxcharge, cell.charge + GLOB.CELLRATE * excess) //recharge with what we can + add_load(excess) // so draw what we can from the grid charging = 0 + else // not enough power available to run the last tick! charging = 0 chargecount = 0 @@ -1173,14 +1167,14 @@ environ = autoset(environ, 1) autoflag = 3 if(report_power_alarm) - power_alarm.clearAlarm(loc, src) + SSalarms.power_alarm.clearAlarm(loc, src) else if(cell.charge < 1250 && cell.charge > 750 && longtermpower < 0) // <30%, turn off equipment if(autoflag != 2) equipment = autoset(equipment, 2) lighting = autoset(lighting, 1) environ = autoset(environ, 1) if(report_power_alarm) - power_alarm.triggerAlarm(loc, src) + SSalarms.power_alarm.triggerAlarm(loc, src) autoflag = 2 else if(cell.charge < 750 && cell.charge > 10) // <15%, turn off lighting & equipment if((autoflag > 1 && longtermpower < 0) || (autoflag > 1 && longtermpower >= 0)) @@ -1188,7 +1182,7 @@ lighting = autoset(lighting, 2) environ = autoset(environ, 1) if(report_power_alarm) - power_alarm.triggerAlarm(loc, src) + SSalarms.power_alarm.triggerAlarm(loc, src) autoflag = 1 else if(cell.charge <= 0) // zero charge, turn all off if(autoflag != 0) @@ -1196,18 +1190,16 @@ lighting = autoset(lighting, 0) environ = autoset(environ, 0) if(report_power_alarm) - power_alarm.triggerAlarm(loc, src) + SSalarms.power_alarm.triggerAlarm(loc, src) autoflag = 0 // now trickle-charge the cell - - if(src.attempt_charging()) + if(chargemode && charging == 1 && operating) if(excess > 0) // check to make sure we have enough to charge // Max charge is capped to % per second constant - var/ch = min(excess*CELLRATE, cell.maxcharge*CHARGELEVEL) - - ch = draw_power(ch/CELLRATE) // Removes the power we're taking from the grid - cell.give(ch*CELLRATE) // actually recharge the cell + var/ch = min(excess*GLOB.CELLRATE, cell.maxcharge*GLOB.CHARGELEVEL) + add_load(ch/GLOB.CELLRATE) // Removes the power we're taking from the grid + cell.give(ch) // actually recharge the cell else charging = 0 // stop charging @@ -1220,12 +1212,12 @@ if(chargemode) if(!charging) - if(excess > cell.maxcharge*CHARGELEVEL) + if(excess > cell.maxcharge*GLOB.CHARGELEVEL) chargecount++ else chargecount = 0 - if(chargecount >= 10) + if(chargecount == 10) chargecount = 0 charging = 1 @@ -1254,7 +1246,7 @@ lighting = autoset(lighting, 0) environ = autoset(environ, 0) if(report_power_alarm) - power_alarm.triggerAlarm(loc, src) + SSalarms.power_alarm.triggerAlarm(loc, src) autoflag = 0 // update icon & area power if anything changed @@ -1292,9 +1284,13 @@ lighting = 0 equipment = 0 environ = 0 + update_icon() + update() spawn(600) equipment = 3 environ = 3 + update_icon() + update() ..() /obj/machinery/power/apc/ex_act(severity) @@ -1353,6 +1349,11 @@ L.broken(0, 1) stoplag() +/obj/machinery/power/apc/proc/null_charge() + for(var/obj/machinery/light/L in area) + L.broken(0, 1) + stoplag() + /obj/machinery/power/apc/proc/setsubsystem(val) if(cell && cell.charge > 0) return (val==1) ? 0 : val diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index c71bc3e7c8c..5cf1d5efbe3 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -59,21 +59,18 @@ By design, d1 is the smallest direction and d2 is the highest /obj/structure/cable/white color = COLOR_WHITE -/obj/structure/cable/New() - ..() - +/obj/structure/cable/Initialize(mapload) + . = ..() // ensure d1 & d2 reflect the icon_state for entering and exiting cable var/dash = findtext(icon_state, "-") + d1 = text2num(copytext( icon_state, 1, dash )) + d2 = text2num(copytext( icon_state, dash+1 )) - d1 = text2num( copytext( icon_state, 1, dash ) ) - - d2 = text2num( copytext( icon_state, dash+1 ) ) - - var/turf/T = src.loc // hide if turf is not intact - - if(level==1) hide(T.intact) + var/turf/T = get_turf(src) // hide if turf is not intact + if(level == 1) + hide(T.intact) LAZYADD(GLOB.cable_list, src) //add it to the global cable list @@ -83,14 +80,23 @@ By design, d1 is the smallest direction and d2 is the highest LAZYREMOVE(GLOB.cable_list, src) //remove it from global cable list return ..() // then go ahead and delete the cable + +/obj/structure/cable/deconstruct(disassembled = TRUE) + var/turf/T = get_turf(src) + if(d1) // 0-X cables are 1 unit, X-X cables are 2 units long + new/obj/item/stack/cable_coil(T, 2, paramcolor = color) + else + new/obj/item/stack/cable_coil(T, 1, paramcolor = color) + qdel(src) + /////////////////////////////////// // General procedures /////////////////////////////////// //If underfloor, hide the cable -/obj/structure/cable/hide(var/i) +/obj/structure/cable/hide(i) - if(level == 1 && istype(loc, /turf)) + if(level == 1 && isturf(loc)) invisibility = i ? 101 : 0 updateicon() @@ -101,9 +107,49 @@ By design, d1 is the smallest direction and d2 is the highest icon_state = "[d1]-[d2]" -// returns the powernet this cable belongs to -/obj/structure/cable/proc/get_powernet() //TODO: remove this as it is obsolete - return powernet +//////////////////////////////////////////// +// Power related +/////////////////////////////////////////// + +// All power generation handled in add_avail() +// Machines should use add_load(), surplus(), avail() +// Non-machines should use add_delayedload(), delayed_surplus(), newavail() + +/obj/structure/cable/proc/add_avail(amount) + if(powernet) + powernet.newavail += amount + +/obj/structure/cable/proc/add_load(amount) + if(powernet) + powernet.load += amount + +/obj/structure/cable/proc/surplus() + if(powernet) + return Clamp(powernet.avail-powernet.load, 0, powernet.avail) + else + return 0 + +/obj/structure/cable/proc/avail() + if(powernet) + return powernet.avail + else + return 0 + +/obj/structure/cable/proc/add_delayedload(amount) + if(powernet) + powernet.delayedload += amount + +/obj/structure/cable/proc/delayed_surplus() + if(powernet) + return Clamp(powernet.newavail - powernet.delayedload, 0, powernet.newavail) + else + return 0 + +/obj/structure/cable/proc/newavail() + if(powernet) + return powernet.newavail + else + return 0 //Telekinesis has no effect on a cable /obj/structure/cable/attack_tk(mob/user) @@ -120,47 +166,19 @@ By design, d1 is the smallest direction and d2 is the highest if(T.intact) return - if(istype(W, /obj/item/wirecutters)) -///// Z-Level Stuff - /* if(src.d1 == 12 || src.d2 == 12) - to_chat(user, "You must cut this cable from above.") - return */ -///// Z-Level Stuff - /* if(breaker_box) - to_chat(user, "This cable is connected to nearby breaker box. Use breaker box to interact with it.") - return */ - + if(iswirecutter(W)) if(shock(user, 50)) return - - if(src.d1) // 0-X cables are 1 unit, X-X cables are 2 units long - new/obj/item/stack/cable_coil(T, 2, paramcolor = color) - else - new/obj/item/stack/cable_coil(T, 1, paramcolor = color) - - for(var/mob/O in viewers(src, null)) - O.show_message("[user] cuts the cable.", 1) - -///// Z-Level Stuff - /*if(src.d1 == 11 || src.d2 == 11) - var/turf/controllerlocation = locate(1, 1, z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.down) - var/turf/below = locate(src.x, src.y, controller.down_target) - for(var/obj/structure/cable/c in below) - if(c.d1 == 12 || c.d2 == 12) - c.qdel()*/ -///// Z-Level Stuff + user.visible_message("[user] cuts the cable.", "You cut the cable.") investigate_log("was cut by [key_name(usr, 1)] in [get_area(user)]([T.x], [T.y], [T.z] - [ADMIN_JMP(T)])","wires") - - qdel(src) // qdel + deconstruct() return else if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil = W if(coil.get_amount() < 1) - to_chat(user, "Not enough cable") + to_chat(user, "Not enough cable!") return coil.cable_join(src, user) @@ -173,11 +191,9 @@ By design, d1 is the smallest direction and d2 is the highest else if(istype(W, /obj/item/multitool)) if(powernet && (powernet.avail > 0)) // is it powered? - to_chat(user, "[powernet.avail]W in power network.") - + to_chat(user, "Total power: [DisplayPower(powernet.avail)]\nLoad: [DisplayPower(powernet.load)]\nExcess power: [DisplayPower(surplus())]") else - to_chat(user, "The cable is not powered.") - + to_chat(user, "The cable is not powered.") shock(user, 5, 0.2) else if(istype(W, /obj/item/toy/crayon)) @@ -188,7 +204,7 @@ By design, d1 is the smallest direction and d2 is the highest if(W.flags & CONDUCT) shock(user, 50, 0.7) - src.add_fingerprint(user) + add_fingerprint(user) // shock the user with probability prb /obj/structure/cable/proc/shock(mob/user, prb, siemens_coeff = 1) @@ -200,21 +216,22 @@ By design, d1 is the smallest direction and d2 is the highest else return FALSE +/obj/structure/cable/singularity_pull(S, current_size) + ..() + if(current_size >= STAGE_FIVE) + deconstruct() + //explosion handling /obj/structure/cable/ex_act(severity) switch(severity) - if(1.0) + if(1) qdel(src) // qdel - if(2.0) + if(2) if(prob(50)) - new/obj/item/stack/cable_coil(get_turf(src), src.d1 ? 2 : 1, paramcolor = color) - qdel(src) // qdel - - if(3.0) + deconstruct() + if(3) if(prob(25)) - new/obj/item/stack/cable_coil(get_turf(src), src.d1 ? 2 : 1, paramcolor = color) - qdel(src) // qdel - return + deconstruct() obj/structure/cable/proc/cable_color(var/colorC) if(colorC) @@ -235,7 +252,7 @@ obj/structure/cable/proc/cable_color(var/colorC) //handles merging diagonally matching cables //for info : direction^3 is flipping horizontally, direction^12 is flipping vertically -/obj/structure/cable/proc/mergeDiagonalsNetworks(var/direction) +/obj/structure/cable/proc/mergeDiagonalsNetworks(direction) //search for and merge diagonally matching cables from the first direction component (north/south) var/turf/T = get_step(src, direction&3)//go north/south @@ -279,7 +296,7 @@ obj/structure/cable/proc/cable_color(var/colorC) C.powernet.add_cable(src) //else, we simply connect to the matching cable powernet // merge with the powernets of power objects in the given direction -/obj/structure/cable/proc/mergeConnectedNetworks(var/direction) +/obj/structure/cable/proc/mergeConnectedNetworks(direction) var/fdir = (!direction)? 0 : turn(direction, 180) //flip the direction, to match with the source position on its turf @@ -317,25 +334,27 @@ obj/structure/cable/proc/cable_color(var/colorC) //first let's add turf cables to our powernet //then we'll connect machines on turf with a node cable is present for(var/AM in loc) - if(istype(AM,/obj/structure/cable)) + if(istype(AM, /obj/structure/cable)) var/obj/structure/cable/C = AM if(C.d1 == d1 || C.d2 == d1 || C.d1 == d2 || C.d2 == d2) //only connected if they have a common direction - if(C.powernet == powernet) continue + if(C.powernet == powernet) + continue if(C.powernet) merge_powernets(powernet, C.powernet) else powernet.add_cable(C) //the cable was powernetless, let's just add it to our powernet - else if(istype(AM,/obj/machinery/power/apc)) + else if(istype(AM, /obj/machinery/power/apc)) var/obj/machinery/power/apc/N = AM - if(!N.terminal) continue // APC are connected through their terminal + if(!N.terminal) + continue // APC are connected through their terminal if(N.terminal.powernet == powernet) continue to_connect += N.terminal //we'll connect the machines after all cables are merged - else if(istype(AM,/obj/machinery/power)) //other power machines + else if(istype(AM, /obj/machinery/power)) //other power machines var/obj/machinery/power/M = AM if(M.powernet == powernet) @@ -353,23 +372,10 @@ obj/structure/cable/proc/cable_color(var/colorC) ////////////////////////////////////////////// //if powernetless_only = 1, will only get connections without powernet -/obj/structure/cable/proc/get_connections(var/powernetless_only = 0) +/obj/structure/cable/proc/get_connections(powernetless_only = 0) . = list() // this will be a list of all connected power objects var/turf/T -///// Z-Level Stuff - /* if(d1 == 11 || d1 == 12) - var/turf/controllerlocation = locate(1, 1, z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.up && d1 == 12) - T = locate(src.x, src.y, controller.up_target) - if(T) - . += power_list(T, src, 11, 1) - if(controller.down && d1 == 11) - T = locate(src.x, src.y, controller.down_target) - if(T) - . += power_list(T, src, 12, 1) */ -///// Z-Level Stuff //get matching cables from the first direction if(d1) //if not a node cable T = get_step(src, d1) @@ -386,20 +392,6 @@ obj/structure/cable/proc/cable_color(var/colorC) . += power_list(loc, src, d1, powernetless_only) //get on turf matching cables -///// Z-Level Stuff - /*if(d2 == 11 || d2 == 12) - var/turf/controllerlocation = locate(1, 1, z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.up && d2 == 12) - T = locate(src.x, src.y, controller.up_target) - if(T) - . += power_list(T, src, 11, 1) - if(controller.down && d2 == 11) - T = locate(src.x, src.y, controller.down_target) - if(T) - . += power_list(T, src, 12, 1) -///// Z-Level Stuff - else */ //do the same on the second direction (which can't be 0) T = get_step(src, d2) if(T) @@ -420,7 +412,8 @@ obj/structure/cable/proc/cable_color(var/colorC) //needed as this can, unlike other placements, disconnect cables /obj/structure/cable/proc/denode() var/turf/T1 = loc - if(!T1) return + if(!T1) + return var/list/powerlist = power_list(T1,src,0,0) //find the other cables that ended in the centre of the turf, with or without a powernet if(powerlist.len>0) @@ -428,13 +421,19 @@ obj/structure/cable/proc/cable_color(var/colorC) propagate_network(powerlist[1],PN) //propagates the new powernet beginning at the source cable if(PN.is_empty()) //can happen with machines made nodeless when smoothing cables - qdel(PN) // qdel + qdel(PN) + +/obj/structure/cable/proc/auto_propogate_cut_cable(obj/O) + if(O && !QDELETED(O)) + var/datum/powernet/newPN = new()// creates a new powernet... + propagate_network(O, newPN)//... and propagates it to the other side of the cable // cut the cable's powernet at this cable and updates the powergrid -/obj/structure/cable/proc/cut_cable_from_powernet() +/obj/structure/cable/proc/cut_cable_from_powernet(remove=TRUE) var/turf/T1 = loc var/list/P_list - if(!T1) return + if(!T1) + return if(d1) T1 = get_step(T1, d1) P_list = power_list(T1, src, turn(d1,180),0,cable_only = 1) // what adjacently joins on to cut cable... @@ -452,11 +451,13 @@ obj/structure/cable/proc/cable_color(var/colorC) var/obj/O = P_list[1] // remove the cut cable from its turf and powernet, so that it doesn't get count in propagate_network worklist - loc = null + if(remove) + loc = null powernet.remove_cable(src) //remove the cut cable from its powernet // queue it to rebuild SSmachines.deferred_powernet_rebuilds += O +// addtimer(CALLBACK(O, .proc/auto_propogate_cut_cable, O), 0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables // Disconnect machines connected to nodes if(d1 == 0) // if we cut a node (O-X) cable @@ -464,6 +465,7 @@ obj/structure/cable/proc/cable_color(var/colorC) if(!P.connect_to_network()) //can't find a node cable on a the turf to connect to P.disconnect_from_network() //remove from current network + /////////////////////////////////////////////// // The cable coil object, used for laying cable /////////////////////////////////////////////// @@ -472,9 +474,7 @@ obj/structure/cable/proc/cable_color(var/colorC) // Definitions //////////////////////////////// -var/global/list/datum/stack_recipe/cable_coil_recipes = list( - new /datum/stack_recipe/cable_restraints("cable restraints", /obj/item/restraints/handcuffs/cable, 15), -) +GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restraints", /obj/item/restraints/handcuffs/cable, 15))) /obj/item/stack/cable_coil name = "cable coil" @@ -514,7 +514,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( pixel_x = rand(-2,2) pixel_y = rand(-2,2) update_icon() - recipes = cable_coil_recipes + recipes = GLOB.cable_coil_recipes update_wclass() /////////////////////////////////// @@ -657,7 +657,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( to_chat(user, "You can't lay cable at a place that far away!") return - var/dirn = null + var/dirn if(!dirnew) //If we weren't given a direction, come up with one! (Called as null from catwalk.dm and floor.dm) if(user.loc == T) dirn = user.dir //If laying on the tile we're on, lay in the direction we're facing @@ -694,7 +694,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( if(C.shock(user, 50)) if(prob(50)) //fail new /obj/item/stack/cable_coil(get_turf(C), 1, paramcolor = C.color) - qdel(C) // qdel + C.deconstruct() return C @@ -711,7 +711,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( return if(get_dist(C, user) > 1) // make sure it's close enough - to_chat(user, "You can't lay cable at a place that far away.") + to_chat(user, "You can't lay cable at a place that far away!") return @@ -724,13 +724,41 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( // one end of the clicked cable is pointing towards us if(C.d1 == dirn || C.d2 == dirn) if(U.intact) // can't place a cable if the floor is complete - to_chat(user, "You can't lay cable there unless the floor tiles are removed.") + to_chat(user, "You can't lay cable there unless the floor tiles are removed!") return else // cable is pointing at us, we're standing on an open tile // so create a stub pointing at the clicked cable on our tile - place_turf(U, user, turn(dirn, 180)) + var/fdirn = turn(dirn, 180) // the opposite direction + + for(var/obj/structure/cable/LC in U) // check to make sure there's not a cable there already + if(LC.d1 == fdirn || LC.d2 == fdirn) + to_chat(user, "There's already a cable at that position!") + return + + var/obj/structure/cable/NC = get_new_cable (U) + + NC.d1 = 0 + NC.d2 = fdirn + NC.add_fingerprint(user) + NC.update_icon() + + //create a new powernet with the cable, if needed it will be merged later + var/datum/powernet/newPN = new() + newPN.add_cable(NC) + + NC.mergeConnectedNetworks(NC.d2) //merge the powernet with adjacents powernets + NC.mergeConnectedNetworksOnTurf() //merge the powernet with on turf powernets + + if(NC.d2 & (NC.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions + NC.mergeDiagonalsNetworks(NC.d2) + + use(1) + + if(NC.shock(user, 50)) + if(prob(50)) //fail + NC.deconstruct() return // exisiting cable doesn't point at our position, so see if it's a stub @@ -749,7 +777,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( if(LC == C) // skip the cable we're interacting with continue if((LC.d1 == nd1 && LC.d2 == nd2) || (LC.d1 == nd2 && LC.d2 == nd1) ) // make sure no cable matches either direction - to_chat(user, "There's already a cable at that position.") + to_chat(user, "There's already a cable at that position!") return @@ -776,8 +804,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( if(C.shock(user, 50)) if(prob(50)) //fail - new/obj/item/stack/cable_coil(get_turf(C), 2, paramcolor = C.color) - qdel(C) // qdel + C.deconstruct() return C.denode()// this call may have disconnected some cables that terminated on the centre of the turf, if so split the powernets. @@ -790,8 +817,8 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( /obj/item/stack/cable_coil/cut item_state = "coil2" -/obj/item/stack/cable_coil/cut/New(loc) - ..() +/obj/item/stack/cable_coil/cut/Initialize(mapload) + . = ..() src.amount = rand(1,2) pixel_x = rand(-2,2) pixel_y = rand(-2,2) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index dfe10113f12..4719ff75261 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -21,23 +21,23 @@ /obj/item/stock_parts/cell/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) charge = maxcharge if(ratingdesc) desc += " This one has a power rating of [DisplayPower(maxcharge)], and you should not swallow it." update_icon() /obj/item/stock_parts/cell/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/stock_parts/cell/vv_edit_var(var_name, var_value) switch(var_name) if("self_recharge") if(var_value) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) . = ..() /obj/item/stock_parts/cell/process() diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 3a453ffe10c..8b5f64e94fb 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -85,8 +85,8 @@ var/const/GRAV_NEEDS_WRENCH = 3 // Generator which spawns with the station. // -/obj/machinery/gravity_generator/main/station/Initialize() - ..() +/obj/machinery/gravity_generator/main/station/Initialize(mapload) + . = ..() setup_parts() middle.overlays += "activated" update_list() diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 3e5d614896e..33741d1475b 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -9,7 +9,7 @@ /obj/machinery/power name = null icon = 'icons/obj/power.dmi' - anchored = 1.0 + anchored = TRUE on_blueprints = TRUE var/datum/powernet/powernet = null use_power = NO_POWER_USE @@ -25,18 +25,24 @@ ////////////////////////////// // common helper procs for all power machines -/obj/machinery/power/proc/add_avail(var/amount) +// All power generation handled in add_avail() +// Machines should use add_load(), surplus(), avail() +// Non-machines should use add_delayedload(), delayed_surplus(), newavail() + +/obj/machinery/power/proc/add_avail(amount) if(powernet) powernet.newavail += amount + return TRUE + else + return FALSE -/obj/machinery/power/proc/draw_power(var/amount) +/obj/machinery/power/proc/add_load(amount) if(powernet) - return powernet.draw_power(amount) - return 0 + powernet.load += amount /obj/machinery/power/proc/surplus() if(powernet) - return powernet.avail-powernet.load + return Clamp(powernet.avail-powernet.load, 0, powernet.avail) else return 0 @@ -46,9 +52,19 @@ else return 0 -/obj/machinery/power/proc/load() +/obj/machinery/power/proc/add_delayedload(amount) if(powernet) - return powernet.load + powernet.delayedload += amount + +/obj/machinery/power/proc/delayed_surplus() + if(powernet) + return Clamp(powernet.newavail - powernet.delayedload, 0, powernet.newavail) + else + return 0 + +/obj/machinery/power/proc/newavail() + if(powernet) + return powernet.newavail else return 0 @@ -58,21 +74,20 @@ // returns true if the area has power on given channel (or doesn't require power). // defaults to power_channel /obj/machinery/proc/powered(var/chan = -1) // defaults to power_channel - if(!loc) - return 0 + return FALSE if(!use_power) - return 1 + return TRUE var/area/A = get_area(src) // make sure it's in an area if(!A) - return 0 // if not, then not powered + return FALSE // if not, then not powered if(chan == -1) chan = power_channel return A.powered(chan) // return power status of the area // increment the power usage stats for an area -/obj/machinery/proc/use_power(var/amount, var/chan = -1) // defaults to power_channel +/obj/machinery/proc/use_power(amount, chan = -1) // defaults to power_channel var/area/A = get_area(src) // make sure it's in an area if(!A) return @@ -103,43 +118,36 @@ /obj/machinery/power/proc/connect_to_network() var/turf/T = src.loc if(!T || !istype(T)) - return 0 + return FALSE var/obj/structure/cable/C = T.get_cable_node() //check if we have a node cable on the machine turf, the first found is picked if(!C || !C.powernet) - return 0 + return FALSE C.powernet.add_machine(src) - return 1 + return TRUE // remove and disconnect the machine from its current powernet /obj/machinery/power/proc/disconnect_from_network() if(!powernet) - return 0 + return FALSE powernet.remove_machine(src) - return 1 + return TRUE // attach a wire to a power machine - leads from the turf you are standing on //almost never called, overwritten by all power machines but terminal and generator -/obj/machinery/power/attackby(obj/item/W, mob/user) - - if(istype(W, /obj/item/stack/cable_coil)) - - var/obj/item/stack/cable_coil/coil = W - +/obj/machinery/power/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/coil = I var/turf/T = user.loc - - if(T.intact || !istype(T, /turf/simulated/floor)) + if(T.intact || !isfloorturf(T)) return - if(get_dist(src, user) > 1) return - coil.place_turf(T, user) - return else - ..() - return + return ..() + /////////////////////////////////////////// // Powernet handling helpers @@ -159,7 +167,8 @@ cdir = get_dir(T,loc) for(var/obj/structure/cable/C in T) - if(C.powernet) continue + if(C.powernet) + continue if(C.d1 == cdir || C.d2 == cdir) . += C return . @@ -186,7 +195,8 @@ /obj/machinery/power/proc/get_indirect_connections() . = list() for(var/obj/structure/cable/C in loc) - if(C.powernet) continue + if(C.powernet) + continue if(C.d1 == 0) // the cable is a node cable . += C return . @@ -199,44 +209,32 @@ // returns a list of all power-related objects (nodes, cable, junctions) in turf, // excluding source, that match the direction d // if unmarked==1, only return those with no powernet -/proc/power_list(var/turf/T, var/source, var/d, var/unmarked=0, var/cable_only = 0) +/proc/power_list(turf/T, source, d, unmarked=0, cable_only = 0) . = list() - var/fdir = (!d)? 0 : turn(d, 180) // the opposite direction to d (or 0 if d==0) -///// Z-Level Stuff - var/Zdir - if(d==11) - Zdir = 11 - else if(d==12) - Zdir = 12 - else - Zdir = 999 -///// Z-Level Stuff - for(var/AM in T) - if(AM == source) continue //we don't want to return source - if(!cable_only && istype(AM,/obj/machinery/power)) + for(var/AM in T) + if(AM == source) + continue //we don't want to return source + + if(!cable_only && istype(AM, /obj/machinery/power)) var/obj/machinery/power/P = AM - if(P.powernet == 0) continue // exclude APCs which have powernet=0 + if(P.powernet == 0) + continue // exclude APCs which have powernet=0 if(!unmarked || !P.powernet) //if unmarked=1 we only return things with no powernet if(d == 0) . += P - else if(istype(AM,/obj/structure/cable)) + else if(istype(AM, /obj/structure/cable)) var/obj/structure/cable/C = AM if(!unmarked || !C.powernet) -///// Z-Level Stuff - if(C.d1 == fdir || C.d2 == fdir || C.d1 == Zdir || C.d2 == Zdir) -///// Z-Level Stuff - . += C - else if(C.d1 == d || C.d2 == d) + if(C.d1 == d || C.d2 == d) . += C return . //remove the old powernet and replace it with a new one throughout the network. -/proc/propagate_network(var/obj/O, var/datum/powernet/PN) - //log_world("propagating new network") +/proc/propagate_network(obj/O, datum/powernet/PN) var/list/worklist = list() var/list/found_machines = list() var/index = 1 @@ -248,13 +246,13 @@ P = worklist[index] //get the next power object found index++ - if( istype(P,/obj/structure/cable)) + if(istype(P, /obj/structure/cable)) var/obj/structure/cable/C = P if(C.powernet != PN) //add it to the powernet, if it isn't already there PN.add_cable(C) worklist |= C.get_connections() //get adjacents power objects, with or without a powernet - else if(P.anchored && istype(P,/obj/machinery/power)) + else if(P.anchored && istype(P, /obj/machinery/power)) var/obj/machinery/power/M = P found_machines |= M //we wait until the powernet is fully propagates to connect the machines @@ -268,7 +266,7 @@ //Merge two powernets, the bigger (in cable length term) absorbing the other -/proc/merge_powernets(var/datum/powernet/net1, var/datum/powernet/net2) +/proc/merge_powernets(datum/powernet/net1, datum/powernet/net2) if(!net1 || !net2) //if one of the powernet doesn't exist, return return @@ -285,8 +283,6 @@ for(var/obj/structure/cable/Cable in net2.cables) //merge cables net1.add_cable(Cable) - if(!net2) return net1 - for(var/obj/machinery/power/Node in net2.nodes) //merge power machines if(!Node.connect_to_network()) Node.disconnect_from_network() //if somehow we can't connect the machine to the new powernet, disconnect it from the old nonetheless @@ -299,14 +295,12 @@ //source is an object caused electrocuting (airlock, grille, etc) //No animations will be performed by this proc. /proc/electrocute_mob(mob/living/M, power_source, obj/source, siemens_coeff = 1, dist_check = FALSE) - if(!istype(M)) - return FALSE - if(istype(M.loc,/obj/mecha)) + if(!M || ismecha(M.loc)) return FALSE //feckin mechs are dumb if(dist_check) if(!in_range(source, M)) return FALSE - if(istype(M,/mob/living/carbon/human)) + if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.gloves) var/obj/item/clothing/gloves/G = H.gloves @@ -326,7 +320,7 @@ if(istype(power_source, /datum/powernet)) PN = power_source - else if(istype(power_source,/obj/item/stock_parts/cell)) + else if(istype(power_source, /obj/item/stock_parts/cell)) cell = power_source else if(istype(power_source, /obj/machinery/power/apc)) var/obj/machinery/power/apc/apc = power_source @@ -357,10 +351,30 @@ var/drained_energy = drained_hp*20 if(source_area) - source_area.use_power(drained_energy/CELLRATE) - else if(istype(power_source,/datum/powernet)) - var/drained_power = drained_energy/CELLRATE //convert from "joules" to "watts" - drained_power = PN.draw_power(drained_power) - else if(istype(power_source, /obj/item/stock_parts/cell)) + source_area.use_power(drained_energy/GLOB.CELLRATE) + else if(istype(power_source, /datum/powernet)) + var/drained_power = drained_energy/GLOB.CELLRATE //convert from "joules" to "watts" + PN.delayedload += (min(drained_power, max(PN.newavail - PN.delayedload, 0))) + else if (istype(power_source, /obj/item/stock_parts/cell)) cell.use(drained_energy) return drained_energy + +//////////////////////////////////////////////// +// Misc. +/////////////////////////////////////////////// + + +// return a knot cable (O-X) if one is present in the turf +// null if there's none +/turf/proc/get_cable_node() + if(!can_have_cabling()) + return null + for(var/obj/structure/cable/C in src) + if(C.d1 == 0) + return C + return null + +/area/proc/get_apc() + for(var/obj/machinery/power/apc/APC in GLOB.apcs) + if(APC.area == src) + return APC \ No newline at end of file diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index 228b4232968..b64481b1104 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -1,19 +1,19 @@ +//////////////////////////////////////////// +// POWERNET DATUM +// each contiguous network of cables & nodes +///////////////////////////////////// /datum/powernet + var/number // unique id var/list/cables = list() // all cables & junctions var/list/nodes = list() // all connected machines var/load = 0 // the current load on the powernet, increased by each machine at processing var/newavail = 0 // what available power was gathered last tick, then becomes... var/avail = 0 //...the current available power in the powernet + var/viewavail = 0 // the available power as it appears on the power console (gradually updated) var/viewload = 0 // the load as it appears on the power console (gradually updated) - var/number = 0 // Unused //TODEL - - var/perapc = 0 // per-apc avilability - var/perapc_excess = 0 - var/netexcess = 0 // excess power on the powernet (typically avail-load) - - var/problem = 0 // If either of these is set to 1 there is some sort of issue at the powernet. - + var/netexcess = 0 // excess power on the powernet (typically avail-load)/////// + var/delayedload = 0 // load applied to powernet between power ticks. /datum/powernet/New() SSmachines.powernets += src @@ -31,31 +31,21 @@ SSmachines.powernets -= src return ..() -//Returns the amount of excess power (before refunding to SMESs) from last tick. -//This is for machines that might adjust their power consumption using this data. -/datum/powernet/proc/last_surplus() - return max(avail - load, 0) - -/datum/powernet/proc/draw_power(var/amount) - var/draw = between(0, amount, avail - load) - load += draw - return draw - /datum/powernet/proc/is_empty() return !cables.len && !nodes.len //remove a cable from the current powernet //if the powernet is then empty, delete it //Warning : this proc DON'T check if the cable exists -/datum/powernet/proc/remove_cable(var/obj/structure/cable/C) +/datum/powernet/proc/remove_cable(obj/structure/cable/C) cables -= C C.powernet = null if(is_empty())//the powernet is now empty... - qdel(src)///... delete it - qdel + qdel(src)///... delete it //add a cable to the current powernet //Warning : this proc DON'T check if the cable exists -/datum/powernet/proc/add_cable(var/obj/structure/cable/C) +/datum/powernet/proc/add_cable(obj/structure/cable/C) if(C.powernet)// if C already has a powernet... if(C.powernet == src) return @@ -67,16 +57,16 @@ //remove a power machine from the current powernet //if the powernet is then empty, delete it //Warning : this proc DON'T check if the machine exists -/datum/powernet/proc/remove_machine(var/obj/machinery/power/M) +/datum/powernet/proc/remove_machine(obj/machinery/power/M) nodes -=M M.powernet = null if(is_empty())//the powernet is now empty... - qdel(src)///... delete it - qdel + qdel(src)///... delete it //add a power machine to the current powernet //Warning : this proc DON'T check if the machine exists -/datum/powernet/proc/add_machine(var/obj/machinery/power/M) +/datum/powernet/proc/add_machine(obj/machinery/power/M) if(M.powernet)// if M already has a powernet... if(M.powernet == src) return @@ -85,45 +75,23 @@ M.powernet = src nodes[M] = M -// Triggers warning for certain amount of ticks -/datum/powernet/proc/trigger_warning(var/duration_ticks = 20) - problem = max(duration_ticks, problem) - //handles the power changes in the powernet //called every ticks by the powernet controller /datum/powernet/proc/reset() - var/numapc = 0 - - if(problem > 0) - problem = max(problem - 1, 0) - - if(nodes && nodes.len) // Added to fix a bad list bug -- TLE - for(var/obj/machinery/power/terminal/term in nodes) - if( istype( term.master, /obj/machinery/power/apc ) ) - numapc++ - + //see if there's a surplus of power remaining in the powernet and stores unused power in the SMES netexcess = avail - load - if(numapc) - //very simple load balancing. If there was a net excess this tick then it must have been that some APCs used less than perapc, since perapc*numapc = avail - //Therefore we can raise the amount of power rationed out to APCs on the assumption that those APCs that used less than perapc will continue to do so. - //If that assumption fails, then some APCs will miss out on power next tick, however it will be rebalanced for the tick after. - if(netexcess >= 0) - perapc_excess += min(netexcess/numapc, (avail - perapc) - perapc_excess) - else - perapc_excess = 0 - - perapc = avail/numapc + perapc_excess - if(netexcess > 100 && nodes && nodes.len) // if there was excess power last cycle for(var/obj/machinery/power/smes/S in nodes) // find the SMESes in the network S.restore() // and restore some of the power that was used - //updates the viewed load (as seen on power computers) - viewload = round(load) + // update power consoles + viewavail = round(0.8 * viewavail + 0.2 * avail) + viewload = round(0.8 * viewload + 0.2 * load) - //reset the powernet - load = 0 + // reset the powernet + load = delayedload + delayedload = 0 avail = newavail newavail = 0 @@ -131,27 +99,4 @@ if(avail >= 1000) return Clamp(20 + round(avail / 25000), 20, 195) + rand(-5, 5) else - return 0 - -//////////////////////////////////////////////// -// Misc. -/////////////////////////////////////////////// - - -// return a knot cable (O-X) if one is present in the turf -// null if there's none -/turf/proc/get_cable_node() - if(!istype(src, /turf/simulated/floor)) - return null - for(var/obj/structure/cable/C in src) - if(C.d1 == 0) - return C - return null - -/area/proc/get_apc() - // This was a simple locate() in src, but an unresolved BYOND bug causes trying to locate() in an - // area to take an inconceivably long time, especially for large areas. - // See: http://www.byond.com/forum/?post=1860571 - var/obj/machinery/power/apc/FINDME - for(FINDME in src) - return FINDME \ No newline at end of file + return 0 \ No newline at end of file diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index a85d9e880bd..3e910a613b0 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -15,8 +15,8 @@ var/global/list/rad_collectors = list() var/locked = 0 var/drainratio = 1 -/obj/machinery/power/rad_collector/New() - ..() +/obj/machinery/power/rad_collector/Initialize(mapload) + . = ..() rad_collectors += src /obj/machinery/power/rad_collector/Destroy() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 7e031755e22..9ba302ab19b 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -23,18 +23,25 @@ var/frequency = 0 var/id_tag = null + var/projectile_type = /obj/item/projectile/beam/emitter + var/projectile_sound = 'sound/weapons/emitter.ogg' var/datum/radio_frequency/radio_connection var/datum/effect_system/spark_spread/sparks -/obj/machinery/power/emitter/New() - ..() +/obj/machinery/power/emitter/Initialize(mapload) + . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/emitter(null) component_parts += new /obj/item/stock_parts/micro_laser(null) component_parts += new /obj/item/stock_parts/manipulator(null) RefreshParts() + if(state == 2 && anchored) + connect_to_network() sparks = new + sparks.attach(src) sparks.set_up(5, 1, src) + if(frequency) + set_frequency(frequency) /obj/machinery/power/emitter/RefreshParts() var/max_firedelay = 120 @@ -79,13 +86,6 @@ return rotate() -/obj/machinery/power/emitter/Initialize() - ..() - if(state == 2 && anchored) - connect_to_network() - if(frequency) - set_frequency(frequency) - /obj/machinery/power/emitter/multitool_menu(var/mob/user,var/obj/item/multitool/P) return {"
    @@ -182,10 +182,9 @@ src.active = 0 update_icon() return - if(((src.last_shot + src.fire_delay) <= world.time) && (src.active == 1)) - - var/actual_load = draw_power(active_power_usage) - if(actual_load >= active_power_usage) //does the laser have enough power to shoot? + if(active == TRUE) + if(!active_power_usage || surplus() >= active_power_usage) + add_load(active_power_usage) if(!powered) powered = 1 update_icon() @@ -197,36 +196,57 @@ investigate_log("lost power and turned off","singulo") return - src.last_shot = world.time - if(src.shot_number < 3) - src.fire_delay = 2 - src.shot_number++ - else - src.fire_delay = rand(minimum_fire_delay,maximum_fire_delay) - src.shot_number = 0 + if(!check_delay()) + return FALSE + fire_beam() - var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter(src.loc) +/obj/machinery/power/emitter/proc/check_delay() + if((last_shot + fire_delay) <= world.time) + return TRUE + return FALSE - A.dir = src.dir - playsound(get_turf(src), 'sound/weapons/emitter.ogg', 25, 1) - if(prob(35)) - sparks.start() - - switch(dir) - if(NORTH) - A.yo = 20 - A.xo = 0 - if(EAST) - A.yo = 0 - A.xo = 20 - if(WEST) - A.yo = 0 - A.xo = -20 - else // Any other - A.yo = -20 - A.xo = 0 - A.fire() //TODO: Carn: check this out +/obj/machinery/power/emitter/proc/fire_beam() + var/obj/item/projectile/P = new projectile_type(get_turf(src)) + playsound(get_turf(src), projectile_sound, 50, TRUE) + if(prob(35)) + sparks.start() + switch(dir) + if(NORTH) + P.yo = 20 + P.xo = 0 + if(NORTHEAST) + P.yo = 20 + P.xo = 20 + if(EAST) + P.yo = 0 + P.xo = 20 + if(SOUTHEAST) + P.yo = -20 + P.xo = 20 + if(WEST) + P.yo = 0 + P.xo = -20 + if(SOUTHWEST) + P.yo = -20 + P.xo = -20 + if(NORTHWEST) + P.yo = 20 + P.xo = -20 + else // Any other + P.yo = -20 + P.xo = 0 + last_shot = world.time + if(shot_number < 3) + fire_delay = 20 + shot_number ++ + else + fire_delay = rand(minimum_fire_delay, maximum_fire_delay) + shot_number = 0 + P.setDir(dir) + P.starting = loc + P.fire() + return P /obj/machinery/power/emitter/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/multitool)) diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 40947d79368..420a112c352 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -48,8 +48,8 @@ field_generator power level display overlays += "+p[power_level]" -/obj/machinery/field/generator/New() - ..() +/obj/machinery/field/generator/Initialize(mapload) + . = ..() fields = list() connected_gens = list() diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm index 85ef45eef20..2b6695b9e85 100644 --- a/code/modules/power/singularity/particle_accelerator/particle.dm +++ b/code/modules/power/singularity/particle_accelerator/particle.dm @@ -2,11 +2,12 @@ name = "Accelerated Particles" desc = "Small things moving very fast." icon = 'icons/obj/machines/particle_accelerator.dmi' - icon_state = "particle"//Need a new icon for this - anchored = 1 - density = 1 + icon_state = "particle" + anchored = TRUE + density = FALSE var/movement_range = 10 var/energy = 10 + var/speed = 1 /obj/effect/accelerated_particle/weak movement_range = 8 @@ -21,50 +22,45 @@ energy = 50 -/obj/effect/accelerated_particle/New(loc, dir = 2) - src.loc = loc - src.dir = dir +/obj/effect/accelerated_particle/New(loc) + ..() - if(movement_range > 20) - movement_range = 20 - spawn(0) - move(1) - return + addtimer(CALLBACK(src, .proc/move), 1) /obj/effect/accelerated_particle/Bump(atom/A) if(A) - if(ismob(A)) + if(isliving(A)) toxmob(A) - if((istype(A,/obj/machinery/the_singularitygen))||(istype(A,/obj/singularity/))) - A:energy += energy - return + else if(istype(A, /obj/machinery/the_singularitygen)) + var/obj/machinery/the_singularitygen/S = A + S.energy += energy + else if(istype(A, /obj/singularity)) + var/obj/singularity/S = A + S.energy += energy - -/obj/effect/accelerated_particle/Bumped(atom/A) - if(ismob(A)) - Bump(A) - return +/obj/effect/accelerated_particle/Crossed(atom/A) + if(isliving(A)) + toxmob(A) /obj/effect/accelerated_particle/ex_act(severity) qdel(src) + +/obj/effect/accelerated_particle/singularity_pull() return -/obj/effect/accelerated_particle/proc/toxmob(var/mob/living/M) - M.apply_effect((energy*6),IRRADIATE,0) - M.updatehealth() - return +/obj/effect/accelerated_particle/proc/toxmob(mob/living/M) + M.apply_effect((energy * 6), IRRADIATE, 0) - -/obj/effect/accelerated_particle/proc/move(var/lag) +/obj/effect/accelerated_particle/proc/move() if(!step(src,dir)) - src.loc = get_step(src,dir) + forceMove(get_step(src, dir)) movement_range-- - if(movement_range <= 0) + if(movement_range == 0) qdel(src) else - sleep(lag) - move(lag) + sleep(speed) + move() \ No newline at end of file diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index bf20ef45140..80de53fe22d 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -19,11 +19,11 @@ var/parts = null var/datum/wires/particle_acc/control_box/wires = null -/obj/machinery/particle_accelerator/control_box/New() +/obj/machinery/particle_accelerator/control_box/Initialize(mapload) + . = ..() wires = new(src) connected_parts = list() update_icon() - ..() /obj/machinery/particle_accelerator/control_box/Destroy() if(active) diff --git a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm index 97bf4fa4277..c2a1ccfa8da 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm @@ -29,21 +29,20 @@ return 0 -/obj/structure/particle_accelerator/particle_emitter/proc/emit_particle(var/strength = 0) +/obj/structure/particle_accelerator/particle_emitter/proc/emit_particle(strength = 0) if((last_shot + fire_delay) <= world.time) last_shot = world.time - var/obj/effect/accelerated_particle/A = null - var/turf/T = get_step(src, dir) + var/turf/T = get_turf(src) + var/obj/effect/accelerated_particle/P switch(strength) if(0) - A = new/obj/effect/accelerated_particle/weak(T, dir) + P = new/obj/effect/accelerated_particle/weak(T) if(1) - A = new/obj/effect/accelerated_particle(T, dir) + P = new/obj/effect/accelerated_particle(T) if(2) - A = new/obj/effect/accelerated_particle/strong(T, dir) + P = new/obj/effect/accelerated_particle/strong(T) if(3) - A = new/obj/effect/accelerated_particle/powerful(T, dir) - if(A) - A.dir = dir - return 1 - return 0 + P = new/obj/effect/accelerated_particle/powerful(T) + P.setDir(dir) + return TRUE + return FALSE \ No newline at end of file diff --git a/code/modules/power/singularity/particle_accelerator/particle_power.dm b/code/modules/power/singularity/particle_accelerator/particle_power.dm index dafd19917da..75ae7eb3263 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_power.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_power.dm @@ -3,8 +3,4 @@ desc_holder = "This part uses electromagnetic waves to focus the Alpha particles." icon = 'icons/obj/machines/particle_accelerator.dmi' icon_state = "power_box" - reference = "power_box" - -/obj/structure/particle_accelerator/power_box/update_icon() - ..() - return + reference = "power_box" \ No newline at end of file diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 632fb7726ee..12d6c8b831a 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -35,7 +35,7 @@ src.energy = starting_energy ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) GLOB.poi_list |= src GLOB.singularities += src for(var/obj/machinery/power/singularity_beacon/singubeacon in GLOB.machines) @@ -44,7 +44,7 @@ break /obj/singularity/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) GLOB.poi_list.Remove(src) GLOB.singularities -= src target = null diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 2884fc18b4c..6c9ecb55afc 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -11,21 +11,20 @@ name = "power storage unit" desc = "A high-capacity superconducting magnetic energy storage (SMES) unit." icon_state = "smes" - density = 1 - anchored = 1 - defer_process = 1 + density = TRUE + use_power = NO_POWER_USE var/capacity = 5e6 // maximum charge var/charge = 0 // actual charge - var/input_attempt = 0 // 1 = attempting to charge, 0 = not attempting to charge - var/inputting = 0 // 1 = actually inputting, 0 = not inputting + var/input_attempt = TRUE // 1 = attempting to charge, 0 = not attempting to charge + var/inputting = TRUE // 1 = actually inputting, 0 = not inputting var/input_level = 50000 // amount of power the SMES attempts to charge by var/input_level_max = 200000 // cap on input_level var/input_available = 0 // amount of charge available from input last tick - var/output_attempt = 1 // 1 = attempting to output, 0 = not attempting to output - var/outputting = 1 // 1 = actually outputting, 0 = not outputting + var/output_attempt = TRUE // 1 = attempting to output, 0 = not attempting to output + var/outputting = TRUE // 1 = actually outputting, 0 = not outputting var/output_level = 50000 // amount of power the SMES attempts to output var/output_level_max = 200000 // cap on output_level var/output_used = 0 // amount of power actually outputted. may be less than output_level if the powernet returns excess power @@ -35,13 +34,11 @@ var/last_input_attempt = 0 var/last_charge = 0 - var/open_hatch = 0 var/name_tag = null - var/building_terminal = 0 //Suggestions about how to avoid clickspam building several terminals accepted! var/obj/machinery/power/terminal/terminal = null -/obj/machinery/power/smes/New() - ..() +/obj/machinery/power/smes/Initialize(mapload) + . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/smes(null) component_parts += new /obj/item/stock_parts/cell/high(null) @@ -53,28 +50,22 @@ component_parts += new /obj/item/stack/cable_coil(null, 5) RefreshParts() - spawn(5) - if(!powernet) - connect_to_network() + dir_loop: + for(var/d in cardinal) + var/turf/T = get_step(src, d) + for(var/obj/machinery/power/terminal/term in T) + if(term && term.dir == turn(d, 180)) + terminal = term + break dir_loop - dir_loop: - for(var/d in cardinal) - var/turf/T = get_step(src, d) - for(var/obj/machinery/power/terminal/term in T) - if(term && term.dir == turn(d, 180)) - terminal = term - break dir_loop - if(!terminal) - stat |= BROKEN - return - terminal.master = src - if(!terminal.powernet) - terminal.connect_to_network() - update_icon() - return + if(!terminal) + stat |= BROKEN + return + terminal.master = src + update_icon() -/obj/machinery/power/smes/upgraded/New() - ..() +/obj/machinery/power/smes/upgraded/Initialize(mapload) + . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/smes(null) component_parts += new /obj/item/stock_parts/cell/hyper(null) @@ -223,8 +214,8 @@ return round(5.5*charge/(capacity ? capacity : 5e6)) /obj/machinery/power/smes/process() - - if(stat & BROKEN) return + if(stat & BROKEN) + return //store machine state to see if we need to update the icon overlays var/last_disp = chargedisplay() @@ -232,33 +223,46 @@ var/last_onln = outputting //inputting - if(input_attempt) - var/target_load = min((capacity-charge)/SMESRATE, input_level) // charge at set rate, limited to spare capacity - var/actual_load = draw_power(target_load) // add the load to the terminal side network - charge += actual_load * SMESRATE // increase the charge + if(terminal && input_attempt) + input_available = terminal.surplus() - if(actual_load >= target_load) // Did we charge at full rate? - inputting = 2 - else if(actual_load) // If not, did we charge at least partially? - inputting = 1 - else // Or not at all? - inputting = 0 + if(inputting) + if(input_available > 0) // if there's power available, try to charge + + var/load = min(min((capacity-charge)/SMESRATE, input_level), input_available) // charge at set rate, limited to spare capacity + + charge += load * SMESRATE // increase the charge + + terminal.add_load(load) // add the load to the terminal side network + + else // if not enough capcity + inputting = FALSE // stop inputting + + else + if(input_attempt && input_available > 0) + inputting = TRUE + else + inputting = FALSE //outputting - if(outputting) - output_used = min( charge/SMESRATE, output_level) //limit output to that stored + if(output_attempt) + if(outputting) + output_used = min( charge/SMESRATE, output_level) //limit output to that stored - charge -= output_used*SMESRATE // reduce the storage (may be recovered in /restore() if excessive) + if (add_avail(output_used)) // add output to powernet if it exists (smes side) + charge -= output_used*SMESRATE // reduce the storage (may be recovered in /restore() if excessive) + else + outputting = FALSE - add_avail(output_used) // add output to powernet (smes side) - - if(output_used < 0.0001) // either from no charge or set to 0 - outputting = 0 - investigate_log("lost power and turned off","singulo") - else if(output_attempt && charge > output_level && output_level > 0) - outputting = 1 + if(output_used < 0.0001) // either from no charge or set to 0 + outputting = FALSE + investigate_log("lost power and turned off", "singulo") + else if(output_attempt && charge > output_level && output_level > 0) + outputting = TRUE + else + output_used = 0 else - output_used = 0 + outputting = FALSE // only update icon if state changed if(last_disp != chargedisplay() || last_chrg != inputting || last_onln != outputting) @@ -334,11 +338,6 @@ return 0 return 1 -/obj/machinery/power/smes/draw_power(var/amount) - if(terminal && terminal.powernet) - return terminal.powernet.draw_power(amount) - return 0 - /obj/machinery/power/smes/attack_ai(mob/user) add_hiddenprint(user) ui_interact(user) @@ -484,7 +483,8 @@ output_level = 250000 /obj/machinery/power/smes/magical/process() - charge = 5000000 + capacity = INFINITY + charge = INFINITY ..() #undef SMESRATE diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 7342c1f26c1..1384c8d21e6 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -6,8 +6,7 @@ desc = "A solar panel. Generates electricity when in contact with sunlight." icon = 'icons/obj/power.dmi' icon_state = "sp_base" - anchored = 1 - density = 1 + density = TRUE use_power = NO_POWER_USE idle_power_usage = 0 active_power_usage = 0 @@ -20,8 +19,8 @@ var/turn_angle = 0 var/obj/machinery/power/solar_control/control = null -/obj/machinery/power/solar/New(var/turf/loc, var/obj/item/solar_assembly/S) - ..(loc) +/obj/machinery/power/solar/Initialize(mapload, obj/item/solar_assembly/S) + . = ..() Make(S) connect_to_network() @@ -118,7 +117,7 @@ return sunfrac = cos(p_angle) ** 2 - //isn't the power recieved from the incoming light proportionnal to cos(p_angle) (Lambert's cosine law) rather than cos(p_angle)^2 ? + //isn't the power received from the incoming light proportionnal to cos(p_angle) (Lambert's cosine law) rather than cos(p_angle)^2 ? /obj/machinery/power/solar/process()//TODO: remove/add this from machines to save on processing as needed ~Carn PRIORITY if(stat & BROKEN) diff --git a/code/modules/power/switch.dm b/code/modules/power/switch.dm deleted file mode 100644 index 34e867005e1..00000000000 --- a/code/modules/power/switch.dm +++ /dev/null @@ -1,84 +0,0 @@ -//This is a power switch. When turned on it looks at the cables around the tile that it's on and notes which cables are trying to connect to it. -//After it knows this it creates the number of cables from the center to each of the cables attempting to conenct. These cables cannot be removed -//with wirecutters. When the switch is turned off it removes all the cables on the tile it's on. -//The switch uses a 5s delay to prevent powernet change spamming. -/* -/obj/structure/powerswitch - name = "power switch" - desc = "A switch that controls power." - icon = 'icons/obj/power.dmi' - icon_state = "switch-dbl-up" - var/icon_state_on = "switch-dbl-down" - var/icon_state_off = "switch-dbl-up" - density = 0 - anchored = 1 - var/on = 0 //up is off, down is on - var/busy = 0 //set to 1 when you start pulling - -/obj/structure/powerswitch/simple - icon_state = "switch-up" - icon_state_on = "switch-down" - icon_state_off = "switch-up" - - -/obj/structure/powerswitch/examine(mob/user) - ..(user) - if(on) - to_chat(user, "The switch is in the on position") - else - to_chat(user, "The switch is in the off position") - -/obj/structure/powerswitch/attack_ai(mob/user) - to_chat(user, "You're an AI. This is a manual switch. It's not going to work.") - return - -/obj/structure/powerswitch/attack_hand(mob/user) - - if(busy) - to_chat(user, "This switch is already being toggled.") - return - - ..() - - busy = 1 - for(var/mob/O in viewers(user)) - O.show_message(text("[user] starts pulling the [src]."), 1) - - if(do_after(user, 50, target = src)) - set_state(!on) - for(var/mob/O in viewers(user)) - O.show_message(text("[user] flips the [src] into the [on ? "on": "off"] position."), 1) - busy = 0 - -/obj/structure/powerswitch/proc/set_state(var/state) - on = state - if(on) - icon_state = icon_state_on - var/list/connection_dirs = list() - for(var/direction in list(1,2,4,8,5,6,9,10)) - for(var/obj/structure/cable/C in get_step(src,direction)) - if(C.d1 == turn(direction, 180) || C.d2 == turn(direction, 180)) - connection_dirs += direction - break - - for(var/direction in connection_dirs) - var/obj/structure/cable/C = new/obj/structure/cable(src.loc) - C.d1 = 0 - C.d2 = direction - C.icon_state = "[C.d1]-[C.d2]" - C.power_switch = src - - var/datum/powernet/PN = new() - PN.number = powernets.len + 1 - powernets += PN - C.netnum = PN.number - PN.cables += C - - C.mergeConnectedNetworks(C.d2) - C.mergeConnectedNetworksOnTurf() - - else - icon_state = icon_state_off - for(var/obj/structure/cable/C in src.loc) - qdel(C) -*/ \ No newline at end of file diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index 194e96f6dba..80c38e0a9fe 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -8,25 +8,24 @@ icon_state = "term" desc = "It's an underfloor wiring terminal for power equipment." level = 1 - layer = TURF_LAYER + layer = WIRE_TERMINAL_LAYER //a bit above wires var/obj/machinery/power/master = null - anchored = 1 - layer = 2.6 // a bit above wires -/obj/machinery/power/terminal/New() - ..() - var/turf/T = src.loc - if(level==1) hide(T.intact) - return - +/obj/machinery/power/terminal/Initialize(mapload) + . = ..() + var/turf/T = get_turf(src) + if(level == 1) + hide(T.intact) + /obj/machinery/power/terminal/Destroy() if(master) master.disconnect_terminal() + master = null return ..() -/obj/machinery/power/terminal/hide(var/i) +/obj/machinery/power/terminal/hide(i) if(i) invisibility = 101 icon_state = "term-f" diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index efafd8909ea..cc564c98d4c 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -12,8 +12,8 @@ var/last_zap = 0 var/datum/wires/tesla_coil/wires = null -/obj/machinery/power/tesla_coil/New() - ..() +/obj/machinery/power/tesla_coil/Initialize(mapload) + . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/tesla_coil(null) component_parts += new /obj/item/stock_parts/capacitor(null) @@ -77,7 +77,7 @@ var/coeff = (20 - ((input_power_multiplier - 1) * 3)) coeff = max(coeff, 10) var/power = (powernet.avail/2) - draw_power(power) + add_load(power) playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5) tesla_zap(src, 10, power/(coeff/2)) @@ -89,8 +89,8 @@ anchored = 0 density = 1 -/obj/machinery/power/grounding_rod/New() - ..() +/obj/machinery/power/grounding_rod/Initialize(mapload) + . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/grounding_rod(null) component_parts += new /obj/item/stock_parts/capacitor(null) diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index e4e3275ef26..0b7f417b52e 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -8,16 +8,15 @@ desc = "A solar directional tracker." icon = 'icons/obj/power.dmi' icon_state = "tracker" - anchored = 1 - density = 1 + density = TRUE use_power = NO_POWER_USE var/id = 0 var/sun_angle = 0 // sun angle as set by sun datum var/obj/machinery/power/solar_control/control = null -/obj/machinery/power/tracker/New(var/turf/loc, var/obj/item/solar_assembly/S) - ..(loc) +/obj/machinery/power/tracker/Initialize(mapload, obj/item/solar_assembly/S) + . = ..() Make(S) connect_to_network() @@ -26,7 +25,7 @@ return ..() //set the control of the tracker to a given computer if closer than SOLAR_MAX_DIST -/obj/machinery/power/tracker/proc/set_control(var/obj/machinery/power/solar_control/SC) +/obj/machinery/power/tracker/proc/set_control(obj/machinery/power/solar_control/SC) if(SC && (get_dist(src, SC) > SOLAR_MAX_DIST)) return 0 control = SC @@ -39,21 +38,21 @@ control.connected_tracker = null control = null -/obj/machinery/power/tracker/proc/Make(var/obj/item/solar_assembly/S) +/obj/machinery/power/tracker/proc/Make(obj/item/solar_assembly/S) if(!S) S = new /obj/item/solar_assembly(src) S.glass_type = /obj/item/stack/sheet/glass S.tracker = 1 - S.anchored = 1 - S.loc = src + S.anchored = TRUE + S.forceMove(src) update_icon() //updates the tracker icon and the facing angle for the control computer -/obj/machinery/power/tracker/proc/set_angle(var/angle) +/obj/machinery/power/tracker/proc/set_angle(angle) sun_angle = angle //set icon dir to show sun illumination - dir = turn(NORTH, -angle - 22.5) // 22.5 deg bias ensures, e.g. 67.5-112.5 is EAST + setDir(turn(NORTH, -angle - 22.5)) // 22.5 deg bias ensures, e.g. 67.5-112.5 is EAST if(powernet && (powernet == control.powernet)) //update if we're still in the same powernet control.cdir = angle diff --git a/code/modules/power/treadmill.dm b/code/modules/power/treadmill.dm index c611585a8cc..1548738f3f5 100644 --- a/code/modules/power/treadmill.dm +++ b/code/modules/power/treadmill.dm @@ -7,7 +7,6 @@ name = "treadmill" desc = "A power-generating treadmill." layer = 2.2 - anchored = 1 use_power = NO_POWER_USE var/speed = 0 @@ -18,8 +17,8 @@ var/list/mobs_running[0] var/id = null // for linking to monitor -/obj/machinery/power/treadmill/Initialize() - ..() +/obj/machinery/power/treadmill/Initialize(mapload) + . = ..() if(anchored) connect_to_network() @@ -138,8 +137,8 @@ var/frame = 0 // on 0, show labels, on 1 show numbers var/redeem_immediately = 0 // redeem immediately for holding cell -/obj/machinery/treadmill_monitor/Initialize() - ..() +/obj/machinery/treadmill_monitor/Initialize(mapload) + . = ..() if(id) for(var/obj/machinery/power/treadmill/T in GLOB.machines) if(T.id == id) diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 641682490d4..7b1764c354d 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -64,8 +64,8 @@ // the inlet stage of the gas turbine electricity generator -/obj/machinery/power/compressor/New() - ..() +/obj/machinery/power/compressor/Initialize(mapload) + . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/power_compressor(null) component_parts += new /obj/item/stock_parts/manipulator(null) @@ -80,10 +80,6 @@ gas_contained = new inturf = get_step(src, dir) - - -/obj/machinery/power/compressor/Initialize() - ..() locate_machinery() if(!turbine) stat |= BROKEN @@ -185,8 +181,8 @@ #define TURBGENQ 100000 #define TURBGENG 0.5 -/obj/machinery/power/turbine/New() - ..() +/obj/machinery/power/turbine/Initialize(mapload) + . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/power_turbine(src) component_parts += new /obj/item/stock_parts/capacitor(src) @@ -200,10 +196,6 @@ // The outlet is pointed at the direction of the turbine component outturf = get_step(src, dir) - - -/obj/machinery/power/turbine/Initialize() - ..() locate_machinery() if(!compressor) stat |= BROKEN diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm index 95e1a586469..2a20e7e6c81 100644 --- a/code/modules/projectiles/guns/alien.dm +++ b/code/modules/projectiles/guns/alien.dm @@ -15,10 +15,10 @@ /obj/item/gun/projectile/automatic/spikethrower/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/gun/projectile/automatic/spikethrower/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/gun/projectile/automatic/spikethrower/update_icon() diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 8c9b0cf66f8..b25420b5491 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -32,7 +32,7 @@ power_supply.give(power_supply.maxcharge) update_ammo_types() if(selfcharge) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) update_icon() /obj/item/gun/energy/proc/update_ammo_types() @@ -47,7 +47,7 @@ /obj/item/gun/energy/Destroy() if(selfcharge) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/gun/energy/process() @@ -167,9 +167,9 @@ switch(var_name) if("selfcharge") if(var_value) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) else - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) . = ..() /obj/item/gun/energy/proc/robocharge() diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 623986f5837..fa34753c6a9 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -340,11 +340,11 @@ /obj/item/gun/energy/temperature/New() ..() update_icon() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/gun/energy/temperature/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/gun/energy/temperature/newshot() diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index f6d84635c08..75f94dd83d0 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -51,12 +51,12 @@ charges = max_charges chambered = new ammo_type(src) if(can_charge) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/gun/magic/Destroy() if(can_charge) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm index face61e79c3..a1677b764e0 100644 --- a/code/modules/projectiles/guns/medbeam.dm +++ b/code/modules/projectiles/guns/medbeam.dm @@ -17,10 +17,10 @@ /obj/item/gun/medbeam/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/gun/medbeam/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/gun/medbeam/handle_suicide() diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 8d7201d0645..69023a3e6e8 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -16,7 +16,7 @@ var/const/INGEST = 2 /datum/reagents/New(maximum = 100) maximum_volume = maximum if(!(flags & REAGENT_NOREACT)) - processing_objects |= src + START_PROCESSING(SSobj, src) //I dislike having these here but map-objects are initialised before world/New() is called. >_> if(!GLOB.chemical_reagents_list) //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id @@ -333,9 +333,9 @@ var/const/INGEST = 2 od_chems.Add(R.id) return od_chems -/datum/reagents/proc/process() +/datum/reagents/process() if(flags & REAGENT_NOREACT) - processing_objects -= src + STOP_PROCESSING(SSobj, src) return for(var/datum/reagent/R in reagent_list) @@ -346,9 +346,9 @@ var/const/INGEST = 2 // Order is important, process() can remove from processing if // the flag is present flags &= ~(REAGENT_NOREACT) - processing_objects |= src + START_PROCESSING(SSobj, src) else - processing_objects -= src + STOP_PROCESSING(SSobj, src) flags |= REAGENT_NOREACT /* @@ -819,7 +819,7 @@ var/const/INGEST = 2 /datum/reagents/Destroy() . = ..() - processing_objects -= src + STOP_PROCESSING(SSobj, src) QDEL_LIST(reagent_list) reagent_list = null QDEL_LIST(addiction_list) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 258237f0ddd..57a57ef8e0a 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -184,6 +184,8 @@ if(href_list["ejectBeaker"]) if(beaker) beaker.forceMove(loc) + if(Adjacent(usr) && !issilicon(usr)) + usr.put_in_hands(beaker) beaker = null overlays.Cut() diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 848c1ca4ecd..5f5bd8de2d4 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -38,9 +38,11 @@ if(state_change) SSnanoui.update_uis(src) -/obj/machinery/chem_heater/proc/eject_beaker() +/obj/machinery/chem_heater/proc/eject_beaker(mob/user) if(beaker) beaker.forceMove(get_turf(src)) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(beaker) beaker = null icon_state = "mixer0b" on = FALSE @@ -118,7 +120,7 @@ . = 1 if(href_list["eject_beaker"]) - eject_beaker() + eject_beaker(usr) . = 0 //updated in eject_beaker() already /obj/machinery/chem_heater/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index ffd3ae57bd5..e10cd5c9203 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -229,6 +229,8 @@ else if(href_list["eject"]) if(beaker) beaker.forceMove(get_turf(src)) + if(Adjacent(usr) && !issilicon(usr)) + usr.put_in_hands(beaker) beaker = null reagents.clear_reagents() update_icon() diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index a2ecc811e6a..d4199c3dcec 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -169,7 +169,7 @@ return if(M.mind && M.mind.changeling && M.mind.changeling.regenerating) //no messing with changeling's fake death return - M.visible_message("[M] seizes up and falls limp, [M.p_their()] eyes dead and lifeless...") //so you can't trigger deathgasp emote on people. Edge case, but necessary. + M.emote("deathgasp") M.status_flags |= FAKEDEATH M.update_stat("fakedeath reagent") M.med_hud_set_health() diff --git a/code/modules/reagents/chemistry/reagents/drinks.dm b/code/modules/reagents/chemistry/reagents/drinks.dm index 52ae0f0c93b..b50ed09a27c 100644 --- a/code/modules/reagents/chemistry/reagents/drinks.dm +++ b/code/modules/reagents/chemistry/reagents/drinks.dm @@ -8,7 +8,7 @@ drink_desc = "Vitamins! Yay!" taste_message = "orange juice" -/datum/reagent/consumable/drink/orangejuicde/on_mob_life(mob/living/M) +/datum/reagent/consumable/drink/orangejuice/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE if(prob(30)) update_flags |= M.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE) @@ -89,7 +89,7 @@ drink_desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place." taste_message = "healthy dietary choices" -/datum/reagent/consumable/drink/doctors_delight/on_mob_life(mob/living/M) +/datum/reagent/consumable/drink/doctor_delight/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE if(prob(20)) update_flags |= M.adjustToxLoss(-1, FALSE) diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm index 9b1aca91f8d..bf2417a192e 100644 --- a/code/modules/reagents/chemistry/reagents/food.dm +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -905,8 +905,7 @@ /datum/reagent/vomit/reaction_turf(turf/T, volume) if(volume >= 5 && !isspaceturf(T)) - new /obj/effect/decal/cleanable/vomit(T) - playsound(T, 'sound/effects/splat.ogg', 50, 1, -3) + T.add_vomit_floor() /datum/reagent/greenvomit name = "Green vomit" @@ -918,8 +917,7 @@ /datum/reagent/greenvomit/reaction_turf(turf/T, volume) if(volume >= 5 && !isspaceturf(T)) - new /obj/effect/decal/cleanable/vomit/green(T) - playsound(T, 'sound/effects/splat.ogg', 50, 1, -3) + T.add_vomit_floor(FALSE, TRUE) ////Lavaland Flora Reagents//// diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 4f92f21aee7..6e15090ea88 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -38,10 +38,10 @@ for(var/R in reagent_ids) add_reagent(R) - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/reagent_containers/borghypo/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/reagent_containers/borghypo/process() //Every [recharge_time] seconds, recharge some reagents for the cyborg diff --git a/code/modules/reagents/reagent_containers/iv_bag.dm b/code/modules/reagents/reagent_containers/iv_bag.dm index 709b20f070f..825aa69632b 100644 --- a/code/modules/reagents/reagent_containers/iv_bag.dm +++ b/code/modules/reagents/reagent_containers/iv_bag.dm @@ -42,11 +42,11 @@ /obj/item/reagent_containers/iv_bag/proc/begin_processing(mob/target) injection_target = target - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/reagent_containers/iv_bag/proc/end_processing() injection_target = null - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) /obj/item/reagent_containers/iv_bag/process() if(!injection_target) diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 069efe5807c..8ddb4e0fd7c 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -447,6 +447,14 @@ build_path = /obj/item/healthanalyzer category = list("initial", "Medical") +/datum/design/pillbottle + name = "Pill Bottle" + id = "pillbottle" + build_type = AUTOLATHE + materials = list(MAT_METAL = 80, MAT_GLASS = 20) + build_path = /obj/item/storage/pill_bottle + category = list("initial", "Medical") + /datum/design/beanbag_slug name = "Beanbag Slug" id = "beanbag_slug" diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm index bc264cb8f62..0c535fa61a1 100644 --- a/code/modules/research/designs/biogenerator_designs.dm +++ b/code/modules/research/designs/biogenerator_designs.dm @@ -113,7 +113,15 @@ build_type = BIOGENERATOR materials = list(MAT_BIOMASS = 50) build_path = /obj/item/stack/sheet/cloth - category = list("initial","Leather and Cloth") + category = list("initial", "Organic Materials") + +/datum/design/cardboard + name = "Sheet of cardboard" + id = "cardboard" + build_type = BIOGENERATOR + materials = list(MAT_BIOMASS = 25) + build_path = /obj/item/stack/sheet/cardboard + category = list("initial", "Organic Materials") /datum/design/wallet name = "Wallet" diff --git a/code/modules/response_team/ert.dm b/code/modules/response_team/ert.dm index 8cb29ecf3b4..0bac5824780 100644 --- a/code/modules/response_team/ert.dm +++ b/code/modules/response_team/ert.dm @@ -90,22 +90,13 @@ var/ert_request_answered = FALSE return 0 var/index = 1 - var/ert_spawn_seconds = 120 - spawn(ert_spawn_seconds * 10) // to account for spawn() using deciseconds - var/list/unspawnable_ert = list() - for(var/mob/M in response_team_members) - if(M) - unspawnable_ert |= M - if(unspawnable_ert.len) - message_admins("ERT SPAWN: The following ERT members could not be spawned within [ert_spawn_seconds] seconds:") - for(var/mob/M in unspawnable_ert) - message_admins("- Unspawned ERT: [ADMIN_FULLMONTY(M)]") for(var/mob/M in response_team_members) if(index > emergencyresponseteamspawn.len) index = 1 if(!M || !M.client) continue + log_debug("Spawning as ERT: [M.ckey] ([M])") var/client/C = M.client var/mob/living/new_commando = C.create_response_team(emergencyresponseteamspawn[index]) if(!M || !new_commando) diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm index 715adb668ab..273ea75e832 100644 --- a/code/modules/spacepods/spacepod.dm +++ b/code/modules/spacepods/spacepod.dm @@ -152,7 +152,7 @@ if(src.empcounter > 0) src.empcounter-- else - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) /obj/spacepod/proc/update_icons() if(!pod_overlays) @@ -286,7 +286,7 @@ deal_damage(80 / severity) if(empcounter < (40 / severity)) empcounter = 40 / severity - processing_objects.Add(src) + START_PROCESSING(SSobj, src) switch(severity) if(1) diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index a4444938d96..09ccb3ce36b 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -175,7 +175,7 @@ change_meteor_chance(0.5) /obj/machinery/satellite/meteor_shield/proc/change_meteor_chance(mod) - for(var/datum/event_container/container in event_manager.event_containers) + for(var/datum/event_container/container in SSevents.event_containers) for(var/datum/event_meta/M in container.available_events) if(M.event_type == /datum/event/meteor_wave) M.weight *= mod diff --git a/code/modules/surgery/organs/body_egg.dm b/code/modules/surgery/organs/body_egg.dm index 335d4e5b751..a8ba9192ae4 100644 --- a/code/modules/surgery/organs/body_egg.dm +++ b/code/modules/surgery/organs/body_egg.dm @@ -13,13 +13,13 @@ /obj/item/organ/internal/body_egg/insert(var/mob/living/carbon/M, special = 0) ..() owner.status_flags |= XENO_HOST - processing_objects.Add(src) + START_PROCESSING(SSobj, src) owner.med_hud_set_status() spawn(0) AddInfectionImages(owner) /obj/item/organ/internal/body_egg/remove(var/mob/living/carbon/M, special = 0) - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) if(owner) owner.status_flags &= ~(XENO_HOST) owner.med_hud_set_status() diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index a5e85bf572c..67ea1be1d05 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -33,7 +33,7 @@ /obj/item/organ/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) if(owner) remove(owner, 1) QDEL_LIST_ASSOC_VAL(autopsy_data) @@ -84,7 +84,7 @@ /obj/item/organ/proc/necrotize(update_sprite = TRUE) damage = max_damage status |= ORGAN_DEAD - processing_objects -= src + STOP_PROCESSING(SSobj, src) if(dead_icon && !is_robotic()) icon_state = dead_icon if(owner && vital) @@ -189,7 +189,7 @@ else status = 0 if(!owner) - processing_objects |= src + START_PROCESSING(SSobj, src) /obj/item/organ/proc/is_damaged() return damage > 0 @@ -295,7 +295,7 @@ if(affected) affected.internal_organs -= src loc = get_turf(owner) - processing_objects |= src + START_PROCESSING(SSobj, src) if(owner && vital && is_primary_organ()) // I'd do another check for species or whatever so that you couldn't "kill" an IPC by removing a human head from them, but it doesn't matter since they'll come right back from the dead add_attack_logs(user, owner, "Removed vital organ ([src])", !!user ? ATKLOG_FEW : ATKLOG_ALL) diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index f8534ffe078..4462e4ea470 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -286,7 +286,7 @@ This function completely restores a damaged organ to perfect condition. owner.updatehealth("limb rejuvenate") update_icon() if(!owner) - processing_objects |= src + START_PROCESSING(SSobj, src) /**************************************************** PROCESSING & UPDATING diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 063a4d6880a..6dbc6f4febe 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -41,6 +41,8 @@ for(var/X in actions) var/datum/action/A = X A.Grant(M) + if(vital) + M.update_stat("Vital organ inserted") // Removes the given organ from its owner. // Returns the removed object, which is usually just itself @@ -193,10 +195,10 @@ /obj/item/organ/internal/shadowtumor/New() ..() - processing_objects.Add(src) + START_PROCESSING(SSobj, src) /obj/item/organ/internal/shadowtumor/Destroy() - processing_objects.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/item/organ/internal/shadowtumor/process() diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm index 3672070e8f0..ca22fb5cb0e 100644 --- a/code/modules/telesci/gps.dm +++ b/code/modules/telesci/gps.dm @@ -137,10 +137,10 @@ var/list/GPS_list = list() for marking the area around the transition edges." var/list/turf/tagged -/obj/item/gps/visible_debug/New() +/obj/item/gps/visible_debug/Initialize(mapload) . = ..() tagged = list() - GLOB.fast_processing.Add(src) + START_PROCESSING(SSfastprocess, src) /obj/item/gps/visible_debug/process() var/turf/T = get_turf(src) @@ -161,5 +161,5 @@ var/list/GPS_list = list() if(tagged) clear() tagged = null - GLOB.fast_processing.Remove(src) + STOP_PROCESSING(SSfastprocess, src) . = ..() diff --git a/config/example/config.txt b/config/example/config.txt index 684b38c50fb..ca81181c027 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -1,6 +1,12 @@ ## Server name: This appears at the top of the screen in-game. In this case it will read "spacestation13: station_name" where station_name is the randomly generated name of the station for the round. Remove the # infront of SERVERNAME and replace 'spacestation13' with the name of your choice # SERVERNAME spacestation13 +## Server tagline: This appears on the hub entry. +#SERVER_TAG_LINE The Perfect Mix of RP & Action + +## Server extra features: This appears in the feature list on the hub entry. +#SERVER_EXTRA_FEATURES medium RP, varied species/jobs/modes + ## Add a # infront of this if you want to use the SQL based admin system, the legacy system uses admins.txt. You need to set up your database to use the SQL based system. ADMIN_LEGACY_SYSTEM @@ -265,6 +271,12 @@ ASSISTANT_LIMIT ## If you enabled assistant limiting set the ratio of assistants to security members default is 2 assistants to 1 officer ASSISTANT_RATIO 2 +# Mins before SSD crew are cryoed. +AUTO_CRYO_SSD_MINS 15 + +# If enabled, prevents people interacting with SSD players unless they acknowledge they have read the server rules. +SSD_WARNING + ## Remove the # to make rounds which end instantly (Rev, Wizard, Malf) to continue until the shuttle is called or the station is nuked. ## Malf and Rev will let the shuttle be called when the antags/protags are dead. #CONTINUOUS_ROUNDS @@ -417,4 +429,4 @@ DISABLE_HIGH_POP_MC_MODE_AMOUNT 60 #DISABLE_LOCALHOST_ADMIN ## Uncomment to give a confirmation before hitting start now -#START_NOW_CONFIRMATION \ No newline at end of file +#START_NOW_CONFIRMATION diff --git a/html/changelogs/AutoChangeLog-pr-11129.yml b/html/changelogs/AutoChangeLog-pr-11129.yml new file mode 100644 index 00000000000..de26a8b8f1b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11129.yml @@ -0,0 +1,4 @@ +author: "iantine" +delete-after: True +changes: + - rscadd: "Adds Lumi's vox suit fluff" diff --git a/html/changelogs/AutoChangeLog-pr-11278.yml b/html/changelogs/AutoChangeLog-pr-11278.yml new file mode 100644 index 00000000000..24f9c3ab4cc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11278.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "Added new Wizard Spell - Summon Ghosts! This nefarious spell will make all ghosts visible to the living. Be careful though, as while they cannot harm you in any way, they might prove a bit.. annoying. Costs 0 points in the Wizard's spellbook." diff --git a/html/changelogs/AutoChangeLog-pr-11283.yml b/html/changelogs/AutoChangeLog-pr-11283.yml new file mode 100644 index 00000000000..9056578d68b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11283.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes a few potential exploits with forcing chem, dust, and explosive implants activating with the deathgasp emote, prior to death" diff --git a/html/changelogs/AutoChangeLog-pr-11284.yml b/html/changelogs/AutoChangeLog-pr-11284.yml new file mode 100644 index 00000000000..433a7fb3f68 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11284.yml @@ -0,0 +1,6 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "Added new Shadowling Ability - Null Charge! This new ability allows Shadowling to completely drain an APC of it's power after a moderate delay. Shadowling must not be interrupted, or the whole process will fail." + - imageadd: "Added custom icon for the Null Charge ability" + - rscdel: "Shadowling Drain Life ability removed" diff --git a/html/changelogs/AutoChangeLog-pr-11292.yml b/html/changelogs/AutoChangeLog-pr-11292.yml new file mode 100644 index 00000000000..814c8530858 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11292.yml @@ -0,0 +1,5 @@ +author: "farie82" +delete-after: True +changes: + - tweak: "Makes puke less lag inducing" + - tweak: "Puke can now appear on all kinds of turfs except spess" diff --git a/html/changelogs/AutoChangeLog-pr-11299.yml b/html/changelogs/AutoChangeLog-pr-11299.yml new file mode 100644 index 00000000000..4994b017d39 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11299.yml @@ -0,0 +1,5 @@ +author: "Kyep" +delete-after: True +changes: + - rscadd: "Added a config file option which allows SSD crew members to be moved to cryo after a defined amount of minutes." + - rscadd: "Added a config file option which causes most people trying to attack/loot/interact with a SSD character to need to confirm they've read the rules before being able to do so." diff --git a/html/changelogs/AutoChangeLog-pr-11300.yml b/html/changelogs/AutoChangeLog-pr-11300.yml new file mode 100644 index 00000000000..b949b7f91f5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11300.yml @@ -0,0 +1,5 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "Added Observer HUD buttons for Jump to Mob, Orbit, Re-enter corpse, and Teleport" + - imageadd: "Added custom icons for Observer HUD buttons" diff --git a/html/changelogs/AutoChangeLog-pr-11312.yml b/html/changelogs/AutoChangeLog-pr-11312.yml new file mode 100644 index 00000000000..c7b31729672 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11312.yml @@ -0,0 +1,4 @@ +author: "farie82" +delete-after: True +changes: + - tweak: "Cure text for Shock and Cardiac failure are more clear now" diff --git a/html/changelogs/AutoChangeLog-pr-11319.yml b/html/changelogs/AutoChangeLog-pr-11319.yml new file mode 100644 index 00000000000..c9c992c83d1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11319.yml @@ -0,0 +1,6 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "Added Floorbot color variants. Different toolboxes will result in a differently colored Floorbots. One even might be a little stronger than others.." + - imageadd: "Added sprites of Floorbot color variants" + - bugfix: "Fixed incorrect amount of required floortiles for the Floorbot in the crafting tab" diff --git a/html/changelogs/AutoChangeLog-pr-11323.yml b/html/changelogs/AutoChangeLog-pr-11323.yml new file mode 100644 index 00000000000..20da5d256b3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11323.yml @@ -0,0 +1,4 @@ +author: "AffectedArc07" +delete-after: True +changes: + - tweak: "Darkmode chat department colors match NTTC theming now" diff --git a/html/changelogs/AutoChangeLog-pr-11328.yml b/html/changelogs/AutoChangeLog-pr-11328.yml new file mode 100644 index 00000000000..e91103f07cd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11328.yml @@ -0,0 +1,5 @@ +author: "farie82" +delete-after: True +changes: + - bugfix: "Admins can now use all mhelp related things again" + - spellcheck: "Fixed the toggle mentor ticket messages text" diff --git a/html/changelogs/AutoChangeLog-pr-11329.yml b/html/changelogs/AutoChangeLog-pr-11329.yml new file mode 100644 index 00000000000..e25e56b8828 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11329.yml @@ -0,0 +1,4 @@ +author: "farie82" +delete-after: True +changes: + - bugfix: "Vampiric glaring is logged now" diff --git a/html/changelogs/AutoChangeLog-pr-11332.yml b/html/changelogs/AutoChangeLog-pr-11332.yml new file mode 100644 index 00000000000..f76e2e2b48b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11332.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "Added an option to grant Martial Arts via administrative Var menu" diff --git a/html/changelogs/AutoChangeLog-pr-11334.yml b/html/changelogs/AutoChangeLog-pr-11334.yml new file mode 100644 index 00000000000..7e119901704 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11334.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - soundadd: "Added deathsound for Silicons" diff --git a/html/changelogs/AutoChangeLog-pr-11335.yml b/html/changelogs/AutoChangeLog-pr-11335.yml new file mode 100644 index 00000000000..084f93320cb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11335.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - tweak: "Dice will now roll when thrown" diff --git a/html/changelogs/AutoChangeLog-pr-11338.yml b/html/changelogs/AutoChangeLog-pr-11338.yml new file mode 100644 index 00000000000..6505d695841 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11338.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - soundadd: "Added sound when adding or removing IDs from ID modification computers" diff --git a/html/changelogs/AutoChangeLog-pr-11340.yml b/html/changelogs/AutoChangeLog-pr-11340.yml new file mode 100644 index 00000000000..3b9d667166a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11340.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - tweak: "Jumpsuits are now removed by clicking instead of clicking and dragging." diff --git a/html/changelogs/AutoChangeLog-pr-11347.yml b/html/changelogs/AutoChangeLog-pr-11347.yml new file mode 100644 index 00000000000..57248e4f861 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11347.yml @@ -0,0 +1,5 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "Added cancel button to transfer amount from stack menu" + - tweak: "Alt-click is a new shortcut to take a custom amount from stack" diff --git a/html/changelogs/AutoChangeLog-pr-11348.yml b/html/changelogs/AutoChangeLog-pr-11348.yml new file mode 100644 index 00000000000..55335793f97 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11348.yml @@ -0,0 +1,5 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "Added shortcuts for handling pumps, volume pumps, filters, and mixers. Ctrl-click these devices to turn them on/off and Alt-click them to set their output to maximum." + - rscadd: "Added ability to rename pumps, volume pumps, filters and mixers with a pen." diff --git a/html/changelogs/AutoChangeLog-pr-11349.yml b/html/changelogs/AutoChangeLog-pr-11349.yml new file mode 100644 index 00000000000..329fec2e5cc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11349.yml @@ -0,0 +1,5 @@ +author: "Arkatos" +delete-after: True +changes: + - soundadd: "Added sound for throwing bolas" + - soundadd: "Added hitsound for all types of bolas" diff --git a/html/changelogs/AutoChangeLog-pr-11351.yml b/html/changelogs/AutoChangeLog-pr-11351.yml new file mode 100644 index 00000000000..8fbca5fe9c0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11351.yml @@ -0,0 +1,5 @@ +author: "Citinited" +delete-after: True +changes: + - bugfix: "Pipe dispensers (the big ones) now work again." + - tweak: "Cooldown on pipe dispensers reduced to 0.4 seconds, down from 1.5 seconds" diff --git a/html/changelogs/AutoChangeLog-pr-11353.yml b/html/changelogs/AutoChangeLog-pr-11353.yml new file mode 100644 index 00000000000..9807b7a0681 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11353.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "Added AntagHUD to everyone at the round end" diff --git a/html/changelogs/AutoChangeLog-pr-11355.yml b/html/changelogs/AutoChangeLog-pr-11355.yml new file mode 100644 index 00000000000..934e85808ba --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11355.yml @@ -0,0 +1,4 @@ +author: "Kyep" +delete-after: True +changes: + - bugfix: "Fixed an error message being inappropriately generated for admins when someone signs up as a pAI." diff --git a/html/changelogs/AutoChangeLog-pr-11356.yml b/html/changelogs/AutoChangeLog-pr-11356.yml new file mode 100644 index 00000000000..d441bd658e1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11356.yml @@ -0,0 +1,4 @@ +author: "McDonald072" +delete-after: True +changes: + - bugfix: "You can no longer examine or teleport things using clipboards" diff --git a/html/changelogs/AutoChangeLog-pr-11360.yml b/html/changelogs/AutoChangeLog-pr-11360.yml new file mode 100644 index 00000000000..3fb01b5b8f9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11360.yml @@ -0,0 +1,6 @@ +author: "AffectedArc07" +delete-after: True +changes: + - rscadd: "SSevents" + - rscadd: "SSholiday" + - tweak: "We no longer check if its Christmas every tick. Dont ask." diff --git a/html/changelogs/AutoChangeLog-pr-11361.yml b/html/changelogs/AutoChangeLog-pr-11361.yml new file mode 100644 index 00000000000..7207d6d5daf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11361.yml @@ -0,0 +1,4 @@ +author: "AffectedArc07" +delete-after: True +changes: + - rscadd: "SSalarms" diff --git a/html/changelogs/AutoChangeLog-pr-11362.yml b/html/changelogs/AutoChangeLog-pr-11362.yml new file mode 100644 index 00000000000..72282104dc1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11362.yml @@ -0,0 +1,4 @@ +author: "uc_guy" +delete-after: True +changes: + - bugfix: "Players in the lobby no longer see cult speak." diff --git a/html/changelogs/AutoChangeLog-pr-11364.yml b/html/changelogs/AutoChangeLog-pr-11364.yml new file mode 100644 index 00000000000..b331b4d009d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11364.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - tweak: "object and fast processing are now proper subsystems" diff --git a/html/changelogs/AutoChangeLog-pr-11365.yml b/html/changelogs/AutoChangeLog-pr-11365.yml new file mode 100644 index 00000000000..fd5fe573104 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11365.yml @@ -0,0 +1,7 @@ +author: "Kyep" +delete-after: True +changes: + - rscadd: "The ID computer now color-codes potential job transfer options, highlighting good choices for a job transfer in green, and bad ones in gray." + - bugfix: "Taking a job transfer now gives you playtime based on your new job, instead of incorrectly still giving you playtime based on your old job." + - tweak: "Job transfers to karma jobs are now possible - if you have the job unlocked." + - rscadd: "Attempting to bypass a job ban via a job transfer now generates a warning to all online admins." diff --git a/html/changelogs/AutoChangeLog-pr-11367.yml b/html/changelogs/AutoChangeLog-pr-11367.yml new file mode 100644 index 00000000000..5d90a0b3f30 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11367.yml @@ -0,0 +1,4 @@ +author: "farie82" +delete-after: True +changes: + - bugfix: "Doctor delight and orange juice now heal again" diff --git a/html/changelogs/AutoChangeLog-pr-11369.yml b/html/changelogs/AutoChangeLog-pr-11369.yml new file mode 100644 index 00000000000..c8bc9be9e2d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11369.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "Circuit Boards now show their required components on examine" diff --git a/html/changelogs/AutoChangeLog-pr-11370.yml b/html/changelogs/AutoChangeLog-pr-11370.yml new file mode 100644 index 00000000000..9cd7a28a5b6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11370.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "Revenants now have randomly generated flavor names" diff --git a/html/changelogs/AutoChangeLog-pr-11371.yml b/html/changelogs/AutoChangeLog-pr-11371.yml new file mode 100644 index 00000000000..220e6962bc5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11371.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - tweak: "You can shift-click any action button to reset it's position. Alt-click on Hide Buttons will reset all action buttons to their default positions." diff --git a/html/changelogs/AutoChangeLog-pr-11372.yml b/html/changelogs/AutoChangeLog-pr-11372.yml new file mode 100644 index 00000000000..963e58006f1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11372.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "Pill Bottles are now printable in the Autolathe. You can find them in the Medical section, and each costs 80 metal and 20 glass to print." diff --git a/html/changelogs/AutoChangeLog-pr-11373.yml b/html/changelogs/AutoChangeLog-pr-11373.yml new file mode 100644 index 00000000000..9f90ffcd554 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11373.yml @@ -0,0 +1,4 @@ +author: "Quantum-M" +delete-after: True +changes: + - rscadd: "Two multicolor pens to the Internal Affairs Office" diff --git a/html/changelogs/AutoChangeLog-pr-11375.yml b/html/changelogs/AutoChangeLog-pr-11375.yml new file mode 100644 index 00000000000..34d17cb10ce --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11375.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - tweak: "Puts beakers in your hand upon eject from chemistry machines" diff --git a/html/changelogs/AutoChangeLog-pr-11376.yml b/html/changelogs/AutoChangeLog-pr-11376.yml new file mode 100644 index 00000000000..c3ed1239eb5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11376.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "Cardboard can now be made in the Biogenerator" diff --git a/html/changelogs/AutoChangeLog-pr-11377.yml b/html/changelogs/AutoChangeLog-pr-11377.yml new file mode 100644 index 00000000000..7b040fcc944 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11377.yml @@ -0,0 +1,5 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "You can now hotswap tanks in a canister or gas pump by clicking it with a new tank!" + - rscadd: "You can now also close a canister's valve and remove the tank inside it by alt-clicking it." diff --git a/html/changelogs/AutoChangeLog-pr-11378.yml b/html/changelogs/AutoChangeLog-pr-11378.yml new file mode 100644 index 00000000000..fefbf428e06 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11378.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "Added examine toolptips. Hover over any equipped or hold item for a little while and it will display the item description as a tooltip." diff --git a/html/changelogs/AutoChangeLog-pr-11381.yml b/html/changelogs/AutoChangeLog-pr-11381.yml new file mode 100644 index 00000000000..604f3096553 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11381.yml @@ -0,0 +1,4 @@ +author: "Ty-Omaha" +delete-after: True +changes: + - tweak: "Moves AI admin log to the all preference" diff --git a/html/changelogs/AutoChangeLog-pr-11389.yml b/html/changelogs/AutoChangeLog-pr-11389.yml new file mode 100644 index 00000000000..90d66861196 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11389.yml @@ -0,0 +1,4 @@ +author: "Kyep" +delete-after: True +changes: + - tweak: "Refactored and improved our entry on the server hub." diff --git a/html/changelogs/AutoChangeLog-pr-11390.yml b/html/changelogs/AutoChangeLog-pr-11390.yml new file mode 100644 index 00000000000..12edd2d1fa2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11390.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes multi-spawn blobs" diff --git a/html/changelogs/AutoChangeLog-pr-11391.yml b/html/changelogs/AutoChangeLog-pr-11391.yml new file mode 100644 index 00000000000..2d23260b1e4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11391.yml @@ -0,0 +1,4 @@ +author: "farie82" +delete-after: True +changes: + - bugfix: "Fixes admin PM's. Bwoinks are back on the menu!" diff --git a/html/changelogs/AutoChangeLog-pr-11393.yml b/html/changelogs/AutoChangeLog-pr-11393.yml new file mode 100644 index 00000000000..955e99dab7a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11393.yml @@ -0,0 +1,6 @@ +author: "Fox McCloud" +delete-after: True +changes: + - tweak: "Powersinks drain rate increased, but they also explode a bit sooner" + - rscadd: "Multitools display total power, load, and free power" + - bugfix: "Fix emitter sparks sparking at the location of emitters where biult as opposed to emitter current location" diff --git a/html/changelogs/AutoChangeLog-pr-11395.yml b/html/changelogs/AutoChangeLog-pr-11395.yml new file mode 100644 index 00000000000..08ad539b42d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11395.yml @@ -0,0 +1,4 @@ +author: "farie82" +delete-after: True +changes: + - bugfix: "Organs will now prompt a update_stat. Meaning that IRCs and the like now get revived when possible when you put their battery and brain in" diff --git a/html/changelogs/AutoChangeLog-pr-11396.yml b/html/changelogs/AutoChangeLog-pr-11396.yml new file mode 100644 index 00000000000..7cbd431c75b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11396.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - bugfix: "Ghost teleport verb will no locker flicker when used" diff --git a/html/changelogs/AutoChangeLog-pr-11397.yml b/html/changelogs/AutoChangeLog-pr-11397.yml new file mode 100644 index 00000000000..c19f8d2bd25 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11397.yml @@ -0,0 +1,7 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "Alt-click now opens and closes fire extinguisher cabinet" + - bugfix: "Fire extinguisher cabinet now properly updates it's sprite correctly when putting fire extinquisher inside the cabinet" + - bugfix: "Fire extinguisher no longer sprays when put into fire extinguisher cabinet with a safety off" + - soundadd: "Added sound for opening and closing fire extinguisher cabinet" diff --git a/html/changelogs/AutoChangeLog-pr-11400.yml b/html/changelogs/AutoChangeLog-pr-11400.yml new file mode 100644 index 00000000000..199c334303b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11400.yml @@ -0,0 +1,6 @@ +author: "Arkatos" +delete-after: True +changes: + - imageadd: "Added new torch sprites" + - tweak: "Torch light color is now orange instead of red" + - bugfix: "Torch sprite now correctly shows all inhand sprites" diff --git a/html/changelogs/AutoChangeLog-pr-11404.yml b/html/changelogs/AutoChangeLog-pr-11404.yml new file mode 100644 index 00000000000..e4161ce9d6c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11404.yml @@ -0,0 +1,4 @@ +author: "farie82" +delete-after: True +changes: + - bugfix: "The typing limiter option should now work for all edge cases. Such as dying while talking and such" diff --git a/html/changelogs/AutoChangeLog-pr-11405.yml b/html/changelogs/AutoChangeLog-pr-11405.yml new file mode 100644 index 00000000000..82b5d6e22c6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11405.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - bugfix: "Removed a useless message that would be sent to admins whenever a drone joins the round." diff --git a/html/changelogs/AutoChangeLog-pr-11406.yml b/html/changelogs/AutoChangeLog-pr-11406.yml new file mode 100644 index 00000000000..4a3191624ea --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11406.yml @@ -0,0 +1,7 @@ +author: "Arkatos" +delete-after: True +changes: + - tweak: "Blob Rally Spores power is now free to use" + - bugfix: "Blob mobs can no longer speak while being dead via Blob Broadcast" + - bugfix: "Blob structures now properly show working animation" + - imageadd: "Added new sprites for variants of Blob resource, factory and storage structures" diff --git a/html/changelogs/AutoChangeLog-pr-11414.yml b/html/changelogs/AutoChangeLog-pr-11414.yml new file mode 100644 index 00000000000..a994f91763e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11414.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - bugfix: "Fixed an issue where admins would receive a message whenever someone joined up as a pAI." diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi index d21323c80b1..b4d8a34a6e0 100644 Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ diff --git a/icons/mob/blob.dmi b/icons/mob/blob.dmi index 4797c79496e..809c68bd59b 100644 Binary files a/icons/mob/blob.dmi and b/icons/mob/blob.dmi differ diff --git a/icons/mob/inhands/fluff_lefthand.dmi b/icons/mob/inhands/fluff_lefthand.dmi index 5f18b1623ab..c2604c8b57c 100644 Binary files a/icons/mob/inhands/fluff_lefthand.dmi and b/icons/mob/inhands/fluff_lefthand.dmi differ diff --git a/icons/mob/inhands/fluff_righthand.dmi b/icons/mob/inhands/fluff_righthand.dmi index 5b7005ab48f..b75a67a7d8e 100644 Binary files a/icons/mob/inhands/fluff_righthand.dmi and b/icons/mob/inhands/fluff_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 42fbccba2b0..35bd70efd28 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index fe096499427..0f2b8b0996d 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/screen_ghost.dmi b/icons/mob/screen_ghost.dmi new file mode 100644 index 00000000000..6519d00aa97 Binary files /dev/null and b/icons/mob/screen_ghost.dmi differ diff --git a/icons/mob/species/vox/uniform.dmi b/icons/mob/species/vox/uniform.dmi index e22a631d6cd..b8169f9bd51 100644 Binary files a/icons/mob/species/vox/uniform.dmi and b/icons/mob/species/vox/uniform.dmi differ diff --git a/icons/obj/aibots.dmi b/icons/obj/aibots.dmi index 273fbf77133..9299c999342 100644 Binary files a/icons/obj/aibots.dmi and b/icons/obj/aibots.dmi differ diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi index e1ca3d3380e..9315f8223af 100644 Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 8934666fddb..a7146793675 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/nano/assets/nanoui.css b/nano/assets/nanoui.css index 598da509f43..158b96ef0ff 100644 --- a/nano/assets/nanoui.css +++ b/nano/assets/nanoui.css @@ -1,2 +1,2 @@ -@charset "utf-8";@font-face{font-family:'FontAwesome';src:url(fontawesome-webfont.eot?v=4.7.0);src:url(fontawesome-webfont.eot?#iefix&v=4.7.0) format('embedded-opentype'),url(fontawesome-webfont.woff2?v=4.7.0) format('woff2'),url(fontawesome-webfont.woff?v=4.7.0) format('woff'),url(fontawesome-webfont.ttf?v=4.7.0) format('truetype'),url(fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul > li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:0.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:0.2em 0.25em 0.15em;border:solid 0.08em #eee;border-radius:0.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:0.3em}.fa.fa-pull-right{margin-left:0.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:0.3em}.fa.pull-right{margin-left:0.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0)}100%{transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.displayBar{position:relative;width:236px;height:16px;border:1px solid #666;float:left;margin:0 5px 0 0;overflow:hidden;background:#000}.displayBarText{position:absolute;top:-2px;left:5px;width:100%;height:100%;color:#fff;font-weight:normal}.displayBarFill{width:0%;height:100%;background:#40628a;overflow:hidden;float:left}.displayBarFill.alignRight{float:right}.displayBarText.good{color:#fff}.displayBarText.notgood{color:#fff}.displayBarText.average{color:#fff}.displayBarText.bad{color:#fff}.displayBarText.highlight{color:#000}.displayBarFill.good{color:#fff;background:#4f7529}.displayBarFill.notgood{color:#fff;background:#ffb400}.displayBarFill.average{color:#fff;background:#cd6500}.displayBarFill.bad{color:#fff;background:#e00}.displayBarFill.highlight{color:#fff;background:#8ba5c4}.disabled,.link,.linkOff,.linkOn,.redButton,.selected,.yellowButton{float:left;min-width:15px;height:16px;text-align:center;color:#fff;text-decoration:none;background:#40628a;border:1px solid #161616;padding:0 4px 4px 4px;margin:0 2px 2px 0;cursor:default;white-space:nowrap}.hasIcon{padding:0 4px 4px 0}.linkActive.hover,.zoomLink.hover,a.hover{background:#507aac}@keyframes pendingAnimation{to{color:#fff;background:#507aac}}.linkPending,.linkPending.hover{animation-name:pendingAnimation;animation-duration:0.25s}a.white,a.white:active,a.white:link,a.white:visited{color:#40628a;text-decoration:none;background:#fff;border:1px solid #161616;padding:1px 4px 1px 4px;margin:0 2px 0 0;cursor:default}a.white.hover{color:#fff;background:#40628a}.linkOn,.selected,a.linkOn.hover,a.linkOn:active,a.linkOn:link,a.linkOn:visited,a.selected.hover,a.selected:active,a.selected:link,a.selected:visited{color:#fff;background:#2f943c}.disabled,.linkOff,a.disabled.hover,a.disabled:active,a.disabled:link,a.disabled:visited,a.linkOff.hover,a.linkOff:active,a.linkOff:link,a.linkOff:visited{color:#fff;background:#999;border-color:#666}.disabled.icon,.linkOff.icon,.linkOn.icon,.selected.icon,a.icon{position:relative;padding:1px 4px 2px 20px}.disabled.icon img,.linkOff.icon img,.linkOn.icon img,.selected.icon img,a.icon img{position:absolute;top:0;left:0;width:18px;height:18px}.linkDanger,a.linkDanger:active,a.linkDanger:link,a.linkDanger:visited{color:#fff;background-color:red;border-color:#a00}.linkDanger.hover{background-color:#f66}.inactive,a.inactive.hover,a.inactive:active,a.inactive:link,a.inactive:visited{color:#fff;background:#999;border-color:#666}.white{color:#fff;font-weight:bold}.good{color:#4f7529;font-weight:bold}.average{color:#cd6500;font-weight:bold}.bad{color:#e00;font-weight:bold}.idle{color:#272727;font-weight:bold}.redButton{background:#ea0000}.yellowButton{background:#cacc00}.highlight{color:#8ba5c4}.dark{color:#272727}.burn{color:orange}.brute{color:red}.toxin{color:green}.toxin_light{color:#3adf00}.oxyloss{color:#00f}.oxyloss_light{color:#6698ff}.Red{color:red}.Blue{color:#00f}.Green{color:#0f0}.Marigold{color:#fda505}.Fuschia{color:#ff0080}.Black{color:#000}.Pearl{color:#c6cacb}.cold1{color:#94b8ff}.cold2{color:#69f}.cold3{color:#293d66}.hot1{color:#f96}.hot2{color:#993d00}.hot3{color:#f60}div.display{padding:4px;margin:6px 0;background-color:#000;background-color:rgba(0, 0, 0, 0.33);box-shadow:inset 0 0 5px rgba(0, 0, 0, 0.5)}div.display header{display:block;position:relative;width:98.5%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}div.display header .buttonRight{position:absolute;bottom:6px;right:4px}div.display article{display:table;width:100%;border-collapse:collapse}.itemGroup{border:1px solid #e9c183;background:#2c2c2c;padding:4px;clear:both}.item{width:100%;margin:4px 0 0 0;clear:both;overflow:auto}.itemContent,.itemContentNarrow{float:left}.itemContentNarrow{width:30%}.itemContent{width:69%}.itemLabel,.itemLabelNarrow,.itemLabelWide,.itemLabelWider,.itemLabelWidest{float:left;color:#e9c183}.itemLabelNarrow{width:20%}.itemLabel{width:30%}.itemLabelWide{width:45%}.itemLabelWider{width:69%}.itemLabelWidest{width:100%}.itemContentWide{float:left;width:79%}.itemContentSmall{float:left;width:33%}.itemContentMedium{float:left;width:55%}.block{padding:8px;margin:10px 4px 4px 4px;border:1px solid #40628a;background-color:#202020}.block h3{padding:0}.clearBoth{clear:both}.clearLeft{clear:left}.clearRight{clear:right}.line{width:100%;clear:both}.fixedLeft{width:110px;float:left}.fixedLeftWide{width:165px;float:left}.fixedLeftWider{width:220px;float:left}.fixedLeftWidest{width:250px;float:left}.floatRight{float:right}.floatLeft{float:left}.hidden{display:none}.statusDisplay{background:#000;background:rgba(0, 0, 0, 0.5);color:#fff;border:1px solid #40628a;padding:4px;margin:3px 0;overflow:hidden}.statusDisplayRecords{background:#000;background:rgba(0, 0, 0, 0.5);color:#fff;border:1px solid #40628a;padding:4px;margin:3px 0;overflow-x:hidden;overflow-y:auto}.statusLabel{width:138px;float:left;overflow:hidden;color:#98b0c3}.statusValue{float:left}.jobValues{float:left;width:30%}.fancy{display:none}i.fancy{display:none}.minimize{color:#e9c183;cursor:pointer!important;z-index:102;position:absolute;top:6px;right:46px}.minimize:hover{color:#b8c9d6}.close{color:#e9c183;cursor:pointer!important;z-index:102;position:absolute;top:4px;right:12px}.close:hover{color:#b8c9d6}#uiCornerTL{position:fixed;z-index:101;min-width:30px;min-height:30px;top:0;left:0;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGTGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE4LTExLTIwVDIyOjM4OjI1LTA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOC0xMS0yMFQyMzowMzowMS0wODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOC0xMS0yMFQyMzowMzowMS0wODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpkOWRlMzc1Yi04ZWQwLWI3NDctOTQzZS0zN2UwZGU2NDkyODQiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo0ZmVhZjJmZC03YWVhLWUyNGQtYTNkZS05ZmI5ZGM0ZTA0YzIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjZTU4OTk5My1mZDU2LTEzNDktYWMyMC03NGZkZmY5NjNjYTgiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmNlNTg5OTkzLWZkNTYtMTM0OS1hYzIwLTc0ZmRmZjk2M2NhOCIgc3RFdnQ6d2hlbj0iMjAxOC0xMS0yMFQyMjozODoyNS0wODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gaW1hZ2UvZ2lmIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZDlkZTM3NWItOGVkMC1iNzQ3LTk0M2UtMzdlMGRlNjQ5Mjg0IiBzdEV2dDp3aGVuPSIyMDE4LTExLTIwVDIzOjAzOjAxLTA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+QnRKRAAAAIhJREFUSIm1zLcRgEAMBMCDokQf9B/SBwQwmOeNzGkL2GnHhgSLrHPSC4Bfny+/vl9y/X6ZdfHS6v/LqasvoW690brzhur+66+Hr7PWvJ5a+Zpr/WurTa+htr7a2vGqat87rt3voI68vTr4Nuv4W68pb6VmvWVNfD81931q+nvVGS+ASUQyXgAHuOgYYwOkhIYAAAAASUVORK5CYII=) no-repeat}.resizeArea{position:absolute;z-index:99999}.resizeArea.top{top:0;left:10px;right:10px;height:5px;cursor:n-resize}.resizeArea.tr{top:0;right:0;height:10px;width:10px;cursor:ne-resize}.resizeArea.right{top:10px;right:0;bottom:10px;width:5px;cursor:e-resize}.resizeArea.br{bottom:0;right:0;height:10px;width:10px;cursor:se-resize}.resizeArea.bottom{bottom:0;left:10px;right:10px;height:5px;cursor:s-resize}.resizeArea.bl{bottom:0;left:0;height:10px;width:10px;cursor:sw-resize}.resizeArea.left{top:10px;left:0;bottom:10px;width:5px;cursor:w-resize}.resizeArea.tl{top:0;left:0;height:10px;width:10px;cursor:nw-resize}.uiLinkPendingIcon{display:none;float:left;width:16px;height:16px;margin:2px 2px 0 2px;background-image:url(uiLinkPendingIcon.gif)}.linkPending .fa{display:none}.linkPending .uiLinkPendingIcon{display:block}.mapIcon16{position:absolute;width:16px;height:16px;background-image:url(uiIcons16Green.png);background-position:-144px -96px;background-repeat:no-repeat;zoom:0.125;margin-left:-1px}.mapIcon16.dead{background-image:url(uiIcons16Red.png)}.mapIcon16.bad{background-image:url(uiIcons16Red.png)}.mapIcon16.average{background-image:url(uiIcons16Orange.png)}.mapIcon16.good{background-image:url(uiIcons16Green.png)}.mapIcon16.icon-airalarm{background-position:0 -144px}.mapIcon16.rank-captain{background-position:-224px -112px}.mapIcon16.rank-headofpersonnel{background-position:-112px -96px}.mapIcon16.rank-headofsecurity{background-position:-112px -128px}.mapIcon16.rank-chiefengineer{background-position:-176px -112px}.mapIcon16.rank-researchdirector{background-position:-128px -128px}.mapIcon16.rank-chiefmedicalofficer{background-position:-32px -128px}.mapIcon16.rank-stationengineer{background-position:-176px -112px}.mapIcon16.rank-atmospherictechnician{background-position:-176px -112px}.mapIcon16.rank-medicaldoctor{background-position:-32px -128px}.mapIcon16.rank-geneticist{background-position:-32px -128px}.mapIcon16.rank-psychiatrist{background-position:-32px -128px}.mapIcon16.rank-chemist{background-position:-32px -128px}.mapIcon16.rank-scientist{background-position:-128px -128px}.mapIcon16.rank-geneticist{background-position:-128px -128px}.mapIcon16.rank-roboticist{background-position:-128px -128px}.mapIcon16.rank-xenobiologist{background-position:-128px -128px}.mapIcon16.rank-warden{background-position:-112px -128px}.mapIcon16.rank-detective{background-position:-112px -128px}.mapIcon16.rank-securityofficer{background-position:-112px -128px}ul{padding:4px 0 0 10px;margin:0;list-style-type:none}li{padding:0 0 2px 0}table.fixed{table-layout:fixed}table.fixed td{overflow:hidden}table.pmon{border:2px solid #4169e1}table.pmon td,table.pmon th{border-bottom:1px dotted #000;padding:0 5px 0 5px}th.command{background:#33f;font-weight:bold;color:#fff}th.sec{background:#8e0000;font-weight:bold;color:#fff}th.med{background:#060;font-weight:bold;color:#fff}th.eng{background:#b27300;font-weight:bold;color:#fff}th.sci{background:#a65ba6;font-weight:bold;color:#fff}th.ser{background:#7100aa;font-weight:bold;color:#fff}th.sup{background:#666621;font-weight:bold;color:#fff}th.civ{background:#a32800;font-weight:bold;color:#fff}th.misc{background:#666;font-weight:bold;color:#fff}span.qm-job{color:#b77a41;font-weight:bold}.striped tr:nth-child(even){background-color:#404040}.striped:not(table) > :nth-child(even){background-color:#404040}#uiNoScript{position:fixed;top:50%;left:50%;margin:-60px 0 0 -150px;width:280px;height:120px;background:#fff;border:2px solid red;color:#000;font-size:10px;font-weight:bold;z-index:9999;padding:0 10px;text-align:center}.notice{position:relative;background:url(uiNoticeBackground.jpg) 50% 50%;color:#000;font-size:12px;font-style:italic;font-weight:bold;padding:3px 4px 3px 4px;margin:4px 0 4px 0}.noticePlaceholder{position:relative;font-size:12px;font-style:italic;font-weight:bold;padding:3px 4px 3px 4px;margin:4px 0 4px 0}.notice.icon{padding:2px 4px 0 20px}.notice img{position:absolute;top:0;left:0;width:16px;height:16px}div.notice{clear:both}.wholeScreen{position:absolute;color:#517087;font-size:16px;font-weight:bold;text-align:center}.pdalink{float:left;white-space:nowrap;cursor:default!important}.pdalink.disabled{background:none;border:none;color:#999;text-align:left}.pdanote{color:#cd6500;font-weight:bold}.item.mainmenu{padding-bottom:0.5em}div.clock{color:#fff;font-weight:bold;float:right;padding-right:2em}#pdaFooter{position:fixed;left:0;bottom:0;width:100%;background:#272727}.pdaFooterButton{width:33%;padding:0.5em 0;font-size:200%;border:none;background:none;color:#fff}.pdaFooterButton.hover{background:#507aac}.pdaFooterButton.disabled{background:none!important;color:#555!important}.pdaFooterButton .uiLinkPendingIcon{position:absolute;width:33%;background-repeat:no-repeat;background-position:center}.dnaBlock{float:left;width:90px;padding:0 0 5px 0}.dnaBlockNumber{font-family:Fixed,monospace;float:left;color:#fff;background:#363636;min-width:20px;height:20px;padding:0;text-align:center}.dnaSubBlock{font-family:Fixed,monospace;float:left;padding:0;min-width:16px;height:20px;text-align:center}.mask{position:fixed;left:0;top:0;width:100%;height:100%;background:url(uiMaskBackground.png)}.maskContent{width:100%;height:200px;margin:200px 0;text-align:center}body{color:#fff;font-family:Verdana,Geneva,sans-serif;font-size:12px;line-height:170%;margin:0;padding:0}hr{background-color:#40628a;height:1px;border:none}a img,img{border-style:none}h1,h2,h3,h4,h5,h6{margin:0;padding:12px 0 6px 0;color:#fff;clear:both}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}*[data-tooltip]{position:relative}*[data-tooltip]::after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";opacity:0;white-space:normal;text-align:left;content:attr(data-tooltip);transition:all 0.5s;border:1px solid #999;background-color:#363636}*[data-tooltip]:hover::after{visibility:visible;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";opacity:1}*[data-tooltip].tooltipTop::after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}*[data-tooltip].tooltipTop:hover::after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}*[data-tooltip].tooltipBottom::after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}*[data-tooltip].tooltipBottom:hover::after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}*[data-tooltip].tooltipLeft::after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}*[data-tooltip].tooltipLeft:hover::after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}*[data-tooltip].tooltipRight::after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}*[data-tooltip].tooltipRight:hover::after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}.mainBG{position:fixed;z-index:-1;top:30px;left:0;right:0;bottom:0;background:url(data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0D%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.0%22%20viewBox%3D%220%200%20425%20200%22%20opacity%3D%22.25%22%3E%0D%0A%20%20%3Cpath%20d%3D%22m%20178.00399%2C0.03869%20-71.20393%2C0%20a%206.7613422%2C6.0255495%200%200%200%20-6.76134%2C6.02555%20l%200%2C187.87147%20a%206.7613422%2C6.0255495%200%200%200%206.76134%2C6.02554%20l%2053.1072%2C0%20a%206.7613422%2C6.0255495%200%200%200%206.76135%2C-6.02554%20l%200%2C-101.544018%2072.21628%2C104.699398%20a%206.7613422%2C6.0255495%200%200%200%205.76015%2C2.87016%20l%2073.55487%2C0%20a%206.7613422%2C6.0255495%200%200%200%206.76135%2C-6.02554%20l%200%2C-187.87147%20a%206.7613422%2C6.0255495%200%200%200%20-6.76135%2C-6.02555%20l%20-54.71644%2C0%20a%206.7613422%2C6.0255495%200%200%200%20-6.76133%2C6.02555%20l%200%2C102.61935%20L%20183.76413%2C2.90886%20a%206.7613422%2C6.0255495%200%200%200%20-5.76014%2C-2.87017%20z%22%20%2F%3E%0D%0A%20%20%3Cpath%20d%3D%22M%204.8446333%2C22.10875%20A%2013.412039%2C12.501842%200%200%201%2013.477588%2C0.03924%20l%2066.118315%2C0%20a%205.3648158%2C5.000737%200%200%201%205.364823%2C5.00073%20l%200%2C79.87931%20z%22%20%2F%3E%0D%0A%20%20%3Cpath%20d%3D%22m%20420.15535%2C177.89119%20a%2013.412038%2C12.501842%200%200%201%20-8.63295%2C22.06951%20l%20-66.11832%2C0%20a%205.3648152%2C5.000737%200%200%201%20-5.36482%2C-5.00074%20l%200%2C-79.87931%20z%22%20%2F%3E%0D%0A%3C%2Fsvg%3E%0D%0A) no-repeat fixed center/70% 70%,linear-gradient(to bottom, #2a2a2a 0, #202020 100%) no-repeat fixed center/100% 100%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a', endColorstr='#ff202020', GradientType=0)}body,html{scrollbar-face-color:#666;scrollbar-arrow-color:#e9c183;scrollbar-track-color:#363636;scrollbar-shadow-color:#555}#uiWrapper{width:100%;height:100%;-ms-user-select:none;user-select:none}#uiTitleWrapper{position:fixed;min-height:30px;min-width:100%;background-color:#363636;left:0;top:0;right:0;overflow:hidden;z-index:100}#uiTitleWrapper > div{cursor:default}#uiTitleWrapper > i{cursor:default}#uiTitleText{position:absolute;top:6px;left:44px;width:66%;overflow:hidden;color:#e9c183;font-size:16px}#uiTitle.icon{padding:6px 8px 6px 42px;background-position:2px 50%;background-repeat:no-repeat}#uiTitleFluff{position:absolute;top:4px;right:12px;width:42px;height:24px;background:url(data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0D%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.0%22%20viewBox%3D%220%200%20425%20200%22%20opacity%3D%22.25%22%3E%0D%0A%20%20%3Cpath%20d%3D%22m%20178.00399%2C0.03869%20-71.20393%2C0%20a%206.7613422%2C6.0255495%200%200%200%20-6.76134%2C6.02555%20l%200%2C187.87147%20a%206.7613422%2C6.0255495%200%200%200%206.76134%2C6.02554%20l%2053.1072%2C0%20a%206.7613422%2C6.0255495%200%200%200%206.76135%2C-6.02554%20l%200%2C-101.544018%2072.21628%2C104.699398%20a%206.7613422%2C6.0255495%200%200%200%205.76015%2C2.87016%20l%2073.55487%2C0%20a%206.7613422%2C6.0255495%200%200%200%206.76135%2C-6.02554%20l%200%2C-187.87147%20a%206.7613422%2C6.0255495%200%200%200%20-6.76135%2C-6.02555%20l%20-54.71644%2C0%20a%206.7613422%2C6.0255495%200%200%200%20-6.76133%2C6.02555%20l%200%2C102.61935%20L%20183.76413%2C2.90886%20a%206.7613422%2C6.0255495%200%200%200%20-5.76014%2C-2.87017%20z%22%20%2F%3E%0D%0A%20%20%3Cpath%20d%3D%22M%204.8446333%2C22.10875%20A%2013.412039%2C12.501842%200%200%201%2013.477588%2C0.03924%20l%2066.118315%2C0%20a%205.3648158%2C5.000737%200%200%201%205.364823%2C5.00073%20l%200%2C79.87931%20z%22%20%2F%3E%0D%0A%20%20%3Cpath%20d%3D%22m%20420.15535%2C177.89119%20a%2013.412038%2C12.501842%200%200%201%20-8.63295%2C22.06951%20l%20-66.11832%2C0%20a%205.3648152%2C5.000737%200%200%201%20-5.36482%2C-5.00074%20l%200%2C-79.87931%20z%22%20%2F%3E%0D%0A%3C%2Fsvg%3E%0D%0A) 50% 50% no-repeat}.statusicon{position:absolute;top:4px;left:12px}#uiMapWrapper{clear:both;padding:8px;margin-top:30px}#uiMapHeader{position:relative;clear:both}#uiMapContainer{position:relative;width:100%;height:600px;overflow:hidden;border:1px solid #40628a;background:url(nanomapBackground.png)}#uiMap{position:absolute;top:50%;left:50%;margin:-512px 0 0 -512px;width:256px;height:256px;overflow:hidden;zoom:4}#uiMapImage{position:absolute;bottom:1px;left:1px;width:256px;height:256px}#uiMapContent{position:absolute;bottom:-13.5px;left:0;width:256px;height:256px}#uiMapFooter{position:relative;clear:both}#uiContent{clear:both;padding:8px;margin-top:30px}#uiMapTooltip{position:absolute;right:10px;top:10px;border:1px solid #40628a;background-color:#272727;padding:8px;display:none;z-index:9999}#uiLoadingNotice{position:relative;background:url(uiNoticeBackground.jpg) 50% 50%;color:#000;font-size:14px;font-style:italic;font-weight:bold;padding:3px 4px 3px 4px;margin:4px 0 4px 0}.underTitle{margin-top:30px} -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBhdGgubGVzcyIsInNjcmVlbi1yZWFkZXIubGVzcyIsImNvcmUubGVzcyIsImxhcmdlci5sZXNzIiwiZml4ZWQtd2lkdGgubGVzcyIsImxpc3QubGVzcyIsImJvcmRlcmVkLXB1bGxlZC5sZXNzIiwiYW5pbWF0ZWQubGVzcyIsIm1peGlucy5sZXNzIiwibmFub3VpLmNzcyIsInJvdGF0ZWQtZmxpcHBlZC5sZXNzIiwic3RhY2tlZC5sZXNzIiwiaWNvbnMubGVzcyIsIl9iYXJzLmxlc3MiLCJfbGluay5sZXNzIiwiX2NvbG9yLmxlc3MiLCJfZGlzcGxheS5sZXNzIiwiX2Zvcm1hdHRpbmcubGVzcyIsIl9mYW5jeS5sZXNzIiwiX2ljb24ubGVzcyIsIl9saXN0cy5sZXNzIiwiX21pc2MubGVzcyIsIl9uYXRpdmUubGVzcyIsIl90b29sdGlwLmxlc3MiLCI8bm8gc291cmNlPiIsIm5hbm91aS5sZXNzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJpQkFHQSxXQUNFLFlBQUEsY0FDQSxJQUFBLHFDQUNBLElBQUEsNENBQUEsMkJBQUEsQ0FBQSx1Q0FBQSxlQUFBLENBQUEsc0NBQUEsY0FBQSxDQUFBLHFDQUFBLGtCQUFBLENBQUEsd0RBQUEsY0FNQSxZQUFBLE9BQ0EsV0FBQSxPQ2JELElDSUMsUUFBQSxhQUNBLEtBQUEsT0FBQSxPQUFBLE9BQUEsSUFBQSxDQUFBLEVBQUEsWUFDQSxVQUFBLFFBQ0EsZUFBQSxLQUNBLHVCQUFBLFlBQ0Esd0JBQUEsVURURCxPRUtDLFVBQUEsYUFDQSxZQUFBLE9BQ0EsZUFBQSxLRlBELE9FU3NCLFVBQUEsSUZUdEIsT0VVc0IsVUFBQSxJRlZ0QixPRVdzQixVQUFBLElGWHRCLE9FWXNCLFVBQUEsSUZadEIsT0dHQyxNQUFBLGFBQ0EsV0FBQSxPSEpELE9JSUMsYUFBQSxFQUNBLFlBQUEsYUFDQSxnQkFBQSxLSk5ELFlJT1EsU0FBQSxTSlBSLE9JVUMsU0FBQSxTQUNBLEtBQUEsY0FDQSxNQUFBLGFBQ0EsSUFBQSxhQUNBLFdBQUEsT0pkRCxhSWdCRyxLQUFBLGNKaEJILFdLSUMsUUFBQSxNQUFBLE9BQUEsT0FDQSxPQUFBLE1BQUEsT0FBQSxLQUNBLGNBQUEsTUxORCxjS1M2QixNQUFBLEtMVDdCLGVLVThCLE1BQUEsTUxWOUIsaUJLYWdDLGFBQUEsTUxiaEMsa0JLY2lDLFlBQUEsTUFJbEMsWUFBYyxNQUFBLE1BQ2QsV0FBYSxNQUFBLEtBR1gsY0FBYyxhQUFBLE1BQ2QsZUFBZSxZQUFBLE1MdkJoQixTTUtTLFVBQUEsUUFBQSxHQUFBLFNBQUEsT05MVCxVTVVTLFVBQUEsUUFBQSxHQUFBLFNBQUEsU0FjVixtQkFDRSxHQUVVLFVBQUEsVUFFVixLQUVVLFVBQUEsZ0JOL0JYLGNPY0MsV0FBQSwyREFFSSxjQUFBLGNBQ0ksVUFBQSxjUGpCVCxlT2NDLFdBQUEsMkRBRUksY0FBQSxlQUNJLFVBQUEsZVBqQlQsZU9jQyxXQUFBLDJEQUVJLGNBQUEsZUFDSSxVQUFBLGVQakJULG9CT3FCQyxXQUFBLHFFQUVJLGNBQUEsYUFDSSxVQUFBLGFQeEJULGtCT3FCQyxXQUFBLHFFQUVJLGNBQUEsYUFDSSxVQUFBLGFDNkdWLDBCQUNBLHdCQUhBLHFCQUNBLHFCUnBJQyxvQlNrQkMsT0FBQSxLVGxCRCxVVUlDLFNBQUEsU0FDQSxRQUFBLGFBQ0EsTUFBQSxJQUNBLE9BQUEsSUFDQSxZQUFBLElBQ0EsZUFBQSxPVlRELGFRa0pELGFFdElFLFNBQUEsU0FDQSxLQUFBLEVBQ0EsTUFBQSxLQUNBLFdBQUEsT1ZmRCxhVWlCNEIsWUFBQSxRVmpCNUIsYVVrQjRCLFVBQUEsSVZsQjVCLFlVbUIyQixNQUFBLEtWbkIzQixpQldHZ0MsUUFBQSxRWEhoQyxpQldJZ0MsUUFBQSxRWEpoQyxrQldLaUMsUUFBQSxRWExqQyxzQldNcUMsUUFBQSxRWE5yQyxpQldPZ0MsUUFBQSxRWFBoQyxnQldRK0IsUUFBQSxRWFIvQixrQldTaUMsUUFBQSxRWFRqQyxnQldVK0IsUUFBQSxRWFYvQixnQldXK0IsUUFBQSxRWFgvQixvQldZbUMsUUFBQSxRWFpuQyxjV2E2QixRQUFBLFFYYjdCLG1CV2NrQyxRQUFBLFFYZGxDLGlCV2VnQyxRQUFBLFFINExqQyxpQlIzTUMsa0JRNE1ELGlCRzFMaUMsUUFBQSxRWGxCaEMsdUJXbUJzQyxRQUFBLFFYbkJ0Qyx3QldvQnVDLFFBQUEsUVhwQnZDLHFCV3FCb0MsUUFBQSxRWHJCcEMsa0JXc0JpQyxRQUFBLFFIc01sQyxlUjVOQyxnQld3QjhCLFFBQUEsUVh4QjlCLG1CV3lCa0MsUUFBQSxRWHpCbEMsZ0JXMEIrQixRQUFBLFFYMUIvQixrQlcyQmlDLFFBQUEsUVgzQmpDLG1CVzRCa0MsUUFBQSxRWDVCbEMsZ0JXNkIrQixRQUFBLFFYN0IvQixvQlc4Qm1DLFFBQUEsUVg5Qm5DLCtCVytCOEMsUUFBQSxRWC9COUMsNkJXZ0M0QyxRQUFBLFFYaEM1QyxpQldpQ2dDLFFBQUEsUVhqQ2hDLHlCV2tDd0MsUUFBQSxRSDROekMsa0JSOVBDLHdCV29DaUMsUUFBQSxRWHBDakMsbUJXcUNrQyxRQUFBLFFYckNsQyxvQldzQ21DLFFBQUEsUVh0Q25DLGdCV3VDK0IsUUFBQSxRWHZDL0IsZ0JXd0MrQixRQUFBLFFYeEMvQixzQld5Q3FDLFFBQUEsUVh6Q3JDLHNCVzBDcUMsUUFBQSxRWDFDckMsdUJXMkNzQyxRQUFBLFFYM0N0QyxxQlc0Q29DLFFBQUEsUVg1Q3BDLGtCVzZDaUMsUUFBQSxRWDdDakMsbUJXOENrQyxRQUFBLFFYOUNsQyxlVytDOEIsUUFBQSxRWC9DOUIsZ0JXZ0QrQixRQUFBLFFYaEQvQixnQldpRCtCLFFBQUEsUVhqRC9CLG9CV2tEbUMsUUFBQSxRWGxEbkMsaUJXbURnQyxRQUFBLFFYbkRoQyxrQldvRGlDLFFBQUEsUVhwRGpDLGdCV3FEK0IsUUFBQSxRWHJEL0IsZ0JXc0QrQixRQUFBLFFYdEQvQixrQld1RGlDLFFBQUEsUVh2RGpDLHVCV3dEc0MsUUFBQSxRWHhEdEMsc0JXeURxQyxRQUFBLFFYekRyQyxzQlcwRHFDLFFBQUEsUVgxRHJDLHdCVzJEdUMsUUFBQSxRWDNEdkMsdUJXNERzQyxRQUFBLFFYNUR0Qyx5Qlc2RHdDLFFBQUEsUVg3RHhDLGdCVzhEK0IsUUFBQSxRWDlEL0Isa0JRZ1ZELG1CR2hSbUMsUUFBQSxRWGhFbEMsa0JXaUVpQyxRQUFBLFFYakVqQyx3QldrRXVDLFFBQUEsUUh3UnhDLGlCUjFWQyxpQlEyVkQscUJHdFJxQyxRQUFBLFFYckVwQyxrQldzRWlDLFFBQUEsUVh0RWpDLHNCV3VFcUMsUUFBQSxRWHZFckMsa0JXd0VpQyxRQUFBLFFYeEVqQyxnQld5RStCLFFBQUEsUVh6RS9CLGdCUTJXRCwyQkdoUzJDLFFBQUEsUVgzRTFDLDBCVzRFeUMsUUFBQSxRWDVFekMsMEJXNkV5QyxRQUFBLFFYN0V6QyxrQlc4RWlDLFFBQUEsUVg5RWpDLHlCVytFd0MsUUFBQSxRWC9FeEMseUJXZ0Z3QyxRQUFBLFFYaEZ4QyxvQldpRm1DLFFBQUEsUVhqRm5DLGdCV2tGK0IsUUFBQSxRWGxGL0IsaUJXbUZnQyxRQUFBLFFYbkZoQyxnQldvRitCLFFBQUEsUVhwRi9CLG1CV3FGa0MsUUFBQSxRWHJGbEMsd0JXc0Z1QyxRQUFBLFFYdEZ2Qyx3Qld1RnVDLFFBQUEsUVh2RnZDLGlCV3dGZ0MsUUFBQSxRWHhGaEMsd0JXeUZ1QyxRQUFBLFFYekZ2Qyx5QlcwRndDLFFBQUEsUVgxRnhDLHVCVzJGc0MsUUFBQSxRWDNGdEMsd0JXNEZ1QyxRQUFBLFFYNUZ2Qyx3Qlc2RnVDLFFBQUEsUVg3RnZDLHdCVzhGdUMsUUFBQSxRWDlGdkMsMkJXK0YwQyxRQUFBLFFYL0YxQyx1QldnR3NDLFFBQUEsUVhoR3RDLHNCV2lHcUMsUUFBQSxRWGpHckMsMEJXa0d5QyxRQUFBLFFYbEd6QywwQldtR3lDLFFBQUEsUVhuR3pDLGVXb0c4QixRQUFBLFFYcEc5QixzQldxR3FDLFFBQUEsUVhyR3JDLHVCV3NHc0MsUUFBQSxRWHRHdEMsb0JXdUdtQyxRQUFBLFFYdkduQyxzQld3R3FDLFFBQUEsUVh4R3JDLHdCUXNjRCxpQkc1VmlDLFFBQUEsUVgxR2hDLGtCVzJHaUMsUUFBQSxRWDNHakMsb0JXNEdtQyxRQUFBLFFYNUduQyxnQlc2RytCLFFBQUEsUVg3Ry9CLGlCVzhHZ0MsUUFBQSxRWDlHaEMsb0JXK0dtQyxRQUFBLFFYL0duQyw4QldnSDZDLFFBQUEsUVhoSDdDLGdCV2lIK0IsUUFBQSxRWGpIL0IsZ0JXa0grQixRQUFBLFFYbEgvQixnQldtSCtCLFFBQUEsUVhuSC9CLGVXb0g4QixRQUFBLFFYcEg5QixxQldxSG9DLFFBQUEsUUhzWHJDLGdDUjNlQyxtQld1SCtDLFFBQUEsUVh2SC9DLGlCV3dIZ0MsUUFBQSxRWHhIaEMsb0JXeUhtQyxRQUFBLFFYekhuQyxrQlcwSGlDLFFBQUEsUVgxSGpDLG1CVzJIa0MsUUFBQSxRWDNIbEMsa0JXNEhpQyxRQUFBLFFYNUhqQyxzQlc2SHFDLFFBQUEsUVg3SHJDLHdCVzhIdUMsUUFBQSxRWDlIdkMsbUJXK0hrQyxRQUFBLFFYL0hsQyx5QldnSXdDLFFBQUEsUVhoSXhDLGtCV2lJaUMsUUFBQSxRWGpJakMsdUJXa0lzQyxRQUFBLFFYbEl0QyxvQldtSW1DLFFBQUEsUVhuSW5DLG9CV29JbUMsUUFBQSxRWHBJbkMsdUJRc2hCRCxxQkdoWnFDLFFBQUEsUVh0SXBDLDBCV3VJeUMsUUFBQSxRWHZJekMsMkJXd0kwQyxRQUFBLFFYeEkxQyx3Qld5SXVDLFFBQUEsUVh6SXZDLGVXMEk4QixRQUFBLFFINFovQixnQlJ0aUJDLGlCVzRJK0IsUUFBQSxRWDVJL0Isb0JXNkltQyxRQUFBLFFYN0luQyx1Qlc4SXNDLFFBQUEsUVg5SXRDLHlCVytJd0MsUUFBQSxRWC9JeEMscUJXZ0pvQyxRQUFBLFFYaEpwQyxtQldpSmtDLFFBQUEsUVhqSmxDLG9CV2tKbUMsUUFBQSxRWGxKbkMsMkJXbUowQyxRQUFBLFFYbkoxQyxzQldvSnFDLFFBQUEsUVhwSnJDLHlCV3FKd0MsUUFBQSxRWHJKeEMsbUJXc0prQyxRQUFBLFFYdEpsQyxrQld1SmlDLFFBQUEsUVh2SmpDLHlCV3dKd0MsUUFBQSxRWHhKeEMsa0JXeUppQyxRQUFBLFFYekpqQyxtQlcwSmtDLFFBQUEsUVgxSmxDLGlCVzJKZ0MsUUFBQSxRWDNKaEMsb0JXNEptQyxRQUFBLFFYNUpuQyxzQlc2SnFDLFFBQUEsUVg3SnJDLHdCVzhKdUMsUUFBQSxRWDlKdkMsbUJXK0prQyxRQUFBLFFYL0psQyxzQlFtbUJELG9CR2xjb0MsUUFBQSxRWGpLbkMsa0JXa0tpQyxRQUFBLFFYbEtqQyxrQldtS2lDLFFBQUEsUVhuS2pDLHVCV29Lc0MsUUFBQSxRWHBLdEMsZ0JRZ25CRCxlRzFjK0IsUUFBQSxRWHRLOUIsaUJXdUtnQyxRQUFBLFFYdktoQyxvQld3S21DLFFBQUEsUVh4S25DLGdCV3lLK0IsUUFBQSxRWHpLL0IsdUJXMEtzQyxRQUFBLFFYMUt0Qyx3QlcyS3VDLFFBQUEsUVgzS3ZDLHVCVzRLc0MsUUFBQSxRWDVLdEMscUJXNktvQyxRQUFBLFFYN0twQyx1Qlc4S3NDLFFBQUEsUVg5S3RDLDZCVytLNEMsUUFBQSxRWC9LNUMsOEJXZ0w2QyxRQUFBLFFYaEw3QywyQldpTDBDLFFBQUEsUVhqTDFDLDZCV2tMNEMsUUFBQSxRWGxMNUMsaUJXbUxnQyxRQUFBLFFYbkxoQyxrQldvTGlDLFFBQUEsUVhwTGpDLGlCV3FMZ0MsUUFBQSxRWHJMaEMsa0JXc0xpQyxRQUFBLFFYdExqQyxxQld1TG9DLFFBQUEsUVh2THBDLHNCV3dMcUMsUUFBQSxRWHhMckMsaUJRMHFCRCxpQkdoZmlDLFFBQUEsUVgxTGhDLGlCUThxQkQsZ0JHbGZnQyxRQUFBLFFYNUwvQixpQlc2TGdDLFFBQUEsUVg3TGhDLGlCVzhMZ0MsUUFBQSxRWDlMaEMsZVF3ckJELG9CR3hmb0MsUUFBQSxRWGhNbkMsZ0JRNHJCRCxtQkcxZm1DLFFBQUEsUVhsTWxDLHFCV21Nb0MsUUFBQSxRSGdnQnJDLG9CUm5zQkMsZ0JXcU1tQyxRQUFBLFFYck1uQyxrQldzTWlDLFFBQUEsUUhxZ0JsQyxnQlIzc0JDLG1CUTBzQkQsbUJHamdCZ0MsUUFBQSxRWHpNL0IsbUJXME1rQyxRQUFBLFFYMU1sQyxtQlcyTWtDLFFBQUEsUVgzTWxDLHlCVzRNd0MsUUFBQSxRWDVNeEMscUJXNk1vQyxRQUFBLFFYN01wQyxpQlc4TWdDLFFBQUEsUVg5TWhDLGlCVytNZ0MsUUFBQSxRWC9NaEMsaUJXZ05nQyxRQUFBLFFYaE5oQyxxQldpTm9DLFFBQUEsUVhqTnBDLDRCV2tOMkMsUUFBQSxRWGxOM0MsOEJXbU42QyxRQUFBLFFYbk43Qyx1QldvTnNDLFFBQUEsUVhwTnRDLGlCV3FOZ0MsUUFBQSxRWHJOaEMsc0JXc05xQyxRQUFBLFFYdE5yQyxvQld1Tm1DLFFBQUEsUVh2Tm5DLHNCV3dOcUMsUUFBQSxRWHhOckMsdUJXeU5zQyxRQUFBLFFYek50QyxtQlcwTmtDLFFBQUEsUUh3aUJuQyxnQlJsd0JDLG9CVzROK0IsUUFBQSxRSDBpQmhDLHFCUnR3QkMscUJXOE5vQyxRQUFBLFFINGlCckMsb0JSMXdCQyxtQldnT21DLFFBQUEsUVhoT25DLG9CV2lPbUMsUUFBQSxRWGpPbkMsb0JXa09tQyxRQUFBLFFYbE9uQyx1QlFveEJELGdCR2hqQmdDLFFBQUEsUUhvakJoQyxpQlJ4eEJDLGlCV3NPZ0MsUUFBQSxRWHRPaEMscUJRNHhCRCxzQkdwakJzQyxRQUFBLFFYeE9yQyxxQld5T29DLFFBQUEsUVh6T3BDLHNCVzBPcUMsUUFBQSxRSDRqQnRDLGdCUnR5QkMsaUJXNE8rQixRQUFBLFFYNU8vQixtQlc2T2tDLFFBQUEsUVg3T2xDLG9CVzhPbUMsUUFBQSxRSGtrQnBDLHFCUmh6QkMsaUJXZ1BvQyxRQUFBLFFYaFBwQyx1QldpUHNDLFFBQUEsUVhqUHRDLG9CV2tQbUMsUUFBQSxRWGxQbkMsMEJXbVB5QyxRQUFBLFFYblB6Qyx3QldvUHVDLFFBQUEsUVhwUHZDLG1CV3FQa0MsUUFBQSxRWHJQbEMsdUJXc1BzQyxRQUFBLFFYdFB0QyxvQld1UG1DLFFBQUEsUVh2UG5DLGtCV3dQaUMsUUFBQSxRWHhQakMsa0JXeVBpQyxRQUFBLFFYelBqQyxtQlcwUGtDLFFBQUEsUVgxUGxDLHVCVzJQc0MsUUFBQSxRWDNQdEMsc0JXNFBxQyxRQUFBLFFYNVByQyxzQlc2UHFDLFFBQUEsUVg3UHJDLHFCVzhQb0MsUUFBQSxRWDlQcEMsa0JXK1BpQyxRQUFBLFFYL1BqQyx1QldnUXNDLFFBQUEsUVhoUXRDLGdCV2lRK0IsUUFBQSxRWGpRL0Isb0JXa1FtQyxRQUFBLFFYbFFuQyx1QldtUXNDLFFBQUEsUVhuUXRDLDZCV29RNEMsUUFBQSxRWHBRNUMsOEJXcVE2QyxRQUFBLFFYclE3QywyQldzUTBDLFFBQUEsUVh0UTFDLDZCV3VRNEMsUUFBQSxRWHZRNUMsc0JXd1FxQyxRQUFBLFFYeFFyQyx1Qld5UXNDLFFBQUEsUVh6UXRDLG9CVzBRbUMsUUFBQSxRWDFRbkMsc0JXMlFxQyxRQUFBLFFYM1FyQyxtQlc0UWtDLFFBQUEsUVg1UWxDLGtCVzZRaUMsUUFBQSxRWDdRakMsa0JXOFFpQyxRQUFBLFFYOVFqQyx3QlE4NEJELGtCRzluQmtDLFFBQUEsUVhoUmpDLG9CV2lSbUMsUUFBQSxRWGpSbkMsc0JXa1JxQyxRQUFBLFFYbFJyQyx1QldtUnNDLFFBQUEsUVhuUnRDLG1CV29Sa0MsUUFBQSxRWHBSbEMsa0JXcVJpQyxRQUFBLFFYclJqQyxzQlFpNkJELGlCRzFvQmlDLFFBQUEsUVh2UmhDLHNCV3dScUMsUUFBQSxRWHhSckMsb0JXeVJtQyxRQUFBLFFYelJuQyx5QlcwUndDLFFBQUEsUVgxUnhDLG1CVzJSa0MsUUFBQSxRWDNSbEMsbUJXNFJrQyxRQUFBLFFYNVJsQyxpQlc2UmdDLFFBQUEsUVg3UmhDLG1CVzhSa0MsUUFBQSxRWDlSbEMsc0JXK1JxQyxRQUFBLFFYL1JyQyxrQldnU2lDLFFBQUEsUVhoU2pDLDBCV2lTeUMsUUFBQSxRWGpTekMsb0JXa1NtQyxRQUFBLFFYbFNuQyxnQldtUytCLFFBQUEsUVhuUy9CLDBCUXk4QkQscUJHcHFCcUMsUUFBQSxRWHJTcEMsMkJRNjhCRCwwQkFDQSx1Qkd0cUJ1QyxRQUFBLFFYeFN0QywwQld5U3lDLFFBQUEsUVh6U3pDLGdCVzBTK0IsUUFBQSxRWDFTL0IscUJXMlNvQyxRQUFBLFFIZ3JCckMsd0JSMzlCQyxrQlc2U3VDLFFBQUEsUVg3U3ZDLG9CVzhTbUMsUUFBQSxRWDlTbkMsZ0JXK1MrQixRQUFBLFFYL1MvQix1QldnVHNDLFFBQUEsUVhoVHRDLHVCV2lUc0MsUUFBQSxRWGpUdEMscUJXa1RvQyxRQUFBLFFYbFRwQyxrQldtVGlDLFFBQUEsUVhuVGpDLHdCV29UdUMsUUFBQSxRWHBUdkMsc0JXcVRxQyxRQUFBLFFYclRyQyw0QldzVDJDLFFBQUEsUVh0VDNDLGtCV3VUaUMsUUFBQSxRWHZUakMsc0JXd1RxQyxRQUFBLFFYeFRyQyw2Qld5VDRDLFFBQUEsUVh6VDVDLGtCVzBUaUMsUUFBQSxRWDFUakMsa0JXMlRpQyxRQUFBLFFYM1RqQywrQlc0VDhDLFFBQUEsUVg1VDlDLGdDVzZUK0MsUUFBQSxRWDdUL0MsNkJXOFQ0QyxRQUFBLFFYOVQ1QywrQlcrVDhDLFFBQUEsUVgvVDlDLGlCV2dVZ0MsUUFBQSxRWGhVaEMsZ0JXaVUrQixRQUFBLFFYalUvQixrQldrVWlDLFFBQUEsUVhsVWpDLHNCV21VcUMsUUFBQSxRWG5VckMsb0JXb1VtQyxRQUFBLFFYcFVuQyxzQldxVXFDLFFBQUEsUVhyVXJDLHNCV3NVcUMsUUFBQSxRWHRVckMsc0JXdVVxQyxRQUFBLFFYdlVyQyx1Qld3VXNDLFFBQUEsUVh4VXRDLGtCV3lVaUMsUUFBQSxRWHpVakMsd0JXMFV1QyxRQUFBLFFYMVV2QywwQlcyVXlDLFFBQUEsUVgzVXpDLG9CVzRVbUMsUUFBQSxRWDVVbkMsc0JXNlVxQyxRQUFBLFFYN1VyQyx3Qlc4VXVDLFFBQUEsUVg5VXZDLHlCVytVd0MsUUFBQSxRWC9VeEMsZ0NXZ1YrQyxRQUFBLFFYaFYvQyx3QldpVnVDLFFBQUEsUVhqVnZDLG1CV2tWa0MsUUFBQSxRSDR2Qm5DLCtCUjlrQ0MsdUJXb1Y4QyxRQUFBLFFIOHZCL0MsNkJSbGxDQyxxQldzVjRDLFFBQUEsUUhnd0I3QyxnQ1J0bENDLHdCV3dWK0MsUUFBQSxRSGt3QmhELGVSMWxDQyxnQlcwVjhCLFFBQUEsUVgxVjlCLGVXMlY4QixRQUFBLFFYM1Y5QixrQlFpbUNELGVHcHdCK0IsUUFBQSxRSHd3Qi9CLGVScm1DQyxpQlcrVjhCLFFBQUEsUVgvVjlCLGVRMm1DRCxlQUZBLGVBQ0EsZUd2d0IrQixRQUFBLFFINHdCL0Isa0JBQ0EsZVJobkNDLGlCV3NXOEIsUUFBQSxRSDh3Qi9CLGVScG5DQyxlV3dXOEIsUUFBQSxRWHhXOUIsbUJRd25DRCxlRzl3QitCLFFBQUEsUVgxVzlCLGdCVzJXK0IsUUFBQSxRWDNXL0IscUJXNFdvQyxRQUFBLFFYNVdwQywwQlc2V3lDLFFBQUEsUVg3V3pDLDJCVzhXMEMsUUFBQSxRWDlXMUMsMkJXK1cwQyxRQUFBLFFYL1cxQyw0QldnWDJDLFFBQUEsUVhoWDNDLDRCV2lYMkMsUUFBQSxRWGpYM0MsNkJXa1g0QyxRQUFBLFFYbFg1QyxxQldtWG9DLFFBQUEsUVhuWHBDLHVCV29Yc0MsUUFBQSxRWHBYdEMsMEJXcVh5QyxRQUFBLFFYclh6QyxtQldzWGtDLFFBQUEsUVh0WGxDLGdCV3VYK0IsUUFBQSxRWHZYL0IsdUJXd1hzQyxRQUFBLFFYeFh0Qyx3Qld5WHVDLFFBQUEsUVh6WHZDLG1CVzBYa0MsUUFBQSxRWDFYbEMsMEJXMlh5QyxRQUFBLFFYM1h6QyxxQlc0WG9DLFFBQUEsUVg1WHBDLGtCVzZYaUMsUUFBQSxRWDdYakMsZVc4WDhCLFFBQUEsUVg5WDlCLHFCVytYb0MsUUFBQSxRWC9YcEMsNEJXZ1kyQyxRQUFBLFFYaFkzQyxrQldpWWlDLFFBQUEsUVhqWWpDLHlCV2tZd0MsUUFBQSxRWGxZeEMsMkJXbVkwQyxRQUFBLFFYblkxQyx5QldvWXdDLFFBQUEsUVhwWXhDLDJCV3FZMEMsUUFBQSxRWHJZMUMsNEJXc1kyQyxRQUFBLFFYdFkzQyxpQld1WWdDLFFBQUEsUVh2WWhDLG1CV3dZa0MsUUFBQSxRWHhZbEMsbUJXeVlrQyxRQUFBLFFYellsQyxpQlcwWWdDLFFBQUEsUVgxWWhDLG9CVzJZbUMsUUFBQSxRWDNZbkMsaUJXNFlnQyxRQUFBLFFYNVloQyxzQlc2WXFDLFFBQUEsUVg3WXJDLGtCVzhZaUMsUUFBQSxRWDlZakMsa0JXK1lpQyxRQUFBLFFYL1lqQyxnQldnWitCLFFBQUEsUVhoWi9CLGtCUTh1Q0Qsb0JHNTFCb0MsUUFBQSxRWGxabkMsaUJXbVpnQyxRQUFBLFFYblpoQyxrQldvWmlDLFFBQUEsUVhwWmpDLG1CV3Faa0MsUUFBQSxRWHJabEMsZVdzWjhCLFFBQUEsUVh0WjlCLGNXdVo2QixRQUFBLFFYdlo3QixpQld3WmdDLFFBQUEsUVh4WmhDLGtCV3laaUMsUUFBQSxRWHpaakMscUJXMFpvQyxRQUFBLFFYMVpwQywwQlcyWnlDLFFBQUEsUVgzWnpDLGdDVzRaK0MsUUFBQSxRWDVaL0MsK0JXNlo4QyxRQUFBLFFIczNCL0MsK0JSbnhDQyx1QlcrWjhDLFFBQUEsUVgvWjlDLHdCV2dhdUMsUUFBQSxRWGhhdkMsc0JXaWFxQyxRQUFBLFFYamFyQyx3QldrYXVDLFFBQUEsUUg4M0J4QyxlUmh5Q0Msd0JXb2E4QixRQUFBLFFYcGE5Qix5QldxYXdDLFFBQUEsUVhyYXhDLHlCV3Nhd0MsUUFBQSxRWHRheEMsaUJXdWFnQyxRQUFBLFFYdmFoQywyQld3YTBDLFFBQUEsUVh4YTFDLHFCV3lhb0MsUUFBQSxRWHphcEMsa0JXMGFpQyxRQUFBLFFINDRCbEMsZ0JSdHpDQyx1QlF1ekNELHNCRzE0QnNDLFFBQUEsUUg4NEJ0QywwQlIzekNDLHdCVytheUMsUUFBQSxRWC9hekMsaUJXZ2JnQyxRQUFBLFFYaGJoQyxrQldpYmlDLFFBQUEsUVhqYmpDLGtCV2tiaUMsUUFBQSxRWGxiakMseUJXbWJ3QyxRQUFBLFFYbmJ4Qyw4QldvYjZDLFFBQUEsUVhwYjdDLHVCV3Fic0MsUUFBQSxRWHJidEMscUJXc2JvQyxRQUFBLFFYdGJwQyxnQld1YitCLFFBQUEsUVh2Yi9CLHlCV3did0MsUUFBQSxRWHhieEMsMEJXeWJ5QyxRQUFBLFFYemJ6QyxrQlcwYmlDLFFBQUEsUVgxYmpDLGtCVzJiaUMsUUFBQSxRWDNiakMsb0JXNGJtQyxRQUFBLFFYNWJuQyxlVzZiOEIsUUFBQSxRWDdiOUIsb0JXOGJtQyxRQUFBLFFYOWJuQyxpQlcrYmdDLFFBQUEsUVgvYmhDLGVXZ2M4QixRQUFBLFFYaGM5QixpQldpY2dDLFFBQUEsUVhqY2hDLGdCV2tjK0IsUUFBQSxRWGxjL0IsaUJXbWNnQyxRQUFBLFFYbmNoQyxtQldvY2tDLFFBQUEsUVhwY2xDLDBCV3FjeUMsUUFBQSxRWHJjekMsaUJXc2NnQyxRQUFBLFFYdGNoQyx3Qld1Y3VDLFFBQUEsUVh2Y3ZDLG1CV3dja0MsUUFBQSxRWHhjbEMsc0JRMDRDRCxlR2g4QitCLFFBQUEsUVgxYzlCLGVRODRDRCxnQkdsOEJnQyxRQUFBLFFYNWMvQixnQlc2YytCLFFBQUEsUVg3Yy9CLG1CVzhja0MsUUFBQSxRWDljbEMsc0JXK2NxQyxRQUFBLFFYL2NyQyxzQldnZHFDLFFBQUEsUVhoZHJDLG9CV2lkbUMsUUFBQSxRWGpkbkMsc0JXa2RxQyxRQUFBLFFYbGRyQyx1QldtZHNDLFFBQUEsUVhuZHRDLHdCV29kdUMsUUFBQSxRWHBkdkMsNkJXcWQ0QyxRQUFBLFFIeTlCN0Msd0JSOTZDQyx3QlE2NkNELDBCR3I5QndDLFFBQUEsUUgwOUJ4QywwQlJsN0NDLHNCVzBkeUMsUUFBQSxRSDQ5QjFDLHdCUnQ3Q0Msd0JXNGR1QyxRQUFBLFFYNWR2Qyx3QlEwN0NELHdCRzU5QndDLFFBQUEsUVg5ZHZDLHVCVytkc0MsUUFBQSxRWC9kdEMsZ0JXZ2UrQixRQUFBLFFYaGUvQixtQldpZWtDLFFBQUEsUVhqZWxDLG9CV2tlbUMsUUFBQSxRWGxlbkMscUJRMDhDRCxxQkFHQSxxQkFGQSxzQkFDQSxtQkdyK0JxQyxRQUFBLFFYdmVwQywwQld3ZXlDLFFBQUEsUVh4ZXpDLGNRcTlDRCxpQkFEQSxzQkd6K0JpQyxRQUFBLFFIOCtCakMsa0JSejlDQyxjVzZlaUMsUUFBQSxRWDdlakMsc0JXOGVxQyxRQUFBLFFYOWVyQyxlVytlOEIsUUFBQSxRSHEvQi9CLHVCUnArQ0MsK0JRbStDRCxxQkdqL0J1QyxRQUFBLFFYbGZ0Qyx5QldtZndDLFFBQUEsUVhuZnhDLGNXb2Y2QixRQUFBLFFYcGY3QixrQlE4K0NELGtCR3gvQmtDLFFBQUEsUUg0L0JsQyx1QlJsL0NDLGdCV3dmc0MsUUFBQSxRSDgvQnZDLHlCUnQvQ0Msa0JXMGZ3QyxRQUFBLFFYMWZ4QyxtQlcyZmtDLFFBQUEsUVgzZmxDLHVCVzRmc0MsUUFBQSxRWDVmdEMsa0JXNmZpQyxRQUFBLFFYN2ZqQyxxQlc4Zm9DLFFBQUEsUVg5ZnBDLG1CVytma0MsUUFBQSxRWC9mbEMscUJXZ2dCb0MsUUFBQSxRWGhnQnBDLDRCV2lnQjJDLFFBQUEsUVhqZ0IzQyxnQldrZ0IrQixRQUFBLFFIZ2hDaEMsb0JSbGhEQyx5QldvZ0JtQyxRQUFBLFFYcGdCbkMsZVdxZ0I4QixRQUFBLFFYcmdCOUIsc0JXc2dCcUMsUUFBQSxRWHRnQnJDLGdCV3VnQitCLFFBQUEsUVh2Z0IvQixzQld3Z0JxQyxRQUFBLFFYeGdCckMsa0JXeWdCaUMsUUFBQSxRWHpnQmpDLGdCVzBnQitCLFFBQUEsUVgxZ0IvQix1QlcyZ0JzQyxRQUFBLFFYM2dCdEMsZ0JXNGdCK0IsUUFBQSxRWDVnQi9CLHNCVzZnQnFDLFFBQUEsUVg3Z0JyQyxrQlc4Z0JpQyxRQUFBLFFYOWdCakMseUJXK2dCd0MsUUFBQSxRWC9nQnhDLG1CV2doQmtDLFFBQUEsUVhoaEJsQyx5QldpaEJ3QyxRQUFBLFFYamhCeEMsdUJXa2hCc0MsUUFBQSxRWGxoQnRDLG1CV21oQmtDLFFBQUEsUVhuaEJsQyxxQldvaEJvQyxRQUFBLFFYcGhCcEMscUJXcWhCb0MsUUFBQSxRWHJoQnBDLHNCV3NoQnFDLFFBQUEsUVh0aEJyQyx3Qld1aEJ1QyxRQUFBLFFYdmhCdkMsaUJXd2hCZ0MsUUFBQSxRWHhoQmhDLHFCV3loQm9DLFFBQUEsUVh6aEJwQyxjVzBoQjZCLFFBQUEsUVgxaEI3QixzQlcyaEJxQyxRQUFBLFFYM2hCckMsdUJXNGhCc0MsUUFBQSxRWDVoQnRDLHlCVzZoQndDLFFBQUEsUVg3aEJ4QyxzQlc4aEJxQyxRQUFBLFFYOWhCckMscUJXK2hCb0MsUUFBQSxRWC9oQnBDLHNCV2dpQnFDLFFBQUEsUVhoaUJyQyxrQldpaUJpQyxRQUFBLFFYamlCakMseUJXa2lCd0MsUUFBQSxRWGxpQnhDLHNCV21pQnFDLFFBQUEsUVhuaUJyQyxxQldvaUJvQyxRQUFBLFFYcGlCcEMsbUJXcWlCa0MsUUFBQSxRWHJpQmxDLGVXc2lCOEIsUUFBQSxRWHRpQjlCLG1CV3VpQmtDLFFBQUEsUVh2aUJsQyxxQld3aUJvQyxRQUFBLFFYeGlCcEMsY1d5aUI2QixRQUFBLFFINmxDOUIsZVJ0b0RDLGtCUXFvREQsa0JHemxDK0IsUUFBQSxRWDVpQjlCLG9CVzZpQm1DLFFBQUEsUVg3aUJuQyxzQlc4aUJxQyxRQUFBLFFYOWlCckMsMEJXK2lCeUMsUUFBQSxRWC9pQnpDLG9CV2dqQm1DLFFBQUEsUVhoakJuQyxvQldpakJtQyxRQUFBLFFYampCbkMsbUJXa2pCa0MsUUFBQSxRWGxqQmxDLGtCV21qQmlDLFFBQUEsUVhuakJqQyx3QldvakJ1QyxRQUFBLFFYcGpCdkMsdUJXcWpCc0MsUUFBQSxRWHJqQnRDLG9CV3NqQm1DLFFBQUEsUVh0akJuQyxxQld1akJvQyxRQUFBLFFYdmpCcEMsMkJXd2pCMEMsUUFBQSxRWHhqQjFDLG1CV3lqQmtDLFFBQUEsUVh6akJsQyxnQlcwakIrQixRQUFBLFFYMWpCL0IsdUJXMmpCc0MsUUFBQSxRWDNqQnRDLHNCVzRqQnFDLFFBQUEsUVg1akJyQyx1Qlc2akJzQyxRQUFBLFFYN2pCdEMscUJXOGpCb0MsUUFBQSxRWDlqQnBDLGlCVytqQmdDLFFBQUEsUVgvakJoQyxnQldna0IrQixRQUFBLFFYaGtCL0IsbUJXaWtCa0MsUUFBQSxRWGprQmxDLG9CUXlzREQsdUJHdG9DdUMsUUFBQSxRWG5rQnRDLDJCV29rQjBDLFFBQUEsUVhwa0IxQyx3Qldxa0J1QyxRQUFBLFFYcmtCdkMsdUJXc2tCc0MsUUFBQSxRWHRrQnRDLHNCV3VrQnFDLFFBQUEsUVh2a0JyQyx1Qld3a0JzQyxRQUFBLFFYeGtCdEMseUJXeWtCd0MsUUFBQSxRWHprQnhDLHlCVzBrQndDLFFBQUEsUVgxa0J4QyxrQlcya0JpQyxRQUFBLFFYM2tCakMsc0JXNGtCcUMsUUFBQSxRWDVrQnJDLDZCVzZrQjRDLFFBQUEsUVg3a0I1Qyx1Qlc4a0JzQyxRQUFBLFFYOWtCdEMsb0JXK2tCbUMsUUFBQSxRWC9rQm5DLGtCV2dsQmlDLFFBQUEsUVhobEJqQyxxQldpbEJvQyxRQUFBLFFYamxCcEMsc0JXa2xCcUMsUUFBQSxRSHdxQ3RDLGVSMXZEQyxpQldvbEI4QixRQUFBLFFYcGxCOUIsbUJXcWxCa0MsUUFBQSxRWHJsQmxDLGlCV3NsQmdDLFFBQUEsUVh0bEJoQyxrQld1bEJpQyxRQUFBLFFYdmxCakMsa0JXd2xCaUMsUUFBQSxRSGtyQ2xDLHdCUjF3REMsY1cwbEJ1QyxRQUFBLFFYMWxCdkMseUJXMmxCd0MsUUFBQSxRWDNsQnhDLG9CVzRsQm1DLFFBQUEsUVg1bEJuQyx3Qlc2bEJ1QyxRQUFBLFFYN2xCdkMscUJRd3hERCx3QkFEQSxtQkd2ckN3QyxRQUFBLFFYaG1CdkMscUJRNHhERCxrQ0cxckNrRCxRQUFBLFFYbG1CakQscUJRZ3lERCx3Qkc1ckN3QyxRQUFBLFFYcG1CdkMscUJRb3lERCwyQkc5ckMyQyxRQUFBLFFYdG1CMUMscUJRd3lERCx5Qkdoc0N5QyxRQUFBLFFYeG1CeEMseUJXeW1Cd0MsUUFBQSxRWHptQnhDLG9CVzBtQm1DLFFBQUEsUVgxbUJuQyx3QlcybUJ1QyxRQUFBLFFYM21CdkMsMEJXNG1CeUMsUUFBQSxRWDVtQnpDLHVCVzZtQnNDLFFBQUEsUVg3bUJ0Qyx5Qlc4bUJ3QyxRQUFBLFFYOW1CeEMsa0JXK21CaUMsUUFBQSxRWC9tQmpDLDBCV2duQnlDLFFBQUEsUVhobkJ6QyxpQldpbkJnQyxRQUFBLFFYam5CaEMseUJXa25Cd0MsUUFBQSxRWGxuQnhDLHVCV21uQnNDLFFBQUEsUVhubkJ0Qyx1QlE2MERELDJCR3h0QzJDLFFBQUEsUVhybkIxQyx1QlFpMURELDBCRzF0QzBDLFFBQUEsUVh2bkJ6Qyx1QlFxMURELHlCRzV0Q3lDLFFBQUEsUVh6bkJ4QyxxQlcwbkJvQyxRQUFBLFFYMW5CcEMsdUJRNDFERCx1QkdodUN1QyxRQUFBLFFIb3VDdkMsd0JSaDJEQyx1Qlc4bkJ1QyxRQUFBLFFYOW5CdkMsMkJXK25CMEMsUUFBQSxRWC9uQjFDLHlCV2dvQndDLFFBQUEsUVhob0J4Qyx3Qldpb0J1QyxRQUFBLFFYam9CdkMsMEJXa29CeUMsUUFBQSxRWGxvQnpDLHdCV21vQnVDLFFBQUEsUVhub0J2QyxxQldvb0JvQyxRQUFBLFFYcG9CcEMsc0JXcW9CcUMsUUFBQSxRWHJvQnJDLDRCV3NvQjJDLFFBQUEsUVh0b0IzQyxjV3VvQjZCLFFBQUEsUVh2b0I3QixxQld3b0JvQyxRQUFBLFFYeG9CcEMsdUJXeW9Cc0MsUUFBQSxRWHpvQnRDLHlCVzBvQndDLFFBQUEsUVgxb0J4QyxnQ1cyb0IrQyxRQUFBLFFYM29CL0Msc0JXNG9CcUMsUUFBQSxRWDVvQnJDLHVCVzZvQnNDLFFBQUEsUVg3b0J0QyxrQlc4b0JpQyxRQUFBLFFYOW9CakMsa0JXK29CaUMsUUFBQSxRWC9vQmpDLG1CV2dwQmtDLFFBQUEsUVhocEJsQyxpQldpcEJnQyxRQUFBLFFYanBCaEMsNkJXa3BCNEMsUUFBQSxRSDh3QzdDLHNCUmg2REMsY1dvcEJxQyxRQUFBLFFYcHBCckMsa0JXcXBCaUMsUUFBQSxRWHJwQmpDLGlCV3NwQmdDLFFBQUEsUVh0cEJoQyxrQld1cEJpQyxRQUFBLFFYdnBCakMsMkJXd3BCMEMsUUFBQSxRWHhwQjFDLDRCV3lwQjJDLFFBQUEsUVh6cEIzQyw0QlcwcEIyQyxRQUFBLFFYMXBCM0MsNEJXMnBCMkMsUUFBQSxRWDNwQjNDLG9CVzRwQm1DLFFBQUEsUVg1cEJuQyxtQlc2cEJrQyxRQUFBLFFYN3BCbEMscUJXOHBCb0MsUUFBQSxRWDlwQnBDLGlCVytwQmdDLFFBQUEsUVgvcEJoQyxlV2dxQjhCLFFBQUEsUVhocUI5QixzQldpcUJxQyxRQUFBLFFYanFCckMsd0JXa3FCdUMsUUFBQSxRWGxxQnZDLGlCV21xQmdDLFFBQUEsUVhucUJoQyxpQldvcUJnQyxRQUFBLFFYcHFCaEMscUJXcXFCb0MsUUFBQSxRWHJxQnBDLHFCV3NxQm9DLFFBQUEsUVh0cUJwQyx3Qld1cUJ1QyxRQUFBLFFYdnFCdkMsZ0JXd3FCK0IsUUFBQSxRWHhxQi9CLDJCV3lxQjBDLFFBQUEsUVh6cUIxQyxvQlcwcUJtQyxRQUFBLFFYMXFCbkMsZ0JXMnFCK0IsUUFBQSxRWDNxQi9CLHdCVzRxQnVDLFFBQUEsUVg1cUJ2QyxlVzZxQjhCLFFBQUEsUVg3cUI5Qix3Qlc4cUJ1QyxRQUFBLFFYOXFCdkMsb0JXK3FCbUMsUUFBQSxRWC9xQm5DLGtCV2dyQmlDLFFBQUEsUVhockJqQyx3QldpckJ1QyxRQUFBLFFYanJCdkMsMEJXa3JCeUMsUUFBQSxRWGxyQnpDLHVCV21yQnNDLFFBQUEsUVhuckJ0Qyx5QldvckJ3QyxRQUFBLFFYcHJCeEMsd0JXcXJCdUMsUUFBQSxRWHJyQnZDLDJCV3NyQjBDLFFBQUEsUVh0ckIxQyxtQld1ckJrQyxRQUFBLFFYdnJCbEMscUJXd3JCb0MsUUFBQSxRWHhyQnBDLHVCV3lyQnNDLFFBQUEsUVh6ckJ0QyxtQlcwckJrQyxRQUFBLFFYMXJCbEMsa0JXMnJCaUMsUUFBQSxRWDNyQmpDLHNCVzRyQnFDLFFBQUEsUVg1ckJyQyxtQlc2ckJrQyxRQUFBLFFYN3JCbEMsa0JXOHJCaUMsUUFBQSxRWDlyQmpDLDRCVytyQjJDLFFBQUEsUVgvckIzQywwQldnc0J5QyxRQUFBLFFYaHNCekMsNkJXaXNCNEMsUUFBQSxRWGpzQjVDLGlCV2tzQmdDLFFBQUEsUVhsc0JoQyw2Qldtc0I0QyxRQUFBLFFYbnNCNUMsZ0NXb3NCK0MsUUFBQSxRWHBzQi9DLG1CV3FzQmtDLFFBQUEsUVhyc0JsQyx1Q1dzc0JzRCxRQUFBLFFIbzNDdkQsK0NSMWpFQyw0Qld3c0I4RCxRQUFBLFFIdTNDL0QsZ0JSL2pFQyxvQlE4akVELDJCR24zQ2dDLFFBQUEsUVgzc0IvQixpQlc0c0JnQyxRQUFBLFFYNXNCaEMsbUJXNnNCa0MsUUFBQSxRSDQzQ25DLHlCUnprRUMsbUJXK3NCd0MsUUFBQSxRWC9zQnhDLHNCV2d0QnFDLFFBQUEsUVhodEJyQyxrQldpdEJpQyxRQUFBLFFYanRCakMseUJXa3RCd0MsUUFBQSxRWGx0QnhDLG9CV210Qm1DLFFBQUEsUVhudEJuQywwQldvdEJ5QyxRQUFBLFFYcHRCekMsMkJXcXRCMEMsUUFBQSxRWHJ0QjFDLHNCV3N0QnFDLFFBQUEsUVh0dEJyQyx1Qld1dEJzQyxRQUFBLFFYdnRCdEMsaUJXd3RCZ0MsUUFBQSxRWHh0QmhDLHFCV3l0Qm9DLFFBQUEsUVh6dEJwQyw4QlEybUVELGdDR2g1Q2dELFFBQUEsUVgzdEIvQyxjUSttRUQsd0JHbDVDd0MsUUFBQSxRWDd0QnZDLHVCVzh0QnNDLFFBQUEsUVg5dEJ0Qyx5QlcrdEJ3QyxRQUFBLFFYL3RCeEMsMkJXZ3VCMEMsUUFBQSxRWGh1QjFDLGtCV2l1QmlDLFFBQUEsUVhqdUJqQyx3QldrdUJ1QyxRQUFBLFFYbHVCdkMsMEJXbXVCeUMsUUFBQSxRSGs2QzFDLHdCUnJvRUMsaUJXcXVCdUMsUUFBQSxRSG82Q3hDLDBCUnpvRUMsbUJXdXVCeUMsUUFBQSxRWHZ1QnpDLHVCV3d1QnNDLFFBQUEsUVh4dUJ0Qyx5Qld5dUJ3QyxRQUFBLFFYenVCeEMsa0JXMHVCaUMsUUFBQSxRWDF1QmpDLG9CVzJ1Qm1DLFFBQUEsUVgzdUJuQywyQlF5cEVELG1CRzU2Q21DLFFBQUEsUVg3dUJsQyw2QlE2cEVELHFCRzk2Q3FDLFFBQUEsUVgvdUJwQyxpQldndkJnQyxRQUFBLFFYaHZCaEMsMEJXaXZCeUMsUUFBQSxRWGp2QnpDLG9CV2t2Qm1DLFFBQUEsUVhsdkJuQyx5QlEycUVELDRCQURBLHVCR3I3QzRDLFFBQUEsUVhydkIzQyx5QlErcUVELHNDR3g3Q3NELFFBQUEsUVh2dkJyRCx5QlFtckVELDRCRzE3QzRDLFFBQUEsUVh6dkIzQyx5QlF1ckVELCtCRzU3QytDLFFBQUEsUVgzdkI5Qyx5QlEyckVELDZCRzk3QzZDLFFBQUEsUVg3dkI1QyxrQlc4dkJpQyxRQUFBLFFIcThDbEMsZ0JSbnNFQyxtQlFrc0VELGVHajhDZ0MsUUFBQSxRWGp3Qi9CLG1CV2t3QmtDLFFBQUEsUVhsd0JsQywyQldtd0IwQyxRQUFBLFFYbndCMUMsMkJXb3dCMEMsUUFBQSxRWHB3QjFDLDBCV3F3QnlDLFFBQUEsUVhyd0J6QywyQlFtdEVELHdCRzU4Q3dDLFFBQUEsUVh2d0J2Qyw2QlF1dEVELDBCRzk4QzBDLFFBQUEsUVh6d0J6QyxvQlcwd0JtQyxRQUFB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VUFBQSxLQUNBLGlCQUFBLFFBQ0EsS0FBQSxFQUNBLElBQUEsRUFDQSxNQUFBLEVBQ0EsU0FBQSxPQUNBLFFBQUEsSUFDQSxzQkFDSSxPQUFBLFFBRUosb0JBQ0ksT0FBQSxRQUlSLGFBQ0ksU0FBQSxTQUNBLElBQUEsSUFDQSxLQUFBLEtBQ0EsTUFBQSxJQUNBLFNBQUEsT0FDQSxNQUFBLFFBQ0EsVUFBQSxLQUdKLGNBQ0ksUUFBQSxJQUFBLElBQUEsSUFBQSxLQUNBLG9CQUFBLElBQUEsSUFDQSxrQkFBQSxVQUdKLGNBQ0ksU0FBQSxTQUNBLElBQUEsSUFDQSxNQUFBLEtBQ0EsTUFBQSxLQUNBLE9BQUEsS0FDQSxXQUFBLG8rQ0FBQSxJQUFBLElBQUEsVUFHSixZQUNJLFNBQUEsU0FDQSxJQUFBLElBQ0EsS0FBQSxLQUdKLGNBQ0ksTUFBQSxLQUNBLFFBQUEsSUFDQSxXQUFBLEtBR0osYUFDSSxTQUFBLFNBQ0EsTUFBQSxLQUdKLGdCQUNJLFNBQUEsU0FDQSxNQUFBLEtBQ0EsT0FBQSxNQUNBLFNBQUEsT0FDQSxPQUFBLElBQUEsTUFBQSxRQUNBLFdBQUEsMkJBR0osT0FDSSxTQUFBLFNBQ0EsSUFBQSxJQUNBLEtBQUEsSUFDQSxPQUFBLE9BQUEsRUFBQSxFQUFBLE9BQ0EsTUFBQSxNQUNBLE9BQUEsTUFDQSxTQUFBLE9BQ0EsS0FBQSxFQUdKLFlBQ0ksU0FBQSxTQUNBLE9BQUEsSUFDQSxLQUFBLElBQ0EsTUFBQSxNQUNBLE9BQUEsTUFHSixjQUNJLFNBQUEsU0FDQSxPQUFBLFFBQ0EsS0FBQSxFQUNBLE1BQUEsTUFDQSxPQUFBLE1BR0osYUFDSSxTQUFBLFNBQ0EsTUFBQSxLQUdKLFdBQ0ksTUFBQSxLQUNBLFFBQUEsSUFDQSxXQUFBLEtBR0osY0FDSSxTQUFBLFNBQ0EsTUFBQSxLQUNBLElBQUEsS0FDQSxPQUFBLElBQUEsTUFBQSxRQUNBLGlCQUFBLFFBQ0EsUUFBQSxJQUNBLFFBQUEsS0FDQSxRQUFBLEtBR0osaUJBQ0ksU0FBQSxTQUNBLFdBQUEsNEJBQUEsSUFBQSxJQUNBLE1BQUEsS0FDQSxVQUFBLEtBQ0EsV0FBQSxPQUNBLFlBQUEsS0FDQSxRQUFBLElBQUEsSUFBQSxJQUFBLElBQ0EsT0FBQSxJQUFBLEVBQUEsSUFBQSxFQUdKLFlBQ0ksV0FBQSIsImZpbGUiOiJuYW5vdWkuY3NzIiwic291cmNlc0NvbnRlbnQiOltudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCIuZGlzcGxheUJhciB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB3aWR0aDogMjM2cHg7XHJcbiAgICBoZWlnaHQ6IDE2cHg7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2O1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbiAgICBtYXJnaW46IDAgNXB4IDAgMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICBiYWNrZ3JvdW5kOiAjMDAwMDAwO1xyXG59XHJcblxyXG4uZGlzcGxheUJhclRleHQge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiAtMnB4O1xyXG4gICAgbGVmdDogNXB4O1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyRmlsbCB7XHJcbiAgICB3aWR0aDogMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBiYWNrZ3JvdW5kOiAjNDA2MjhhO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uZGlzcGxheUJhckZpbGwuYWxpZ25SaWdodCB7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyVGV4dC5nb29kIHtcclxuXHRjb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyVGV4dC5ub3Rnb29kIHtcclxuXHRjb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyVGV4dC5hdmVyYWdlIHtcclxuXHRjb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyVGV4dC5iYWQge1xyXG5cdGNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLmRpc3BsYXlCYXJUZXh0LmhpZ2hsaWdodCB7XHJcblx0Y29sb3I6IGJsYWNrO1xyXG59XHJcblxyXG4uZGlzcGxheUJhckZpbGwuZ29vZCB7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGJhY2tncm91bmQ6IEBnb29kLWNvbG9yO1xyXG59XHJcblxyXG4uZGlzcGxheUJhckZpbGwubm90Z29vZCB7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGJhY2tncm91bmQ6ICNmZmI0MDA7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyRmlsbC5hdmVyYWdlIHtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgYmFja2dyb3VuZDogQGF2ZXJhZ2UtY29sb3I7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyRmlsbC5iYWQge1xyXG4gICAgY29sb3I6ICNmZmZmZmY7XHJcbiAgICBiYWNrZ3JvdW5kOiBAYmFkLWNvbG9yO1xyXG59XHJcblxyXG4uZGlzcGxheUJhckZpbGwuaGlnaGxpZ2h0IHtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgYmFja2dyb3VuZDogQGhpZ2hsaWdodC1jb2xvcjtcclxufVxyXG4iLCIubGluaywgLmxpbmtPbiwgLmxpbmtPZmYsIC5zZWxlY3RlZCwgLmRpc2FibGVkLCAueWVsbG93QnV0dG9uLCAucmVkQnV0dG9uIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgbWluLXdpZHRoOiAxNXB4O1xyXG4gICAgaGVpZ2h0OiAxNnB4O1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgY29sb3I6ICNmZmZmZmY7XHJcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgICBiYWNrZ3JvdW5kOiAjNDA2MjhhO1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzE2MTYxNjtcclxuICAgIHBhZGRpbmc6IDBweCA0cHggNHB4IDRweDtcclxuICAgIG1hcmdpbjogMCAycHggMnB4IDA7XHJcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XHJcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG59XHJcblxyXG4uaGFzSWNvbiB7XHJcbiAgICBwYWRkaW5nOiAwcHggNHB4IDRweCAwcHg7XHJcbn1cclxuXHJcbmEuaG92ZXIsIC56b29tTGluay5ob3ZlciwgLmxpbmtBY3RpdmUuaG92ZXIge1xyXG4gICAgYmFja2dyb3VuZDogIzUwN2FhYztcclxufVxyXG5cclxuQGtleWZyYW1lcyBwZW5kaW5nQW5pbWF0aW9uIHtcclxuICAgIHRvIHtcclxuICAgICAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgICAgICBiYWNrZ3JvdW5kOiAjNTA3YWFjO1xyXG4gICAgfVxyXG59XHJcblxyXG4ubGlua1BlbmRpbmcsIC5saW5rUGVuZGluZy5ob3ZlciB7XHJcbiAgICBhbmltYXRpb24tbmFtZTogcGVuZGluZ0FuaW1hdGlvbjtcclxuICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC4yNXM7XHJcbn1cclxuXHJcbmEud2hpdGUsIGEud2hpdGU6bGluaywgYS53aGl0ZTp2aXNpdGVkLCBhLndoaXRlOmFjdGl2ZSB7XHJcbiAgICBjb2xvcjogIzQwNjI4YTtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjMTYxNjE2O1xyXG4gICAgcGFkZGluZzogMXB4IDRweCAxcHggNHB4O1xyXG4gICAgbWFyZ2luOiAwIDJweCAwIDA7XHJcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XHJcbn1cclxuXHJcbmEud2hpdGUuaG92ZXIge1xyXG4gICAgY29sb3I6ICNmZmZmZmY7XHJcbiAgICBiYWNrZ3JvdW5kOiAjNDA2MjhhO1xyXG59XHJcblxyXG4ubGlua09uLCBhLmxpbmtPbjpsaW5rLCBhLmxpbmtPbjp2aXNpdGVkLCBhLmxpbmtPbjphY3RpdmUsIGEubGlua09uLmhvdmVyLCAuc2VsZWN0ZWQsIGEuc2VsZWN0ZWQ6bGluaywgYS5zZWxlY3RlZDp2aXNpdGVkLCBhLnNlbGVjdGVkOmFjdGl2ZSwgYS5zZWxlY3RlZC5ob3ZlciB7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGJhY2tncm91bmQ6ICMyZjk0M2M7XHJcbn1cclxuXHJcbi5saW5rT2ZmLCBhLmxpbmtPZmY6bGluaywgYS5saW5rT2ZmOnZpc2l0ZWQsIGEubGlua09mZjphY3RpdmUsIGEubGlua09mZi5ob3ZlciwgLmRpc2FibGVkLCBhLmRpc2FibGVkOmxpbmssIGEuZGlzYWJsZWQ6dmlzaXRlZCwgYS5kaXNhYmxlZDphY3RpdmUsIGEuZGlzYWJsZWQuaG92ZXIge1xyXG4gICAgY29sb3I6ICNmZmZmZmY7XHJcbiAgICBiYWNrZ3JvdW5kOiAjOTk5OTk5O1xyXG4gICAgYm9yZGVyLWNvbG9yOiAjNjY2NjY2O1xyXG59XHJcblxyXG5hLmljb24sIC5saW5rT24uaWNvbiwgLmxpbmtPZmYuaWNvbiwgLnNlbGVjdGVkLmljb24sIC5kaXNhYmxlZC5pY29uIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHBhZGRpbmc6IDFweCA0cHggMnB4IDIwcHg7XHJcbn1cclxuXHJcbmEuaWNvbiBpbWcsIC5saW5rT24uaWNvbiBpbWcsIC5saW5rT2ZmLmljb24gaW1nLCAuc2VsZWN0ZWQuaWNvbiBpbWcsIC5kaXNhYmxlZC5pY29uIGltZyB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDE4cHg7XHJcbiAgICBoZWlnaHQ6IDE4cHg7XHJcbn1cclxuXHJcbi5saW5rRGFuZ2VyLCBhLmxpbmtEYW5nZXI6bGluaywgYS5saW5rRGFuZ2VyOnZpc2l0ZWQsIGEubGlua0RhbmdlcjphY3RpdmUge1xyXG4gICAgY29sb3I6ICNmZmZmZmY7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmYwMDAwO1xyXG4gICAgYm9yZGVyLWNvbG9yOiAjYWEwMDAwO1xyXG59XHJcblxyXG4ubGlua0Rhbmdlci5ob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY2NjY2O1xyXG59XHJcblxyXG4uaW5hY3RpdmUsIGEuaW5hY3RpdmU6bGluaywgYS5pbmFjdGl2ZTp2aXNpdGVkLCBhLmluYWN0aXZlOmFjdGl2ZSwgYS5pbmFjdGl2ZS5ob3ZlciB7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGJhY2tncm91bmQ6ICM5OTk5OTk7XHJcbiAgICBib3JkZXItY29sb3I6ICM2NjY2NjY7XHJcbn0iLCJAaW1wb3J0IFwiX2NvbmZpZ1wiO1xyXG5cclxuLndoaXRlIHtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG4uZ29vZCB7XHJcbiAgICBjb2xvcjogQGdvb2QtY29sb3I7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuLmF2ZXJhZ2Uge1xyXG4gICAgY29sb3I6IEBhdmVyYWdlLWNvbG9yO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbi5iYWQge1xyXG4gICAgY29sb3I6IEBiYWQtY29sb3I7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuLmlkbGUge1xyXG4gICAgY29sb3I6IEBkYXJrLWNvbG9yO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbi5yZWRCdXR0b24ge1xyXG4gICAgYmFja2dyb3VuZDogI2VhMDAwMDtcclxufVxyXG5cclxuLnllbGxvd0J1dHRvbiB7XHJcbiAgICBiYWNrZ3JvdW5kOiAjY2FjYzAwO1xyXG59XHJcblxyXG4uaGlnaGxpZ2h0IHtcclxuICAgIGNvbG9yOiBAaGlnaGxpZ2h0LWNvbG9yO1xyXG59XHJcblxyXG4uZGFyayB7XHJcbiAgICBjb2xvcjogQGRhcmstY29sb3I7XHJcbn1cclxuXHJcbi8qIERhbWFnZSBjb2xvcnMgZm9yIGNyZXcgbW9uaXRvcmluZyBjb21wdXRlciAqL1xyXG4uYnVybiB7XHJcbiAgICBjb2xvcjogb3JhbmdlO1xyXG59XHJcblxyXG4uYnJ1dGUge1xyXG4gICAgY29sb3I6IHJlZDtcclxufVxyXG5cclxuLnRveGluIHtcclxuICAgIGNvbG9yOiBncmVlbjtcclxufVxyXG5cclxuLnRveGluX2xpZ2h0IHtcclxuICAgIGNvbG9yOiAjM0FERjAwO1xyXG59XHJcblxyXG4ub3h5bG9zcyB7XHJcbiAgICBjb2xvcjogYmx1ZTtcclxufVxyXG5cclxuLm94eWxvc3NfbGlnaHQge1xyXG4gICAgY29sb3I6ICM2Njk4RkY7XHJcbn1cclxuXHJcbi8qIFdpcmUgY29sb3JzIGZvciBudWNsZWFyIGJvbWIgZGVmdXNpb24gKi9cclxuLlJlZCB7XHJcbiAgICBjb2xvcjogI0ZGMDAwMDtcclxufVxyXG5cclxuLkJsdWUge1xyXG4gICAgY29sb3I6ICMwMDAwRkY7XHJcbn1cclxuXHJcbi5HcmVlbiB7XHJcbiAgICBjb2xvcjogIzAwRkYwMDtcclxufVxyXG5cclxuLk1hcmlnb2xkIHtcclxuICAgIGNvbG9yOiAjRkRBNTA1O1xyXG59XHJcblxyXG4uRnVzY2hpYSB7XHJcbiAgICBjb2xvcjogI0ZGMDA4MDtcclxufVxyXG5cclxuLkJsYWNrIHtcclxuICAgIGNvbG9yOiAjMDAwMDAwO1xyXG59XHJcblxyXG4uUGVhcmwge1xyXG4gICAgY29sb3I6ICNDNkNBQ0I7XHJcbn1cclxuXHJcbi8qIFN0YXR1cyBiYXIgY29sb3JzIGZvciBzbGVlcGVyIHRlbXBlcmF0dXJlcyAqL1xyXG4uY29sZDEge1xyXG4gICAgY29sb3I6ICM5NEI4RkY7XHJcbn1cclxuXHJcbi5jb2xkMiB7XHJcbiAgICBjb2xvcjogIzY2OTlGRjtcclxufVxyXG5cclxuLmNvbGQzIHtcclxuICAgIGNvbG9yOiAjMjkzRDY2O1xyXG59XHJcblxyXG4uaG90MSB7XHJcbiAgICBjb2xvcjogI0ZGOTk2NjtcclxufVxyXG5cclxuLmhvdDIge1xyXG4gICAgY29sb3I6ICM5OTNEMDA7XHJcbn1cclxuXHJcbi5ob3QzIHtcclxuICAgIGNvbG9yOiAjRkY2NjAwO1xyXG59IiwiZGl2LmRpc3BsYXkge1xyXG5cdHBhZGRpbmc6IDRweDtcclxuXHRtYXJnaW46IDZweCAwO1xyXG5cclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzMpO1xyXG5cdGJveC1zaGFkb3c6IGluc2V0IDAgMCA1cHggcmdiYSgwLCAwLCAwLCAwLjUpO1xyXG59XHJcblxyXG5kaXYuZGlzcGxheSBoZWFkZXIge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcblx0d2lkdGg6IDk4LjUlO1xyXG4gICAgcGFkZGluZzogMCA0cHg7XHJcbiAgICBtYXJnaW4tYm90dG9tOiA2cHg7XHJcbiAgICBjb2xvcjogI0ZGRkZGRjtcclxuICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjNDA2MjhhO1xyXG59XHJcblxyXG5kaXYuZGlzcGxheSBoZWFkZXIgLmJ1dHRvblJpZ2h0IHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIGJvdHRvbTogNnB4O1xyXG4gICAgcmlnaHQ6IDRweDtcclxufVxyXG5cclxuZGl2LmRpc3BsYXkgYXJ0aWNsZSB7XHJcbiAgICBkaXNwbGF5OiB0YWJsZTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcclxufSIsIi5pdGVtR3JvdXAge1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2U5YzE4MztcclxuICAgIGJhY2tncm91bmQ6ICMyYzJjMmM7XHJcbiAgICBwYWRkaW5nOiA0cHg7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG5cclxuXHJcbi5pdGVtIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgbWFyZ2luOiA0cHggMCAwIDA7XHJcbiAgICBjbGVhcjogYm90aDtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG59XHJcblxyXG4uaXRlbUNvbnRlbnROYXJyb3csIC5pdGVtQ29udGVudCB7XHJcbiAgICBmbG9hdDogbGVmdDtcclxufVxyXG5cclxuLml0ZW1Db250ZW50TmFycm93IHtcclxuICAgIHdpZHRoOiAzMCU7XHJcbn1cclxuXHJcbi5pdGVtQ29udGVudCB7XHJcbiAgICB3aWR0aDogNjklO1xyXG59XHJcblxyXG4uaXRlbUxhYmVsTmFycm93LCAuaXRlbUxhYmVsLCAuaXRlbUxhYmVsV2lkZSwgLml0ZW1MYWJlbFdpZGVyLCAuaXRlbUxhYmVsV2lkZXN0IHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgY29sb3I6ICNlOWMxODM7XHJcbn1cclxuXHJcbi5pdGVtTGFiZWxOYXJyb3cge1xyXG4gICAgd2lkdGg6IDIwJTtcclxufVxyXG5cclxuLml0ZW1MYWJlbCB7XHJcbiAgICB3aWR0aDogMzAlO1xyXG59XHJcblxyXG4uaXRlbUxhYmVsV2lkZSB7XHJcbiAgICB3aWR0aDogNDUlO1xyXG59XHJcblxyXG4uaXRlbUxhYmVsV2lkZXIge1xyXG4gICAgd2lkdGg6IDY5JTtcclxufVxyXG5cclxuLml0ZW1MYWJlbFdpZGVzdCB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuLml0ZW1Db250ZW50V2lkZSB7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIHdpZHRoOiA3OSU7XHJcbn1cclxuXHJcbi5pdGVtQ29udGVudFNtYWxsIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgd2lkdGg6IDMzJTtcclxufVxyXG5cclxuLml0ZW1Db250ZW50TWVkaXVtIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgd2lkdGg6IDU1JTtcclxufVxyXG5cclxuLmJsb2NrIHtcclxuICAgIHBhZGRpbmc6IDhweDtcclxuICAgIG1hcmdpbjogMTBweCA0cHggNHB4IDRweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM0MDYyOGE7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwO1xyXG59XHJcblxyXG4uYmxvY2sgaDMge1xyXG4gICAgcGFkZGluZzogMDtcclxufVxyXG5cclxuLmNsZWFyQm90aCB7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG5cclxuLmNsZWFyTGVmdCB7XHJcbiAgICBjbGVhcjogbGVmdDtcclxufVxyXG5cclxuLmNsZWFyUmlnaHQge1xyXG4gICAgY2xlYXI6IHJpZ2h0O1xyXG59XHJcblxyXG4ubGluZSB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGNsZWFyOiBib3RoO1xyXG59XHJcblxyXG4uZml4ZWRMZWZ0IHtcclxuICAgIHdpZHRoOiAxMTBweDtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uZml4ZWRMZWZ0V2lkZSB7XHJcbiAgICB3aWR0aDogMTY1cHg7XHJcbiAgICBmbG9hdDogbGVmdDtcclxufVxyXG5cclxuLmZpeGVkTGVmdFdpZGVyIHtcclxuICAgIHdpZHRoOiAyMjBweDtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uZml4ZWRMZWZ0V2lkZXN0IHtcclxuICAgIHdpZHRoOiAyNTBweDtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uZmxvYXRSaWdodCB7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbn1cclxuXHJcbi5mbG9hdExlZnQge1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbn1cclxuXHJcbi5oaWRkZW4ge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuXHJcbi5zdGF0dXNEaXNwbGF5IHtcclxuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzQwNjI4YTtcclxuICAgIHBhZGRpbmc6IDRweDtcclxuICAgIG1hcmdpbjogM3B4IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG59XHJcblxyXG4uc3RhdHVzRGlzcGxheVJlY29yZHMge1xyXG4gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjUpO1xyXG4gICAgY29sb3I6ICNmZmZmZmY7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjNDA2MjhhO1xyXG4gICAgcGFkZGluZzogNHB4O1xyXG4gICAgbWFyZ2luOiAzcHggMDtcclxuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcclxuICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbn1cclxuXHJcbi5zdGF0dXNMYWJlbCB7XHJcbiAgICB3aWR0aDogMTM4cHg7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICBjb2xvcjogIzk4QjBDMztcclxufVxyXG5cclxuLnN0YXR1c1ZhbHVlIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uam9iVmFsdWVzIHtcclxuXHRmbG9hdDogbGVmdDtcclxuXHR3aWR0aDogMzAlO1xyXG59XHJcblxyXG4vLyBDSFJPTUVMRVNTIFNUVUZGXHJcblxyXG4uZmFuY3kge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuaS5mYW5jeSB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG59XHJcblxyXG4udGl0bGVidXR0b24oKSB7XHJcbiAgICBjb2xvcjogI0U5QzE4MztcclxuICAgIC8vIFNpbmNlIHdlJ3JlIG9uIHNvbWUgaGlsYXJpb3VzbHkgb3V0ZGF0ZWQgbGlicmFyaWVzLCB0aGUgYmVsb3cgaXMgYW4gaXNzdWVcclxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Gb3J0QXdlc29tZS9Gb250LUF3ZXNvbWUvaXNzdWVzLzEyNzRcclxuICAgIC8vIFVzaW5nIHRoZSAhaW1wb3J0YW50IGRpcmVjdGl2ZSBpcyBuZWNlc3NhcnkgdG8gb3ZlcnJpZGUgdGhlIEZBIHN0eWxlc1xyXG4gICAgY3Vyc29yOiBwb2ludGVyICFpbXBvcnRhbnQ7IFxyXG4gICAgei1pbmRleDogMTAyOyAvLyBUaGlzIGlzIGZvciB0aGUgY29ybmVycyAtIG1ha2VzIHN1cmUgdGhlIGJ1dHRvbnMgcmVuZGVyIG9uIHRvcFxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICAgIGNvbG9yOiBsaWdodGVuKCM5OGIwYzMsIDEwJSk7XHJcbiAgICB9XHJcbn1cclxuLm1pbmltaXplIHtcclxuICAgIC50aXRsZWJ1dHRvbjtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogNnB4O1xyXG4gICAgcmlnaHQ6IDQ2cHg7XHJcbn1cclxuLmNsb3NlIHtcclxuICAgIC50aXRsZWJ1dHRvbjtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogNHB4O1xyXG4gICAgcmlnaHQ6IDEycHg7XHJcbn0iLCIuY29ybmVyKCkge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgei1pbmRleDogMTAxO1xyXG4gICAgbWluLXdpZHRoOiAzMHB4O1xyXG4gICAgbWluLWhlaWdodDogMzBweDtcclxufVxyXG5cclxuI3VpQ29ybmVyVEwge1xyXG4gICAgLmNvcm5lcjtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICBiYWNrZ3JvdW5kOiBkYXRhLXVyaSgndGwucG5nJykgbm8tcmVwZWF0O1xyXG59XHJcblxyXG4vKiBSZXNpemluZyAoU3RvbGVuIGZyb20gR29vbiBDQy1CWS1OQy1TQSkgKi9cclxuQHJlc2l6ZTogNXB4O1xyXG4ucmVzaXplQXJlYSB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiA5OTk5OTtcclxufVxyXG4ucmVzaXplQXJlYS50b3Age1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMTBweDtcclxuICAgIHJpZ2h0OiAxMHB4O1xyXG4gICAgaGVpZ2h0OiBAcmVzaXplO1xyXG4gICAgY3Vyc29yOiBuLXJlc2l6ZTtcclxufVxyXG4ucmVzaXplQXJlYS50ciB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICByaWdodDogMDtcclxuICAgIGhlaWdodDogMTBweDtcclxuICAgIHdpZHRoOiAxMHB4O1xyXG4gICAgY3Vyc29yOiBuZS1yZXNpemU7XHJcbn1cclxuLnJlc2l6ZUFyZWEucmlnaHQge1xyXG4gICAgdG9wOiAxMHB4O1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBib3R0b206IDEwcHg7XHJcbiAgICB3aWR0aDogQHJlc2l6ZTtcclxuICAgIGN1cnNvcjogZS1yZXNpemU7XHJcbn1cclxuLnJlc2l6ZUFyZWEuYnIge1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBoZWlnaHQ6IDEwcHg7XHJcbiAgICB3aWR0aDogMTBweDtcclxuICAgIGN1cnNvcjogc2UtcmVzaXplO1xyXG59XHJcbi5yZXNpemVBcmVhLmJvdHRvbSB7XHJcbiAgICBib3R0b206IDA7XHJcbiAgICBsZWZ0OiAxMHB4O1xyXG4gICAgcmlnaHQ6IDEwcHg7XHJcbiAgICBoZWlnaHQ6IEByZXNpemU7XHJcbiAgICBjdXJzb3I6IHMtcmVzaXplO1xyXG59XHJcbi5yZXNpemVBcmVhLmJsIHtcclxuICAgIGJvdHRvbTogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICBoZWlnaHQ6IDEwcHg7XHJcbiAgICB3aWR0aDogMTBweDtcclxuICAgIGN1cnNvcjogc3ctcmVzaXplO1xyXG59XHJcbi5yZXNpemVBcmVhLmxlZnQge1xyXG4gICAgdG9wOiAxMHB4O1xyXG4gICAgbGVmdDogMDtcclxuICAgIGJvdHRvbTogMTBweDtcclxuICAgIHdpZHRoOiBAcmVzaXplO1xyXG4gICAgY3Vyc29yOiB3LXJlc2l6ZTtcclxufVxyXG4ucmVzaXplQXJlYS50bCB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgaGVpZ2h0OiAxMHB4O1xyXG4gICAgd2lkdGg6IDEwcHg7XHJcbiAgICBjdXJzb3I6IG53LXJlc2l6ZTtcclxufVxyXG4vKiBFbmQgUmVzaXppbmcgKi8iLCIvKiBJY29uc1xyXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuXHJcbi8qIHN0YXRlcyBhbmQgaW1hZ2VzICovXHJcbi51aUxpbmtQZW5kaW5nSWNvbiB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbiAgICB3aWR0aDogMTZweDtcclxuICAgIGhlaWdodDogMTZweDtcclxuICAgIG1hcmdpbjogMnB4IDJweCAwIDJweDtcclxuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCh1aUxpbmtQZW5kaW5nSWNvbi5naWYpO1xyXG59XHJcblxyXG4ubGlua1BlbmRpbmcgLmZhIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbi5saW5rUGVuZGluZyAudWlMaW5rUGVuZGluZ0ljb24ge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbn1cclxuXHJcbi5tYXBJY29uMTYge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgd2lkdGg6IDE2cHg7XHJcbiAgICBoZWlnaHQ6IDE2cHg7XHJcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwodWlJY29uczE2R3JlZW4ucG5nKTtcclxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtOTZweDtcclxuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XHJcbiAgICB6b29tOiAwLjEyNTtcclxuICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xyXG4gICAgLyptYXJnaW4tYm90dG9tOiAtMXB4OyovXHJcbn1cclxuLm1hcEljb24xNi5kZWFkICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCh1aUljb25zMTZSZWQucG5nKTsgICAgfVxyXG4ubWFwSWNvbjE2LmJhZCAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKHVpSWNvbnMxNlJlZC5wbmcpOyAgICB9XHJcbi5tYXBJY29uMTYuYXZlcmFnZSAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwodWlJY29uczE2T3JhbmdlLnBuZyk7IH1cclxuLm1hcEljb24xNi5nb29kICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCh1aUljb25zMTZHcmVlbi5wbmcpOyAgfVxyXG4vKiBBaXJBbGFybSAqL1xyXG4ubWFwSWNvbjE2Lmljb24tYWlyYWxhcm0gICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTQ0cHg7ICAgICAgICAgICAgICB9IFxyXG4vKiBDb21tYW5kIFBvc2l0aW9ucyAqL1xyXG4ubWFwSWNvbjE2LnJhbmstY2FwdGFpbiAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC0xMTJweDsgICAgICAgICB9IFxyXG4ubWFwSWNvbjE2LnJhbmstaGVhZG9mcGVyc29ubmVsICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC05NnB4OyAgICAgICAgICB9XHJcbi5tYXBJY29uMTYucmFuay1oZWFkb2ZzZWN1cml0eSAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTEyOHB4OyAgICAgICAgIH1cclxuLm1hcEljb24xNi5yYW5rLWNoaWVmZW5naW5lZXIgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMTEycHg7ICAgICAgICAgfVxyXG4ubWFwSWNvbjE2LnJhbmstcmVzZWFyY2hkaXJlY3RvciAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xMjhweDsgICAgICAgICB9XHJcbi5tYXBJY29uMTYucmFuay1jaGllZm1lZGljYWxvZmZpY2VyICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7ICAgICAgICAgIH1cclxuLyogRW5naW5lZXJpbmcgUG9zaXRpb25zICovXHJcbi5tYXBJY29uMTYucmFuay1zdGF0aW9uZW5naW5lZXIgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTExMnB4OyAgICAgICAgIH0gXHJcbi5tYXBJY29uMTYucmFuay1hdG1vc3BoZXJpY3RlY2huaWNpYW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTExMnB4OyAgICAgICAgIH1cclxuLyogTWVkaWNhbCBQb3NpdGlvbnMgKi9cclxuLm1hcEljb24xNi5yYW5rLW1lZGljYWxkb2N0b3IgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTEyOHB4OyAgICAgICAgICAgfSBcclxuLm1hcEljb24xNi5yYW5rLWdlbmV0aWNpc3QgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTEyOHB4OyAgICAgICAgICAgfVxyXG4ubWFwSWNvbjE2LnJhbmstcHN5Y2hpYXRyaXN0ICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7ICAgICAgICAgICB9XHJcbi5tYXBJY29uMTYucmFuay1jaGVtaXN0ICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7ICAgICAgICAgIH1cclxuLyogU2NpZW5jZSBQb3NpdGlvbnMgKi9cclxuLm1hcEljb24xNi5yYW5rLXNjaWVudGlzdCAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7ICAgICAgICAgfSBcclxuLm1hcEljb24xNi5yYW5rLWdlbmV0aWNpc3QgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7ICAgICAgICAgfVxyXG4ubWFwSWNvbjE2LnJhbmstcm9ib3RpY2lzdCAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xMjhweDsgICAgICAgICB9XHJcbi5tYXBJY29uMTYucmFuay14ZW5vYmlvbG9naXN0ICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTEyOHB4OyAgICAgICAgIH1cclxuLyogU2VjdXJpdHkgUG9zaXRpb25zICovXHJcbi5tYXBJY29uMTYucmFuay13YXJkZW4gICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTEyOHB4OyAgICAgICAgIH1cclxuLm1hcEljb24xNi5yYW5rLWRldGVjdGl2ZSAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTI4cHg7ICAgICAgICAgfVxyXG4ubWFwSWNvbjE2LnJhbmstc2VjdXJpdHlvZmZpY2VyICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xMjhweDsgICAgICAgICB9IiwidWwge1xyXG4gICAgcGFkZGluZzogNHB4IDAgMCAxMHB4O1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xyXG59XHJcblxyXG5saSB7XHJcbiAgICBwYWRkaW5nOiAwIDAgMnB4IDA7XHJcbn1cclxuXHJcbnRhYmxlLmZpeGVkIHtcclxuICAgIHRhYmxlLWxheW91dDpmaXhlZDtcclxufVxyXG5cclxudGFibGUuZml4ZWQgdGQge1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxufVxyXG5cclxuLyogVGFibGUgc3R5bGluZyBmb3IgdGhlIHBvd2VyIG1vbml0b3IgKi9cclxudGFibGUucG1vbiB7XHJcbiAgICBib3JkZXI6IDJweCBzb2xpZCBSb3lhbEJsdWU7XHJcbn1cclxuXHJcbnRhYmxlLnBtb24gdGQsIHRhYmxlLnBtb24gdGgge1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZCBibGFjaztcclxuICAgIHBhZGRpbmc6IDBweCA1cHggMHB4IDVweDtcclxufVxyXG5cclxuLyogVGFibGUgc3R5bGluZyBmb3IgdGhlIGNyZXcgbWFuaWZlc3QgKi9cclxuLm1hbmlmZXN0LWhlYWRlcihAY29sb3I6ICM2NjYpIHtcclxuXHRiYWNrZ3JvdW5kOiBAY29sb3I7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG59XHJcblxyXG50aC5jb21tYW5kIHtcclxuXHQubWFuaWZlc3QtaGVhZGVyKCMzMzMzRkYpO1xyXG59XHJcblxyXG50aC5zZWMge1xyXG5cdC5tYW5pZmVzdC1oZWFkZXIoIzhlMDAwMCk7XHJcbn1cclxuXHJcbnRoLm1lZCB7XHJcblx0Lm1hbmlmZXN0LWhlYWRlcigjMDA2NjAwKTtcclxufVxyXG5cclxudGguZW5nIHtcclxuXHQubWFuaWZlc3QtaGVhZGVyKCNiMjczMDApO1xyXG59XHJcblxyXG50aC5zY2kge1xyXG5cdC5tYW5pZmVzdC1oZWFkZXIoI2E2NWJhNik7XHJcbn1cclxuXHJcbnRoLnNlciB7XHJcblx0Lm1hbmlmZXN0LWhlYWRlcigjNzEwMEFBKTtcclxufVxyXG5cclxudGguc3VwIHtcclxuXHQubWFuaWZlc3QtaGVhZGVyKCM2NjY2MjEpO1xyXG59XHJcblxyXG50aC5jaXYge1xyXG5cdC5tYW5pZmVzdC1oZWFkZXIoI2EzMjgwMCk7XHJcbn1cclxuXHJcbnRoLm1pc2Mge1xyXG5cdC5tYW5pZmVzdC1oZWFkZXI7XHJcbn1cclxuXHJcbnNwYW4ucW0tam9iIHtcclxuXHRjb2xvcjogbWl4KEBoaWdobGlnaHQtY29sb3IsIEBhdmVyYWdlLWNvbG9yLCAzMyUpO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbi8qIFN0cmlwZWQgbGluZXMgZm9yIHRhYmxlcyBhbmQgZGl2cyAqL1xyXG4uc3RyaXBlZCB7XHJcbiAgICAuc3RyaXBlZC1iYXNlKCkge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM0MDQwNDA7XHJcbiAgICB9XHJcbiAgICB0cjpudGgtY2hpbGQoZXZlbikge1xyXG4gICAgICAgIC5zdHJpcGVkLWJhc2U7XHJcbiAgICB9XHJcbiAgICAmOm5vdCh0YWJsZSkgPiA6bnRoLWNoaWxkKGV2ZW4pIHtcclxuICAgICAgICAuc3RyaXBlZC1iYXNlO1xyXG4gICAgfVxyXG59IiwiI3VpTm9TY3JpcHQge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICBsZWZ0OiA1MCU7XHJcbiAgICBtYXJnaW46IC02MHB4IDAgMCAtMTUwcHg7XHJcbiAgICB3aWR0aDogMjgwcHg7XHJcbiAgICBoZWlnaHQ6IDEyMHB4O1xyXG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcclxuICAgIGJvcmRlcjogMnB4IHNvbGlkICNmZjAwMDA7XHJcbiAgICBjb2xvcjogIzAwMDAwMDtcclxuICAgIGZvbnQtc2l6ZTogMTBweDtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgei1pbmRleDogOTk5OTtcclxuICAgIHBhZGRpbmc6IDBweCAxMHB4O1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcblxyXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAgIC5ub3RpY2UgfCBDYXV0aW9uIFN0cmlwZXNcclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuLm5vdGljZSB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBiYWNrZ3JvdW5kOiB1cmwodWlOb3RpY2VCYWNrZ3JvdW5kLmpwZykgNTAlIDUwJTtcclxuICAgIGNvbG9yOiAjMDAwMDAwO1xyXG4gICAgZm9udC1zaXplOiAxMnB4O1xyXG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBwYWRkaW5nOiAzcHggNHB4IDNweCA0cHg7XHJcbiAgICBtYXJnaW46IDRweCAwIDRweCAwO1xyXG59XHJcblxyXG4ubm90aWNlUGxhY2Vob2xkZXIge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgZm9udC1zaXplOiAxMnB4O1xyXG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBwYWRkaW5nOiAzcHggNHB4IDNweCA0cHg7XHJcbiAgICBtYXJnaW46IDRweCAwIDRweCAwO1xyXG59XHJcblxyXG4ubm90aWNlLmljb24ge1xyXG4gICAgcGFkZGluZzogMnB4IDRweCAwIDIwcHg7XHJcbn1cclxuXHJcbi5ub3RpY2UgaW1nIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTZweDtcclxuICAgIGhlaWdodDogMTZweDtcclxufVxyXG5cclxuZGl2Lm5vdGljZSB7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG4vKioqKioqKioqKioqKioqKioqKipcXFxyXG5cXCoqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHJcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICBQREEsIEROQSBNb2RpZmllciBzdHlsZXNcclxuICAgIERvbid0IGZpdCBhbnl3aGVyZSBlbHNlLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuLyogUERBIHN0eWxpbmcgKi9cclxuLndob2xlU2NyZWVuIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIGNvbG9yOiAjNTE3MDg3O1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5wZGFsaW5rIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICAgIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50O1xyXG5cclxuXHQmLmRpc2FibGVkIHtcclxuXHRcdGJhY2tncm91bmQ6IG5vbmU7XHJcblx0XHRib3JkZXI6IG5vbmU7XHJcblx0XHRjb2xvcjogIzk5OTtcclxuXHRcdHRleHQtYWxpZ246IGxlZnQ7XHJcblx0fVxyXG59XHJcblxyXG4ucGRhbm90ZSB7XHJcbiAgICBjb2xvcjogI2NkNjUwMDtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG4uaXRlbS5tYWlubWVudSB7XHJcblx0cGFkZGluZy1ib3R0b206IDAuNWVtO1xyXG59XHJcblxyXG5kaXYuY2xvY2sge1xyXG5cdGNvbG9yOiB3aGl0ZTtcclxuXHRmb250LXdlaWdodDogYm9sZDtcclxuXHRmbG9hdDogcmlnaHQ7XHJcblx0cGFkZGluZy1yaWdodDogMmVtO1xyXG59XHJcblxyXG4jcGRhRm9vdGVyIHtcclxuXHRwb3NpdGlvbjogZml4ZWQ7XHJcblx0bGVmdDogMDtcclxuXHRib3R0b206IDA7XHJcblx0d2lkdGg6IDEwMCU7XHJcblx0YmFja2dyb3VuZDogQGRhcmstY29sb3I7XHJcbn1cclxuXHJcbi5wZGFGb290ZXJCdXR0b24ge1xyXG5cdHdpZHRoOiAzMyU7XHJcblx0cGFkZGluZzogMC41ZW0gMDtcclxuXHRmb250LXNpemU6IDIwMCU7XHJcblx0Ym9yZGVyOiBub25lO1xyXG5cdGJhY2tncm91bmQ6IG5vbmU7XHJcblx0Y29sb3I6ICNmZmY7XHJcblxyXG5cdCYuaG92ZXIge1xyXG5cdFx0YmFja2dyb3VuZDogIzUwN2FhYztcclxuXHR9XHJcblxyXG5cdCYuZGlzYWJsZWQge1xyXG5cdFx0YmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50O1xyXG5cdFx0Y29sb3I6ICM1NTUgIWltcG9ydGFudDtcclxuXHR9XHJcblxyXG5cdC51aUxpbmtQZW5kaW5nSWNvbiB7XHJcblx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XHJcblx0XHR3aWR0aDogMzMlO1xyXG5cdFx0YmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxuXHRcdGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcclxuXHR9XHJcbn1cclxuXHJcbi8qIEROQSBNb2RpZmllciBzdHlsaW5nICovXHJcbi5kbmFCbG9jayB7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIHdpZHRoOiA5MHB4O1xyXG4gICAgcGFkZGluZzogMCAwIDVweCAwO1xyXG59XHJcblxyXG4uZG5hQmxvY2tOdW1iZXIge1xyXG4gICAgZm9udC1mYW1pbHk6IEZpeGVkLCBtb25vc3BhY2U7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgYmFja2dyb3VuZDogIzM2MzYzNjtcclxuICAgIG1pbi13aWR0aDogMjBweDtcclxuICAgIGhlaWdodDogMjBweDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5kbmFTdWJCbG9jayB7XHJcbiAgICBmb250LWZhbWlseTogRml4ZWQsIG1vbm9zcGFjZTtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1pbi13aWR0aDogMTZweDtcclxuICAgIGhlaWdodDogMjBweDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG5cclxuLm1hc2sge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHRvcDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgYmFja2dyb3VuZDogdXJsKHVpTWFza0JhY2tncm91bmQucG5nKTtcclxufVxyXG5cclxuLm1hc2tDb250ZW50IHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAyMDBweDtcclxuICAgIG1hcmdpbjogMjAwcHggMDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG4vKioqKioqKioqKioqKioqKioqKipcXFxyXG5cXCoqKioqKioqKioqKioqKioqKioqLyIsIkBpbXBvcnQgXCJfY29uZmlnXCI7XHJcblxyXG5ib2R5IHtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgZm9udC1mYW1pbHk6IEBmb250O1xyXG4gICAgZm9udC1zaXplOiBAZm9udHNpemU7XHJcbiAgICBsaW5lLWhlaWdodDogMTcwJTtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbn1cclxuXHJcbmhyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM0MDYyOGE7XHJcbiAgICBoZWlnaHQ6IDFweDtcclxuICAgIGJvcmRlcjogbm9uZTtcclxufVxyXG5cclxuaW1nLCBhIGltZyB7XHJcbiAgICBib3JkZXItc3R5bGU6IG5vbmU7XHJcbn1cclxuXHJcbmgxLCBoMiwgaDMsIGg0LCBoNSwgaDYge1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMTJweCAwIDZweCAwO1xyXG4gICAgY29sb3I6ICNGRkZGRkY7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG5cclxuaDEge1xyXG4gICAgZm9udC1zaXplOiAxOHB4O1xyXG59XHJcblxyXG5oMiB7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbn1cclxuXHJcbmgzIHtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxufVxyXG5cclxuaDQge1xyXG4gICAgZm9udC1zaXplOiAxMnB4O1xyXG59IiwiKltkYXRhLXRvb2x0aXBdIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcblxyXG4gICY6OmFmdGVyIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHdpZHRoOiAyNTBweDtcclxuICAgIHBhZGRpbmc6IDEwcHg7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XHJcblxyXG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xyXG4gICAgb3BhY2l0eTogMDtcclxuXHJcbiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xyXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS10b29sdGlwKTtcclxuXHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgLjVzO1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMzNjM2MzY7XHJcbiAgfVxyXG5cclxuICAmOmhvdmVyOjphZnRlciB7XHJcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xyXG4gICAgb3BhY2l0eTogMTtcclxuICB9XHJcblxyXG4gICYudG9vbHRpcFRvcDo6YWZ0ZXIge1xyXG4gICAgYm90dG9tOiAxMDAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoOHB4KTtcclxuICB9XHJcbiAgJi50b29sdGlwVG9wOmhvdmVyOjphZnRlciB7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtOHB4KTtcclxuICB9XHJcblxyXG4gICYudG9vbHRpcEJvdHRvbTo6YWZ0ZXIge1xyXG4gICAgdG9wOiAxMDAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLThweCk7XHJcbiAgfVxyXG4gICYudG9vbHRpcEJvdHRvbTpob3Zlcjo6YWZ0ZXIge1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoOHB4KTtcclxuICB9XHJcblxyXG4gICYudG9vbHRpcExlZnQ6OmFmdGVyIHtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgcmlnaHQ6IDEwMCU7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoOHB4KSB0cmFuc2xhdGVZKC01MCUpO1xyXG4gIH1cclxuICAmLnRvb2x0aXBMZWZ0OmhvdmVyOjphZnRlciB7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLThweCkgdHJhbnNsYXRlWSgtNTAlKTtcclxuICB9XHJcblxyXG4gICYudG9vbHRpcFJpZ2h0OjphZnRlciB7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIGxlZnQ6IDEwMCU7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLThweCkgdHJhbnNsYXRlWSgtNTAlKTtcclxuICB9XHJcbiAgJi50b29sdGlwUmlnaHQ6aG92ZXI6OmFmdGVyIHtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg4cHgpIHRyYW5zbGF0ZVkoLTUwJSk7XHJcbiAgfVxyXG59IixudWxsLCJAY2hhcnNldCBcInV0Zi04XCI7XHJcblxyXG5AaW1wb3J0IFwiX2JhcnNcIjtcclxuQGltcG9ydCBcIl9saW5rXCI7XHJcbkBpbXBvcnQgXCJfY29sb3JcIjtcclxuQGltcG9ydCBcIl9jb25maWdcIjtcclxuQGltcG9ydCBcIl9kaXNwbGF5XCI7XHJcbkBpbXBvcnQgXCJfZm9ybWF0dGluZ1wiO1xyXG5AaW1wb3J0IFwiX2ZhbmN5XCI7XHJcbkBpbXBvcnQgXCJfaWNvblwiO1xyXG5AaW1wb3J0IFwiX2xpc3RzXCI7XHJcbkBpbXBvcnQgXCJfbWlzY1wiO1xyXG5AaW1wb3J0IFwiX25hdGl2ZVwiO1xyXG5AaW1wb3J0IFwiX3Rvb2x0aXBcIjtcclxuXHJcblxyXG4ubWFpbkJHIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHotaW5kZXg6IC0xO1xyXG4gICAgdG9wOiAzMHB4O1xyXG4gICAgbGVmdDogMHB4O1xyXG4gICAgcmlnaHQ6IDBweDtcclxuICAgIGJvdHRvbTogMHB4O1xyXG4gICAgYmFja2dyb3VuZDogZGF0YS11cmkoJ25hbm90cmFzZW4uc3ZnJykgbm8tcmVwZWF0IGZpeGVkIGNlbnRlci83MCUgNzAlLFxyXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sXHJcbiAgICAgICAgQGJhY2tncm91bmQtc3RhcnQgMCUsXHJcbiAgICAgICAgQGJhY2tncm91bmQtZW5kIDEwMCUpIG5vLXJlcGVhdCBmaXhlZCBjZW50ZXIvMTAwJSAxMDAlO1xyXG59XHJcblxyXG4vL25hbm8gc2Nyb2xsYmFyIHN0eWxpbmdcclxuaHRtbCxib2R5IHtcclxuICAgIHNjcm9sbGJhci1mYWNlLWNvbG9yOiM2NjY2NjY7XHJcbiAgICBzY3JvbGxiYXItYXJyb3ctY29sb3I6I0U5QzE4MztcclxuICAgIHNjcm9sbGJhci10cmFjay1jb2xvcjojMzYzNjM2O1xyXG4gICAgc2Nyb2xsYmFyLXNoYWRvdy1jb2xvcjojNTU1NTU1OyAgICBcclxufVxyXG5cclxuI3VpV3JhcHBlciB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcclxuICAgIHVzZXItc2VsZWN0OiBub25lO1xyXG59XHJcblxyXG4jdWlUaXRsZVdyYXBwZXIge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgbWluLWhlaWdodDogMzBweDtcclxuICAgIG1pbi13aWR0aDogMTAwJTsgXHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzYzNjM2O1xyXG4gICAgbGVmdDogMHB4O1xyXG4gICAgdG9wOiAwcHg7XHJcbiAgICByaWdodDogMHB4O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIHotaW5kZXg6IDEwMDtcclxuICAgICYgPiBkaXYge1xyXG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcclxuICAgIH1cclxuICAgICYgPiBpIHtcclxuICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbiN1aVRpdGxlVGV4dCB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDZweDtcclxuICAgIGxlZnQ6IDQ0cHg7XHJcbiAgICB3aWR0aDogNjYlO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIGNvbG9yOiAjRTlDMTgzO1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG59XHJcblxyXG4jdWlUaXRsZS5pY29uIHtcclxuICAgIHBhZGRpbmc6IDZweCA4cHggNnB4IDQycHg7XHJcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggNTAlO1xyXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxufVxyXG5cclxuI3VpVGl0bGVGbHVmZiB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDRweDtcclxuICAgIHJpZ2h0OiAxMnB4O1xyXG4gICAgd2lkdGg6IDQycHg7XHJcbiAgICBoZWlnaHQ6IDI0cHg7XHJcbiAgICBiYWNrZ3JvdW5kOiBkYXRhLXVyaSgnbmFub3RyYXNlbi5zdmcnKSA1MCUgNTAlIG5vLXJlcGVhdDtcclxufVxyXG5cclxuLnN0YXR1c2ljb24ge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiA0cHg7XHJcbiAgICBsZWZ0OiAxMnB4O1xyXG59XHJcblxyXG4jdWlNYXBXcmFwcGVyIHtcclxuICAgIGNsZWFyOiBib3RoO1xyXG4gICAgcGFkZGluZzogOHB4O1xyXG4gICAgbWFyZ2luLXRvcDogMzBweDtcclxufVxyXG5cclxuI3VpTWFwSGVhZGVyIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIGNsZWFyOiBib3RoO1xyXG59XHJcblxyXG4jdWlNYXBDb250YWluZXIge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDYwMHB4O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM0MDYyOGE7XHJcbiAgICBiYWNrZ3JvdW5kOiB1cmwobmFub21hcEJhY2tncm91bmQucG5nKTtcclxufVxyXG5cclxuI3VpTWFwIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgbWFyZ2luOiAtNTEycHggMCAwIC01MTJweDtcclxuICAgIHdpZHRoOiAyNTZweDtcclxuICAgIGhlaWdodDogMjU2cHg7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgem9vbTogNDtcclxufVxyXG5cclxuI3VpTWFwSW1hZ2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgYm90dG9tOiAxcHg7XHJcbiAgICBsZWZ0OiAxcHg7XHJcbiAgICB3aWR0aDogMjU2cHg7XHJcbiAgICBoZWlnaHQ6IDI1NnB4O1xyXG59XHJcblxyXG4jdWlNYXBDb250ZW50IHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIGJvdHRvbTogLTEzLjVweDtcclxuICAgIGxlZnQ6IDBweDtcclxuICAgIHdpZHRoOiAyNTZweDtcclxuICAgIGhlaWdodDogMjU2cHg7XHJcbn1cclxuXHJcbiN1aU1hcEZvb3RlciB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG5cclxuI3VpQ29udGVudCB7XHJcbiAgICBjbGVhcjogYm90aDtcclxuICAgIHBhZGRpbmc6IDhweDtcclxuICAgIG1hcmdpbi10b3A6IDMwcHg7XHJcbn1cclxuXHJcbiN1aU1hcFRvb2x0aXAge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgcmlnaHQ6IDEwcHg7XHJcbiAgICB0b3A6IDEwcHg7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjNDA2MjhhO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzI3MjcyNztcclxuICAgIHBhZGRpbmc6IDhweDtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICB6LWluZGV4OiA5OTk5O1xyXG59XHJcblxyXG4jdWlMb2FkaW5nTm90aWNlIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIGJhY2tncm91bmQ6IHVybCh1aU5vdGljZUJhY2tncm91bmQuanBnKSA1MCUgNTAlO1xyXG4gICAgY29sb3I6ICMwMDAwMDA7XHJcbiAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIHBhZGRpbmc6IDNweCA0cHggM3B4IDRweDtcclxuICAgIG1hcmdpbjogNHB4IDAgNHB4IDA7XHJcbn1cclxuXHJcbi51bmRlclRpdGxlIHtcclxuICAgIG1hcmdpbi10b3A6IDMwcHg7XHJcbn0iXX0= */ +@charset "utf-8";@font-face{font-family:'FontAwesome';src:url(fontawesome-webfont.eot?v=4.7.0);src:url(fontawesome-webfont.eot?#iefix&v=4.7.0) format('embedded-opentype'),url(fontawesome-webfont.woff2?v=4.7.0) format('woff2'),url(fontawesome-webfont.woff?v=4.7.0) format('woff'),url(fontawesome-webfont.ttf?v=4.7.0) format('truetype'),url(fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul > li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:0.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:0.2em 0.25em 0.15em;border:solid 0.08em #eee;border-radius:0.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:0.3em}.fa.fa-pull-right{margin-left:0.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:0.3em}.fa.pull-right{margin-left:0.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0)}100%{transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.displayBar{position:relative;width:236px;height:16px;border:1px solid #666;float:left;margin:0 5px 0 0;overflow:hidden;background:#000}.displayBarText{position:absolute;top:-2px;left:5px;width:100%;height:100%;color:#fff;font-weight:normal}.displayBarFill{width:0%;height:100%;background:#40628a;overflow:hidden;float:left}.displayBarFill.alignRight{float:right}.displayBarText.good{color:#fff}.displayBarText.notgood{color:#fff}.displayBarText.average{color:#fff}.displayBarText.bad{color:#fff}.displayBarText.highlight{color:#000}.displayBarFill.good{color:#fff;background:#4f7529}.displayBarFill.notgood{color:#fff;background:#ffb400}.displayBarFill.average{color:#fff;background:#cd6500}.displayBarFill.bad{color:#fff;background:#e00}.displayBarFill.highlight{color:#fff;background:#8ba5c4}.disabled,.link,.linkDiscourage,.linkEncourage,.linkOff,.linkOn,.redButton,.selected,.yellowButton{float:left;min-width:15px;height:16px;text-align:center;color:#fff;text-decoration:none;background:#40628a;border:1px solid #161616;padding:0 4px 4px 4px;margin:0 2px 2px 0;cursor:default;white-space:nowrap}.hasIcon{padding:0 4px 4px 0}.linkActive.hover,.zoomLink.hover,a.hover{background:#507aac}@keyframes pendingAnimation{to{color:#fff;background:#507aac}}.linkPending,.linkPending.hover{animation-name:pendingAnimation;animation-duration:0.25s}a.white,a.white:active,a.white:link,a.white:visited{color:#40628a;text-decoration:none;background:#fff;border:1px solid #161616;padding:1px 4px 1px 4px;margin:0 2px 0 0;cursor:default}a.white.hover{color:#fff;background:#40628a}.linkOn,.selected,a.linkOn.hover,a.linkOn:active,a.linkOn:link,a.linkOn:visited,a.selected.hover,a.selected:active,a.selected:link,a.selected:visited{color:#fff;background:#2f943c}.disabled,.linkOff,a.disabled.hover,a.disabled:active,a.disabled:link,a.disabled:visited,a.linkOff.hover,a.linkOff:active,a.linkOff:link,a.linkOff:visited{color:#fff;background:#999;border-color:#666}.disabled.icon,.linkOff.icon,.linkOn.icon,.selected.icon,a.icon{position:relative;padding:1px 4px 2px 20px}.disabled.icon img,.linkOff.icon img,.linkOn.icon img,.selected.icon img,a.icon img{position:absolute;top:0;left:0;width:18px;height:18px}.linkDanger,a.linkDanger:active,a.linkDanger:link,a.linkDanger:visited{color:#fff;background-color:red;border-color:#a00}.linkDanger.hover{background-color:#f66}.linkEncourage,a.linkEncourage:active,a.linkEncourage:link,a.linkEncourage:visited{color:#9f3;background-color:#40628a;border-color:#161616}.linkEncourage.hover{background-color:#507aac}.linkDiscourage,a.linkDiscourage:active,a.linkDiscourage:link,a.linkDiscourage:visited{color:#8c8c8c;background-color:#40628a;border-color:#161616}.linkDiscourage.hover{color:red;background-color:#507aac}.inactive,a.inactive.hover,a.inactive:active,a.inactive:link,a.inactive:visited{color:#fff;background:#999;border-color:#666}.white{color:#fff;font-weight:bold}.good{color:#4f7529;font-weight:bold}.average{color:#cd6500;font-weight:bold}.bad{color:#e00;font-weight:bold}.idle{color:#272727;font-weight:bold}.redButton{background:#ea0000}.yellowButton{background:#cacc00}.highlight{color:#8ba5c4}.dark{color:#272727}.burn{color:orange}.brute{color:red}.toxin{color:green}.toxin_light{color:#3adf00}.oxyloss{color:#00f}.oxyloss_light{color:#6698ff}.Red{color:red}.Blue{color:#00f}.Green{color:#0f0}.Marigold{color:#fda505}.Fuschia{color:#ff0080}.Black{color:#000}.Pearl{color:#c6cacb}.cold1{color:#94b8ff}.cold2{color:#69f}.cold3{color:#293d66}.hot1{color:#f96}.hot2{color:#993d00}.hot3{color:#f60}div.display{padding:4px;margin:6px 0;background-color:#000;background-color:rgba(0, 0, 0, 0.33);box-shadow:inset 0 0 5px rgba(0, 0, 0, 0.5)}div.display header{display:block;position:relative;width:98.5%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}div.display header .buttonRight{position:absolute;bottom:6px;right:4px}div.display article{display:table;width:100%;border-collapse:collapse}.itemGroup{border:1px solid #e9c183;background:#2c2c2c;padding:4px;clear:both}.item{width:100%;margin:4px 0 0 0;clear:both;overflow:auto}.itemContent,.itemContentNarrow{float:left}.itemContentNarrow{width:30%}.itemContent{width:69%}.itemLabel,.itemLabelNarrow,.itemLabelWide,.itemLabelWider,.itemLabelWidest{float:left;color:#e9c183}.itemLabelNarrow{width:20%}.itemLabel{width:30%}.itemLabelWide{width:45%}.itemLabelWider{width:69%}.itemLabelWidest{width:100%}.itemContentWide{float:left;width:79%}.itemContentSmall{float:left;width:33%}.itemContentMedium{float:left;width:55%}.block{padding:8px;margin:10px 4px 4px 4px;border:1px solid #40628a;background-color:#202020}.block h3{padding:0}.clearBoth{clear:both}.clearLeft{clear:left}.clearRight{clear:right}.line{width:100%;clear:both}.fixedLeft{width:110px;float:left}.fixedLeftWide{width:165px;float:left}.fixedLeftWider{width:220px;float:left}.fixedLeftWidest{width:250px;float:left}.floatRight{float:right}.floatLeft{float:left}.hidden{display:none}.statusDisplay{background:#000;background:rgba(0, 0, 0, 0.5);color:#fff;border:1px solid #40628a;padding:4px;margin:3px 0;overflow:hidden}.statusDisplayRecords{background:#000;background:rgba(0, 0, 0, 0.5);color:#fff;border:1px solid #40628a;padding:4px;margin:3px 0;overflow-x:hidden;overflow-y:auto}.statusLabel{width:138px;float:left;overflow:hidden;color:#98b0c3}.statusValue{float:left}.jobValues{float:left;width:30%}.fancy{display:none}i.fancy{display:none}.minimize{color:#e9c183;cursor:pointer!important;z-index:102;position:absolute;top:6px;right:46px}.minimize:hover{color:#b8c9d6}.close{color:#e9c183;cursor:pointer!important;z-index:102;position:absolute;top:4px;right:12px}.close:hover{color:#b8c9d6}#uiCornerTL{position:fixed;z-index:101;min-width:30px;min-height:30px;top:0;left:0;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGTGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE4LTExLTIwVDIyOjM4OjI1LTA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOC0xMS0yMFQyMzowMzowMS0wODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOC0xMS0yMFQyMzowMzowMS0wODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpkOWRlMzc1Yi04ZWQwLWI3NDctOTQzZS0zN2UwZGU2NDkyODQiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo0ZmVhZjJmZC03YWVhLWUyNGQtYTNkZS05ZmI5ZGM0ZTA0YzIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjZTU4OTk5My1mZDU2LTEzNDktYWMyMC03NGZkZmY5NjNjYTgiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmNlNTg5OTkzLWZkNTYtMTM0OS1hYzIwLTc0ZmRmZjk2M2NhOCIgc3RFdnQ6d2hlbj0iMjAxOC0xMS0yMFQyMjozODoyNS0wODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gaW1hZ2UvZ2lmIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZDlkZTM3NWItOGVkMC1iNzQ3LTk0M2UtMzdlMGRlNjQ5Mjg0IiBzdEV2dDp3aGVuPSIyMDE4LTExLTIwVDIzOjAzOjAxLTA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+QnRKRAAAAIhJREFUSIm1zLcRgEAMBMCDokQf9B/SBwQwmOeNzGkL2GnHhgSLrHPSC4Bfny+/vl9y/X6ZdfHS6v/LqasvoW690brzhur+66+Hr7PWvJ5a+Zpr/WurTa+htr7a2vGqat87rt3voI68vTr4Nuv4W68pb6VmvWVNfD81931q+nvVGS+ASUQyXgAHuOgYYwOkhIYAAAAASUVORK5CYII=) no-repeat}.resizeArea{position:absolute;z-index:99999}.resizeArea.top{top:0;left:10px;right:10px;height:5px;cursor:n-resize}.resizeArea.tr{top:0;right:0;height:10px;width:10px;cursor:ne-resize}.resizeArea.right{top:10px;right:0;bottom:10px;width:5px;cursor:e-resize}.resizeArea.br{bottom:0;right:0;height:10px;width:10px;cursor:se-resize}.resizeArea.bottom{bottom:0;left:10px;right:10px;height:5px;cursor:s-resize}.resizeArea.bl{bottom:0;left:0;height:10px;width:10px;cursor:sw-resize}.resizeArea.left{top:10px;left:0;bottom:10px;width:5px;cursor:w-resize}.resizeArea.tl{top:0;left:0;height:10px;width:10px;cursor:nw-resize}.uiLinkPendingIcon{display:none;float:left;width:16px;height:16px;margin:2px 2px 0 2px;background-image:url(uiLinkPendingIcon.gif)}.linkPending .fa{display:none}.linkPending .uiLinkPendingIcon{display:block}.mapIcon16{position:absolute;width:16px;height:16px;background-image:url(uiIcons16Green.png);background-position:-144px -96px;background-repeat:no-repeat;zoom:0.125;margin-left:-1px}.mapIcon16.dead{background-image:url(uiIcons16Red.png)}.mapIcon16.bad{background-image:url(uiIcons16Red.png)}.mapIcon16.average{background-image:url(uiIcons16Orange.png)}.mapIcon16.good{background-image:url(uiIcons16Green.png)}.mapIcon16.icon-airalarm{background-position:0 -144px}.mapIcon16.rank-captain{background-position:-224px -112px}.mapIcon16.rank-headofpersonnel{background-position:-112px -96px}.mapIcon16.rank-headofsecurity{background-position:-112px -128px}.mapIcon16.rank-chiefengineer{background-position:-176px -112px}.mapIcon16.rank-researchdirector{background-position:-128px -128px}.mapIcon16.rank-chiefmedicalofficer{background-position:-32px -128px}.mapIcon16.rank-stationengineer{background-position:-176px -112px}.mapIcon16.rank-atmospherictechnician{background-position:-176px -112px}.mapIcon16.rank-medicaldoctor{background-position:-32px -128px}.mapIcon16.rank-geneticist{background-position:-32px -128px}.mapIcon16.rank-psychiatrist{background-position:-32px -128px}.mapIcon16.rank-chemist{background-position:-32px -128px}.mapIcon16.rank-scientist{background-position:-128px -128px}.mapIcon16.rank-geneticist{background-position:-128px -128px}.mapIcon16.rank-roboticist{background-position:-128px -128px}.mapIcon16.rank-xenobiologist{background-position:-128px -128px}.mapIcon16.rank-warden{background-position:-112px -128px}.mapIcon16.rank-detective{background-position:-112px -128px}.mapIcon16.rank-securityofficer{background-position:-112px -128px}ul{padding:4px 0 0 10px;margin:0;list-style-type:none}li{padding:0 0 2px 0}table.fixed{table-layout:fixed}table.fixed td{overflow:hidden}table.pmon{border:2px solid #4169e1}table.pmon td,table.pmon th{border-bottom:1px dotted #000;padding:0 5px 0 5px}th.command{background:#33f;font-weight:bold;color:#fff}th.sec{background:#8e0000;font-weight:bold;color:#fff}th.med{background:#060;font-weight:bold;color:#fff}th.eng{background:#b27300;font-weight:bold;color:#fff}th.sci{background:#a65ba6;font-weight:bold;color:#fff}th.ser{background:#7100aa;font-weight:bold;color:#fff}th.sup{background:#666621;font-weight:bold;color:#fff}th.civ{background:#a32800;font-weight:bold;color:#fff}th.misc{background:#666;font-weight:bold;color:#fff}span.qm-job{color:#b77a41;font-weight:bold}.striped tr:nth-child(even){background-color:#404040}.striped:not(table) > :nth-child(even){background-color:#404040}#uiNoScript{position:fixed;top:50%;left:50%;margin:-60px 0 0 -150px;width:280px;height:120px;background:#fff;border:2px solid red;color:#000;font-size:10px;font-weight:bold;z-index:9999;padding:0 10px;text-align:center}.notice{position:relative;background:url(uiNoticeBackground.jpg) 50% 50%;color:#000;font-size:12px;font-style:italic;font-weight:bold;padding:3px 4px 3px 4px;margin:4px 0 4px 0}.noticePlaceholder{position:relative;font-size:12px;font-style:italic;font-weight:bold;padding:3px 4px 3px 4px;margin:4px 0 4px 0}.notice.icon{padding:2px 4px 0 20px}.notice img{position:absolute;top:0;left:0;width:16px;height:16px}div.notice{clear:both}.wholeScreen{position:absolute;color:#517087;font-size:16px;font-weight:bold;text-align:center}.pdalink{float:left;white-space:nowrap;cursor:default!important}.pdalink.disabled{background:none;border:none;color:#999;text-align:left}.pdanote{color:#cd6500;font-weight:bold}.item.mainmenu{padding-bottom:0.5em}div.clock{color:#fff;font-weight:bold;float:right;padding-right:2em}#pdaFooter{position:fixed;left:0;bottom:0;width:100%;background:#272727}.pdaFooterButton{width:33%;padding:0.5em 0;font-size:200%;border:none;background:none;color:#fff}.pdaFooterButton.hover{background:#507aac}.pdaFooterButton.disabled{background:none!important;color:#555!important}.pdaFooterButton .uiLinkPendingIcon{position:absolute;width:33%;background-repeat:no-repeat;background-position:center}.dnaBlock{float:left;width:90px;padding:0 0 5px 0}.dnaBlockNumber{font-family:Fixed,monospace;float:left;color:#fff;background:#363636;min-width:20px;height:20px;padding:0;text-align:center}.dnaSubBlock{font-family:Fixed,monospace;float:left;padding:0;min-width:16px;height:20px;text-align:center}.mask{position:fixed;left:0;top:0;width:100%;height:100%;background:url(uiMaskBackground.png)}.maskContent{width:100%;height:200px;margin:200px 0;text-align:center}body{color:#fff;font-family:Verdana,Geneva,sans-serif;font-size:12px;line-height:170%;margin:0;padding:0}hr{background-color:#40628a;height:1px;border:none}a img,img{border-style:none}h1,h2,h3,h4,h5,h6{margin:0;padding:12px 0 6px 0;color:#fff;clear:both}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}*[data-tooltip]{position:relative}*[data-tooltip]::after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";opacity:0;white-space:normal;text-align:left;content:attr(data-tooltip);transition:all 0.5s;border:1px solid #999;background-color:#363636}*[data-tooltip]:hover::after{visibility:visible;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";opacity:1}*[data-tooltip].tooltipTop::after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}*[data-tooltip].tooltipTop:hover::after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}*[data-tooltip].tooltipBottom::after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}*[data-tooltip].tooltipBottom:hover::after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}*[data-tooltip].tooltipLeft::after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}*[data-tooltip].tooltipLeft:hover::after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}*[data-tooltip].tooltipRight::after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}*[data-tooltip].tooltipRight:hover::after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}.mainBG{position:fixed;z-index:-1;top:30px;left:0;right:0;bottom:0;background:url(data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0D%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.0%22%20viewBox%3D%220%200%20425%20200%22%20opacity%3D%22.25%22%3E%0D%0A%20%20%3Cpath%20d%3D%22m%20178.00399%2C0.03869%20-71.20393%2C0%20a%206.7613422%2C6.0255495%200%200%200%20-6.76134%2C6.02555%20l%200%2C187.87147%20a%206.7613422%2C6.0255495%200%200%200%206.76134%2C6.02554%20l%2053.1072%2C0%20a%206.7613422%2C6.0255495%200%200%200%206.76135%2C-6.02554%20l%200%2C-101.544018%2072.21628%2C104.699398%20a%206.7613422%2C6.0255495%200%200%200%205.76015%2C2.87016%20l%2073.55487%2C0%20a%206.7613422%2C6.0255495%200%200%200%206.76135%2C-6.02554%20l%200%2C-187.87147%20a%206.7613422%2C6.0255495%200%200%200%20-6.76135%2C-6.02555%20l%20-54.71644%2C0%20a%206.7613422%2C6.0255495%200%200%200%20-6.76133%2C6.02555%20l%200%2C102.61935%20L%20183.76413%2C2.90886%20a%206.7613422%2C6.0255495%200%200%200%20-5.76014%2C-2.87017%20z%22%20%2F%3E%0D%0A%20%20%3Cpath%20d%3D%22M%204.8446333%2C22.10875%20A%2013.412039%2C12.501842%200%200%201%2013.477588%2C0.03924%20l%2066.118315%2C0%20a%205.3648158%2C5.000737%200%200%201%205.364823%2C5.00073%20l%200%2C79.87931%20z%22%20%2F%3E%0D%0A%20%20%3Cpath%20d%3D%22m%20420.15535%2C177.89119%20a%2013.412038%2C12.501842%200%200%201%20-8.63295%2C22.06951%20l%20-66.11832%2C0%20a%205.3648152%2C5.000737%200%200%201%20-5.36482%2C-5.00074%20l%200%2C-79.87931%20z%22%20%2F%3E%0D%0A%3C%2Fsvg%3E%0D%0A) no-repeat fixed center/70% 70%,linear-gradient(to bottom, #2a2a2a 0, #202020 100%) no-repeat fixed center/100% 100%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a', endColorstr='#ff202020', GradientType=0)}body,html{scrollbar-face-color:#666;scrollbar-arrow-color:#e9c183;scrollbar-track-color:#363636;scrollbar-shadow-color:#555}#uiWrapper{width:100%;height:100%;-ms-user-select:none;user-select:none}#uiTitleWrapper{position:fixed;min-height:30px;min-width:100%;background-color:#363636;left:0;top:0;right:0;overflow:hidden;z-index:100}#uiTitleWrapper > div{cursor:default}#uiTitleWrapper > i{cursor:default}#uiTitleText{position:absolute;top:6px;left:44px;width:66%;overflow:hidden;color:#e9c183;font-size:16px}#uiTitle.icon{padding:6px 8px 6px 42px;background-position:2px 50%;background-repeat:no-repeat}#uiTitleFluff{position:absolute;top:4px;right:12px;width:42px;height:24px;background:url(data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0D%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.0%22%20viewBox%3D%220%200%20425%20200%22%20opacity%3D%22.25%22%3E%0D%0A%20%20%3Cpath%20d%3D%22m%20178.00399%2C0.03869%20-71.20393%2C0%20a%206.7613422%2C6.0255495%200%200%200%20-6.76134%2C6.02555%20l%200%2C187.87147%20a%206.7613422%2C6.0255495%200%200%200%206.76134%2C6.02554%20l%2053.1072%2C0%20a%206.7613422%2C6.0255495%200%200%200%206.76135%2C-6.02554%20l%200%2C-101.544018%2072.21628%2C104.699398%20a%206.7613422%2C6.0255495%200%200%200%205.76015%2C2.87016%20l%2073.55487%2C0%20a%206.7613422%2C6.0255495%200%200%200%206.76135%2C-6.02554%20l%200%2C-187.87147%20a%206.7613422%2C6.0255495%200%200%200%20-6.76135%2C-6.02555%20l%20-54.71644%2C0%20a%206.7613422%2C6.0255495%200%200%200%20-6.76133%2C6.02555%20l%200%2C102.61935%20L%20183.76413%2C2.90886%20a%206.7613422%2C6.0255495%200%200%200%20-5.76014%2C-2.87017%20z%22%20%2F%3E%0D%0A%20%20%3Cpath%20d%3D%22M%204.8446333%2C22.10875%20A%2013.412039%2C12.501842%200%200%201%2013.477588%2C0.03924%20l%2066.118315%2C0%20a%205.3648158%2C5.000737%200%200%201%205.364823%2C5.00073%20l%200%2C79.87931%20z%22%20%2F%3E%0D%0A%20%20%3Cpath%20d%3D%22m%20420.15535%2C177.89119%20a%2013.412038%2C12.501842%200%200%201%20-8.63295%2C22.06951%20l%20-66.11832%2C0%20a%205.3648152%2C5.000737%200%200%201%20-5.36482%2C-5.00074%20l%200%2C-79.87931%20z%22%20%2F%3E%0D%0A%3C%2Fsvg%3E%0D%0A) 50% 50% no-repeat}.statusicon{position:absolute;top:4px;left:12px}#uiMapWrapper{clear:both;padding:8px;margin-top:30px}#uiMapHeader{position:relative;clear:both}#uiMapContainer{position:relative;width:100%;height:600px;overflow:hidden;border:1px solid #40628a;background:url(nanomapBackground.png)}#uiMap{position:absolute;top:50%;left:50%;margin:-512px 0 0 -512px;width:256px;height:256px;overflow:hidden;zoom:4}#uiMapImage{position:absolute;bottom:1px;left:1px;width:256px;height:256px}#uiMapContent{position:absolute;bottom:-13.5px;left:0;width:256px;height:256px}#uiMapFooter{position:relative;clear:both}#uiContent{clear:both;padding:8px;margin-top:30px}#uiMapTooltip{position:absolute;right:10px;top:10px;border:1px solid #40628a;background-color:#272727;padding:8px;display:none;z-index:9999}#uiLoadingNotice{position:relative;background:url(uiNoticeBackground.jpg) 50% 50%;color:#000;font-size:14px;font-style:italic;font-weight:bold;padding:3px 4px 3px 4px;margin:4px 0 4px 0}.underTitle{margin-top:30px} +/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBhdGgubGVzcyIsImljb25zLmxlc3MiLCJjb3JlLmxlc3MiLCJsYXJnZXIubGVzcyIsImZpeGVkLXdpZHRoLmxlc3MiLCJsaXN0Lmxlc3MiLCJib3JkZXJlZC1wdWxsZWQubGVzcyIsImFuaW1hdGVkLmxlc3MiLCJtaXhpbnMubGVzcyIsIm5hbm91aS5jc3MiLCJyb3RhdGVkLWZsaXBwZWQubGVzcyIsInN0YWNrZWQubGVzcyIsInNjcmVlbi1yZWFkZXIubGVzcyIsIl9iYXJzLmxlc3MiLCJfbGluay5sZXNzIiwiX2NvbG9yLmxlc3MiLCJfZGlzcGxheS5sZXNzIiwiX2Zvcm1hdHRpbmcubGVzcyIsIl9mYW5jeS5sZXNzIiwiX2ljb24ubGVzcyIsIl9saXN0cy5sZXNzIiwiX21pc2MubGVzcyIsIl9uYXRpdmUubGVzcyIsIl90b29sdGlwLmxlc3MiLCI8bm8gc291cmNlPiIsIm5hbm91aS5sZXNzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJpQkFHQSxXQUNFLFlBQUEsY0FDQSxJQUFBLHFDQUNBLElBQUEsNENBQUEsMkJBQUEsQ0FBQSx1Q0FBQSxlQUFBLENBQUEsc0NBQUEsY0FBQSxDQUFBLHFDQUFBLGtCQUFBLENBQUEsd0RBQUEsY0FNQSxZQUFBLE9BQ0EsV0FBQSxPQ2JELElDSUMsUUFBQSxhQUNBLEtBQUEsT0FBQSxPQUFBLE9BQUEsSUFBQSxDQUFBLEVBQUEsWUFDQSxVQUFBLFFBQ0EsZUFBQSxLQUNBLHVCQUFBLFlBQ0Esd0JBQUEsVURURCxPRUtDLFVBQUEsYUFDQSxZQUFBLE9BQ0EsZUFBQSxLRlBELE9FU3NCLFVBQUEsSUZUdEIsT0VVc0IsVUFBQSxJRlZ0QixPRVdzQixVQUFBLElGWHRCLE9FWXNCLFVBQUEsSUZadEIsT0dHQyxNQUFBLGFBQ0EsV0FBQSxPSEpELE9JSUMsYUFBQSxFQUNBLFlBQUEsYUFDQSxnQkFBQSxLSk5ELFlJT1EsU0FBQSxTSlBSLE9JVUMsU0FBQSxTQUNBLEtBQUEsY0FDQSxNQUFBLGFBQ0EsSUFBQSxhQUNBLFdB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LE1BQUEsS0FDQSxRQUFBLElBQ0EsV0FBQSxLQUdKLGNBQ0ksU0FBQSxTQUNBLE1BQUEsS0FDQSxJQUFBLEtBQ0EsT0FBQSxJQUFBLE1BQUEsUUFDQSxpQkFBQSxRQUNBLFFBQUEsSUFDQSxRQUFBLEtBQ0EsUUFBQSxLQUdKLGlCQUNJLFNBQUEsU0FDQSxXQUFBLDRCQUFBLElBQUEsSUFDQSxNQUFBLEtBQ0EsVUFBQSxLQUNBLFdBQUEsT0FDQSxZQUFBLEtBQ0EsUUFBQSxJQUFBLElBQUEsSUFBQSxJQUNBLE9BQUEsSUFBQSxFQUFBLElBQUEsRUFHSixZQUNJLFdBQUEiLCJmaWxlIjoibmFub3VpLmNzcyIsInNvdXJjZXNDb250ZW50IjpbbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIi8qIVxuICogIEZvbnQgQXdlc29tZSA0LjcuMCBieSBAZGF2ZWdhbmR5IC0gaHR0cDovL2ZvbnRhd2Vzb21lLmlvIC0gQGZvbnRhd2Vzb21lXG4gKiAgTGljZW5zZSAtIGh0dHA6Ly9mb250YXdlc29tZS5pby9saWNlbnNlIChGb250OiBTSUwgT0ZMIDEuMSwgQ1NTOiBNSVQgTGljZW5zZSlcbiAqL1xuLyogRk9OVCBQQVRIXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuQGZvbnQtZmFjZSB7XG4gIGZvbnQtZmFtaWx5OiAnRm9udEF3ZXNvbWUnO1xuICBzcmM6IHVybCgnZm9udGF3ZXNvbWUtd2ViZm9udC5lb3Q/dj00LjcuMCcpO1xuICBzcmM6IHVybCgnZm9udGF3ZXNvbWUtd2ViZm9udC5lb3Q/I2llZml4JnY9NC43LjAnKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksIHVybCgnZm9udGF3ZXNvbWUtd2ViZm9udC53b2ZmMj92PTQuNy4wJykgZm9ybWF0KCd3b2ZmMicpLCB1cmwoJ2ZvbnRhd2Vzb21lLXdlYmZvbnQud29mZj92PTQuNy4wJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnZm9udGF3ZXNvbWUtd2ViZm9udC50dGY/dj00LjcuMCcpIGZvcm1hdCgndHJ1ZXR5cGUnKSwgdXJsKCdmb250YXdlc29tZS13ZWJmb250LnN2Zz92PTQuNy4wI2ZvbnRhd2Vzb21lcmVndWxhcicpIGZvcm1hdCgnc3ZnJyk7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcbn1cbi5mYSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgZm9udDogbm9ybWFsIG5vcm1hbCBub3JtYWwgMTRweC8xIEZvbnRBd2Vzb21lO1xuICBmb250LXNpemU6IGluaGVyaXQ7XG4gIHRleHQtcmVuZGVyaW5nOiBhdXRvO1xuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcbn1cbi8qIG1ha2VzIHRoZSBmb250IDMzJSBsYXJnZXIgcmVsYXRpdmUgdG8gdGhlIGljb24gY29udGFpbmVyICovXG4uZmEtbGcge1xuICBmb250LXNpemU6IDEuMzMzMzMzMzNlbTtcbiAgbGluZS1oZWlnaHQ6IDAuNzVlbTtcbiAgdmVydGljYWwtYWxpZ246IC0xNSU7XG59XG4uZmEtMngge1xuICBmb250LXNpemU6IDJlbTtcbn1cbi5mYS0zeCB7XG4gIGZvbnQtc2l6ZTogM2VtO1xufVxuLmZhLTR4IHtcbiAgZm9udC1zaXplOiA0ZW07XG59XG4uZmEtNXgge1xuICBmb250LXNpemU6IDVlbTtcbn1cbi5mYS1mdyB7XG4gIHdpZHRoOiAxLjI4NTcxNDI5ZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi5mYS11bCB7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgbWFyZ2luLWxlZnQ6IDIuMTQyODU3MTRlbTtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xufVxuLmZhLXVsID4gbGkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4uZmEtbGkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IC0yLjE0Mjg1NzE0ZW07XG4gIHdpZHRoOiAyLjE0Mjg1NzE0ZW07XG4gIHRvcDogMC4xNDI4NTcxNGVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG4uZmEtbGkuZmEtbGcge1xuICBsZWZ0OiAtMS44NTcxNDI4NmVtO1xufVxuLmZhLWJvcmRlciB7XG4gIHBhZGRpbmc6IDAuMmVtIDAuMjVlbSAwLjE1ZW07XG4gIGJvcmRlcjogc29saWQgMC4wOGVtICNlZWU7XG4gIGJvcmRlci1yYWRpdXM6IDAuMWVtO1xufVxuLmZhLXB1bGwtbGVmdCB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuLmZhLXB1bGwtcmlnaHQge1xuICBmbG9hdDogcmlnaHQ7XG59XG4uZmEuZmEtcHVsbC1sZWZ0IHtcbiAgbWFyZ2luLXJpZ2h0OiAwLjNlbTtcbn1cbi5mYS5mYS1wdWxsLXJpZ2h0IHtcbiAgbWFyZ2luLWxlZnQ6IDAuM2VtO1xufVxuLyogRGVwcmVjYXRlZCBhcyBvZiA0LjQuMCAqL1xuLnB1bGwtcmlnaHQge1xuICBmbG9hdDogcmlnaHQ7XG59XG4ucHVsbC1sZWZ0IHtcbiAgZmxvYXQ6IGxlZnQ7XG59XG4uZmEucHVsbC1sZWZ0IHtcbiAgbWFyZ2luLXJpZ2h0OiAwLjNlbTtcbn1cbi5mYS5wdWxsLXJpZ2h0IHtcbiAgbWFyZ2luLWxlZnQ6IDAuM2VtO1xufVxuLmZhLXNwaW4ge1xuICBhbmltYXRpb246IGZhLXNwaW4gMnMgaW5maW5pdGUgbGluZWFyO1xufVxuLmZhLXB1bHNlIHtcbiAgYW5pbWF0aW9uOiBmYS1zcGluIDFzIGluZmluaXRlIHN0ZXBzKDgpO1xufVxuQGtleWZyYW1lcyBmYS1zcGluIHtcbiAgMCUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICB9XG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDM1OWRlZyk7XG4gIH1cbn1cbi5mYS1yb3RhdGUtOTAge1xuICAtbXMtZmlsdGVyOiBcInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CYXNpY0ltYWdlKHJvdGF0aW9uPTEpXCI7XG4gIC1tcy10cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XG4gIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcbn1cbi5mYS1yb3RhdGUtMTgwIHtcbiAgLW1zLWZpbHRlcjogXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQmFzaWNJbWFnZShyb3RhdGlvbj0yKVwiO1xuICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbiAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbn1cbi5mYS1yb3RhdGUtMjcwIHtcbiAgLW1zLWZpbHRlcjogXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQmFzaWNJbWFnZShyb3RhdGlvbj0zKVwiO1xuICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTtcbiAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTtcbn1cbi5mYS1mbGlwLWhvcml6b250YWwge1xuICAtbXMtZmlsdGVyOiBcInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CYXNpY0ltYWdlKHJvdGF0aW9uPTAsIG1pcnJvcj0xKVwiO1xuICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgtMSwgMSk7XG4gIHRyYW5zZm9ybTogc2NhbGUoLTEsIDEpO1xufVxuLmZhLWZsaXAtdmVydGljYWwge1xuICAtbXMtZmlsdGVyOiBcInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CYXNpY0ltYWdlKHJvdGF0aW9uPTIsIG1pcnJvcj0xKVwiO1xuICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgxLCAtMSk7XG4gIHRyYW5zZm9ybTogc2NhbGUoMSwgLTEpO1xufVxuOnJvb3QgLmZhLXJvdGF0ZS05MCxcbjpyb290IC5mYS1yb3RhdGUtMTgwLFxuOnJvb3QgLmZhLXJvdGF0ZS0yNzAsXG46cm9vdCAuZmEtZmxpcC1ob3Jpem9udGFsLFxuOnJvb3QgLmZhLWZsaXAtdmVydGljYWwge1xuICBmaWx0ZXI6IG5vbmU7XG59XG4uZmEtc3RhY2sge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6IDJlbTtcbiAgaGVpZ2h0OiAyZW07XG4gIGxpbmUtaGVpZ2h0OiAyZW07XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG4uZmEtc3RhY2stMXgsXG4uZmEtc3RhY2stMngge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG4uZmEtc3RhY2stMXgge1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbn1cbi5mYS1zdGFjay0yeCB7XG4gIGZvbnQtc2l6ZTogMmVtO1xufVxuLmZhLWludmVyc2Uge1xuICBjb2xvcjogI2ZmZjtcbn1cbi8qIEZvbnQgQXdlc29tZSB1c2VzIHRoZSBVbmljb2RlIFByaXZhdGUgVXNlIEFyZWEgKFBVQSkgdG8gZW5zdXJlIHNjcmVlblxuICAgcmVhZGVycyBkbyBub3QgcmVhZCBvZmYgcmFuZG9tIGNoYXJhY3RlcnMgdGhhdCByZXByZXNlbnQgaWNvbnMgKi9cbi5mYS1nbGFzczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAwMFwiO1xufVxuLmZhLW11c2ljOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDAxXCI7XG59XG4uZmEtc2VhcmNoOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDAyXCI7XG59XG4uZmEtZW52ZWxvcGUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAwM1wiO1xufVxuLmZhLWhlYXJ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDA0XCI7XG59XG4uZmEtc3RhcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAwNVwiO1xufVxuLmZhLXN0YXItbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAwNlwiO1xufVxuLmZhLXVzZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMDdcIjtcbn1cbi5mYS1maWxtOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDA4XCI7XG59XG4uZmEtdGgtbGFyZ2U6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMDlcIjtcbn1cbi5mYS10aDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAwYVwiO1xufVxuLmZhLXRoLWxpc3Q6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMGJcIjtcbn1cbi5mYS1jaGVjazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAwY1wiO1xufVxuLmZhLXJlbW92ZTpiZWZvcmUsXG4uZmEtY2xvc2U6YmVmb3JlLFxuLmZhLXRpbWVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDBkXCI7XG59XG4uZmEtc2VhcmNoLXBsdXM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMGVcIjtcbn1cbi5mYS1zZWFyY2gtbWludXM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMTBcIjtcbn1cbi5mYS1wb3dlci1vZmY6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMTFcIjtcbn1cbi5mYS1zaWduYWw6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMTJcIjtcbn1cbi5mYS1nZWFyOmJlZm9yZSxcbi5mYS1jb2c6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMTNcIjtcbn1cbi5mYS10cmFzaC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDE0XCI7XG59XG4uZmEtaG9tZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAxNVwiO1xufVxuLmZhLWZpbGUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAxNlwiO1xufVxuLmZhLWNsb2NrLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMTdcIjtcbn1cbi5mYS1yb2FkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDE4XCI7XG59XG4uZmEtZG93bmxvYWQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMTlcIjtcbn1cbi5mYS1hcnJvdy1jaXJjbGUtby1kb3duOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDFhXCI7XG59XG4uZmEtYXJyb3ctY2lyY2xlLW8tdXA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMWJcIjtcbn1cbi5mYS1pbmJveDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAxY1wiO1xufVxuLmZhLXBsYXktY2lyY2xlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMWRcIjtcbn1cbi5mYS1yb3RhdGUtcmlnaHQ6YmVmb3JlLFxuLmZhLXJlcGVhdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAxZVwiO1xufVxuLmZhLXJlZnJlc2g6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMjFcIjtcbn1cbi5mYS1saXN0LWFsdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAyMlwiO1xufVxuLmZhLWxvY2s6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMjNcIjtcbn1cbi5mYS1mbGFnOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDI0XCI7XG59XG4uZmEtaGVhZHBob25lczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAyNVwiO1xufVxuLmZhLXZvbHVtZS1vZmY6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMjZcIjtcbn1cbi5mYS12b2x1bWUtZG93bjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAyN1wiO1xufVxuLmZhLXZvbHVtZS11cDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAyOFwiO1xufVxuLmZhLXFyY29kZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAyOVwiO1xufVxuLmZhLWJhcmNvZGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMmFcIjtcbn1cbi5mYS10YWc6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMmJcIjtcbn1cbi5mYS10YWdzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDJjXCI7XG59XG4uZmEtYm9vazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAyZFwiO1xufVxuLmZhLWJvb2ttYXJrOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDJlXCI7XG59XG4uZmEtcHJpbnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMmZcIjtcbn1cbi5mYS1jYW1lcmE6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMzBcIjtcbn1cbi5mYS1mb250OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDMxXCI7XG59XG4uZmEtYm9sZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAzMlwiO1xufVxuLmZhLWl0YWxpYzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAzM1wiO1xufVxuLmZhLXRleHQtaGVpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDM0XCI7XG59XG4uZmEtdGV4dC13aWR0aDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAzNVwiO1xufVxuLmZhLWFsaWduLWxlZnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMzZcIjtcbn1cbi5mYS1hbGlnbi1jZW50ZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMzdcIjtcbn1cbi5mYS1hbGlnbi1yaWdodDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAzOFwiO1xufVxuLmZhLWFsaWduLWp1c3RpZnk6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMzlcIjtcbn1cbi5mYS1saXN0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDNhXCI7XG59XG4uZmEtZGVkZW50OmJlZm9yZSxcbi5mYS1vdXRkZW50OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDNiXCI7XG59XG4uZmEtaW5kZW50OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDNjXCI7XG59XG4uZmEtdmlkZW8tY2FtZXJhOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDNkXCI7XG59XG4uZmEtcGhvdG86YmVmb3JlLFxuLmZhLWltYWdlOmJlZm9yZSxcbi5mYS1waWN0dXJlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwM2VcIjtcbn1cbi5mYS1wZW5jaWw6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNDBcIjtcbn1cbi5mYS1tYXAtbWFya2VyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDQxXCI7XG59XG4uZmEtYWRqdXN0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDQyXCI7XG59XG4uZmEtdGludDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA0M1wiO1xufVxuLmZhLWVkaXQ6YmVmb3JlLFxuLmZhLXBlbmNpbC1zcXVhcmUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA0NFwiO1xufVxuLmZhLXNoYXJlLXNxdWFyZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDQ1XCI7XG59XG4uZmEtY2hlY2stc3F1YXJlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNDZcIjtcbn1cbi5mYS1hcnJvd3M6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNDdcIjtcbn1cbi5mYS1zdGVwLWJhY2t3YXJkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDQ4XCI7XG59XG4uZmEtZmFzdC1iYWNrd2FyZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA0OVwiO1xufVxuLmZhLWJhY2t3YXJkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDRhXCI7XG59XG4uZmEtcGxheTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA0YlwiO1xufVxuLmZhLXBhdXNlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDRjXCI7XG59XG4uZmEtc3RvcDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA0ZFwiO1xufVxuLmZhLWZvcndhcmQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNGVcIjtcbn1cbi5mYS1mYXN0LWZvcndhcmQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNTBcIjtcbn1cbi5mYS1zdGVwLWZvcndhcmQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNTFcIjtcbn1cbi5mYS1lamVjdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA1MlwiO1xufVxuLmZhLWNoZXZyb24tbGVmdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA1M1wiO1xufVxuLmZhLWNoZXZyb24tcmlnaHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNTRcIjtcbn1cbi5mYS1wbHVzLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA1NVwiO1xufVxuLmZhLW1pbnVzLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA1NlwiO1xufVxuLmZhLXRpbWVzLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA1N1wiO1xufVxuLmZhLWNoZWNrLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA1OFwiO1xufVxuLmZhLXF1ZXN0aW9uLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA1OVwiO1xufVxuLmZhLWluZm8tY2lyY2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDVhXCI7XG59XG4uZmEtY3Jvc3NoYWlyczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA1YlwiO1xufVxuLmZhLXRpbWVzLWNpcmNsZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDVjXCI7XG59XG4uZmEtY2hlY2stY2lyY2xlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNWRcIjtcbn1cbi5mYS1iYW46YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNWVcIjtcbn1cbi5mYS1hcnJvdy1sZWZ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDYwXCI7XG59XG4uZmEtYXJyb3ctcmlnaHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNjFcIjtcbn1cbi5mYS1hcnJvdy11cDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA2MlwiO1xufVxuLmZhLWFycm93LWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNjNcIjtcbn1cbi5mYS1tYWlsLWZvcndhcmQ6YmVmb3JlLFxuLmZhLXNoYXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDY0XCI7XG59XG4uZmEtZXhwYW5kOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDY1XCI7XG59XG4uZmEtY29tcHJlc3M6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNjZcIjtcbn1cbi5mYS1wbHVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDY3XCI7XG59XG4uZmEtbWludXM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNjhcIjtcbn1cbi5mYS1hc3RlcmlzazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA2OVwiO1xufVxuLmZhLWV4Y2xhbWF0aW9uLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA2YVwiO1xufVxuLmZhLWdpZnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNmJcIjtcbn1cbi5mYS1sZWFmOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDZjXCI7XG59XG4uZmEtZmlyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA2ZFwiO1xufVxuLmZhLWV5ZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA2ZVwiO1xufVxuLmZhLWV5ZS1zbGFzaDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA3MFwiO1xufVxuLmZhLXdhcm5pbmc6YmVmb3JlLFxuLmZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDcxXCI7XG59XG4uZmEtcGxhbmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNzJcIjtcbn1cbi5mYS1jYWxlbmRhcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA3M1wiO1xufVxuLmZhLXJhbmRvbTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA3NFwiO1xufVxuLmZhLWNvbW1lbnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNzVcIjtcbn1cbi5mYS1tYWduZXQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNzZcIjtcbn1cbi5mYS1jaGV2cm9uLXVwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDc3XCI7XG59XG4uZmEtY2hldnJvbi1kb3duOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDc4XCI7XG59XG4uZmEtcmV0d2VldDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA3OVwiO1xufVxuLmZhLXNob3BwaW5nLWNhcnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwN2FcIjtcbn1cbi5mYS1mb2xkZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwN2JcIjtcbn1cbi5mYS1mb2xkZXItb3BlbjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA3Y1wiO1xufVxuLmZhLWFycm93cy12OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDdkXCI7XG59XG4uZmEtYXJyb3dzLWg6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwN2VcIjtcbn1cbi5mYS1iYXItY2hhcnQtbzpiZWZvcmUsXG4uZmEtYmFyLWNoYXJ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDgwXCI7XG59XG4uZmEtdHdpdHRlci1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwODFcIjtcbn1cbi5mYS1mYWNlYm9vay1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwODJcIjtcbn1cbi5mYS1jYW1lcmEtcmV0cm86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwODNcIjtcbn1cbi5mYS1rZXk6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwODRcIjtcbn1cbi5mYS1nZWFyczpiZWZvcmUsXG4uZmEtY29nczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA4NVwiO1xufVxuLmZhLWNvbW1lbnRzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDg2XCI7XG59XG4uZmEtdGh1bWJzLW8tdXA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwODdcIjtcbn1cbi5mYS10aHVtYnMtby1kb3duOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDg4XCI7XG59XG4uZmEtc3Rhci1oYWxmOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDg5XCI7XG59XG4uZmEtaGVhcnQtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA4YVwiO1xufVxuLmZhLXNpZ24tb3V0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDhiXCI7XG59XG4uZmEtbGlua2VkaW4tc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDhjXCI7XG59XG4uZmEtdGh1bWItdGFjazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA4ZFwiO1xufVxuLmZhLWV4dGVybmFsLWxpbms6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwOGVcIjtcbn1cbi5mYS1zaWduLWluOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDkwXCI7XG59XG4uZmEtdHJvcGh5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDkxXCI7XG59XG4uZmEtZ2l0aHViLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA5MlwiO1xufVxuLmZhLXVwbG9hZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA5M1wiO1xufVxuLmZhLWxlbW9uLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwOTRcIjtcbn1cbi5mYS1waG9uZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA5NVwiO1xufVxuLmZhLXNxdWFyZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDk2XCI7XG59XG4uZmEtYm9va21hcmstbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA5N1wiO1xufVxuLmZhLXBob25lLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA5OFwiO1xufVxuLmZhLXR3aXR0ZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwOTlcIjtcbn1cbi5mYS1mYWNlYm9vay1mOmJlZm9yZSxcbi5mYS1mYWNlYm9vazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA5YVwiO1xufVxuLmZhLWdpdGh1YjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA5YlwiO1xufVxuLmZhLXVubG9jazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA5Y1wiO1xufVxuLmZhLWNyZWRpdC1jYXJkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDlkXCI7XG59XG4uZmEtZmVlZDpiZWZvcmUsXG4uZmEtcnNzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDllXCI7XG59XG4uZmEtaGRkLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwYTBcIjtcbn1cbi5mYS1idWxsaG9ybjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBhMVwiO1xufVxuLmZhLWJlbGw6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZjNcIjtcbn1cbi5mYS1jZXJ0aWZpY2F0ZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBhM1wiO1xufVxuLmZhLWhhbmQtby1yaWdodDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBhNFwiO1xufVxuLmZhLWhhbmQtby1sZWZ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGE1XCI7XG59XG4uZmEtaGFuZC1vLXVwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGE2XCI7XG59XG4uZmEtaGFuZC1vLWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwYTdcIjtcbn1cbi5mYS1hcnJvdy1jaXJjbGUtbGVmdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBhOFwiO1xufVxuLmZhLWFycm93LWNpcmNsZS1yaWdodDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBhOVwiO1xufVxuLmZhLWFycm93LWNpcmNsZS11cDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBhYVwiO1xufVxuLmZhLWFycm93LWNpcmNsZS1kb3duOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGFiXCI7XG59XG4uZmEtZ2xvYmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwYWNcIjtcbn1cbi5mYS13cmVuY2g6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwYWRcIjtcbn1cbi5mYS10YXNrczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBhZVwiO1xufVxuLmZhLWZpbHRlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBiMFwiO1xufVxuLmZhLWJyaWVmY2FzZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBiMVwiO1xufVxuLmZhLWFycm93cy1hbHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwYjJcIjtcbn1cbi5mYS1ncm91cDpiZWZvcmUsXG4uZmEtdXNlcnM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwYzBcIjtcbn1cbi5mYS1jaGFpbjpiZWZvcmUsXG4uZmEtbGluazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBjMVwiO1xufVxuLmZhLWNsb3VkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGMyXCI7XG59XG4uZmEtZmxhc2s6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwYzNcIjtcbn1cbi5mYS1jdXQ6YmVmb3JlLFxuLmZhLXNjaXNzb3JzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGM0XCI7XG59XG4uZmEtY29weTpiZWZvcmUsXG4uZmEtZmlsZXMtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBjNVwiO1xufVxuLmZhLXBhcGVyY2xpcDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBjNlwiO1xufVxuLmZhLXNhdmU6YmVmb3JlLFxuLmZhLWZsb3BweS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGM3XCI7XG59XG4uZmEtc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGM4XCI7XG59XG4uZmEtbmF2aWNvbjpiZWZvcmUsXG4uZmEtcmVvcmRlcjpiZWZvcmUsXG4uZmEtYmFyczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBjOVwiO1xufVxuLmZhLWxpc3QtdWw6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwY2FcIjtcbn1cbi5mYS1saXN0LW9sOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGNiXCI7XG59XG4uZmEtc3RyaWtldGhyb3VnaDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBjY1wiO1xufVxuLmZhLXVuZGVybGluZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBjZFwiO1xufVxuLmZhLXRhYmxlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGNlXCI7XG59XG4uZmEtbWFnaWM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZDBcIjtcbn1cbi5mYS10cnVjazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBkMVwiO1xufVxuLmZhLXBpbnRlcmVzdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBkMlwiO1xufVxuLmZhLXBpbnRlcmVzdC1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZDNcIjtcbn1cbi5mYS1nb29nbGUtcGx1cy1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZDRcIjtcbn1cbi5mYS1nb29nbGUtcGx1czpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBkNVwiO1xufVxuLmZhLW1vbmV5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGQ2XCI7XG59XG4uZmEtY2FyZXQtZG93bjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBkN1wiO1xufVxuLmZhLWNhcmV0LXVwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGQ4XCI7XG59XG4uZmEtY2FyZXQtbGVmdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBkOVwiO1xufVxuLmZhLWNhcmV0LXJpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGRhXCI7XG59XG4uZmEtY29sdW1uczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBkYlwiO1xufVxuLmZhLXVuc29ydGVkOmJlZm9yZSxcbi5mYS1zb3J0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGRjXCI7XG59XG4uZmEtc29ydC1kb3duOmJlZm9yZSxcbi5mYS1zb3J0LWRlc2M6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZGRcIjtcbn1cbi5mYS1zb3J0LXVwOmJlZm9yZSxcbi5mYS1zb3J0LWFzYzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBkZVwiO1xufVxuLmZhLWVudmVsb3BlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGUwXCI7XG59XG4uZmEtbGlua2VkaW46YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZTFcIjtcbn1cbi5mYS1yb3RhdGUtbGVmdDpiZWZvcmUsXG4uZmEtdW5kbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBlMlwiO1xufVxuLmZhLWxlZ2FsOmJlZm9yZSxcbi5mYS1nYXZlbDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBlM1wiO1xufVxuLmZhLWRhc2hib2FyZDpiZWZvcmUsXG4uZmEtdGFjaG9tZXRlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBlNFwiO1xufVxuLmZhLWNvbW1lbnQtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBlNVwiO1xufVxuLmZhLWNvbW1lbnRzLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZTZcIjtcbn1cbi5mYS1mbGFzaDpiZWZvcmUsXG4uZmEtYm9sdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBlN1wiO1xufVxuLmZhLXNpdGVtYXA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZThcIjtcbn1cbi5mYS11bWJyZWxsYTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBlOVwiO1xufVxuLmZhLXBhc3RlOmJlZm9yZSxcbi5mYS1jbGlwYm9hcmQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZWFcIjtcbn1cbi5mYS1saWdodGJ1bGItbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBlYlwiO1xufVxuLmZhLWV4Y2hhbmdlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGVjXCI7XG59XG4uZmEtY2xvdWQtZG93bmxvYWQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZWRcIjtcbn1cbi5mYS1jbG91ZC11cGxvYWQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZWVcIjtcbn1cbi5mYS11c2VyLW1kOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGYwXCI7XG59XG4uZmEtc3RldGhvc2NvcGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZjFcIjtcbn1cbi5mYS1zdWl0Y2FzZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBmMlwiO1xufVxuLmZhLWJlbGwtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBhMlwiO1xufVxuLmZhLWNvZmZlZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBmNFwiO1xufVxuLmZhLWN1dGxlcnk6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZjVcIjtcbn1cbi5mYS1maWxlLXRleHQtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBmNlwiO1xufVxuLmZhLWJ1aWxkaW5nLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZjdcIjtcbn1cbi5mYS1ob3NwaXRhbC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGY4XCI7XG59XG4uZmEtYW1idWxhbmNlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGY5XCI7XG59XG4uZmEtbWVka2l0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGZhXCI7XG59XG4uZmEtZmlnaHRlci1qZXQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZmJcIjtcbn1cbi5mYS1iZWVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGZjXCI7XG59XG4uZmEtaC1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZmRcIjtcbn1cbi5mYS1wbHVzLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBmZVwiO1xufVxuLmZhLWFuZ2xlLWRvdWJsZS1sZWZ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTAwXCI7XG59XG4uZmEtYW5nbGUtZG91YmxlLXJpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTAxXCI7XG59XG4uZmEtYW5nbGUtZG91YmxlLXVwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTAyXCI7XG59XG4uZmEtYW5nbGUtZG91YmxlLWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMDNcIjtcbn1cbi5mYS1hbmdsZS1sZWZ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTA0XCI7XG59XG4uZmEtYW5nbGUtcmlnaHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMDVcIjtcbn1cbi5mYS1hbmdsZS11cDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEwNlwiO1xufVxuLmZhLWFuZ2xlLWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMDdcIjtcbn1cbi5mYS1kZXNrdG9wOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTA4XCI7XG59XG4uZmEtbGFwdG9wOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTA5XCI7XG59XG4uZmEtdGFibGV0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTBhXCI7XG59XG4uZmEtbW9iaWxlLXBob25lOmJlZm9yZSxcbi5mYS1tb2JpbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMGJcIjtcbn1cbi5mYS1jaXJjbGUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEwY1wiO1xufVxuLmZhLXF1b3RlLWxlZnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMGRcIjtcbn1cbi5mYS1xdW90ZS1yaWdodDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEwZVwiO1xufVxuLmZhLXNwaW5uZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMTBcIjtcbn1cbi5mYS1jaXJjbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMTFcIjtcbn1cbi5mYS1tYWlsLXJlcGx5OmJlZm9yZSxcbi5mYS1yZXBseTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjExMlwiO1xufVxuLmZhLWdpdGh1Yi1hbHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMTNcIjtcbn1cbi5mYS1mb2xkZXItbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjExNFwiO1xufVxuLmZhLWZvbGRlci1vcGVuLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMTVcIjtcbn1cbi5mYS1zbWlsZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTE4XCI7XG59XG4uZmEtZnJvd24tbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjExOVwiO1xufVxuLmZhLW1laC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTFhXCI7XG59XG4uZmEtZ2FtZXBhZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjExYlwiO1xufVxuLmZhLWtleWJvYXJkLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMWNcIjtcbn1cbi5mYS1mbGFnLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMWRcIjtcbn1cbi5mYS1mbGFnLWNoZWNrZXJlZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjExZVwiO1xufVxuLmZhLXRlcm1pbmFsOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTIwXCI7XG59XG4uZmEtY29kZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEyMVwiO1xufVxuLmZhLW1haWwtcmVwbHktYWxsOmJlZm9yZSxcbi5mYS1yZXBseS1hbGw6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMjJcIjtcbn1cbi5mYS1zdGFyLWhhbGYtZW1wdHk6YmVmb3JlLFxuLmZhLXN0YXItaGFsZi1mdWxsOmJlZm9yZSxcbi5mYS1zdGFyLWhhbGYtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEyM1wiO1xufVxuLmZhLWxvY2F0aW9uLWFycm93OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTI0XCI7XG59XG4uZmEtY3JvcDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEyNVwiO1xufVxuLmZhLWNvZGUtZm9yazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEyNlwiO1xufVxuLmZhLXVubGluazpiZWZvcmUsXG4uZmEtY2hhaW4tYnJva2VuOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTI3XCI7XG59XG4uZmEtcXVlc3Rpb246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMjhcIjtcbn1cbi5mYS1pbmZvOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTI5XCI7XG59XG4uZmEtZXhjbGFtYXRpb246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMmFcIjtcbn1cbi5mYS1zdXBlcnNjcmlwdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEyYlwiO1xufVxuLmZhLXN1YnNjcmlwdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEyY1wiO1xufVxuLmZhLWVyYXNlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEyZFwiO1xufVxuLmZhLXB1enpsZS1waWVjZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEyZVwiO1xufVxuLmZhLW1pY3JvcGhvbmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMzBcIjtcbn1cbi5mYS1taWNyb3Bob25lLXNsYXNoOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTMxXCI7XG59XG4uZmEtc2hpZWxkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTMyXCI7XG59XG4uZmEtY2FsZW5kYXItbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEzM1wiO1xufVxuLmZhLWZpcmUtZXh0aW5ndWlzaGVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTM0XCI7XG59XG4uZmEtcm9ja2V0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTM1XCI7XG59XG4uZmEtbWF4Y2RuOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTM2XCI7XG59XG4uZmEtY2hldnJvbi1jaXJjbGUtbGVmdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEzN1wiO1xufVxuLmZhLWNoZXZyb24tY2lyY2xlLXJpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTM4XCI7XG59XG4uZmEtY2hldnJvbi1jaXJjbGUtdXA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMzlcIjtcbn1cbi5mYS1jaGV2cm9uLWNpcmNsZS1kb3duOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTNhXCI7XG59XG4uZmEtaHRtbDU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxM2JcIjtcbn1cbi5mYS1jc3MzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTNjXCI7XG59XG4uZmEtYW5jaG9yOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTNkXCI7XG59XG4uZmEtdW5sb2NrLWFsdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEzZVwiO1xufVxuLmZhLWJ1bGxzZXllOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTQwXCI7XG59XG4uZmEtZWxsaXBzaXMtaDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE0MVwiO1xufVxuLmZhLWVsbGlwc2lzLXY6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNDJcIjtcbn1cbi5mYS1yc3Mtc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTQzXCI7XG59XG4uZmEtcGxheS1jaXJjbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNDRcIjtcbn1cbi5mYS10aWNrZXQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNDVcIjtcbn1cbi5mYS1taW51cy1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNDZcIjtcbn1cbi5mYS1taW51cy1zcXVhcmUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE0N1wiO1xufVxuLmZhLWxldmVsLXVwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTQ4XCI7XG59XG4uZmEtbGV2ZWwtZG93bjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE0OVwiO1xufVxuLmZhLWNoZWNrLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE0YVwiO1xufVxuLmZhLXBlbmNpbC1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNGJcIjtcbn1cbi5mYS1leHRlcm5hbC1saW5rLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE0Y1wiO1xufVxuLmZhLXNoYXJlLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE0ZFwiO1xufVxuLmZhLWNvbXBhc3M6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNGVcIjtcbn1cbi5mYS10b2dnbGUtZG93bjpiZWZvcmUsXG4uZmEtY2FyZXQtc3F1YXJlLW8tZG93bjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE1MFwiO1xufVxuLmZhLXRvZ2dsZS11cDpiZWZvcmUsXG4uZmEtY2FyZXQtc3F1YXJlLW8tdXA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNTFcIjtcbn1cbi5mYS10b2dnbGUtcmlnaHQ6YmVmb3JlLFxuLmZhLWNhcmV0LXNxdWFyZS1vLXJpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTUyXCI7XG59XG4uZmEtZXVybzpiZWZvcmUsXG4uZmEtZXVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTUzXCI7XG59XG4uZmEtZ2JwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTU0XCI7XG59XG4uZmEtZG9sbGFyOmJlZm9yZSxcbi5mYS11c2Q6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNTVcIjtcbn1cbi5mYS1ydXBlZTpiZWZvcmUsXG4uZmEtaW5yOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTU2XCI7XG59XG4uZmEtY255OmJlZm9yZSxcbi5mYS1ybWI6YmVmb3JlLFxuLmZhLXllbjpiZWZvcmUsXG4uZmEtanB5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTU3XCI7XG59XG4uZmEtcnVibGU6YmVmb3JlLFxuLmZhLXJvdWJsZTpiZWZvcmUsXG4uZmEtcnViOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTU4XCI7XG59XG4uZmEtd29uOmJlZm9yZSxcbi5mYS1rcnc6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNTlcIjtcbn1cbi5mYS1iaXRjb2luOmJlZm9yZSxcbi5mYS1idGM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNWFcIjtcbn1cbi5mYS1maWxlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTViXCI7XG59XG4uZmEtZmlsZS10ZXh0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTVjXCI7XG59XG4uZmEtc29ydC1hbHBoYS1hc2M6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNWRcIjtcbn1cbi5mYS1zb3J0LWFscGhhLWRlc2M6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNWVcIjtcbn1cbi5mYS1zb3J0LWFtb3VudC1hc2M6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNjBcIjtcbn1cbi5mYS1zb3J0LWFtb3VudC1kZXNjOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTYxXCI7XG59XG4uZmEtc29ydC1udW1lcmljLWFzYzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE2MlwiO1xufVxuLmZhLXNvcnQtbnVtZXJpYy1kZXNjOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTYzXCI7XG59XG4uZmEtdGh1bWJzLXVwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTY0XCI7XG59XG4uZmEtdGh1bWJzLWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNjVcIjtcbn1cbi5mYS15b3V0dWJlLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE2NlwiO1xufVxuLmZhLXlvdXR1YmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNjdcIjtcbn1cbi5mYS14aW5nOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTY4XCI7XG59XG4uZmEteGluZy1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNjlcIjtcbn1cbi5mYS15b3V0dWJlLXBsYXk6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNmFcIjtcbn1cbi5mYS1kcm9wYm94OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTZiXCI7XG59XG4uZmEtc3RhY2stb3ZlcmZsb3c6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNmNcIjtcbn1cbi5mYS1pbnN0YWdyYW06YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNmRcIjtcbn1cbi5mYS1mbGlja3I6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNmVcIjtcbn1cbi5mYS1hZG46YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNzBcIjtcbn1cbi5mYS1iaXRidWNrZXQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNzFcIjtcbn1cbi5mYS1iaXRidWNrZXQtc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTcyXCI7XG59XG4uZmEtdHVtYmxyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTczXCI7XG59XG4uZmEtdHVtYmxyLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE3NFwiO1xufVxuLmZhLWxvbmctYXJyb3ctZG93bjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE3NVwiO1xufVxuLmZhLWxvbmctYXJyb3ctdXA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNzZcIjtcbn1cbi5mYS1sb25nLWFycm93LWxlZnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNzdcIjtcbn1cbi5mYS1sb25nLWFycm93LXJpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTc4XCI7XG59XG4uZmEtYXBwbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNzlcIjtcbn1cbi5mYS13aW5kb3dzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTdhXCI7XG59XG4uZmEtYW5kcm9pZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE3YlwiO1xufVxuLmZhLWxpbnV4OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTdjXCI7XG59XG4uZmEtZHJpYmJibGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxN2RcIjtcbn1cbi5mYS1za3lwZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE3ZVwiO1xufVxuLmZhLWZvdXJzcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxODBcIjtcbn1cbi5mYS10cmVsbG86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxODFcIjtcbn1cbi5mYS1mZW1hbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxODJcIjtcbn1cbi5mYS1tYWxlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTgzXCI7XG59XG4uZmEtZ2l0dGlwOmJlZm9yZSxcbi5mYS1ncmF0aXBheTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE4NFwiO1xufVxuLmZhLXN1bi1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTg1XCI7XG59XG4uZmEtbW9vbi1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTg2XCI7XG59XG4uZmEtYXJjaGl2ZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE4N1wiO1xufVxuLmZhLWJ1ZzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE4OFwiO1xufVxuLmZhLXZrOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTg5XCI7XG59XG4uZmEtd2VpYm86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxOGFcIjtcbn1cbi5mYS1yZW5yZW46YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxOGJcIjtcbn1cbi5mYS1wYWdlbGluZXM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxOGNcIjtcbn1cbi5mYS1zdGFjay1leGNoYW5nZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE4ZFwiO1xufVxuLmZhLWFycm93LWNpcmNsZS1vLXJpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMThlXCI7XG59XG4uZmEtYXJyb3ctY2lyY2xlLW8tbGVmdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE5MFwiO1xufVxuLmZhLXRvZ2dsZS1sZWZ0OmJlZm9yZSxcbi5mYS1jYXJldC1zcXVhcmUtby1sZWZ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTkxXCI7XG59XG4uZmEtZG90LWNpcmNsZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTkyXCI7XG59XG4uZmEtd2hlZWxjaGFpcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE5M1wiO1xufVxuLmZhLXZpbWVvLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE5NFwiO1xufVxuLmZhLXR1cmtpc2gtbGlyYTpiZWZvcmUsXG4uZmEtdHJ5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTk1XCI7XG59XG4uZmEtcGx1cy1zcXVhcmUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE5NlwiO1xufVxuLmZhLXNwYWNlLXNodXR0bGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxOTdcIjtcbn1cbi5mYS1zbGFjazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE5OFwiO1xufVxuLmZhLWVudmVsb3BlLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE5OVwiO1xufVxuLmZhLXdvcmRwcmVzczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE5YVwiO1xufVxuLmZhLW9wZW5pZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE5YlwiO1xufVxuLmZhLWluc3RpdHV0aW9uOmJlZm9yZSxcbi5mYS1iYW5rOmJlZm9yZSxcbi5mYS11bml2ZXJzaXR5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTljXCI7XG59XG4uZmEtbW9ydGFyLWJvYXJkOmJlZm9yZSxcbi5mYS1ncmFkdWF0aW9uLWNhcDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE5ZFwiO1xufVxuLmZhLXlhaG9vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTllXCI7XG59XG4uZmEtZ29vZ2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWEwXCI7XG59XG4uZmEtcmVkZGl0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWExXCI7XG59XG4uZmEtcmVkZGl0LXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFhMlwiO1xufVxuLmZhLXN0dW1ibGV1cG9uLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFhM1wiO1xufVxuLmZhLXN0dW1ibGV1cG9uOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWE0XCI7XG59XG4uZmEtZGVsaWNpb3VzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWE1XCI7XG59XG4uZmEtZGlnZzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFhNlwiO1xufVxuLmZhLXBpZWQtcGlwZXItcHA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxYTdcIjtcbn1cbi5mYS1waWVkLXBpcGVyLWFsdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFhOFwiO1xufVxuLmZhLWRydXBhbDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFhOVwiO1xufVxuLmZhLWpvb21sYTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFhYVwiO1xufVxuLmZhLWxhbmd1YWdlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWFiXCI7XG59XG4uZmEtZmF4OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWFjXCI7XG59XG4uZmEtYnVpbGRpbmc6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxYWRcIjtcbn1cbi5mYS1jaGlsZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFhZVwiO1xufVxuLmZhLXBhdzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFiMFwiO1xufVxuLmZhLXNwb29uOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWIxXCI7XG59XG4uZmEtY3ViZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFiMlwiO1xufVxuLmZhLWN1YmVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWIzXCI7XG59XG4uZmEtYmVoYW5jZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFiNFwiO1xufVxuLmZhLWJlaGFuY2Utc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWI1XCI7XG59XG4uZmEtc3RlYW06YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxYjZcIjtcbn1cbi5mYS1zdGVhbS1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxYjdcIjtcbn1cbi5mYS1yZWN5Y2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWI4XCI7XG59XG4uZmEtYXV0b21vYmlsZTpiZWZvcmUsXG4uZmEtY2FyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWI5XCI7XG59XG4uZmEtY2FiOmJlZm9yZSxcbi5mYS10YXhpOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWJhXCI7XG59XG4uZmEtdHJlZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFiYlwiO1xufVxuLmZhLXNwb3RpZnk6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxYmNcIjtcbn1cbi5mYS1kZXZpYW50YXJ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWJkXCI7XG59XG4uZmEtc291bmRjbG91ZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFiZVwiO1xufVxuLmZhLWRhdGFiYXNlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWMwXCI7XG59XG4uZmEtZmlsZS1wZGYtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFjMVwiO1xufVxuLmZhLWZpbGUtd29yZC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWMyXCI7XG59XG4uZmEtZmlsZS1leGNlbC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWMzXCI7XG59XG4uZmEtZmlsZS1wb3dlcnBvaW50LW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxYzRcIjtcbn1cbi5mYS1maWxlLXBob3RvLW86YmVmb3JlLFxuLmZhLWZpbGUtcGljdHVyZS1vOmJlZm9yZSxcbi5mYS1maWxlLWltYWdlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxYzVcIjtcbn1cbi5mYS1maWxlLXppcC1vOmJlZm9yZSxcbi5mYS1maWxlLWFyY2hpdmUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFjNlwiO1xufVxuLmZhLWZpbGUtc291bmQtbzpiZWZvcmUsXG4uZmEtZmlsZS1hdWRpby1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWM3XCI7XG59XG4uZmEtZmlsZS1tb3ZpZS1vOmJlZm9yZSxcbi5mYS1maWxlLXZpZGVvLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxYzhcIjtcbn1cbi5mYS1maWxlLWNvZGUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFjOVwiO1xufVxuLmZhLXZpbmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxY2FcIjtcbn1cbi5mYS1jb2RlcGVuOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWNiXCI7XG59XG4uZmEtanNmaWRkbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxY2NcIjtcbn1cbi5mYS1saWZlLWJvdXk6YmVmb3JlLFxuLmZhLWxpZmUtYnVveTpiZWZvcmUsXG4uZmEtbGlmZS1zYXZlcjpiZWZvcmUsXG4uZmEtc3VwcG9ydDpiZWZvcmUsXG4uZmEtbGlmZS1yaW5nOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWNkXCI7XG59XG4uZmEtY2lyY2xlLW8tbm90Y2g6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxY2VcIjtcbn1cbi5mYS1yYTpiZWZvcmUsXG4uZmEtcmVzaXN0YW5jZTpiZWZvcmUsXG4uZmEtcmViZWw6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZDBcIjtcbn1cbi5mYS1nZTpiZWZvcmUsXG4uZmEtZW1waXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWQxXCI7XG59XG4uZmEtZ2l0LXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFkMlwiO1xufVxuLmZhLWdpdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFkM1wiO1xufVxuLmZhLXktY29tYmluYXRvci1zcXVhcmU6YmVmb3JlLFxuLmZhLXljLXNxdWFyZTpiZWZvcmUsXG4uZmEtaGFja2VyLW5ld3M6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZDRcIjtcbn1cbi5mYS10ZW5jZW50LXdlaWJvOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWQ1XCI7XG59XG4uZmEtcXE6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZDZcIjtcbn1cbi5mYS13ZWNoYXQ6YmVmb3JlLFxuLmZhLXdlaXhpbjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFkN1wiO1xufVxuLmZhLXNlbmQ6YmVmb3JlLFxuLmZhLXBhcGVyLXBsYW5lOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWQ4XCI7XG59XG4uZmEtc2VuZC1vOmJlZm9yZSxcbi5mYS1wYXBlci1wbGFuZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWQ5XCI7XG59XG4uZmEtaGlzdG9yeTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFkYVwiO1xufVxuLmZhLWNpcmNsZS10aGluOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWRiXCI7XG59XG4uZmEtaGVhZGVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWRjXCI7XG59XG4uZmEtcGFyYWdyYXBoOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWRkXCI7XG59XG4uZmEtc2xpZGVyczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFkZVwiO1xufVxuLmZhLXNoYXJlLWFsdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFlMFwiO1xufVxuLmZhLXNoYXJlLWFsdC1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZTFcIjtcbn1cbi5mYS1ib21iOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWUyXCI7XG59XG4uZmEtc29jY2VyLWJhbGwtbzpiZWZvcmUsXG4uZmEtZnV0Ym9sLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZTNcIjtcbn1cbi5mYS10dHk6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZTRcIjtcbn1cbi5mYS1iaW5vY3VsYXJzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWU1XCI7XG59XG4uZmEtcGx1ZzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFlNlwiO1xufVxuLmZhLXNsaWRlc2hhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZTdcIjtcbn1cbi5mYS10d2l0Y2g6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZThcIjtcbn1cbi5mYS15ZWxwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWU5XCI7XG59XG4uZmEtbmV3c3BhcGVyLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZWFcIjtcbn1cbi5mYS13aWZpOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWViXCI7XG59XG4uZmEtY2FsY3VsYXRvcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFlY1wiO1xufVxuLmZhLXBheXBhbDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFlZFwiO1xufVxuLmZhLWdvb2dsZS13YWxsZXQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZWVcIjtcbn1cbi5mYS1jYy12aXNhOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWYwXCI7XG59XG4uZmEtY2MtbWFzdGVyY2FyZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFmMVwiO1xufVxuLmZhLWNjLWRpc2NvdmVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWYyXCI7XG59XG4uZmEtY2MtYW1leDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFmM1wiO1xufVxuLmZhLWNjLXBheXBhbDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFmNFwiO1xufVxuLmZhLWNjLXN0cmlwZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFmNVwiO1xufVxuLmZhLWJlbGwtc2xhc2g6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZjZcIjtcbn1cbi5mYS1iZWxsLXNsYXNoLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZjdcIjtcbn1cbi5mYS10cmFzaDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFmOFwiO1xufVxuLmZhLWNvcHlyaWdodDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFmOVwiO1xufVxuLmZhLWF0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWZhXCI7XG59XG4uZmEtZXllZHJvcHBlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFmYlwiO1xufVxuLmZhLXBhaW50LWJydXNoOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWZjXCI7XG59XG4uZmEtYmlydGhkYXktY2FrZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFmZFwiO1xufVxuLmZhLWFyZWEtY2hhcnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZmVcIjtcbn1cbi5mYS1waWUtY2hhcnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMDBcIjtcbn1cbi5mYS1saW5lLWNoYXJ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjAxXCI7XG59XG4uZmEtbGFzdGZtOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjAyXCI7XG59XG4uZmEtbGFzdGZtLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIwM1wiO1xufVxuLmZhLXRvZ2dsZS1vZmY6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMDRcIjtcbn1cbi5mYS10b2dnbGUtb246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMDVcIjtcbn1cbi5mYS1iaWN5Y2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjA2XCI7XG59XG4uZmEtYnVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjA3XCI7XG59XG4uZmEtaW94aG9zdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIwOFwiO1xufVxuLmZhLWFuZ2VsbGlzdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIwOVwiO1xufVxuLmZhLWNjOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjBhXCI7XG59XG4uZmEtc2hla2VsOmJlZm9yZSxcbi5mYS1zaGVxZWw6YmVmb3JlLFxuLmZhLWlsczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIwYlwiO1xufVxuLmZhLW1lYW5wYXRoOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjBjXCI7XG59XG4uZmEtYnV5c2VsbGFkczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIwZFwiO1xufVxuLmZhLWNvbm5lY3RkZXZlbG9wOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjBlXCI7XG59XG4uZmEtZGFzaGN1YmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMTBcIjtcbn1cbi5mYS1mb3J1bWJlZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIxMVwiO1xufVxuLmZhLWxlYW5wdWI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMTJcIjtcbn1cbi5mYS1zZWxsc3k6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMTNcIjtcbn1cbi5mYS1zaGlydHNpbmJ1bGs6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMTRcIjtcbn1cbi5mYS1zaW1wbHlidWlsdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIxNVwiO1xufVxuLmZhLXNreWF0bGFzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjE2XCI7XG59XG4uZmEtY2FydC1wbHVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjE3XCI7XG59XG4uZmEtY2FydC1hcnJvdy1kb3duOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjE4XCI7XG59XG4uZmEtZGlhbW9uZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIxOVwiO1xufVxuLmZhLXNoaXA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMWFcIjtcbn1cbi5mYS11c2VyLXNlY3JldDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIxYlwiO1xufVxuLmZhLW1vdG9yY3ljbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMWNcIjtcbn1cbi5mYS1zdHJlZXQtdmlldzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIxZFwiO1xufVxuLmZhLWhlYXJ0YmVhdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIxZVwiO1xufVxuLmZhLXZlbnVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjIxXCI7XG59XG4uZmEtbWFyczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIyMlwiO1xufVxuLmZhLW1lcmN1cnk6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMjNcIjtcbn1cbi5mYS1pbnRlcnNleDpiZWZvcmUsXG4uZmEtdHJhbnNnZW5kZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMjRcIjtcbn1cbi5mYS10cmFuc2dlbmRlci1hbHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMjVcIjtcbn1cbi5mYS12ZW51cy1kb3VibGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMjZcIjtcbn1cbi5mYS1tYXJzLWRvdWJsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIyN1wiO1xufVxuLmZhLXZlbnVzLW1hcnM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMjhcIjtcbn1cbi5mYS1tYXJzLXN0cm9rZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIyOVwiO1xufVxuLmZhLW1hcnMtc3Ryb2tlLXY6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMmFcIjtcbn1cbi5mYS1tYXJzLXN0cm9rZS1oOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjJiXCI7XG59XG4uZmEtbmV1dGVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjJjXCI7XG59XG4uZmEtZ2VuZGVybGVzczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIyZFwiO1xufVxuLmZhLWZhY2Vib29rLW9mZmljaWFsOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjMwXCI7XG59XG4uZmEtcGludGVyZXN0LXA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMzFcIjtcbn1cbi5mYS13aGF0c2FwcDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIzMlwiO1xufVxuLmZhLXNlcnZlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIzM1wiO1xufVxuLmZhLXVzZXItcGx1czpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIzNFwiO1xufVxuLmZhLXVzZXItdGltZXM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMzVcIjtcbn1cbi5mYS1ob3RlbDpiZWZvcmUsXG4uZmEtYmVkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjM2XCI7XG59XG4uZmEtdmlhY29pbjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIzN1wiO1xufVxuLmZhLXRyYWluOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjM4XCI7XG59XG4uZmEtc3Vid2F5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjM5XCI7XG59XG4uZmEtbWVkaXVtOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjNhXCI7XG59XG4uZmEteWM6YmVmb3JlLFxuLmZhLXktY29tYmluYXRvcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIzYlwiO1xufVxuLmZhLW9wdGluLW1vbnN0ZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyM2NcIjtcbn1cbi5mYS1vcGVuY2FydDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIzZFwiO1xufVxuLmZhLWV4cGVkaXRlZHNzbDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIzZVwiO1xufVxuLmZhLWJhdHRlcnktNDpiZWZvcmUsXG4uZmEtYmF0dGVyeTpiZWZvcmUsXG4uZmEtYmF0dGVyeS1mdWxsOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjQwXCI7XG59XG4uZmEtYmF0dGVyeS0zOmJlZm9yZSxcbi5mYS1iYXR0ZXJ5LXRocmVlLXF1YXJ0ZXJzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjQxXCI7XG59XG4uZmEtYmF0dGVyeS0yOmJlZm9yZSxcbi5mYS1iYXR0ZXJ5LWhhbGY6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNDJcIjtcbn1cbi5mYS1iYXR0ZXJ5LTE6YmVmb3JlLFxuLmZhLWJhdHRlcnktcXVhcnRlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI0M1wiO1xufVxuLmZhLWJhdHRlcnktMDpiZWZvcmUsXG4uZmEtYmF0dGVyeS1lbXB0eTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI0NFwiO1xufVxuLmZhLW1vdXNlLXBvaW50ZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNDVcIjtcbn1cbi5mYS1pLWN1cnNvcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI0NlwiO1xufVxuLmZhLW9iamVjdC1ncm91cDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI0N1wiO1xufVxuLmZhLW9iamVjdC11bmdyb3VwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjQ4XCI7XG59XG4uZmEtc3RpY2t5LW5vdGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNDlcIjtcbn1cbi5mYS1zdGlja3ktbm90ZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjRhXCI7XG59XG4uZmEtY2MtamNiOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjRiXCI7XG59XG4uZmEtY2MtZGluZXJzLWNsdWI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNGNcIjtcbn1cbi5mYS1jbG9uZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI0ZFwiO1xufVxuLmZhLWJhbGFuY2Utc2NhbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNGVcIjtcbn1cbi5mYS1ob3VyZ2xhc3MtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI1MFwiO1xufVxuLmZhLWhvdXJnbGFzcy0xOmJlZm9yZSxcbi5mYS1ob3VyZ2xhc3Mtc3RhcnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNTFcIjtcbn1cbi5mYS1ob3VyZ2xhc3MtMjpiZWZvcmUsXG4uZmEtaG91cmdsYXNzLWhhbGY6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNTJcIjtcbn1cbi5mYS1ob3VyZ2xhc3MtMzpiZWZvcmUsXG4uZmEtaG91cmdsYXNzLWVuZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI1M1wiO1xufVxuLmZhLWhvdXJnbGFzczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI1NFwiO1xufVxuLmZhLWhhbmQtZ3JhYi1vOmJlZm9yZSxcbi5mYS1oYW5kLXJvY2stbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI1NVwiO1xufVxuLmZhLWhhbmQtc3RvcC1vOmJlZm9yZSxcbi5mYS1oYW5kLXBhcGVyLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNTZcIjtcbn1cbi5mYS1oYW5kLXNjaXNzb3JzLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNTdcIjtcbn1cbi5mYS1oYW5kLWxpemFyZC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjU4XCI7XG59XG4uZmEtaGFuZC1zcG9jay1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjU5XCI7XG59XG4uZmEtaGFuZC1wb2ludGVyLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNWFcIjtcbn1cbi5mYS1oYW5kLXBlYWNlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNWJcIjtcbn1cbi5mYS10cmFkZW1hcms6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNWNcIjtcbn1cbi5mYS1yZWdpc3RlcmVkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjVkXCI7XG59XG4uZmEtY3JlYXRpdmUtY29tbW9uczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI1ZVwiO1xufVxuLmZhLWdnOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjYwXCI7XG59XG4uZmEtZ2ctY2lyY2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjYxXCI7XG59XG4uZmEtdHJpcGFkdmlzb3I6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNjJcIjtcbn1cbi5mYS1vZG5va2xhc3NuaWtpOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjYzXCI7XG59XG4uZmEtb2Rub2tsYXNzbmlraS1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNjRcIjtcbn1cbi5mYS1nZXQtcG9ja2V0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjY1XCI7XG59XG4uZmEtd2lraXBlZGlhLXc6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNjZcIjtcbn1cbi5mYS1zYWZhcmk6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNjdcIjtcbn1cbi5mYS1jaHJvbWU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNjhcIjtcbn1cbi5mYS1maXJlZm94OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjY5XCI7XG59XG4uZmEtb3BlcmE6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNmFcIjtcbn1cbi5mYS1pbnRlcm5ldC1leHBsb3JlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI2YlwiO1xufVxuLmZhLXR2OmJlZm9yZSxcbi5mYS10ZWxldmlzaW9uOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjZjXCI7XG59XG4uZmEtY29udGFvOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjZkXCI7XG59XG4uZmEtNTAwcHg6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNmVcIjtcbn1cbi5mYS1hbWF6b246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNzBcIjtcbn1cbi5mYS1jYWxlbmRhci1wbHVzLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNzFcIjtcbn1cbi5mYS1jYWxlbmRhci1taW51cy1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjcyXCI7XG59XG4uZmEtY2FsZW5kYXItdGltZXMtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI3M1wiO1xufVxuLmZhLWNhbGVuZGFyLWNoZWNrLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNzRcIjtcbn1cbi5mYS1pbmR1c3RyeTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI3NVwiO1xufVxuLmZhLW1hcC1waW46YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNzZcIjtcbn1cbi5mYS1tYXAtc2lnbnM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNzdcIjtcbn1cbi5mYS1tYXAtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI3OFwiO1xufVxuLmZhLW1hcDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI3OVwiO1xufVxuLmZhLWNvbW1lbnRpbmc6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyN2FcIjtcbn1cbi5mYS1jb21tZW50aW5nLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyN2JcIjtcbn1cbi5mYS1ob3V6ejpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI3Y1wiO1xufVxuLmZhLXZpbWVvOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjdkXCI7XG59XG4uZmEtYmxhY2stdGllOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjdlXCI7XG59XG4uZmEtZm9udGljb25zOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjgwXCI7XG59XG4uZmEtcmVkZGl0LWFsaWVuOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjgxXCI7XG59XG4uZmEtZWRnZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI4MlwiO1xufVxuLmZhLWNyZWRpdC1jYXJkLWFsdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI4M1wiO1xufVxuLmZhLWNvZGllcGllOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjg0XCI7XG59XG4uZmEtbW9keDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI4NVwiO1xufVxuLmZhLWZvcnQtYXdlc29tZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI4NlwiO1xufVxuLmZhLXVzYjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI4N1wiO1xufVxuLmZhLXByb2R1Y3QtaHVudDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI4OFwiO1xufVxuLmZhLW1peGNsb3VkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjg5XCI7XG59XG4uZmEtc2NyaWJkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjhhXCI7XG59XG4uZmEtcGF1c2UtY2lyY2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjhiXCI7XG59XG4uZmEtcGF1c2UtY2lyY2xlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyOGNcIjtcbn1cbi5mYS1zdG9wLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI4ZFwiO1xufVxuLmZhLXN0b3AtY2lyY2xlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyOGVcIjtcbn1cbi5mYS1zaG9wcGluZy1iYWc6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyOTBcIjtcbn1cbi5mYS1zaG9wcGluZy1iYXNrZXQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyOTFcIjtcbn1cbi5mYS1oYXNodGFnOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjkyXCI7XG59XG4uZmEtYmx1ZXRvb3RoOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjkzXCI7XG59XG4uZmEtYmx1ZXRvb3RoLWI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyOTRcIjtcbn1cbi5mYS1wZXJjZW50OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjk1XCI7XG59XG4uZmEtZ2l0bGFiOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjk2XCI7XG59XG4uZmEtd3BiZWdpbm5lcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI5N1wiO1xufVxuLmZhLXdwZm9ybXM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyOThcIjtcbn1cbi5mYS1lbnZpcmE6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyOTlcIjtcbn1cbi5mYS11bml2ZXJzYWwtYWNjZXNzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjlhXCI7XG59XG4uZmEtd2hlZWxjaGFpci1hbHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyOWJcIjtcbn1cbi5mYS1xdWVzdGlvbi1jaXJjbGUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI5Y1wiO1xufVxuLmZhLWJsaW5kOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjlkXCI7XG59XG4uZmEtYXVkaW8tZGVzY3JpcHRpb246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyOWVcIjtcbn1cbi5mYS12b2x1bWUtY29udHJvbC1waG9uZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJhMFwiO1xufVxuLmZhLWJyYWlsbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYTFcIjtcbn1cbi5mYS1hc3Npc3RpdmUtbGlzdGVuaW5nLXN5c3RlbXM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYTJcIjtcbn1cbi5mYS1hc2wtaW50ZXJwcmV0aW5nOmJlZm9yZSxcbi5mYS1hbWVyaWNhbi1zaWduLWxhbmd1YWdlLWludGVycHJldGluZzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJhM1wiO1xufVxuLmZhLWRlYWZuZXNzOmJlZm9yZSxcbi5mYS1oYXJkLW9mLWhlYXJpbmc6YmVmb3JlLFxuLmZhLWRlYWY6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYTRcIjtcbn1cbi5mYS1nbGlkZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJhNVwiO1xufVxuLmZhLWdsaWRlLWc6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYTZcIjtcbn1cbi5mYS1zaWduaW5nOmJlZm9yZSxcbi5mYS1zaWduLWxhbmd1YWdlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmE3XCI7XG59XG4uZmEtbG93LXZpc2lvbjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJhOFwiO1xufVxuLmZhLXZpYWRlbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJhOVwiO1xufVxuLmZhLXZpYWRlby1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYWFcIjtcbn1cbi5mYS1zbmFwY2hhdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJhYlwiO1xufVxuLmZhLXNuYXBjaGF0LWdob3N0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmFjXCI7XG59XG4uZmEtc25hcGNoYXQtc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmFkXCI7XG59XG4uZmEtcGllZC1waXBlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJhZVwiO1xufVxuLmZhLWZpcnN0LW9yZGVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmIwXCI7XG59XG4uZmEteW9hc3Q6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYjFcIjtcbn1cbi5mYS10aGVtZWlzbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYjJcIjtcbn1cbi5mYS1nb29nbGUtcGx1cy1jaXJjbGU6YmVmb3JlLFxuLmZhLWdvb2dsZS1wbHVzLW9mZmljaWFsOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmIzXCI7XG59XG4uZmEtZmE6YmVmb3JlLFxuLmZhLWZvbnQtYXdlc29tZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJiNFwiO1xufVxuLmZhLWhhbmRzaGFrZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmI1XCI7XG59XG4uZmEtZW52ZWxvcGUtb3BlbjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJiNlwiO1xufVxuLmZhLWVudmVsb3BlLW9wZW4tbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJiN1wiO1xufVxuLmZhLWxpbm9kZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJiOFwiO1xufVxuLmZhLWFkZHJlc3MtYm9vazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJiOVwiO1xufVxuLmZhLWFkZHJlc3MtYm9vay1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmJhXCI7XG59XG4uZmEtdmNhcmQ6YmVmb3JlLFxuLmZhLWFkZHJlc3MtY2FyZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJiYlwiO1xufVxuLmZhLXZjYXJkLW86YmVmb3JlLFxuLmZhLWFkZHJlc3MtY2FyZC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmJjXCI7XG59XG4uZmEtdXNlci1jaXJjbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYmRcIjtcbn1cbi5mYS11c2VyLWNpcmNsZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmJlXCI7XG59XG4uZmEtdXNlci1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmMwXCI7XG59XG4uZmEtaWQtYmFkZ2U6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYzFcIjtcbn1cbi5mYS1kcml2ZXJzLWxpY2Vuc2U6YmVmb3JlLFxuLmZhLWlkLWNhcmQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYzJcIjtcbn1cbi5mYS1kcml2ZXJzLWxpY2Vuc2UtbzpiZWZvcmUsXG4uZmEtaWQtY2FyZC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmMzXCI7XG59XG4uZmEtcXVvcmE6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYzRcIjtcbn1cbi5mYS1mcmVlLWNvZGUtY2FtcDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJjNVwiO1xufVxuLmZhLXRlbGVncmFtOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmM2XCI7XG59XG4uZmEtdGhlcm1vbWV0ZXItNDpiZWZvcmUsXG4uZmEtdGhlcm1vbWV0ZXI6YmVmb3JlLFxuLmZhLXRoZXJtb21ldGVyLWZ1bGw6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYzdcIjtcbn1cbi5mYS10aGVybW9tZXRlci0zOmJlZm9yZSxcbi5mYS10aGVybW9tZXRlci10aHJlZS1xdWFydGVyczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJjOFwiO1xufVxuLmZhLXRoZXJtb21ldGVyLTI6YmVmb3JlLFxuLmZhLXRoZXJtb21ldGVyLWhhbGY6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYzlcIjtcbn1cbi5mYS10aGVybW9tZXRlci0xOmJlZm9yZSxcbi5mYS10aGVybW9tZXRlci1xdWFydGVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmNhXCI7XG59XG4uZmEtdGhlcm1vbWV0ZXItMDpiZWZvcmUsXG4uZmEtdGhlcm1vbWV0ZXItZW1wdHk6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyY2JcIjtcbn1cbi5mYS1zaG93ZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyY2NcIjtcbn1cbi5mYS1iYXRodHViOmJlZm9yZSxcbi5mYS1zMTU6YmVmb3JlLFxuLmZhLWJhdGg6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyY2RcIjtcbn1cbi5mYS1wb2RjYXN0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmNlXCI7XG59XG4uZmEtd2luZG93LW1heGltaXplOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmQwXCI7XG59XG4uZmEtd2luZG93LW1pbmltaXplOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmQxXCI7XG59XG4uZmEtd2luZG93LXJlc3RvcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyZDJcIjtcbn1cbi5mYS10aW1lcy1yZWN0YW5nbGU6YmVmb3JlLFxuLmZhLXdpbmRvdy1jbG9zZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJkM1wiO1xufVxuLmZhLXRpbWVzLXJlY3RhbmdsZS1vOmJlZm9yZSxcbi5mYS13aW5kb3ctY2xvc2UtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJkNFwiO1xufVxuLmZhLWJhbmRjYW1wOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmQ1XCI7XG59XG4uZmEtZ3JhdjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJkNlwiO1xufVxuLmZhLWV0c3k6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyZDdcIjtcbn1cbi5mYS1pbWRiOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmQ4XCI7XG59XG4uZmEtcmF2ZWxyeTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJkOVwiO1xufVxuLmZhLWVlcmNhc3Q6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyZGFcIjtcbn1cbi5mYS1taWNyb2NoaXA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyZGJcIjtcbn1cbi5mYS1zbm93Zmxha2UtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJkY1wiO1xufVxuLmZhLXN1cGVycG93ZXJzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmRkXCI7XG59XG4uZmEtd3BleHBsb3JlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJkZVwiO1xufVxuLmZhLW1lZXR1cDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJlMFwiO1xufVxuLnNyLW9ubHkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxcHg7XG4gIGhlaWdodDogMXB4O1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IC0xcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGNsaXA6IHJlY3QoMCwgMCwgMCwgMCk7XG4gIGJvcmRlcjogMDtcbn1cbi5zci1vbmx5LWZvY3VzYWJsZTphY3RpdmUsXG4uc3Itb25seS1mb2N1c2FibGU6Zm9jdXMge1xuICBwb3NpdGlvbjogc3RhdGljO1xuICB3aWR0aDogYXV0bztcbiAgaGVpZ2h0OiBhdXRvO1xuICBtYXJnaW46IDA7XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xuICBjbGlwOiBhdXRvO1xufVxuXG5AY2hhcnNldCBcInV0Zi04XCI7XG4uZGlzcGxheUJhciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDIzNnB4O1xuICBoZWlnaHQ6IDE2cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7XG4gIGZsb2F0OiBsZWZ0O1xuICBtYXJnaW46IDAgNXB4IDAgMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZDogIzAwMDAwMDtcbn1cbi5kaXNwbGF5QmFyVGV4dCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAtMnB4O1xuICBsZWZ0OiA1cHg7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGNvbG9yOiAjZmZmZmZmO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xufVxuLmRpc3BsYXlCYXJGaWxsIHtcbiAgd2lkdGg6IDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQ6ICM0MDYyOGE7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGZsb2F0OiBsZWZ0O1xufVxuLmRpc3BsYXlCYXJGaWxsLmFsaWduUmlnaHQge1xuICBmbG9hdDogcmlnaHQ7XG59XG4uZGlzcGxheUJhclRleHQuZ29vZCB7XG4gIGNvbG9yOiB3aGl0ZTtcbn1cbi5kaXNwbGF5QmFyVGV4dC5ub3Rnb29kIHtcbiAgY29sb3I6IHdoaXRlO1xufVxuLmRpc3BsYXlCYXJUZXh0LmF2ZXJhZ2Uge1xuICBjb2xvcjogd2hpdGU7XG59XG4uZGlzcGxheUJhclRleHQuYmFkIHtcbiAgY29sb3I6IHdoaXRlO1xufVxuLmRpc3BsYXlCYXJUZXh0LmhpZ2hsaWdodCB7XG4gIGNvbG9yOiBibGFjaztcbn1cbi5kaXNwbGF5QmFyRmlsbC5nb29kIHtcbiAgY29sb3I6ICNmZmZmZmY7XG4gIGJhY2tncm91bmQ6ICM0Zjc1Mjk7XG59XG4uZGlzcGxheUJhckZpbGwubm90Z29vZCB7XG4gIGNvbG9yOiAjZmZmZmZmO1xuICBiYWNrZ3JvdW5kOiAjZmZiNDAwO1xufVxuLmRpc3BsYXlCYXJGaWxsLmF2ZXJhZ2Uge1xuICBjb2xvcjogI2ZmZmZmZjtcbiAgYmFja2dyb3VuZDogI2NkNjUwMDtcbn1cbi5kaXNwbGF5QmFyRmlsbC5iYWQge1xuICBjb2xvcjogI2ZmZmZmZjtcbiAgYmFja2dyb3VuZDogI2VlMDAwMDtcbn1cbi5kaXNwbGF5QmFyRmlsbC5oaWdobGlnaHQge1xuICBjb2xvcjogI2ZmZmZmZjtcbiAgYmFja2dyb3VuZDogIzhCQTVDNDtcbn1cbi5saW5rLFxuLmxpbmtPbixcbi5saW5rT2ZmLFxuLnNlbGVjdGVkLFxuLmRpc2FibGVkLFxuLnllbGxvd0J1dHRvbixcbi5yZWRCdXR0b24sXG4ubGlua0VuY291cmFnZSxcbi5saW5rRGlzY291cmFnZSB7XG4gIGZsb2F0OiBsZWZ0O1xuICBtaW4td2lkdGg6IDE1cHg7XG4gIGhlaWdodDogMTZweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogI2ZmZmZmZjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBiYWNrZ3JvdW5kOiAjNDA2MjhhO1xuICBib3JkZXI6IDFweCBzb2xpZCAjMTYxNjE2O1xuICBwYWRkaW5nOiAwcHggNHB4IDRweCA0cHg7XG4gIG1hcmdpbjogMCAycHggMnB4IDA7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi5oYXNJY29uIHtcbiAgcGFkZGluZzogMHB4IDRweCA0cHggMHB4O1xufVxuYS5ob3Zlcixcbi56b29tTGluay5ob3Zlcixcbi5saW5rQWN0aXZlLmhvdmVyIHtcbiAgYmFja2dyb3VuZDogIzUwN2FhYztcbn1cbkBrZXlmcmFtZXMgcGVuZGluZ0FuaW1hdGlvbiB7XG4gIHRvIHtcbiAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICBiYWNrZ3JvdW5kOiAjNTA3YWFjO1xuICB9XG59XG4ubGlua1BlbmRpbmcsXG4ubGlua1BlbmRpbmcuaG92ZXIge1xuICBhbmltYXRpb24tbmFtZTogcGVuZGluZ0FuaW1hdGlvbjtcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjI1cztcbn1cbmEud2hpdGUsXG5hLndoaXRlOmxpbmssXG5hLndoaXRlOnZpc2l0ZWQsXG5hLndoaXRlOmFjdGl2ZSB7XG4gIGNvbG9yOiAjNDA2MjhhO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICMxNjE2MTY7XG4gIHBhZGRpbmc6IDFweCA0cHggMXB4IDRweDtcbiAgbWFyZ2luOiAwIDJweCAwIDA7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cbmEud2hpdGUuaG92ZXIge1xuICBjb2xvcjogI2ZmZmZmZjtcbiAgYmFja2dyb3VuZDogIzQwNjI4YTtcbn1cbi5saW5rT24sXG5hLmxpbmtPbjpsaW5rLFxuYS5saW5rT246dmlzaXRlZCxcbmEubGlua09uOmFjdGl2ZSxcbmEubGlua09uLmhvdmVyLFxuLnNlbGVjdGVkLFxuYS5zZWxlY3RlZDpsaW5rLFxuYS5zZWxlY3RlZDp2aXNpdGVkLFxuYS5zZWxlY3RlZDphY3RpdmUsXG5hLnNlbGVjdGVkLmhvdmVyIHtcbiAgY29sb3I6ICNmZmZmZmY7XG4gIGJhY2tncm91bmQ6ICMyZjk0M2M7XG59XG4ubGlua09mZixcbmEubGlua09mZjpsaW5rLFxuYS5saW5rT2ZmOnZpc2l0ZWQsXG5hLmxpbmtPZmY6YWN0aXZlLFxuYS5saW5rT2ZmLmhvdmVyLFxuLmRpc2FibGVkLFxuYS5kaXNhYmxlZDpsaW5rLFxuYS5kaXNhYmxlZDp2aXNpdGVkLFxuYS5kaXNhYmxlZDphY3RpdmUsXG5hLmRpc2FibGVkLmhvdmVyIHtcbiAgY29sb3I6ICNmZmZmZmY7XG4gIGJhY2tncm91bmQ6ICM5OTk5OTk7XG4gIGJvcmRlci1jb2xvcjogIzY2NjY2Njtcbn1cbmEuaWNvbixcbi5saW5rT24uaWNvbixcbi5saW5rT2ZmLmljb24sXG4uc2VsZWN0ZWQuaWNvbixcbi5kaXNhYmxlZC5pY29uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBwYWRkaW5nOiAxcHggNHB4IDJweCAyMHB4O1xufVxuYS5pY29uIGltZyxcbi5saW5rT24uaWNvbiBpbWcsXG4ubGlua09mZi5pY29uIGltZyxcbi5zZWxlY3RlZC5pY29uIGltZyxcbi5kaXNhYmxlZC5pY29uIGltZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMThweDtcbiAgaGVpZ2h0OiAxOHB4O1xufVxuLmxpbmtEYW5nZXIsXG5hLmxpbmtEYW5nZXI6bGluayxcbmEubGlua0Rhbmdlcjp2aXNpdGVkLFxuYS5saW5rRGFuZ2VyOmFjdGl2ZSB7XG4gIGNvbG9yOiAjZmZmZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmYwMDAwO1xuICBib3JkZXItY29sb3I6ICNhYTAwMDA7XG59XG4ubGlua0Rhbmdlci5ob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZjY2NjY7XG59XG4ubGlua0VuY291cmFnZSxcbmEubGlua0VuY291cmFnZTpsaW5rLFxuYS5saW5rRW5jb3VyYWdlOnZpc2l0ZWQsXG5hLmxpbmtFbmNvdXJhZ2U6YWN0aXZlIHtcbiAgY29sb3I6ICM5OWZmMzM7XG4gIGJhY2tncm91bmQtY29sb3I6ICM0MDYyOGE7XG4gIGJvcmRlci1jb2xvcjogIzE2MTYxNjtcbn1cbi5saW5rRW5jb3VyYWdlLmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzUwN2FhYztcbn1cbi5saW5rRGlzY291cmFnZSxcbmEubGlua0Rpc2NvdXJhZ2U6bGluayxcbmEubGlua0Rpc2NvdXJhZ2U6dmlzaXRlZCxcbmEubGlua0Rpc2NvdXJhZ2U6YWN0aXZlIHtcbiAgY29sb3I6ICM4YzhjOGM7XG4gIGJhY2tncm91bmQtY29sb3I6ICM0MDYyOGE7XG4gIGJvcmRlci1jb2xvcjogIzE2MTYxNjtcbn1cbi5saW5rRGlzY291cmFnZS5ob3ZlciB7XG4gIGNvbG9yOiAjZmYwMDAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTA3YWFjO1xufVxuLmluYWN0aXZlLFxuYS5pbmFjdGl2ZTpsaW5rLFxuYS5pbmFjdGl2ZTp2aXNpdGVkLFxuYS5pbmFjdGl2ZTphY3RpdmUsXG5hLmluYWN0aXZlLmhvdmVyIHtcbiAgY29sb3I6ICNmZmZmZmY7XG4gIGJhY2tncm91bmQ6ICM5OTk5OTk7XG4gIGJvcmRlci1jb2xvcjogIzY2NjY2Njtcbn1cbi53aGl0ZSB7XG4gIGNvbG9yOiB3aGl0ZTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4uZ29vZCB7XG4gIGNvbG9yOiAjNGY3NTI5O1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbi5hdmVyYWdlIHtcbiAgY29sb3I6ICNjZDY1MDA7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuLmJhZCB7XG4gIGNvbG9yOiAjZWUwMDAwO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbi5pZGxlIHtcbiAgY29sb3I6ICMyNzI3Mjc7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuLnJlZEJ1dHRvbiB7XG4gIGJhY2tncm91bmQ6ICNlYTAwMDA7XG59XG4ueWVsbG93QnV0dG9uIHtcbiAgYmFja2dyb3VuZDogI2NhY2MwMDtcbn1cbi5oaWdobGlnaHQge1xuICBjb2xvcjogIzhCQTVDNDtcbn1cbi5kYXJrIHtcbiAgY29sb3I6ICMyNzI3Mjc7XG59XG4vKiBEYW1hZ2UgY29sb3JzIGZvciBjcmV3IG1vbml0b3JpbmcgY29tcHV0ZXIgKi9cbi5idXJuIHtcbiAgY29sb3I6IG9yYW5nZTtcbn1cbi5icnV0ZSB7XG4gIGNvbG9yOiByZWQ7XG59XG4udG94aW4ge1xuICBjb2xvcjogZ3JlZW47XG59XG4udG94aW5fbGlnaHQge1xuICBjb2xvcjogIzNBREYwMDtcbn1cbi5veHlsb3NzIHtcbiAgY29sb3I6IGJsdWU7XG59XG4ub3h5bG9zc19saWdodCB7XG4gIGNvbG9yOiAjNjY5OEZGO1xufVxuLyogV2lyZSBjb2xvcnMgZm9yIG51Y2xlYXIgYm9tYiBkZWZ1c2lvbiAqL1xuLlJlZCB7XG4gIGNvbG9yOiAjRkYwMDAwO1xufVxuLkJsdWUge1xuICBjb2xvcjogIzAwMDBGRjtcbn1cbi5HcmVlbiB7XG4gIGNvbG9yOiAjMDBGRjAwO1xufVxuLk1hcmlnb2xkIHtcbiAgY29sb3I6ICNGREE1MDU7XG59XG4uRnVzY2hpYSB7XG4gIGNvbG9yOiAjRkYwMDgwO1xufVxuLkJsYWNrIHtcbiAgY29sb3I6ICMwMDAwMDA7XG59XG4uUGVhcmwge1xuICBjb2xvcjogI0M2Q0FDQjtcbn1cbi8qIFN0YXR1cyBiYXIgY29sb3JzIGZvciBzbGVlcGVyIHRlbXBlcmF0dXJlcyAqL1xuLmNvbGQxIHtcbiAgY29sb3I6ICM5NEI4RkY7XG59XG4uY29sZDIge1xuICBjb2xvcjogIzY2OTlGRjtcbn1cbi5jb2xkMyB7XG4gIGNvbG9yOiAjMjkzRDY2O1xufVxuLmhvdDEge1xuICBjb2xvcjogI0ZGOTk2Njtcbn1cbi5ob3QyIHtcbiAgY29sb3I6ICM5OTNEMDA7XG59XG4uaG90MyB7XG4gIGNvbG9yOiAjRkY2NjAwO1xufVxuZGl2LmRpc3BsYXkge1xuICBwYWRkaW5nOiA0cHg7XG4gIG1hcmdpbjogNnB4IDA7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zMyk7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMCA1cHggcmdiYSgwLCAwLCAwLCAwLjUpO1xufVxuZGl2LmRpc3BsYXkgaGVhZGVyIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDk4LjUlO1xuICBwYWRkaW5nOiAwIDRweDtcbiAgbWFyZ2luLWJvdHRvbTogNnB4O1xuICBjb2xvcjogI0ZGRkZGRjtcbiAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICM0MDYyOGE7XG59XG5kaXYuZGlzcGxheSBoZWFkZXIgLmJ1dHRvblJpZ2h0IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDZweDtcbiAgcmlnaHQ6IDRweDtcbn1cbmRpdi5kaXNwbGF5IGFydGljbGUge1xuICBkaXNwbGF5OiB0YWJsZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG59XG4uaXRlbUdyb3VwIHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2U5YzE4MztcbiAgYmFja2dyb3VuZDogIzJjMmMyYztcbiAgcGFkZGluZzogNHB4O1xuICBjbGVhcjogYm90aDtcbn1cbi5pdGVtIHtcbiAgd2lkdGg6IDEwMCU7XG4gIG1hcmdpbjogNHB4IDAgMCAwO1xuICBjbGVhcjogYm90aDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uaXRlbUNvbnRlbnROYXJyb3csXG4uaXRlbUNvbnRlbnQge1xuICBmbG9hdDogbGVmdDtcbn1cbi5pdGVtQ29udGVudE5hcnJvdyB7XG4gIHdpZHRoOiAzMCU7XG59XG4uaXRlbUNvbnRlbnQge1xuICB3aWR0aDogNjklO1xufVxuLml0ZW1MYWJlbE5hcnJvdyxcbi5pdGVtTGFiZWwsXG4uaXRlbUxhYmVsV2lkZSxcbi5pdGVtTGFiZWxXaWRlcixcbi5pdGVtTGFiZWxXaWRlc3Qge1xuICBmbG9hdDogbGVmdDtcbiAgY29sb3I6ICNlOWMxODM7XG59XG4uaXRlbUxhYmVsTmFycm93IHtcbiAgd2lkdGg6IDIwJTtcbn1cbi5pdGVtTGFiZWwge1xuICB3aWR0aDogMzAlO1xufVxuLml0ZW1MYWJlbFdpZGUge1xuICB3aWR0aDogNDUlO1xufVxuLml0ZW1MYWJlbFdpZGVyIHtcbiAgd2lkdGg6IDY5JTtcbn1cbi5pdGVtTGFiZWxXaWRlc3Qge1xuICB3aWR0aDogMTAwJTtcbn1cbi5pdGVtQ29udGVudFdpZGUge1xuICBmbG9hdDogbGVmdDtcbiAgd2lkdGg6IDc5JTtcbn1cbi5pdGVtQ29udGVudFNtYWxsIHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIHdpZHRoOiAzMyU7XG59XG4uaXRlbUNvbnRlbnRNZWRpdW0ge1xuICBmbG9hdDogbGVmdDtcbiAgd2lkdGg6IDU1JTtcbn1cbi5ibG9jayB7XG4gIHBhZGRpbmc6IDhweDtcbiAgbWFyZ2luOiAxMHB4IDRweCA0cHggNHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjNDA2MjhhO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwO1xufVxuLmJsb2NrIGgzIHtcbiAgcGFkZGluZzogMDtcbn1cbi5jbGVhckJvdGgge1xuICBjbGVhcjogYm90aDtcbn1cbi5jbGVhckxlZnQge1xuICBjbGVhcjogbGVmdDtcbn1cbi5jbGVhclJpZ2h0IHtcbiAgY2xlYXI6IHJpZ2h0O1xufVxuLmxpbmUge1xuICB3aWR0aDogMTAwJTtcbiAgY2xlYXI6IGJvdGg7XG59XG4uZml4ZWRMZWZ0IHtcbiAgd2lkdGg6IDExMHB4O1xuICBmbG9hdDogbGVmdDtcbn1cbi5maXhlZExlZnRXaWRlIHtcbiAgd2lkdGg6IDE2NXB4O1xuICBmbG9hdDogbGVmdDtcbn1cbi5maXhlZExlZnRXaWRlciB7XG4gIHdpZHRoOiAyMjBweDtcbiAgZmxvYXQ6IGxlZnQ7XG59XG4uZml4ZWRMZWZ0V2lkZXN0IHtcbiAgd2lkdGg6IDI1MHB4O1xuICBmbG9hdDogbGVmdDtcbn1cbi5mbG9hdFJpZ2h0IHtcbiAgZmxvYXQ6IHJpZ2h0O1xufVxuLmZsb2F0TGVmdCB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuLmhpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4uc3RhdHVzRGlzcGxheSB7XG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgY29sb3I6ICNmZmZmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICM0MDYyOGE7XG4gIHBhZGRpbmc6IDRweDtcbiAgbWFyZ2luOiAzcHggMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5zdGF0dXNEaXNwbGF5UmVjb3JkcyB7XG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgY29sb3I6ICNmZmZmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICM0MDYyOGE7XG4gIHBhZGRpbmc6IDRweDtcbiAgbWFyZ2luOiAzcHggMDtcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICBvdmVyZmxvdy15OiBhdXRvO1xufVxuLnN0YXR1c0xhYmVsIHtcbiAgd2lkdGg6IDEzOHB4O1xuICBmbG9hdDogbGVmdDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgY29sb3I6ICM5OEIwQzM7XG59XG4uc3RhdHVzVmFsdWUge1xuICBmbG9hdDogbGVmdDtcbn1cbi5qb2JWYWx1ZXMge1xuICBmbG9hdDogbGVmdDtcbiAgd2lkdGg6IDMwJTtcbn1cbi5mYW5jeSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5pLmZhbmN5IHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5taW5pbWl6ZSB7XG4gIGNvbG9yOiAjRTlDMTgzO1xuICBjdXJzb3I6IHBvaW50ZXIgIWltcG9ydGFudDtcbiAgei1pbmRleDogMTAyO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNnB4O1xuICByaWdodDogNDZweDtcbn1cbi5taW5pbWl6ZTpob3ZlciB7XG4gIGNvbG9yOiAjYjhjOWQ2O1xufVxuLmNsb3NlIHtcbiAgY29sb3I6ICNFOUMxODM7XG4gIGN1cnNvcjogcG9pbnRlciAhaW1wb3J0YW50O1xuICB6LWluZGV4OiAxMDI7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA0cHg7XG4gIHJpZ2h0OiAxMnB4O1xufVxuLmNsb3NlOmhvdmVyIHtcbiAgY29sb3I6ICNiOGM5ZDY7XG59XG4jdWlDb3JuZXJUTCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogMTAxO1xuICBtaW4td2lkdGg6IDMwcHg7XG4gIG1pbi1oZWlnaHQ6IDMwcHg7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgYmFja2dyb3VuZDogdXJsKFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCNEFBQUFlQ0FJQUFBQzBVam4xQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUdUR2xVV0hSWVRVdzZZMjl0TG1Ga2IySmxMbmh0Y0FBQUFBQUFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TkRJZ056a3VNVFl3T1RJMExDQXlNREUzTHpBM0x6RXpMVEF4T2pBMk9qTTVJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbVJqUFNKb2RIUndPaTh2Y0hWeWJDNXZjbWN2WkdNdlpXeGxiV1Z1ZEhNdk1TNHhMeUlnZUcxc2JuTTZjR2h2ZEc5emFHOXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNCb2IzUnZjMmh2Y0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JGZG5ROUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlVWMlpXNTBJeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE9DQW9WMmx1Wkc5M2N5a2lJSGh0Y0RwRGNtVmhkR1ZFWVhSbFBTSXlNREU0TFRFeExUSXdWREl5T2pNNE9qSTFMVEE0T2pBd0lpQjRiWEE2VFc5a2FXWjVSR0YwWlQwaU1qQXhPQzB4TVMweU1GUXlNem93TXpvd01TMHdPRG93TUNJZ2VHMXdPazFsZEdGa1lYUmhSR0YwWlQwaU1qQXhPQzB4TVMweU1GUXlNem93TXpvd01TMHdPRG93TUNJZ1pHTTZabTl5YldGMFBTSnBiV0ZuWlM5d2JtY2lJSEJvYjNSdmMyaHZjRHBEYjJ4dmNrMXZaR1U5SWpNaUlIQm9iM1J2YzJodmNEcEpRME5RY205bWFXeGxQU0p6VWtkQ0lFbEZRell4T1RZMkxUSXVNU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBrT1dSbE16YzFZaTA0WldRd0xXSTNORGN0T1RRelpTMHpOMlV3WkdVMk5Ea3lPRFFpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW1Ga2IySmxPbVJ2WTJsa09uQm9iM1J2YzJodmNEbzBabVZoWmpKbVpDMDNZV1ZoTFdVeU5HUXRZVE5rWlMwNVptSTVaR00wWlRBMFl6SWlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcGpaVFU0T1RrNU15MW1aRFUyTFRFek5Ea3RZV015TUMwM05HWmtabVk1TmpOallUZ2lQaUE4ZUcxd1RVMDZTR2x6ZEc5eWVUNGdQSEprWmpwVFpYRStJRHh5WkdZNmJHa2djM1JGZG5RNllXTjBhVzl1UFNKamNtVmhkR1ZrSWlCemRFVjJkRHBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21ObE5UZzVPVGt6TFdaa05UWXRNVE0wT1MxaFl6SXdMVGMwWm1SbVpqazJNMk5oT0NJZ2MzUkZkblE2ZDJobGJqMGlNakF4T0MweE1TMHlNRlF5TWpvek9Eb3lOUzB3T0Rvd01DSWdjM1JGZG5RNmMyOW1kSGRoY21WQloyVnVkRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UZ2dLRmRwYm1SdmQzTXBJaTgrSUR4eVpHWTZiR2tnYzNSRmRuUTZZV04wYVc5dVBTSmpiMjUyWlhKMFpXUWlJSE4wUlhaME9uQmhjbUZ0WlhSbGNuTTlJbVp5YjIwZ2FXMWhaMlV2WjJsbUlIUnZJR2x0WVdkbEwzQnVaeUl2UGlBOGNtUm1PbXhwSUhOMFJYWjBPbUZqZEdsdmJqMGljMkYyWldRaUlITjBSWFowT21sdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlpEbGtaVE0zTldJdE9HVmtNQzFpTnpRM0xUazBNMlV0TXpkbE1HUmxOalE1TWpnMElpQnpkRVYyZERwM2FHVnVQU0l5TURFNExURXhMVEl3VkRJek9qQXpPakF4TFRBNE9qQXdJaUJ6ZEVWMmREcHpiMlowZDJGeVpVRm5aVzUwUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhPQ0FvVjJsdVpHOTNjeWtpSUhOMFJYWjBPbU5vWVc1blpXUTlJaThpTHo0Z1BDOXlaR1k2VTJWeFBpQThMM2h0Y0UxTk9raHBjM1J2Y25rK0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K1FuUktSQUFBQUloSlJFRlVTSW0xekxjUmdFQU1CTUNEb2tRZjlCL1NCd1F3bU9lTnpHa0wyR25IaGdTTHJIUFNDNEJmbnkrL3ZsOXkvWDZaZGZIUzZ2L0xxYXN2b1c2OTBicnpodXIrNjYrSHI3UFd2SjVhK1pwci9XdXJUYStodHI3YTJ2R3FhdDg3cnQzdm9JNjh2VHI0TnV2NFc2OHBiNlZtdldWTmZEODE5MzFxK252VkdTK0FTVVF5WGdBSHVPZ1lZd09raElZQUFBQUFTVVZPUks1Q1lJST1cIikgbm8tcmVwZWF0O1xufVxuLyogUmVzaXppbmcgKFN0b2xlbiBmcm9tIEdvb24gQ0MtQlktTkMtU0EpICovXG4ucmVzaXplQXJlYSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogOTk5OTk7XG59XG4ucmVzaXplQXJlYS50b3Age1xuICB0b3A6IDA7XG4gIGxlZnQ6IDEwcHg7XG4gIHJpZ2h0OiAxMHB4O1xuICBoZWlnaHQ6IDVweDtcbiAgY3Vyc29yOiBuLXJlc2l6ZTtcbn1cbi5yZXNpemVBcmVhLnRyIHtcbiAgdG9wOiAwO1xuICByaWdodDogMDtcbiAgaGVpZ2h0OiAxMHB4O1xuICB3aWR0aDogMTBweDtcbiAgY3Vyc29yOiBuZS1yZXNpemU7XG59XG4ucmVzaXplQXJlYS5yaWdodCB7XG4gIHRvcDogMTBweDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMTBweDtcbiAgd2lkdGg6IDVweDtcbiAgY3Vyc29yOiBlLXJlc2l6ZTtcbn1cbi5yZXNpemVBcmVhLmJyIHtcbiAgYm90dG9tOiAwO1xuICByaWdodDogMDtcbiAgaGVpZ2h0OiAxMHB4O1xuICB3aWR0aDogMTBweDtcbiAgY3Vyc29yOiBzZS1yZXNpemU7XG59XG4ucmVzaXplQXJlYS5ib3R0b20ge1xuICBib3R0b206IDA7XG4gIGxlZnQ6IDEwcHg7XG4gIHJpZ2h0OiAxMHB4O1xuICBoZWlnaHQ6IDVweDtcbiAgY3Vyc29yOiBzLXJlc2l6ZTtcbn1cbi5yZXNpemVBcmVhLmJsIHtcbiAgYm90dG9tOiAwO1xuICBsZWZ0OiAwO1xuICBoZWlnaHQ6IDEwcHg7XG4gIHdpZHRoOiAxMHB4O1xuICBjdXJzb3I6IHN3LXJlc2l6ZTtcbn1cbi5yZXNpemVBcmVhLmxlZnQge1xuICB0b3A6IDEwcHg7XG4gIGxlZnQ6IDA7XG4gIGJvdHRvbTogMTBweDtcbiAgd2lkdGg6IDVweDtcbiAgY3Vyc29yOiB3LXJlc2l6ZTtcbn1cbi5yZXNpemVBcmVhLnRsIHtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBoZWlnaHQ6IDEwcHg7XG4gIHdpZHRoOiAxMHB4O1xuICBjdXJzb3I6IG53LXJlc2l6ZTtcbn1cbi8qIEVuZCBSZXNpemluZyAqL1xuLyogSWNvbnNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuLyogc3RhdGVzIGFuZCBpbWFnZXMgKi9cbi51aUxpbmtQZW5kaW5nSWNvbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIGZsb2F0OiBsZWZ0O1xuICB3aWR0aDogMTZweDtcbiAgaGVpZ2h0OiAxNnB4O1xuICBtYXJnaW46IDJweCAycHggMCAycHg7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCh1aUxpbmtQZW5kaW5nSWNvbi5naWYpO1xufVxuLmxpbmtQZW5kaW5nIC5mYSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ubGlua1BlbmRpbmcgLnVpTGlua1BlbmRpbmdJY29uIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG4ubWFwSWNvbjE2IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMTZweDtcbiAgaGVpZ2h0OiAxNnB4O1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwodWlJY29uczE2R3JlZW4ucG5nKTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC05NnB4O1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICB6b29tOiAwLjEyNTtcbiAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gIC8qbWFyZ2luLWJvdHRvbTogLTFweDsqL1xufVxuLm1hcEljb24xNi5kZWFkIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKHVpSWNvbnMxNlJlZC5wbmcpO1xufVxuLm1hcEljb24xNi5iYWQge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwodWlJY29uczE2UmVkLnBuZyk7XG59XG4ubWFwSWNvbjE2LmF2ZXJhZ2Uge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwodWlJY29uczE2T3JhbmdlLnBuZyk7XG59XG4ubWFwSWNvbjE2Lmdvb2Qge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwodWlJY29uczE2R3JlZW4ucG5nKTtcbn1cbi8qIEFpckFsYXJtICovXG4ubWFwSWNvbjE2Lmljb24tYWlyYWxhcm0ge1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNDRweDtcbn1cbi8qIENvbW1hbmQgUG9zaXRpb25zICovXG4ubWFwSWNvbjE2LnJhbmstY2FwdGFpbiB7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtMTEycHg7XG59XG4ubWFwSWNvbjE2LnJhbmstaGVhZG9mcGVyc29ubmVsIHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC05NnB4O1xufVxuLm1hcEljb24xNi5yYW5rLWhlYWRvZnNlY3VyaXR5IHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xMjhweDtcbn1cbi5tYXBJY29uMTYucmFuay1jaGllZmVuZ2luZWVyIHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xMTJweDtcbn1cbi5tYXBJY29uMTYucmFuay1yZXNlYXJjaGRpcmVjdG9yIHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xMjhweDtcbn1cbi5tYXBJY29uMTYucmFuay1jaGllZm1lZGljYWxvZmZpY2VyIHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTEyOHB4O1xufVxuLyogRW5naW5lZXJpbmcgUG9zaXRpb25zICovXG4ubWFwSWNvbjE2LnJhbmstc3RhdGlvbmVuZ2luZWVyIHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xMTJweDtcbn1cbi5tYXBJY29uMTYucmFuay1hdG1vc3BoZXJpY3RlY2huaWNpYW4ge1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTExMnB4O1xufVxuLyogTWVkaWNhbCBQb3NpdGlvbnMgKi9cbi5tYXBJY29uMTYucmFuay1tZWRpY2FsZG9jdG9yIHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTEyOHB4O1xufVxuLm1hcEljb24xNi5yYW5rLWdlbmV0aWNpc3Qge1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7XG59XG4ubWFwSWNvbjE2LnJhbmstcHN5Y2hpYXRyaXN0IHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTEyOHB4O1xufVxuLm1hcEljb24xNi5yYW5rLWNoZW1pc3Qge1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7XG59XG4vKiBTY2llbmNlIFBvc2l0aW9ucyAqL1xuLm1hcEljb24xNi5yYW5rLXNjaWVudGlzdCB7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7XG59XG4ubWFwSWNvbjE2LnJhbmstZ2VuZXRpY2lzdCB7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7XG59XG4ubWFwSWNvbjE2LnJhbmstcm9ib3RpY2lzdCB7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7XG59XG4ubWFwSWNvbjE2LnJhbmsteGVub2Jpb2xvZ2lzdCB7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7XG59XG4vKiBTZWN1cml0eSBQb3NpdGlvbnMgKi9cbi5tYXBJY29uMTYucmFuay13YXJkZW4ge1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTEyOHB4O1xufVxuLm1hcEljb24xNi5yYW5rLWRldGVjdGl2ZSB7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTI4cHg7XG59XG4ubWFwSWNvbjE2LnJhbmstc2VjdXJpdHlvZmZpY2VyIHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xMjhweDtcbn1cbnVsIHtcbiAgcGFkZGluZzogNHB4IDAgMCAxMHB4O1xuICBtYXJnaW46IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbn1cbmxpIHtcbiAgcGFkZGluZzogMCAwIDJweCAwO1xufVxudGFibGUuZml4ZWQge1xuICB0YWJsZS1sYXlvdXQ6IGZpeGVkO1xufVxudGFibGUuZml4ZWQgdGQge1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLyogVGFibGUgc3R5bGluZyBmb3IgdGhlIHBvd2VyIG1vbml0b3IgKi9cbnRhYmxlLnBtb24ge1xuICBib3JkZXI6IDJweCBzb2xpZCBSb3lhbEJsdWU7XG59XG50YWJsZS5wbW9uIHRkLFxudGFibGUucG1vbiB0aCB7XG4gIGJvcmRlci1ib3R0b206IDFweCBkb3R0ZWQgYmxhY2s7XG4gIHBhZGRpbmc6IDBweCA1cHggMHB4IDVweDtcbn1cbi8qIFRhYmxlIHN0eWxpbmcgZm9yIHRoZSBjcmV3IG1hbmlmZXN0ICovXG50aC5jb21tYW5kIHtcbiAgYmFja2dyb3VuZDogIzMzMzNGRjtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxudGguc2VjIHtcbiAgYmFja2dyb3VuZDogIzhlMDAwMDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxudGgubWVkIHtcbiAgYmFja2dyb3VuZDogIzAwNjYwMDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxudGguZW5nIHtcbiAgYmFja2dyb3VuZDogI2IyNzMwMDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxudGguc2NpIHtcbiAgYmFja2dyb3VuZDogI2E2NWJhNjtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxudGguc2VyIHtcbiAgYmFja2dyb3VuZDogIzcxMDBBQTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxudGguc3VwIHtcbiAgYmFja2dyb3VuZDogIzY2NjYyMTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxudGguY2l2IHtcbiAgYmFja2dyb3VuZDogI2EzMjgwMDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxudGgubWlzYyB7XG4gIGJhY2tncm91bmQ6ICM2NjY7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogI2ZmZmZmZjtcbn1cbnNwYW4ucW0tam9iIHtcbiAgY29sb3I6ICNiNzdhNDE7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuLyogU3RyaXBlZCBsaW5lcyBmb3IgdGFibGVzIGFuZCBkaXZzICovXG4uc3RyaXBlZCB0cjpudGgtY2hpbGQoZXZlbikge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDA0MDQwO1xufVxuLnN0cmlwZWQ6bm90KHRhYmxlKSA+IDpudGgtY2hpbGQoZXZlbikge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDA0MDQwO1xufVxuI3VpTm9TY3JpcHQge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIG1hcmdpbjogLTYwcHggMCAwIC0xNTBweDtcbiAgd2lkdGg6IDI4MHB4O1xuICBoZWlnaHQ6IDEyMHB4O1xuICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICBib3JkZXI6IDJweCBzb2xpZCAjZmYwMDAwO1xuICBjb2xvcjogIzAwMDAwMDtcbiAgZm9udC1zaXplOiAxMHB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgei1pbmRleDogOTk5OTtcbiAgcGFkZGluZzogMHB4IDEwcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIC5ub3RpY2UgfCBDYXV0aW9uIFN0cmlwZXNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4ubm90aWNlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBiYWNrZ3JvdW5kOiB1cmwodWlOb3RpY2VCYWNrZ3JvdW5kLmpwZykgNTAlIDUwJTtcbiAgY29sb3I6ICMwMDAwMDA7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgcGFkZGluZzogM3B4IDRweCAzcHggNHB4O1xuICBtYXJnaW46IDRweCAwIDRweCAwO1xufVxuLm5vdGljZVBsYWNlaG9sZGVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIHBhZGRpbmc6IDNweCA0cHggM3B4IDRweDtcbiAgbWFyZ2luOiA0cHggMCA0cHggMDtcbn1cbi5ub3RpY2UuaWNvbiB7XG4gIHBhZGRpbmc6IDJweCA0cHggMCAyMHB4O1xufVxuLm5vdGljZSBpbWcge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDE2cHg7XG4gIGhlaWdodDogMTZweDtcbn1cbmRpdi5ub3RpY2Uge1xuICBjbGVhcjogYm90aDtcbn1cbi8qKioqKioqKioqKioqKioqKioqKlxcXG5cXCoqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBQREEsIEROQSBNb2RpZmllciBzdHlsZXNcbiAgICBEb24ndCBmaXQgYW55d2hlcmUgZWxzZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiBQREEgc3R5bGluZyAqL1xuLndob2xlU2NyZWVuIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBjb2xvcjogIzUxNzA4NztcbiAgZm9udC1zaXplOiAxNnB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLnBkYWxpbmsge1xuICBmbG9hdDogbGVmdDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XG59XG4ucGRhbGluay5kaXNhYmxlZCB7XG4gIGJhY2tncm91bmQ6IG5vbmU7XG4gIGJvcmRlcjogbm9uZTtcbiAgY29sb3I6ICM5OTk7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG4ucGRhbm90ZSB7XG4gIGNvbG9yOiAjY2Q2NTAwO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbi5pdGVtLm1haW5tZW51IHtcbiAgcGFkZGluZy1ib3R0b206IDAuNWVtO1xufVxuZGl2LmNsb2NrIHtcbiAgY29sb3I6IHdoaXRlO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgZmxvYXQ6IHJpZ2h0O1xuICBwYWRkaW5nLXJpZ2h0OiAyZW07XG59XG4jcGRhRm9vdGVyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBsZWZ0OiAwO1xuICBib3R0b206IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBiYWNrZ3JvdW5kOiAjMjcyNzI3O1xufVxuLnBkYUZvb3RlckJ1dHRvbiB7XG4gIHdpZHRoOiAzMyU7XG4gIHBhZGRpbmc6IDAuNWVtIDA7XG4gIGZvbnQtc2l6ZTogMjAwJTtcbiAgYm9yZGVyOiBub25lO1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBjb2xvcjogI2ZmZjtcbn1cbi5wZGFGb290ZXJCdXR0b24uaG92ZXIge1xuICBiYWNrZ3JvdW5kOiAjNTA3YWFjO1xufVxuLnBkYUZvb3RlckJ1dHRvbi5kaXNhYmxlZCB7XG4gIGJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDtcbiAgY29sb3I6ICM1NTUgIWltcG9ydGFudDtcbn1cbi5wZGFGb290ZXJCdXR0b24gLnVpTGlua1BlbmRpbmdJY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMzMlO1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG59XG4vKiBETkEgTW9kaWZpZXIgc3R5bGluZyAqL1xuLmRuYUJsb2NrIHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIHdpZHRoOiA5MHB4O1xuICBwYWRkaW5nOiAwIDAgNXB4IDA7XG59XG4uZG5hQmxvY2tOdW1iZXIge1xuICBmb250LWZhbWlseTogRml4ZWQsIG1vbm9zcGFjZTtcbiAgZmxvYXQ6IGxlZnQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xuICBiYWNrZ3JvdW5kOiAjMzYzNjM2O1xuICBtaW4td2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgcGFkZGluZzogMDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLmRuYVN1YkJsb2NrIHtcbiAgZm9udC1mYW1pbHk6IEZpeGVkLCBtb25vc3BhY2U7XG4gIGZsb2F0OiBsZWZ0O1xuICBwYWRkaW5nOiAwO1xuICBtaW4td2lkdGg6IDE2cHg7XG4gIGhlaWdodDogMjBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLm1hc2sge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIGxlZnQ6IDA7XG4gIHRvcDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZDogdXJsKHVpTWFza0JhY2tncm91bmQucG5nKTtcbn1cbi5tYXNrQ29udGVudCB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDIwMHB4O1xuICBtYXJnaW46IDIwMHB4IDA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi8qKioqKioqKioqKioqKioqKioqKlxcXG5cXCoqKioqKioqKioqKioqKioqKioqL1xuYm9keSB7XG4gIGNvbG9yOiAjZmZmZmZmO1xuICBmb250LWZhbWlseTogVmVyZGFuYSwgR2VuZXZhLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDEycHg7XG4gIGxpbmUtaGVpZ2h0OiAxNzAlO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG59XG5ociB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM0MDYyOGE7XG4gIGhlaWdodDogMXB4O1xuICBib3JkZXI6IG5vbmU7XG59XG5pbWcsXG5hIGltZyB7XG4gIGJvcmRlci1zdHlsZTogbm9uZTtcbn1cbmgxLFxuaDIsXG5oMyxcbmg0LFxuaDUsXG5oNiB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMTJweCAwIDZweCAwO1xuICBjb2xvcjogI0ZGRkZGRjtcbiAgY2xlYXI6IGJvdGg7XG59XG5oMSB7XG4gIGZvbnQtc2l6ZTogMThweDtcbn1cbmgyIHtcbiAgZm9udC1zaXplOiAxNnB4O1xufVxuaDMge1xuICBmb250LXNpemU6IDE0cHg7XG59XG5oNCB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbn1cbipbZGF0YS10b29sdGlwXSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbipbZGF0YS10b29sdGlwXTo6YWZ0ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB6LWluZGV4OiAyO1xuICB3aWR0aDogMjUwcHg7XG4gIHBhZGRpbmc6IDEwcHg7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3BhY2l0eTogMDtcbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgY29udGVudDogYXR0cihkYXRhLXRvb2x0aXApO1xuICB0cmFuc2l0aW9uOiBhbGwgMC41cztcbiAgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzM2MzYzNjtcbn1cbipbZGF0YS10b29sdGlwXTpob3Zlcjo6YWZ0ZXIge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICBvcGFjaXR5OiAxO1xufVxuKltkYXRhLXRvb2x0aXBdLnRvb2x0aXBUb3A6OmFmdGVyIHtcbiAgYm90dG9tOiAxMDAlO1xuICBsZWZ0OiA1MCU7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSg4cHgpO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoOHB4KTtcbn1cbipbZGF0YS10b29sdGlwXS50b29sdGlwVG9wOmhvdmVyOjphZnRlciB7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtOHB4KTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC04cHgpO1xufVxuKltkYXRhLXRvb2x0aXBdLnRvb2x0aXBCb3R0b206OmFmdGVyIHtcbiAgdG9wOiAxMDAlO1xuICBsZWZ0OiA1MCU7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtOHB4KTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC04cHgpO1xufVxuKltkYXRhLXRvb2x0aXBdLnRvb2x0aXBCb3R0b206aG92ZXI6OmFmdGVyIHtcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKDhweCk7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSg4cHgpO1xufVxuKltkYXRhLXRvb2x0aXBdLnRvb2x0aXBMZWZ0OjphZnRlciB7XG4gIHRvcDogNTAlO1xuICByaWdodDogMTAwJTtcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlWCg4cHgpIHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoOHB4KSB0cmFuc2xhdGVZKC01MCUpO1xufVxuKltkYXRhLXRvb2x0aXBdLnRvb2x0aXBMZWZ0OmhvdmVyOjphZnRlciB7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLThweCkgdHJhbnNsYXRlWSgtNTAlKTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtOHB4KSB0cmFuc2xhdGVZKC01MCUpO1xufVxuKltkYXRhLXRvb2x0aXBdLnRvb2x0aXBSaWdodDo6YWZ0ZXIge1xuICB0b3A6IDUwJTtcbiAgbGVmdDogMTAwJTtcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtOHB4KSB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC04cHgpIHRyYW5zbGF0ZVkoLTUwJSk7XG59XG4qW2RhdGEtdG9vbHRpcF0udG9vbHRpcFJpZ2h0OmhvdmVyOjphZnRlciB7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoOHB4KSB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDhweCkgdHJhbnNsYXRlWSgtNTAlKTtcbn1cbi5tYWluQkcge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IC0xO1xuICB0b3A6IDMwcHg7XG4gIGxlZnQ6IDBweDtcbiAgcmlnaHQ6IDBweDtcbiAgYm90dG9tOiAwcHg7XG4gIGJhY2tncm91bmQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0MlM0Z4bWwlMjB2ZXJzaW9uJTNEJTIyMS4wJTIyJTIwZW5jb2RpbmclM0QlMjJVVEYtOCUyMiUyMHN0YW5kYWxvbmUlM0QlMjJubyUyMiUzRiUzRSUwRCUwQSUzQ3N2ZyUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyJTIwdmVyc2lvbiUzRCUyMjEuMCUyMiUyMHZpZXdCb3glM0QlMjIwJTIwMCUyMDQyNSUyMDIwMCUyMiUyMG9wYWNpdHklM0QlMjIuMjUlMjIlM0UlMEQlMEElMjAlMjAlM0NwYXRoJTIwZCUzRCUyMm0lMjAxNzguMDAzOTklMkMwLjAzODY5JTIwLTcxLjIwMzkzJTJDMCUyMGElMjA2Ljc2MTM0MjIlMkM2LjAyNTU0OTUlMjAwJTIwMCUyMDAlMjAtNi43NjEzNCUyQzYuMDI1NTUlMjBsJTIwMCUyQzE4Ny44NzE0NyUyMGElMjA2Ljc2MTM0MjIlMkM2LjAyNTU0OTUlMjAwJTIwMCUyMDAlMjA2Ljc2MTM0JTJDNi4wMjU1NCUyMGwlMjA1My4xMDcyJTJDMCUyMGElMjA2Ljc2MTM0MjIlMkM2LjAyNTU0OTUlMjAwJTIwMCUyMDAlMjA2Ljc2MTM1JTJDLTYuMDI1NTQlMjBsJTIwMCUyQy0xMDEuNTQ0MDE4JTIwNzIuMjE2MjglMkMxMDQuNjk5Mzk4JTIwYSUyMDYuNzYxMzQyMiUyQzYuMDI1NTQ5NSUyMDAlMjAwJTIwMCUyMDUuNzYwMTUlMkMyLjg3MDE2JTIwbCUyMDczLjU1NDg3JTJDMCUyMGElMjA2Ljc2MTM0MjIlMkM2LjAyNTU0OTUlMjAwJTIwMCUyMDAlMjA2Ljc2MTM1JTJDLTYuMDI1NTQlMjBsJTIwMCUyQy0xODcuODcxNDclMjBhJTIwNi43NjEzNDIyJTJDNi4wMjU1NDk1JTIwMCUyMDAlMjAwJTIwLTYuNzYxMzUlMkMtNi4wMjU1NSUyMGwlMjAtNTQuNzE2NDQlMkMwJTIwYSUyMDYuNzYxMzQyMiUyQzYuMDI1NTQ5NSUyMDAlMjAwJTIwMCUyMC02Ljc2MTMzJTJDNi4wMjU1NSUyMGwlMjAwJTJDMTAyLjYxOTM1JTIwTCUyMDE4My43NjQxMyUyQzIuOTA4ODYlMjBhJTIwNi43NjEzNDIyJTJDNi4wMjU1NDk1JTIwMCUyMDAlMjAwJTIwLTUuNzYwMTQlMkMtMi44NzAxNyUyMHolMjIlMjAlMkYlM0UlMEQlMEElMjAlMjAlM0NwYXRoJTIwZCUzRCUyMk0lMjA0Ljg0NDYzMzMlMkMyMi4xMDg3NSUyMEElMjAxMy40MTIwMzklMkMxMi41MDE4NDIlMjAwJTIwMCUyMDElMjAxMy40Nzc1ODglMkMwLjAzOTI0JTIwbCUyMDY2LjExODMxNSUyQzAlMjBhJTIwNS4zNjQ4MTU4JTJDNS4wMDA3MzclMjAwJTIwMCUyMDElMjA1LjM2NDgyMyUyQzUuMDAwNzMlMjBsJTIwMCUyQzc5Ljg3OTMxJTIweiUyMiUyMCUyRiUzRSUwRCUwQSUyMCUyMCUzQ3BhdGglMjBkJTNEJTIybSUyMDQyMC4xNTUzNSUyQzE3Ny44OTExOSUyMGElMjAxMy40MTIwMzglMkMxMi41MDE4NDIlMjAwJTIwMCUyMDElMjAtOC42MzI5NSUyQzIyLjA2OTUxJTIwbCUyMC02Ni4xMTgzMiUyQzAlMjBhJTIwNS4zNjQ4MTUyJTJDNS4wMDA3MzclMjAwJTIwMCUyMDElMjAtNS4zNjQ4MiUyQy01LjAwMDc0JTIwbCUyMDAlMkMtNzkuODc5MzElMjB6JTIyJTIwJTJGJTNFJTBEJTBBJTNDJTJGc3ZnJTNFJTBEJTBBXCIpIG5vLXJlcGVhdCBmaXhlZCBjZW50ZXIgLyA3MCUgNzAlLCBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjMmEyYTJhIDAlLCAjMjAyMDIwIDEwMCUpIG5vLXJlcGVhdCBmaXhlZCBjZW50ZXIgLyAxMDAlIDEwMCU7XG59XG5odG1sLFxuYm9keSB7XG4gIHNjcm9sbGJhci1mYWNlLWNvbG9yOiAjNjY2NjY2O1xuICBzY3JvbGxiYXItYXJyb3ctY29sb3I6ICNFOUMxODM7XG4gIHNjcm9sbGJhci10cmFjay1jb2xvcjogIzM2MzYzNjtcbiAgc2Nyb2xsYmFyLXNoYWRvdy1jb2xvcjogIzU1NTU1NTtcbn1cbiN1aVdyYXBwZXIge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIHVzZXItc2VsZWN0OiBub25lO1xufVxuI3VpVGl0bGVXcmFwcGVyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBtaW4taGVpZ2h0OiAzMHB4O1xuICBtaW4td2lkdGg6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzNjM2MzY7XG4gIGxlZnQ6IDBweDtcbiAgdG9wOiAwcHg7XG4gIHJpZ2h0OiAwcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHotaW5kZXg6IDEwMDtcbn1cbiN1aVRpdGxlV3JhcHBlciA+IGRpdiB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cbiN1aVRpdGxlV3JhcHBlciA+IGkge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG59XG4jdWlUaXRsZVRleHQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNnB4O1xuICBsZWZ0OiA0NHB4O1xuICB3aWR0aDogNjYlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBjb2xvcjogI0U5QzE4MztcbiAgZm9udC1zaXplOiAxNnB4O1xufVxuI3VpVGl0bGUuaWNvbiB7XG4gIHBhZGRpbmc6IDZweCA4cHggNnB4IDQycHg7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IDJweCA1MCU7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG59XG4jdWlUaXRsZUZsdWZmIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDRweDtcbiAgcmlnaHQ6IDEycHg7XG4gIHdpZHRoOiA0MnB4O1xuICBoZWlnaHQ6IDI0cHg7XG4gIGJhY2tncm91bmQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0MlM0Z4bWwlMjB2ZXJzaW9uJTNEJTIyMS4wJTIyJTIwZW5jb2RpbmclM0QlMjJVVEYtOCUyMiUyMHN0YW5kYWxvbmUlM0QlMjJubyUyMiUzRiUzRSUwRCUwQSUzQ3N2ZyUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyJTIwdmVyc2lvbiUzRCUyMjEuMCUyMiUyMHZpZXdCb3glM0QlMjIwJTIwMCUyMDQyNSUyMDIwMCUyMiUyMG9wYWNpdHklM0QlMjIuMjUlMjIlM0UlMEQlMEElMjAlMjAlM0NwYXRoJTIwZCUzRCUyMm0lMjAxNzguMDAzOTklMkMwLjAzODY5JTIwLTcxLjIwMzkzJTJDMCUyMGElMjA2Ljc2MTM0MjIlMkM2LjAyNTU0OTUlMjAwJTIwMCUyMDAlMjAtNi43NjEzNCUyQzYuMDI1NTUlMjBsJTIwMCUyQzE4Ny44NzE0NyUyMGElMjA2Ljc2MTM0MjIlMkM2LjAyNTU0OTUlMjAwJTIwMCUyMDAlMjA2Ljc2MTM0JTJDNi4wMjU1NCUyMGwlMjA1My4xMDcyJTJDMCUyMGElMjA2Ljc2MTM0MjIlMkM2LjAyNTU0OTUlMjAwJTIwMCUyMDAlMjA2Ljc2MTM1JTJDLTYuMDI1NTQlMjBsJTIwMCUyQy0xMDEuNTQ0MDE4JTIwNzIuMjE2MjglMkMxMDQuNjk5Mzk4JTIwYSUyMDYuNzYxMzQyMiUyQzYuMDI1NTQ5NSUyMDAlMjAwJTIwMCUyMDUuNzYwMTUlMkMyLjg3MDE2JTIwbCUyMDczLjU1NDg3JTJDMCUyMGElMjA2Ljc2MTM0MjIlMkM2LjAyNTU0OTUlMjAwJTIwMCUyMDAlMjA2Ljc2MTM1JTJDLTYuMDI1NTQlMjBsJTIwMCUyQy0xODcuODcxNDclMjBhJTIwNi43NjEzNDIyJTJDNi4wMjU1NDk1JTIwMCUyMDAlMjAwJTIwLTYuNzYxMzUlMkMtNi4wMjU1NSUyMGwlMjAtNTQuNzE2NDQlMkMwJTIwYSUyMDYuNzYxMzQyMiUyQzYuMDI1NTQ5NSUyMDAlMjAwJTIwMCUyMC02Ljc2MTMzJTJDNi4wMjU1NSUyMGwlMjAwJTJDMTAyLjYxOTM1JTIwTCUyMDE4My43NjQxMyUyQzIuOTA4ODYlMjBhJTIwNi43NjEzNDIyJTJDNi4wMjU1NDk1JTIwMCUyMDAlMjAwJTIwLTUuNzYwMTQlMkMtMi44NzAxNyUyMHolMjIlMjAlMkYlM0UlMEQlMEElMjAlMjAlM0NwYXRoJTIwZCUzRCUyMk0lMjA0Ljg0NDYzMzMlMkMyMi4xMDg3NSUyMEElMjAxMy40MTIwMzklMkMxMi41MDE4NDIlMjAwJTIwMCUyMDElMjAxMy40Nzc1ODglMkMwLjAzOTI0JTIwbCUyMDY2LjExODMxNSUyQzAlMjBhJTIwNS4zNjQ4MTU4JTJDNS4wMDA3MzclMjAwJTIwMCUyMDElMjA1LjM2NDgyMyUyQzUuMDAwNzMlMjBsJTIwMCUyQzc5Ljg3OTMxJTIweiUyMiUyMCUyRiUzRSUwRCUwQSUyMCUyMCUzQ3BhdGglMjBkJTNEJTIybSUyMDQyMC4xNTUzNSUyQzE3Ny44OTExOSUyMGElMjAxMy40MTIwMzglMkMxMi41MDE4NDIlMjAwJTIwMCUyMDElMjAtOC42MzI5NSUyQzIyLjA2OTUxJTIwbCUyMC02Ni4xMTgzMiUyQzAlMjBhJTIwNS4zNjQ4MTUyJTJDNS4wMDA3MzclMjAwJTIwMCUyMDElMjAtNS4zNjQ4MiUyQy01LjAwMDc0JTIwbCUyMDAlMkMtNzkuODc5MzElMjB6JTIyJTIwJTJGJTNFJTBEJTBBJTNDJTJGc3ZnJTNFJTBEJTBBXCIpIDUwJSA1MCUgbm8tcmVwZWF0O1xufVxuLnN0YXR1c2ljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNHB4O1xuICBsZWZ0OiAxMnB4O1xufVxuI3VpTWFwV3JhcHBlciB7XG4gIGNsZWFyOiBib3RoO1xuICBwYWRkaW5nOiA4cHg7XG4gIG1hcmdpbi10b3A6IDMwcHg7XG59XG4jdWlNYXBIZWFkZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGNsZWFyOiBib3RoO1xufVxuI3VpTWFwQ29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiA2MDBweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYm9yZGVyOiAxcHggc29saWQgIzQwNjI4YTtcbiAgYmFja2dyb3VuZDogdXJsKG5hbm9tYXBCYWNrZ3JvdW5kLnBuZyk7XG59XG4jdWlNYXAge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIG1hcmdpbjogLTUxMnB4IDAgMCAtNTEycHg7XG4gIHdpZHRoOiAyNTZweDtcbiAgaGVpZ2h0OiAyNTZweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgem9vbTogNDtcbn1cbiN1aU1hcEltYWdlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDFweDtcbiAgbGVmdDogMXB4O1xuICB3aWR0aDogMjU2cHg7XG4gIGhlaWdodDogMjU2cHg7XG59XG4jdWlNYXBDb250ZW50IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IC0xMy41cHg7XG4gIGxlZnQ6IDBweDtcbiAgd2lkdGg6IDI1NnB4O1xuICBoZWlnaHQ6IDI1NnB4O1xufVxuI3VpTWFwRm9vdGVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBjbGVhcjogYm90aDtcbn1cbiN1aUNvbnRlbnQge1xuICBjbGVhcjogYm90aDtcbiAgcGFkZGluZzogOHB4O1xuICBtYXJnaW4tdG9wOiAzMHB4O1xufVxuI3VpTWFwVG9vbHRpcCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IDEwcHg7XG4gIHRvcDogMTBweDtcbiAgYm9yZGVyOiAxcHggc29saWQgIzQwNjI4YTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzI3MjcyNztcbiAgcGFkZGluZzogOHB4O1xuICBkaXNwbGF5OiBub25lO1xuICB6LWluZGV4OiA5OTk5O1xufVxuI3VpTG9hZGluZ05vdGljZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYmFja2dyb3VuZDogdXJsKHVpTm90aWNlQmFja2dyb3VuZC5qcGcpIDUwJSA1MCU7XG4gIGNvbG9yOiAjMDAwMDAwO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIHBhZGRpbmc6IDNweCA0cHggM3B4IDRweDtcbiAgbWFyZ2luOiA0cHggMCA0cHggMDtcbn1cbi51bmRlclRpdGxlIHtcbiAgbWFyZ2luLXRvcDogMzBweDtcbn1cbiIsbnVsbCxudWxsLG51bGwsIi5kaXNwbGF5QmFyIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHdpZHRoOiAyMzZweDtcclxuICAgIGhlaWdodDogMTZweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIG1hcmdpbjogMCA1cHggMCAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIGJhY2tncm91bmQ6ICMwMDAwMDA7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyVGV4dCB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IC0ycHg7XHJcbiAgICBsZWZ0OiA1cHg7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcclxufVxyXG5cclxuLmRpc3BsYXlCYXJGaWxsIHtcclxuICAgIHdpZHRoOiAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIGJhY2tncm91bmQ6ICM0MDYyOGE7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyRmlsbC5hbGlnblJpZ2h0IHtcclxuICAgIGZsb2F0OiByaWdodDtcclxufVxyXG5cclxuLmRpc3BsYXlCYXJUZXh0Lmdvb2Qge1xyXG5cdGNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLmRpc3BsYXlCYXJUZXh0Lm5vdGdvb2Qge1xyXG5cdGNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLmRpc3BsYXlCYXJUZXh0LmF2ZXJhZ2Uge1xyXG5cdGNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLmRpc3BsYXlCYXJUZXh0LmJhZCB7XHJcblx0Y29sb3I6IHdoaXRlO1xyXG59XHJcblxyXG4uZGlzcGxheUJhclRleHQuaGlnaGxpZ2h0IHtcclxuXHRjb2xvcjogYmxhY2s7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyRmlsbC5nb29kIHtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgYmFja2dyb3VuZDogQGdvb2QtY29sb3I7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyRmlsbC5ub3Rnb29kIHtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgYmFja2dyb3VuZDogI2ZmYjQwMDtcclxufVxyXG5cclxuLmRpc3BsYXlCYXJGaWxsLmF2ZXJhZ2Uge1xyXG4gICAgY29sb3I6ICNmZmZmZmY7XHJcbiAgICBiYWNrZ3JvdW5kOiBAYXZlcmFnZS1jb2xvcjtcclxufVxyXG5cclxuLmRpc3BsYXlCYXJGaWxsLmJhZCB7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGJhY2tncm91bmQ6IEBiYWQtY29sb3I7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyRmlsbC5oaWdobGlnaHQge1xyXG4gICAgY29sb3I6ICNmZmZmZmY7XHJcbiAgICBiYWNrZ3JvdW5kOiBAaGlnaGxpZ2h0LWNvbG9yO1xyXG59XHJcbiIsIi5saW5rLCAubGlua09uLCAubGlua09mZiwgLnNlbGVjdGVkLCAuZGlzYWJsZWQsIC55ZWxsb3dCdXR0b24sIC5yZWRCdXR0b24sIC5saW5rRW5jb3VyYWdlLCAubGlua0Rpc2NvdXJhZ2Uge1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbiAgICBtaW4td2lkdGg6IDE1cHg7XHJcbiAgICBoZWlnaHQ6IDE2cHg7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgIGJhY2tncm91bmQ6ICM0MDYyOGE7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjMTYxNjE2O1xyXG4gICAgcGFkZGluZzogMHB4IDRweCA0cHggNHB4O1xyXG4gICAgbWFyZ2luOiAwIDJweCAycHggMDtcclxuICAgIGN1cnNvcjogZGVmYXVsdDtcclxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbn1cclxuXHJcbi5oYXNJY29uIHtcclxuICAgIHBhZGRpbmc6IDBweCA0cHggNHB4IDBweDtcclxufVxyXG5cclxuYS5ob3ZlciwgLnpvb21MaW5rLmhvdmVyLCAubGlua0FjdGl2ZS5ob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kOiAjNTA3YWFjO1xyXG59XHJcblxyXG5Aa2V5ZnJhbWVzIHBlbmRpbmdBbmltYXRpb24ge1xyXG4gICAgdG8ge1xyXG4gICAgICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgICAgIGJhY2tncm91bmQ6ICM1MDdhYWM7XHJcbiAgICB9XHJcbn1cclxuXHJcbi5saW5rUGVuZGluZywgLmxpbmtQZW5kaW5nLmhvdmVyIHtcclxuICAgIGFuaW1hdGlvbi1uYW1lOiBwZW5kaW5nQW5pbWF0aW9uO1xyXG4gICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjI1cztcclxufVxyXG5cclxuYS53aGl0ZSwgYS53aGl0ZTpsaW5rLCBhLndoaXRlOnZpc2l0ZWQsIGEud2hpdGU6YWN0aXZlIHtcclxuICAgIGNvbG9yOiAjNDA2MjhhO1xyXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICMxNjE2MTY7XHJcbiAgICBwYWRkaW5nOiAxcHggNHB4IDFweCA0cHg7XHJcbiAgICBtYXJnaW46IDAgMnB4IDAgMDtcclxuICAgIGN1cnNvcjogZGVmYXVsdDtcclxufVxyXG5cclxuYS53aGl0ZS5ob3ZlciB7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGJhY2tncm91bmQ6ICM0MDYyOGE7XHJcbn1cclxuXHJcbi5saW5rT24sIGEubGlua09uOmxpbmssIGEubGlua09uOnZpc2l0ZWQsIGEubGlua09uOmFjdGl2ZSwgYS5saW5rT24uaG92ZXIsIC5zZWxlY3RlZCwgYS5zZWxlY3RlZDpsaW5rLCBhLnNlbGVjdGVkOnZpc2l0ZWQsIGEuc2VsZWN0ZWQ6YWN0aXZlLCBhLnNlbGVjdGVkLmhvdmVyIHtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgYmFja2dyb3VuZDogIzJmOTQzYztcclxufVxyXG5cclxuLmxpbmtPZmYsIGEubGlua09mZjpsaW5rLCBhLmxpbmtPZmY6dmlzaXRlZCwgYS5saW5rT2ZmOmFjdGl2ZSwgYS5saW5rT2ZmLmhvdmVyLCAuZGlzYWJsZWQsIGEuZGlzYWJsZWQ6bGluaywgYS5kaXNhYmxlZDp2aXNpdGVkLCBhLmRpc2FibGVkOmFjdGl2ZSwgYS5kaXNhYmxlZC5ob3ZlciB7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGJhY2tncm91bmQ6ICM5OTk5OTk7XHJcbiAgICBib3JkZXItY29sb3I6ICM2NjY2NjY7XHJcbn1cclxuXHJcbmEuaWNvbiwgLmxpbmtPbi5pY29uLCAubGlua09mZi5pY29uLCAuc2VsZWN0ZWQuaWNvbiwgLmRpc2FibGVkLmljb24ge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgcGFkZGluZzogMXB4IDRweCAycHggMjBweDtcclxufVxyXG5cclxuYS5pY29uIGltZywgLmxpbmtPbi5pY29uIGltZywgLmxpbmtPZmYuaWNvbiBpbWcsIC5zZWxlY3RlZC5pY29uIGltZywgLmRpc2FibGVkLmljb24gaW1nIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMThweDtcclxuICAgIGhlaWdodDogMThweDtcclxufVxyXG5cclxuLmxpbmtEYW5nZXIsIGEubGlua0RhbmdlcjpsaW5rLCBhLmxpbmtEYW5nZXI6dmlzaXRlZCwgYS5saW5rRGFuZ2VyOmFjdGl2ZSB7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZjAwMDA7XHJcbiAgICBib3JkZXItY29sb3I6ICNhYTAwMDA7XHJcbn1cclxuXHJcbi5saW5rRGFuZ2VyLmhvdmVyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZjY2NjY7XHJcbn1cclxuXHJcbi5saW5rRW5jb3VyYWdlLCBhLmxpbmtFbmNvdXJhZ2U6bGluaywgYS5saW5rRW5jb3VyYWdlOnZpc2l0ZWQsIGEubGlua0VuY291cmFnZTphY3RpdmUge1xyXG4gICAgY29sb3I6ICM5OWZmMzM7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDA2MjhhO1xyXG4gICAgYm9yZGVyLWNvbG9yOiAjMTYxNjE2O1xyXG59XHJcblxyXG4ubGlua0VuY291cmFnZS5ob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTA3YWFjO1xyXG59XHJcblxyXG4ubGlua0Rpc2NvdXJhZ2UsIGEubGlua0Rpc2NvdXJhZ2U6bGluaywgYS5saW5rRGlzY291cmFnZTp2aXNpdGVkLCBhLmxpbmtEaXNjb3VyYWdlOmFjdGl2ZSB7XHJcbiAgICBjb2xvcjogIzhjOGM4YztcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM0MDYyOGE7XHJcbiAgICBib3JkZXItY29sb3I6ICMxNjE2MTY7XHJcbn1cclxuXHJcbi5saW5rRGlzY291cmFnZS5ob3ZlciB7XHJcblx0Y29sb3I6ICNmZjAwMDA7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTA3YWFjO1xyXG59XHJcblxyXG4uaW5hY3RpdmUsIGEuaW5hY3RpdmU6bGluaywgYS5pbmFjdGl2ZTp2aXNpdGVkLCBhLmluYWN0aXZlOmFjdGl2ZSwgYS5pbmFjdGl2ZS5ob3ZlciB7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGJhY2tncm91bmQ6ICM5OTk5OTk7XHJcbiAgICBib3JkZXItY29sb3I6ICM2NjY2NjY7XHJcbn0iLCJAaW1wb3J0IFwiX2NvbmZpZ1wiO1xyXG5cclxuLndoaXRlIHtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG4uZ29vZCB7XHJcbiAgICBjb2xvcjogQGdvb2QtY29sb3I7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuLmF2ZXJhZ2Uge1xyXG4gICAgY29sb3I6IEBhdmVyYWdlLWNvbG9yO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbi5iYWQge1xyXG4gICAgY29sb3I6IEBiYWQtY29sb3I7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuLmlkbGUge1xyXG4gICAgY29sb3I6IEBkYXJrLWNvbG9yO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbi5yZWRCdXR0b24ge1xyXG4gICAgYmFja2dyb3VuZDogI2VhMDAwMDtcclxufVxyXG5cclxuLnllbGxvd0J1dHRvbiB7XHJcbiAgICBiYWNrZ3JvdW5kOiAjY2FjYzAwO1xyXG59XHJcblxyXG4uaGlnaGxpZ2h0IHtcclxuICAgIGNvbG9yOiBAaGlnaGxpZ2h0LWNvbG9yO1xyXG59XHJcblxyXG4uZGFyayB7XHJcbiAgICBjb2xvcjogQGRhcmstY29sb3I7XHJcbn1cclxuXHJcbi8qIERhbWFnZSBjb2xvcnMgZm9yIGNyZXcgbW9uaXRvcmluZyBjb21wdXRlciAqL1xyXG4uYnVybiB7XHJcbiAgICBjb2xvcjogb3JhbmdlO1xyXG59XHJcblxyXG4uYnJ1dGUge1xyXG4gICAgY29sb3I6IHJlZDtcclxufVxyXG5cclxuLnRveGluIHtcclxuICAgIGNvbG9yOiBncmVlbjtcclxufVxyXG5cclxuLnRveGluX2xpZ2h0IHtcclxuICAgIGNvbG9yOiAjM0FERjAwO1xyXG59XHJcblxyXG4ub3h5bG9zcyB7XHJcbiAgICBjb2xvcjogYmx1ZTtcclxufVxyXG5cclxuLm94eWxvc3NfbGlnaHQge1xyXG4gICAgY29sb3I6ICM2Njk4RkY7XHJcbn1cclxuXHJcbi8qIFdpcmUgY29sb3JzIGZvciBudWNsZWFyIGJvbWIgZGVmdXNpb24gKi9cclxuLlJlZCB7XHJcbiAgICBjb2xvcjogI0ZGMDAwMDtcclxufVxyXG5cclxuLkJsdWUge1xyXG4gICAgY29sb3I6ICMwMDAwRkY7XHJcbn1cclxuXHJcbi5HcmVlbiB7XHJcbiAgICBjb2xvcjogIzAwRkYwMDtcclxufVxyXG5cclxuLk1hcmlnb2xkIHtcclxuICAgIGNvbG9yOiAjRkRBNTA1O1xyXG59XHJcblxyXG4uRnVzY2hpYSB7XHJcbiAgICBjb2xvcjogI0ZGMDA4MDtcclxufVxyXG5cclxuLkJsYWNrIHtcclxuICAgIGNvbG9yOiAjMDAwMDAwO1xyXG59XHJcblxyXG4uUGVhcmwge1xyXG4gICAgY29sb3I6ICNDNkNBQ0I7XHJcbn1cclxuXHJcbi8qIFN0YXR1cyBiYXIgY29sb3JzIGZvciBzbGVlcGVyIHRlbXBlcmF0dXJlcyAqL1xyXG4uY29sZDEge1xyXG4gICAgY29sb3I6ICM5NEI4RkY7XHJcbn1cclxuXHJcbi5jb2xkMiB7XHJcbiAgICBjb2xvcjogIzY2OTlGRjtcclxufVxyXG5cclxuLmNvbGQzIHtcclxuICAgIGNvbG9yOiAjMjkzRDY2O1xyXG59XHJcblxyXG4uaG90MSB7XHJcbiAgICBjb2xvcjogI0ZGOTk2NjtcclxufVxyXG5cclxuLmhvdDIge1xyXG4gICAgY29sb3I6ICM5OTNEMDA7XHJcbn1cclxuXHJcbi5ob3QzIHtcclxuICAgIGNvbG9yOiAjRkY2NjAwO1xyXG59IiwiZGl2LmRpc3BsYXkge1xyXG5cdHBhZGRpbmc6IDRweDtcclxuXHRtYXJnaW46IDZweCAwO1xyXG5cclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzMpO1xyXG5cdGJveC1zaGFkb3c6IGluc2V0IDAgMCA1cHggcmdiYSgwLCAwLCAwLCAwLjUpO1xyXG59XHJcblxyXG5kaXYuZGlzcGxheSBoZWFkZXIge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcblx0d2lkdGg6IDk4LjUlO1xyXG4gICAgcGFkZGluZzogMCA0cHg7XHJcbiAgICBtYXJnaW4tYm90dG9tOiA2cHg7XHJcbiAgICBjb2xvcjogI0ZGRkZGRjtcclxuICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjNDA2MjhhO1xyXG59XHJcblxyXG5kaXYuZGlzcGxheSBoZWFkZXIgLmJ1dHRvblJpZ2h0IHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIGJvdHRvbTogNnB4O1xyXG4gICAgcmlnaHQ6IDRweDtcclxufVxyXG5cclxuZGl2LmRpc3BsYXkgYXJ0aWNsZSB7XHJcbiAgICBkaXNwbGF5OiB0YWJsZTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcclxufSIsIi5pdGVtR3JvdXAge1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2U5YzE4MztcclxuICAgIGJhY2tncm91bmQ6ICMyYzJjMmM7XHJcbiAgICBwYWRkaW5nOiA0cHg7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG5cclxuXHJcbi5pdGVtIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgbWFyZ2luOiA0cHggMCAwIDA7XHJcbiAgICBjbGVhcjogYm90aDtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG59XHJcblxyXG4uaXRlbUNvbnRlbnROYXJyb3csIC5pdGVtQ29udGVudCB7XHJcbiAgICBmbG9hdDogbGVmdDtcclxufVxyXG5cclxuLml0ZW1Db250ZW50TmFycm93IHtcclxuICAgIHdpZHRoOiAzMCU7XHJcbn1cclxuXHJcbi5pdGVtQ29udGVudCB7XHJcbiAgICB3aWR0aDogNjklO1xyXG59XHJcblxyXG4uaXRlbUxhYmVsTmFycm93LCAuaXRlbUxhYmVsLCAuaXRlbUxhYmVsV2lkZSwgLml0ZW1MYWJlbFdpZGVyLCAuaXRlbUxhYmVsV2lkZXN0IHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgY29sb3I6ICNlOWMxODM7XHJcbn1cclxuXHJcbi5pdGVtTGFiZWxOYXJyb3cge1xyXG4gICAgd2lkdGg6IDIwJTtcclxufVxyXG5cclxuLml0ZW1MYWJlbCB7XHJcbiAgICB3aWR0aDogMzAlO1xyXG59XHJcblxyXG4uaXRlbUxhYmVsV2lkZSB7XHJcbiAgICB3aWR0aDogNDUlO1xyXG59XHJcblxyXG4uaXRlbUxhYmVsV2lkZXIge1xyXG4gICAgd2lkdGg6IDY5JTtcclxufVxyXG5cclxuLml0ZW1MYWJlbFdpZGVzdCB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuLml0ZW1Db250ZW50V2lkZSB7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIHdpZHRoOiA3OSU7XHJcbn1cclxuXHJcbi5pdGVtQ29udGVudFNtYWxsIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgd2lkdGg6IDMzJTtcclxufVxyXG5cclxuLml0ZW1Db250ZW50TWVkaXVtIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgd2lkdGg6IDU1JTtcclxufVxyXG5cclxuLmJsb2NrIHtcclxuICAgIHBhZGRpbmc6IDhweDtcclxuICAgIG1hcmdpbjogMTBweCA0cHggNHB4IDRweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM0MDYyOGE7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwO1xyXG59XHJcblxyXG4uYmxvY2sgaDMge1xyXG4gICAgcGFkZGluZzogMDtcclxufVxyXG5cclxuLmNsZWFyQm90aCB7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG5cclxuLmNsZWFyTGVmdCB7XHJcbiAgICBjbGVhcjogbGVmdDtcclxufVxyXG5cclxuLmNsZWFyUmlnaHQge1xyXG4gICAgY2xlYXI6IHJpZ2h0O1xyXG59XHJcblxyXG4ubGluZSB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGNsZWFyOiBib3RoO1xyXG59XHJcblxyXG4uZml4ZWRMZWZ0IHtcclxuICAgIHdpZHRoOiAxMTBweDtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uZml4ZWRMZWZ0V2lkZSB7XHJcbiAgICB3aWR0aDogMTY1cHg7XHJcbiAgICBmbG9hdDogbGVmdDtcclxufVxyXG5cclxuLmZpeGVkTGVmdFdpZGVyIHtcclxuICAgIHdpZHRoOiAyMjBweDtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uZml4ZWRMZWZ0V2lkZXN0IHtcclxuICAgIHdpZHRoOiAyNTBweDtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uZmxvYXRSaWdodCB7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbn1cclxuXHJcbi5mbG9hdExlZnQge1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbn1cclxuXHJcbi5oaWRkZW4ge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuXHJcbi5zdGF0dXNEaXNwbGF5IHtcclxuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzQwNjI4YTtcclxuICAgIHBhZGRpbmc6IDRweDtcclxuICAgIG1hcmdpbjogM3B4IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG59XHJcblxyXG4uc3RhdHVzRGlzcGxheVJlY29yZHMge1xyXG4gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjUpO1xyXG4gICAgY29sb3I6ICNmZmZmZmY7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjNDA2MjhhO1xyXG4gICAgcGFkZGluZzogNHB4O1xyXG4gICAgbWFyZ2luOiAzcHggMDtcclxuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcclxuICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbn1cclxuXHJcbi5zdGF0dXNMYWJlbCB7XHJcbiAgICB3aWR0aDogMTM4cHg7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICBjb2xvcjogIzk4QjBDMztcclxufVxyXG5cclxuLnN0YXR1c1ZhbHVlIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uam9iVmFsdWVzIHtcclxuXHRmbG9hdDogbGVmdDtcclxuXHR3aWR0aDogMzAlO1xyXG59XHJcblxyXG4vLyBDSFJPTUVMRVNTIFNUVUZGXHJcblxyXG4uZmFuY3kge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuaS5mYW5jeSB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG59XHJcblxyXG4udGl0bGVidXR0b24oKSB7XHJcbiAgICBjb2xvcjogI0U5QzE4MztcclxuICAgIC8vIFNpbmNlIHdlJ3JlIG9uIHNvbWUgaGlsYXJpb3VzbHkgb3V0ZGF0ZWQgbGlicmFyaWVzLCB0aGUgYmVsb3cgaXMgYW4gaXNzdWVcclxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Gb3J0QXdlc29tZS9Gb250LUF3ZXNvbWUvaXNzdWVzLzEyNzRcclxuICAgIC8vIFVzaW5nIHRoZSAhaW1wb3J0YW50IGRpcmVjdGl2ZSBpcyBuZWNlc3NhcnkgdG8gb3ZlcnJpZGUgdGhlIEZBIHN0eWxlc1xyXG4gICAgY3Vyc29yOiBwb2ludGVyICFpbXBvcnRhbnQ7IFxyXG4gICAgei1pbmRleDogMTAyOyAvLyBUaGlzIGlzIGZvciB0aGUgY29ybmVycyAtIG1ha2VzIHN1cmUgdGhlIGJ1dHRvbnMgcmVuZGVyIG9uIHRvcFxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICAgIGNvbG9yOiBsaWdodGVuKCM5OGIwYzMsIDEwJSk7XHJcbiAgICB9XHJcbn1cclxuLm1pbmltaXplIHtcclxuICAgIC50aXRsZWJ1dHRvbjtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogNnB4O1xyXG4gICAgcmlnaHQ6IDQ2cHg7XHJcbn1cclxuLmNsb3NlIHtcclxuICAgIC50aXRsZWJ1dHRvbjtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogNHB4O1xyXG4gICAgcmlnaHQ6IDEycHg7XHJcbn0iLCIuY29ybmVyKCkge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgei1pbmRleDogMTAxO1xyXG4gICAgbWluLXdpZHRoOiAzMHB4O1xyXG4gICAgbWluLWhlaWdodDogMzBweDtcclxufVxyXG5cclxuI3VpQ29ybmVyVEwge1xyXG4gICAgLmNvcm5lcjtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICBiYWNrZ3JvdW5kOiBkYXRhLXVyaSgndGwucG5nJykgbm8tcmVwZWF0O1xyXG59XHJcblxyXG4vKiBSZXNpemluZyAoU3RvbGVuIGZyb20gR29vbiBDQy1CWS1OQy1TQSkgKi9cclxuQHJlc2l6ZTogNXB4O1xyXG4ucmVzaXplQXJlYSB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiA5OTk5OTtcclxufVxyXG4ucmVzaXplQXJlYS50b3Age1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMTBweDtcclxuICAgIHJpZ2h0OiAxMHB4O1xyXG4gICAgaGVpZ2h0OiBAcmVzaXplO1xyXG4gICAgY3Vyc29yOiBuLXJlc2l6ZTtcclxufVxyXG4ucmVzaXplQXJlYS50ciB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICByaWdodDogMDtcclxuICAgIGhlaWdodDogMTBweDtcclxuICAgIHdpZHRoOiAxMHB4O1xyXG4gICAgY3Vyc29yOiBuZS1yZXNpemU7XHJcbn1cclxuLnJlc2l6ZUFyZWEucmlnaHQge1xyXG4gICAgdG9wOiAxMHB4O1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBib3R0b206IDEwcHg7XHJcbiAgICB3aWR0aDogQHJlc2l6ZTtcclxuICAgIGN1cnNvcjogZS1yZXNpemU7XHJcbn1cclxuLnJlc2l6ZUFyZWEuYnIge1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBoZWlnaHQ6IDEwcHg7XHJcbiAgICB3aWR0aDogMTBweDtcclxuICAgIGN1cnNvcjogc2UtcmVzaXplO1xyXG59XHJcbi5yZXNpemVBcmVhLmJvdHRvbSB7XHJcbiAgICBib3R0b206IDA7XHJcbiAgICBsZWZ0OiAxMHB4O1xyXG4gICAgcmlnaHQ6IDEwcHg7XHJcbiAgICBoZWlnaHQ6IEByZXNpemU7XHJcbiAgICBjdXJzb3I6IHMtcmVzaXplO1xyXG59XHJcbi5yZXNpemVBcmVhLmJsIHtcclxuICAgIGJvdHRvbTogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICBoZWlnaHQ6IDEwcHg7XHJcbiAgICB3aWR0aDogMTBweDtcclxuICAgIGN1cnNvcjogc3ctcmVzaXplO1xyXG59XHJcbi5yZXNpemVBcmVhLmxlZnQge1xyXG4gICAgdG9wOiAxMHB4O1xyXG4gICAgbGVmdDogMDtcclxuICAgIGJvdHRvbTogMTBweDtcclxuICAgIHdpZHRoOiBAcmVzaXplO1xyXG4gICAgY3Vyc29yOiB3LXJlc2l6ZTtcclxufVxyXG4ucmVzaXplQXJlYS50bCB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgaGVpZ2h0OiAxMHB4O1xyXG4gICAgd2lkdGg6IDEwcHg7XHJcbiAgICBjdXJzb3I6IG53LXJlc2l6ZTtcclxufVxyXG4vKiBFbmQgUmVzaXppbmcgKi8iLCIvKiBJY29uc1xyXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuXHJcbi8qIHN0YXRlcyBhbmQgaW1hZ2VzICovXHJcbi51aUxpbmtQZW5kaW5nSWNvbiB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbiAgICB3aWR0aDogMTZweDtcclxuICAgIGhlaWdodDogMTZweDtcclxuICAgIG1hcmdpbjogMnB4IDJweCAwIDJweDtcclxuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCh1aUxpbmtQZW5kaW5nSWNvbi5naWYpO1xyXG59XHJcblxyXG4ubGlua1BlbmRpbmcgLmZhIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbi5saW5rUGVuZGluZyAudWlMaW5rUGVuZGluZ0ljb24ge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbn1cclxuXHJcbi5tYXBJY29uMTYge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgd2lkdGg6IDE2cHg7XHJcbiAgICBoZWlnaHQ6IDE2cHg7XHJcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwodWlJY29uczE2R3JlZW4ucG5nKTtcclxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtOTZweDtcclxuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XHJcbiAgICB6b29tOiAwLjEyNTtcclxuICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xyXG4gICAgLyptYXJnaW4tYm90dG9tOiAtMXB4OyovXHJcbn1cclxuLm1hcEljb24xNi5kZWFkICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCh1aUljb25zMTZSZWQucG5nKTsgICAgfVxyXG4ubWFwSWNvbjE2LmJhZCAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKHVpSWNvbnMxNlJlZC5wbmcpOyAgICB9XHJcbi5tYXBJY29uMTYuYXZlcmFnZSAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwodWlJY29uczE2T3JhbmdlLnBuZyk7IH1cclxuLm1hcEljb24xNi5nb29kICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCh1aUljb25zMTZHcmVlbi5wbmcpOyAgfVxyXG4vKiBBaXJBbGFybSAqL1xyXG4ubWFwSWNvbjE2Lmljb24tYWlyYWxhcm0gICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTQ0cHg7ICAgICAgICAgICAgICB9IFxyXG4vKiBDb21tYW5kIFBvc2l0aW9ucyAqL1xyXG4ubWFwSWNvbjE2LnJhbmstY2FwdGFpbiAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC0xMTJweDsgICAgICAgICB9IFxyXG4ubWFwSWNvbjE2LnJhbmstaGVhZG9mcGVyc29ubmVsICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC05NnB4OyAgICAgICAgICB9XHJcbi5tYXBJY29uMTYucmFuay1oZWFkb2ZzZWN1cml0eSAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTEyOHB4OyAgICAgICAgIH1cclxuLm1hcEljb24xNi5yYW5rLWNoaWVmZW5naW5lZXIgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMTEycHg7ICAgICAgICAgfVxyXG4ubWFwSWNvbjE2LnJhbmstcmVzZWFyY2hkaXJlY3RvciAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xMjhweDsgICAgICAgICB9XHJcbi5tYXBJY29uMTYucmFuay1jaGllZm1lZGljYWxvZmZpY2VyICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7ICAgICAgICAgIH1cclxuLyogRW5naW5lZXJpbmcgUG9zaXRpb25zICovXHJcbi5tYXBJY29uMTYucmFuay1zdGF0aW9uZW5naW5lZXIgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTExMnB4OyAgICAgICAgIH0gXHJcbi5tYXBJY29uMTYucmFuay1hdG1vc3BoZXJpY3RlY2huaWNpYW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTExMnB4OyAgICAgICAgIH1cclxuLyogTWVkaWNhbCBQb3NpdGlvbnMgKi9cclxuLm1hcEljb24xNi5yYW5rLW1lZGljYWxkb2N0b3IgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTEyOHB4OyAgICAgICAgICAgfSBcclxuLm1hcEljb24xNi5yYW5rLWdlbmV0aWNpc3QgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTEyOHB4OyAgICAgICAgICAgfVxyXG4ubWFwSWNvbjE2LnJhbmstcHN5Y2hpYXRyaXN0ICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7ICAgICAgICAgICB9XHJcbi5tYXBJY29uMTYucmFuay1jaGVtaXN0ICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7ICAgICAgICAgIH1cclxuLyogU2NpZW5jZSBQb3NpdGlvbnMgKi9cclxuLm1hcEljb24xNi5yYW5rLXNjaWVudGlzdCAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7ICAgICAgICAgfSBcclxuLm1hcEljb24xNi5yYW5rLWdlbmV0aWNpc3QgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7ICAgICAgICAgfVxyXG4ubWFwSWNvbjE2LnJhbmstcm9ib3RpY2lzdCAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xMjhweDsgICAgICAgICB9XHJcbi5tYXBJY29uMTYucmFuay14ZW5vYmlvbG9naXN0ICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTEyOHB4OyAgICAgICAgIH1cclxuLyogU2VjdXJpdHkgUG9zaXRpb25zICovXHJcbi5tYXBJY29uMTYucmFuay13YXJkZW4gICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTEyOHB4OyAgICAgICAgIH1cclxuLm1hcEljb24xNi5yYW5rLWRldGVjdGl2ZSAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTI4cHg7ICAgICAgICAgfVxyXG4ubWFwSWNvbjE2LnJhbmstc2VjdXJpdHlvZmZpY2VyICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xMjhweDsgICAgICAgICB9IiwidWwge1xyXG4gICAgcGFkZGluZzogNHB4IDAgMCAxMHB4O1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xyXG59XHJcblxyXG5saSB7XHJcbiAgICBwYWRkaW5nOiAwIDAgMnB4IDA7XHJcbn1cclxuXHJcbnRhYmxlLmZpeGVkIHtcclxuICAgIHRhYmxlLWxheW91dDpmaXhlZDtcclxufVxyXG5cclxudGFibGUuZml4ZWQgdGQge1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxufVxyXG5cclxuLyogVGFibGUgc3R5bGluZyBmb3IgdGhlIHBvd2VyIG1vbml0b3IgKi9cclxudGFibGUucG1vbiB7XHJcbiAgICBib3JkZXI6IDJweCBzb2xpZCBSb3lhbEJsdWU7XHJcbn1cclxuXHJcbnRhYmxlLnBtb24gdGQsIHRhYmxlLnBtb24gdGgge1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZCBibGFjaztcclxuICAgIHBhZGRpbmc6IDBweCA1cHggMHB4IDVweDtcclxufVxyXG5cclxuLyogVGFibGUgc3R5bGluZyBmb3IgdGhlIGNyZXcgbWFuaWZlc3QgKi9cclxuLm1hbmlmZXN0LWhlYWRlcihAY29sb3I6ICM2NjYpIHtcclxuXHRiYWNrZ3JvdW5kOiBAY29sb3I7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG59XHJcblxyXG50aC5jb21tYW5kIHtcclxuXHQubWFuaWZlc3QtaGVhZGVyKCMzMzMzRkYpO1xyXG59XHJcblxyXG50aC5zZWMge1xyXG5cdC5tYW5pZmVzdC1oZWFkZXIoIzhlMDAwMCk7XHJcbn1cclxuXHJcbnRoLm1lZCB7XHJcblx0Lm1hbmlmZXN0LWhlYWRlcigjMDA2NjAwKTtcclxufVxyXG5cclxudGguZW5nIHtcclxuXHQubWFuaWZlc3QtaGVhZGVyKCNiMjczMDApO1xyXG59XHJcblxyXG50aC5zY2kge1xyXG5cdC5tYW5pZmVzdC1oZWFkZXIoI2E2NWJhNik7XHJcbn1cclxuXHJcbnRoLnNlciB7XHJcblx0Lm1hbmlmZXN0LWhlYWRlcigjNzEwMEFBKTtcclxufVxyXG5cclxudGguc3VwIHtcclxuXHQubWFuaWZlc3QtaGVhZGVyKCM2NjY2MjEpO1xyXG59XHJcblxyXG50aC5jaXYge1xyXG5cdC5tYW5pZmVzdC1oZWFkZXIoI2EzMjgwMCk7XHJcbn1cclxuXHJcbnRoLm1pc2Mge1xyXG5cdC5tYW5pZmVzdC1oZWFkZXI7XHJcbn1cclxuXHJcbnNwYW4ucW0tam9iIHtcclxuXHRjb2xvcjogbWl4KEBoaWdobGlnaHQtY29sb3IsIEBhdmVyYWdlLWNvbG9yLCAzMyUpO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbi8qIFN0cmlwZWQgbGluZXMgZm9yIHRhYmxlcyBhbmQgZGl2cyAqL1xyXG4uc3RyaXBlZCB7XHJcbiAgICAuc3RyaXBlZC1iYXNlKCkge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM0MDQwNDA7XHJcbiAgICB9XHJcbiAgICB0cjpudGgtY2hpbGQoZXZlbikge1xyXG4gICAgICAgIC5zdHJpcGVkLWJhc2U7XHJcbiAgICB9XHJcbiAgICAmOm5vdCh0YWJsZSkgPiA6bnRoLWNoaWxkKGV2ZW4pIHtcclxuICAgICAgICAuc3RyaXBlZC1iYXNlO1xyXG4gICAgfVxyXG59IiwiI3VpTm9TY3JpcHQge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICBsZWZ0OiA1MCU7XHJcbiAgICBtYXJnaW46IC02MHB4IDAgMCAtMTUwcHg7XHJcbiAgICB3aWR0aDogMjgwcHg7XHJcbiAgICBoZWlnaHQ6IDEyMHB4O1xyXG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcclxuICAgIGJvcmRlcjogMnB4IHNvbGlkICNmZjAwMDA7XHJcbiAgICBjb2xvcjogIzAwMDAwMDtcclxuICAgIGZvbnQtc2l6ZTogMTBweDtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgei1pbmRleDogOTk5OTtcclxuICAgIHBhZGRpbmc6IDBweCAxMHB4O1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcblxyXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAgIC5ub3RpY2UgfCBDYXV0aW9uIFN0cmlwZXNcclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuLm5vdGljZSB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBiYWNrZ3JvdW5kOiB1cmwodWlOb3RpY2VCYWNrZ3JvdW5kLmpwZykgNTAlIDUwJTtcclxuICAgIGNvbG9yOiAjMDAwMDAwO1xyXG4gICAgZm9udC1zaXplOiAxMnB4O1xyXG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBwYWRkaW5nOiAzcHggNHB4IDNweCA0cHg7XHJcbiAgICBtYXJnaW46IDRweCAwIDRweCAwO1xyXG59XHJcblxyXG4ubm90aWNlUGxhY2Vob2xkZXIge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgZm9udC1zaXplOiAxMnB4O1xyXG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBwYWRkaW5nOiAzcHggNHB4IDNweCA0cHg7XHJcbiAgICBtYXJnaW46IDRweCAwIDRweCAwO1xyXG59XHJcblxyXG4ubm90aWNlLmljb24ge1xyXG4gICAgcGFkZGluZzogMnB4IDRweCAwIDIwcHg7XHJcbn1cclxuXHJcbi5ub3RpY2UgaW1nIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTZweDtcclxuICAgIGhlaWdodDogMTZweDtcclxufVxyXG5cclxuZGl2Lm5vdGljZSB7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG4vKioqKioqKioqKioqKioqKioqKipcXFxyXG5cXCoqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHJcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICBQREEsIEROQSBNb2RpZmllciBzdHlsZXNcclxuICAgIERvbid0IGZpdCBhbnl3aGVyZSBlbHNlLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuLyogUERBIHN0eWxpbmcgKi9cclxuLndob2xlU2NyZWVuIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIGNvbG9yOiAjNTE3MDg3O1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5wZGFsaW5rIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICAgIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50O1xyXG5cclxuXHQmLmRpc2FibGVkIHtcclxuXHRcdGJhY2tncm91bmQ6IG5vbmU7XHJcblx0XHRib3JkZXI6IG5vbmU7XHJcblx0XHRjb2xvcjogIzk5OTtcclxuXHRcdHRleHQtYWxpZ246IGxlZnQ7XHJcblx0fVxyXG59XHJcblxyXG4ucGRhbm90ZSB7XHJcbiAgICBjb2xvcjogI2NkNjUwMDtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG4uaXRlbS5tYWlubWVudSB7XHJcblx0cGFkZGluZy1ib3R0b206IDAuNWVtO1xyXG59XHJcblxyXG5kaXYuY2xvY2sge1xyXG5cdGNvbG9yOiB3aGl0ZTtcclxuXHRmb250LXdlaWdodDogYm9sZDtcclxuXHRmbG9hdDogcmlnaHQ7XHJcblx0cGFkZGluZy1yaWdodDogMmVtO1xyXG59XHJcblxyXG4jcGRhRm9vdGVyIHtcclxuXHRwb3NpdGlvbjogZml4ZWQ7XHJcblx0bGVmdDogMDtcclxuXHRib3R0b206IDA7XHJcblx0d2lkdGg6IDEwMCU7XHJcblx0YmFja2dyb3VuZDogQGRhcmstY29sb3I7XHJcbn1cclxuXHJcbi5wZGFGb290ZXJCdXR0b24ge1xyXG5cdHdpZHRoOiAzMyU7XHJcblx0cGFkZGluZzogMC41ZW0gMDtcclxuXHRmb250LXNpemU6IDIwMCU7XHJcblx0Ym9yZGVyOiBub25lO1xyXG5cdGJhY2tncm91bmQ6IG5vbmU7XHJcblx0Y29sb3I6ICNmZmY7XHJcblxyXG5cdCYuaG92ZXIge1xyXG5cdFx0YmFja2dyb3VuZDogIzUwN2FhYztcclxuXHR9XHJcblxyXG5cdCYuZGlzYWJsZWQge1xyXG5cdFx0YmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50O1xyXG5cdFx0Y29sb3I6ICM1NTUgIWltcG9ydGFudDtcclxuXHR9XHJcblxyXG5cdC51aUxpbmtQZW5kaW5nSWNvbiB7XHJcblx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XHJcblx0XHR3aWR0aDogMzMlO1xyXG5cdFx0YmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxuXHRcdGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcclxuXHR9XHJcbn1cclxuXHJcbi8qIEROQSBNb2RpZmllciBzdHlsaW5nICovXHJcbi5kbmFCbG9jayB7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIHdpZHRoOiA5MHB4O1xyXG4gICAgcGFkZGluZzogMCAwIDVweCAwO1xyXG59XHJcblxyXG4uZG5hQmxvY2tOdW1iZXIge1xyXG4gICAgZm9udC1mYW1pbHk6IEZpeGVkLCBtb25vc3BhY2U7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgYmFja2dyb3VuZDogIzM2MzYzNjtcclxuICAgIG1pbi13aWR0aDogMjBweDtcclxuICAgIGhlaWdodDogMjBweDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5kbmFTdWJCbG9jayB7XHJcbiAgICBmb250LWZhbWlseTogRml4ZWQsIG1vbm9zcGFjZTtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1pbi13aWR0aDogMTZweDtcclxuICAgIGhlaWdodDogMjBweDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG5cclxuLm1hc2sge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHRvcDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgYmFja2dyb3VuZDogdXJsKHVpTWFza0JhY2tncm91bmQucG5nKTtcclxufVxyXG5cclxuLm1hc2tDb250ZW50IHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAyMDBweDtcclxuICAgIG1hcmdpbjogMjAwcHggMDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG4vKioqKioqKioqKioqKioqKioqKipcXFxyXG5cXCoqKioqKioqKioqKioqKioqKioqLyIsIkBpbXBvcnQgXCJfY29uZmlnXCI7XHJcblxyXG5ib2R5IHtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgZm9udC1mYW1pbHk6IEBmb250O1xyXG4gICAgZm9udC1zaXplOiBAZm9udHNpemU7XHJcbiAgICBsaW5lLWhlaWdodDogMTcwJTtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbn1cclxuXHJcbmhyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM0MDYyOGE7XHJcbiAgICBoZWlnaHQ6IDFweDtcclxuICAgIGJvcmRlcjogbm9uZTtcclxufVxyXG5cclxuaW1nLCBhIGltZyB7XHJcbiAgICBib3JkZXItc3R5bGU6IG5vbmU7XHJcbn1cclxuXHJcbmgxLCBoMiwgaDMsIGg0LCBoNSwgaDYge1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMTJweCAwIDZweCAwO1xyXG4gICAgY29sb3I6ICNGRkZGRkY7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG5cclxuaDEge1xyXG4gICAgZm9udC1zaXplOiAxOHB4O1xyXG59XHJcblxyXG5oMiB7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbn1cclxuXHJcbmgzIHtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxufVxyXG5cclxuaDQge1xyXG4gICAgZm9udC1zaXplOiAxMnB4O1xyXG59IiwiKltkYXRhLXRvb2x0aXBdIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcblxyXG4gICY6OmFmdGVyIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHdpZHRoOiAyNTBweDtcclxuICAgIHBhZGRpbmc6IDEwcHg7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XHJcblxyXG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xyXG4gICAgb3BhY2l0eTogMDtcclxuXHJcbiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xyXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS10b29sdGlwKTtcclxuXHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgLjVzO1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMzNjM2MzY7XHJcbiAgfVxyXG5cclxuICAmOmhvdmVyOjphZnRlciB7XHJcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xyXG4gICAgb3BhY2l0eTogMTtcclxuICB9XHJcblxyXG4gICYudG9vbHRpcFRvcDo6YWZ0ZXIge1xyXG4gICAgYm90dG9tOiAxMDAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoOHB4KTtcclxuICB9XHJcbiAgJi50b29sdGlwVG9wOmhvdmVyOjphZnRlciB7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtOHB4KTtcclxuICB9XHJcblxyXG4gICYudG9vbHRpcEJvdHRvbTo6YWZ0ZXIge1xyXG4gICAgdG9wOiAxMDAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLThweCk7XHJcbiAgfVxyXG4gICYudG9vbHRpcEJvdHRvbTpob3Zlcjo6YWZ0ZXIge1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoOHB4KTtcclxuICB9XHJcblxyXG4gICYudG9vbHRpcExlZnQ6OmFmdGVyIHtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgcmlnaHQ6IDEwMCU7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoOHB4KSB0cmFuc2xhdGVZKC01MCUpO1xyXG4gIH1cclxuICAmLnRvb2x0aXBMZWZ0OmhvdmVyOjphZnRlciB7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLThweCkgdHJhbnNsYXRlWSgtNTAlKTtcclxuICB9XHJcblxyXG4gICYudG9vbHRpcFJpZ2h0OjphZnRlciB7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIGxlZnQ6IDEwMCU7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLThweCkgdHJhbnNsYXRlWSgtNTAlKTtcclxuICB9XHJcbiAgJi50b29sdGlwUmlnaHQ6aG92ZXI6OmFmdGVyIHtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg4cHgpIHRyYW5zbGF0ZVkoLTUwJSk7XHJcbiAgfVxyXG59IixudWxsLCJAY2hhcnNldCBcInV0Zi04XCI7XHJcblxyXG5AaW1wb3J0IFwiX2JhcnNcIjtcclxuQGltcG9ydCBcIl9saW5rXCI7XHJcbkBpbXBvcnQgXCJfY29sb3JcIjtcclxuQGltcG9ydCBcIl9jb25maWdcIjtcclxuQGltcG9ydCBcIl9kaXNwbGF5XCI7XHJcbkBpbXBvcnQgXCJfZm9ybWF0dGluZ1wiO1xyXG5AaW1wb3J0IFwiX2ZhbmN5XCI7XHJcbkBpbXBvcnQgXCJfaWNvblwiO1xyXG5AaW1wb3J0IFwiX2xpc3RzXCI7XHJcbkBpbXBvcnQgXCJfbWlzY1wiO1xyXG5AaW1wb3J0IFwiX25hdGl2ZVwiO1xyXG5AaW1wb3J0IFwiX3Rvb2x0aXBcIjtcclxuXHJcblxyXG4ubWFpbkJHIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHotaW5kZXg6IC0xO1xyXG4gICAgdG9wOiAzMHB4O1xyXG4gICAgbGVmdDogMHB4O1xyXG4gICAgcmlnaHQ6IDBweDtcclxuICAgIGJvdHRvbTogMHB4O1xyXG4gICAgYmFja2dyb3VuZDogZGF0YS11cmkoJ25hbm90cmFzZW4uc3ZnJykgbm8tcmVwZWF0IGZpeGVkIGNlbnRlci83MCUgNzAlLFxyXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sXHJcbiAgICAgICAgQGJhY2tncm91bmQtc3RhcnQgMCUsXHJcbiAgICAgICAgQGJhY2tncm91bmQtZW5kIDEwMCUpIG5vLXJlcGVhdCBmaXhlZCBjZW50ZXIvMTAwJSAxMDAlO1xyXG59XHJcblxyXG4vL25hbm8gc2Nyb2xsYmFyIHN0eWxpbmdcclxuaHRtbCxib2R5IHtcclxuICAgIHNjcm9sbGJhci1mYWNlLWNvbG9yOiM2NjY2NjY7XHJcbiAgICBzY3JvbGxiYXItYXJyb3ctY29sb3I6I0U5QzE4MztcclxuICAgIHNjcm9sbGJhci10cmFjay1jb2xvcjojMzYzNjM2O1xyXG4gICAgc2Nyb2xsYmFyLXNoYWRvdy1jb2xvcjojNTU1NTU1OyAgICBcclxufVxyXG5cclxuI3VpV3JhcHBlciB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcclxuICAgIHVzZXItc2VsZWN0OiBub25lO1xyXG59XHJcblxyXG4jdWlUaXRsZVdyYXBwZXIge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgbWluLWhlaWdodDogMzBweDtcclxuICAgIG1pbi13aWR0aDogMTAwJTsgXHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzYzNjM2O1xyXG4gICAgbGVmdDogMHB4O1xyXG4gICAgdG9wOiAwcHg7XHJcbiAgICByaWdodDogMHB4O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIHotaW5kZXg6IDEwMDtcclxuICAgICYgPiBkaXYge1xyXG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcclxuICAgIH1cclxuICAgICYgPiBpIHtcclxuICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbiN1aVRpdGxlVGV4dCB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDZweDtcclxuICAgIGxlZnQ6IDQ0cHg7XHJcbiAgICB3aWR0aDogNjYlO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIGNvbG9yOiAjRTlDMTgzO1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG59XHJcblxyXG4jdWlUaXRsZS5pY29uIHtcclxuICAgIHBhZGRpbmc6IDZweCA4cHggNnB4IDQycHg7XHJcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggNTAlO1xyXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxufVxyXG5cclxuI3VpVGl0bGVGbHVmZiB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDRweDtcclxuICAgIHJpZ2h0OiAxMnB4O1xyXG4gICAgd2lkdGg6IDQycHg7XHJcbiAgICBoZWlnaHQ6IDI0cHg7XHJcbiAgICBiYWNrZ3JvdW5kOiBkYXRhLXVyaSgnbmFub3RyYXNlbi5zdmcnKSA1MCUgNTAlIG5vLXJlcGVhdDtcclxufVxyXG5cclxuLnN0YXR1c2ljb24ge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiA0cHg7XHJcbiAgICBsZWZ0OiAxMnB4O1xyXG59XHJcblxyXG4jdWlNYXBXcmFwcGVyIHtcclxuICAgIGNsZWFyOiBib3RoO1xyXG4gICAgcGFkZGluZzogOHB4O1xyXG4gICAgbWFyZ2luLXRvcDogMzBweDtcclxufVxyXG5cclxuI3VpTWFwSGVhZGVyIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIGNsZWFyOiBib3RoO1xyXG59XHJcblxyXG4jdWlNYXBDb250YWluZXIge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDYwMHB4O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM0MDYyOGE7XHJcbiAgICBiYWNrZ3JvdW5kOiB1cmwobmFub21hcEJhY2tncm91bmQucG5nKTtcclxufVxyXG5cclxuI3VpTWFwIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgbWFyZ2luOiAtNTEycHggMCAwIC01MTJweDtcclxuICAgIHdpZHRoOiAyNTZweDtcclxuICAgIGhlaWdodDogMjU2cHg7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgem9vbTogNDtcclxufVxyXG5cclxuI3VpTWFwSW1hZ2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgYm90dG9tOiAxcHg7XHJcbiAgICBsZWZ0OiAxcHg7XHJcbiAgICB3aWR0aDogMjU2cHg7XHJcbiAgICBoZWlnaHQ6IDI1NnB4O1xyXG59XHJcblxyXG4jdWlNYXBDb250ZW50IHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIGJvdHRvbTogLTEzLjVweDtcclxuICAgIGxlZnQ6IDBweDtcclxuICAgIHdpZHRoOiAyNTZweDtcclxuICAgIGhlaWdodDogMjU2cHg7XHJcbn1cclxuXHJcbiN1aU1hcEZvb3RlciB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG5cclxuI3VpQ29udGVudCB7XHJcbiAgICBjbGVhcjogYm90aDtcclxuICAgIHBhZGRpbmc6IDhweDtcclxuICAgIG1hcmdpbi10b3A6IDMwcHg7XHJcbn1cclxuXHJcbiN1aU1hcFRvb2x0aXAge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgcmlnaHQ6IDEwcHg7XHJcbiAgICB0b3A6IDEwcHg7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjNDA2MjhhO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzI3MjcyNztcclxuICAgIHBhZGRpbmc6IDhweDtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICB6LWluZGV4OiA5OTk5O1xyXG59XHJcblxyXG4jdWlMb2FkaW5nTm90aWNlIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIGJhY2tncm91bmQ6IHVybCh1aU5vdGljZUJhY2tncm91bmQuanBnKSA1MCUgNTAlO1xyXG4gICAgY29sb3I6ICMwMDAwMDA7XHJcbiAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIHBhZGRpbmc6IDNweCA0cHggM3B4IDRweDtcclxuICAgIG1hcmdpbjogNHB4IDAgNHB4IDA7XHJcbn1cclxuXHJcbi51bmRlclRpdGxlIHtcclxuICAgIG1hcmdpbi10b3A6IDMwcHg7XHJcbn0iXX0= */ diff --git a/nano/styles/_link.less b/nano/styles/_link.less index 24a8c33c7b6..5a3d7fa267e 100644 --- a/nano/styles/_link.less +++ b/nano/styles/_link.less @@ -1,4 +1,4 @@ -.link, .linkOn, .linkOff, .selected, .disabled, .yellowButton, .redButton { +.link, .linkOn, .linkOff, .selected, .disabled, .yellowButton, .redButton, .linkEncourage, .linkDiscourage { float: left; min-width: 15px; height: 16px; @@ -82,6 +82,27 @@ a.icon img, .linkOn.icon img, .linkOff.icon img, .selected.icon img, .disabled.i background-color: #ff6666; } +.linkEncourage, a.linkEncourage:link, a.linkEncourage:visited, a.linkEncourage:active { + color: #99ff33; + background-color: #40628a; + border-color: #161616; +} + +.linkEncourage.hover { + background-color: #507aac; +} + +.linkDiscourage, a.linkDiscourage:link, a.linkDiscourage:visited, a.linkDiscourage:active { + color: #8c8c8c; + background-color: #40628a; + border-color: #161616; +} + +.linkDiscourage.hover { + color: #ff0000; + background-color: #507aac; +} + .inactive, a.inactive:link, a.inactive:visited, a.inactive:active, a.inactive.hover { color: #ffffff; background: #999999; diff --git a/nano/templates/card_prog.tmpl b/nano/templates/card_prog.tmpl index 478c8f6b400..8ce688e1997 100644 --- a/nano/templates/card_prog.tmpl +++ b/nano/templates/card_prog.tmpl @@ -11,6 +11,7 @@ {{:helper.link('Job Management', 'gear', {'action' : 'PRG_mode', 'mode_target' : 1}, data.mode == 1 ? 'disabled' : null)}} {{:helper.link('Crew Manifest', 'folder-open', {'action' : 'PRG_mode', 'mode_target' : 2}, data.mode == 2 ? 'disabled' : null)}} {{:helper.link('Print', 'print', {'action' : 'PRG_print'}, data.printer && (data.mode == 2 || data.has_modify && !data.mode) ? null : 'disabled')}} + {{:helper.link('Records', 'file', {'action' : 'PRG_mode', 'mode_target' : 3}, (data.mode == 3) ? 'disabled' : null)}} {{if data.mode == 1}}
    @@ -52,6 +53,31 @@
    {{:data.manifest}}
    + {{else data.mode == 3}} +
    +

    Records

    +
    +
    +
    + Authorized Identity: +
    +
    + {{:helper.link(data.scan_name, 'eject', {'action' : 'scan'})}} +
    +
    +
    + {{if data.authenticated}} + {{:data.id_change_html}} + {{if data.centcom_access}} + {{:helper.link('Delete Records By: ' + data.scan_owner, null, {'action' : 'PRG_wipe_my_logs'}, null, 'linkDanger')}} + {{/if}} + {{if !data.target_dept}} + {{:helper.link('Delete ALL Records', null, {'action' : 'PRG_wipe_all_logs'}, null, 'linkDanger')}} + {{/if}} + {{else}} + Please insert an authorized ID into the terminal to proceed.
    + {{/if}} +
    {{else}}

    Access Modification

    @@ -149,7 +175,11 @@ Terminations:
    - {{:helper.link('Terminate ' + data.target_owner, 'gear', {'action' : 'PRG_terminate'}, data.target_rank == "Terminated" ? 'disabled' : null, data.target_rank == "Terminated" ? 'disabled' : 'linkDanger')}} + {{if data.target_rank == "Terminated"}} + {{:data.target_owner}} has already been terminated! + {{else}} + {{:helper.link('Terminate ' + data.target_owner, 'gear', {'action' : 'PRG_terminate'}, data.target_rank == "Terminated" ? 'disabled' : null, data.target_rank == "Terminated" ? 'disabled' : 'linkDanger')}} + {{/if}}
    @@ -168,15 +198,16 @@ Special - {{:helper.link("Captain", '', {'action' : 'PRG_assign', 'assign_target' : 'Captain'}, data.target_rank == 'Captain' ? 'disabled' : null)}} - {{:helper.link("Custom", '', {'action' : 'PRG_assign', 'assign_target' : 'Custom'})}} + {{for data.top_jobs}} + {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} + {{/for}} Engineering {{for data.engineering_jobs}} - {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -184,7 +215,7 @@ Medical {{for data.medical_jobs}} - {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -192,7 +223,7 @@ Security {{for data.security_jobs}} - {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -200,7 +231,7 @@ Science {{for data.science_jobs}} - {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -208,7 +239,7 @@ Support {{for data.support_jobs}} - {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -216,7 +247,7 @@ Civilian {{for data.civilian_jobs}} - {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -225,7 +256,7 @@ CentComm {{for data.centcom_jobs}} - {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} diff --git a/nano/templates/identification_computer.tmpl b/nano/templates/identification_computer.tmpl index ad2779f7864..606af520168 100644 --- a/nano/templates/identification_computer.tmpl +++ b/nano/templates/identification_computer.tmpl @@ -11,7 +11,8 @@ {{if !data.target_dept}}{{:helper.link('Job Management', 'gear', {'choice' : 'mode', 'mode_target' : 1}, data.mode == 1 ? 'disabled' : null)}}{{/if}} {{:helper.link('Crew Manifest', 'folder-open', {'choice' : 'mode', 'mode_target' : 2}, data.mode == 2 ? 'disabled' : null)}} {{if !data.target_dept}}{{:helper.link('Print', 'print', {'choice' : 'print'}, (data.mode == 2 || data.has_modify && !data.mode) ? null : 'disabled')}}{{/if}} - + {{:helper.link('Records', 'file', {'choice' : 'mode', 'mode_target' : 3}, (data.mode == 3) ? 'disabled' : null)}} + {{if data.mode == 1 && !data.target_dept}}

    Job Management

    @@ -52,6 +53,31 @@
    {{:data.manifest}}
    + {{else data.mode == 3}} +
    +

    Records

    +
    +
    +
    + Authorized Identity: +
    +
    + {{:helper.link(data.scan_name, 'eject', {'choice' : 'scan'})}} +
    +
    +
    + {{if data.authenticated}} + {{:data.id_change_html}} + {{if data.centcom_access}} + {{:helper.link('Delete Records By: ' + data.scan_owner, null, {'choice' : 'wipe_my_logs'}, null, 'linkDanger')}} + {{/if}} + {{if !data.target_dept}} + {{:helper.link('Delete ALL Records', null, {'choice' : 'wipe_all_logs'}, null, 'linkDanger')}} + {{/if}} + {{else}} + Please insert an authorized ID into the terminal to proceed.
    + {{/if}} +
    {{else}}

    Access Modification

    @@ -145,21 +171,31 @@
    {{/if}} -
    + {{if data.target_rank != "Terminated"}} +
    Demotions:
    - {{:helper.link('Demote ' + data.target_owner, 'gear', {'choice' : 'demote'}, (data.target_rank == "Civilian" || data.target_rank == "Unassigned" || data.target_rank == "Terminated") ? 'disabled' : null, (data.target_rank == "Civilian" || data.target_rank == "Unassigned" || data.target_rank == "Terminated") ? 'disabled' : 'linkDanger')}} + {{if data.target_rank == "Demoted"}} + {{:data.target_owner}} has already been demoted! + {{else}} + {{:helper.link('Demote ' + data.target_owner, 'gear', {'choice' : 'demote'}, (data.target_rank == "Civilian" || data.target_rank == "Unassigned") ? 'disabled' : null, (data.target_rank == "Civilian" || data.target_rank == "Unassigned") ? 'disabled' : 'linkDanger')}} + {{/if}}
    + {{/if}} {{if !data.target_dept}}
    Terminations:
    - {{:helper.link('Terminate ' + data.target_owner, 'gear', {'choice' : 'terminate'}, data.target_rank == "Terminated" ? 'disabled' : null, data.target_rank == "Terminated" ? 'disabled' : 'linkDanger')}} + {{if data.target_rank == "Terminated"}} + {{:data.target_owner}} has already been terminated! + {{else}} + {{:helper.link('Terminate ' + data.target_owner, 'gear', {'choice' : 'terminate'}, data.target_rank == "Terminated" ? 'disabled' : null, data.target_rank == "Terminated" ? 'disabled' : 'linkDanger')}} + {{/if}}
    @@ -187,8 +223,9 @@ Special - {{:helper.link("Captain", '', {'choice' : 'assign', 'assign_target' : 'Captain'}, data.target_rank == 'Captain' ? 'disabled' : null)}} - {{:helper.link("Custom", '', {'choice' : 'assign', 'assign_target' : 'Custom'})}} + {{for data.top_jobs}} + {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} + {{/for}} {{/if}} @@ -197,7 +234,7 @@ Engineering {{for data.engineering_jobs}} - {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -207,7 +244,7 @@ Medical {{for data.medical_jobs}} - {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -217,7 +254,7 @@ Security {{for data.security_jobs}} - {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -227,9 +264,9 @@ Science {{for data.science_jobs}} - {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} - + {{/if}} {{if !data.target_dept}} @@ -237,7 +274,7 @@ Support {{for data.support_jobs}} - {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -246,7 +283,7 @@ Civilian {{for data.civilian_jobs}} - {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -255,7 +292,7 @@ CentComm {{for data.centcom_jobs}} - {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} diff --git a/paradise.dme b/paradise.dme index 013c04fa842..42c6744a48b 100644 --- a/paradise.dme +++ b/paradise.dme @@ -137,6 +137,7 @@ #include "code\_onclick\hud\constructs.dm" #include "code\_onclick\hud\devil.dm" #include "code\_onclick\hud\fullscreen.dm" +#include "code\_onclick\hud\ghost.dm" #include "code\_onclick\hud\guardian.dm" #include "code\_onclick\hud\hud.dm" #include "code\_onclick\hud\human.dm" @@ -197,20 +198,19 @@ #include "code\controllers\master.dm" #include "code\controllers\subsystem.dm" #include "code\controllers\verbs.dm" -#include "code\controllers\Processes\alarm.dm" -#include "code\controllers\Processes\event.dm" -#include "code\controllers\Processes\fast_process.dm" #include "code\controllers\Processes\lighting.dm" #include "code\controllers\Processes\npcai.dm" -#include "code\controllers\Processes\obj.dm" #include "code\controllers\Processes\ticker.dm" #include "code\controllers\ProcessScheduler\core\process.dm" #include "code\controllers\ProcessScheduler\core\processScheduler.dm" #include "code\controllers\subsystem\air.dm" +#include "code\controllers\subsystem\alarm.dm" #include "code\controllers\subsystem\assets.dm" #include "code\controllers\subsystem\atoms.dm" +#include "code\controllers\subsystem\events.dm" #include "code\controllers\subsystem\fires.dm" #include "code\controllers\subsystem\garbage.dm" +#include "code\controllers\subsystem\holiday.dm" #include "code\controllers\subsystem\icon_smooth.dm" #include "code\controllers\subsystem\ipintel.dm" #include "code\controllers\subsystem\jobs.dm" @@ -231,6 +231,8 @@ #include "code\controllers\subsystem\timer.dm" #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" +#include "code\controllers\subsystem\processing\fastprocess.dm" +#include "code\controllers\subsystem\processing\obj.dm" #include "code\controllers\subsystem\processing\processing.dm" #include "code\controllers\subsystem\tickets\mentor_tickets.dm" #include "code\controllers\subsystem\tickets\tickets.dm" @@ -1420,7 +1422,7 @@ #include "code\modules\events\electrical_storm.dm" #include "code\modules\events\event.dm" #include "code\modules\events\event_container.dm" -#include "code\modules\events\event_manager.dm" +#include "code\modules\events\event_procs.dm" #include "code\modules\events\false_alarm.dm" #include "code\modules\events\floorcluwne.dm" #include "code\modules\events\grid_check.dm" @@ -1452,6 +1454,7 @@ #include "code\modules\events\vent_clog.dm" #include "code\modules\events\wallrot.dm" #include "code\modules\events\wormholes.dm" +#include "code\modules\events\wizard\ghost.dm" #include "code\modules\examine\examine.dm" #include "code\modules\examine\descriptions\atmospherics.dm" #include "code\modules\examine\descriptions\engineering.dm" @@ -1807,7 +1810,6 @@ #include "code\modules\mob\living\silicon\decoy\decoy.dm" #include "code\modules\mob\living\silicon\decoy\life.dm" #include "code\modules\mob\living\silicon\pai\death.dm" -#include "code\modules\mob\living\silicon\pai\emote.dm" #include "code\modules\mob\living\silicon\pai\life.dm" #include "code\modules\mob\living\silicon\pai\pai.dm" #include "code\modules\mob\living\silicon\pai\personality.dm" @@ -2110,7 +2112,6 @@ #include "code\modules\power\powernet.dm" #include "code\modules\power\smes.dm" #include "code\modules\power\solar.dm" -#include "code\modules\power\switch.dm" #include "code\modules\power\terminal.dm" #include "code\modules\power\tracker.dm" #include "code\modules\power\treadmill.dm" diff --git a/sound/voice/borg_deathsound.ogg b/sound/voice/borg_deathsound.ogg new file mode 100644 index 00000000000..06e847165ff Binary files /dev/null and b/sound/voice/borg_deathsound.ogg differ diff --git a/sound/weapons/bolathrow.ogg b/sound/weapons/bolathrow.ogg new file mode 100644 index 00000000000..9a7b78fb67f Binary files /dev/null and b/sound/weapons/bolathrow.ogg differ diff --git a/strings/revenant_names.json b/strings/revenant_names.json new file mode 100644 index 00000000000..8c1229296f4 --- /dev/null +++ b/strings/revenant_names.json @@ -0,0 +1,55 @@ +{ + "spirit_type": [ + "Essence", + "Ghost", + "Phantom", + "Poltergeist", + "Revenant", + "Soul", + "Spectre", + "Spirit" + ], + + "adjective": [ + "", + "Abysmal ", + "Abyssal ", + "Brutal ", + "Dark ", + "Endless ", + "Eternal ", + "Fiery ", + "Hateful ", + "Hideous ", + "Hilarious ", + "Indifferent ", + "Malevolent ", + "Peaceful ", + "Searing ", + "Silent ", + "Spiteful ", + "Vicious ", + "Violent " + ], + + "theme": [ + "Agony", + "Anger", + "Death", + "Despair", + "Desperation", + "Destruction", + "Disease", + "Grief", + "Hate", + "Hellfire", + "Laughter", + "Misery", + "Ruin", + "Salt", + "Screams", + "Sorrow", + "Suffering", + "Vengeance" + ] +}