From 47845f2c306015086dd9d53087e2dd8df43c8661 Mon Sep 17 00:00:00 2001 From: Letter N <24603524+LetterN@users.noreply.github.com> Date: Sat, 3 Oct 2020 19:54:23 +0800 Subject: [PATCH 01/10] suposed to be SSupdates but noo --- code/controllers/subsystem/dcs.dm | 11 +- code/controllers/subsystem/economy.dm | 6 +- code/controllers/subsystem/events.dm | 2 +- code/controllers/subsystem/mapping.dm | 2 +- code/modules/admin/admin.dm | 4 +- code/modules/admin/admin_investigate.dm | 2 +- code/modules/admin/admin_verbs.dm | 28 +- code/modules/admin/adminmenu.dm | 2 +- code/modules/admin/verbs/adminjump.dm | 16 +- code/modules/admin/verbs/borgpanel.dm | 2 +- code/modules/admin/verbs/cinematic.dm | 2 +- code/modules/admin/verbs/deadsay.dm | 2 +- code/modules/admin/verbs/debug.dm | 43 ++- code/modules/admin/verbs/dice.dm | 2 +- code/modules/admin/verbs/one_click_antag.dm | 2 +- code/modules/admin/verbs/playsound.dm | 10 +- code/modules/admin/verbs/randomverbs.dm | 99 +++-- code/modules/admin/verbs/shuttlepanel.dm | 2 +- code/modules/admin/verbs/tripAI.dm | 2 +- code/modules/cargo/centcom_podlauncher.dm | 2 +- code/modules/client/preferences_toggles.dm | 10 +- code/modules/client/verbs/ooc.dm | 6 +- html/statbrowser.html | 408 +++++++++++--------- 23 files changed, 391 insertions(+), 274 deletions(-) diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm index 3243a8d8c8..104c3eef31 100644 --- a/code/controllers/subsystem/dcs.dm +++ b/code/controllers/subsystem/dcs.dm @@ -1,6 +1,7 @@ PROCESSING_SUBSYSTEM_DEF(dcs) name = "Datum Component System" flags = SS_NO_INIT + wait = 1 SECONDS var/list/elements_by_type = list() @@ -38,17 +39,11 @@ PROCESSING_SUBSYSTEM_DEF(dcs) if(istext(key)) value = arguments[key] if(!(istext(key) || isnum(key))) - if(islist(key)) // CITADEL EDIT - key = deep_list2params(key) - else - key = REF(key) + key = REF(key) key = "[key]" // Key is stringified so numbers dont break things if(!isnull(value)) if(!(istext(value) || isnum(value))) - if(islist(value)) // CITADEL EDIT - value = deep_list2params(value) - else - value = REF(value) + value = REF(value) named_arguments["[key]"] = value else fullid += "[key]" diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index 078d122aa6..47b00d1125 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -60,9 +60,9 @@ SUBSYSTEM_DEF(economy) secmedsrv_payout() // Payout based on crew safety, health, and mood. civ_payout() // Payout based on ??? Profit car_payout() // Cargo's natural gain in the cash moneys. - for(var/A in bank_accounts) - var/datum/bank_account/B = A - B.payday(1) + for(var/account in bank_accounts) + var/datum/bank_account/bank_account = account + bank_account.payday(1) /datum/controller/subsystem/economy/proc/get_dep_account(dep_id) diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 2e4e728191..9bc8a631c1 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -100,7 +100,7 @@ SUBSYSTEM_DEF(events) // REEEEEEEEE /client/proc/forceEvent() set name = "Trigger Event" - set category = "Fun" + set category = "Admin.Events" if(!holder ||!check_rights(R_FUN)) return diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 617004646a..2ea3b29c91 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -447,7 +447,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) //Manual loading of away missions. /client/proc/admin_away() set name = "Load Away Mission / Virtual Reality" - set category = "Fun" + set category = "Admin.Events" if(!holder ||!check_rights(R_FUN)) return diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 8421d9955d..4fb5a89891 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -12,7 +12,7 @@ ///////////////////////////////////////////////////////////////////////////////////////////////Panels /datum/admins/proc/show_player_panel(mob/M in GLOB.mob_list) - set category = "Admin" + set category = "Admin.Game" set name = "Show Player Panel" set desc="Edit player (respawn, ban, heal, etc)" @@ -211,7 +211,7 @@ /datum/admins/proc/access_news_network() //MARKER - set category = "Fun" + set category = "Admin.Events" set name = "Access Newscaster Network" set desc = "Allows you to view, add and edit news feeds." diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 7e5c104d90..52be445120 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -6,7 +6,7 @@ /client/proc/investigate_show() set name = "Investigate" - set category = "Admin" + set category = "Admin.Game" if(!holder) return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 2c4e7b4f6e..52b4fa05b1 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -348,7 +348,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/admin_ghost() - set category = "Admin" + set category = "Admin.Game" set name = "Aghost" if(!holder) return FALSE @@ -379,7 +379,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/invisimin() set name = "Invisimin" - set category = "Admin" + set category = "Admin.Game" set desc = "Toggles ghost-like invisibility (Don't abuse this)" if(holder && mob) if(mob.invisibility == INVISIBILITY_OBSERVER) @@ -391,7 +391,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/check_antagonists() set name = "Check Antagonists" - set category = "Admin" + set category = "Admin.Game" if(holder) holder.check_antagonists() log_admin("[key_name(usr)] checked antagonists.") //for tsar~ @@ -411,14 +411,14 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/game_panel() set name = "Game Panel" - set category = "Admin" + set category = "Admin.Game" if(holder) holder.Game() SSblackbox.record_feedback("tally", "admin_verb", 1, "Game Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/secrets() set name = "Secrets" - set category = "Admin" + set category = "Admin.Game" if (holder) holder.Secrets() SSblackbox.record_feedback("tally", "admin_verb", 1, "Secrets Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -472,7 +472,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) SSblackbox.record_feedback("tally", "admin_verb", 1, "Stealth Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/drop_bomb() - set category = "Special Verbs" + set category = "Admin.Fun" set name = "Drop Bomb" set desc = "Cause an explosion of varying strength at your location." @@ -514,7 +514,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) SSblackbox.record_feedback("tally", "admin_verb", 1, "Drop Bomb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/drop_dynex_bomb() - set category = "Special Verbs" + set category = "Admin.Fun" set name = "Drop DynEx Bomb" set desc = "Cause an explosion of varying strength at your location." @@ -561,7 +561,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) message_admins("[key_name_admin(usr)] has modified Dynamic Explosion Scale: [ex_scale]") /client/proc/give_spell(mob/T in GLOB.mob_list) - set category = "Fun" + set category = "Admin.Fun" set name = "Give Spell" set desc = "Gives a spell to a mob." @@ -585,7 +585,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) message_admins("Spells given to mindless mobs will not be transferred in mindswap or cloning!") /client/proc/remove_spell(mob/T in GLOB.mob_list) - set category = "Fun" + set category = "Admin.Fun" set name = "Remove Spell" set desc = "Remove a spell from the selected mob." @@ -598,7 +598,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) SSblackbox.record_feedback("tally", "admin_verb", 1, "Remove Spell") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/give_disease(mob/living/T in GLOB.mob_living_list) - set category = "Fun" + set category = "Admin.Fun" set name = "Give Disease" set desc = "Gives a Disease to a mob." if(!istype(T)) @@ -613,7 +613,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) message_admins("[key_name_admin(usr)] gave [key_name(T)] the disease [D].") /client/proc/object_say(obj/O in world) - set category = "Special Verbs" + set category = "Admin.Events" set name = "OSay" set desc = "Makes an object say something." var/message = input(usr, "What do you want the message to be?", "Make Sound") as text | null @@ -625,7 +625,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) SSblackbox.record_feedback("tally", "admin_verb", 1, "Object Say") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/togglebuildmodeself() set name = "Toggle Build Mode Self" - set category = "Special Verbs" + set category = "Admin.Events" if (!(holder.rank.rights & R_BUILDMODE)) return if(src.mob) @@ -634,7 +634,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/check_ai_laws() set name = "Check AI Laws" - set category = "Admin" + set category = "Admin.Game" if(holder) src.holder.output_ai_laws() @@ -717,7 +717,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/toggle_AI_interact() set name = "Toggle Admin AI Interact" - set category = "Admin" + set category = "Admin.Game" set desc = "Allows you to interact with most machines as an AI would as a ghost" AI_Interact = !AI_Interact diff --git a/code/modules/admin/adminmenu.dm b/code/modules/admin/adminmenu.dm index 64ce5987cf..b7d85ccff5 100644 --- a/code/modules/admin/adminmenu.dm +++ b/code/modules/admin/adminmenu.dm @@ -5,7 +5,7 @@ /datum/verbs/menu/Admin/verb/playerpanel() set name = "Player Panel" set desc = "Player Panel" - set category = "Admin" + set category = "Admin.Game" if(usr.client.holder) usr.client.holder.player_panel_new() SSblackbox.record_feedback("tally", "admin_verb", 1, "Player Panel New") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 257c1d275a..ef56b4cd2a 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -1,7 +1,7 @@ /client/proc/jumptoarea(area/A in GLOB.sortedAreas) set name = "Jump to Area" set desc = "Area to jump to" - set category = "Admin" + set category = "Admin.Game" if(!src.holder) to_chat(src, "Only administrators may use this command.", confidential = TRUE) return @@ -28,7 +28,7 @@ /client/proc/jumptoturf(turf/T in world) set name = "Jump to Turf" - set category = "Admin" + set category = "Admin.Game" if(!src.holder) to_chat(src, "Only administrators may use this command.", confidential = TRUE) return @@ -40,7 +40,7 @@ return /client/proc/jumptomob(mob/M in GLOB.mob_list) - set category = "Admin" + set category = "Admin.Game" set name = "Jump to Mob" if(!src.holder) @@ -59,7 +59,7 @@ to_chat(A, "This mob is not located in the game world.", confidential = TRUE) /client/proc/jumptocoord(tx as num, ty as num, tz as num) - set category = "Admin" + set category = "Admin.Game" set name = "Jump to Coordinate" if (!holder) @@ -74,7 +74,7 @@ message_admins("[key_name_admin(usr)] jumped to coordinates [tx], [ty], [tz]") /client/proc/jumptokey() - set category = "Admin" + set category = "Admin.Game" set name = "Jump to Key" if(!src.holder) @@ -97,7 +97,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Jump To Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/Getmob(mob/M in GLOB.mob_list - GLOB.dummy_mob_list) - set category = "Admin" + set category = "Admin.Game" set name = "Get Mob" set desc = "Mob to teleport" if(!src.holder) @@ -113,7 +113,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Get Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/Getkey() - set category = "Admin" + set category = "Admin.Game" set name = "Get Key" set desc = "Key to teleport" @@ -141,7 +141,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Get Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/sendmob(mob/M in sortmobs()) - set category = "Admin" + set category = "Admin.Game" set name = "Send Mob" if(!src.holder) to_chat(src, "Only administrators may use this command.", confidential = TRUE) diff --git a/code/modules/admin/verbs/borgpanel.dm b/code/modules/admin/verbs/borgpanel.dm index be22c889f0..4b60ecc0ff 100644 --- a/code/modules/admin/verbs/borgpanel.dm +++ b/code/modules/admin/verbs/borgpanel.dm @@ -1,5 +1,5 @@ /datum/admins/proc/open_borgopanel(borgo in GLOB.silicon_mobs) - set category = "Admin" + set category = "Admin.Game" set name = "Show Borg Panel" set desc = "Show borg panel" diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm index 9b27a8d8e9..123e9877f7 100644 --- a/code/modules/admin/verbs/cinematic.dm +++ b/code/modules/admin/verbs/cinematic.dm @@ -1,6 +1,6 @@ /client/proc/cinematic() set name = "cinematic" - set category = "Fun" + set category = "Admin.Fun" set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted. set hidden = 1 if(!SSticker) diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 66acc0f667..e3937e19b6 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -1,5 +1,5 @@ /client/proc/dsay(msg as text) - set category = "Special Verbs" + set category = "Admin.Game" set name = "Dsay" set hidden = 1 if(!holder) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index f068f05a4a..5704448053 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -27,7 +27,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Air Status In Location") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_robotize(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Admin.Fun" set name = "Make Robot" if(!SSticker.HasRoundStarted()) @@ -43,7 +43,7 @@ alert("Invalid mob") /client/proc/cmd_admin_blobize(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Admin.Fun" set name = "Make Blob" if(!SSticker.HasRoundStarted()) @@ -58,7 +58,7 @@ /client/proc/cmd_admin_animalize(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Admin.Fun" set name = "Make Simple Animal" if(!SSticker.HasRoundStarted()) @@ -79,7 +79,7 @@ /client/proc/makepAI(turf/T in GLOB.mob_list) - set category = "Fun" + set category = "Admin.Fun" set name = "Make pAI" set desc = "Specify a location to spawn a pAI device, then specify a key to play that pAI" @@ -106,7 +106,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Make pAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_alienize(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Admin.Fun" set name = "Make Alien" if(!SSticker.HasRoundStarted()) @@ -121,7 +121,7 @@ alert("Invalid mob") /client/proc/cmd_admin_slimeize(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Admin.Fun" set name = "Make slime" if(!SSticker.HasRoundStarted()) @@ -211,7 +211,7 @@ message_admins("[key_name_admin(usr)] has granted [M.key] full access.") /client/proc/cmd_assume_direct_control(mob/M in GLOB.mob_list) - set category = "Admin" + set category = "Admin.Game" set name = "Assume direct control" set desc = "Direct intervention" @@ -229,6 +229,33 @@ qdel(adminmob) SSblackbox.record_feedback("tally", "admin_verb", 1, "Assume Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/proc/cmd_give_direct_control(mob/M in GLOB.mob_list) + set category = "Admin.Game" + set name = "Give direct control" + + if(!M) + return + if(M.ckey) + if(alert("This mob is being controlled by [M.key]. Are you sure you wish to give someone else control of it? [M.key] will be made a ghost.",,"Yes","No") != "Yes") + return + var/client/newkey = input(src, "Pick the player to put in control.", "New player") as null|anything in sortList(GLOB.clients) + var/mob/oldmob = newkey.mob + var/delmob = FALSE + if((isobserver(oldmob) || alert("Do you want to delete [newkey]'s old mob?","Delete?","Yes","No") != "No")) + delmob = TRUE + if(!M || QDELETED(M)) + to_chat(usr, "The target mob no longer exists, aborting.") + return + if(M.ckey) + M.ghostize(FALSE) + M.ckey = newkey.key + M.client?.init_verbs() + if(delmob) + qdel(oldmob) + message_admins("[key_name_admin(usr)] gave away direct control of [M] to [newkey].") + log_admin("[key_name(usr)] gave away direct control of [M] to [newkey].") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Give Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /client/proc/cmd_admin_test_atmos_controllers() set category = "Mapping" set name = "Test Atmos Monitoring Consoles" @@ -455,7 +482,7 @@ cmd_admin_areatest(FALSE) /client/proc/cmd_admin_dress(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Admin.Events" set name = "Select equipment" if(!(ishuman(M) || isobserver(M))) alert("Invalid mob") diff --git a/code/modules/admin/verbs/dice.dm b/code/modules/admin/verbs/dice.dm index 5b0a15257e..f033351f96 100644 --- a/code/modules/admin/verbs/dice.dm +++ b/code/modules/admin/verbs/dice.dm @@ -1,5 +1,5 @@ /client/proc/roll_dices() - set category = "Fun" + set category = "Admin.Fun" set name = "Roll Dice" if(!check_rights(R_FUN)) return diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 7675f858ee..2379ee22bc 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -1,7 +1,7 @@ /client/proc/one_click_antag() set name = "Create Antagonist" set desc = "Auto-create an antagonist of your choice" - set category = "Admin" + set category = "Admin.Events" if(holder) holder.one_click_antag() diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index fc2ba55f54..6e188a6c7a 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -1,5 +1,5 @@ /client/proc/play_sound(S as sound) - set category = "Fun" + set category = "Admin.Fun" set name = "Play Global Sound" if(!check_rights(R_SOUNDS)) return @@ -42,7 +42,7 @@ /client/proc/play_local_sound(S as sound) - set category = "Fun" + set category = "Admin.Fun" set name = "Play Local Sound" if(!check_rights(R_SOUNDS)) return @@ -53,7 +53,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Local Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/play_web_sound() - set category = "Fun" + set category = "Admin.Fun" set name = "Play Internet Sound" if(!check_rights(R_SOUNDS)) return @@ -136,7 +136,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Internet Sound") /client/proc/manual_play_web_sound() - set category = "Fun" + set category = "Admin.Fun" set name = "Manual Play Internet Sound" if(!check_rights(R_SOUNDS)) return @@ -182,7 +182,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Manual Play Internet Sound") /client/proc/set_round_end_sound(S as sound) - set category = "Fun" + set category = "Admin.Fun" set name = "Set Round End Sound" if(!check_rights(R_SOUNDS)) return diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 13f91ff79f..a657d37693 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -20,7 +20,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Drop Everything") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_subtle_message(mob/M in GLOB.mob_list) - set category = "Special Verbs" + set category = "Admin.Events" set name = "Subtle Message" if(!ismob(M)) @@ -46,7 +46,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Subtle Message") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_headset_message(mob/M in GLOB.mob_list) - set category = "Special Verbs" + set category = "Admin.Events" set name = "Headset Message" admin_headset_message(M) @@ -128,7 +128,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Modify Antagonist Reputation") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_world_narrate() - set category = "Special Verbs" + set category = "Admin.Events" set name = "Global Narrate" if(!check_rights(R_ADMIN)) @@ -144,7 +144,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Global Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_direct_narrate(mob/M) - set category = "Special Verbs" + set category = "Admin.Events" set name = "Direct Narrate" if(!check_rights(R_ADMIN)) @@ -169,7 +169,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Direct Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_local_narrate(atom/A) - set category = "Special Verbs" + set category = "Admin.Events" set name = "Local Narrate" if(!check_rights(R_ADMIN)) @@ -190,7 +190,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Local Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_godmode(mob/M in GLOB.mob_list) - set category = "Special Verbs" + set category = "Admin.Game" set name = "Godmode" if(!check_rights(R_ADMIN)) return @@ -335,7 +335,7 @@ Works kind of like entering the game with a new character. Character receives a Traitors and the like can also be revived with the previous role mostly intact. /N */ /client/proc/respawn_character() - set category = "Special Verbs" + set category = "Admin.Game" set name = "Respawn Character" set desc = "Respawn a person that has been gibbed/dusted/killed. They must be a ghost for this to work and preferably should not have a body to go back into." if(!check_rights(R_ADMIN)) @@ -503,7 +503,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return new_character /client/proc/cmd_admin_add_freeform_ai_law() - set category = "Fun" + set category = "Admin.Events" set name = "Add Custom AI law" if(!check_rights(R_ADMIN)) @@ -546,7 +546,7 @@ Traitors and the like can also be revived with the previous role mostly intact. SSblackbox.record_feedback("tally", "admin_verb", 1, "Rejuvinate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_create_centcom_report() - set category = "Special Verbs" + set category = "Admin.Events" set name = "Create Command Report" if(!check_rights(R_ADMIN)) @@ -572,7 +572,7 @@ Traitors and the like can also be revived with the previous role mostly intact. SSblackbox.record_feedback("tally", "admin_verb", 1, "Create Command Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_change_command_name() - set category = "Special Verbs" + set category = "Admin.Events" set name = "Change Command Name" if(!check_rights(R_ADMIN)) @@ -595,7 +595,7 @@ Traitors and the like can also be revived with the previous role mostly intact. admin_delete(A) /client/proc/cmd_admin_list_open_jobs() - set category = "Admin" + set category = "Admin.Game" set name = "Manage Job Slots" if(!check_rights(R_ADMIN)) @@ -604,7 +604,7 @@ Traitors and the like can also be revived with the previous role mostly intact. SSblackbox.record_feedback("tally", "admin_verb", 1, "Manage Job Slots") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world) - set category = "Special Verbs" + set category = "Admin.Fun" set name = "Explosion" if(!check_rights(R_ADMIN)) @@ -640,7 +640,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return /client/proc/cmd_admin_emp(atom/O as obj|mob|turf in world) - set category = "Special Verbs" + set category = "Admin.Fun" set name = "EM Pulse" if(!check_rights(R_ADMIN)) @@ -656,7 +656,7 @@ Traitors and the like can also be revived with the previous role mostly intact. SSblackbox.record_feedback("tally", "admin_verb", 1, "EM Pulse") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_gib(mob/M in GLOB.mob_list) - set category = "Special Verbs" + set category = "Admin.Fun" set name = "Gib" if(!check_rights(R_ADMIN)) @@ -683,7 +683,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/cmd_admin_gib_self() set name = "Gibself" - set category = "Fun" + set category = "Admin.Fun" var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No") if(confirm == "Yes") @@ -702,7 +702,7 @@ Traitors and the like can also be revived with the previous role mostly intact. SSblackbox.record_feedback("tally", "admin_verb", 1, "Check Contents") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_view_range() - set category = "Special Verbs" + set category = "Admin.Game" set name = "Change View Range" set desc = "switches between 1x and custom views" @@ -717,8 +717,7 @@ Traitors and the like can also be revived with the previous role mostly intact. SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Change View Range", "[view]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/admin_call_shuttle() - - set category = "Admin" + set category = "Admin.Events" set name = "Call Shuttle" if(EMERGENCY_AT_LEAST_DOCKED) @@ -738,7 +737,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return /client/proc/admin_cancel_shuttle() - set category = "Admin" + set category = "Admin.Events" set name = "Cancel Shuttle" if(!check_rights(0)) return @@ -754,9 +753,51 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(usr)] admin-recalled the emergency shuttle.") return +/* +/client/proc/admin_disable_shuttle() + set category = "Admin.Events" + set name = "Disable Shuttle" + if(!check_rights(R_ADMIN)) + return + if(SSshuttle.emergency.mode == SHUTTLE_DISABLED) + to_chat(usr, "Error, shuttle is already disabled.") + return + if(alert(src, "You sure?", "Confirm", "Yes", "No") != "Yes") + return + message_admins("[key_name_admin(usr)] disabled the shuttle.") + SSshuttle.lastMode = SSshuttle.emergency.mode + SSshuttle.lastCallTime = SSshuttle.emergency.timeLeft(1) + SSshuttle.adminEmergencyNoRecall = TRUE + SSshuttle.emergency.setTimer(0) + SSshuttle.emergency.mode = SHUTTLE_DISABLED + priority_announce("Warning: Emergency Shuttle uplink failure, shuttle disabled until further notice.", "Emergency Shuttle Uplink Alert", 'sound/misc/announce_dig.ogg') + +/client/proc/admin_enable_shuttle() + set category = "Admin - Events" + set category = "Admin.Events" + set name = "Enable Shuttle" + + if(!check_rights(R_ADMIN)) + return + if(SSshuttle.emergency.mode != SHUTTLE_DISABLED) + to_chat(usr, "Error, shuttle not disabled.") + return + if(alert(src, "You sure?", "Confirm", "Yes", "No") != "Yes") + return + message_admins("[key_name_admin(usr)] enabled the emergency shuttle.") + SSshuttle.adminEmergencyNoRecall = FALSE + SSshuttle.emergencyNoRecall = FALSE + if(SSshuttle.lastMode == SHUTTLE_DISABLED) //If everything goes to shit, fix it. + SSshuttle.lastMode = SHUTTLE_IDLE + SSshuttle.emergency.mode = SSshuttle.lastMode + if(SSshuttle.lastCallTime < 10 SECONDS && SSshuttle.lastMode != SHUTTLE_IDLE) + SSshuttle.lastCallTime = 10 SECONDS //Make sure no insta departures. + SSshuttle.emergency.setTimer(SSshuttle.lastCallTime) + priority_announce("Warning: Emergency Shuttle uplink reestablished, shuttle enabled.", "Emergency Shuttle Uplink Alert", 'sound/misc/announce_dig.ogg') +*/ /client/proc/everyone_random() - set category = "Fun" + set category = "Admin.Fun" set name = "Make Everyone Random" set desc = "Make everyone have a random appearance. You can only use this before rounds!" @@ -804,7 +845,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/admin_change_sec_level() - set category = "Special Verbs" + set category = "Admin.Events" set name = "Set Security Level" set desc = "Changes the security level. Announcement only, i.e. setting to Delta won't activate nuke" @@ -821,7 +862,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/toggle_nuke(obj/machinery/nuclearbomb/N in GLOB.nuke_list) set name = "Toggle Nuke" - set category = "Fun" + set category = "Admin.Events" set popup_menu = 0 if(!check_rights(R_DEBUG)) return @@ -1016,7 +1057,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits usr << browse(dat, "window=dressup;size=550x600") /client/proc/toggle_combo_hud() - set category = "Admin" + set category = "Admin.Game" set name = "Toggle Combo HUD" set desc = "Toggles the Admin Combo HUD (antag, sci, med, eng)" @@ -1051,7 +1092,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits /client/proc/run_weather() - set category = "Fun" + set category = "Admin.Events" set name = "Run Weather" set desc = "Triggers a weather on the z-level you choose." @@ -1075,7 +1116,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits SSblackbox.record_feedback("tally", "admin_verb", 1, "Run Weather") /client/proc/mass_zombie_infection() - set category = "Fun" + set category = "Admin.Fun" set name = "Mass Zombie Infection" set desc = "Infects all humans with a latent organ that will zombify \ them on death." @@ -1095,7 +1136,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits SSblackbox.record_feedback("tally", "admin_verb", 1, "Mass Zombie Infection") /client/proc/mass_zombie_cure() - set category = "Fun" + set category = "Admin.Fun" set name = "Mass Zombie Cure" set desc = "Removes the zombie infection from all humans, returning them to normal." if(!check_rights(R_ADMIN)) @@ -1113,7 +1154,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits SSblackbox.record_feedback("tally", "admin_verb", 1, "Mass Zombie Cure") /client/proc/polymorph_all() - set category = "Fun" + set category = "Admin.Fun" set name = "Polymorph All" set desc = "Applies the effects of the bolt of change to every single mob." @@ -1203,7 +1244,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggled Hub Visibility", "[GLOB.hub_visibility ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_toggle_fov() - set category = "Fun" + set category = "Admin.Fun" set name = "Enable/Disable Field of Vision" var/static/busy_toggling_fov = FALSE @@ -1256,7 +1297,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits /client/proc/smite(mob/living/carbon/human/target as mob) set name = "Smite" - set category = "Fun" + set category = "Admin.Fun" if(!check_rights(R_ADMIN) || !check_rights(R_FUN)) return diff --git a/code/modules/admin/verbs/shuttlepanel.dm b/code/modules/admin/verbs/shuttlepanel.dm index a80eafae02..7552936136 100644 --- a/code/modules/admin/verbs/shuttlepanel.dm +++ b/code/modules/admin/verbs/shuttlepanel.dm @@ -1,5 +1,5 @@ /datum/admins/proc/open_shuttlepanel() - set category = "Admin" + set category = "Admin.Events" set name = "Shuttle Manipulator" set desc = "Opens the shuttle manipulator UI." diff --git a/code/modules/admin/verbs/tripAI.dm b/code/modules/admin/verbs/tripAI.dm index 7742d6ea66..fc4270dd1b 100644 --- a/code/modules/admin/verbs/tripAI.dm +++ b/code/modules/admin/verbs/tripAI.dm @@ -1,5 +1,5 @@ /client/proc/triple_ai() - set category = "Fun" + set category = "Admin.Events" set name = "Create AI Triumvirate" if(SSticker.current_state > GAME_STATE_PREGAME) diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index b7eac1e591..354df5f592 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -12,7 +12,7 @@ /client/proc/centcom_podlauncher() //Creates a verb for admins to open up the ui set name = "Config/Launch Supplypod" set desc = "Configure and launch a CentCom supplypod full of whatever your heart desires!" - set category = "Admin" + set category = "Admin.Events" var/datum/centcom_podlauncher/plaunch = new(usr)//create the datum plaunch.ui_interact(usr)//datum has a tgui component, here we open the window diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index e16a491c61..a019ade471 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -386,7 +386,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS //Admin Preferences /client/proc/toggleadminhelpsound() set name = "Hear/Silence Adminhelps" - set category = "Preferences" + set category = "Preferences.Admin" set desc = "Toggle hearing a notification when admin PMs are received" if(!holder) return @@ -397,7 +397,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS /client/proc/toggleannouncelogin() set name = "Do/Don't Announce Login" - set category = "Preferences" + set category = "Preferences.Admin" set desc = "Toggle if you want an announcement to admins when you login during a round" if(!holder) return @@ -408,7 +408,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS /client/proc/toggle_hear_radio() set name = "Show/Hide Radio Chatter" - set category = "Preferences" + set category = "Preferences.Admin" set desc = "Toggle seeing radiochatter from nearby radios and speakers" if(!holder) return @@ -419,7 +419,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS /client/proc/deadchat() set name = "Show/Hide Deadchat" - set category = "Preferences" + set category = "Preferences.Admin" set desc ="Toggles seeing deadchat" prefs.chat_toggles ^= CHAT_DEAD prefs.save_preferences() @@ -428,7 +428,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS /client/proc/toggleprayers() set name = "Show/Hide Prayers" - set category = "Preferences" + set category = "Preferences.Admin" set desc = "Toggles seeing prayers" prefs.chat_toggles ^= CHAT_PRAYER prefs.save_preferences() diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index dd1ebd74f9..5a8325fd64 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -111,16 +111,16 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") /client/proc/set_ooc(newColor as color) set name = "Set Player OOC Color" set desc = "Modifies player OOC Color" - set category = "Fun" + set category = "Admin.Fun" GLOB.OOC_COLOR = sanitize_ooccolor(newColor) /client/proc/reset_ooc() set name = "Reset Player OOC Color" set desc = "Returns player OOC Color to default" - set category = "Fun" + set category = "Admin.Fun" GLOB.OOC_COLOR = null -/client/verb/colorooc() +/client/verb/colorooc() //this is admin and people who bought byond. set name = "Set Your OOC Color" set category = "Preferences" diff --git a/html/statbrowser.html b/html/statbrowser.html index fbdbb61449..3ae892880b 100644 --- a/html/statbrowser.html +++ b/html/statbrowser.html @@ -7,149 +7,172 @@
@@ -267,9 +290,9 @@ if (window.location) { }); */ // Status panel implementation ------------------------------------------------ -var status_tab_parts = ["loading..."]; +var status_tab_parts = ["Loading..."]; var current_tab = null; -var mc_tab_parts = [["loading...", ""]]; +var mc_tab_parts = [["Loading...", ""]]; var href_token = null; var spells = []; var spell_tabs = []; @@ -288,6 +311,8 @@ var statcontentdiv = document.querySelector('#statcontent'); var storedimages = []; function createStatusTab(name) { + if (name.indexOf(".") != -1) + name = name.split(".")[0]; if(document.getElementById(name) || name.trim() == "") return; if(!verb_tabs.includes(name) && !permanent_tabs.includes(name)) @@ -302,12 +327,8 @@ function createStatusTab(name) { B.className = "button"; //ORDERING ALPHABETICALLY B.style.order = name.charCodeAt(0); - if(name == "Status" || name == "MC") { - if(name == "Status") - B.style.order = 1; - else - B.style.order = 2; - } + if(name == "Status" || name == "MC") + B.style.order = name == "Status" ? 1 : 2; //END ORDERING menu.appendChild(B); SendTabToByond(name); @@ -327,6 +348,19 @@ function removeStatusTab(name) { under_menu.style.height = menu.clientHeight + 'px'; } +function sortVerbs() { + verbs.sort(function (a, b) { + var selector = a[0] == b[0] ? 1 : 0; + if (a[selector].toUpperCase() < b[selector].toUpperCase()) { + return 1; + } + else if (a[selector].toUpperCase() > b[selector].toUpperCase()) { + return -1; + } + return 0; + }) +} + window.onresize = function () { under_menu.style.height = menu.clientHeight + 'px'; } @@ -365,19 +399,19 @@ function check_verbs() { for(var v = verb_tabs.length - 1; v >= 0; v--){ verbs_cat_check(verb_tabs[v]); } - //checkStatusTab(); // removes any empty status tabs } function verbs_cat_check(cat) { + var tabCat = cat.indexOf(".") != -1 ? cat.split(".")[0] : cat; var verbs_in_cat = 0; var verbcat = ""; - if(!verb_tabs.includes(cat)){ - removeStatusTab(cat); + if(!verb_tabs.includes(tabCat)){ + removeStatusTab(tabCat); return; } for(var v = 0; v < verbs.length; v++){ var part = verbs[v]; - verbcat = part[0]; + verbcat = part[0].indexOf(".") != -1 ? part[0].split(".") : part[0]; if(verbcat != cat || verbcat.trim() == ""){ continue; } @@ -387,8 +421,8 @@ function verbs_cat_check(cat) { } } if(verbs_in_cat != 1) { - removeStatusTab(cat); - if(current_tab == cat) + removeStatusTab(tabCat); + if(current_tab == tabCat) tab_change("Status"); } } @@ -411,17 +445,20 @@ function add_verb_list(v) { to_add.sort(); // sort what we're adding for(var i = 0; i < to_add.length; i++) { var part = to_add[i]; + if (!part[0]) + continue; + var category = part[0].indexOf(".") == -1 ? part[0] : part[0].split(".")[0] if(findVerbindex(part[1], verbs)) continue; - if(verb_tabs.includes(part[0])){ + if(verb_tabs.includes(category)){ verbs.push(part); - if(current_tab == part[0]) { - draw_verbs(part[0]); // redraw if we added a verb to the tab we're currently in + if(current_tab == category) { + draw_verbs(category); // redraw if we added a verb to the tab we're currently in } - } else if(part[0]) { - verb_tabs.push(part[0]); + } else if(category) { + verb_tabs.push(category); verbs.push(part); - createStatusTab(part[0]); + createStatusTab(category); } } } @@ -432,7 +469,7 @@ function remove_verb_list(v) { remove_verb(to_remove[i]); } check_verbs(); - verbs.sort(); + sortVerbs(); if(verb_tabs.includes(current_tab)) draw_verbs(current_tab); } @@ -455,7 +492,7 @@ function init_verbs(c, v) { } if(v) { add_verb_list(v); - verbs.sort(); // sort them + sortVerbs(); // sort them if(do_update) { draw_verbs(current_tab); } @@ -586,7 +623,7 @@ function tab_change(tab) { }else if(tab == turfname) { draw_listedturf(); } else { - statcontentdiv[textContentKey] = "loading..."; + statcontentdiv[textContentKey] = "Loading..."; } window.location.href = "byond://winset?statbrowser.is-visible=true"; } @@ -912,29 +949,46 @@ function draw_spells(cat) { function draw_verbs(cat){ statcontentdiv[textContentKey] = ""; - var table = document.createElement("newdiv"); + var table = document.createElement("div"); + var additions = {}; // additional sub-categories to be rendered table.className = "grid-container"; - var command = ""; // typecast name to string - verbs.sort(); + sortVerbs(); verbs.reverse(); // sort verbs backwards before we draw - for(var i = verbs.length - 1; i >= 0; i--) { - var part = verbs[i]; // should be a list containing category and command - if(!part[1]) continue; - if(part[0] != cat){ - continue; + for (var i = 0; i < verbs.length; ++i) { + var part = verbs[i]; + var name = part[0]; + var command = part[1]; + + if (command && name.lastIndexOf(cat, 0) != -1 && (name.length == cat.length || name.charAt(cat.length) == ".")) { + var subCat = name.lastIndexOf(".") != -1 ? name.split(".")[1] : null; + if (subCat && !additions[subCat]) { + var newTable = document.createElement("div"); + newTable.className = "grid-container"; + additions[subCat] = newTable; + } + + var a = document.createElement("a"); + a.href = "byond://winset?command=" + command.replace(/\s/g, "-"); + a[textContentKey] = command; + a.className = "grid-item"; + (subCat ? additions[subCat] : table).appendChild(a); + } + } + + // Append base table to view + var content = document.getElementById("statcontent"); + content.appendChild(table); + + // Append additional sub-categories if relevant + for (var cat in additions) { + if (additions.hasOwnProperty(cat)) { + // do addition here + var header = document.createElement("h3"); + header[textContentKey] = cat; + content.appendChild(header); + content.appendChild(additions[cat]); } - if(part[0].trim() == ""){ - verbs.splice(i, 1); - continue; - } - command = part[1]; - var a = document.createElement("a"); - a.href = "byond://winset?command=" + command.replace(/\s/g, "-"); - a[textContentKey] = command; - a.className = "grid-item"; - table.appendChild(a); } - document.getElementById("statcontent").appendChild(table); } function set_theme(which) { From d6beeffad55e84c0fddc901d91c47d229eae79d0 Mon Sep 17 00:00:00 2001 From: Letter N <24603524+LetterN@users.noreply.github.com> Date: Sat, 3 Oct 2020 20:26:32 +0800 Subject: [PATCH 02/10] reverts this regression --- code/controllers/subsystem/dcs.dm | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm index 104c3eef31..6be5a4bdfa 100644 --- a/code/controllers/subsystem/dcs.dm +++ b/code/controllers/subsystem/dcs.dm @@ -39,11 +39,17 @@ PROCESSING_SUBSYSTEM_DEF(dcs) if(istext(key)) value = arguments[key] if(!(istext(key) || isnum(key))) - key = REF(key) + if(islist(key)) // CITADEL EDIT + key = deep_list2params(key) + else + key = REF(key) key = "[key]" // Key is stringified so numbers dont break things if(!isnull(value)) if(!(istext(value) || isnum(value))) - value = REF(value) + if(islist(value)) // CITADEL EDIT + value = deep_list2params(value) + else + value = REF(value) named_arguments["[key]"] = value else fullid += "[key]" From 16425912daf07876793a3782fb5bc7f7010dee8b Mon Sep 17 00:00:00 2001 From: The0bserver$H1wW<`ep6A}%zO!)$Y
zIC@Z6e>91M>&ajYzBT#VB0F{$1d)@cAotPj;G{kncc5{ I|7
z%~rAc$DrYXZl=iepr$!-6zA}Pv7t?o5oAA|*7m5oD-8UiC)nKp5?61TG2n`_#kTn2
z56zyBUUXiRgNU#bB2Vx`YTMlsTHCV#G7(GLYXx_(ql?SCm6a8B4Gk4tU0Df<*NTdY
zgo57F8wP^kzkiodRmBF*qIvoGz&@j5tjODkkRuk1K^2`$mz$L(0)Qc892|8MHR$KJ
zoeI1sYipm-i3O6}j~A+ebq#k`xoa375vn9B8(UTDl2anvPhTm|RTu_A@n+ViX|byB
zT3zkbX>CafUkt;UB*w#YO-S(kH~rUcifUnQG0sq}dvH?KS?CV*7%h}juPEj7=8eA4
zV+5PSrrO75_nY@KNOU&VMY!;A(;yAewWl%u_Z}zmpWPzKgdDGFlLV>-PBNV8E-VB4
zK8w-cYR2y*#-^qW4}t07@TZJ~dF!Ej4}3~>Iek*d-KL;%G%v*Qu?$(>78D|&re# >icv!0igD?
z0pA-R-P|1GyZ901s*`3@4rO|a9Z5lZdwXDo86`*0cYs^xC&U~btE82b3d_pSWMb#q
zeHtZHBGxJFT{46Q%{jCN(1we+G0m_TL;V4|R@~K<;|<0hiNMwAYUUdf->T2NKw= 4R3(2IVx`Va(VEdOq}Clb~45`KPG
zU+>m_XYh3w^&wO}wpY;?x5naDl%}`I59Cd_y!gU-+B^zo*zvF)4ThIB^JaV+&p7HI
zeC1Kabn_KH-1+V?Rb{TujZ~1ezX+0uN{r?;m>J02KVjPR?s3dLyRBx@1P1!wOGT_#
zu@?!}`N@y<;{a`Yo+cp!vQ>=Gz T-WZ_;4b9_)p+v?_mhyYg)V`BJUyJTr@CA2fJ!868OEJ+Qm7W*AqFIlCog58=8z>
zZV%i9OuW&7J%XUFo68xOa8xWhYfi!ts c_^C6C-)sc`$wm$R@rUXGT=mF<
zs&YWDLR3
z&xg7_j0+dl7gdbXr%`B|B;__M)UYHBq>3Gi<=CP5g$H86d|o@Y$Nw!-3AAg_l
z)xPuaFvs$%&epL3Jt^(N&%Q*po98iQXP6=p1NtoBwMD)&Ibcip!~SE9JUMLajJG?R
zHjbz_W<&n{yEcD+|B
n-h?qeLAt%-yet5RqrU5<2+{I*1o_~
z>rq1wy+`|m#=ltoMX0^7M7C_v!vj8afH99#qf3?Mo_1(t0io*)pD1UvQNi`F2WFhi
zt!#!i`E=I8xAdJdcyXToc@n?*j2ju!rWtLmW75Vao8dRtlMz9le$~Uf_Apu#)Ykg!
z8Y6F`A0