"
- for(var/i in 1 to held_items.len)
- var/obj/item/I = get_item_for_held_index(i)
-- dat += "| [get_held_index_name(i)]: | [(I && !(I.flags & ABSTRACT)) ? I : "Empty"] |
"
-+ dat += "| [get_held_index_name(i)]: | [(I && !(I.flags_1 & ABSTRACT_1)) ? I : "Empty"] |
"
- dat += "| |
"
-
-- dat += "| Back: | [(back && !(back.flags&ABSTRACT)) ? back : "Empty"]"
-+ dat += " |
| Back: | [(back && !(back.flags_1&ABSTRACT_1)) ? back : "Empty"]"
- if(has_breathable_mask && istype(back, /obj/item/tank))
- dat += " [internal ? "Disable Internals" : "Set Internals"]"
-
- dat += " |
| |
"
-
-- dat += "| Head: | [(head && !(head.flags&ABSTRACT)) ? head : "Empty"] |
"
-+ dat += "| Head: | [(head && !(head.flags_1&ABSTRACT_1)) ? head : "Empty"] |
"
-
- if(slot_wear_mask in obscured)
- dat += "| Mask: | Obscured |
"
- else
-- dat += "| Mask: | [(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "Empty"] |
"
-+ dat += "| Mask: | [(wear_mask && !(wear_mask.flags_1&ABSTRACT_1)) ? wear_mask : "Empty"] |
"
-
- if(slot_neck in obscured)
- dat += "| Neck: | Obscured |
"
- else
-- dat += "| Neck: | [(wear_neck && !(wear_neck.flags&ABSTRACT)) ? wear_neck : "Empty"] |
"
-+ dat += "| Neck: | [(wear_neck && !(wear_neck.flags_1&ABSTRACT_1)) ? wear_neck : "Empty"] |
"
-
- if(slot_glasses in obscured)
- dat += "| Eyes: | Obscured |
"
- else
-- dat += "| Eyes: | [(glasses && !(glasses.flags&ABSTRACT)) ? glasses : "Empty"] |
"
-+ dat += "| Eyes: | [(glasses && !(glasses.flags_1&ABSTRACT_1)) ? glasses : "Empty"] |
"
-
- if(slot_ears in obscured)
- dat += "| Ears: | Obscured |
"
- else
-- dat += "| Ears: | [(ears && !(ears.flags&ABSTRACT)) ? ears : "Empty"] |
"
-+ dat += "| Ears: | [(ears && !(ears.flags_1&ABSTRACT_1)) ? ears : "Empty"] |
"
-
- dat += "| |
"
-
-- dat += "| Exosuit: | [(wear_suit && !(wear_suit.flags&ABSTRACT)) ? wear_suit : "Empty"] |
"
-+ dat += "| Exosuit: | [(wear_suit && !(wear_suit.flags_1&ABSTRACT_1)) ? wear_suit : "Empty"] |
"
- if(wear_suit)
-- dat += "| ↳Suit Storage: | [(s_store && !(s_store.flags&ABSTRACT)) ? s_store : "Empty"]"
-+ dat += " |
| ↳Suit Storage: | [(s_store && !(s_store.flags_1&ABSTRACT_1)) ? s_store : "Empty"]"
- if(has_breathable_mask && istype(s_store, /obj/item/tank))
- dat += " [internal ? "Disable Internals" : "Set Internals"]"
- dat += " |
"
-@@ -186,30 +186,30 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
- if(slot_shoes in obscured)
- dat += "| Shoes: | Obscured |
"
- else
-- dat += "| Shoes: | [(shoes && !(shoes.flags&ABSTRACT)) ? shoes : "Empty"] |
"
-+ dat += "| Shoes: | [(shoes && !(shoes.flags_1&ABSTRACT_1)) ? shoes : "Empty"] |
"
-
- if(slot_gloves in obscured)
- dat += "| Gloves: | Obscured |
"
- else
-- dat += "| Gloves: | [(gloves && !(gloves.flags&ABSTRACT)) ? gloves : "Empty"] |
"
-+ dat += "| Gloves: | [(gloves && !(gloves.flags_1&ABSTRACT_1)) ? gloves : "Empty"] |
"
-
- if(slot_w_uniform in obscured)
- dat += "| Uniform: | Obscured |
"
- else
-- dat += "| Uniform: | [(w_uniform && !(w_uniform.flags&ABSTRACT)) ? w_uniform : "Empty"] |
"
-+ dat += "| Uniform: | [(w_uniform && !(w_uniform.flags_1&ABSTRACT_1)) ? w_uniform : "Empty"] |
"
-
- if((w_uniform == null && !(dna && dna.species.nojumpsuit)) || (slot_w_uniform in obscured))
- dat += "| ↳Pockets: |
"
- dat += "| ↳ID: |
"
- dat += "| ↳Belt: |
"
- else
-- dat += "| ↳Belt: | [(belt && !(belt.flags&ABSTRACT)) ? belt : "Empty"]"
-+ dat += " |
| ↳Belt: | [(belt && !(belt.flags_1&ABSTRACT_1)) ? belt : "Empty"]"
- if(has_breathable_mask && istype(belt, /obj/item/tank))
- dat += " [internal ? "Disable Internals" : "Set Internals"]"
- dat += " |
"
-- dat += "| ↳Pockets: | [(l_store && !(l_store.flags&ABSTRACT)) ? "Left (Full)" : "Left (Empty)"]"
-- dat += " [(r_store && !(r_store.flags&ABSTRACT)) ? "Right (Full)" : "Right (Empty)"] |
"
-- dat += "| ↳ID: | [(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "Empty"] |
"
-+ dat += "| ↳Pockets: | [(l_store && !(l_store.flags_1&ABSTRACT_1)) ? "Left (Full)" : "Left (Empty)"]"
-+ dat += " [(r_store && !(r_store.flags_1&ABSTRACT_1)) ? "Right (Full)" : "Right (Empty)"] |
"
-+ dat += "| ↳ID: | [(wear_id && !(wear_id.flags_1&ABSTRACT_1)) ? wear_id : "Empty"] |
"
-
- if(handcuffed)
- dat += "| Handcuffed: Remove |
"
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index 98dc9b33a1..1c44c96d64 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -143,19 +143,19 @@
var/protection = (prot["head"] + prot["arms"] + prot["feet"] + prot["legs"] + prot["groin"] + prot["chest"] + prot["hands"])/7
return protection
-/mob/living/carbon/human/can_use_guns(var/obj/item/G)
+/mob/living/carbon/human/can_use_guns(obj/item/G)
. = ..()
if(G.trigger_guard == TRIGGER_GUARD_NORMAL)
if(src.dna.check_mutation(HULK))
to_chat(src, "Your meaty finger is much too large for the trigger guard!")
- return 0
+ return FALSE
if(NOGUNS in src.dna.species.species_traits)
to_chat(src, "Your fingers don't fit in the trigger guard!")
- return 0
+ return FALSE
if(mind)
if(mind.martial_art && mind.martial_art.no_guns) //great dishonor to famiry
to_chat(src, "Use of ranged weaponry would bring dishonor to the clan.")
- return 0
+ return FALSE
return .
diff --git a/code/modules/mob/living/carbon/human/interactive.dm b/code/modules/mob/living/carbon/human/interactive.dm
index 18a4b3a7fb..b1eaa5349b 100644
--- a/code/modules/mob/living/carbon/human/interactive.dm
+++ b/code/modules/mob/living/carbon/human/interactive.dm
@@ -87,17 +87,28 @@
/// SNPC voice handling
/mob/living/carbon/human/interactive/proc/loadVoice()
- var/savefile/S = new /savefile("data/npc_saves/snpc.sav")
- S["knownStrings"] >> knownStrings
-
+ if(fexists("data/npc_saves/snpc.sav"))
+ var/savefile/S = new /savefile("data/npc_saves/snpc.sav")
+ S["knownStrings"] >> knownStrings
+ fdel(S)
+ else
+ var/json_file = file("data/npc_saves/snpc.json")
+ if(!fexists(json_file))
+ return
+ var/list/json = list()
+ json = json_decode(file2text(json_file))
+ knownStrings = json["knownStrings"]
if(isnull(knownStrings))
knownStrings = list()
/mob/living/carbon/human/interactive/proc/saveVoice()
if(voice_saved)
return
- var/savefile/S = new /savefile("data/npc_saves/snpc.sav")
- WRITE_FILE(S["knownStrings"], knownStrings)
+ var/json_file = file("data/npc_saves/snpc.json")
+ var/list/file_data = list()
+ file_data["knownStrings"] = knownStrings
+ fdel(json_file)
+ WRITE_FILE(json_file, json_encode(file_data))
//botPool funcs
/mob/living/carbon/human/interactive/proc/takeDelegate(mob/living/carbon/human/interactive/from,doReset=TRUE)
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index da99954f29..55203bf2e5 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -147,7 +147,7 @@
. = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should.
if(!. || !I)
return
- if(index && dna.species.mutanthands)
+ if(index && !QDELETED(src) && dna.species.mutanthands) //hand freed, fill with claws, skip if we're getting deleted.
put_in_hand(new dna.species.mutanthands(), index)
if(I == wear_suit)
if(s_store && invdrop)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 1fcf412fc8..9d8d2b704b 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -57,6 +57,8 @@
/mob/living/carbon/human/calculate_affecting_pressure(pressure)
if((wear_suit && (wear_suit.flags_1 & STOPSPRESSUREDMAGE_1)) && (head && (head.flags_1 & STOPSPRESSUREDMAGE_1)))
return ONE_ATMOSPHERE
+ if(ismob(loc))
+ return ONE_ATMOSPHERE
else
return pressure
@@ -242,6 +244,9 @@
if(dna && (RESISTCOLD in dna.species.species_traits))
return 1
+
+ if(ismob(loc))
+ return 1 //because lazy and being inside somemone insulates you from space
temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K.
var/thermal_protection_flags = get_cold_protection_flags(temperature)
diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
index f6784160a3..d15280790e 100644
--- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
@@ -1,4 +1,4 @@
-datum/species/mammal
+/datum/species/mammal
name = "Mammal"
id = "mammal"
default_color = "4B4B4B"
@@ -9,6 +9,8 @@ datum/species/mammal
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
roundstart = 1
+ liked_food = MEAT | FRIED
+ disliked_food = TOXIC
/datum/species/mammal/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
@@ -24,12 +26,14 @@ datum/species/mammal
say_mod = "chirps"
default_color = "BCAC9B"
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
- mutant_bodyparts = list("snout", "wings", "taur", "mam_tail", "mam_body_markings")
+ mutant_bodyparts = list("snout", "wings", "taur", "mam_tail", "mam_body_markings", "taur")
default_features = list("snout" = "Sharp", "wings" = "None", "taur" = "None", "mam_body_markings" = "Hawk")
attack_verb = "peck"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
roundstart = 1
+ liked_food = MEAT | FRUIT
+ disliked_food = TOXIC
/datum/species/avian/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
@@ -44,12 +48,14 @@ datum/species/mammal
id = "aquatic"
default_color = "BCAC9B"
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
- mutant_bodyparts = list("mam_tail", "mam_body_markings", "mam_ears")
+ mutant_bodyparts = list("mam_tail", "mam_body_markings", "mam_ears", "taur")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF","mam_tail" = "shark", "mam_body_markings" = "None", "mam_ears" = "None")
attack_verb = "bite"
attack_sound = 'sound/weapons/bite.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
roundstart = 1
+ liked_food = MEAT
+ disliked_food = TOXIC
/datum/species/aquatic/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
@@ -64,12 +70,14 @@ datum/species/mammal
id = "insect"
default_color = "BCAC9B"
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
- mutant_bodyparts = list("mam_body_markings", "mam_ears", "mam_tail")
+ mutant_bodyparts = list("mam_body_markings", "mam_ears", "mam_tail", "taur")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_body_markings" = "moth", "mam_tail" = "None", "mam_ears" = "None")
attack_verb = "flutter" //wat?
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
roundstart = 1
+ liked_food = MEAT | FRUIT
+ disliked_food = TOXIC
/datum/species/insect/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
@@ -98,6 +106,7 @@ datum/species/mammal
exotic_bloodtype = "L"
damage_overlay_type = "xeno"
roundstart = 1
+ liked_food = MEAT
//Praise the Omnissiah, A challange worthy of my skills - HS
@@ -229,7 +238,7 @@ datum/species/mammal
whitelist = list("rubyflamewing")
blacklisted = 0
-datum/species/guilmon
+/datum/species/guilmon
name = "Guilmon"
id = "guilmon"
default_color = "4B4B4B"
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index 1a37d1b0ed..3319895fe0 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -10,7 +10,7 @@
damage_overlay_type = ""
var/datum/action/innate/regenerate_limbs/regenerate_limbs
toxic_food = NONE
- liked_food = NONE
+ liked_food = MEAT
/datum/species/jelly/on_species_loss(mob/living/carbon/C)
if(regenerate_limbs)
diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm
index afd4d832da..4592d76138 100644
--- a/code/modules/mob/living/carbon/inventory.dm
+++ b/code/modules/mob/living/carbon/inventory.dm
@@ -95,24 +95,30 @@
if(I == head)
head = null
- head_update(I)
+ if(!QDELETED(src))
+ head_update(I)
else if(I == back)
back = null
- update_inv_back()
+ if(!QDELETED(src))
+ update_inv_back()
else if(I == wear_mask)
wear_mask = null
- wear_mask_update(I, toggle_off = 1)
+ if(!QDELETED(src))
+ wear_mask_update(I, toggle_off = 1)
if(I == wear_neck)
wear_neck = null
- update_inv_neck(I)
+ if(!QDELETED(src))
+ update_inv_neck(I)
else if(I == handcuffed)
handcuffed = null
if(buckled && buckled.buckle_requires_restraints)
buckled.unbuckle_mob(src)
- update_handcuffed()
+ if(!QDELETED(src))
+ update_handcuffed()
else if(I == legcuffed)
legcuffed = null
- update_inv_legcuffed()
+ if(!QDELETED(src))
+ update_inv_legcuffed()
//handle stuff to update when a mob equips/unequips a mask.
/mob/living/proc/wear_mask_update(obj/item/clothing/C, toggle_off = 1)
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index f1a6998523..d6d6084380 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -48,6 +48,8 @@
return
if(istype(loc, /obj/machinery/atmospherics/components/unary/cryo_cell))
return
+ if(istype(loc, /obj/item/device/dogborg/sleeper))
+ return
if(ismob(loc))
return
var/datum/gas_mixture/environment
diff --git a/code/modules/mob/living/carbon/monkey/combat.dm.rej b/code/modules/mob/living/carbon/monkey/combat.dm.rej
deleted file mode 100644
index 6a03552601..0000000000
--- a/code/modules/mob/living/carbon/monkey/combat.dm.rej
+++ /dev/null
@@ -1,19 +0,0 @@
-diff a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm (rejected hunks)
-@@ -153,7 +153,7 @@
- if(!locate(/obj/item) in held_items)
- best_force = 0
-
-- if(restrained() || blacklistItems[pickupTarget] || (pickupTarget && (pickupTarget.flags & NODROP)))
-+ if(restrained() || blacklistItems[pickupTarget] || (pickupTarget && (pickupTarget.flags_1 & NODROP_1)))
- pickupTarget = null
-
- if(!resisting && pickupTarget)
-@@ -274,7 +274,7 @@
- // check if target has a weapon
- var/obj/item/W
- for(var/obj/item/I in target.held_items)
-- if(!(I.flags & ABSTRACT))
-+ if(!(I.flags_1 & ABSTRACT_1))
- W = I
- break
-
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index ae984fa5c7..55aee04ff6 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -1,170 +1,173 @@
-
-
-/mob/living/carbon/monkey
-
-
-/mob/living/carbon/monkey/Life()
- set invisibility = 0
- set background = BACKGROUND_ENABLED
-
- if (notransform)
- return
-
- if(..())
-
- if(!client)
- if(stat == CONSCIOUS)
- if(!handle_combat())
- if(prob(33) && canmove && isturf(loc) && !pulledby)
+
+
+/mob/living/carbon/monkey
+
+
+/mob/living/carbon/monkey/Life()
+ set invisibility = 0
+ set background = BACKGROUND_ENABLED
+
+ if (notransform)
+ return
+
+ if(..())
+
+ if(!client)
+ if(stat == CONSCIOUS)
+ if(!handle_combat())
+ if(prob(33) && canmove && isturf(loc) && !pulledby)
step(src, pick(GLOB.cardinals))
- if(prob(1))
- emote(pick("scratch","jump","roll","tail"))
- else
- walk_to(src,0)
-
-/mob/living/carbon/monkey/handle_mutations_and_radiation()
-
- if (radiation)
- if (radiation > 100)
- if(!IsKnockdown())
- emote("collapse")
- Knockdown(200)
- to_chat(src, "You feel weak.")
-
- switch(radiation)
-
- if(50 to 75)
- if(prob(5))
- if(!IsKnockdown())
- emote("collapse")
- Knockdown(60)
- to_chat(src, "You feel weak.")
-
- if(75 to 100)
- if(prob(1))
- to_chat(src, "You mutate!")
- randmutb()
- emote("gasp")
- domutcheck()
- ..()
-
-/mob/living/carbon/monkey/handle_breath_temperature(datum/gas_mixture/breath)
- if(abs(310.15 - breath.temperature) > 50)
- switch(breath.temperature)
- if(-INFINITY to 120)
- adjustFireLoss(3)
- if(120 to 200)
- adjustFireLoss(1.5)
- if(200 to 260)
- adjustFireLoss(0.5)
- if(360 to 400)
- adjustFireLoss(2)
- if(400 to 1000)
- adjustFireLoss(3)
- if(1000 to INFINITY)
- adjustFireLoss(8)
-
-/mob/living/carbon/monkey/handle_environment(datum/gas_mixture/environment)
- if(!environment)
- return
-
- var/loc_temp = get_temperature(environment)
-
- if(stat != DEAD)
- natural_bodytemperature_stabilization()
-
- if(!on_fire) //If you're on fire, you do not heat up or cool down based on surrounding gases
- if(loc_temp < bodytemperature)
- bodytemperature += min(((loc_temp - bodytemperature) / BODYTEMP_COLD_DIVISOR), BODYTEMP_COOLING_MAX)
- else
- bodytemperature += min(((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR), BODYTEMP_HEATING_MAX)
-
- if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT)
- switch(bodytemperature)
- if(360 to 400)
- throw_alert("temp", /obj/screen/alert/hot, 1)
- apply_damage(HEAT_DAMAGE_LEVEL_1, BURN)
- if(400 to 460)
- throw_alert("temp", /obj/screen/alert/hot, 2)
- apply_damage(HEAT_DAMAGE_LEVEL_2, BURN)
- if(460 to INFINITY)
- throw_alert("temp", /obj/screen/alert/hot, 3)
- if(on_fire)
- apply_damage(HEAT_DAMAGE_LEVEL_3, BURN)
- else
- apply_damage(HEAT_DAMAGE_LEVEL_2, BURN)
-
- else if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
- if(!istype(loc, /obj/machinery/atmospherics/components/unary/cryo_cell))
- switch(bodytemperature)
- if(200 to 260)
- throw_alert("temp", /obj/screen/alert/cold, 1)
- apply_damage(COLD_DAMAGE_LEVEL_1, BURN)
- if(120 to 200)
- throw_alert("temp", /obj/screen/alert/cold, 2)
- apply_damage(COLD_DAMAGE_LEVEL_2, BURN)
- if(-INFINITY to 120)
- throw_alert("temp", /obj/screen/alert/cold, 3)
- apply_damage(COLD_DAMAGE_LEVEL_3, BURN)
- else
- clear_alert("temp")
-
- else
- clear_alert("temp")
-
- //Account for massive pressure differences
-
- var/pressure = environment.return_pressure()
- var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
- switch(adjusted_pressure)
- if(HAZARD_HIGH_PRESSURE to INFINITY)
- adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) )
- throw_alert("pressure", /obj/screen/alert/highpressure, 2)
- if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE)
- throw_alert("pressure", /obj/screen/alert/highpressure, 1)
- if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE)
- clear_alert("pressure")
- if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
- throw_alert("pressure", /obj/screen/alert/lowpressure, 1)
- else
- adjustBruteLoss( LOW_PRESSURE_DAMAGE )
- throw_alert("pressure", /obj/screen/alert/lowpressure, 2)
-
- return
-
-/mob/living/carbon/monkey/handle_random_events()
- if (prob(1) && prob(2))
- emote("scratch")
-
-/mob/living/carbon/monkey/has_smoke_protection()
- if(wear_mask)
+ if(prob(1))
+ emote(pick("scratch","jump","roll","tail"))
+ else
+ walk_to(src,0)
+
+/mob/living/carbon/monkey/handle_mutations_and_radiation()
+
+ if (radiation)
+ if (radiation > 100)
+ if(!IsKnockdown())
+ emote("collapse")
+ Knockdown(200)
+ to_chat(src, "You feel weak.")
+ if(radiation > 30 && prob((radiation - 30) * (radiation - 30) * 0.00002))
+ gorillize()
+ return
+ switch(radiation)
+
+ if(50 to 75)
+ if(prob(5))
+ if(!IsKnockdown())
+ emote("collapse")
+ Knockdown(60)
+ to_chat(src, "You feel weak.")
+
+ if(75 to 100)
+ if(prob(1))
+ to_chat(src, "You mutate!")
+ randmutb()
+ emote("gasp")
+ domutcheck()
+ ..()
+
+/mob/living/carbon/monkey/handle_breath_temperature(datum/gas_mixture/breath)
+ if(abs(310.15 - breath.temperature) > 50)
+ switch(breath.temperature)
+ if(-INFINITY to 120)
+ adjustFireLoss(3)
+ if(120 to 200)
+ adjustFireLoss(1.5)
+ if(200 to 260)
+ adjustFireLoss(0.5)
+ if(360 to 400)
+ adjustFireLoss(2)
+ if(400 to 1000)
+ adjustFireLoss(3)
+ if(1000 to INFINITY)
+ adjustFireLoss(8)
+
+/mob/living/carbon/monkey/handle_environment(datum/gas_mixture/environment)
+ if(!environment)
+ return
+
+ var/loc_temp = get_temperature(environment)
+
+ if(stat != DEAD)
+ natural_bodytemperature_stabilization()
+
+ if(!on_fire) //If you're on fire, you do not heat up or cool down based on surrounding gases
+ if(loc_temp < bodytemperature)
+ bodytemperature += min(((loc_temp - bodytemperature) / BODYTEMP_COLD_DIVISOR), BODYTEMP_COOLING_MAX)
+ else
+ bodytemperature += min(((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR), BODYTEMP_HEATING_MAX)
+
+ if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT)
+ switch(bodytemperature)
+ if(360 to 400)
+ throw_alert("temp", /obj/screen/alert/hot, 1)
+ apply_damage(HEAT_DAMAGE_LEVEL_1, BURN)
+ if(400 to 460)
+ throw_alert("temp", /obj/screen/alert/hot, 2)
+ apply_damage(HEAT_DAMAGE_LEVEL_2, BURN)
+ if(460 to INFINITY)
+ throw_alert("temp", /obj/screen/alert/hot, 3)
+ if(on_fire)
+ apply_damage(HEAT_DAMAGE_LEVEL_3, BURN)
+ else
+ apply_damage(HEAT_DAMAGE_LEVEL_2, BURN)
+
+ else if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
+ if(!istype(loc, /obj/machinery/atmospherics/components/unary/cryo_cell))
+ switch(bodytemperature)
+ if(200 to 260)
+ throw_alert("temp", /obj/screen/alert/cold, 1)
+ apply_damage(COLD_DAMAGE_LEVEL_1, BURN)
+ if(120 to 200)
+ throw_alert("temp", /obj/screen/alert/cold, 2)
+ apply_damage(COLD_DAMAGE_LEVEL_2, BURN)
+ if(-INFINITY to 120)
+ throw_alert("temp", /obj/screen/alert/cold, 3)
+ apply_damage(COLD_DAMAGE_LEVEL_3, BURN)
+ else
+ clear_alert("temp")
+
+ else
+ clear_alert("temp")
+
+ //Account for massive pressure differences
+
+ var/pressure = environment.return_pressure()
+ var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
+ switch(adjusted_pressure)
+ if(HAZARD_HIGH_PRESSURE to INFINITY)
+ adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) )
+ throw_alert("pressure", /obj/screen/alert/highpressure, 2)
+ if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE)
+ throw_alert("pressure", /obj/screen/alert/highpressure, 1)
+ if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE)
+ clear_alert("pressure")
+ if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
+ throw_alert("pressure", /obj/screen/alert/lowpressure, 1)
+ else
+ adjustBruteLoss( LOW_PRESSURE_DAMAGE )
+ throw_alert("pressure", /obj/screen/alert/lowpressure, 2)
+
+ return
+
+/mob/living/carbon/monkey/handle_random_events()
+ if (prob(1) && prob(2))
+ emote("scratch")
+
+/mob/living/carbon/monkey/has_smoke_protection()
+ if(wear_mask)
+
if(wear_mask.flags_1 & BLOCK_GAS_SMOKE_EFFECT_1)
- return 1
-
-/mob/living/carbon/monkey/handle_fire()
- . = ..()
- if(on_fire)
-
- //the fire tries to damage the exposed clothes and items
- var/list/burning_items = list()
- //HEAD//
- var/obj/item/clothing/head_clothes = null
- if(wear_mask)
- head_clothes = wear_mask
- if(wear_neck)
- head_clothes = wear_neck
- if(head)
- head_clothes = head
- if(head_clothes)
- burning_items += head_clothes
-
- if(back)
- burning_items += back
-
- for(var/X in burning_items)
- var/obj/item/I = X
- if(!(I.resistance_flags & FIRE_PROOF))
- I.take_damage(fire_stacks, BURN, "fire", 0)
-
- bodytemperature += BODYTEMP_HEATING_MAX
-
+ return 1
+
+/mob/living/carbon/monkey/handle_fire()
+ . = ..()
+ if(on_fire)
+
+ //the fire tries to damage the exposed clothes and items
+ var/list/burning_items = list()
+ //HEAD//
+ var/obj/item/clothing/head_clothes = null
+ if(wear_mask)
+ head_clothes = wear_mask
+ if(wear_neck)
+ head_clothes = wear_neck
+ if(head)
+ head_clothes = head
+ if(head_clothes)
+ burning_items += head_clothes
+
+ if(back)
+ burning_items += back
+
+ for(var/X in burning_items)
+ var/obj/item/I = X
+ if(!(I.resistance_flags & FIRE_PROOF))
+ I.take_damage(fire_stacks, BURN, "fire", 0)
+
+ bodytemperature += BODYTEMP_HEATING_MAX
+
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index fd7e087ac4..8adde0b69c 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -140,8 +140,8 @@
return 0
return 1
-/mob/living/carbon/monkey/can_use_guns(var/obj/item/G)
- return 1
+/mob/living/carbon/monkey/can_use_guns(obj/item/G)
+ return TRUE
/mob/living/carbon/monkey/angry
aggressive = TRUE
diff --git a/code/modules/mob/living/carbon/monkey/punpun.dm b/code/modules/mob/living/carbon/monkey/punpun.dm
index b56028634f..2cf821093d 100644
--- a/code/modules/mob/living/carbon/monkey/punpun.dm
+++ b/code/modules/mob/living/carbon/monkey/punpun.dm
@@ -24,7 +24,7 @@
..()
//These have to be after the parent new to ensure that the monkey
- //bodyparts are actually created before we try to equip things to
+ //bodyparts are actually created before we try to equip things to
//those slots
if(relic_hat)
equip_to_slot_or_del(new relic_hat, slot_head)
@@ -42,32 +42,40 @@
..()
/mob/living/carbon/monkey/punpun/proc/Read_Memory()
- var/savefile/S = new /savefile("data/npc_saves/Punpun.sav")
- S["ancestor_name"] >> ancestor_name
- S["ancestor_chain"] >> ancestor_chain
- S["relic_hat"] >> relic_hat
- S["relic_mask"] >> relic_mask
+ if(fexists("data/npc_saves/Punpun.sav")) //legacy compatability to convert old format to new
+ var/savefile/S = new /savefile("data/npc_saves/Punpun.sav")
+ S["ancestor_name"] >> ancestor_name
+ S["ancestor_chain"] >> ancestor_chain
+ S["relic_hat"] >> relic_hat
+ S["relic_mask"] >> relic_mask
+ fdel("data/npc_saves/Punpun.sav")
+ else
+ var/json_file = file("data/npc_saves/Punpun.json")
+ if(!fexists(json_file))
+ return
+ var/list/json = list()
+ json = json_decode(file2text(json_file))
+ ancestor_name = json["ancestor_name"]
+ ancestor_chain = json["ancestor_chain"]
+ relic_hat = json["relic_hat"]
+ relic_mask = json["relic_hat"]
/mob/living/carbon/monkey/punpun/proc/Write_Memory(dead, gibbed)
- var/savefile/S = new /savefile("data/npc_saves/Punpun.sav")
+ var/json_file = file("data/npc_saves/Punpun.json")
+ var/list/file_data = list()
if(gibbed)
- WRITE_FILE(S["ancestor_name"], null)
- WRITE_FILE(S["ancestor_chain"], 1)
- WRITE_FILE(S["relic_hat"], null)
- WRITE_FILE(S["relic_mask"], null)
- return
+ file_data["ancestor_name"] = null
+ file_data["ancestor_chain"] = null
+ file_data["relic_hat"] = null
+ file_data["relic_mask"] = null
if(dead)
- WRITE_FILE(S["ancestor_name"], ancestor_name)
- WRITE_FILE(S["ancestor_chain"], ancestor_chain + 1)
- if(!ancestor_name) //new monkey name this round
- WRITE_FILE(S["ancestor_name"], name)
- if(head)
- WRITE_FILE(S["relic_hat"], head.type)
- else
- WRITE_FILE(S["relic_hat"], null)
- if(wear_mask)
- WRITE_FILE(S["relic_mask"], wear_mask.type)
- else
- WRITE_FILE(S["relic_mask"], null)
+ file_data["ancestor_name"] = ancestor_name
+ file_data["ancestor_chain"] = ancestor_chain + 1
+ file_data["relic_hat"] = head ? head.type : null
+ file_data["relic_mask"] = wear_mask ? wear_mask.type : null
+ if(!ancestor_name)
+ file_data["ancestor_name"] = name
+ fdel(json_file)
+ WRITE_FILE(json_file, json_encode(json_file))
if(!dead)
memory_saved = 1
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 364c141abf..cd6231094c 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -241,7 +241,7 @@
return 1
/mob/living/proc/InCritical()
- return (health < 0 && health > -100 && stat == UNCONSCIOUS)
+ return (health < HEALTH_THRESHOLD_CRIT && health > HEALTH_THRESHOLD_DEAD && stat == UNCONSCIOUS)
//This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually
//affects them once clothing is factored in. ~Errorage
@@ -798,11 +798,11 @@
else
to_chat(src, "You don't have the dexterity to do this!")
return
-/mob/living/proc/can_use_guns(var/obj/item/G)
+/mob/living/proc/can_use_guns(obj/item/G)
if (G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser())
to_chat(src, "You don't have the dexterity to do this!")
- return 0
- return 1
+ return FALSE
+ return TRUE
/mob/living/carbon/proc/update_stamina()
if(staminaloss)
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index f924a82e2d..e3f7795f64 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -67,17 +67,15 @@
var/zone = ran_zone("chest", 65)//Hits a random part of the body, geared towards the chest
var/dtype = BRUTE
var/volume = I.get_volume_by_throwforce_and_or_w_class()
- if(istype(I, /obj/item/weapon)) //If the item is a weapon...
- var/obj/item/W = I
- dtype = W.damtype
+ dtype = I.damtype
- if (W.throwforce > 0) //If the weapon's throwforce is greater than zero...
- if (W.throwhitsound) //...and throwhitsound is defined...
- playsound(loc, W.throwhitsound, volume, 1, -1) //...play the weapon's throwhitsound.
- else if(W.hitsound) //Otherwise, if the weapon's hitsound is defined...
- playsound(loc, W.hitsound, volume, 1, -1) //...play the weapon's hitsound.
- else if(!W.throwhitsound) //Otherwise, if throwhitsound isn't defined...
- playsound(loc, 'sound/weapons/genhit.ogg',volume, 1, -1) //...play genhit.ogg.
+ if (I.throwforce > 0) //If the weapon's throwforce is greater than zero...
+ if (I.throwhitsound) //...and throwhitsound is defined...
+ playsound(loc, I.throwhitsound, volume, 1, -1) //...play the weapon's throwhitsound.
+ else if(I.hitsound) //Otherwise, if the weapon's hitsound is defined...
+ playsound(loc, I.hitsound, volume, 1, -1) //...play the weapon's hitsound.
+ else if(!I.throwhitsound) //Otherwise, if throwhitsound isn't defined...
+ playsound(loc, 'sound/weapons/genhit.ogg',volume, 1, -1) //...play genhit.ogg.
else if(!I.throwhitsound && I.throwforce > 0) //Otherwise, if the item doesn't have a throwhitsound and has a throwforce greater than zero...
playsound(loc, 'sound/weapons/genhit.ogg', volume, 1, -1)//...play genhit.ogg
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 6cb3a8daa9..f32ca97b09 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -75,3 +75,5 @@
var/datum/riding/riding_datum
var/datum/language/selected_default_language
+
+ var/last_words //used for database logging
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 68e2b150f3..cf1b95b98d 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -155,6 +155,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
var/message_len = length(message)
message = copytext(message, 1, health_diff) + "[message_len > health_diff ? "-.." : "..."]"
message = Ellipsis(message, 10, 1)
+ last_words = message
message_mode = MODE_WHISPER_CRIT
succumbed = TRUE
else
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm.rej b/code/modules/mob/living/silicon/robot/robot_modules.dm.rej
deleted file mode 100644
index ad89ae720b..0000000000
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm (rejected hunks)
-@@ -121,7 +121,7 @@
- if(I.loc != src)
- I.forceMove(src)
- modules += I
-- I.flags |= NODROP
-+ I.flags_1 |= NODROP_1
- I.mouse_opacity = MOUSE_OPACITY_OPAQUE
- if(nonstandard)
- added_modules += I
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 4d3c468191..562b51945b 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -36,11 +36,11 @@
var/d_hud = DATA_HUD_DIAGNOSTIC //There is only one kind of diag hud
var/law_change_counter = 0
- var/obj/machinery/camera/builtInCamera = null
- var/updating = FALSE //portable camera camerachunk update
+ var/obj/machinery/camera/builtInCamera = null
+ var/updating = FALSE //portable camera camerachunk update
/mob/living/silicon/Initialize()
- . = ..()
+ . = ..()
GLOB.silicon_mobs += src
var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC]
diag_hud.add_to_hud(src)
@@ -56,7 +56,7 @@
/mob/living/silicon/Destroy()
radio = null
aicamera = null
- QDEL_NULL(builtInCamera)
+ QDEL_NULL(builtInCamera)
GLOB.silicon_mobs -= src
return ..()
@@ -310,7 +310,7 @@
else //For department channels, if any, given by the internal radio.
for(var/key in GLOB.department_radio_keys)
if(GLOB.department_radio_keys[key] == Autochan)
- radiomod = key
+ radiomod = ":" + key
break
to_chat(src, "Automatic announcements [Autochan == "None" ? "will not use the radio." : "set to [Autochan]."]")
diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm
index 07222ade05..9c16c2a924 100644
--- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm
+++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm
@@ -28,3 +28,6 @@
. = ..()
var/newcolor = rgb(rand(0, 255), rand(0, 255), rand(0, 255))
add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY)
+
+/mob/living/simple_animal/butterfly/bee_friendly()
+ return TRUE //treaty signed at the Beeneeva convention
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index c762bca6a0..0e0b811810 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -113,14 +113,22 @@
..()
/mob/living/simple_animal/pet/cat/Runtime/proc/Read_Memory()
- var/savefile/S = new /savefile("data/npc_saves/Runtime.sav")
- S["family"] >> family
-
+ if(fexists("data/npc_saves/Runtime.sav")) //legacy compatability to convert old format to new
+ var/savefile/S = new /savefile("data/npc_saves/Runtime.sav")
+ S["family"] >> family
+ fdel("data/npc_saves/Runtime.sav")
+ else
+ var/json_file = file("data/npc_saves/Runtime.json")
+ if(!fexists(json_file))
+ return
+ var/list/json = list()
+ json = json_decode(file2text(json_file))
+ family = json["family"]
if(isnull(family))
family = list()
/mob/living/simple_animal/pet/cat/Runtime/proc/Write_Memory(dead)
- var/savefile/S = new /savefile("data/npc_saves/Runtime.sav")
+ var/json_file = file("data/npc_saves/Runtime.json")
family = list()
if(!dead)
for(var/mob/living/simple_animal/pet/cat/kitten/C in children)
@@ -130,7 +138,8 @@
family[C.type] += 1
else
family[C.type] = 1
- WRITE_FILE(S["family"], family)
+ fdel(json_file)
+ WRITE_FILE(json_file, json_encode(family))
memory_saved = 1
/mob/living/simple_animal/pet/cat/Runtime/proc/Deploy_The_Cats()
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index 5a6b00489e..244e77d33a 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -328,33 +328,44 @@
..()
/mob/living/simple_animal/pet/dog/corgi/Ian/proc/Read_Memory()
- var/savefile/S = new /savefile("data/npc_saves/Ian.sav")
- S["age"] >> age
- S["record_age"] >> record_age
- S["saved_head"] >> saved_head
-
+ if(fexists("data/npc_saves/Ian.sav")) //legacy compatability to convert old format to new
+ var/savefile/S = new /savefile("data/npc_saves/Ian.sav")
+ S["age"] >> age
+ S["record_age"] >> record_age
+ S["saved_head"] >> saved_head
+ fdel("data/npc_saves/Ian.sav")
+ else
+ var/json_file = file("data/npc_saves/Ian.json")
+ if(!fexists(json_file))
+ return
+ var/list/json = list()
+ json = json_decode(file2text(json_file))
+ age = json["age"]
+ record_age = json["record_age"]
+ saved_head = json["saved_head"]
if(isnull(age))
age = 0
if(isnull(record_age))
record_age = 1
-
if(saved_head)
place_on_head(new saved_head)
/mob/living/simple_animal/pet/dog/corgi/Ian/proc/Write_Memory(dead)
- var/savefile/S = new /savefile("data/npc_saves/Ian.sav")
+ var/json_file = file("data/npc_saves/Ian.json")
+ var/list/file_data = list()
if(!dead)
- WRITE_FILE(S["age"], age + 1)
+ file_data["age"] = age + 1
if((age + 1) > record_age)
- WRITE_FILE(S["record_age"], record_age + 1)
+ file_data["record_age"] = record_age + 1
if(inventory_head)
- WRITE_FILE(S["saved_head"], inventory_head.type)
+ file_data["saved_head"] = inventory_head.type
else
- WRITE_FILE(S["age"], 0)
- WRITE_FILE(S["saved_head"], null)
+ file_data["age"] = 0
+ file_data["saved_head"] = null
+ fdel(json_file)
+ WRITE_FILE(json_file, json_encode(file_data))
memory_saved = 1
-
/mob/living/simple_animal/pet/dog/corgi/Ian/Life()
..()
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index 21a3347d3d..1f1f937d9a 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -490,7 +490,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
return
used = TRUE
to_chat(user, "[use_message]")
- var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the [mob_name] of [user.real_name]?", ROLE_PAI, null, FALSE, 100)
+ var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the [mob_name] of [user.real_name]?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_HOLOPARASITE)
var/mob/dead/observer/theghost = null
if(candidates.len)
diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/emotes.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/emotes.dm
new file mode 100644
index 0000000000..3af442930e
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/gorilla/emotes.dm
@@ -0,0 +1,11 @@
+/datum/emote/sound/gorilla
+ mob_type_allowed_typecache = /mob/living/simple_animal/hostile/gorilla
+ mob_type_blacklist_typecache = list()
+
+/datum/emote/sound/gorilla/ooga
+ key = "ooga"
+ key_third_person = "oogas"
+ message = "oogas."
+ message_param = "oogas at %t."
+ sound = "sound/creatures/gorilla.ogg"
+
diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
new file mode 100644
index 0000000000..b697473787
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
@@ -0,0 +1,77 @@
+#define GORILLA_HANDS_LAYER 1
+#define GORILLA_TOTAL_LAYERS 1
+
+/mob/living/simple_animal/hostile/gorilla
+ name = "Gorilla"
+ desc = "A ground-dwelling, predominantly herbivorous ape that inhabits the forests of central Africa."
+ icon = 'icons/mob/gorilla.dmi'
+ icon_state = "crawling"
+ icon_state = "crawling"
+ icon_living = "crawling"
+ icon_dead = "dead"
+ speak_chance = 80
+ maxHealth = 220
+ health = 220
+ loot = list(/obj/effect/gibspawner/generic)
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/gorilla = 4)
+ response_help = "prods"
+ response_disarm = "challenges"
+ response_harm = "thumps"
+ speed = 1
+ melee_damage_lower = 15
+ melee_damage_upper = 18
+ damage_coeff = list(BRUTE = 1, BURN = 1.5, TOX = 1.5, CLONE = 0, STAMINA = 0, OXY = 1.5)
+ obj_damage = 20
+ environment_smash = 2
+ attacktext = "pummels"
+ attack_sound = 'sound/weapons/punch1.ogg'
+ dextrous = TRUE
+ possible_a_intents = list(INTENT_HELP, INTENT_GRAB, INTENT_DISARM, INTENT_HARM)
+ faction = list("jungle")
+ robust_searching = TRUE
+ stat_attack = UNCONSCIOUS
+ minbodytemp = 270
+ maxbodytemp = 350
+ var/list/gorilla_overlays[GORILLA_TOTAL_LAYERS]
+
+// Gorillas like to dismember limbs from unconcious mobs.
+// Returns null when the target is not an unconcious carbon mob; a list of limbs (possibly empty) otherwise.
+/mob/living/simple_animal/hostile/gorilla/proc/target_bodyparts(atom/the_target)
+ var/list/parts = list()
+ if(iscarbon(the_target))
+ var/mob/living/carbon/C = the_target
+ if(C.stat >= UNCONSCIOUS)
+ for(var/X in C.bodyparts)
+ var/obj/item/bodypart/BP = X
+ if(BP.body_part != HEAD && BP.body_part != CHEST)
+ if(BP.dismemberable)
+ parts += BP
+ return parts
+
+/mob/living/simple_animal/hostile/gorilla/AttackingTarget()
+ var/list/parts = target_bodyparts(target)
+ if(parts)
+ if(!parts.len)
+ return FALSE
+ var/obj/item/bodypart/BP = pick(parts)
+ BP.dismember()
+ return ..()
+ . = ..()
+ if(. && isliving(target))
+ var/mob/living/L = target
+ if(prob(80))
+ var/atom/throw_target = get_edge_target_turf(L, dir)
+ L.throw_at(throw_target, rand(1,2), 7, src)
+ else
+ L.Knockdown(20)
+ visible_message("[src] knocks [L] down!")
+
+/mob/living/simple_animal/hostile/gorilla/CanAttack(atom/the_target)
+ var/list/parts = target_bodyparts(target)
+ return ..() && !istype(the_target, /mob/living/carbon/monkey) && (!parts || parts.len > 3)
+
+/mob/living/simple_animal/hostile/gorilla/handle_automated_speech(override)
+ if(speak_chance && (override || prob(speak_chance)))
+ playsound(src, "sound/creatures/gorilla.ogg", 200)
+ ..()
+
diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm
new file mode 100644
index 0000000000..b3e0f3b658
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm
@@ -0,0 +1,55 @@
+/mob/living/simple_animal/hostile/gorilla/proc/apply_overlay(cache_index)
+ . = gorilla_overlays[cache_index]
+ if(.)
+ add_overlay(.)
+
+/mob/living/simple_animal/hostile/gorilla/proc/remove_overlay(cache_index)
+ var/I = gorilla_overlays[cache_index]
+ if(I)
+ cut_overlay(I)
+ gorilla_overlays[cache_index] = null
+
+/mob/living/simple_animal/hostile/gorilla/update_inv_hands()
+ cut_overlays("standing_overlay")
+ remove_overlay(GORILLA_HANDS_LAYER)
+
+ var/standing = FALSE
+ for(var/I in held_items)
+ if(I)
+ standing = TRUE
+ break
+ if(!standing)
+ if(stat != DEAD)
+ icon_state = "crawling"
+ speed = 1
+ return ..()
+ if(stat != DEAD)
+ icon_state = "standing"
+ speed = 3 // Gorillas are slow when standing up.
+
+ var/list/hands_overlays = list()
+
+ var/obj/item/l_hand = get_item_for_held_index(1)
+ var/obj/item/r_hand = get_item_for_held_index(2)
+
+ if(r_hand)
+ var/r_state = r_hand.item_state ? r_hand.item_state : r_hand.icon_state
+ var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(state = r_state, default_layer = GORILLA_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE)
+ r_hand_overlay.pixel_y -= 1
+ hands_overlays += r_hand_overlay
+
+ if(l_hand)
+ var/l_state = l_hand.item_state ? l_hand.item_state : l_hand.icon_state
+ var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(state = l_state, default_layer = GORILLA_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE)
+ l_hand_overlay.pixel_y -= 1
+ hands_overlays += l_hand_overlay
+
+ if(hands_overlays.len)
+ gorilla_overlays[GORILLA_HANDS_LAYER] = hands_overlays
+ apply_overlay(GORILLA_HANDS_LAYER)
+ add_overlay("standing_overlay")
+ return ..()
+
+/mob/living/simple_animal/hostile/gorilla/regenerate_icons()
+ update_inv_hands()
+
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/_jungle_mobs.dm b/code/modules/mob/living/simple_animal/hostile/jungle/_jungle_mobs.dm
new file mode 100644
index 0000000000..c337344c90
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/_jungle_mobs.dm
@@ -0,0 +1,17 @@
+/mob/living/simple_animal/hostile/jungle
+ vision_range = 5
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ faction = list("jungle")
+ weather_immunities = list("acid")
+ obj_damage = 30
+ environment_smash = ENVIRONMENT_SMASH_WALLS
+ minbodytemp = 0
+ maxbodytemp = 450
+ response_help = "pokes"
+ response_disarm = "shoves"
+ response_harm = "strikes"
+ status_flags = NONE
+ a_intent = INTENT_HARM
+ see_in_dark = 4
+ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
+ mob_size = MOB_SIZE_LARGE
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
new file mode 100644
index 0000000000..491aca3233
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
@@ -0,0 +1,263 @@
+#define PLAYER_HOP_DELAY 25
+
+//Huge, carnivorous toads that spit an immobilizing toxin at its victims before leaping onto them.
+//It has no melee attack, and its damage comes from the toxin in its bubbles and its crushing leap.
+//Its eyes will turn red to signal an imminent attack!
+/mob/living/simple_animal/hostile/jungle/leaper
+ name = "leaper"
+ desc = "Commonly referred to as 'leapers', the Geron Toad is a massive beast that spits out highly pressurized bubbles containing a unique toxin, knocking down its prey and then crushing it with its girth."
+ icon = 'icons/mob/jungle/leaper.dmi'
+ icon_state = "leaper"
+ icon_living = "leaper"
+ icon_dead = "leaper_dead"
+ maxHealth = 300
+ health = 300
+ ranged = TRUE
+ projectiletype = /obj/item/projectile/leaper
+ projectilesound = 'sound/weapons/pierce.ogg'
+ ranged_cooldown_time = 30
+ pixel_x = -16
+ layer = LARGE_MOB_LAYER
+ speed = 10
+ stat_attack = 1
+ robust_searching = 1
+ var/hopping = FALSE
+ var/hop_cooldown = 0 //Strictly for player controlled leapers
+ var/projectile_ready = FALSE //Stopping AI leapers from firing whenever they want, and only doing it after a hop has finished instead
+
+/obj/item/projectile/leaper
+ name = "leaper bubble"
+ icon_state = "leaper"
+ knockdown = 50
+ damage = 0
+ range = 7
+ hitsound = 'sound/effects/snap.ogg'
+ nondirectional_sprite = TRUE
+ impact_effect_type = /obj/effect/temp_visual/leaper_projectile_impact
+
+/obj/item/projectile/leaper/on_hit(atom/target, blocked = FALSE)
+ ..()
+ if(iscarbon(target))
+ var/mob/living/carbon/C = target
+ C.reagents.add_reagent("leaper_venom", 5)
+ return
+ if(isanimal(target))
+ var/mob/living/simple_animal/L = target
+ L.adjustHealth(25)
+
+/obj/item/projectile/leaper/on_range()
+ var/turf/T = get_turf(src)
+ ..()
+ new /obj/structure/leaper_bubble(T)
+
+/obj/effect/temp_visual/leaper_projectile_impact
+ name = "leaper bubble"
+ icon = 'icons/obj/projectiles.dmi'
+ icon_state = "leaper_bubble_pop"
+ layer = ABOVE_ALL_MOB_LAYER
+ duration = 3
+
+/obj/effect/temp_visual/leaper_projectile_impact/Initialize()
+ . = ..()
+ new /obj/effect/decal/cleanable/leaper_sludge(get_turf(src))
+
+/obj/effect/decal/cleanable/leaper_sludge
+ name = "leaper sludge"
+ desc = "A small pool of sludge, containing trace amounts of leaper venom."
+ icon = 'icons/effects/tomatodecal.dmi'
+ icon_state = "tomato_floor1"
+
+/obj/structure/leaper_bubble
+ name = "leaper bubble"
+ desc = "A floating bubble containing leaper venom. The contents are under a surprising amount of pressure."
+ icon = 'icons/obj/projectiles.dmi'
+ icon_state = "leaper"
+ max_integrity = 10
+ density = FALSE
+
+/obj/structure/leaper_bubble/Initialize()
+ . = ..()
+ float(on = TRUE)
+ QDEL_IN(src, 100)
+
+/obj/structure/leaper_bubble/Destroy()
+ new /obj/effect/temp_visual/leaper_projectile_impact(get_turf(src))
+ playsound(src,'sound/effects/snap.ogg',50, 1, -1)
+ return ..()
+
+/obj/structure/leaper_bubble/Crossed(atom/movable/AM)
+ if(isliving(AM))
+ var/mob/living/L = AM
+ if(!istype(L, /mob/living/simple_animal/hostile/jungle/leaper))
+ playsound(src,'sound/effects/snap.ogg',50, 1, -1)
+ L.Knockdown(50)
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ C.reagents.add_reagent("leaper_venom", 5)
+ if(isanimal(L))
+ var/mob/living/simple_animal/A = L
+ A.adjustHealth(25)
+ qdel(src)
+ return ..()
+
+/datum/reagent/toxin/leaper_venom
+ name = "Leaper venom"
+ id = "leaper_venom"
+ description = "A toxin spat out by leapers that, while harmless in small doses, quickly creates a toxic reaction if too much is in the body."
+ color = "#801E28" // rgb: 128, 30, 40
+ toxpwr = 0
+ taste_description = "french cuisine"
+ taste_mult = 1.3
+
+/datum/reagent/toxin/leaper_venom/on_mob_life(mob/living/M)
+ if(volume >= 10)
+ M.adjustToxLoss(5, 0)
+ ..()
+
+/obj/effect/temp_visual/leaper_crush
+ name = "grim tidings"
+ desc = "Incoming leaper!"
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "lily_pad"
+ layer = BELOW_MOB_LAYER
+ pixel_x = -32
+ pixel_y = -32
+ duration = 30
+
+/mob/living/simple_animal/hostile/jungle/leaper/Initialize()
+ . = ..()
+ verbs -= /mob/living/verb/pulled
+
+/mob/living/simple_animal/hostile/jungle/leaper/CtrlClickOn(atom/A)
+ face_atom(A)
+ target = A
+ if(!isturf(loc))
+ return
+ if(next_move > world.time)
+ return
+ if(hopping)
+ return
+ if(isliving(A))
+ var/mob/living/L = A
+ if(L.incapacitated())
+ BellyFlop()
+ return
+ if(hop_cooldown <= world.time)
+ Hop(player_hop = TRUE)
+
+/mob/living/simple_animal/hostile/jungle/leaper/AttackingTarget()
+ if(isliving(target))
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/jungle/leaper/handle_automated_action()
+ if(hopping || projectile_ready)
+ return
+ . = ..()
+ if(target)
+ if(isliving(target))
+ var/mob/living/L = target
+ if(L.incapacitated())
+ BellyFlop()
+ return
+ if(!hopping)
+ Hop()
+
+/mob/living/simple_animal/hostile/jungle/leaper/Life()
+ . = ..()
+ update_icons()
+
+/mob/living/simple_animal/hostile/jungle/leaper/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
+ if(prob(33) && !ckey)
+ ranged_cooldown = 0 //Keeps em on their toes instead of a constant rotation
+ ..()
+
+/mob/living/simple_animal/hostile/jungle/leaper/OpenFire()
+ face_atom(target)
+ if(ranged_cooldown <= world.time)
+ if(ckey)
+ if(hopping)
+ return
+ if(isliving(target))
+ var/mob/living/L = target
+ if(L.incapacitated())
+ return //No stunlocking. Hop on them after you stun them, you donk.
+ if(AIStatus == AI_ON && !projectile_ready && !ckey)
+ return
+ . = ..(target)
+ projectile_ready = FALSE
+ update_icons()
+
+/mob/living/simple_animal/hostile/jungle/leaper/proc/Hop(player_hop = FALSE)
+ if(z != target.z)
+ return
+ hopping = TRUE
+ density = FALSE
+ pass_flags |= PASSMOB
+ notransform = TRUE
+ var/turf/new_turf = locate((target.x + rand(-3,3)),(target.y + rand(-3,3)),target.z)
+ if(player_hop)
+ new_turf = get_turf(target)
+ hop_cooldown = world.time + PLAYER_HOP_DELAY
+ if(AIStatus == AI_ON && ranged_cooldown <= world.time)
+ projectile_ready = TRUE
+ update_icons()
+ throw_at(new_turf, max(3,get_dist(src,new_turf)), 1, src, FALSE, callback = CALLBACK(src, .FinishHop))
+
+/mob/living/simple_animal/hostile/jungle/leaper/proc/FinishHop()
+ density = TRUE
+ notransform = FALSE
+ pass_flags &= ~PASSMOB
+ hopping = FALSE
+ playsound(src.loc, 'sound/effects/meteorimpact.ogg', 100, 1)
+ if(target && AIStatus == AI_ON && projectile_ready && !ckey)
+ face_atom(target)
+ addtimer(CALLBACK(src, .proc/OpenFire, target), 5)
+
+/mob/living/simple_animal/hostile/jungle/leaper/proc/BellyFlop()
+ var/turf/new_turf = get_turf(target)
+ hopping = TRUE
+ notransform = TRUE
+ new /obj/effect/temp_visual/leaper_crush(new_turf)
+ addtimer(CALLBACK(src, .proc/BellyFlopHop, new_turf), 30)
+
+/mob/living/simple_animal/hostile/jungle/leaper/proc/BellyFlopHop(turf/T)
+ density = FALSE
+ throw_at(T, get_dist(src,T),1,src, FALSE, callback = CALLBACK(src, .proc/Crush))
+
+/mob/living/simple_animal/hostile/jungle/leaper/proc/Crush()
+ hopping = FALSE
+ density = TRUE
+ notransform = FALSE
+ playsound(src, 'sound/effects/meteorimpact.ogg', 200, 1)
+ for(var/mob/living/L in orange(1, src))
+ L.adjustBruteLoss(35)
+ if(!QDELETED(L)) // Some mobs are deleted on death
+ var/throw_dir = get_dir(src, L)
+ if(L.loc == loc)
+ throw_dir = pick(GLOB.alldirs)
+ var/throwtarget = get_edge_target_turf(src, throw_dir)
+ L.throw_at(throwtarget, 3, 1)
+ visible_message("[L] is thrown clear of [src]!")
+ if(ckey)//Lessens ability to chain stun as a player
+ ranged_cooldown = ranged_cooldown_time + world.time
+ update_icons()
+
+/mob/living/simple_animal/hostile/jungle/leaper/Goto()
+ return
+
+/mob/living/simple_animal/hostile/jungle/leaper/throw_impact()
+ return
+
+/mob/living/simple_animal/hostile/jungle/leaper/update_icons()
+ . = ..()
+ if(stat)
+ icon_state = "leaper_dead"
+ return
+ if(ranged_cooldown <= world.time)
+ if(AIStatus == AI_ON && projectile_ready || ckey)
+ icon_state = "leaper_alert"
+ return
+ icon_state = "leaper"
+
+#undef PLAYER_HOP_DELAY
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm
new file mode 100644
index 0000000000..be51502a96
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm
@@ -0,0 +1,65 @@
+//Large and powerful, but timid. It won't engage anything above 50 health, or anything without legcuffs.
+//It can fire fleshy snares that legcuff anyone that it hits, making them look especially tasty to the arachnid.
+/mob/living/simple_animal/hostile/jungle/mega_arachnid
+ name = "mega arachnid"
+ desc = "Though physically imposing, it prefers to ambush its prey, and it will only engage with an already crippled opponent."
+ icon = 'icons/mob/jungle/arachnid.dmi'
+ icon_state = "arachnid"
+ icon_living = "arachnid"
+ icon_dead = "arachnid_dead"
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+ maxHealth = 300
+ health = 300
+ speed = 1
+ ranged = 1
+ pixel_x = -16
+ move_to_delay = 10
+ aggro_vision_range = 9
+ speak_emote = list("chitters")
+ attack_sound = 'sound/weapons/bladeslice.ogg'
+ ranged_cooldown_time = 60
+ projectiletype = /obj/item/projectile/mega_arachnid
+ projectilesound = 'sound/weapons/pierce.ogg'
+ alpha = 50
+
+/mob/living/simple_animal/hostile/jungle/mega_arachnid/Life()
+ ..()
+ if(target && ranged_cooldown > world.time && iscarbon(target))
+ var/mob/living/carbon/C = target
+ if(!C.legcuffed && C.health < 50)
+ retreat_distance = 9
+ minimum_distance = 9
+ alpha = 125
+ return
+ retreat_distance = 0
+ minimum_distance = 0
+ alpha = 255
+
+
+/mob/living/simple_animal/hostile/jungle/mega_arachnid/Aggro()
+ ..()
+ alpha = 255
+
+/mob/living/simple_animal/hostile/jungle/mega_arachnid/LoseAggro()
+ ..()
+ alpha = 50
+
+/obj/item/projectile/mega_arachnid
+ name = "flesh snare"
+ nodamage = 1
+ damage = 0
+ icon_state = "tentacle_end"
+
+/obj/item/projectile/mega_arachnid/on_hit(atom/target, blocked = FALSE)
+ if(iscarbon(target) && blocked < 100)
+ var/obj/item/restraints/legcuffs/beartrap/mega_arachnid/B = new /obj/item/restraints/legcuffs/beartrap/mega_arachnid(get_turf(target))
+ B.Crossed(target)
+ ..()
+
+/obj/item/restraints/legcuffs/beartrap/mega_arachnid
+ name = "fleshy restraints"
+ desc = "Used by mega arachnids to immobilize their prey."
+ flags_1 = DROPDEL_1
+ icon_state = "tentacle_end"
+ icon = 'icons/obj/projectiles.dmi'
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm
new file mode 100644
index 0000000000..05896c80b5
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm
@@ -0,0 +1,224 @@
+#define MOOK_ATTACK_NEUTRAL 0
+#define MOOK_ATTACK_WARMUP 1
+#define MOOK_ATTACK_ACTIVE 2
+#define MOOK_ATTACK_RECOVERY 3
+#define ATTACK_INTERMISSION_TIME 5
+
+//Fragile but highly aggressive wanderers that pose a large threat in numbers.
+//They'll attempt to leap at their target from afar using their hatchets.
+/mob/living/simple_animal/hostile/jungle/mook
+ name = "wanderer"
+ desc = "This unhealthy looking primitive is wielding a rudimentary hatchet, swinging it with wild abandon. One isn't much of a threat, but in numbers they can quickly overwhelm a superior opponent."
+ icon = 'icons/mob/jungle/mook.dmi'
+ icon_state = "mook"
+ icon_living = "mook"
+ icon_dead = "mook_dead"
+ pixel_x = -16
+ maxHealth = 45
+ health = 45
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+ pixel_y = -8
+ ranged = TRUE
+ ranged_cooldown_time = 10
+ pass_flags = LETPASSTHROW
+ robust_searching = TRUE
+ stat_attack = UNCONSCIOUS
+ attack_sound = 'sound/weapons/rapierhit.ogg'
+ death_sound = 'sound/voice/mook_death.ogg'
+ aggro_vision_range = 15 //A little more aggressive once in combat to balance out their really low HP
+ var/attack_state = MOOK_ATTACK_NEUTRAL
+ var/struck_target_leap = FALSE
+
+/mob/living/simple_animal/hostile/jungle/mook/CanPass(atom/movable/O)
+ if(istype(O, /mob/living/simple_animal/hostile/jungle/mook))
+ var/mob/living/simple_animal/hostile/jungle/mook/M = O
+ if(M.attack_state == MOOK_ATTACK_ACTIVE && M.throwing)
+ return TRUE
+ return ..()
+
+/mob/living/simple_animal/hostile/jungle/mook/death()
+ desc = "A deceased primitive. Upon closer inspection, it was suffering from severe cellular degeneration and its garments are machine made..."//Can you guess the twist
+ return ..()
+
+/mob/living/simple_animal/hostile/jungle/mook/AttackingTarget()
+ if(isliving(target))
+ if(ranged_cooldown <= world.time && attack_state == MOOK_ATTACK_NEUTRAL)
+ var/mob/living/L = target
+ if(L.incapacitated())
+ WarmupAttack(forced_slash_combo = TRUE)
+ return
+ WarmupAttack()
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/jungle/mook/Goto()
+ if(attack_state != MOOK_ATTACK_NEUTRAL)
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/jungle/mook/Move()
+ if(attack_state == MOOK_ATTACK_WARMUP || attack_state == MOOK_ATTACK_RECOVERY)
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/jungle/mook/proc/WarmupAttack(forced_slash_combo = FALSE)
+ if(attack_state == MOOK_ATTACK_NEUTRAL && target)
+ attack_state = MOOK_ATTACK_WARMUP
+ walk(src,0)
+ update_icons()
+ if(prob(50) && get_dist(src,target) <= 3 || forced_slash_combo)
+ addtimer(CALLBACK(src, .proc/SlashCombo), ATTACK_INTERMISSION_TIME)
+ return
+ addtimer(CALLBACK(src, .proc/LeapAttack), ATTACK_INTERMISSION_TIME + rand(0,3))
+ return
+ attack_state = MOOK_ATTACK_RECOVERY
+ ResetNeutral()
+
+/mob/living/simple_animal/hostile/jungle/mook/proc/SlashCombo()
+ if(attack_state == MOOK_ATTACK_WARMUP && !stat)
+ attack_state = MOOK_ATTACK_ACTIVE
+ update_icons()
+ SlashAttack()
+ addtimer(CALLBACK(src, .proc/SlashAttack), 3)
+ addtimer(CALLBACK(src, .proc/SlashAttack), 6)
+ addtimer(CALLBACK(src, .proc/AttackRecovery), 9)
+
+/mob/living/simple_animal/hostile/jungle/mook/proc/SlashAttack()
+ if(target && !stat && attack_state == MOOK_ATTACK_ACTIVE)
+ melee_damage_lower = 15
+ melee_damage_upper = 15
+ var/mob_direction = get_dir(src,target)
+ if(get_dist(src,target) > 1)
+ step(src,mob_direction)
+ if(targets_from && isturf(targets_from.loc) && target.Adjacent(targets_from) && isliving(target))
+ var/mob/living/L = target
+ L.attack_animal(src)
+ return
+ var/swing_turf = get_step(src,mob_direction)
+ new /obj/effect/temp_visual/kinetic_blast(swing_turf)
+ playsound(src, 'sound/weapons/slashmiss.ogg', 50, 1)
+
+/mob/living/simple_animal/hostile/jungle/mook/proc/LeapAttack()
+ if(target && !stat && attack_state == MOOK_ATTACK_WARMUP)
+ attack_state = MOOK_ATTACK_ACTIVE
+ density = FALSE
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+ update_icons()
+ new /obj/effect/temp_visual/mook_dust(get_turf(src))
+ playsound(src, 'sound/weapons/thudswoosh.ogg', 25, 1)
+ playsound(src, 'sound/voice/mook_leap_yell.ogg', 100, 1)
+ var/target_turf = get_turf(target)
+ throw_at(target_turf, 7, 1, src, FALSE, callback = CALLBACK(src, .proc/AttackRecovery))
+ return
+ attack_state = MOOK_ATTACK_RECOVERY
+ ResetNeutral()
+
+/mob/living/simple_animal/hostile/jungle/mook/proc/AttackRecovery()
+ if(attack_state == MOOK_ATTACK_ACTIVE && !stat)
+ attack_state = MOOK_ATTACK_RECOVERY
+ density = TRUE
+ face_atom(target)
+ if(!struck_target_leap)
+ update_icons()
+ struck_target_leap = FALSE
+ if(prob(40))
+ attack_state = MOOK_ATTACK_NEUTRAL
+ if(target)
+ if(isliving(target))
+ var/mob/living/L = target
+ if(L.incapacitated() && L.stat != DEAD)
+ addtimer(CALLBACK(src, .proc/WarmupAttack, TRUE), ATTACK_INTERMISSION_TIME)
+ return
+ addtimer(CALLBACK(src, .proc/WarmupAttack), ATTACK_INTERMISSION_TIME)
+ return
+ addtimer(CALLBACK(src, .proc/ResetNeutral), ATTACK_INTERMISSION_TIME)
+
+/mob/living/simple_animal/hostile/jungle/mook/proc/ResetNeutral()
+ if(attack_state == MOOK_ATTACK_RECOVERY)
+ attack_state = MOOK_ATTACK_NEUTRAL
+ ranged_cooldown = world.time + ranged_cooldown_time
+ update_icons()
+ if(target && !stat)
+ update_icons()
+ Goto(target, move_to_delay, minimum_distance)
+
+/mob/living/simple_animal/hostile/jungle/mook/throw_impact(atom/hit_atom, throwingdatum)
+ . = ..()
+ if(isliving(hit_atom) && attack_state == MOOK_ATTACK_ACTIVE)
+ var/mob/living/L = hit_atom
+ if(CanAttack(L))
+ L.attack_animal(src)
+ struck_target_leap = TRUE
+ density = TRUE
+ update_icons()
+ var/mook_under_us = FALSE
+ for(var/A in get_turf(src))
+ if(struck_target_leap && mook_under_us)
+ break
+ if(A == src)
+ continue
+ if(isliving(A))
+ var/mob/living/ML = A
+ if(!struck_target_leap && CanAttack(ML))//Check if some joker is attempting to use rest to evade us
+ struck_target_leap = TRUE
+ ML.attack_animal(src)
+ density = TRUE
+ struck_target_leap = TRUE
+ update_icons()
+ continue
+ if(istype(ML, /mob/living/simple_animal/hostile/jungle/mook) && !mook_under_us)//If we land on the same tile as another mook, spread out so we don't stack our sprite on the same tile
+ var/mob/living/simple_animal/hostile/jungle/mook/M = ML
+ if(!M.stat)
+ mook_under_us = TRUE
+ var/anydir = pick(GLOB.cardinals)
+ Move(get_step(src, anydir), anydir)
+ continue
+
+/mob/living/simple_animal/hostile/jungle/mook/handle_automated_action()
+ if(attack_state)
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/jungle/mook/OpenFire()
+ if(isliving(target))
+ var/mob/living/L = target
+ if(L.incapacitated())
+ return
+ WarmupAttack()
+
+/mob/living/simple_animal/hostile/jungle/mook/update_icons()
+ . = ..()
+ if(!stat)
+ switch(attack_state)
+ if(MOOK_ATTACK_NEUTRAL)
+ icon_state = "mook"
+ if(MOOK_ATTACK_WARMUP)
+ icon_state = "mook_warmup"
+ if(MOOK_ATTACK_ACTIVE)
+ if(!density)
+ icon_state = "mook_leap"
+ return
+ if(struck_target_leap)
+ icon_state = "mook_strike"
+ return
+ icon_state = "mook_slash_combo"
+ if(MOOK_ATTACK_RECOVERY)
+ icon_state = "mook"
+
+/obj/effect/temp_visual/mook_dust
+ name = "dust"
+ desc = "it's just a dust cloud!"
+ icon = 'icons/mob/jungle/mook.dmi'
+ icon_state = "mook_leap_cloud"
+ layer = BELOW_MOB_LAYER
+ pixel_x = -16
+ pixel_y = -16
+ duration = 10
+
+#undef MOOK_ATTACK_NEUTRAL
+#undef MOOK_ATTACK_WARMUP
+#undef MOOK_ATTACK_ACTIVE
+#undef MOOK_ATTACK_RECOVERY
+#undef ATTACK_INTERMISSION_TIME
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm
new file mode 100644
index 0000000000..3e28a789ad
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm
@@ -0,0 +1,244 @@
+#define SEEDLING_STATE_NEUTRAL 0
+#define SEEDLING_STATE_WARMUP 1
+#define SEEDLING_STATE_ACTIVE 2
+#define SEEDLING_STATE_RECOVERY 3
+
+//A plant rooted in the ground that forfeits its melee attack in favor of ranged barrages.
+//It will fire flurries of solar energy, and occasionally charge up a powerful blast that makes it vulnerable to attack.
+/mob/living/simple_animal/hostile/jungle/seedling
+ name = "seedling"
+ desc = "This oversized, predatory flower conceals what can only be described as an organic energy cannon, and it will not die until its hidden vital organs are sliced out. \
+ The concentrated streams of energy it sometimes produces require its full attention, attacking it during this time will prevent it from finishing its attack."
+ icon = 'icons/mob/jungle/seedling.dmi'
+ icon_state = "seedling"
+ icon_living = "seedling"
+ icon_dead = "seedling_dead"
+ maxHealth = 100
+ health = 100
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+ pixel_x = -16
+ pixel_y = -14
+ minimum_distance = 3
+ move_to_delay = 20
+ vision_range = 9
+ aggro_vision_range = 15
+ ranged = TRUE
+ ranged_cooldown_time = 10
+ projectiletype = /obj/item/projectile/seedling
+ projectilesound = 'sound/weapons/pierce.ogg'
+ robust_searching = TRUE
+ stat_attack = UNCONSCIOUS
+ anchored = TRUE
+ var/combatant_state = SEEDLING_STATE_NEUTRAL
+ var/obj/seedling_weakpoint/weak_point
+ var/mob/living/beam_debuff_target
+ var/solar_beam_identifier = 0
+
+/obj/item/projectile/seedling
+ name = "solar energy"
+ icon_state = "seedling"
+ damage = 10
+ damage_type = BURN
+ light_range = 2
+ flag = "energy"
+ light_color = LIGHT_COLOR_YELLOW
+ hitsound = 'sound/weapons/sear.ogg'
+ hitsound_wall = 'sound/weapons/effects/searwall.ogg'
+ nondirectional_sprite = TRUE
+
+/obj/item/projectile/seedling/Collide(atom/A)//Stops seedlings from destroying other jungle mobs through FF
+ if(isliving(A))
+ var/mob/living/L = A
+ if("jungle" in L.faction)
+ return FALSE
+ return ..()
+
+/obj/effect/temp_visual/solarbeam_killsat
+ name = "beam of solar energy"
+ icon_state = "solar_beam"
+ icon = 'icons/effects/beam.dmi'
+ layer = LIGHTING_LAYER
+ duration = 5
+ randomdir = FALSE
+
+/datum/status_effect/seedling_beam_indicator
+ id = "seedling beam indicator"
+ duration = 30
+ status_type = STATUS_EFFECT_MULTIPLE
+ alert_type = null
+ tick_interval = 1
+ var/obj/screen/seedling/seedling_screen_object
+ var/atom/target
+
+
+/datum/status_effect/seedling_beam_indicator/on_creation(mob/living/new_owner, target_plant)
+ . = ..()
+ if(.)
+ target = target_plant
+ tick()
+
+/datum/status_effect/seedling_beam_indicator/on_apply()
+ if(owner.client)
+ seedling_screen_object = new /obj/screen/seedling()
+ owner.client.screen += seedling_screen_object
+ tick()
+ return ..()
+
+/datum/status_effect/seedling_beam_indicator/Destroy()
+ if(owner)
+ if(owner.client)
+ owner.client.screen -= seedling_screen_object
+ return ..()
+
+/datum/status_effect/seedling_beam_indicator/tick()
+ var/target_angle = Get_Angle(owner, target)
+ var/matrix/final = matrix()
+ final.Turn(target_angle)
+ seedling_screen_object.transform = final
+
+/obj/screen/seedling
+ icon = 'icons/mob/jungle/arachnid.dmi'
+ icon_state = "seedling_beam_indicator"
+ screen_loc = "CENTER:-16,CENTER:-16"
+
+/mob/living/simple_animal/hostile/jungle/seedling/Goto()
+ if(combatant_state != SEEDLING_STATE_NEUTRAL)
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/jungle/seedling/AttackingTarget()
+ if(isliving(target))
+ if(ranged_cooldown <= world.time && combatant_state == SEEDLING_STATE_NEUTRAL)
+ OpenFire(target)
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/jungle/seedling/OpenFire()
+ WarmupAttack()
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/WarmupAttack()
+ if(combatant_state == SEEDLING_STATE_NEUTRAL)
+ combatant_state = SEEDLING_STATE_WARMUP
+ walk(src,0)
+ update_icons()
+ var/target_dist = get_dist(src,target)
+ var/living_target_check = isliving(target)
+ if(living_target_check)
+ if(target_dist > 7)//Offscreen check
+ SolarBeamStartup(target)
+ return
+ if(get_dist(src,target) >= 4 && prob(40))
+ SolarBeamStartup(target)
+ return
+ addtimer(CALLBACK(src, .proc/Volley), 5)
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/SolarBeamStartup(mob/living/living_target)//It's more like requiem than final spark
+ if(combatant_state == SEEDLING_STATE_WARMUP && target)
+ combatant_state = SEEDLING_STATE_ACTIVE
+ living_target.apply_status_effect(/datum/status_effect/seedling_beam_indicator, src)
+ beam_debuff_target = living_target
+ playsound(src,'sound/effects/seedling_chargeup.ogg', 100, 0)
+ if(get_dist(src,living_target) > 7)
+ playsound(living_target,'sound/effects/seedling_chargeup.ogg', 100, 0)
+ solar_beam_identifier = world.time
+ addtimer(CALLBACK(src, .proc/Beamu, living_target, solar_beam_identifier), 35)
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/Beamu(mob/living/living_target, beam_id = 0)
+ if(combatant_state == SEEDLING_STATE_ACTIVE && living_target && beam_id == solar_beam_identifier)
+ if(living_target.z == z)
+ update_icons()
+ var/obj/effect/temp_visual/solarbeam_killsat/S = new (get_turf(src))
+ var/matrix/starting = matrix()
+ starting.Scale(1,32)
+ starting.Translate(0,520)
+ S.transform = starting
+ var/obj/effect/temp_visual/solarbeam_killsat/K = new (get_turf(living_target))
+ var/matrix/final = matrix()
+ final.Scale(1,32)
+ final.Translate(0,512)
+ K.transform = final
+ living_target.adjustFireLoss(30)
+ living_target.adjust_fire_stacks(0.2)//Just here for the showmanship
+ living_target.IgniteMob()
+ playsound(living_target,'sound/weapons/sear.ogg', 50, 1)
+ addtimer(CALLBACK(src, .proc/AttackRecovery), 5)
+ return
+ AttackRecovery()
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/Volley()
+ if(combatant_state == SEEDLING_STATE_WARMUP && target)
+ combatant_state = SEEDLING_STATE_ACTIVE
+ update_icons()
+ var/datum/callback/cb = CALLBACK(src, .proc/InaccurateShot)
+ for(var/i in 1 to 13)
+ addtimer(cb, i)
+ addtimer(CALLBACK(src, .proc/AttackRecovery), 14)
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/InaccurateShot()
+ if(!QDELETED(target) && combatant_state == SEEDLING_STATE_ACTIVE && !stat)
+ if(get_dist(src,target) <= 3)//If they're close enough just aim straight at them so we don't miss at point blank ranges
+ Shoot(target)
+ return
+ var/turf/our_turf = get_turf(src)
+ var/obj/item/projectile/seedling/readied_shot = new /obj/item/projectile/seedling(our_turf)
+ readied_shot.current = our_turf
+ readied_shot.starting = our_turf
+ readied_shot.firer = src
+ readied_shot.original = target
+ readied_shot.yo = target.y - our_turf.y + rand(-1,1)
+ readied_shot.xo = target.x - our_turf.x + rand(-1,1)
+ readied_shot.fire()
+ playsound(src, projectilesound, 100, 1)
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/AttackRecovery()
+ if(combatant_state == SEEDLING_STATE_ACTIVE)
+ combatant_state = SEEDLING_STATE_RECOVERY
+ update_icons()
+ ranged_cooldown = world.time + ranged_cooldown_time
+ if(target)
+ face_atom(target)
+ addtimer(CALLBACK(src, .proc/ResetNeutral), 10)
+
+/mob/living/simple_animal/hostile/jungle/seedling/proc/ResetNeutral()
+ combatant_state = SEEDLING_STATE_NEUTRAL
+ if(target && !stat)
+ update_icons()
+ Goto(target, move_to_delay, minimum_distance)
+
+/mob/living/simple_animal/hostile/jungle/seedling/adjustHealth()
+ . = ..()
+ if(combatant_state == SEEDLING_STATE_ACTIVE && beam_debuff_target)
+ beam_debuff_target.remove_status_effect(/datum/status_effect/seedling_beam_indicator)
+ beam_debuff_target = null
+ solar_beam_identifier = 0
+ AttackRecovery()
+
+/mob/living/simple_animal/hostile/jungle/seedling/update_icons()
+ . = ..()
+ if(!stat)
+ switch(combatant_state)
+ if(SEEDLING_STATE_NEUTRAL)
+ icon_state = "seedling"
+ if(SEEDLING_STATE_WARMUP)
+ icon_state = "seedling_charging"
+ if(SEEDLING_STATE_ACTIVE)
+ icon_state = "seedling_fire"
+ if(SEEDLING_STATE_RECOVERY)
+ icon_state = "seedling"
+
+/mob/living/simple_animal/hostile/jungle/seedling/GiveTarget()
+ if(target)
+ if(combatant_state == SEEDLING_STATE_WARMUP || combatant_state == SEEDLING_STATE_ACTIVE)//So it doesn't 180 and blast you in the face while it's firing at someone else
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/jungle/seedling/LoseTarget()
+ if(combatant_state == SEEDLING_STATE_WARMUP || combatant_state == SEEDLING_STATE_ACTIVE)
+ return
+ return ..()
+
+#undef SEEDLING_STATE_NEUTRAL
+#undef SEEDLING_STATE_WARMUP
+#undef SEEDLING_STATE_ACTIVE
+#undef SEEDLING_STATE_RECOVERY
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm b/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm
deleted file mode 100644
index b3e1479b91..0000000000
--- a/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm
+++ /dev/null
@@ -1,833 +0,0 @@
-/mob/living/simple_animal/hostile/jungle
- vision_range = 5
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- faction = list("jungle")
- weather_immunities = list("acid")
- obj_damage = 30
- environment_smash = ENVIRONMENT_SMASH_WALLS
- minbodytemp = 0
- maxbodytemp = 450
- response_help = "pokes"
- response_disarm = "shoves"
- response_harm = "strikes"
- status_flags = 0
- a_intent = INTENT_HARM
- see_in_dark = 4
- lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
- mob_size = MOB_SIZE_LARGE
-
-
-
-//Mega arachnid
-
-/mob/living/simple_animal/hostile/jungle/mega_arachnid
- name = "mega arachnid"
- desc = "Though physically imposing, it prefers to ambush its prey, and it will only engage with an already crippled opponent."
- melee_damage_lower = 30
- melee_damage_upper = 30
- maxHealth = 300
- health = 300
- speed = 1
- ranged = 1
- pixel_x = -16
- move_to_delay = 10
- aggro_vision_range = 9
- speak_emote = list("chitters")
- attack_sound = 'sound/weapons/bladeslice.ogg'
- ranged_cooldown_time = 60
- projectiletype = /obj/item/projectile/mega_arachnid
- projectilesound = 'sound/weapons/pierce.ogg'
- icon = 'icons/mob/jungle/arachnid.dmi'
- icon_state = "arachnid"
- icon_living = "arachnid"
- icon_dead = "dead_purple"
- alpha = 50
-
-/mob/living/simple_animal/hostile/jungle/mega_arachnid/Life()
- ..()
- if(target && ranged_cooldown > world.time && iscarbon(target))
- var/mob/living/carbon/C = target
- if(!C.legcuffed && C.health < 50)
- retreat_distance = 9
- minimum_distance = 9
- alpha = 125
- return
- retreat_distance = 0
- minimum_distance = 0
- alpha = 255
-
-
-/mob/living/simple_animal/hostile/jungle/mega_arachnid/Aggro()
- ..()
- alpha = 255
-
-/mob/living/simple_animal/hostile/jungle/mega_arachnid/LoseAggro()
- ..()
- alpha = 50
-
-/obj/item/projectile/mega_arachnid
- name = "flesh snare"
- nodamage = 1
- damage = 0
- icon_state = "tentacle_end"
-
-/obj/item/projectile/mega_arachnid/on_hit(atom/target, blocked = FALSE)
- if(iscarbon(target) && blocked < 100)
- var/obj/item/restraints/legcuffs/beartrap/mega_arachnid/B = new /obj/item/restraints/legcuffs/beartrap/mega_arachnid(get_turf(target))
- B.Crossed(target)
- ..()
-
-/obj/item/restraints/legcuffs/beartrap/mega_arachnid
- name = "fleshy restraints"
- desc = "Used by mega arachnids to immobilize their prey."
- flags_1 = DROPDEL_1
- icon_state = "tentacle_end"
- icon = 'icons/obj/projectiles.dmi'
-
-////Leaper////
-
-#define PLAYER_HOP_DELAY 25
-
-/mob/living/simple_animal/hostile/jungle/leaper
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- faction = list("jungle")
- weather_immunities = list("acid")
- obj_damage = 30
- environment_smash = ENVIRONMENT_SMASH_WALLS
- maxHealth = 300
- health = 300
- minbodytemp = 0
- maxbodytemp = 450
- response_help = "pokes"
- response_disarm = "shoves"
- response_harm = "strikes"
- status_flags = 0
- a_intent = INTENT_HARM
- see_in_dark = 4
- ranged = TRUE
- projectiletype = /obj/item/projectile/leaper
- projectilesound = 'sound/weapons/pierce.ogg'
- ranged_cooldown_time = 30
- pixel_x = -16
- icon = 'icons/mob/jungle/arachnid.dmi'
- icon_state = "leaper"
- icon_living = "leaper"
- icon_dead = "leaper_dead"
- layer = LARGE_MOB_LAYER
- name = "leaper"
- desc = "Commonly referred to as 'leapers', the Geron Toad is a massive beast that spits out highly pressurized bubbles containing a unique toxin, knocking down its prey and then crushing it with its girth."
- speed = 10
- stat_attack = 1
- robust_searching = 1
- var/hopping = FALSE
- var/hop_cooldown = 0 //Strictly for player controlled leapers
- var/projectile_ready = FALSE //Stopping AI leapers from firing whenever they want, and only doing it after a hop has finished instead
-
-/obj/item/projectile/leaper
- name = "leaper bubble"
- icon_state = "leaper"
- knockdown = 50
- damage = 0
- range = 7
- hitsound = 'sound/effects/snap.ogg'
- nondirectional_sprite = TRUE
- impact_effect_type = /obj/effect/temp_visual/leaper_projectile_impact
-
-/obj/item/projectile/leaper/on_hit(atom/target, blocked = FALSE)
- ..()
- if(iscarbon(target))
- var/mob/living/carbon/C = target
- C.reagents.add_reagent("leaper_venom", 5)
- return
- if(isanimal(target))
- var/mob/living/simple_animal/L = target
- L.adjustHealth(25)
-
-/obj/item/projectile/leaper/on_range()
- var/turf/T = get_turf(src)
- ..()
- new /obj/structure/leaper_bubble(T)
-
-/obj/effect/temp_visual/leaper_projectile_impact
- name = "leaper bubble"
- icon = 'icons/obj/projectiles.dmi'
- icon_state = "leaper_bubble_pop"
- layer = ABOVE_ALL_MOB_LAYER
- duration = 3
-
-/obj/effect/temp_visual/leaper_projectile_impact/Initialize()
- . = ..()
- new /obj/effect/decal/cleanable/leaper_sludge(get_turf(src))
-
-/obj/effect/decal/cleanable/leaper_sludge
- name = "leaper sludge"
- desc = "A small pool of sludge, containing trace amounts of leaper venom"
- icon = 'icons/effects/tomatodecal.dmi'
- icon_state = "tomato_floor1"
-
-/obj/structure/leaper_bubble
- name = "leaper bubble"
- desc = "A floating bubble containing leaper venom, the contents are under a surprising amount of pressure."
- icon = 'icons/obj/projectiles.dmi'
- icon_state = "leaper"
- max_integrity = 10
- density = FALSE
-
-/obj/structure/leaper_bubble/Initialize()
- . = ..()
- float(on = TRUE)
- QDEL_IN(src, 100)
-
-/obj/structure/leaper_bubble/Destroy()
- new /obj/effect/temp_visual/leaper_projectile_impact(get_turf(src))
- playsound(src,'sound/effects/snap.ogg',50, 1, -1)
- return ..()
-
-/obj/structure/leaper_bubble/Crossed(atom/movable/AM)
- if(isliving(AM))
- var/mob/living/L = AM
- if(!istype(L, /mob/living/simple_animal/hostile/jungle/leaper))
- playsound(src,'sound/effects/snap.ogg',50, 1, -1)
- L.Knockdown(50)
- if(iscarbon(L))
- var/mob/living/carbon/C = L
- C.reagents.add_reagent("leaper_venom", 5)
- if(isanimal(L))
- var/mob/living/simple_animal/A = L
- A.adjustHealth(25)
- qdel(src)
- return ..()
-
-/datum/reagent/toxin/leaper_venom
- name = "Leaper venom"
- id = "leaper_venom"
- description = "A toxin spat out by leapers that while harmless in small doses, quickly creates a toxic reaction if too much is in the body."
- color = "#801E28" // rgb: 128, 30, 40
- toxpwr = 0
- taste_description = "french cuisine"
- taste_mult = 1.3
-
-/datum/reagent/toxin/leaper_venom/on_mob_life(mob/living/M)
- if(volume >= 10)
- M.adjustToxLoss(5, 0)
- ..()
-
-/obj/effect/temp_visual/leaper_crush
- name = "Grim tidings"
- desc = "Incoming leaper!"
- icon = 'icons/effects/96x96.dmi'
- icon_state = "lily_pad"
- layer = BELOW_MOB_LAYER
- pixel_x = -32
- pixel_y = -32
- duration = 30
-
-/mob/living/simple_animal/hostile/jungle/leaper/Initialize()
- . = ..()
- verbs -= /mob/living/verb/pulled
-
-/mob/living/simple_animal/hostile/jungle/leaper/CtrlClickOn(atom/A)
- face_atom(A)
- target = A
- if(!isturf(loc))
- return
- if(next_move > world.time)
- return
- if(hopping)
- return
- if(isliving(A))
- var/mob/living/L = A
- if(L.incapacitated())
- BellyFlop()
- return
- if(hop_cooldown <= world.time)
- Hop(player_hop = TRUE)
-
-/mob/living/simple_animal/hostile/jungle/leaper/AttackingTarget()
- if(isliving(target))
- return
- return ..()
-
-/mob/living/simple_animal/hostile/jungle/leaper/handle_automated_action()
- if(hopping || projectile_ready)
- return
- . = ..()
- if(target)
- if(isliving(target))
- var/mob/living/L = target
- if(L.incapacitated())
- BellyFlop()
- return
- if(!hopping)
- Hop()
-
-/mob/living/simple_animal/hostile/jungle/leaper/Life()
- . = ..()
- update_icons()
-
-/mob/living/simple_animal/hostile/jungle/leaper/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- if(prob(33) && !ckey)
- ranged_cooldown = 0 //Keeps em on their toes instead of a constant rotation
- ..()
-
-/mob/living/simple_animal/hostile/jungle/leaper/OpenFire()
- face_atom(target)
- if(ranged_cooldown <= world.time)
- if(ckey)
- if(hopping)
- return
- if(isliving(target))
- var/mob/living/L = target
- if(L.incapacitated())
- return //No stunlocking. Hop on them after you stun them, you donk.
- if(AIStatus == AI_ON && !projectile_ready && !ckey)
- return
- . = ..(target)
- projectile_ready = FALSE
- update_icons()
-
-/mob/living/simple_animal/hostile/jungle/leaper/proc/Hop(player_hop = FALSE)
- if(z != target.z)
- return
- hopping = TRUE
- density = FALSE
- pass_flags |= PASSMOB
- notransform = TRUE
- var/turf/new_turf = locate((target.x + rand(-3,3)),(target.y + rand(-3,3)),target.z)
- if(player_hop)
- new_turf = get_turf(target)
- hop_cooldown = world.time + PLAYER_HOP_DELAY
- if(AIStatus == AI_ON && ranged_cooldown <= world.time)
- projectile_ready = TRUE
- update_icons()
- throw_at(new_turf, max(3,get_dist(src,new_turf)), 1, src, FALSE, callback = CALLBACK(src, .FinishHop))
-
-/mob/living/simple_animal/hostile/jungle/leaper/proc/FinishHop()
- density = TRUE
- notransform = FALSE
- pass_flags &= ~PASSMOB
- hopping = FALSE
- playsound(src.loc, 'sound/effects/meteorimpact.ogg', 100, 1)
- if(target && AIStatus == AI_ON && projectile_ready && !ckey)
- face_atom(target)
- addtimer(CALLBACK(src, .proc/OpenFire, target), 5)
-
-/mob/living/simple_animal/hostile/jungle/leaper/proc/BellyFlop()
- var/turf/new_turf = get_turf(target)
- hopping = TRUE
- notransform = TRUE
- new /obj/effect/temp_visual/leaper_crush(new_turf)
- addtimer(CALLBACK(src, .proc/BellyFlopHop, new_turf), 30)
-
-/mob/living/simple_animal/hostile/jungle/leaper/proc/BellyFlopHop(turf/T)
- density = FALSE
- throw_at(T, get_dist(src,T),1,src, FALSE, callback = CALLBACK(src, .proc/Crush))
-
-/mob/living/simple_animal/hostile/jungle/leaper/proc/Crush()
- hopping = FALSE
- density = TRUE
- notransform = FALSE
- playsound(src, 'sound/effects/meteorimpact.ogg', 200, 1)
- for(var/mob/living/L in orange(1, src))
- L.adjustBruteLoss(35)
- if(!QDELETED(L)) // Some mobs are deleted on death
- var/throw_dir = get_dir(src, L)
- if(L.loc == loc)
- throw_dir = pick(GLOB.alldirs)
- var/throwtarget = get_edge_target_turf(src, throw_dir)
- L.throw_at(throwtarget, 3, 1)
- visible_message("[L] is thrown clear of [src]!")
- if(ckey)//Lessens ability to chain stun as a player
- ranged_cooldown = ranged_cooldown_time + world.time
- update_icons()
-
-/mob/living/simple_animal/hostile/jungle/leaper/Goto()
- return
-
-/mob/living/simple_animal/hostile/jungle/leaper/throw_impact()
- return
-
-/mob/living/simple_animal/hostile/jungle/leaper/update_icons()
- . = ..()
- if(stat)
- icon_state = "leaper_dead"
- return
- if(ranged_cooldown <= world.time)
- if(AIStatus == AI_ON && projectile_ready || ckey)
- icon_state = "leaper_alert"
- return
- icon_state = "leaper"
-
-#undef PLAYER_HOP_DELAY
-
-////JUNGLE MOOK////
-
-#define MOOK_ATTACK_NEUTRAL 0
-#define MOOK_ATTACK_WARMUP 1
-#define MOOK_ATTACK_ACTIVE 2
-#define MOOK_ATTACK_RECOVERY 3
-
-#define ATTACK_INTERMISSION_TIME 5
-
-/mob/living/simple_animal/hostile/jungle/mook
- name = "wanderer"
- desc = "This unhealthy looking primitive is wielding a rudimentary hatchet, swinging it with wild abandon. One isn't much of a threat, but in numbers they can quickly overwhelm a superior opponent."
- maxHealth = 45
- health = 45
- melee_damage_lower = 30
- melee_damage_upper = 30
- icon = 'icons/mob/jungle/arachnid.dmi'
- icon_state = "mook"
- icon_living = "mook"
- icon_dead = "mook_dead"
- pixel_x = -16
- pixel_y = -8
- ranged = TRUE
- ranged_cooldown_time = 10
- pass_flags = LETPASSTHROW
- robust_searching = TRUE
- stat_attack = UNCONSCIOUS
- attack_sound = 'sound/weapons/rapierhit.ogg'
- death_sound = 'sound/voice/mook_death.ogg'
- aggro_vision_range = 15 //A little more aggressive once in combat to balance out their really low HP
- var/attack_state = MOOK_ATTACK_NEUTRAL
- var/struck_target_leap = FALSE
-
-/mob/living/simple_animal/hostile/jungle/mook/CanPass(atom/movable/O)
- if(istype(O, /mob/living/simple_animal/hostile/jungle/mook))
- var/mob/living/simple_animal/hostile/jungle/mook/M = O
- if(M.attack_state == MOOK_ATTACK_ACTIVE && M.throwing)
- return TRUE
- return ..()
-
-/mob/living/simple_animal/hostile/jungle/mook/death()
- desc = "A deceased primitive. Upon closer inspection, it was suffering from severe cellular degeneration and its garments are machine made..."//Can you guess the twist
- return ..()
-
-/mob/living/simple_animal/hostile/jungle/mook/AttackingTarget()
- if(isliving(target))
- if(ranged_cooldown <= world.time && attack_state == MOOK_ATTACK_NEUTRAL)
- var/mob/living/L = target
- if(L.incapacitated())
- WarmupAttack(forced_slash_combo = TRUE)
- return
- WarmupAttack()
- return
- return ..()
-
-/mob/living/simple_animal/hostile/jungle/mook/Goto()
- if(attack_state != MOOK_ATTACK_NEUTRAL)
- return
- return ..()
-
-/mob/living/simple_animal/hostile/jungle/mook/Move()
- if(attack_state == MOOK_ATTACK_WARMUP || attack_state == MOOK_ATTACK_RECOVERY)
- return
- return ..()
-
-/mob/living/simple_animal/hostile/jungle/mook/proc/WarmupAttack(forced_slash_combo = FALSE)
- if(attack_state == MOOK_ATTACK_NEUTRAL && target)
- attack_state = MOOK_ATTACK_WARMUP
- walk(src,0)
- update_icons()
- if(prob(50) && get_dist(src,target) <= 3 || forced_slash_combo)
- addtimer(CALLBACK(src, .proc/SlashCombo), ATTACK_INTERMISSION_TIME)
- return
- addtimer(CALLBACK(src, .proc/LeapAttack), ATTACK_INTERMISSION_TIME + rand(0,3))
- return
- attack_state = MOOK_ATTACK_RECOVERY
- ResetNeutral()
-
-/mob/living/simple_animal/hostile/jungle/mook/proc/SlashCombo()
- if(attack_state == MOOK_ATTACK_WARMUP && !stat)
- attack_state = MOOK_ATTACK_ACTIVE
- update_icons()
- SlashAttack()
- addtimer(CALLBACK(src, .proc/SlashAttack), 3)
- addtimer(CALLBACK(src, .proc/SlashAttack), 6)
- addtimer(CALLBACK(src, .proc/AttackRecovery), 9)
-
-/mob/living/simple_animal/hostile/jungle/mook/proc/SlashAttack()
- if(target && !stat && attack_state == MOOK_ATTACK_ACTIVE)
- melee_damage_lower = 15
- melee_damage_upper = 15
- var/mob_direction = get_dir(src,target)
- if(get_dist(src,target) > 1)
- step(src,mob_direction)
- if(targets_from && isturf(targets_from.loc) && target.Adjacent(targets_from) && isliving(target))
- var/mob/living/L = target
- L.attack_animal(src)
- return
- var/swing_turf = get_step(src,mob_direction)
- new /obj/effect/temp_visual/kinetic_blast(swing_turf)
- playsound(src, 'sound/weapons/slashmiss.ogg', 50, 1)
-
-/mob/living/simple_animal/hostile/jungle/mook/proc/LeapAttack()
- if(target && !stat && attack_state == MOOK_ATTACK_WARMUP)
- attack_state = MOOK_ATTACK_ACTIVE
- density = FALSE
- melee_damage_lower = 30
- melee_damage_upper = 30
- update_icons()
- new /obj/effect/temp_visual/mook_dust(get_turf(src))
- playsound(src, 'sound/weapons/thudswoosh.ogg', 25, 1)
- playsound(src, 'sound/voice/mook_leap_yell.ogg', 100, 1)
- var/target_turf = get_turf(target)
- throw_at(target_turf, 7, 1, src, FALSE, callback = CALLBACK(src, .proc/AttackRecovery))
- return
- attack_state = MOOK_ATTACK_RECOVERY
- ResetNeutral()
-
-/mob/living/simple_animal/hostile/jungle/mook/proc/AttackRecovery()
- if(attack_state == MOOK_ATTACK_ACTIVE && !stat)
- attack_state = MOOK_ATTACK_RECOVERY
- density = TRUE
- face_atom(target)
- if(!struck_target_leap)
- update_icons()
- struck_target_leap = FALSE
- if(prob(40))
- attack_state = MOOK_ATTACK_NEUTRAL
- if(target)
- if(isliving(target))
- var/mob/living/L = target
- if(L.incapacitated() && L.stat != DEAD)
- addtimer(CALLBACK(src, .proc/WarmupAttack, TRUE), ATTACK_INTERMISSION_TIME)
- return
- addtimer(CALLBACK(src, .proc/WarmupAttack), ATTACK_INTERMISSION_TIME)
- return
- addtimer(CALLBACK(src, .proc/ResetNeutral), ATTACK_INTERMISSION_TIME)
-
-/mob/living/simple_animal/hostile/jungle/mook/proc/ResetNeutral()
- if(attack_state == MOOK_ATTACK_RECOVERY)
- attack_state = MOOK_ATTACK_NEUTRAL
- ranged_cooldown = world.time + ranged_cooldown_time
- update_icons()
- if(target && !stat)
- update_icons()
- Goto(target, move_to_delay, minimum_distance)
-
-/mob/living/simple_animal/hostile/jungle/mook/throw_impact(atom/hit_atom, throwingdatum)
- . = ..()
- if(isliving(hit_atom) && attack_state == MOOK_ATTACK_ACTIVE)
- var/mob/living/L = hit_atom
- if(CanAttack(L))
- L.attack_animal(src)
- struck_target_leap = TRUE
- density = TRUE
- update_icons()
- var/mook_under_us = FALSE
- for(var/A in get_turf(src))
- if(struck_target_leap && mook_under_us)
- break
- if(A == src)
- continue
- if(isliving(A))
- var/mob/living/ML = A
- if(!struck_target_leap && CanAttack(ML))//Check if some joker is attempting to use rest to evade us
- struck_target_leap = TRUE
- ML.attack_animal(src)
- density = TRUE
- struck_target_leap = TRUE
- update_icons()
- continue
- if(istype(ML, /mob/living/simple_animal/hostile/jungle/mook) && !mook_under_us)//If we land on the same tile as another mook, spread out so we don't stack our sprite on the same tile
- var/mob/living/simple_animal/hostile/jungle/mook/M = ML
- if(!M.stat)
- mook_under_us = TRUE
- var/anydir = pick(GLOB.cardinals)
- Move(get_step(src, anydir), anydir)
- continue
-
-/mob/living/simple_animal/hostile/jungle/mook/handle_automated_action()
- if(attack_state)
- return
- return ..()
-
-/mob/living/simple_animal/hostile/jungle/mook/OpenFire()
- if(isliving(target))
- var/mob/living/L = target
- if(L.incapacitated())
- return
- WarmupAttack()
-
-/mob/living/simple_animal/hostile/jungle/mook/update_icons()
- . = ..()
- if(!stat)
- switch(attack_state)
- if(MOOK_ATTACK_NEUTRAL)
- icon_state = "mook"
- if(MOOK_ATTACK_WARMUP)
- icon_state = "mook_warmup"
- if(MOOK_ATTACK_ACTIVE)
- if(!density)
- icon_state = "mook_leap"
- return
- if(struck_target_leap)
- icon_state = "mook_strike"
- return
- icon_state = "mook_slash_combo"
- if(MOOK_ATTACK_RECOVERY)
- icon_state = "mook"
-
-/obj/effect/temp_visual/mook_dust
- name = "dust"
- desc = "it's just a dust cloud!"
- icon = 'icons/mob/jungle/arachnid.dmi'
- icon_state = "mook_leap_cloud"
- layer = BELOW_MOB_LAYER
- pixel_x = -16
- pixel_y = -16
- duration = 10
-
-#undef MOOK_ATTACK_NEUTRAL
-#undef MOOK_ATTACK_WARMUP
-#undef MOOK_ATTACK_ACTIVE
-#undef MOOK_ATTACK_RECOVERY
-#undef ATTACK_INTERMISSION_TIME
-
-////Jungle Seedling////
-
-#define SEEDLING_STATE_NEUTRAL 0
-#define SEEDLING_STATE_WARMUP 1
-#define SEEDLING_STATE_ACTIVE 2
-#define SEEDLING_STATE_RECOVERY 3
-
-
-/mob/living/simple_animal/hostile/jungle/seedling
- name = "seedling"
- desc = "This oversized, predatory flower conceals what can only be described as an organic energy cannon, and it will not die until its hidden vital organs are sliced out. \
- The concentrated streams of energy it sometimes produces require its full attention, attacking it during this time will prevent it from finishing its attack."
- maxHealth = 100
- health = 100
- melee_damage_lower = 30
- melee_damage_upper = 30
- icon = 'icons/mob/jungle/arachnid.dmi'
- icon_state = "seedling"
- icon_living = "seedling"
- icon_dead = "seedling_dead"
- pixel_x = -16
- pixel_y = -14
- minimum_distance = 3
- move_to_delay = 20
- vision_range = 9
- aggro_vision_range = 15
- ranged = TRUE
- ranged_cooldown_time = 10
- projectiletype = /obj/item/projectile/seedling
- projectilesound = 'sound/weapons/pierce.ogg'
- robust_searching = TRUE
- stat_attack = UNCONSCIOUS
- anchored = TRUE
- var/combatant_state = SEEDLING_STATE_NEUTRAL
- var/obj/seedling_weakpoint/weak_point
- var/mob/living/beam_debuff_target
- var/solar_beam_identifier = 0
-
-/obj/item/projectile/seedling
- name = "solar energy"
- icon_state = "seedling"
- damage = 10
- damage_type = BURN
- light_range = 2
- flag = "energy"
- light_color = LIGHT_COLOR_YELLOW
- hitsound = 'sound/weapons/sear.ogg'
- hitsound_wall = 'sound/weapons/effects/searwall.ogg'
- nondirectional_sprite = TRUE
-
-/obj/item/projectile/seedling/Collide(atom/A)//Stops seedlings from destroying other jungle mobs through FF
- if(isliving(A))
- var/mob/living/L = A
- if("jungle" in L.faction)
- return FALSE
- return ..()
-
-/obj/effect/temp_visual/solarbeam_killsat
- name = "beam of solar energy"
- icon_state = "solar_beam"
- icon = 'icons/effects/beam.dmi'
- layer = LIGHTING_LAYER
- duration = 5
- randomdir = FALSE
-
-/datum/status_effect/seedling_beam_indicator
- id = "seedling beam indicator"
- duration = 30
- status_type = STATUS_EFFECT_MULTIPLE
- alert_type = null
- tick_interval = 1
- var/obj/screen/seedling/seedling_screen_object
- var/atom/target
-
-
-/datum/status_effect/seedling_beam_indicator/on_creation(mob/living/new_owner, target_plant)
- . = ..()
- if(.)
- target = target_plant
- tick()
-
-/datum/status_effect/seedling_beam_indicator/on_apply()
- if(owner.client)
- seedling_screen_object = new /obj/screen/seedling()
- owner.client.screen += seedling_screen_object
- tick()
- return ..()
-
-/datum/status_effect/seedling_beam_indicator/Destroy()
- if(owner)
- if(owner.client)
- owner.client.screen -= seedling_screen_object
- return ..()
-
-/datum/status_effect/seedling_beam_indicator/tick()
- var/target_angle = Get_Angle(owner, target)
- var/matrix/final = matrix()
- final.Turn(target_angle)
- seedling_screen_object.transform = final
-
-/obj/screen/seedling
- icon = 'icons/mob/jungle/arachnid.dmi'
- icon_state = "seedling_beam_indicator"
- screen_loc = "CENTER:-16,CENTER:-16"
-
-/mob/living/simple_animal/hostile/jungle/seedling/Goto()
- if(combatant_state != SEEDLING_STATE_NEUTRAL)
- return
- return ..()
-
-/mob/living/simple_animal/hostile/jungle/seedling/AttackingTarget()
- if(isliving(target))
- if(ranged_cooldown <= world.time && combatant_state == SEEDLING_STATE_NEUTRAL)
- OpenFire(target)
- return
- return ..()
-
-/mob/living/simple_animal/hostile/jungle/seedling/OpenFire()
- WarmupAttack()
-
-/mob/living/simple_animal/hostile/jungle/seedling/proc/WarmupAttack()
- if(combatant_state == SEEDLING_STATE_NEUTRAL)
- combatant_state = SEEDLING_STATE_WARMUP
- walk(src,0)
- update_icons()
- var/target_dist = get_dist(src,target)
- var/living_target_check = isliving(target)
- if(living_target_check)
- if(target_dist > 7)//Offscreen check
- SolarBeamStartup(target)
- return
- if(get_dist(src,target) >= 4 && prob(40))
- SolarBeamStartup(target)
- return
- addtimer(CALLBACK(src, .proc/Volley), 5)
-
-/mob/living/simple_animal/hostile/jungle/seedling/proc/SolarBeamStartup(mob/living/living_target)//It's more like requiem than final spark
- if(combatant_state == SEEDLING_STATE_WARMUP && target)
- combatant_state = SEEDLING_STATE_ACTIVE
- living_target.apply_status_effect(/datum/status_effect/seedling_beam_indicator, src)
- beam_debuff_target = living_target
- playsound(src,'sound/effects/seedling_chargeup.ogg', 100, 0)
- if(get_dist(src,living_target) > 7)
- playsound(living_target,'sound/effects/seedling_chargeup.ogg', 100, 0)
- solar_beam_identifier = world.time
- addtimer(CALLBACK(src, .proc/Beamu, living_target, solar_beam_identifier), 35)
-
-/mob/living/simple_animal/hostile/jungle/seedling/proc/Beamu(mob/living/living_target, beam_id = 0)
- if(combatant_state == SEEDLING_STATE_ACTIVE && living_target && beam_id == solar_beam_identifier)
- if(living_target.z == z)
- update_icons()
- var/obj/effect/temp_visual/solarbeam_killsat/S = new (get_turf(src))
- var/matrix/starting = matrix()
- starting.Scale(1,32)
- starting.Translate(0,520)
- S.transform = starting
- var/obj/effect/temp_visual/solarbeam_killsat/K = new (get_turf(living_target))
- var/matrix/final = matrix()
- final.Scale(1,32)
- final.Translate(0,512)
- K.transform = final
- living_target.adjustFireLoss(30)
- living_target.adjust_fire_stacks(0.2)//Just here for the showmanship
- living_target.IgniteMob()
- playsound(living_target,'sound/weapons/sear.ogg', 50, 1)
- addtimer(CALLBACK(src, .proc/AttackRecovery), 5)
- return
- AttackRecovery()
-
-/mob/living/simple_animal/hostile/jungle/seedling/proc/Volley()
- if(combatant_state == SEEDLING_STATE_WARMUP && target)
- combatant_state = SEEDLING_STATE_ACTIVE
- update_icons()
- var/datum/callback/cb = CALLBACK(src, .proc/InaccurateShot)
- for(var/i in 1 to 13)
- addtimer(cb, i)
- addtimer(CALLBACK(src, .proc/AttackRecovery), 14)
-
-/mob/living/simple_animal/hostile/jungle/seedling/proc/InaccurateShot()
- if(!QDELETED(target) && combatant_state == SEEDLING_STATE_ACTIVE && !stat)
- if(get_dist(src,target) <= 3)//If they're close enough just aim straight at them so we don't miss at point blank ranges
- Shoot(target)
- return
- var/turf/our_turf = get_turf(src)
- var/obj/item/projectile/seedling/readied_shot = new /obj/item/projectile/seedling(our_turf)
- readied_shot.current = our_turf
- readied_shot.starting = our_turf
- readied_shot.firer = src
- readied_shot.original = target
- readied_shot.yo = target.y - our_turf.y + rand(-1,1)
- readied_shot.xo = target.x - our_turf.x + rand(-1,1)
- readied_shot.fire()
- playsound(src, projectilesound, 100, 1)
-
-/mob/living/simple_animal/hostile/jungle/seedling/proc/AttackRecovery()
- if(combatant_state == SEEDLING_STATE_ACTIVE)
- combatant_state = SEEDLING_STATE_RECOVERY
- update_icons()
- ranged_cooldown = world.time + ranged_cooldown_time
- if(target)
- face_atom(target)
- addtimer(CALLBACK(src, .proc/ResetNeutral), 10)
-
-/mob/living/simple_animal/hostile/jungle/seedling/proc/ResetNeutral()
- combatant_state = SEEDLING_STATE_NEUTRAL
- if(target && !stat)
- update_icons()
- Goto(target, move_to_delay, minimum_distance)
-
-/mob/living/simple_animal/hostile/jungle/seedling/adjustHealth()
- . = ..()
- if(combatant_state == SEEDLING_STATE_ACTIVE && beam_debuff_target)
- beam_debuff_target.remove_status_effect(/datum/status_effect/seedling_beam_indicator)
- beam_debuff_target = null
- solar_beam_identifier = 0
- AttackRecovery()
-
-/mob/living/simple_animal/hostile/jungle/seedling/update_icons()
- . = ..()
- if(!stat)
- switch(combatant_state)
- if(SEEDLING_STATE_NEUTRAL)
- icon_state = "seedling"
- if(SEEDLING_STATE_WARMUP)
- icon_state = "seedling_charging"
- if(SEEDLING_STATE_ACTIVE)
- icon_state = "seedling_fire"
- if(SEEDLING_STATE_RECOVERY)
- icon_state = "seedling"
-
-/mob/living/simple_animal/hostile/jungle/seedling/GiveTarget()
- if(target)
- if(combatant_state == SEEDLING_STATE_WARMUP || combatant_state == SEEDLING_STATE_ACTIVE)//So it doesn't 180 and blast you in the face while it's firing at someone else
- return
- return ..()
-
-/mob/living/simple_animal/hostile/jungle/seedling/LoseTarget()
- if(combatant_state == SEEDLING_STATE_WARMUP || combatant_state == SEEDLING_STATE_ACTIVE)
- return
- return ..()
-
-#undef SEEDLING_STATE_NEUTRAL
-#undef SEEDLING_STATE_WARMUP
-#undef SEEDLING_STATE_ACTIVE
-#undef SEEDLING_STATE_RECOVERY
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm.rej b/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm.rej
deleted file mode 100644
index 9204780124..0000000000
--- a/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm b/code/modules/mob/living/simple_animal/hostile/jungle_mobs.dm (rejected hunks)
-@@ -80,7 +80,7 @@
- /obj/item/restraints/legcuffs/beartrap/mega_arachnid
- name = "fleshy restraints"
- desc = "Used by mega arachnids to immobilize their prey."
-- flags = DROPDEL
-+ flags_1 = DROPDEL_1
- icon_state = "tentacle_end"
- icon = 'icons/obj/projectiles.dmi'
-
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index fd92cc17ff..66fd219358 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -277,19 +277,29 @@ Difficulty: Very Hard
WriteMemory()
/obj/machinery/smartfridge/black_box/proc/WriteMemory()
- var/savefile/S = new /savefile("data/npc_saves/Blackbox.sav")
+ var/json_file = file("data/npc_saves/Blackbox.json")
stored_items = list()
for(var/obj/O in (contents-component_parts))
stored_items += O.type
-
- WRITE_FILE(S["stored_items"], stored_items)
+ var/list/file_data = list()
+ file_data["data"] = stored_items
+ fdel(json_file)
+ WRITE_FILE(json_file, json_encode(file_data))
memory_saved = TRUE
/obj/machinery/smartfridge/black_box/proc/ReadMemory()
- var/savefile/S = new /savefile("data/npc_saves/Blackbox.sav")
- S["stored_items"] >> stored_items
-
+ if(fexists("data/npc_saves/Blackbox.sav")) //legacy compatability to convert old format to new
+ var/savefile/S = new /savefile("data/npc_saves/Blackbox.sav")
+ S["stored_items"] >> stored_items
+ fdel("data/npc_saves/Blackbox.sav")
+ else
+ var/json_file = file("data/npc_saves/Blackbox.json")
+ if(!fexists(json_file))
+ return
+ var/list/json = list()
+ json = json_decode(file2text(json_file))
+ stored_items = json["data"]
if(isnull(stored_items))
stored_items = list()
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 66fbc8af8c..aa96494745 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -296,7 +296,7 @@
else
parrot_state |= PARROT_FLEE //Otherwise, fly like a bat out of hell!
drop_held_item(0)
- if(!stat && M.a_intent == INTENT_HELP)
+ if(stat != DEAD && M.a_intent == INTENT_HELP)
handle_automated_speech(1) //assured speak/emote
return
@@ -924,22 +924,36 @@
..(gibbed)
/mob/living/simple_animal/parrot/Poly/proc/Read_Memory()
- var/savefile/S = new /savefile("data/npc_saves/Poly.sav")
- S["phrases"] >> speech_buffer
- S["roundssurvived"] >> rounds_survived
- S["longestsurvival"] >> longest_survival
- S["longestdeathstreak"] >> longest_deathstreak
-
+ if(fexists("data/npc_saves/Poly.sav")) //legacy compatability to convert old format to new
+ var/savefile/S = new /savefile("data/npc_saves/Poly.sav")
+ S["phrases"] >> speech_buffer
+ S["roundssurvived"] >> rounds_survived
+ S["longestsurvival"] >> longest_survival
+ S["longestdeathstreak"] >> longest_deathstreak
+ fdel("data/npc_saves/Poly.sav")
+ else
+ var/json_file = file("data/npc_saves/Poly.json")
+ if(!fexists(json_file))
+ return
+ var/list/json = list()
+ json = json_decode(file2text(json_file))
+ speech_buffer = json["phrases"]
+ rounds_survived = json["roundssurvived"]
+ longest_survival = json["longestsurvival"]
+ longest_deathstreak = json["longestdeathstreak"]
if(!islist(speech_buffer))
speech_buffer = list()
/mob/living/simple_animal/parrot/Poly/proc/Write_Memory()
- var/savefile/S = new /savefile("data/npc_saves/Poly.sav")
+ var/json_file = file("data/npc_saves/Poly.json")
+ var/list/file_data = list()
if(islist(speech_buffer))
- WRITE_FILE(S["phrases"], speech_buffer)
- WRITE_FILE(S["roundssurvived"], rounds_survived)
- WRITE_FILE(S["longestsurvival"], longest_survival)
- WRITE_FILE(S["longestdeathstreak"], longest_deathstreak)
+ file_data["phrases"] = speech_buffer
+ file_data["roundssurvived"] = rounds_survived
+ file_data["longestsurvival"] = longest_survival
+ file_data["longestdeathstreak"] = longest_deathstreak
+ fdel(json_file)
+ WRITE_FILE(json_file, json_encode(file_data))
memory_saved = 1
/mob/living/simple_animal/parrot/Poly/ghost
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 54b6e1ab13..aa95d182cb 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -386,14 +386,14 @@
else
..()
-/mob/living/simple_animal/update_canmove()
+/mob/living/simple_animal/update_canmove(value_otherwise = TRUE)
if(IsUnconscious() || IsStun() || IsKnockdown() || stat || resting)
drop_all_held_items()
- canmove = 0
+ canmove = FALSE
else if(buckled)
- canmove = 0
+ canmove = FALSE
else
- canmove = 1
+ canmove = value_otherwise
update_transform()
update_action_buttons_icon()
return canmove
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 5d3d21f082..297f788001 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -623,6 +623,8 @@
continue
if(overrides.len && (A in overrides))
continue
+ if(A.IsObscured())
+ continue
statpanel(listed_turf.name, null, A)
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 021b32e00c..f9763cde7d 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -495,6 +495,30 @@
. = new_corgi
qdel(src)
+/mob/living/carbon/proc/gorillize()
+ if(notransform)
+ return
+
+ var/Itemlist = get_equipped_items()
+ Itemlist += held_items
+ for(var/obj/item/W in Itemlist)
+ dropItemToGround(W, TRUE)
+
+ regenerate_icons()
+ notransform = TRUE
+ canmove = FALSE
+ icon = null
+ invisibility = INVISIBILITY_MAXIMUM
+ var/mob/living/simple_animal/hostile/gorilla/new_gorilla = new (get_turf(src))
+ new_gorilla.a_intent = INTENT_HARM
+ if(mind)
+ mind.transfer_to(new_gorilla)
+ else
+ new_gorilla.key = key
+ to_chat(new_gorilla, "You are now a gorilla. Ooga ooga!")
+ . = new_gorilla
+ qdel(src)
+
/mob/living/carbon/human/Animalize()
var/list/mobtypes = typesof(/mob/living/simple_animal)
diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm
index c0db06f730..95e78391bb 100644
--- a/code/modules/modular_computers/computers/item/computer.dm
+++ b/code/modules/modular_computers/computers/item/computer.dm
@@ -13,7 +13,6 @@
var/last_battery_percent = 0 // Used for deciding if battery percentage has chandged
var/last_world_time = "00:00"
var/list/last_header_icons
- var/emagged = FALSE // Whether the computer is emagged.
var/base_active_power_usage = 50 // Power usage when the computer is open (screen is active) and can be interacted with. Remember hardware can use power too.
var/base_idle_power_usage = 5 // Power usage when the computer is idle and screen is off (currently only applies to laptops)
diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm.rej b/code/modules/modular_computers/computers/machinery/modular_computer.dm.rej
deleted file mode 100644
index 375995bf60..0000000000
--- a/code/modules/modular_computers/computers/machinery/modular_computer.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm (rejected hunks)
-@@ -125,7 +125,7 @@
- update_icon()
-
- /obj/machinery/modular_computer/attackby(var/obj/item/W as obj, mob/user)
-- if(cpu && !(flags & NODECONSTRUCT))
-+ if(cpu && !(flags_1 & NODECONSTRUCT_1))
- return cpu.attackby(W, user)
- return ..()
-
diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
index 76cacc00ef..270e1f106f 100644
--- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
@@ -12,90 +12,72 @@ It is possible to destroy the net by the occupant or someone else.
density = TRUE//Can't pass through.
opacity = 0//Can see through.
mouse_opacity = MOUSE_OPACITY_ICON//So you can hit it with stuff.
- anchored = TRUE//Can't drag/grab the trapped mob.
+ anchored = TRUE//Can't drag/grab the net.
layer = ABOVE_ALL_MOB_LAYER
max_integrity = 25 //How much health it has.
- var/mob/living/affecting = null//Who it is currently affecting, if anyone.
- var/mob/living/master = null//Who shot web. Will let this person know if the net was successful or failed.
-
+ can_buckle = 1
+ buckle_lying = 0
+ buckle_prevents_pull = TRUE
+ var/mob/living/carbon/affecting//Who it is currently affecting, if anyone.
+ var/mob/living/carbon/master//Who shot web. Will let this person know if the net was successful or failed.
+ var/check = 15//30 seconds before teleportation. Could be extended I guess.
+ var/success = FALSE
/obj/structure/energy_net/play_attack_sound(damage, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
+ playsound(src, 'sound/weapons/slash.ogg', 80, 1)
if(BURN)
- playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
+ playsound(src, 'sound/weapons/slash.ogg', 80, 1)
/obj/structure/energy_net/Destroy()
- if(affecting)
- var/mob/living/carbon/M = affecting
- M.anchored = FALSE
- for(var/mob/O in viewers(src, 3))
- O.show_message("[M.name] was recovered from the energy net!", 1, "You hear a grunt.", 2)
- if(master)//As long as they still exist.
+ if(!success)
+ if(!QDELETED(affecting))
+ affecting.visible_message("[affecting.name] was recovered from the energy net!", "You were recovered from the energy net!", "You hear a grunt.")
+ if(!QDELETED(master))//As long as they still exist.
to_chat(master, "ERROR: unable to initiate transport protocol. Procedure terminated.")
return ..()
-/obj/structure/energy_net/process(mob/living/carbon/M)
- var/check = 30//30 seconds before teleportation. Could be extended I guess.
- var/mob_name = affecting.name//Since they will report as null if terminated before teleport.
- //The person can still try and attack the net when inside.
-
- M.notransform = 1 //No moving for you!
-
- while(!isnull(M)&&!isnull(src)&&check>0)//While M and net exist, and 30 seconds have not passed.
- check--
- sleep(10)
-
- if(isnull(M)||M.loc!=loc)//If mob is gone or not at the location.
- if(!isnull(master))//As long as they still exist.
- to_chat(master, "ERROR: unable to locate \the [mob_name]. Procedure terminated.")
+/obj/structure/energy_net/process()
+ if(QDELETED(affecting)||affecting.loc!=loc)
qdel(src)//Get rid of the net.
- M.notransform = 0
return
- if(!isnull(src))//As long as both net and person exist.
- //No need to check for countdown here since while() broke, it's implicit that it finished.
+ if(check>0)
+ check--
+ return
- density = FALSE//Make the net pass-through.
- invisibility = INVISIBILITY_ABSTRACT//Make the net invisible so all the animations can play out.
- resistance_flags |= INDESTRUCTIBLE //Make the net invincible so that an explosion/something else won't kill it while, spawn() is running.
- for(var/obj/item/W in M)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(W == H.w_uniform)
- continue//So all they're left with are shoes and uniform.
- if(W == H.shoes)
- continue
- M.dropItemToGround(W)
+ success = TRUE
+ qdel(src)
+ if(ishuman(affecting))
+ var/mob/living/carbon/human/H = affecting
+ for(var/obj/item/W in H)
+ if(W == H.w_uniform)
+ continue//So all they're left with are shoes and uniform.
+ if(W == H.shoes)
+ continue
+ H.dropItemToGround(W)
- playsound(M.loc, 'sound/effects/sparks4.ogg', 50, 1)
- new /obj/effect/temp_visual/dir_setting/ninja/phase/out(get_turf(M), M.dir)
-
- visible_message("[M] suddenly vanishes!")
- M.forceMove(pick(GLOB.holdingfacility)) //Throw mob in to the holding facility.
- to_chat(M, "You appear in a strange place!")
-
- if(!isnull(master))//As long as they still exist.
- to_chat(master, "SUCCESS: transport procedure of \the [affecting] complete.")
- M.notransform = 0
- var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
- spark_system.set_up(5, 0, M.loc)
- spark_system.start()
- playsound(M.loc, 'sound/effects/phasein.ogg', 25, 1)
- playsound(M.loc, 'sound/effects/sparks2.ogg', 50, 1)
- new /obj/effect/temp_visual/dir_setting/ninja/phase(get_turf(M), M.dir)
- qdel(src)
-
- else//And they are free.
- to_chat(M, "You are free of the net!")
- M.notransform = 0
- return
+ playsound(affecting, 'sound/effects/sparks4.ogg', 50, 1)
+ new /obj/effect/temp_visual/dir_setting/ninja/phase/out(affecting.drop_location(), affecting.dir)
+ visible_message("[affecting] suddenly vanishes!")
+ affecting.forceMove(pick(GLOB.holdingfacility)) //Throw mob in to the holding facility.
+ to_chat(affecting, "You appear in a strange place!")
+ if(!QDELETED(master))//As long as they still exist.
+ to_chat(master, "SUCCESS: transport procedure of [affecting] complete.")
+ do_sparks(5, FALSE, affecting)
+ playsound(affecting, 'sound/effects/phasein.ogg', 25, 1)
+ playsound(affecting, 'sound/effects/sparks2.ogg', 50, 1)
+ new /obj/effect/temp_visual/dir_setting/ninja/phase(affecting.drop_location(), affecting.dir)
/obj/structure/energy_net/attack_paw(mob/user)
return attack_hand()
+/obj/structure/energy_net/user_buckle_mob(mob/living/M, mob/living/user)
+ return//We only want our target to be buckled
+/obj/structure/energy_net/user_unbuckle_mob(mob/living/buckled_mob, mob/living/user)
+ return//The net must be destroyed to free the target
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm
index 71f8166339..6c0dddf88b 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm
@@ -2,20 +2,19 @@
//Movement impairing would indicate drugs and the like.
/obj/item/clothing/suit/space/space_ninja/proc/ninjaboost()
- if(!ninjacost(0,N_ADRENALINE))//Have to make sure stat is not counted for this ability.
+ if(!ninjacost(0,N_ADRENALINE))
var/mob/living/carbon/human/H = affecting
H.SetUnconscious(0)
H.SetStun(0)
H.SetKnockdown(0)
-
- spawn(30)//Slight delay so the enemy does not immedietly know the ability was used. Due to lag, this often came before waking up.
- H.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!"))
- spawn(70)
- if(reagents.total_volume)
- var/fraction = min(a_transfer/reagents.total_volume, 1)
- reagents.reaction(H, INJECT, fraction)
- reagents.trans_id_to(H, "radium", a_transfer)
- to_chat(H, "You are beginning to feel the after-effect of the injection.")
+ H.stuttering = 0
+ H.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!"))
a_boost--
to_chat(H, "There are [a_boost] adrenaline boosts remaining.")
s_coold = 3
+ addtimer(CALLBACK(src, .proc/ninjaboost_after), 70)
+
+/obj/item/clothing/suit/space/space_ninja/proc/ninjaboost_after()
+ var/mob/living/carbon/human/H = affecting
+ H.reagents.add_reagent("radium", a_transfer)
+ to_chat(H, "You are beginning to feel the after-effect of the injection.")
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_cost_check.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_cost_check.dm
index 1d728084b3..12fea51815 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_cost_check.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_cost_check.dm
@@ -3,10 +3,6 @@
//Cost function for suit Procs/Verbs/Abilities
/obj/item/clothing/suit/space/space_ninja/proc/ninjacost(cost = 0, specificCheck = 0)
var/mob/living/carbon/human/H = affecting
- if((H.stat || H.incorporeal_move) && (specificCheck != N_ADRENALINE))//Will not return if user is using an adrenaline booster since you can use them when stat==1.
- to_chat(H, "You must be conscious and solid to do this.")
- return 1
-
var/actualCost = cost*10
if(cost && cell.charge < actualCost)
to_chat(H, "Not enough energy.")
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
index 18682e87eb..81d731b110 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
@@ -1,24 +1,33 @@
//Allows the ninja to kidnap people
-/obj/item/clothing/suit/space/space_ninja/proc/ninjanet(mob/living/carbon/C in oview())//Only living carbon mobs.
+/obj/item/clothing/suit/space/space_ninja/proc/ninjanet()
+ var/mob/living/carbon/human/H = affecting
+ var/mob/living/carbon/C = input("Select who to capture:","Capture who?",null) as null|mob in oview(H)
- if(!ninjacost(200,N_STEALTH_CANCEL) && iscarbon(C))
- var/mob/living/carbon/human/H = affecting
- if(C.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
- if(!locate(/obj/structure/energy_net) in C.loc)//Check if they are already being affected by an energy net.
- for(var/turf/T in getline(H.loc, C.loc))
- if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy.
- to_chat(H, "You may not use an energy net through solid obstacles!")
- return
- H.Beam(C,"n_beam",time=15)
- H.say("Get over here!")
- var/obj/structure/energy_net/E = new /obj/structure/energy_net(C.loc)
- H.visible_message("[H] caught [C] with an energy net!","You caught [C] with an energy net!")
- E.affecting = C
- E.master = H
- spawn(0)//Parallel processing.
- E.process(C)
- else
- to_chat(H, "[C.p_they(TRUE)] are already trapped inside an energy net!")
- else
- to_chat(H, "[C.p_they(TRUE)] will bring no honor to your Clan!")
+ if(QDELETED(C)||!(C in oview(H)))
+ return 0
+
+ if(!C.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
+ to_chat(H, "[C.p_they(TRUE)] will bring no honor to your Clan!")
+ return
+ if(locate(/obj/structure/energy_net) in get_turf(C))//Check if they are already being affected by an energy net.
+ to_chat(H, "[C.p_they(TRUE)] are already trapped inside an energy net!")
+ return
+ for(var/turf/T in getline(get_turf(H), get_turf(C)))
+ if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy.
+ to_chat(H, "You may not use an energy net through solid obstacles!")
+ return
+ if(!ninjacost(200,N_STEALTH_CANCEL))
+ H.Beam(C,"n_beam",time=15)
+ H.say("Get over here!")
+ var/obj/structure/energy_net/E = new /obj/structure/energy_net(C.drop_location())
+ E.affecting = C
+ E.master = H
+ H.visible_message("[H] caught [C] with an energy net!","You caught [C] with an energy net!")
+
+ if(C.buckled)
+ C.buckled.unbuckle_mob(affecting,TRUE)
+ E.buckle_mob(C, TRUE) //No moving for you!
+ //The person can still try and attack the net when inside.
+
+ START_PROCESSING(SSobj, E)
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index 7cf355fde6..40d18951e6 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -17,7 +17,7 @@ Contents:
icon_state = "s-ninja"
item_state = "s-ninja_suit"
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/stock_parts/cell)
- slowdown = 0
+ slowdown = 1
resistance_flags = LAVA_PROOF | ACID_PROOF
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 100, acid = 100)
strip_delay = 12
@@ -28,7 +28,6 @@ Contents:
var/mob/living/carbon/human/affecting = null
var/obj/item/stock_parts/cell/cell
var/datum/effect_system/spark_spread/spark_system
- var/list/reagent_list = list("omnizine","salbutamol","spaceacillin","charcoal","nutriment","radium","potass_iodide")//The reagents ids which are added to the suit at New().
var/list/stored_research = list()//For stealing station research.
var/obj/item/disk/tech_disk/t_disk//To copy design onto disk.
var/obj/item/dash/energy_katana/energyKatana //For teleporting the katana back to the ninja (It's an ability)
@@ -44,11 +43,10 @@ Contents:
var/s_cost = 5//Base energy cost each ntick.
var/s_acost = 25//Additional cost for additional powers active.
var/s_delay = 40//How fast the suit does certain things, lower is faster. Can be overridden in specific procs. Also determines adverse probability.
- var/a_transfer = 20//How much reagent is transferred when injecting.
- var/r_maxamount = 80//How much reagent in total there is.
+ var/a_transfer = 20//How much radium is used per adrenaline boost.
+ var/a_maxamount = 7//Maximum number of adrenaline boosts.
//Support function variables.
- var/spideros = 0//Mode of SpiderOS. This can change so I won't bother listing the modes here (0 is hub). Check ninja_equipment.dm for how it all works.
var/s_active = 0//Stealth off.
var/s_busy = FALSE//Is the suit busy with a process? Like AI hacking. Used for safety functions.
@@ -73,28 +71,12 @@ Contents:
for(var/T in subtypesof(/datum/tech))//Store up on research.
stored_research += new T(src)
- //Reagent Init
- var/reagent_amount
- for(var/reagent_id in reagent_list)
- reagent_amount += reagent_id == "radium" ? r_maxamount+(a_boost*a_transfer) : r_maxamount
- reagents = new(reagent_amount)
- reagents.my_atom = src
- for(var/reagent_id in reagent_list)
- reagent_id == "radium" ? reagents.add_reagent(reagent_id, r_maxamount+(a_boost*a_transfer)) : reagents.add_reagent(reagent_id, r_maxamount)//It will take into account radium used for adrenaline boosting.
-
//Cell Init
cell = new/obj/item/stock_parts/cell/high
cell.charge = 9000
cell.name = "black power cell"
cell.icon_state = "bscell"
-
-/obj/item/clothing/suit/space/space_ninja/Destroy()
- if(affecting)
- affecting << browse(null, "window=hack spideros")
- return ..()
-
-
//Simply deletes all the attachments and self, killing all related procs.
/obj/item/clothing/suit/space/space_ninja/proc/terminate()
qdel(n_hood)
@@ -117,7 +99,7 @@ Contents:
if(!istype(H))
return 0
if(!is_ninja(H))
- to_chat(H, "\red fÄTaL ÈÈRRoR: 382200-*#00CÖDE RED\nUNAU†HORIZED USÈ DETÈC†††eD\nCoMMÈNCING SUB-R0U†IN3 13...\nTÈRMInATING U-U-USÈR...")
+ to_chat(H, "fÄTaL ÈÈRRoR: 382200-*#00CÖDE RED\nUNAU?HORIZED USÈ DETÈC???eD\nCoMMÈNCING SUB-R0U?IN3 13...\nTÈRMInATING U-U-USÈR...")
H.gib()
return FALSE
if(!istype(H.head, /obj/item/clothing/head/helmet/space/space_ninja))
@@ -131,7 +113,7 @@ Contents:
return FALSE
affecting = H
flags_1 |= NODROP_1 //colons make me go all |=
- slowdown = FALSE
+ slowdown = 0
n_hood = H.head
n_hood.flags_1 |= NODROP_1
n_shoes = H.shoes
@@ -170,7 +152,7 @@ Contents:
..()
if(s_initialized)
if(user == affecting)
- to_chat(user, "All systems operational. Current energy capacity: [cell.charge].")
+ to_chat(user, "All systems operational. Current energy capacity: [DisplayPower(cell.charge)].")
to_chat(user, "The CLOAK-tech device is [s_active?"active":"inactive"].")
to_chat(user, "There are [s_bombs] smoke bomb\s remaining.")
to_chat(user, "There are [a_boost] adrenaline booster\s remaining.")
diff --git a/code/modules/ninja/suit/suit_attackby.dm b/code/modules/ninja/suit/suit_attackby.dm
index 23f2ac4b9e..1db76bc971 100644
--- a/code/modules/ninja/suit/suit_attackby.dm
+++ b/code/modules/ninja/suit/suit_attackby.dm
@@ -1,70 +1,60 @@
/obj/item/clothing/suit/space/space_ninja/attackby(obj/item/I, mob/U, params)
- if(U==affecting)//Safety, in case you try doing this without wearing the suit/being the person with the suit.
+ if(U!=affecting)//Safety, in case you try doing this without wearing the suit/being the person with the suit.
+ return ..()
- if(istype(I, /obj/item/reagent_containers/glass))//If it's a glass beaker.
- var/total_reagent_transfer//Keep track of this stuff.
- for(var/reagent_id in reagent_list)
- var/datum/reagent/R = I.reagents.has_reagent(reagent_id)//Mostly to pull up the name of the reagent after calculating. Also easier to use than writing long proc paths.
- if(R&&reagents.get_reagent_amount(reagent_id)=a_transfer)//Radium is always special.
- //Here we determine how much reagent will actually transfer if there is enough to transfer or there is a need of transfer. Minimum of max amount available (using a_transfer) or amount needed.
- var/amount_to_transfer = min( (r_maxamount+(reagent_id == "radium"?(a_boost*a_transfer):0)-reagents.get_reagent_amount(reagent_id)) ,(round(R.volume/a_transfer))*a_transfer)//In the end here, we round the amount available, then multiply it again.
- R.volume -= amount_to_transfer//Remove from reagent volume. Don't want to delete the reagent now since we need to perserve the name.
- reagents.add_reagent(reagent_id, amount_to_transfer)//Add to suit. Reactions are not important.
- total_reagent_transfer += amount_to_transfer//Add to total reagent trans.
- to_chat(U, "Added [amount_to_transfer] units of [R.name].")
- I.reagents.update_total()//Now we manually update the total to make sure everything is properly shoved under the rug.
-
- to_chat(U, "Replenished a total of [total_reagent_transfer ? total_reagent_transfer : "zero"] chemical units.")
+ if(istype(I, /obj/item/reagent_containers/glass))//If it's a glass beaker.
+ if(I.reagents.has_reagent("radium", a_transfer) && a_boost < a_maxamount)
+ I.reagents.remove_reagent("radium", a_transfer)
+ a_boost++;
+ to_chat(U, "There are now [a_boost] adrenaline boosts remaining.")
return
- else if(istype(I, /obj/item/stock_parts/cell))
- var/obj/item/stock_parts/cell/CELL = I
- if(CELL.maxcharge > cell.maxcharge && n_gloves && n_gloves.candrain)
- to_chat(U, "Higher maximum capacity detected.\nUpgrading...")
- if (n_gloves && n_gloves.candrain && do_after(U,s_delay, target = src))
- U.drop_item()
- CELL.loc = src
- CELL.charge = min(CELL.charge+cell.charge, CELL.maxcharge)
- var/obj/item/stock_parts/cell/old_cell = cell
- old_cell.charge = 0
- U.put_in_hands(old_cell)
- old_cell.add_fingerprint(U)
- old_cell.corrupt()
- old_cell.update_icon()
- cell = CELL
- to_chat(U, "Upgrade complete. Maximum capacity: [round(cell.maxcharge/100)]%")
- else
- to_chat(U, "Procedure interrupted. Protocol terminated.")
- return
-
- else if(istype(I, /obj/item/disk/tech_disk))//If it's a data disk, we want to copy the research on to the suit.
- var/obj/item/disk/tech_disk/TD = I
- var/has_research = 0
- for(var/V in TD.tech_stored)
- if(V)
- has_research = 1
- break
- if(has_research)//If it has something on it.
- to_chat(U, "Research information detected, processing...")
- if(do_after(U,s_delay, target = src))
- for(var/V1 in 1 to TD.max_tech_stored)
- var/datum/tech/new_data = TD.tech_stored[V1]
- TD.tech_stored[V1] = null
- if(!new_data)
- continue
- for(var/V2 in stored_research)
- var/datum/tech/current_data = V2
- if(current_data.id == new_data.id)
- current_data.level = max(current_data.level, new_data.level)
- break
- to_chat(U, "Data analyzed and updated. Disk erased.")
- else
- to_chat(U, "ERROR: Procedure interrupted. Process terminated.")
+ else if(istype(I, /obj/item/stock_parts/cell))
+ var/obj/item/stock_parts/cell/CELL = I
+ if(CELL.maxcharge > cell.maxcharge && n_gloves && n_gloves.candrain)
+ to_chat(U, "Higher maximum capacity detected.\nUpgrading...")
+ if (n_gloves && n_gloves.candrain && do_after(U,s_delay, target = src))
+ U.transferItemToLoc(CELL, src)
+ CELL.charge = min(CELL.charge+cell.charge, CELL.maxcharge)
+ var/obj/item/stock_parts/cell/old_cell = cell
+ old_cell.charge = 0
+ U.put_in_hands(old_cell)
+ old_cell.add_fingerprint(U)
+ old_cell.corrupt()
+ old_cell.update_icon()
+ cell = CELL
+ to_chat(U, "Upgrade complete. Maximum capacity: [round(cell.maxcharge/100)]%")
else
- I.loc = src
- t_disk = I
- to_chat(U, "You slot \the [I] into \the [src].")
- return
- ..()
\ No newline at end of file
+ to_chat(U, "Procedure interrupted. Protocol terminated.")
+ return
+
+ else if(istype(I, /obj/item/disk/tech_disk))//If it's a data disk, we want to copy the research on to the suit.
+ var/obj/item/disk/tech_disk/TD = I
+ var/has_research = FALSE
+ for(var/V in TD.tech_stored)
+ if(V)
+ has_research = TRUE
+ break
+ if(has_research)//If it has something on it.
+ to_chat(U, "Research information detected, processing...")
+ if(do_after(U,s_delay, target = src))
+ for(var/V1 in 1 to TD.max_tech_stored)
+ var/datum/tech/new_data = TD.tech_stored[V1]
+ TD.tech_stored[V1] = null
+ if(!new_data)
+ continue
+ for(var/V2 in stored_research)
+ var/datum/tech/current_data = V2
+ if(current_data.id == new_data.id)
+ current_data.level = max(current_data.level, new_data.level)
+ break
+ to_chat(U, "Data analyzed and updated. Disk erased.")
+
+ else
+ to_chat(U, "ERROR: Procedure interrupted. Process terminated.")
+ else
+ to_chat(U, "No research information detected.")
+ return
+ return ..()
diff --git a/code/modules/ninja/suit/suit_initialisation.dm b/code/modules/ninja/suit/suit_initialisation.dm
index 5fb3fe8a62..0084ff1995 100644
--- a/code/modules/ninja/suit/suit_initialisation.dm
+++ b/code/modules/ninja/suit/suit_initialisation.dm
@@ -11,9 +11,6 @@
/obj/item/clothing/suit/space/space_ninja/proc/ninitialize(delay = s_delay, mob/living/carbon/human/U = loc)
if(!U.mind)
return //Not sure how this could happen.
- if(!is_ninja(U))
- to_chat(U, "You do not understand how this suit functions. Where the heck did it even come from?")
- return
s_busy = TRUE
to_chat(U, "Now initializing...")
addtimer(CALLBACK(src, .proc/ninitialize_two, delay, U), delay)
@@ -30,9 +27,10 @@
addtimer(CALLBACK(src, .proc/ninitialize_four, delay, U), delay)
/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_four(delay, mob/living/carbon/human/U)
- if(U.stat==2||U.health<=0)
- to_chat(U, "FĆAL �Rr�R: 344--93#�&&21 BR��N |/|/aV� PATT$RN RED\nA-A-aB�rT�NG...")
+ if(U.stat == DEAD|| U.health <= 0)
+ to_chat(U, "FÄ?AL �Rr�R: 344--93#�&&21 BR��N |/|/aV� PATT$RN RED\nA-A-aB�rT�NG...")
unlock_suit()
+ s_busy = FALSE
return
lockIcons(U)//Check for icons.
U.regenerate_icons()
@@ -44,13 +42,12 @@
addtimer(CALLBACK(src, .proc/ninitialize_six, delay, U), delay)
/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_six(delay, mob/living/carbon/human/U)
- to_chat(U, "Primary system status: ONLINE.\nBackup system status: ONLINE.\nCurrent energy capacity: [cell.charge].")
+ to_chat(U, "Primary system status: ONLINE.\nBackup system status: ONLINE.\nCurrent energy capacity: [DisplayPower(cell.charge)].")
addtimer(CALLBACK(src, .proc/ninitialize_seven, delay, U), delay)
/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_seven(delay, mob/living/carbon/human/U)
to_chat(U, "All systems operational. Welcome to SpiderOS, [U.real_name].")
- grant_ninja_verbs()
- grant_equip_verbs()
+ s_initialized = TRUE
ntick()
s_busy = FALSE
@@ -66,7 +63,6 @@
/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_two(delay, mob/living/carbon/human/U)
to_chat(U, "Now de-initializing...")
- spideros = 0//Spideros resets.
addtimer(CALLBACK(src, .proc/deinitialize_three, delay, U), delay)
/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_three(delay, mob/living/carbon/human/U)
@@ -92,6 +88,7 @@
/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_eight(delay, mob/living/carbon/human/U)
to_chat(U, "Unsecuring external locking mechanism...\nNeural-net abolished.\nOperation status: FINISHED.")
- remove_equip_verbs()
+ unlock_suit()
U.regenerate_icons()
+ s_initialized = FALSE
s_busy = FALSE
diff --git a/code/modules/paperwork/contract.dm.rej b/code/modules/paperwork/contract.dm.rej
deleted file mode 100644
index 2cfb1cdcb1..0000000000
--- a/code/modules/paperwork/contract.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm (rejected hunks)
-@@ -5,7 +5,7 @@
- throw_speed = 3
- var/signed = FALSE
- var/datum/mind/target
-- flags = NOBLUDGEON
-+ flags_1 = NOBLUDGEON_1
-
- /obj/item/paper/contract/proc/update_text()
- return
diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm
index 541a49706a..2c704b8568 100644
--- a/code/modules/paperwork/paper_cutter.dm
+++ b/code/modules/paperwork/paper_cutter.dm
@@ -124,3 +124,5 @@
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "cutterblade"
item_state = "knife"
+ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
diff --git a/code/modules/paperwork/paper_premade.dm.rej b/code/modules/paperwork/paper_premade.dm.rej
deleted file mode 100644
index 2372bba734..0000000000
--- a/code/modules/paperwork/paper_premade.dm.rej
+++ /dev/null
@@ -1,23 +0,0 @@
-diff a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm (rejected hunks)
-@@ -91,18 +91,18 @@
- info = "...EMPTY HALLS...USELESS SPACE..."
-
-
--/////////// Centcom
-+/////////// CentCom
-
- /obj/item/paper/fluff/stations/centcom/disk_memo
- name = "memo"
- info = "GET DAT FUKKEN DISK"
-
- /obj/item/paper/fluff/stations/centcom/broken_evac
-- info = "Due to circumstances beyond our control, your Emergency Evacuation Shuttle is out of service.
We apologize for the inconvenience this may cause you.
Please enjoy the use of this complementary book.
Sincerely,
Centcom Operations Demolitions Examination Retribution Bugfixing Underlining Services"
-+ info = "Due to circumstances beyond our control, your Emergency Evacuation Shuttle is out of service.
We apologize for the inconvenience this may cause you.
Please enjoy the use of this complementary book.
Sincerely,
CentCom Operations Demolitions Examination Retribution Bugfixing Underlining Services"
-
- /obj/item/paper/fluff/stations/centcom/bulletin
- name = "paper- 'Official Bulletin'"
-- info = "
Centcom Security
Port Division
Official Bulletin
Inspector,
There is an emergency shuttle arriving today.
Approval is restricted to Nanotrasen employees only. Deny all other entrants.
Centcom Port Commissioner"
-+ info = "
CentCom Security
Port Division
Official Bulletin
Inspector,
There is an emergency shuttle arriving today.
Approval is restricted to Nanotrasen employees only. Deny all other entrants.
CentCom Port Commissioner"
-
-
- /////////// Lavaland
diff --git a/code/modules/paperwork/pen.dm.rej b/code/modules/paperwork/pen.dm.rej
deleted file mode 100644
index 0f04a96950..0000000000
--- a/code/modules/paperwork/pen.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm (rejected hunks)
-@@ -168,7 +168,7 @@
- */
- /obj/item/pen/sleepy
- origin_tech = "engineering=4;syndicate=2"
-- container_type = OPENCONTAINER
-+ container_type = OPENCONTAINER_1
-
-
- /obj/item/pen/sleepy/attack(mob/living/M, mob/user)
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index f6b39514b2..57da035890 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -17,6 +17,8 @@
desc = "A camera film cartridge. Insert it into a camera to reload it."
icon_state = "film"
item_state = "electropack"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_TINY
resistance_flags = FLAMMABLE
diff --git a/code/modules/paperwork/photography.dm.rej b/code/modules/paperwork/photography.dm.rej
deleted file mode 100644
index eb8210739b..0000000000
--- a/code/modules/paperwork/photography.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm (rejected hunks)
-@@ -497,7 +497,7 @@
- desc = "The perfect showcase for your favorite deathtrap memories."
- icon = 'icons/obj/decals.dmi'
- materials = list()
-- flags = 0
-+ flags_1 = 0
- icon_state = "frame-empty"
- result_path = /obj/structure/sign/picture_frame
- var/obj/item/photo/displayed
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 716c1b1f80..3b070f1384 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -120,8 +120,15 @@
if(auto_name)
name = "\improper [get_area(src)] APC"
- pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 26 : -27)
- pixel_y = (src.tdir & 3)? (src.tdir == 1 ? 25 : -25) : 0
+ switch(tdir)
+ if(NORTH)
+ pixel_y = 23
+ if(SOUTH)
+ pixel_y = -23
+ if(EAST)
+ pixel_x = 24
+ if(WEST)
+ pixel_x = -25
if (building)
area = get_area(src)
opened = 1
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 8dd013facc..34635084dd 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -1,11 +1,11 @@
/obj/item/stock_parts/cell
name = "power cell"
- desc = "A rechargeable electrochemical power cell."
+ desc = "A rechargeable electrochemical power cell."
icon = 'icons/obj/power.dmi'
icon_state = "cell"
item_state = "cell"
- lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
origin_tech = "powerstorage=1"
force = 5
throwforce = 5
@@ -156,7 +156,7 @@
/obj/item/stock_parts/cell/blob_act(obj/structure/blob/B)
- ex_act(EXPLODE_DEVASTATE)
+ ex_act(EXPLODE_DEVASTATE)
/obj/item/stock_parts/cell/proc/get_electrocute_damage()
if(charge >= 1000)
@@ -166,7 +166,7 @@
/* Cell variants*/
/obj/item/stock_parts/cell/crap
- name = "\improper Nanotrasen brand rechargeable AA battery"
+ name = "\improper Nanotrasen brand rechargeable AA battery"
desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT
maxcharge = 500
materials = list(MAT_GLASS=40)
@@ -176,8 +176,21 @@
..()
charge = 0
+/obj/item/stock_parts/cell/upgraded
+ name = "high-capacity power cell"
+ desc = "A power cell with a slightly higher capacity than normal!"
+ maxcharge = 2500
+ materials = list(MAT_GLASS=50)
+ rating = 2
+ chargerate = 1000
+
+/obj/item/stock_parts/cell/upgraded/plus
+ name = "upgraded power cell+"
+ desc = "A power cell with an even higher capacity than the base model!"
+ maxcharge = 5000
+
/obj/item/stock_parts/cell/secborg
- name = "security borg rechargeable D battery"
+ name = "security borg rechargeable D battery"
origin_tech = null
maxcharge = 600 //600 max charge / 100 charge per shot = six shots
materials = list(MAT_GLASS=40)
@@ -249,7 +262,7 @@
/obj/item/stock_parts/cell/bluespace
name = "bluespace power cell"
- desc = "A rechargeable transdimensional power cell."
+ desc = "A rechargeable transdimensional power cell."
origin_tech = "powerstorage=5;bluespace=4;materials=4;engineering=4"
icon_state = "bscell"
maxcharge = 40000
@@ -289,7 +302,7 @@
/obj/item/stock_parts/cell/potato
name = "potato battery"
- desc = "A rechargeable starch based power cell."
+ desc = "A rechargeable starch based power cell."
icon = 'icons/obj/hydroponics/harvest.dmi'
icon_state = "potato"
origin_tech = "powerstorage=1;biotech=1"
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 8654953994..096c050fcc 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -588,6 +588,8 @@
icon_state = "lbulb"
base_state = "lbulb"
item_state = "contvapour"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
brightness = 4
/obj/item/light/throw_impact(atom/hit_atom)
diff --git a/code/modules/power/singularity/emitter.dm.rej b/code/modules/power/singularity/emitter.dm.rej
deleted file mode 100644
index 12ee0046bd..0000000000
--- a/code/modules/power/singularity/emitter.dm.rej
+++ /dev/null
@@ -1,12 +0,0 @@
-diff a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm (rejected hunks)
-@@ -445,8 +445,8 @@
- name = "turret controls"
- icon_state = "offhand"
- w_class = WEIGHT_CLASS_HUGE
-- flags = ABSTRACT | NODROP
-- resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | NOBLUDGEON
-+ flags_1 = ABSTRACT_1 | NODROP_1
-+ resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | NOBLUDGEON_1
- var/delay = 0
-
- /obj/item/turret_control/afterattack(atom/targeted_atom, mob/user)
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm.rej b/code/modules/power/singularity/particle_accelerator/particle_control.dm.rej
deleted file mode 100644
index c8e42a734f..0000000000
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm (rejected hunks)
-@@ -17,7 +17,7 @@
- var/active = 0
- var/strength = 0
- var/powered = 0
-- mouse_opacity = 2
-+ mouse_opacity = MOUSE_OPACITY_OPAQUE
-
- /obj/machinery/particle_accelerator/control_box/Initialize()
- . = ..()
diff --git a/code/modules/power/supermatter/supermatter.dm.rej b/code/modules/power/supermatter/supermatter.dm.rej
deleted file mode 100644
index 7360ec9fbb..0000000000
--- a/code/modules/power/supermatter/supermatter.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm (rejected hunks)
-@@ -524,7 +524,7 @@
- R.receive_pulse(power * (1 + power_transmission_bonus)/10 * freon_transmit_modifier)
-
- /obj/machinery/power/supermatter_shard/attackby(obj/item/W, mob/living/user, params)
-- if(!istype(W) || (W.flags & ABSTRACT) || !istype(user))
-+ if(!istype(W) || (W.flags_1 & ABSTRACT_1) || !istype(user))
- return
- if(istype(W, /obj/item/scalpel/supermatter))
- playsound(src, W.usesound, 100, 1)
diff --git a/code/modules/procedural_mapping/mapGenerators/shuttle.dm b/code/modules/procedural_mapping/mapGenerators/shuttle.dm
index 7ce98040bb..ba877eeabb 100644
--- a/code/modules/procedural_mapping/mapGenerators/shuttle.dm
+++ b/code/modules/procedural_mapping/mapGenerators/shuttle.dm
@@ -3,7 +3,7 @@
/datum/mapGeneratorModule/border/shuttleWalls
spawnableAtoms = list()
- spawnableTurfs = list(/turf/closed/wall/shuttle = 100)
+ spawnableTurfs = list(/turf/closed/wall/mineral/titanium = 100)
// Generators
/datum/mapGenerator/shuttle/full
diff --git a/code/modules/projectiles/guns/ballistic/laser_gatling.dm b/code/modules/projectiles/guns/ballistic/laser_gatling.dm
index 52bff5129b..b73c1b7242 100644
--- a/code/modules/projectiles/guns/ballistic/laser_gatling.dm
+++ b/code/modules/projectiles/guns/ballistic/laser_gatling.dm
@@ -7,6 +7,8 @@
icon = 'icons/obj/guns/minigun.dmi'
icon_state = "holstered"
item_state = "backpack"
+ lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi'
slot_flags = SLOT_BACK
w_class = WEIGHT_CLASS_HUGE
var/obj/item/gun/ballistic/minigun/gun
diff --git a/code/modules/projectiles/guns/beam_rifle.dm.rej b/code/modules/projectiles/guns/beam_rifle.dm.rej
deleted file mode 100644
index ecc9695fda..0000000000
--- a/code/modules/projectiles/guns/beam_rifle.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/projectiles/guns/beam_rifle.dm b/code/modules/projectiles/guns/beam_rifle.dm (rejected hunks)
-@@ -715,7 +715,7 @@
- light_range = 2
- light_color = "#00ffff"
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
-- flags = ABSTRACT
-+ flags_1 = ABSTRACT_1
- appearance_flags = 0
-
- /obj/effect/projectile_beam/proc/scale_to(nx,ny,override=TRUE)
diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm
index e13e1d5f0b..1ce94796fc 100644
--- a/code/modules/projectiles/guns/energy/energy_gun.dm
+++ b/code/modules/projectiles/guns/energy/energy_gun.dm
@@ -65,6 +65,9 @@
name = "\improper DRAGnet"
desc = "The \"Dynamic Rapid-Apprehension of the Guilty\" net is a revolution in law enforcement technology."
icon_state = "dragnet"
+ item_state = "dragnet"
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
origin_tech = "combat=4;magnets=3;bluespace=4"
ammo_type = list(/obj/item/ammo_casing/energy/net, /obj/item/ammo_casing/energy/trap)
can_flashlight = 0
diff --git a/code/modules/projectiles/guns/energy/pulse.dm.rej b/code/modules/projectiles/guns/energy/pulse.dm.rej
deleted file mode 100644
index 1466e76076..0000000000
--- a/code/modules/projectiles/guns/energy/pulse.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm (rejected hunks)
-@@ -6,7 +6,7 @@
- w_class = WEIGHT_CLASS_BULKY
- force = 10
- modifystate = TRUE
-- flags = CONDUCT
-+ flags_1 = CONDUCT_1
- slot_flags = SLOT_BACK
- ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse, /obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
- cell_type = "/obj/item/stock_parts/cell/pulse"
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index fddf73dfbf..fa7540315e 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -1,290 +1,290 @@
-/obj/item/gun/energy/ionrifle
- name = "ion rifle"
- desc = "A man-portable anti-armor weapon designed to disable mechanical threats at range."
- icon_state = "ionrifle"
- item_state = null //so the human update icon uses the icon_state instead.
- origin_tech = "combat=4;magnets=4"
- can_flashlight = 1
- w_class = WEIGHT_CLASS_HUGE
+/obj/item/gun/energy/ionrifle
+ name = "ion rifle"
+ desc = "A man-portable anti-armor weapon designed to disable mechanical threats at range."
+ icon_state = "ionrifle"
+ item_state = null //so the human update icon uses the icon_state instead.
+ origin_tech = "combat=4;magnets=4"
+ can_flashlight = 1
+ w_class = WEIGHT_CLASS_HUGE
flags_1 = CONDUCT_1
- slot_flags = SLOT_BACK
- ammo_type = list(/obj/item/ammo_casing/energy/ion)
- ammo_x_offset = 3
- flight_x_offset = 17
- flight_y_offset = 9
-
-/obj/item/gun/energy/ionrifle/emp_act(severity)
- return
-
-/obj/item/gun/energy/ionrifle/carbine
- name = "ion carbine"
- desc = "The MK.II Prototype Ion Projector is a lightweight carbine version of the larger ion rifle, built to be ergonomic and efficient."
- icon_state = "ioncarbine"
- w_class = WEIGHT_CLASS_NORMAL
- slot_flags = SLOT_BELT
- pin = null
- ammo_x_offset = 2
- flight_x_offset = 18
- flight_y_offset = 11
-
-/obj/item/gun/energy/decloner
- name = "biological demolecularisor"
- desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements."
- icon_state = "decloner"
- origin_tech = "combat=4;materials=4;biotech=5;plasmatech=6"
- ammo_type = list(/obj/item/ammo_casing/energy/declone)
- pin = null
- ammo_x_offset = 1
-
-/obj/item/gun/energy/decloner/update_icon()
- ..()
- var/obj/item/ammo_casing/energy/shot = ammo_type[select]
- if(cell.charge > shot.e_cost)
- add_overlay("decloner_spin")
-
-/obj/item/gun/energy/floragun
- name = "floral somatoray"
- desc = "A tool that discharges controlled radiation which induces mutation in plant cells."
- icon_state = "flora"
- item_state = "gun"
- ammo_type = list(/obj/item/ammo_casing/energy/flora/yield, /obj/item/ammo_casing/energy/flora/mut)
- origin_tech = "materials=2;biotech=4"
- modifystate = 1
- ammo_x_offset = 1
- selfcharge = 1
-
-/obj/item/gun/energy/meteorgun
- name = "meteor gun"
- desc = "For the love of god, make sure you're aiming this the right way!"
- icon_state = "meteor_gun"
- item_state = "c20r"
- w_class = WEIGHT_CLASS_BULKY
- ammo_type = list(/obj/item/ammo_casing/energy/meteor)
- cell_type = "/obj/item/stock_parts/cell/potato"
- clumsy_check = 0 //Admin spawn only, might as well let clowns use it.
- selfcharge = 1
-
-/obj/item/gun/energy/meteorgun/pen
- name = "meteor pen"
- desc = "The pen is mightier than the sword."
- icon = 'icons/obj/bureaucracy.dmi'
- icon_state = "pen"
- item_state = "pen"
- lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/items_righthand.dmi'
- w_class = WEIGHT_CLASS_TINY
-
-/obj/item/gun/energy/mindflayer
- name = "\improper Mind Flayer"
- desc = "A prototype weapon recovered from the ruins of Research-Station Epsilon."
- icon_state = "xray"
- item_state = null
- ammo_type = list(/obj/item/ammo_casing/energy/mindflayer)
- ammo_x_offset = 2
-
-/obj/item/gun/energy/kinetic_accelerator/crossbow
- name = "mini energy crossbow"
- desc = "A weapon favored by syndicate stealth specialists."
- icon_state = "crossbow"
- item_state = "crossbow"
- w_class = WEIGHT_CLASS_SMALL
- materials = list(MAT_METAL=2000)
- origin_tech = "combat=4;magnets=4;syndicate=5"
- suppressed = 1
- ammo_type = list(/obj/item/ammo_casing/energy/bolt)
- weapon_weight = WEAPON_LIGHT
- unique_rename = 0
- overheat_time = 20
- holds_charge = TRUE
- unique_frequency = TRUE
- can_flashlight = 0
- max_mod_capacity = 0
- empty_state = null
-
-/obj/item/gun/energy/kinetic_accelerator/crossbow/halloween
- name = "candy corn crossbow"
- desc = "A weapon favored by Syndicate trick-or-treaters."
- icon_state = "crossbow_halloween"
- item_state = "crossbow"
- ammo_type = list(/obj/item/ammo_casing/energy/bolt/halloween)
-
-/obj/item/gun/energy/kinetic_accelerator/crossbow/large
- name = "energy crossbow"
- desc = "A reverse engineered weapon using syndicate technology."
- icon_state = "crossbowlarge"
- w_class = WEIGHT_CLASS_NORMAL
- materials = list(MAT_METAL=4000)
- origin_tech = "combat=4;magnets=4;syndicate=2"
- suppressed = 0
- ammo_type = list(/obj/item/ammo_casing/energy/bolt/large)
- pin = null
-
-/obj/item/gun/energy/plasmacutter
- name = "plasma cutter"
- desc = "A mining tool capable of expelling concentrated plasma bursts. You could use it to cut limbs off xenos! Or, you know, mine stuff."
- icon_state = "plasmacutter"
- item_state = "plasmacutter"
- origin_tech = "combat=1;materials=3;magnets=2;plasmatech=3;engineering=1"
- ammo_type = list(/obj/item/ammo_casing/energy/plasma)
+ slot_flags = SLOT_BACK
+ ammo_type = list(/obj/item/ammo_casing/energy/ion)
+ ammo_x_offset = 3
+ flight_x_offset = 17
+ flight_y_offset = 9
+
+/obj/item/gun/energy/ionrifle/emp_act(severity)
+ return
+
+/obj/item/gun/energy/ionrifle/carbine
+ name = "ion carbine"
+ desc = "The MK.II Prototype Ion Projector is a lightweight carbine version of the larger ion rifle, built to be ergonomic and efficient."
+ icon_state = "ioncarbine"
+ w_class = WEIGHT_CLASS_NORMAL
+ slot_flags = SLOT_BELT
+ pin = null
+ ammo_x_offset = 2
+ flight_x_offset = 18
+ flight_y_offset = 11
+
+/obj/item/gun/energy/decloner
+ name = "biological demolecularisor"
+ desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements."
+ icon_state = "decloner"
+ origin_tech = "combat=4;materials=4;biotech=5;plasmatech=6"
+ ammo_type = list(/obj/item/ammo_casing/energy/declone)
+ pin = null
+ ammo_x_offset = 1
+
+/obj/item/gun/energy/decloner/update_icon()
+ ..()
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select]
+ if(cell.charge > shot.e_cost)
+ add_overlay("decloner_spin")
+
+/obj/item/gun/energy/floragun
+ name = "floral somatoray"
+ desc = "A tool that discharges controlled radiation which induces mutation in plant cells."
+ icon_state = "flora"
+ item_state = "gun"
+ ammo_type = list(/obj/item/ammo_casing/energy/flora/yield, /obj/item/ammo_casing/energy/flora/mut)
+ origin_tech = "materials=2;biotech=4"
+ modifystate = 1
+ ammo_x_offset = 1
+ selfcharge = 1
+
+/obj/item/gun/energy/meteorgun
+ name = "meteor gun"
+ desc = "For the love of god, make sure you're aiming this the right way!"
+ icon_state = "meteor_gun"
+ item_state = "c20r"
+ w_class = WEIGHT_CLASS_BULKY
+ ammo_type = list(/obj/item/ammo_casing/energy/meteor)
+ cell_type = "/obj/item/stock_parts/cell/potato"
+ clumsy_check = 0 //Admin spawn only, might as well let clowns use it.
+ selfcharge = 1
+
+/obj/item/gun/energy/meteorgun/pen
+ name = "meteor pen"
+ desc = "The pen is mightier than the sword."
+ icon = 'icons/obj/bureaucracy.dmi'
+ icon_state = "pen"
+ item_state = "pen"
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
+ w_class = WEIGHT_CLASS_TINY
+
+/obj/item/gun/energy/mindflayer
+ name = "\improper Mind Flayer"
+ desc = "A prototype weapon recovered from the ruins of Research-Station Epsilon."
+ icon_state = "xray"
+ item_state = null
+ ammo_type = list(/obj/item/ammo_casing/energy/mindflayer)
+ ammo_x_offset = 2
+
+/obj/item/gun/energy/kinetic_accelerator/crossbow
+ name = "mini energy crossbow"
+ desc = "A weapon favored by syndicate stealth specialists."
+ icon_state = "crossbow"
+ item_state = "crossbow"
+ w_class = WEIGHT_CLASS_SMALL
+ materials = list(MAT_METAL=2000)
+ origin_tech = "combat=4;magnets=4;syndicate=5"
+ suppressed = 1
+ ammo_type = list(/obj/item/ammo_casing/energy/bolt)
+ weapon_weight = WEAPON_LIGHT
+ unique_rename = 0
+ overheat_time = 20
+ holds_charge = TRUE
+ unique_frequency = TRUE
+ can_flashlight = 0
+ max_mod_capacity = 0
+ empty_state = null
+
+/obj/item/gun/energy/kinetic_accelerator/crossbow/halloween
+ name = "candy corn crossbow"
+ desc = "A weapon favored by Syndicate trick-or-treaters."
+ icon_state = "crossbow_halloween"
+ item_state = "crossbow"
+ ammo_type = list(/obj/item/ammo_casing/energy/bolt/halloween)
+
+/obj/item/gun/energy/kinetic_accelerator/crossbow/large
+ name = "energy crossbow"
+ desc = "A reverse engineered weapon using syndicate technology."
+ icon_state = "crossbowlarge"
+ w_class = WEIGHT_CLASS_NORMAL
+ materials = list(MAT_METAL=4000)
+ origin_tech = "combat=4;magnets=4;syndicate=2"
+ suppressed = 0
+ ammo_type = list(/obj/item/ammo_casing/energy/bolt/large)
+ pin = null
+
+/obj/item/gun/energy/plasmacutter
+ name = "plasma cutter"
+ desc = "A mining tool capable of expelling concentrated plasma bursts. You could use it to cut limbs off xenos! Or, you know, mine stuff."
+ icon_state = "plasmacutter"
+ item_state = "plasmacutter"
+ origin_tech = "combat=1;materials=3;magnets=2;plasmatech=3;engineering=1"
+ ammo_type = list(/obj/item/ammo_casing/energy/plasma)
flags_1 = CONDUCT_1
container_type = OPENCONTAINER_1
- attack_verb = list("attacked", "slashed", "cut", "sliced")
- force = 12
- sharpness = IS_SHARP
- can_charge = 0
- heat = 3800
- toolspeed = 0.7 //plasmacutters can be used as welders for a few things, and are faster than standard welders
-
-/obj/item/gun/energy/plasmacutter/examine(mob/user)
- ..()
- if(cell)
- to_chat(user, "[src] is [round(cell.percent())]% charged.")
-
-/obj/item/gun/energy/plasmacutter/attackby(obj/item/A, mob/user)
- if(istype(A, /obj/item/stack/sheet/mineral/plasma))
- var/obj/item/stack/sheet/S = A
- S.use(1)
- cell.give(1000)
- recharge_newshot(1)
- to_chat(user, "You insert [A] in [src], recharging it.")
- else if(istype(A, /obj/item/ore/plasma))
- qdel(A)
- cell.give(500)
- recharge_newshot(1)
- to_chat(user, "You insert [A] in [src], recharging it.")
- else
- ..()
-
-/obj/item/gun/energy/plasmacutter/update_icon()
- return
-
-/obj/item/gun/energy/plasmacutter/adv
- name = "advanced plasma cutter"
- icon_state = "adv_plasmacutter"
- origin_tech = "combat=3;materials=4;magnets=3;plasmatech=4;engineering=2"
- force = 15
- ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv)
-
-/obj/item/gun/energy/wormhole_projector
- name = "bluespace wormhole projector"
- desc = "A projector that emits high density quantum-coupled bluespace beams."
- ammo_type = list(/obj/item/ammo_casing/energy/wormhole, /obj/item/ammo_casing/energy/wormhole/orange)
- item_state = null
- icon_state = "wormhole_projector"
- origin_tech = "combat=4;bluespace=6;plasmatech=4;engineering=4"
- var/obj/effect/portal/p_blue
- var/obj/effect/portal/p_orange
-
-/obj/item/gun/energy/wormhole_projector/update_icon()
- icon_state = "[initial(icon_state)][select]"
- item_state = icon_state
- return
-
-/obj/item/gun/energy/wormhole_projector/process_chamber()
- ..()
- select_fire()
-
-/obj/item/gun/energy/wormhole_projector/proc/on_portal_destroy(obj/effect/portal/P)
- if(P == p_blue)
- p_blue = null
- else if(P == p_orange)
- p_orange = null
-
-/obj/item/gun/energy/wormhole_projector/proc/has_blue_portal()
- if(istype(p_blue) && !QDELETED(p_blue))
- return TRUE
- return FALSE
-
-/obj/item/gun/energy/wormhole_projector/proc/has_orange_portal()
- if(istype(p_orange) && !QDELETED(p_orange))
- return TRUE
- return FALSE
-
-/obj/item/gun/energy/wormhole_projector/proc/crosslink()
- if(!has_blue_portal() && !has_orange_portal())
- return
- if(!has_blue_portal() && has_orange_portal())
- p_orange.link_portal(null)
- return
- if(!has_orange_portal() && has_blue_portal())
- p_blue.link_portal(null)
- return
- p_orange.link_portal(p_blue)
- p_blue.link_portal(p_orange)
-
-/obj/item/gun/energy/wormhole_projector/proc/create_portal(obj/item/projectile/beam/wormhole/W, turf/target)
- var/obj/effect/portal/P = new /obj/effect/portal(target, src, 300, null, FALSE, null)
- if(istype(W, /obj/item/projectile/beam/wormhole/orange))
- qdel(p_orange)
- p_orange = P
- P.icon_state = "portal1"
- else
- qdel(p_blue)
- p_blue = P
- crosslink()
-
-/* 3d printer 'pseudo guns' for borgs */
-
-/obj/item/gun/energy/printer
- name = "cyborg lmg"
- desc = "A machinegun that fires 3d-printed flechettes slowly regenerated using a cyborg's internal power source."
- icon_state = "l6closed0"
- icon = 'icons/obj/guns/projectile.dmi'
- cell_type = "/obj/item/stock_parts/cell/secborg"
- ammo_type = list(/obj/item/ammo_casing/energy/c3dbullet)
- can_charge = 0
- use_cyborg_cell = 1
-
-/obj/item/gun/energy/printer/update_icon()
- return
-
-/obj/item/gun/energy/printer/emp_act()
- return
-
-/obj/item/gun/energy/temperature
- name = "temperature gun"
- icon_state = "freezegun"
- desc = "A gun that changes temperatures."
- origin_tech = "combat=4;materials=4;powerstorage=3;magnets=2"
- ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot)
- cell_type = "/obj/item/stock_parts/cell/high"
- pin = null
-
-/obj/item/gun/energy/temperature/security
- name = "security temperature gun"
- desc = "A weapon that can only be used to its full potential by the truly robust."
- origin_tech = "combat=2;materials=2;powerstorage=1;magnets=1"
- pin = /obj/item/device/firing_pin
-
-/obj/item/gun/energy/laser/instakill
- name = "instakill rifle"
- icon_state = "instagib"
- item_state = "instagib"
- desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit."
- ammo_type = list(/obj/item/ammo_casing/energy/instakill)
- force = 60
- origin_tech = "combat=7;magnets=6"
-
-/obj/item/gun/energy/laser/instakill/red
- desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a red design."
- icon_state = "instagibred"
- item_state = "instagibred"
- ammo_type = list(/obj/item/ammo_casing/energy/instakill/red)
-
-/obj/item/gun/energy/laser/instakill/blue
- desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a blue design."
- icon_state = "instagibblue"
- item_state = "instagibblue"
- ammo_type = list(/obj/item/ammo_casing/energy/instakill/blue)
-
-/obj/item/gun/energy/laser/instakill/emp_act() //implying you could stop the instagib
- return
-
-/obj/item/gun/energy/gravity_gun
- name = "one-point bluespace-gravitational manipulator"
- desc = "An experimental, multi-mode device that fires bolts of Zero-Point Energy, causing local distortions in gravity."
- ammo_type = list(/obj/item/ammo_casing/energy/gravityrepulse, /obj/item/ammo_casing/energy/gravityattract, /obj/item/ammo_casing/energy/gravitychaos)
- origin_tech = "combat=4;magnets=4;materials=6;powerstorage=4;bluespace=4"
- item_state = null
- icon_state = "gravity_gun"
- var/power = 4
+ attack_verb = list("attacked", "slashed", "cut", "sliced")
+ force = 12
+ sharpness = IS_SHARP
+ can_charge = 0
+ heat = 3800
+ toolspeed = 0.7 //plasmacutters can be used as welders for a few things, and are faster than standard welders
+
+/obj/item/gun/energy/plasmacutter/examine(mob/user)
+ ..()
+ if(cell)
+ to_chat(user, "[src] is [round(cell.percent())]% charged.")
+
+/obj/item/gun/energy/plasmacutter/attackby(obj/item/A, mob/user)
+ if(istype(A, /obj/item/stack/sheet/mineral/plasma))
+ var/obj/item/stack/sheet/S = A
+ S.use(1)
+ cell.give(1000)
+ recharge_newshot(1)
+ to_chat(user, "You insert [A] in [src], recharging it.")
+ else if(istype(A, /obj/item/ore/plasma))
+ qdel(A)
+ cell.give(500)
+ recharge_newshot(1)
+ to_chat(user, "You insert [A] in [src], recharging it.")
+ else
+ ..()
+
+/obj/item/gun/energy/plasmacutter/update_icon()
+ return
+
+/obj/item/gun/energy/plasmacutter/adv
+ name = "advanced plasma cutter"
+ icon_state = "adv_plasmacutter"
+ origin_tech = "combat=3;materials=4;magnets=3;plasmatech=4;engineering=2"
+ force = 15
+ ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv)
+
+/obj/item/gun/energy/wormhole_projector
+ name = "bluespace wormhole projector"
+ desc = "A projector that emits high density quantum-coupled bluespace beams."
+ ammo_type = list(/obj/item/ammo_casing/energy/wormhole, /obj/item/ammo_casing/energy/wormhole/orange)
+ item_state = null
+ icon_state = "wormhole_projector"
+ origin_tech = "combat=4;bluespace=6;plasmatech=4;engineering=4"
+ var/obj/effect/portal/p_blue
+ var/obj/effect/portal/p_orange
+
+/obj/item/gun/energy/wormhole_projector/update_icon()
+ icon_state = "[initial(icon_state)][select]"
+ item_state = icon_state
+ return
+
+/obj/item/gun/energy/wormhole_projector/process_chamber()
+ ..()
+ select_fire()
+
+/obj/item/gun/energy/wormhole_projector/proc/on_portal_destroy(obj/effect/portal/P)
+ if(P == p_blue)
+ p_blue = null
+ else if(P == p_orange)
+ p_orange = null
+
+/obj/item/gun/energy/wormhole_projector/proc/has_blue_portal()
+ if(istype(p_blue) && !QDELETED(p_blue))
+ return TRUE
+ return FALSE
+
+/obj/item/gun/energy/wormhole_projector/proc/has_orange_portal()
+ if(istype(p_orange) && !QDELETED(p_orange))
+ return TRUE
+ return FALSE
+
+/obj/item/gun/energy/wormhole_projector/proc/crosslink()
+ if(!has_blue_portal() && !has_orange_portal())
+ return
+ if(!has_blue_portal() && has_orange_portal())
+ p_orange.link_portal(null)
+ return
+ if(!has_orange_portal() && has_blue_portal())
+ p_blue.link_portal(null)
+ return
+ p_orange.link_portal(p_blue)
+ p_blue.link_portal(p_orange)
+
+/obj/item/gun/energy/wormhole_projector/proc/create_portal(obj/item/projectile/beam/wormhole/W, turf/target)
+ var/obj/effect/portal/P = new /obj/effect/portal(target, src, 300, null, FALSE, null)
+ if(istype(W, /obj/item/projectile/beam/wormhole/orange))
+ qdel(p_orange)
+ p_orange = P
+ P.icon_state = "portal1"
+ else
+ qdel(p_blue)
+ p_blue = P
+ crosslink()
+
+/* 3d printer 'pseudo guns' for borgs */
+
+/obj/item/gun/energy/printer
+ name = "cyborg lmg"
+ desc = "A machinegun that fires 3d-printed flechettes slowly regenerated using a cyborg's internal power source."
+ icon_state = "l6closed0"
+ icon = 'icons/obj/guns/projectile.dmi'
+ cell_type = "/obj/item/stock_parts/cell/secborg"
+ ammo_type = list(/obj/item/ammo_casing/energy/c3dbullet)
+ can_charge = 0
+ use_cyborg_cell = 1
+
+/obj/item/gun/energy/printer/update_icon()
+ return
+
+/obj/item/gun/energy/printer/emp_act()
+ return
+
+/obj/item/gun/energy/temperature
+ name = "temperature gun"
+ icon_state = "freezegun"
+ desc = "A gun that changes temperatures."
+ origin_tech = "combat=4;materials=4;powerstorage=3;magnets=2"
+ ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot)
+ cell_type = "/obj/item/stock_parts/cell/high"
+ pin = null
+
+/obj/item/gun/energy/temperature/security
+ name = "security temperature gun"
+ desc = "A weapon that can only be used to its full potential by the truly robust."
+ origin_tech = "combat=2;materials=2;powerstorage=1;magnets=1"
+ pin = /obj/item/device/firing_pin
+
+/obj/item/gun/energy/laser/instakill
+ name = "instakill rifle"
+ icon_state = "instagib"
+ item_state = "instagib"
+ desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit."
+ ammo_type = list(/obj/item/ammo_casing/energy/instakill)
+ force = 60
+ origin_tech = "combat=7;magnets=6"
+
+/obj/item/gun/energy/laser/instakill/red
+ desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a red design."
+ icon_state = "instagibred"
+ item_state = "instagibred"
+ ammo_type = list(/obj/item/ammo_casing/energy/instakill/red)
+
+/obj/item/gun/energy/laser/instakill/blue
+ desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a blue design."
+ icon_state = "instagibblue"
+ item_state = "instagibblue"
+ ammo_type = list(/obj/item/ammo_casing/energy/instakill/blue)
+
+/obj/item/gun/energy/laser/instakill/emp_act() //implying you could stop the instagib
+ return
+
+/obj/item/gun/energy/gravity_gun
+ name = "one-point bluespace-gravitational manipulator"
+ desc = "An experimental, multi-mode device that fires bolts of Zero-Point Energy, causing local distortions in gravity."
+ ammo_type = list(/obj/item/ammo_casing/energy/gravityrepulse, /obj/item/ammo_casing/energy/gravityattract, /obj/item/ammo_casing/energy/gravitychaos)
+ origin_tech = "combat=4;magnets=4;materials=6;powerstorage=4;bluespace=4"
+ item_state = "gravity_gun"
+ icon_state = "gravity_gun"
+ var/power = 4
diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm
index 8e97a3d7a9..f419374857 100644
--- a/code/modules/projectiles/guns/magic.dm
+++ b/code/modules/projectiles/guns/magic.dm
@@ -4,6 +4,8 @@
icon = 'icons/obj/guns/magic.dmi'
icon_state = "staffofnothing"
item_state = "staff"
+ lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
fire_sound = 'sound/weapons/emitter.ogg'
flags_1 = CONDUCT_1
w_class = WEIGHT_CLASS_HUGE
diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm
index bb770e0598..c94deefd08 100644
--- a/code/modules/projectiles/guns/medbeam.dm
+++ b/code/modules/projectiles/guns/medbeam.dm
@@ -101,7 +101,7 @@
qdel(dummy)
return 0
for(var/obj/effect/ebeam/medical/B in turf)// Don't cross the str-beams!
- if(B.owner != current_beam)
+ if(B.owner.origin != current_beam.origin)
explosion(B.loc,0,3,5,8)
qdel(dummy)
return 0
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index 232cb5987e..75066540cf 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -8,7 +8,6 @@
flags_1 = CONDUCT_1
w_class = WEIGHT_CLASS_TINY
attack_verb = list("poked")
- var/emagged = FALSE
var/fail_message = "INVALID USER."
var/selfdestruct = 0 // Explode when user check is failed.
var/force_replace = 0 // Can forcefully replace other pins.
diff --git a/code/modules/projectiles/projectile.dm.rej b/code/modules/projectiles/projectile.dm.rej
deleted file mode 100644
index 9c9e12e95a..0000000000
--- a/code/modules/projectiles/projectile.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm (rejected hunks)
-@@ -4,7 +4,7 @@
- icon_state = "bullet"
- density = FALSE
- anchored = TRUE
-- flags = ABSTRACT
-+ flags_1 = ABSTRACT_1
- pass_flags = PASSTABLE
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- hitsound = 'sound/weapons/pierce.ogg'
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 12ced0ed74..27284a1712 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -165,7 +165,7 @@
if("animal")
var/path
if(prob(50))
- var/beast = pick("carp","bear","mushroom","statue", "bat", "goat","killertomato", "spiderbase", "spiderhunter", "blobbernaut", "magicarp", "chaosmagicarp", "watcher", "goliath", "headcrab", "morph", "stickman", "stickdog", "lesserdragon")
+ var/beast = pick("carp","bear","mushroom","statue", "bat", "goat","killertomato", "spiderbase", "spiderhunter", "blobbernaut", "magicarp", "chaosmagicarp", "watcher", "goliath", "headcrab", "morph", "stickman", "stickdog", "lesserdragon", "gorilla")
switch(beast)
if("carp")
path = /mob/living/simple_animal/hostile/carp
@@ -205,6 +205,8 @@
path = /mob/living/simple_animal/hostile/stickman/dog
if("lesserdragon")
path = /mob/living/simple_animal/hostile/megafauna/dragon/lesser
+ if("gorilla")
+ path = /mob/living/simple_animal/hostile/gorilla
else
var/animal = pick("parrot","corgi","crab","pug","cat","mouse","chicken","cow","lizard","chick","fox","butterfly","cak")
switch(animal)
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index d2a3a24886..538ae996ea 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -75,9 +75,9 @@
/obj/machinery/chem_dispenser/emag_act(mob/user)
if(emagged)
- to_chat(user, "\The [src] has no functional safeties to emag.")
+ to_chat(user, "[src] has no functional safeties to emag.")
return
- to_chat(user, "You short out \the [src]'s safeties.")
+ to_chat(user, "You short out [src]'s safeties.")
dispensable_reagents |= emagged_reagents//add the emagged reagents to the dispensable ones
emagged = TRUE
@@ -182,21 +182,20 @@
var/obj/item/reagent_containers/B = I
. = 1 //no afterattack
if(beaker)
- to_chat(user, "A container is already loaded into the machine!")
+ to_chat(user, "A container is already loaded into [src]!")
return
- if(!user.drop_item()) // Can't let go?
+ if(!user.transferItemToLoc(B, src))
return
beaker = B
- beaker.loc = src
- to_chat(user, "You add \the [B] to the machine.")
+ to_chat(user, "You add [B] to [src].")
beaker_overlay = beaker_overlay || mutable_appearance(icon, "disp_beaker")
beaker_overlay.pixel_x = rand(-10, 5)//randomize beaker overlay position.
add_overlay(beaker_overlay)
else if(user.a_intent != INTENT_HARM && !istype(I, /obj/item/card/emag))
- to_chat(user, "You can't load \the [I] into the machine!")
+ to_chat(user, "You can't load [I] into [src]!")
return ..()
else
return ..()
@@ -227,10 +226,10 @@
icon_state = "minidispenser"
powerefficiency = 0.001
amount = 5
- recharge_delay = 30
+ recharge_delay = 20
dispensable_reagents = list()
circuit = /obj/item/circuitboard/machine/chem_dispenser
- var/list/dispensable_reagent_tiers = list(
+ var/static/list/dispensable_reagent_tiers = list(
list(
"hydrogen",
"oxygen",
@@ -282,7 +281,7 @@
time += M.rating
for(var/obj/item/stock_parts/capacitor/C in component_parts)
time += C.rating
- recharge_delay /= time/2 //delay between recharges, double the usual time on lowest 50% less than usual on highest
+ recharge_delay = 30/(time/2) //delay between recharges, double the usual time on lowest 50% less than usual on highest
for(var/obj/item/stock_parts/manipulator/M in component_parts)
for(i=1, i<=M.rating, i++)
dispensable_reagents |= dispensable_reagent_tiers[i]
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm.rej b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm.rej
deleted file mode 100644
index 8803fd1086..0000000000
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm (rejected hunks)
-@@ -178,7 +178,7 @@
- if(default_unfasten_wrench(user, I))
- return
-
-- if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER))
-+ if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER_1))
- var/obj/item/reagent_containers/B = I
- . = 1 //no afterattack
- if(beaker)
diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm.rej b/code/modules/reagents/chemistry/machinery/chem_heater.dm.rej
deleted file mode 100644
index d60e535a87..0000000000
--- a/code/modules/reagents/chemistry/machinery/chem_heater.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm (rejected hunks)
-@@ -42,7 +42,7 @@
- if(default_deconstruction_crowbar(I))
- return
-
-- if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER))
-+ if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER_1))
- . = 1 //no afterattack
- if(beaker)
- to_chat(user, "A beaker is already loaded into the machine!")
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm.rej b/code/modules/reagents/chemistry/machinery/chem_master.dm.rej
deleted file mode 100644
index cd3de881dc..0000000000
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm (rejected hunks)
-@@ -79,7 +79,7 @@
- if(default_unfasten_wrench(user, I))
- return
-
-- if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER))
-+ if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER_1))
- . = 1 // no afterattack
- if(panel_open)
- to_chat(user, "You can't use the [src.name] while its panel is opened!")
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index fa31fb8ec1..64f0eae564 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -1,3 +1,6 @@
+#define MAIN_SCREEN 1
+#define SYMPTOM_DETAILS 2
+
/obj/machinery/computer/pandemic
name = "PanD.E.M.I.C 2200"
desc = "Used to work with viruses."
@@ -10,6 +13,8 @@
idle_power_usage = 20
resistance_flags = ACID_PROOF
var/wait
+ var/mode = MAIN_SCREEN
+ var/datum/symptom/selected_symptom
var/obj/item/reagent_containers/beaker
/obj/machinery/computer/pandemic/Initialize()
@@ -34,9 +39,7 @@
/obj/machinery/computer/pandemic/proc/get_viruses_data(datum/reagent/blood/B)
. = list()
- if(!islist(B.data["viruses"]))
- return
- var/list/V = B.data["viruses"]
+ var/list/V = B.get_diseases()
var/index = 1
for(var/virus in V)
var/datum/disease/D = virus
@@ -47,21 +50,24 @@
this["name"] = D.name
if(istype(D, /datum/disease/advance))
var/datum/disease/advance/A = D
- var/datum/disease/advance/archived = SSdisease.archive_diseases[D.GetDiseaseID()]
- if(archived.name == "Unknown")
+ var/disease_name = SSdisease.get_disease_name(A.GetDiseaseID())
+ if(disease_name == "Unknown")
this["can_rename"] = TRUE
- this["name"] = archived.name
+ this["name"] = disease_name
this["is_adv"] = TRUE
- this["resistance"] = A.totalResistance()
- this["stealth"] = A.totalStealth()
- this["stage_speed"] = A.totalStageSpeed()
- this["transmission"] = A.totalTransmittable()
this["symptoms"] = list()
+ var/symptom_index = 1
for(var/symptom in A.symptoms)
var/datum/symptom/S = symptom
var/list/this_symptom = list()
this_symptom["name"] = S.name
+ this_symptom["sym_index"] = symptom_index
+ symptom_index++
this["symptoms"] += list(this_symptom)
+ this["resistance"] = A.totalResistance()
+ this["stealth"] = A.totalStealth()
+ this["stage_speed"] = A.totalStageSpeed()
+ this["transmission"] = A.totalTransmittable()
this["index"] = index++
this["agent"] = D.agent
this["description"] = D.desc || "none"
@@ -70,6 +76,20 @@
. += list(this)
+/obj/machinery/computer/pandemic/proc/get_symptom_data(datum/symptom/S)
+ . = list()
+ var/list/this = list()
+ this["name"] = S.name
+ this["desc"] = S.desc
+ this["stealth"] = S.stealth
+ this["resistance"] = S.resistance
+ this["stage_speed"] = S.stage_speed
+ this["transmission"] = S.transmittable
+ this["level"] = S.level
+ this["neutered"] = S.neutered
+ this["threshold_desc"] = S.threshold_desc
+ . += this
+
/obj/machinery/computer/pandemic/proc/get_resistance_data(datum/reagent/blood/B)
. = list()
if(!islist(B.data["resistances"]))
@@ -81,6 +101,7 @@
if(D)
this["id"] = id
this["name"] = D.name
+
. += list(this)
/obj/machinery/computer/pandemic/proc/reset_replicator_cooldown()
@@ -113,18 +134,23 @@
/obj/machinery/computer/pandemic/ui_data(mob/user)
var/list/data = list()
data["is_ready"] = !wait
- if(beaker)
- data["has_beaker"] = TRUE
- if(!beaker.reagents.total_volume || !beaker.reagents.reagent_list)
- data["beaker_empty"] = TRUE
- var/datum/reagent/blood/B = locate() in beaker.reagents.reagent_list
- if(B)
- data["has_blood"] = TRUE
- data["blood"] = list()
- data["blood"]["dna"] = B.data["blood_DNA"] || "none"
- data["blood"]["type"] = B.data["blood_type"] || "none"
- data["viruses"] = get_viruses_data(B)
- data["resistances"] = get_resistance_data(B)
+ data["mode"] = mode
+ switch(mode)
+ if(MAIN_SCREEN)
+ if(beaker)
+ data["has_beaker"] = TRUE
+ if(!beaker.reagents.total_volume || !beaker.reagents.reagent_list)
+ data["beaker_empty"] = TRUE
+ var/datum/reagent/blood/B = locate() in beaker.reagents.reagent_list
+ if(B)
+ data["has_blood"] = TRUE
+ data["blood"] = list()
+ data["blood"]["dna"] = B.data["blood_DNA"] || "none"
+ data["blood"]["type"] = B.data["blood_type"] || "none"
+ data["viruses"] = get_viruses_data(B)
+ data["resistances"] = get_resistance_data(B)
+ if(SYMPTOM_DETAILS)
+ data["symptom"] = get_symptom_data(selected_symptom)
return data
@@ -166,8 +192,8 @@
addtimer(CALLBACK(src, .proc/reset_replicator_cooldown), 50)
. = TRUE
if("create_vaccine_bottle")
- var/index = params["index"]
- var/datum/disease/D = SSdisease.archive_diseases[index]
+ var/index = text2num(params["index"])
+ var/datum/disease/D = SSdisease.archive_diseases[get_virus_id_by_index(index)]
var/obj/item/reagent_containers/glass/bottle/B = new(get_turf(src))
B.name = "[D.name] vaccine bottle"
B.reagents.add_reagent("vaccine", 15, list(index))
@@ -175,6 +201,19 @@
update_icon()
addtimer(CALLBACK(src, .proc/reset_replicator_cooldown), 200)
. = TRUE
+ if("symptom_details")
+ var/picked_symptom_index = text2num(params["picked_symptom"])
+ var/index = text2num(params["index"])
+ var/datum/disease/advance/A = get_by_index("viruses", index)
+ var/datum/symptom/S = A.symptoms[picked_symptom_index]
+ mode = SYMPTOM_DETAILS
+ selected_symptom = S
+ . = TRUE
+ if("back")
+ mode = MAIN_SCREEN
+ selected_symptom = null
+ . = TRUE
+
/obj/machinery/computer/pandemic/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER_1))
@@ -182,14 +221,13 @@
if(stat & (NOPOWER|BROKEN))
return
if(beaker)
- to_chat(user, "A beaker is already loaded into the machine!")
+ to_chat(user, "A container is already loaded into [src]!")
return
- if(!user.drop_item())
+ if(!user.transferItemToLoc(I, src))
return
beaker = I
- beaker.forceMove(src)
- to_chat(user, "You add the beaker to the machine.")
+ to_chat(user, "You insert [I] into [src].")
update_icon()
else
return ..()
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm.rej b/code/modules/reagents/chemistry/machinery/pandemic.dm.rej
deleted file mode 100644
index 4aa7a64767..0000000000
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm (rejected hunks)
-@@ -177,7 +177,7 @@
- . = TRUE
-
- /obj/machinery/computer/pandemic/attackby(obj/item/I, mob/user, params)
-- if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER))
-+ if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER_1))
- . = TRUE //no afterattack
- if(stat & (NOPOWER|BROKEN))
- return
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm.rej b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm.rej
deleted file mode 100644
index 41ecfa55e8..0000000000
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm (rejected hunks)
-@@ -116,7 +116,7 @@
- if(default_unfasten_wrench(user, I))
- return
-
-- if (istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER) )
-+ if (istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER_1) )
- if (!beaker)
- if(!user.drop_item())
- return 1
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 3247b273ae..ffc24882fd 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -62,6 +62,13 @@
data["viruses"] = preserve
return 1
+/datum/reagent/blood/proc/get_diseases()
+ . = list()
+ if(data && data["viruses"])
+ for(var/thing in data["viruses"])
+ var/datum/disease/D = thing
+ . += D
+
/datum/reagent/blood/reaction_turf(turf/T, reac_volume)//splash the blood all over the place
if(!istype(T))
return
@@ -1079,6 +1086,14 @@
color = "#664B63" // rgb: 102, 75, 99
taste_description = "metal"
+/datum/reagent/smart_foaming_agent //Smart foaming agent. Functions similarly to metal foam, but conforms to walls.
+ name = "Smart foaming agent"
+ id = "smart_foaming_agent"
+ description = "A agent that yields metallic foam which conforms to area boundaries when mixed with light metal and a strong acid."
+ reagent_state = SOLID
+ color = "#664B63" // rgb: 102, 75, 99
+ taste_description = "metal"
+
/datum/reagent/ammonia
name = "Ammonia"
id = "ammonia"
@@ -1558,6 +1573,18 @@
ZI.Insert(H)
..()
+/datum/reagent/magillitis
+ name = "Magillitis"
+ id = "magillitis"
+ description = "An experimental serum which causes rapid muscular growth in basic primates. Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas."
+ reagent_state = LIQUID
+ color = "#00f041"
+
+/datum/reagent/magillitis/on_mob_life(mob/living/carbon/M)
+ ..()
+ if(ismonkey(M) && current_cycle >= 10)
+ return M.gorillize()
+
/datum/reagent/growthserum
name = "Growth Serum"
id = "growthserum"
diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
index 5eb034d604..36320459e8 100644
--- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
@@ -106,6 +106,11 @@
metabolization_rate = 0.05
taste_description = "salt"
+/datum/reagent/blackpowder/on_mob_life(mob/living/M)
+ ..()
+ if(isplasmaman(M))
+ M.hallucination += 10
+
/datum/reagent/blackpowder/on_ex_act()
var/location = get_turf(holder.my_atom)
var/datum/effect_system/reagents_explosion/e = new()
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index 173bcbcacc..222f88ba8b 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -466,6 +466,20 @@
s.start()
holder.clear_reagents()
+/datum/chemical_reaction/smart_foam
+ name = "Smart Metal Foam"
+ id = "smart_metal_foam"
+ required_reagents = list("aluminium" = 3, "smart_foaming_agent" = 1, "facid" = 1)
+ mob_react = TRUE
+
+/datum/chemical_reaction/smart_foam/on_reaction(datum/reagents/holder, created_volume)
+ var/turf/location = get_turf(holder.my_atom)
+ location.visible_message("The solution spews out metallic foam!")
+ var/datum/effect_system/foam_spread/metal/smart/s = new()
+ s.set_up(created_volume * 5, location, holder, TRUE)
+ s.start()
+ holder.clear_reagents()
+
/datum/chemical_reaction/ironfoam
name = "Iron Foam"
id = "ironlfoam"
@@ -487,6 +501,13 @@
results = list("foaming_agent" = 1)
required_reagents = list("lithium" = 1, "hydrogen" = 1)
+/datum/chemical_reaction/smart_foaming_agent
+ name = "Smart foaming Agent"
+ id = "smart_foaming_agent"
+ results = list("smart_foaming_agent" = 3)
+ required_reagents = list("foaming_agent" = 3, "acetone" = 1, "iron" = 1)
+ mix_message = "The solution mixes into a frothy metal foam and conforms to the walls of its container."
+
/////////////////////////////// Cleaning and hydroponics /////////////////////////////////////////////////
diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm
index b1b5b2939e..2fd728d546 100644
--- a/code/modules/reagents/reagent_containers/bottle.dm
+++ b/code/modules/reagents/reagent_containers/bottle.dm
@@ -162,6 +162,12 @@
icon_state = "bottle16"
list_reagents = list("polonium" = 30)
+/obj/item/reagent_containers/glass/bottle/magillitis
+ name = "magillitis bottle"
+ desc = "A small bottle. Contains a serum known only as 'magillitis'."
+ icon_state = "bottle16"
+ list_reagents = list("magillitis" = 5)
+
/obj/item/reagent_containers/glass/bottle/venom
name = "venom bottle"
desc = "A small bottle. Contains Venom."
@@ -270,11 +276,11 @@
icon_state = "bottle3"
spawned_disease = /datum/disease/advance/heal
-/obj/item/reagent_containers/glass/bottle/hullucigen_virion
- name = "Hullucigen virion culture bottle"
- desc = "A small bottle. Contains hullucigen virion culture in synthblood medium."
+/obj/item/reagent_containers/glass/bottle/hallucigen_virion
+ name = "Hallucigen virion culture bottle"
+ desc = "A small bottle. Contains hallucigen virion culture in synthblood medium."
icon_state = "bottle3"
- spawned_disease = /datum/disease/advance/hullucigen
+ spawned_disease = /datum/disease/advance/hallucigen
/obj/item/reagent_containers/glass/bottle/pierrot_throat
name = "Pierrot's Throat culture bottle"
diff --git a/code/modules/reagents/reagent_containers/dropper.dm.rej b/code/modules/reagents/reagent_containers/dropper.dm.rej
deleted file mode 100644
index 672eff145d..0000000000
--- a/code/modules/reagents/reagent_containers/dropper.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm (rejected hunks)
-@@ -6,7 +6,7 @@
- amount_per_transfer_from_this = 5
- possible_transfer_amounts = list(1, 2, 3, 4, 5)
- volume = 5
-- container_type = TRANSPARENT
-+ container_type = TRANSPARENT_1
-
- /obj/item/reagent_containers/dropper/afterattack(obj/target, mob/user , proximity)
- if(!proximity) return
diff --git a/code/modules/reagents/reagent_containers/glass.dm.rej b/code/modules/reagents/reagent_containers/glass.dm.rej
deleted file mode 100644
index fe8fd55da1..0000000000
--- a/code/modules/reagents/reagent_containers/glass.dm.rej
+++ /dev/null
@@ -1,28 +0,0 @@
-diff a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm (rejected hunks)
-@@ -169,7 +169,7 @@
- volume = 100
- amount_per_transfer_from_this = 10
- possible_transfer_amounts = list(5,10,15,20,25,30,50,100)
-- flags = OPENCONTAINER
-+ flags_1 = OPENCONTAINER_1
-
- /obj/item/reagent_containers/glass/beaker/noreact
- name = "cryostasis beaker"
-@@ -180,7 +180,7 @@
- volume = 50
- amount_per_transfer_from_this = 10
- origin_tech = "materials=2;engineering=3;plasmatech=3"
-- flags = OPENCONTAINER
-+ flags_1 = OPENCONTAINER_1
-
- /obj/item/reagent_containers/glass/beaker/noreact/Initialize()
- . = ..()
-@@ -196,7 +196,7 @@
- volume = 300
- amount_per_transfer_from_this = 10
- possible_transfer_amounts = list(5,10,15,20,25,30,50,100,300)
-- flags = OPENCONTAINER
-+ flags_1 = OPENCONTAINER_1
- origin_tech = "bluespace=5;materials=4;plasmatech=4"
-
- /obj/item/reagent_containers/glass/beaker/cryoxadone
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 74de184958..ec34bf833f 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -65,6 +65,14 @@
volume = 100
list_reagents = list("nanites" = 80, "synaptizine" = 20)
+/obj/item/reagent_containers/hypospray/magillitis
+ name = "experimental autoinjector"
+ desc = "A modified air-needle autoinjector with a small single-use reservoir. It contains an experimental serum."
+ icon_state = "combat_hypo"
+ volume = 5
+ container_type = NONE
+ list_reagents = list("magillitis" = 5)
+
//MediPens
/obj/item/reagent_containers/hypospray/medipen
@@ -88,7 +96,7 @@
..()
if(!iscyborg(user))
reagents.maximum_volume = 0 //Makes them useless afterwards
- container_type = 0
+ container_type = NONE
update_icon()
spawn(80)
if(iscyborg(user) && !reagents.total_volume)
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm.rej b/code/modules/reagents/reagent_containers/hypospray.dm.rej
deleted file mode 100644
index 03d17d2639..0000000000
--- a/code/modules/reagents/reagent_containers/hypospray.dm.rej
+++ /dev/null
@@ -1,12 +0,0 @@
-diff a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm (rejected hunks)
-@@ -77,8 +77,8 @@
- amount_per_transfer_from_this = 10
- volume = 10
- ignore_flags = 1 //so you can medipen through hardsuits
-- container_type = DRAWABLE
-- flags = null
-+ container_type = DRAWABLE_1
-+ flags_1 = null
- list_reagents = list("epinephrine" = 10)
-
- /obj/item/reagent_containers/hypospray/medipen/attack(mob/M, mob/user)
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 9d7579c9dc..869076081e 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -1,80 +1,80 @@
-/obj/item/reagent_containers/spray
- name = "spray bottle"
- desc = "A spray bottle, with an unscrewable top."
- icon = 'icons/obj/janitor.dmi'
- icon_state = "cleaner"
- item_state = "cleaner"
+/obj/item/reagent_containers/spray
+ name = "spray bottle"
+ desc = "A spray bottle, with an unscrewable top."
+ icon = 'icons/obj/janitor.dmi'
+ icon_state = "cleaner"
+ item_state = "cleaner"
lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
flags_1 = NOBLUDGEON_1
container_type = OPENCONTAINER_1
- slot_flags = SLOT_BELT
- throwforce = 0
- w_class = WEIGHT_CLASS_SMALL
- throw_speed = 3
- throw_range = 7
- var/stream_mode = 0 //whether we use the more focused mode
- var/current_range = 3 //the range of tiles the sprayer will reach.
- var/spray_range = 3 //the range of tiles the sprayer will reach when in spray mode.
- var/stream_range = 1 //the range of tiles the sprayer will reach when in stream mode.
- var/stream_amount = 10 //the amount of reagents transfered when in stream mode.
- amount_per_transfer_from_this = 5
- volume = 250
- possible_transfer_amounts = list(5,10,15,20,25,30,50,100)
-
-
-/obj/item/reagent_containers/spray/afterattack(atom/A as mob|obj, mob/user)
- if(istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics))
- return
-
- if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) //this block copypasted from reagent_containers/glass, for lack of a better solution
- if(!A.reagents.total_volume && A.reagents)
- to_chat(user, "\The [A] is empty.")
- return
-
- if(reagents.total_volume >= reagents.maximum_volume)
- to_chat(user, "\The [src] is full.")
- return
-
- var/trans = A.reagents.trans_to(src, 50) //transfer 50u , using the spray's transfer amount would take too long to refill
- to_chat(user, "You fill \the [src] with [trans] units of the contents of \the [A].")
- return
-
- if(reagents.total_volume < amount_per_transfer_from_this)
- to_chat(user, "\The [src] is empty!")
- return
-
- spray(A)
-
- playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6)
- user.changeNext_move(CLICK_CD_RANGE*2)
- user.newtonian_move(get_dir(A, user))
- var/turf/T = get_turf(src)
- var/area/area = get_area(src)
- if(reagents.has_reagent("sacid"))
- message_admins("[ADMIN_LOOKUPFLW(user)] fired sulphuric acid from \a [src] at [area] [ADMIN_COORDJMP(T)].")
- log_game("[key_name(user)] fired sulphuric acid from \a [src] at [area] ([T.x], [T.y], [T.z]).")
- if(reagents.has_reagent("facid"))
- message_admins("[ADMIN_LOOKUPFLW(user)] fired Fluacid from \a [src] at [area] [ADMIN_COORDJMP(T)].")
- log_game("[key_name(user)] fired Fluacid from \a [src] at [area] [COORD(T)].")
- if(reagents.has_reagent("lube"))
- message_admins("[ADMIN_LOOKUPFLW(user)] fired Space lube from \a [src] at [area] [ADMIN_COORDJMP(T)].")
- log_game("[key_name(user)] fired Space lube from \a [src] at [area] [COORD(T)].")
- return
-
-
-/obj/item/reagent_containers/spray/proc/spray(atom/A)
- var/range = max(min(current_range, get_dist(src, A)), 1)
- var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src))
- D.create_reagents(amount_per_transfer_from_this)
- var/puff_reagent_left = range //how many turf, mob or dense objet we can react with before we consider the chem puff consumed
- if(stream_mode)
- reagents.trans_to(D, amount_per_transfer_from_this)
- puff_reagent_left = 1
- else
- reagents.trans_to(D, amount_per_transfer_from_this, 1/range)
- D.color = mix_color_from_reagents(D.reagents.reagent_list)
- var/wait_step = max(round(2+3/range), 2)
+ slot_flags = SLOT_BELT
+ throwforce = 0
+ w_class = WEIGHT_CLASS_SMALL
+ throw_speed = 3
+ throw_range = 7
+ var/stream_mode = 0 //whether we use the more focused mode
+ var/current_range = 3 //the range of tiles the sprayer will reach.
+ var/spray_range = 3 //the range of tiles the sprayer will reach when in spray mode.
+ var/stream_range = 1 //the range of tiles the sprayer will reach when in stream mode.
+ var/stream_amount = 10 //the amount of reagents transfered when in stream mode.
+ amount_per_transfer_from_this = 5
+ volume = 250
+ possible_transfer_amounts = list(5,10,15,20,25,30,50,100)
+
+
+/obj/item/reagent_containers/spray/afterattack(atom/A as mob|obj, mob/user)
+ if(istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics))
+ return
+
+ if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) //this block copypasted from reagent_containers/glass, for lack of a better solution
+ if(!A.reagents.total_volume && A.reagents)
+ to_chat(user, "\The [A] is empty.")
+ return
+
+ if(reagents.total_volume >= reagents.maximum_volume)
+ to_chat(user, "\The [src] is full.")
+ return
+
+ var/trans = A.reagents.trans_to(src, 50) //transfer 50u , using the spray's transfer amount would take too long to refill
+ to_chat(user, "You fill \the [src] with [trans] units of the contents of \the [A].")
+ return
+
+ if(reagents.total_volume < amount_per_transfer_from_this)
+ to_chat(user, "\The [src] is empty!")
+ return
+
+ spray(A)
+
+ playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6)
+ user.changeNext_move(CLICK_CD_RANGE*2)
+ user.newtonian_move(get_dir(A, user))
+ var/turf/T = get_turf(src)
+ var/area/area = get_area(src)
+ if(reagents.has_reagent("sacid"))
+ message_admins("[ADMIN_LOOKUPFLW(user)] fired sulphuric acid from \a [src] at [area] [ADMIN_COORDJMP(T)].")
+ log_game("[key_name(user)] fired sulphuric acid from \a [src] at [area] ([T.x], [T.y], [T.z]).")
+ if(reagents.has_reagent("facid"))
+ message_admins("[ADMIN_LOOKUPFLW(user)] fired Fluacid from \a [src] at [area] [ADMIN_COORDJMP(T)].")
+ log_game("[key_name(user)] fired Fluacid from \a [src] at [area] [COORD(T)].")
+ if(reagents.has_reagent("lube"))
+ message_admins("[ADMIN_LOOKUPFLW(user)] fired Space lube from \a [src] at [area] [ADMIN_COORDJMP(T)].")
+ log_game("[key_name(user)] fired Space lube from \a [src] at [area] [COORD(T)].")
+ return
+
+
+/obj/item/reagent_containers/spray/proc/spray(atom/A)
+ var/range = max(min(current_range, get_dist(src, A)), 1)
+ var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src))
+ D.create_reagents(amount_per_transfer_from_this)
+ var/puff_reagent_left = range //how many turf, mob or dense objet we can react with before we consider the chem puff consumed
+ if(stream_mode)
+ reagents.trans_to(D, amount_per_transfer_from_this)
+ puff_reagent_left = 1
+ else
+ reagents.trans_to(D, amount_per_transfer_from_this, 1/range)
+ D.color = mix_color_from_reagents(D.reagents.reagent_list)
+ var/wait_step = max(round(2+3/range), 2)
do_spray(A, wait_step, D, range, puff_reagent_left)
/obj/item/reagent_containers/spray/proc/do_spray(atom/A, wait_step, obj/effect/decal/chempuff/D, range, puff_reagent_left)
@@ -96,153 +96,155 @@
var/mob/M = T
if(!M.lying || !range_left)
D.reagents.reaction(M, VAPOR)
- puff_reagent_left -= 1
+ puff_reagent_left -= 1
else if(!range_left)
D.reagents.reaction(T, VAPOR)
else
D.reagents.reaction(T, VAPOR)
if(ismob(T))
puff_reagent_left -= 1
-
+
if(puff_reagent_left > 0 && (!stream_mode || !range_left))
D.reagents.reaction(get_turf(D), VAPOR)
puff_reagent_left -= 1
-
+
if(puff_reagent_left <= 0) // we used all the puff so we delete it.
qdel(D)
return
qdel(D)
-
-/obj/item/reagent_containers/spray/attack_self(mob/user)
- stream_mode = !stream_mode
- if(stream_mode)
- amount_per_transfer_from_this = stream_amount
- current_range = stream_range
- else
- amount_per_transfer_from_this = initial(amount_per_transfer_from_this)
- current_range = spray_range
- to_chat(user, "You switch the nozzle setting to [stream_mode ? "\"stream\"":"\"spray\""]. You'll now use [amount_per_transfer_from_this] units per use.")
-
-/obj/item/reagent_containers/spray/verb/empty()
- set name = "Empty Spray Bottle"
- set category = "Object"
- set src in usr
- if(usr.incapacitated())
- return
- if (alert(usr, "Are you sure you want to empty that?", "Empty Bottle:", "Yes", "No") != "Yes")
- return
- if(isturf(usr.loc) && src.loc == usr)
- to_chat(usr, "You empty \the [src] onto the floor.")
- reagents.reaction(usr.loc)
- src.reagents.clear_reagents()
-
-//space cleaner
-/obj/item/reagent_containers/spray/cleaner
- name = "space cleaner"
- desc = "BLAM!-brand non-foaming space cleaner!"
- list_reagents = list("cleaner" = 250)
-
-//spray tan
-/obj/item/reagent_containers/spray/spraytan
- name = "spray tan"
- volume = 50
- desc = "Gyaro brand spray tan. Do not spray near eyes or other orifices."
- list_reagents = list("spraytan" = 50)
-
-
-/obj/item/reagent_containers/spray/medical
- name = "medical spray"
- icon = 'icons/obj/chemical.dmi'
- icon_state = "medspray"
- volume = 100
-
-
-/obj/item/reagent_containers/spray/medical/sterilizer
- name = "sterilizer spray"
- desc = "Spray bottle loaded with non-toxic sterilizer. Useful in preparation for surgery."
- list_reagents = list("sterilizine" = 100)
-
-
-//pepperspray
-/obj/item/reagent_containers/spray/pepper
- name = "pepperspray"
- desc = "Manufactured by UhangInc, used to blind and down an opponent quickly."
- icon = 'icons/obj/items_and_weapons.dmi'
- icon_state = "pepperspray"
- item_state = "pepperspray"
+
+/obj/item/reagent_containers/spray/attack_self(mob/user)
+ stream_mode = !stream_mode
+ if(stream_mode)
+ amount_per_transfer_from_this = stream_amount
+ current_range = stream_range
+ else
+ amount_per_transfer_from_this = initial(amount_per_transfer_from_this)
+ current_range = spray_range
+ to_chat(user, "You switch the nozzle setting to [stream_mode ? "\"stream\"":"\"spray\""]. You'll now use [amount_per_transfer_from_this] units per use.")
+
+/obj/item/reagent_containers/spray/verb/empty()
+ set name = "Empty Spray Bottle"
+ set category = "Object"
+ set src in usr
+ if(usr.incapacitated())
+ return
+ if (alert(usr, "Are you sure you want to empty that?", "Empty Bottle:", "Yes", "No") != "Yes")
+ return
+ if(isturf(usr.loc) && src.loc == usr)
+ to_chat(usr, "You empty \the [src] onto the floor.")
+ reagents.reaction(usr.loc)
+ src.reagents.clear_reagents()
+
+//space cleaner
+/obj/item/reagent_containers/spray/cleaner
+ name = "space cleaner"
+ desc = "BLAM!-brand non-foaming space cleaner!"
+ list_reagents = list("cleaner" = 250)
+
+//spray tan
+/obj/item/reagent_containers/spray/spraytan
+ name = "spray tan"
+ volume = 50
+ desc = "Gyaro brand spray tan. Do not spray near eyes or other orifices."
+ list_reagents = list("spraytan" = 50)
+
+
+/obj/item/reagent_containers/spray/medical
+ name = "medical spray"
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "medspray"
+ volume = 100
+
+
+/obj/item/reagent_containers/spray/medical/sterilizer
+ name = "sterilizer spray"
+ desc = "Spray bottle loaded with non-toxic sterilizer. Useful in preparation for surgery."
+ list_reagents = list("sterilizine" = 100)
+
+
+//pepperspray
+/obj/item/reagent_containers/spray/pepper
+ name = "pepperspray"
+ desc = "Manufactured by UhangInc, used to blind and down an opponent quickly."
+ icon = 'icons/obj/items_and_weapons.dmi'
+ icon_state = "pepperspray"
+ item_state = "pepperspray"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
- volume = 40
- stream_range = 4
- amount_per_transfer_from_this = 5
- list_reagents = list("condensedcapsaicin" = 40)
-
-// Fix pepperspraying yourself
-/obj/item/reagent_containers/spray/pepper/afterattack(atom/A as mob|obj, mob/user)
- if (A.loc == user)
- return
- ..()
-
-//water flower
-/obj/item/reagent_containers/spray/waterflower
- name = "water flower"
- desc = "A seemingly innocent sunflower...with a twist."
- icon = 'icons/obj/hydroponics/harvest.dmi'
- icon_state = "sunflower"
- item_state = "sunflower"
- amount_per_transfer_from_this = 1
- volume = 10
- list_reagents = list("water" = 10)
-
-/obj/item/reagent_containers/spray/waterflower/attack_self(mob/user) //Don't allow changing how much the flower sprays
- return
-
-//chemsprayer
-/obj/item/reagent_containers/spray/chemsprayer
- name = "chem sprayer"
- desc = "A utility used to spray large amounts of reagents in a given area."
- icon = 'icons/obj/guns/projectile.dmi'
- icon_state = "chemsprayer"
- item_state = "chemsprayer"
- throwforce = 0
- w_class = WEIGHT_CLASS_NORMAL
- stream_mode = 1
- current_range = 7
- spray_range = 4
- stream_range = 7
- amount_per_transfer_from_this = 10
- volume = 600
- origin_tech = "combat=3;materials=3;engineering=3"
-
-/obj/item/reagent_containers/spray/chemsprayer/afterattack(atom/A as mob|obj, mob/user)
- // Make it so the bioterror spray doesn't spray yourself when you click your inventory items
- if (A.loc == user)
- return
- ..()
-
-/obj/item/reagent_containers/spray/chemsprayer/spray(atom/A)
- var/direction = get_dir(src, A)
- var/turf/T = get_turf(A)
- var/turf/T1 = get_step(T,turn(direction, 90))
- var/turf/T2 = get_step(T,turn(direction, -90))
- var/list/the_targets = list(T,T1,T2)
-
- for(var/i=1, i<=3, i++) // intialize sprays
- if(reagents.total_volume < 1)
- return
- ..(the_targets[i])
-
-/obj/item/reagent_containers/spray/chemsprayer/bioterror
- list_reagents = list("sodium_thiopental" = 100, "coniine" = 100, "venom" = 100, "condensedcapsaicin" = 100, "initropidril" = 100, "polonium" = 100)
-
-// Plant-B-Gone
-/obj/item/reagent_containers/spray/plantbgone // -- Skie
- name = "Plant-B-Gone"
- desc = "Kills those pesky weeds!"
- icon = 'icons/obj/hydroponics/equipment.dmi'
- icon_state = "plantbgone"
- item_state = "plantbgone"
+ volume = 40
+ stream_range = 4
+ amount_per_transfer_from_this = 5
+ list_reagents = list("condensedcapsaicin" = 40)
+
+// Fix pepperspraying yourself
+/obj/item/reagent_containers/spray/pepper/afterattack(atom/A as mob|obj, mob/user)
+ if (A.loc == user)
+ return
+ ..()
+
+//water flower
+/obj/item/reagent_containers/spray/waterflower
+ name = "water flower"
+ desc = "A seemingly innocent sunflower...with a twist."
+ icon = 'icons/obj/hydroponics/harvest.dmi'
+ icon_state = "sunflower"
+ item_state = "sunflower"
+ amount_per_transfer_from_this = 1
+ volume = 10
+ list_reagents = list("water" = 10)
+
+/obj/item/reagent_containers/spray/waterflower/attack_self(mob/user) //Don't allow changing how much the flower sprays
+ return
+
+//chemsprayer
+/obj/item/reagent_containers/spray/chemsprayer
+ name = "chem sprayer"
+ desc = "A utility used to spray large amounts of reagents in a given area."
+ icon = 'icons/obj/guns/projectile.dmi'
+ icon_state = "chemsprayer"
+ item_state = "chemsprayer"
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
+ throwforce = 0
+ w_class = WEIGHT_CLASS_NORMAL
+ stream_mode = 1
+ current_range = 7
+ spray_range = 4
+ stream_range = 7
+ amount_per_transfer_from_this = 10
+ volume = 600
+ origin_tech = "combat=3;materials=3;engineering=3"
+
+/obj/item/reagent_containers/spray/chemsprayer/afterattack(atom/A as mob|obj, mob/user)
+ // Make it so the bioterror spray doesn't spray yourself when you click your inventory items
+ if (A.loc == user)
+ return
+ ..()
+
+/obj/item/reagent_containers/spray/chemsprayer/spray(atom/A)
+ var/direction = get_dir(src, A)
+ var/turf/T = get_turf(A)
+ var/turf/T1 = get_step(T,turn(direction, 90))
+ var/turf/T2 = get_step(T,turn(direction, -90))
+ var/list/the_targets = list(T,T1,T2)
+
+ for(var/i=1, i<=3, i++) // intialize sprays
+ if(reagents.total_volume < 1)
+ return
+ ..(the_targets[i])
+
+/obj/item/reagent_containers/spray/chemsprayer/bioterror
+ list_reagents = list("sodium_thiopental" = 100, "coniine" = 100, "venom" = 100, "condensedcapsaicin" = 100, "initropidril" = 100, "polonium" = 100)
+
+// Plant-B-Gone
+/obj/item/reagent_containers/spray/plantbgone // -- Skie
+ name = "Plant-B-Gone"
+ desc = "Kills those pesky weeds!"
+ icon = 'icons/obj/hydroponics/equipment.dmi'
+ icon_state = "plantbgone"
+ item_state = "plantbgone"
lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi'
- volume = 100
- list_reagents = list("plantbgone" = 100)
+ volume = 100
+ list_reagents = list("plantbgone" = 100)
diff --git a/code/modules/reagents/reagent_containers/syringes.dm.rej b/code/modules/reagents/reagent_containers/syringes.dm.rej
deleted file mode 100644
index d184bef7fb..0000000000
--- a/code/modules/reagents/reagent_containers/syringes.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm (rejected hunks)
-@@ -16,7 +16,7 @@
- var/busy = FALSE // needed for delayed drawing of blood
- var/proj_piercing = 0 //does it pierce through thick clothes when shot with syringe gun
- materials = list(MAT_METAL=10, MAT_GLASS=20)
-- container_type = TRANSPARENT
-+ container_type = TRANSPARENT_1
-
- /obj/item/reagent_containers/syringe/Initialize()
- . = ..()
diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm
index 0bb6df7ca9..14ebec8128 100644
--- a/code/modules/recycling/disposal-unit.dm
+++ b/code/modules/recycling/disposal-unit.dm
@@ -247,6 +247,9 @@
AM.forceMove(T)
..()
+/obj/machinery/disposal/get_dumping_location(obj/item/storage/source,mob/user)
+ return src
+
//How disposal handles getting a storage dump from a storage object
/obj/machinery/disposal/storage_contents_dump_act(obj/item/storage/src_object, mob/user)
for(var/obj/item/I in src_object)
diff --git a/code/modules/research/circuitprinter.dm.rej b/code/modules/research/circuitprinter.dm.rej
deleted file mode 100644
index 6bd06f6d69..0000000000
--- a/code/modules/research/circuitprinter.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm (rejected hunks)
-@@ -8,7 +8,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
- name = "circuit imprinter"
- desc = "Manufactures circuit boards for the construction of machines."
- icon_state = "circuit_imprinter"
-- container_type = OPENCONTAINER
-+ container_type = OPENCONTAINER_1
- circuit = /obj/item/circuitboard/machine/circuit_imprinter
-
- var/datum/material_container/materials
diff --git a/code/modules/research/protolathe.dm.rej b/code/modules/research/protolathe.dm.rej
deleted file mode 100644
index fa39256713..0000000000
--- a/code/modules/research/protolathe.dm.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm (rejected hunks)
-@@ -11,7 +11,7 @@ Note: Must be placed west/left of and R&D console to function.
- name = "protolathe"
- desc = "Converts raw materials into useful objects."
- icon_state = "protolathe"
-- container_type = OPENCONTAINER
-+ container_type = OPENCONTAINER_1
- circuit = /obj/item/circuitboard/machine/protolathe
-
- var/datum/material_container/materials
diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm
index dbfd6d1ed2..f22961ae15 100644
--- a/code/modules/research/stock_parts.dm
+++ b/code/modules/research/stock_parts.dm
@@ -44,12 +44,13 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi
pshoom_or_beepboopblorpzingshadashwoosh = 'sound/items/pshoom.ogg'
alt_sound = 'sound/items/pshoom_2.ogg'
-/obj/item/storage/part_replacer/bluespace/content_can_dump(atom/dest_object, mob/user)
+/obj/item/storage/part_replacer/bluespace/dump_content_at(atom/dest_object, mob/user)
if(Adjacent(user))
- if(get_dist(user, dest_object) < 8)
- if(dest_object.storage_contents_dump_act(src, user))
+ var/atom/dumping_location = dest_object.get_dumping_location()
+ if(get_dist(user, dumping_location) < 8)
+ if(dumping_location.storage_contents_dump_act(src, user))
play_rped_sound()
- user.Beam(dest_object,icon_state="rped_upgrade",time=5)
+ user.Beam(dumping_location,icon_state="rped_upgrade",time=5)
return 1
to_chat(user, "The [src.name] buzzes.")
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0)
diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm
index a061d00a44..a01a144bc3 100644
--- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm
+++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm
@@ -111,7 +111,9 @@
desc = "Their success will be yours."
icon = 'icons/obj/wizard.dmi'
icon_state = "render"
- item_state = "render"
+ item_state = "knife"
+ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
force = 18
throwforce = 10
w_class = WEIGHT_CLASS_NORMAL
diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm
index bdaac1d3cb..a3ebba05a1 100644
--- a/code/modules/shuttle/computer.dm
+++ b/code/modules/shuttle/computer.dm
@@ -78,7 +78,7 @@
/obj/machinery/computer/shuttle/emag_act(mob/user)
if(emagged)
return
- req_access = null
+ req_access = list()
emagged = TRUE
to_chat(user, "You fried the consoles ID checking system.")
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index 85f32b745d..d574a38d73 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -290,7 +290,7 @@
if(SHUTTLE_CALL)
if(time_left <= 0)
//move emergency shuttle to station
- if(dock(SSshuttle.getDock("emergency_home")))
+ if(dock(SSshuttle.getDock("emergency_home")) != DOCKING_SUCCESS)
setTimer(20)
return
mode = SHUTTLE_DOCKED
diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm
index b09c38d714..59a0a46ae8 100644
--- a/code/modules/shuttle/on_move.dm
+++ b/code/modules/shuttle/on_move.dm
@@ -4,15 +4,17 @@ All ShuttleMove procs go here
/************************************Base procs************************************/
-// Called on every turf in the shuttle region, return false if it doesn't want to move
-/turf/proc/fromShuttleMove(turf/newT, turf_type, baseturf_type)
- if(type == turf_type && baseturf == baseturf_type)
- return FALSE
- return TRUE
+// Called on every turf in the shuttle region, returns a bitflag for allowed movements of that turf
+// returns the new move_mode (based on the old)
+/turf/proc/fromShuttleMove(turf/newT, turf_type, list/baseturf_cache, move_mode)
+ if(!(move_mode & MOVE_AREA) || (istype(src, turf_type) && baseturf_cache[baseturf]))
+ return move_mode
+ return move_mode | MOVE_TURF | MOVE_CONTENTS
// Called from the new turf before anything has been moved
// Only gets called if fromShuttleMove returns true first
-/turf/proc/toShuttleMove(turf/oldT, shuttle_dir)
+// returns the new move_mode (based on the old)
+/turf/proc/toShuttleMove(turf/oldT, shuttle_dir, move_mode)
for(var/i in contents)
var/atom/movable/thing = i
if(ismob(thing))
@@ -38,7 +40,7 @@ All ShuttleMove procs go here
else
qdel(thing)
- return TRUE
+ return move_mode
// Called on the old turf to move the turf data
/turf/proc/onShuttleMove(turf/newT, turf_type, baseturf_type, rotation, list/movement_force, move_dir)
@@ -73,9 +75,9 @@ All ShuttleMove procs go here
/////////////////////////////////////////////////////////////////////////////////////
// Called on every atom in shuttle turf contents before anything has been moved
-// Return true if it should be moved regardless of turf being moved
-/atom/movable/proc/beforeShuttleMove(turf/newT, rotation)
- return FALSE
+// returns the new move_mode (based on the old)
+/atom/movable/proc/beforeShuttleMove(turf/newT, rotation, move_mode)
+ return move_mode
// Called on atoms to move the atom to the new location
/atom/movable/proc/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock)
@@ -102,13 +104,16 @@ All ShuttleMove procs go here
/////////////////////////////////////////////////////////////////////////////////////
// Called on areas before anything has been moved
-/area/proc/beforeShuttleMove()
- return TRUE
+// returns the new move_mode (based on the old)
+/area/proc/beforeShuttleMove(list/shuttle_areas)
+ if(!shuttle_areas[src])
+ return NONE
+ return MOVE_AREA
// Called on areas to move their turf between areas
/area/proc/onShuttleMove(turf/oldT, turf/newT, area/underlying_old_area)
if(newT == oldT) // In case of in place shuttle rotation shenanigans.
- return
+ return TRUE
contents -= oldT
underlying_old_area.contents += oldT
@@ -117,7 +122,7 @@ All ShuttleMove procs go here
var/area/old_dest_area = newT.loc
parallax_movedir = old_dest_area.parallax_movedir
-
+
old_dest_area.contents -= newT
contents += newT
newT.change_area(old_dest_area, src)
@@ -160,9 +165,11 @@ All ShuttleMove procs go here
SSair.add_to_active(src, TRUE)
SSair.add_to_active(oldT, TRUE)
+/************************************Area move procs************************************/
+
/************************************Machinery move procs************************************/
-/obj/machinery/door/airlock/beforeShuttleMove(turf/newT, rotation)
+/obj/machinery/door/airlock/beforeShuttleMove(turf/newT, rotation, move_mode)
. = ..()
shuttledocked = 0
for(var/obj/machinery/door/airlock/A in range(1, src))
@@ -176,11 +183,11 @@ All ShuttleMove procs go here
for(var/obj/machinery/door/airlock/A in range(1, src))
A.shuttledocked = 1
-/obj/machinery/camera/beforeShuttleMove(turf/newT, rotation)
+/obj/machinery/camera/beforeShuttleMove(turf/newT, rotation, move_mode)
. = ..()
GLOB.cameranet.removeCamera(src)
GLOB.cameranet.updateChunk()
- return TRUE
+ . |= MOVE_CONTENTS
/obj/machinery/camera/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir)
. = ..()
@@ -207,7 +214,7 @@ All ShuttleMove procs go here
if(z == ZLEVEL_MINING) //Avoids double logging and landing on other Z-levels due to badminnery
SSblackbox.add_details("colonies_dropped", "[x]|[y]|[z]") //Number of times a base has been dropped!
-/obj/machinery/gravity_generator/main/beforeShuttleMove(turf/newT, rotation)
+/obj/machinery/gravity_generator/main/beforeShuttleMove(turf/newT, rotation, move_mode)
. = ..()
on = FALSE
update_list()
@@ -218,9 +225,9 @@ All ShuttleMove procs go here
on = TRUE
update_list()
-/obj/machinery/thruster/beforeShuttleMove(turf/newT, rotation)
+/obj/machinery/thruster/beforeShuttleMove(turf/newT, rotation, move_mode)
. = ..()
- . = TRUE
+ . |= MOVE_CONTENTS
//Properly updates pipes on shuttle movement
/obj/machinery/atmospherics/shuttleRotate(rotation)
@@ -271,7 +278,7 @@ All ShuttleMove procs go here
var/turf/T = loc
hide(T.intact)
-/obj/machinery/navbeacon/beforeShuttleMove(turf/newT, rotation)
+/obj/machinery/navbeacon/beforeShuttleMove(turf/newT, rotation, move_mode)
. = ..()
GLOB.navbeacons["[z]"] -= src
GLOB.deliverybeacons -= src
@@ -333,13 +340,13 @@ All ShuttleMove procs go here
/************************************Structure move procs************************************/
-/obj/structure/grille/beforeShuttleMove(turf/newT, rotation)
+/obj/structure/grille/beforeShuttleMove(turf/newT, rotation, move_mode)
. = ..()
- . = TRUE
+ . |= MOVE_CONTENTS
-/obj/structure/lattice/beforeShuttleMove(turf/newT, rotation)
+/obj/structure/lattice/beforeShuttleMove(turf/newT, rotation, move_mode)
. = ..()
- . = TRUE
+ . |= MOVE_CONTENTS
/obj/structure/disposalpipe/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir)
. = ..()
@@ -350,6 +357,11 @@ All ShuttleMove procs go here
var/turf/T = loc
if(level==1)
hide(T.intact)
+
+/obj/structure/shuttle/beforeShuttleMove(turf/newT, rotation, move_mode)
+ . = ..()
+ . |= MOVE_CONTENTS
+
/************************************Misc move procs************************************/
@@ -371,4 +383,4 @@ All ShuttleMove procs go here
/obj/effect/abstract/proximity_checker/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock)
//timer so it only happens once
- addtimer(CALLBACK(monitor, /datum/proximity_monitor/proc/SetRange, monitor.current_range, TRUE), 0, TIMER_UNIQUE)
+ addtimer(CALLBACK(monitor, /datum/proximity_monitor/proc/SetRange, monitor.current_range, TRUE), 0, TIMER_UNIQUE)
\ No newline at end of file
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index d0d5952a0c..f035777df5 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -21,6 +21,10 @@
var/dwidth = 0 //position relative to covered area, perpendicular to dir
var/dheight = 0 //position relative to covered area, parallel to dir
+ var/area_type
+ var/turf_type
+ var/baseturf_type
+
//these objects are indestructible
/obj/docking_port/Destroy(force)
// unless you assert that you know what you're doing. Horrible things
@@ -119,6 +123,39 @@
else
. += T
+/obj/docking_port/proc/return_ordered_assoc_turfs(_x, _y, _z, _dir)
+ if(!_dir)
+ _dir = dir
+ if(!_x)
+ _x = x
+ if(!_y)
+ _y = y
+ if(!_z)
+ _z = z
+ var/cos = 1
+ var/sin = 0
+ switch(_dir)
+ if(WEST)
+ cos = 0
+ sin = 1
+ if(SOUTH)
+ cos = -1
+ sin = 0
+ if(EAST)
+ cos = 0
+ sin = -1
+
+ . = list()
+
+ var/xi
+ var/yi
+ for(var/dx=0, dx[user] melts into the shadows!")
+ var/obj/effect/dummy/shadow/S2 = new(get_turf(user.loc))
+ user.forceMove(S2)
+ S2.jaunter = user
+ else
+ to_chat(user, "It isn't dark enough here!")
+
+/obj/effect/dummy/shadow
+ name = "darkness"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "nothing"
+ var/canmove = 1
+ var/mob/living/jaunter
+ density = FALSE
+ anchored = TRUE
+ invisibility = 60
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+
+/obj/effect/dummy/shadow/relaymove(mob/user, direction)
+ var/turf/newLoc = get_step(src,direction)
+ if(isspaceturf(newLoc))
+ to_chat(user, "It really would not be wise to go into space.")
+ return
+ forceMove(newLoc)
+ check_light_level()
+
+/obj/effect/dummy/shadow/proc/check_light_level()
+ var/turf/T = get_turf(src)
+ var/light_amount = T.get_lumcount()
+ if(light_amount > 0.2) // jaunt ends
+ end_jaunt(TRUE)
+ else if (light_amount < 0.2 && (!QDELETED(jaunter))) //heal in the dark
+ jaunter.heal_overall_damage(1,1)
+
+/obj/effect/dummy/shadow/proc/end_jaunt(forced = FALSE)
+ if(jaunter)
+ if(forced)
+ visible_message("[jaunter] is revealed by the light!")
+ else
+ visible_message("[jaunter] emerges from the darkness!")
+ jaunter.forceMove(get_turf(src))
+ playsound(get_turf(jaunter), 'sound/magic/ethereal_exit.ogg', 50, 1, -1)
+ jaunter = null
+ qdel(src)
+
+/obj/effect/dummy/shadow/Initialize(mapload)
+ . = ..()
+ START_PROCESSING(SSobj, src)
+
+/obj/effect/dummy/shadow/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ . = ..()
+
+/obj/effect/dummy/shadow/process()
+ if(!jaunter)
+ qdel(src)
+ if(jaunter.loc != src)
+ qdel(src)
+ check_light_level()
+
+/obj/effect/dummy/shadow/ex_act()
+ return
+
+/obj/effect/dummy/shadow/bullet_act()
+ return
+
+/obj/effect/dummy/shadow/singularity_act()
+ return
+
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index d71cddd3e4..4e478d3420 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -52,7 +52,7 @@
if(active)
for(var/obj/item/I in owner.held_items)
if(!(I.flags_1 & NODROP_1))
- flags_1 += I
+ stored_items += I
var/list/L = owner.get_empty_held_indexes()
if(LAZYLEN(L) == owner.held_items.len)
@@ -87,6 +87,7 @@
/obj/item/organ/cyberimp/brain/anti_drop/proc/release_items()
for(var/obj/item/I in stored_items)
I.flags_1 &= ~NODROP_1
+ stored_items = list()
/obj/item/organ/cyberimp/brain/anti_drop/Remove(var/mob/living/carbon/M, special = 0)
diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm
index 2ee223b403..26c2239bb6 100644
--- a/code/modules/surgery/organs/ears.dm
+++ b/code/modules/surgery/organs/ears.dm
@@ -80,9 +80,6 @@
icon = 'icons/obj/clothing/hats.dmi'
icon_state = "kitty"
-/obj/item/organ/ears/cat/adjustEarDamage(ddmg, ddeaf)
- ..(ddmg*2,ddeaf*2)
-
/obj/item/organ/ears/cat/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE)
..()
color = H.hair_color
@@ -93,4 +90,4 @@
..()
color = H.hair_color
H.dna.features["ears"] = "None"
- H.update_body()
\ No newline at end of file
+ H.update_body()
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index 0f5f1de91d..8f32aa89eb 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -569,6 +569,7 @@
message_admins("[key_name_admin(user)] has said '[log_message]' with a Voice of God, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].")
log_game("[key_name(user)] has said '[log_message]' with a Voice of God, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].")
+ SSblackbox.add_details("voice_of_god", log_message)
return cooldown
diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm
index ba1d5c3c40..a3ab275767 100644
--- a/code/modules/uplink/uplink_item.dm
+++ b/code/modules/uplink/uplink_item.dm
@@ -970,7 +970,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
desc = "When used with an upload console, this module allows you to upload priority laws to an artificial intelligence. \
Be careful with wording, as artificial intelligences may look for loopholes to exploit."
item = /obj/item/aiModule/syndicate
- cost = 14
+ cost = 9
/datum/uplink_item/device_tools/briefcase_launchpad
name = "Briefcase Launchpad"
@@ -1314,6 +1314,13 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
cost = 14
restricted_roles = list("Geneticist", "Chief Medical Officer")
+/datum/uplink_item/role_restricted/magillitis_serum
+ name = "Magillitis Serum Autoinjector"
+ desc = "A single-use autoinjector which contains an experimental serum that causes rapid muscular growth in basic primates."
+ item = /obj/item/reagent_containers/hypospray/magillitis
+ cost = 15
+ restricted_roles = list("Geneticist", "Chief Medical Officer")
+
/datum/uplink_item/role_restricted/pressure_mod
name = "Kinetic Accelerator Pressure Mod"
desc = "A modification kit which allows Kinetic Accelerators to do greatly increased damage while indoors. Occupies 35% mod capacity."
@@ -1393,8 +1400,8 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
if(crate_value < I.cost)
continue
crate_value -= I.cost
- new I.item(C)
- U.purchase_log += "[icon2base64html(I.item)]"
+ var/obj/goods = new I.item(C)
+ U.purchase_log += "[icon2base64html(goods)]"
SSblackbox.add_details("traitor_uplink_items_bought", "[name]|[cost]")
return C
diff --git a/code/modules/vore/eating/belly_vr.dm b/code/modules/vore/eating/belly_vr.dm
index d5c484d387..f1e4274ce9 100644
--- a/code/modules/vore/eating/belly_vr.dm
+++ b/code/modules/vore/eating/belly_vr.dm
@@ -24,7 +24,7 @@
var/escapetime = 200 // Deciseconds, how long to escape this belly
var/escapechance = 45 // % Chance of prey beginning to escape if prey struggles.
var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest.
- var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL) // Possible digest modes
+ var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY) // Possible digest modes
var/tmp/mob/living/owner // The mob whose belly this is.
var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly!
var/tmp/is_full // Flag for if digested remeans are present. (for disposal messages)
@@ -106,7 +106,7 @@
return 0
for (var/atom/movable/M in internal_contents)
M.forceMove(owner.loc) // Move the belly contents into the same location as belly's owner.
- M << sound(null, repeat = 0, wait = 0, volume = 80, channel = 50)
+ M << sound(null, repeat = 0, wait = 0, volume = 80, channel = CHANNEL_PREYLOOP)
internal_contents.Remove(M) // Remove from the belly contents
var/datum/belly/B = check_belly(owner) // This makes sure that the mob behaves properly if released into another mob
@@ -124,7 +124,7 @@
return FALSE // They weren't in this belly anyway
M.forceMove(owner.loc) // Move the belly contents into the same location as belly's owner.
- M << sound(null, repeat = 0, wait = 0, volume = 80, channel = 50)
+ M << sound(null, repeat = 0, wait = 0, volume = 80, channel = CHANNEL_PREYLOOP)
src.internal_contents.Add(M) // Remove from the belly contents
var/datum/belly/B = check_belly(owner)
if(B)
@@ -143,7 +143,7 @@
prey.forceMove(owner)
internal_contents.Add(prey)
- prey << sound('sound/vore/prey/loop.ogg', repeat = 1, wait = 0, volume = 80, channel = 50)
+ prey << sound('sound/vore/prey/loop.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_PREYLOOP)
if(inside_flavor)
prey << "[inside_flavor]"
@@ -224,7 +224,7 @@
/datum/belly/proc/digestion_death(var/mob/living/M)
is_full = TRUE
internal_contents.Remove(M)
- M << sound(null, repeat = 0, wait = 0, volume = 80, channel = 50)
+ M << sound(null, repeat = 0, wait = 0, volume = 80, channel = CHANNEL_PREYLOOP)
// If digested prey is also a pred... anyone inside their bellies gets moved up.
if (is_vore_predator(M))
for (var/bellytype in M.vore_organs)
@@ -255,6 +255,7 @@
return // User is not in this belly, or struggle too soon.
R.setClickCooldown(50)
+ var/sound/prey_struggle = sound(get_sfx("prey_struggle"))
if(owner.stat) //If owner is stat (dead, KO) we can actually escape
to_chat(R, "You attempt to climb out of \the [name]. (This will take around [escapetime/10] seconds.)")
@@ -288,9 +289,9 @@
// for(var/mob/M in hearers(4, owner))
// M.visible_message(struggle_outer_message) // hearable
R.visible_message( "[struggle_outer_message]", "[struggle_user_message]")
- playsound(get_turf(owner),"struggle_sound",75,0,-5,1,channel=51)
- R.stop_sound_channel(51)
- R.playsound_local("prey_struggle_sound",60)
+ playsound(get_turf(owner),"struggle_sound",35,0,-6,1,channel=151)
+ R.stop_sound_channel(151)
+ R.playsound_local(get_turf(R), null, 45, S = prey_struggle)
if(escapable && R.a_intent != "help") //If the stomach has escapable enabled and the person is actually trying to kick out
to_chat(R, "You attempt to climb out of \the [name].")
diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm
index b58875bd1f..19d07e6fb6 100644
--- a/code/modules/vore/eating/bellymodes_vr.dm
+++ b/code/modules/vore/eating/bellymodes_vr.dm
@@ -1,6 +1,8 @@
// Process the predator's effects upon the contents of its belly (i.e digestion/transformation etc)
// Called from /mob/living/Life() proc.
/datum/belly/proc/process_Life()
+ var/sound/prey_gurgle = sound(get_sfx("digest_prey"))
+ var/sound/prey_digest = sound(get_sfx("death_prey"))
/////////////////////////// Auto-Emotes ///////////////////////////
if((digest_mode in emote_lists) && !emotePend)
@@ -19,11 +21,11 @@
//////////////////////////// DM_DIGEST ////////////////////////////
if(digest_mode == DM_DIGEST)
for (var/mob/living/M in internal_contents)
- if(prob(50))
+ if(prob(15))
M.stop_sound_channel(CHANNEL_PRED)
- playsound(get_turf(owner),"digest_pred",75,0,-6,0,channel=CHANNEL_PRED)
+ playsound(get_turf(owner),"digest_pred",50,0,-6,0,channel=CHANNEL_PRED)
M.stop_sound_channel(CHANNEL_PRED)
- M.playsound_local("digest_prey",60)
+ M.playsound_local(get_turf(M), null, 45, S = prey_gurgle)
//Pref protection!
if (!M.digestable)
@@ -50,9 +52,9 @@
owner.nutrition += 400 // so eating dead mobs gives you *something*.
M.stop_sound_channel(CHANNEL_PRED)
- playsound(get_turf(owner),"death_pred",50,0,-6,0,channel=CHANNEL_PRED)
+ playsound(get_turf(owner),"death_pred",45,0,-6,0,channel=CHANNEL_PRED)
M.stop_sound_channel(CHANNEL_PRED)
- M.playsound_local("death_prey",60)
+ M.playsound_local(get_turf(M), null, 45, S = prey_digest)
digestion_death(M)
owner.update_icons()
continue
@@ -67,11 +69,11 @@
///////////////////////////// DM_HEAL /////////////////////////////
if(digest_mode == DM_HEAL)
for (var/mob/living/M in internal_contents)
- if(prob(50))
+ if(prob(15))
M.stop_sound_channel(CHANNEL_PRED)
- playsound(get_turf(owner),"digest_pred",50,0,-6,0,channel=CHANNEL_PRED)
+ playsound(get_turf(owner),"digest_pred",35,0,-6,0,channel=CHANNEL_PRED)
M.stop_sound_channel(CHANNEL_PRED)
- M.playsound_local("digest_prey",60)
+ M.playsound_local(get_turf(M), null, 45, S = prey_gurgle)
if(M.stat != DEAD)
if(owner.nutrition >= NUTRITION_LEVEL_STARVING && (M.health < M.maxHealth))
@@ -79,3 +81,13 @@
M.adjustFireLoss(-1)
owner.nutrition -= 10
return
+
+////////////////////////// DM_NOISY /////////////////////////////////
+//for when you just want people to squelch around
+ if(digest_mode == DM_NOISY)
+ for (var/mob/living/M in internal_contents)
+ if(prob(35))
+ M.stop_sound_channel(CHANNEL_PRED)
+ playsound(get_turf(owner),"digest_pred",35,0,-6,0,channel=CHANNEL_PRED)
+ M.stop_sound_channel(CHANNEL_PRED)
+ M.playsound_local(get_turf(M), null, 45, S = prey_gurgle)
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 7be607bd2a..98db33a763 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -21,7 +21,7 @@
if(M.client && M.client.prefs_vr)
if(!M.copy_from_prefs_vr())
- M << "ERROR: You seem to have saved VOREStation prefs, but they couldn't be loaded."
+ M << "ERROR: You seem to have saved vore prefs, but they couldn't be loaded."
return FALSE
if(M.vore_organs && M.vore_organs.len)
M.vore_selected = M.vore_organs[1]
diff --git a/code/modules/vore/trycatch_vr.dm b/code/modules/vore/trycatch_vr.dm
index 1ae5c3bc0c..2adf6e0cf6 100644
--- a/code/modules/vore/trycatch_vr.dm
+++ b/code/modules/vore/trycatch_vr.dm
@@ -1,6 +1,6 @@
/*
This file is for jamming single-line procs into Polaris procs.
-It will prevent runtimes and allow their code to run if VOREStation's fails.
+It will prevent runtimes and allow their code to run if these fail.
It will also log when we mess up our code rather than making it vague.
Call it at the top of a stock proc with...
diff --git a/code/world.dm.rej b/code/world.dm.rej
deleted file mode 100644
index e82c17e503..0000000000
--- a/code/world.dm.rej
+++ /dev/null
@@ -1,301 +0,0 @@
-diff a/code/world.dm b/code/world.dm (rejected hunks)
-@@ -10,299 +13,3 @@
- #ifdef GC_FAILURE_HARD_LOOKUP
- loop_checks = FALSE
- #endif
--
--/world/New()
-- log_world("World loaded at [time_stamp()]")
--
-- SetupExternalRSC()
--
-- GLOB.config_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl
--
-- make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
--
-- config = new
--
-- CheckSchemaVersion()
-- SetRoundID()
--
-- SetupLogs()
--
-- if(!RunningService()) //tgs2 support
-- GLOB.revdata.DownloadPRDetails()
--
-- load_motd()
-- load_admins()
-- LoadVerbs(/datum/verbs/menu)
-- if(config.usewhitelist)
-- load_whitelist()
-- LoadBans()
--
-- GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000
--
-- Master.Initialize(10, FALSE)
--
-- if(config.irc_announce_new_game)
-- IRCBroadcast("New round starting on [SSmapping.config.map_name]!")
--
--/world/proc/SetupExternalRSC()
--#if (PRELOAD_RSC == 0)
-- external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n")
-- var/i=1
-- while(i<=external_rsc_urls.len)
-- if(external_rsc_urls[i])
-- i++
-- else
-- external_rsc_urls.Cut(i,i+1)
--#endif
--
--/world/proc/CheckSchemaVersion()
-- if(config.sql_enabled)
-- if(SSdbcore.Connect())
-- log_world("Database connection established.")
-- var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_revision")] ORDER BY date DESC LIMIT 1")
-- query_db_version.Execute()
-- if(query_db_version.NextRow())
-- var/db_major = text2num(query_db_version.item[1])
-- var/db_minor = text2num(query_db_version.item[2])
-- if(db_major < DB_MAJOR_VERSION || db_minor < DB_MINOR_VERSION)
-- message_admins("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors")
-- log_sql("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors")
-- else
-- message_admins("Could not get schema version from database")
-- else
-- log_world("Your server failed to establish a connection with the database.")
--
--/world/proc/SetRoundID()
-- if(config.sql_enabled)
-- if(SSdbcore.Connect())
-- var/datum/DBQuery/query_round_start = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (start_datetime, server_ip, server_port) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]')")
-- query_round_start.Execute()
-- var/datum/DBQuery/query_round_last_id = SSdbcore.NewQuery("SELECT LAST_INSERT_ID()")
-- query_round_last_id.Execute()
-- if(query_round_last_id.NextRow())
-- GLOB.round_id = query_round_last_id.item[1]
--
--/world/proc/SetupLogs()
-- GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-"
-- if(GLOB.round_id)
-- GLOB.log_directory += "[GLOB.round_id]"
-- else
-- GLOB.log_directory += "[replacetext(time_stamp(), ":", ".")]"
-- GLOB.world_game_log = file("[GLOB.log_directory]/game.log")
-- GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log")
-- GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log")
-- GLOB.world_href_log = file("[GLOB.log_directory]/hrefs.html")
-- GLOB.world_game_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------"
-- GLOB.world_attack_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------"
-- GLOB.world_runtime_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------"
-- GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently
-- if(fexists(GLOB.config_error_log))
-- fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log")
-- fdel(GLOB.config_error_log)
--
-- if(GLOB.round_id)
-- log_game("Round ID: [GLOB.round_id]")
--
--/world/Topic(T, addr, master, key)
-- var/list/input = params2list(T)
--
-- var/pinging = ("ping" in input)
-- var/playing = ("players" in input)
--
-- if(!pinging && !playing && config && config.log_world_topic)
-- GLOB.world_game_log << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]"
--
-- if(input[SERVICE_CMD_PARAM_KEY])
-- return ServiceCommand(input)
-- var/key_valid = (global.comms_allowed && input["key"] == global.comms_key)
--
-- if(pinging)
-- var/x = 1
-- for (var/client/C in GLOB.clients)
-- x++
-- return x
--
-- else if(playing)
-- var/n = 0
-- for(var/mob/M in GLOB.player_list)
-- if(M.client)
-- n++
-- return n
--
-- else if("ircstatus" in input) //tgs2 support
-- var/static/last_irc_status = 0
-- if(world.time - last_irc_status < 50)
-- return
-- var/list/adm = get_admin_counts()
-- var/list/allmins = adm["total"]
-- var/status = "Admins: [allmins.len] (Active: [english_list(adm["present"])] AFK: [english_list(adm["afk"])] Stealth: [english_list(adm["stealth"])] Skipped: [english_list(adm["noflags"])]). "
-- status += "Players: [GLOB.clients.len] (Active: [get_active_player_count(0,1,0)]). Mode: [SSticker.mode.name]."
-- send2irc("Status", status)
-- last_irc_status = world.time
--
-- else if("status" in input)
-- var/list/s = list()
-- s["version"] = GLOB.game_version
-- s["mode"] = GLOB.master_mode
-- s["respawn"] = config ? GLOB.abandon_allowed : 0
-- s["enter"] = GLOB.enter_allowed
-- s["vote"] = config.allow_vote_mode
-- s["ai"] = config.allow_ai
-- s["host"] = host ? host : null
-- s["active_players"] = get_active_player_count()
-- s["players"] = GLOB.clients.len
-- s["revision"] = GLOB.revdata.commit
-- s["revision_date"] = GLOB.revdata.date
--
-- var/list/adm = get_admin_counts()
-- var/list/presentmins = adm["present"]
-- var/list/afkmins = adm["afk"]
-- s["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho
-- s["gamestate"] = SSticker.current_state
--
-- s["map_name"] = SSmapping.config.map_name
--
-- if(key_valid && SSticker.HasRoundStarted())
-- s["real_mode"] = SSticker.mode.name
-- // Key-authed callers may know the truth behind the "secret"
--
-- s["security_level"] = get_security_level()
-- s["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0
-- // Amount of world's ticks in seconds, useful for calculating round duration
--
-- if(SSshuttle && SSshuttle.emergency)
-- s["shuttle_mode"] = SSshuttle.emergency.mode
-- // Shuttle status, see /__DEFINES/stat.dm
-- s["shuttle_timer"] = SSshuttle.emergency.timeLeft()
-- // Shuttle timer, in seconds
--
-- return list2params(s)
--
-- else if("announce" in input)
-- if(!key_valid)
-- return "Bad Key"
-- else
-- AnnouncePR(input["announce"], json_decode(input["payload"]))
--
-- else if("crossmessage" in input)
-- if(!key_valid)
-- return
-- else
-- if(input["crossmessage"] == "Ahelp")
-- relay_msg_admins("HELP: [input["source"]] [input["message_sender"]]: [input["message"]]")
-- if(input["crossmessage"] == "Comms_Console")
-- minor_announce(input["message"], "Incoming message from [input["message_sender"]]")
-- for(var/obj/machinery/computer/communications/CM in GLOB.machines)
-- CM.overrideCooldown()
-- if(input["crossmessage"] == "News_Report")
-- minor_announce(input["message"], "Breaking Update From [input["message_sender"]]")
--
-- else if("adminmsg" in input) //tgs2 support
-- if(!key_valid)
-- return "Bad Key"
-- else
-- return IrcPm(input["adminmsg"],input["msg"],input["sender"])
--
-- else if("namecheck" in input) //tgs2 support
-- if(!key_valid)
-- return "Bad Key"
-- else
-- log_admin("IRC Name Check: [input["sender"]] on [input["namecheck"]]")
-- message_admins("IRC name checking on [input["namecheck"]] from [input["sender"]]")
-- return keywords_lookup(input["namecheck"],1)
-- else if("adminwho" in input) //tgs2 support
-- if(!key_valid)
-- return "Bad Key"
-- else
-- return ircadminwho()
-- else if("server_hop" in input)
-- show_server_hop_transfer_screen(input["server_hop"])
--
--#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round
-- //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored
--
--/world/proc/AnnouncePR(announcement, list/payload)
-- var/static/list/PRcounts = list() //PR id -> number of times announced this round
-- var/id = "[payload["pull_request"]["id"]]"
-- if(!PRcounts[id])
-- PRcounts[id] = 1
-- else
-- ++PRcounts[id]
-- if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND)
-- return
--
-- var/final_composed = "PR: [announcement]"
-- for(var/client/C in GLOB.clients)
-- C.AnnouncePR(final_composed)
--
--/world/Reboot(reason = 0, fast_track = FALSE)
-- ServiceReboot() //handles alternative actions if necessary
-- if (reason || fast_track) //special reboot, do none of the normal stuff
-- if (usr)
-- log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools")
-- message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools")
-- to_chat(world, "Rebooting World immediately due to host request")
-- else
-- to_chat(world, "Rebooting world...")
-- Master.Shutdown() //run SS shutdowns
-- log_world("World rebooted at [time_stamp()]")
-- ..()
--
--/world/proc/load_motd()
-- GLOB.join_motd = file2text("config/motd.txt") + "
" + GLOB.revdata.GetTestMergeInfo()
--
--/world/proc/update_status()
-- var/s = ""
--
-- if (config && config.server_name)
-- s += "[config.server_name] — "
--
-- s += "[station_name()]";
-- s += " ("
-- s += "" //Change this to wherever you want the hub to link to.
-- s += "Default" //Replace this with something else. Or ever better, delete it and uncomment the game version.
-- s += ""
-- s += ")"
--
-- var/list/features = list()
--
-- if(GLOB.master_mode)
-- features += GLOB.master_mode
--
-- if (!GLOB.enter_allowed)
-- features += "closed"
--
-- features += GLOB.abandon_allowed ? "respawn" : "no respawn"
--
-- if (config && config.allow_vote_mode)
-- features += "vote"
--
-- if (config && config.allow_ai)
-- features += "AI allowed"
--
-- 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"
--
-- if (!host && config && config.hostedby)
-- features += "hosted by [config.hostedby]"
--
-- if (features)
-- s += ": [jointext(features, ", ")]"
--
-- status = s
--
--/world/proc/update_hub_visibility(new_visibility)
-- if(new_visibility == GLOB.hub_visibility)
-- return
-- GLOB.hub_visibility = new_visibility
-- if(GLOB.hub_visibility)
-- hub_password = "kMZy3U5jJHSiBQjr"
-- else
-- hub_password = "SORRYNOPASSWORD"
diff --git a/config/comms.txt b/config/comms.txt
new file mode 100644
index 0000000000..4408819f2e
--- /dev/null
+++ b/config/comms.txt
@@ -0,0 +1,15 @@
+## Communication key for receiving data through world/Topic(), you don't want to give this out
+#COMMS_KEY default_pwd
+
+## World address and port for server recieving cross server messages
+#CROSS_SERVER_ADDRESS byond:\\address:port
+
+## Name that the server calls itself in communications
+#CROSS_COMMS_NAME
+
+## Hub address for tracking stats
+## example: Hubmakerckey.Hubname
+#MEDAL_HUB_ADDRESS
+
+## Password for the hub page
+#MEDAL_HUB_PASSWORD
\ No newline at end of file
diff --git a/config/config.txt b/config/config.txt
index 7497404a89..ae2cc1e43a 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -32,6 +32,19 @@ BAN_LEGACY_SYSTEM
## Uncomment this to have the job system use the player's account creation date, rather than the when they first joined the server for job timers.
#USE_ACCOUNT_AGE_FOR_JOBS
+## Unhash this to track player playtime in the database. Requires database to be enabled.
+#USE_EXP_TRACKING
+## Unhash this to enable playtime requirements for head jobs.
+#USE_EXP_RESTRICTIONS_HEADS
+## Unhash this to override head jobs' playtime requirements with this number of hours.
+#USE_EXP_RESTRICTIONS_HEADS_HOURS 15
+## Unhash this to change head jobs' playtime requirements so that they're based on department playtime, rather than crew playtime.
+#USE_EXP_RESTRICTIONS_HEADS_DEPARTMENT
+## Unhash this to enable playtime requirements for certain non-head jobs, like Engineer and Scientist.
+#USE_EXP_RESTRICTIONS_OTHER
+## Allows admins to bypass job playtime requirements.
+#USE_EXP_RESTRICTIONS_ADMIN_BYPASS
+
## log OOC channel
LOG_OOC
@@ -205,22 +218,6 @@ TICKLAG 0.5
## Comment this out to disable automuting
#AUTOMUTE_ON
-## Communication key for receiving data through world/Topic(), you don't want to give this out
-#COMMS_KEY default_pwd
-
-## World address and port for server recieving cross server messages
-#CROSS_SERVER_ADDRESS byond:\\address:port
-
-## Name that the server calls itself in communications
-#CROSS_COMMS_NAME
-
-## Hub address for tracking stats
-## example: Hubmakerckey.Hubname
-#MEDAL_HUB_ADDRESS
-
-## Password for the hub page
-#MEDAL_HUB_PASSWORD
-
## Uncomment this to let players see their own notes (they can still be set by admins only)
#SEE_OWN_NOTES
@@ -331,4 +328,4 @@ MINUTE_TOPIC_LIMIT 100
#ERROR_MSG_DELAY 50
## Send a message to IRC when starting a new game
-#IRC_ANNOUNCE_NEW_GAME
\ No newline at end of file
+#IRC_ANNOUNCE_NEW_GAME
diff --git a/config/config.txt.rej b/config/config.txt.rej
new file mode 100644
index 0000000000..fee79cf699
--- /dev/null
+++ b/config/config.txt.rej
@@ -0,0 +1,25 @@
+diff a/config/config.txt b/config/config.txt (rejected hunks)
+@@ -32,17 +32,17 @@ BAN_LEGACY_SYSTEM
+ ## Uncomment this to have the job system use the player's account creation date, rather than the when they first joined the server for job timers.
+ #USE_ACCOUNT_AGE_FOR_JOBS
+
+-##Unhash this to track player playtime in the database. Requires database to be enabled.
++## Unhash this to track player playtime in the database. Requires database to be enabled.
+ #USE_EXP_TRACKING
+-##Unhash this to enable playtime requirements for head jobs.
++## Unhash this to enable playtime requirements for head jobs.
+ #USE_EXP_RESTRICTIONS_HEADS
+-##Unhash this to override head jobs' playtime requirements with this number of hours.
++## Unhash this to override head jobs' playtime requirements with this number of hours.
+ #USE_EXP_RESTRICTIONS_HEADS_HOURS 15
+-##Unhash this to change head jobs' playtime requirements so that they're based on department playtime, rather than crew playtime.
++## Unhash this to change head jobs' playtime requirements so that they're based on department playtime, rather than crew playtime.
+ #USE_EXP_RESTRICTIONS_HEADS_DEPARTMENT
+-##Unhash this to enable playtime requirements for certain non-head jobs, like Engineer and Scientist.
++## Unhash this to enable playtime requirements for certain non-head jobs, like Engineer and Scientist.
+ #USE_EXP_RESTRICTIONS_OTHER
+-##Allows admins to bypass job playtime requirements.
++## Allows admins to bypass job playtime requirements.
+ #USE_EXP_RESTRICTIONS_ADMIN_BYPASS
+
+
diff --git a/config/custom_roundstart_items.txt b/config/custom_roundstart_items.txt
new file mode 100644
index 0000000000..8c5a87a676
--- /dev/null
+++ b/config/custom_roundstart_items.txt
@@ -0,0 +1,10 @@
+//File should be in the format of ckey|exact character name/exact second character name/ALL for all chars|exact job name/exact job name/or put ALL instead of any job names|/path/to/item=amount;/path/to/item=amount
+//Each ckey should be in a different line
+//if there's multiple entries of a single ckey the later ones will add to the earlier definitions.
+//is obviously a comment.
+//Recommend defining one job per line, but do what you want.
+//test1|Secondary Memenamefortesting|testjob1/test job 2/ALL|/obj/item/gun/energy/laser=3;/obj/item/gun/energy/laser/retro=1;/obj/item/gun/energy=2
+//test1|Memename Lastname|testjob1|/obj/item/device/aicard=3;/obj/item/device/flightpack=1;/obj/item/gun/energy=3
+//kevinz000|Skylar Lineman|ALL|/obj/item/bikehorn/airhorn=1
+//kevinz000|ALL|Clown|/obj/item/bikehorn=1
+JayEhh|ALL|ALL|/obj/item/custom/ceb_soap=1
\ No newline at end of file
diff --git a/config/maps.txt b/config/maps.txt
index 8bf54ba4a8..4717a566cf 100644
--- a/config/maps.txt
+++ b/config/maps.txt
@@ -32,7 +32,3 @@ endmap
map deltastation
minplayers 50
endmap
-
-map cerestation
- minplayers 45
-endmap
\ No newline at end of file
diff --git a/config/spaceRuinBlacklist.txt b/config/spaceRuinBlacklist.txt
index 56f65f6c24..8a1069408e 100644
--- a/config/spaceRuinBlacklist.txt
+++ b/config/spaceRuinBlacklist.txt
@@ -41,3 +41,4 @@
#_maps/RandomRuins/SpaceRuins/bus.dmm
#_maps/RandomRuins/SpaceRuins/miracle.dmm
#_maps/RandomRuins/SpaceRuins/dragoontomb.dmm
+#_maps/RandomRuins/SpaceRuins/oldstation.dmm
diff --git a/html/changelogs/AutoChangeLog-pr-1986.yml b/html/changelogs/AutoChangeLog-pr-1986.yml
deleted file mode 100644
index ad49c4159c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-1986.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-author: "XDTM"
-delete-after: True
-changes:
- - experiment: "Viruses and symptoms have been havily reworked."
- - rscadd: "Symptoms now have statistic thresholds, that give them new properties or improve their existing ones if the overall virus statistic is above the threshold. Check the pull request in github or the wiki (soon) for the full list."
- - rscdel: "Some symptoms no longer scale linearly with stats, and instead have thresholds."
- - tweak: "The symptom limit is now 6."
- - rscdel: "Viruses can no longer be made invisible to the Pandemic"
- - tweak: "Symptoms no longer trigger with a 5% chance every second, but instead have a minimum and maximum number of seconds between each activation, making them more consistent."
- - rscdel: "The symptoms Blood Vomit and Projectile Vomit have been removed, and are now bonuses for the base Vomit symptom."
- - rscdel: "The Weakness symptom has been removed as it was completely useless."
- - tweak: "The Sensory Destruction symptom has been reworked into Narcolepsy, which causes drowsiness and sleep."
- - tweak: "Viral Aggressive Metabolism now has a timer before it starts decaying the virus. It scales with the highest between Resistance or Stage Speed."
- - rscadd: "You can now neuter symptoms, making them inactive. They will still affect stats. Adding formaldehyde to a virus will neuter a random symptom. A bottle of formaldehyde starts in the virus fridge."
diff --git a/html/changelogs/AutoChangeLog-pr-1999.yml b/html/changelogs/AutoChangeLog-pr-1999.yml
deleted file mode 100644
index b2d382d973..0000000000
--- a/html/changelogs/AutoChangeLog-pr-1999.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - rscadd: "Re-added cortical borers and syndi-borers, though NOT the cortical borer random event."
- - bugfix: "Fixed traitors being able to spam the syndi-borer summon, which annoyed ghosts."
- - imageadd: "Added borer icons to their own dmi instead of sharing the animal mob one."
diff --git a/html/changelogs/AutoChangeLog-pr-2000.yml b/html/changelogs/AutoChangeLog-pr-2000.yml
deleted file mode 100644
index b9b6702370..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2000.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Fox McCloud"
-delete-after: True
-changes:
- - bugfix: "Fixes IV drips not properly injecting the right amount of blood"
diff --git a/html/changelogs/AutoChangeLog-pr-2005.yml b/html/changelogs/AutoChangeLog-pr-2005.yml
deleted file mode 100644
index 94226dda9d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2005.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "Tacolizard and Cyberboss"
-delete-after: True
-changes:
- - rscadd: "Added two new organs, the liver and stomach. Without them, you won't metabolize chemicals."
- - rscadd: "The liver is responsible for processing all chemicals except nutrients. If your liver is removed, you will be unable to metabolize any drugs and will slowly die of toxin damage."
- - rscadd: "Drinking too much alcohol or having too many toxins in you will damage your liver, if it becomes too damaged, it will undergo liver failure and you will slowly die of toxin damage. Your liver naturally heals a small amount of its damage. However, it doesn't heal enough to offset stronger alcohols or large amounts of toxins, at least until they are metabolized out of your body."
- - rscadd: "to conduct a liver transplant, inject corazone into the patient. Corazone will prevent the patient from taking damage due to either not having a liver or undergoing liver failure. Corazone will metabolize out of the patient quickly, so at least 50u is recommended."
- - rscadd: "The stomach is responsible for metabolizing nutrients. Without a stomach, you will be unable to get fat, but you will also be unable to process any nutrients, meaning you will eventually starve to death."
diff --git a/html/changelogs/AutoChangeLog-pr-2008.yml b/html/changelogs/AutoChangeLog-pr-2008.yml
deleted file mode 100644
index 3a32554dac..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2008.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Raeschen"
-delete-after: True
-changes:
- - tweak: "Changed the avian say prefix of \"says\" to \"chirps\""
diff --git a/html/changelogs/AutoChangeLog-pr-2010.yml b/html/changelogs/AutoChangeLog-pr-2010.yml
deleted file mode 100644
index 811519bc50..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2010.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "NewSta"
-delete-after: True
-changes:
- - bugfix: "Fixes the maid apron being invisible when in-hand or attached to the maid outfit."
diff --git a/html/changelogs/AutoChangeLog-pr-2015.yml b/html/changelogs/AutoChangeLog-pr-2015.yml
deleted file mode 100644
index f91f0d144a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2015.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Icons"
-delete-after: True
-changes:
- - rscadd: "new hunter hat"
- - imageadd: "changed PDA sprites"
diff --git a/html/changelogs/AutoChangeLog-pr-2019.yml b/html/changelogs/AutoChangeLog-pr-2019.yml
deleted file mode 100644
index e9c0ee56ff..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2019.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "Time stop is now fixed, finally!"
- - soundadd: "Time stop's sound now plays in reverse when the effect ends."
diff --git a/html/changelogs/AutoChangeLog-pr-2020.yml b/html/changelogs/AutoChangeLog-pr-2020.yml
deleted file mode 100644
index 9615854516..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2020.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Joan"
-delete-after: True
-changes:
- - rscdel: "Removed the Soul Vessel, Cogscarab, and Anima Fragment Scriptures."
diff --git a/html/changelogs/AutoChangeLog-pr-2021.yml b/html/changelogs/AutoChangeLog-pr-2021.yml
deleted file mode 100644
index 346e10f872..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2021.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-author: "Fox McCloud"
-delete-after: True
-changes:
- - rscdel: "blood and gibs on turfs can no longer infect nearby people"
- - tweak: "Tuberculosis bypasses species virus immunity (it's not a virus!)"
- - tweak: "Disease and appendicitis events no longer infect clientless mobs"
- - tweak: "Disease event will no longer pick virus immune mobs"
- - tweak: "Appendicitis event will no longer pick mobs without an appendix"
- - bugfix: "Fixed changeling panacea curing non-harmful viruses"
diff --git a/html/changelogs/AutoChangeLog-pr-2027.yml b/html/changelogs/AutoChangeLog-pr-2027.yml
deleted file mode 100644
index 0a54d8afb5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2027.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - tweak: "Enabled random borer event, increased minimum timer before borer event can happen, decreased possibility of borer event, down to default value, increased minimum living, non-AFK players required for event to happen."
diff --git a/html/changelogs/AutoChangeLog-pr-2028.yml b/html/changelogs/AutoChangeLog-pr-2028.yml
deleted file mode 100644
index 034de7f77f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2028.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "deathride58"
-delete-after: True
-changes:
- - tweak: "The arousal meter is now invisible when arousal is disabled"
diff --git a/html/changelogs/AutoChangeLog-pr-2031.yml b/html/changelogs/AutoChangeLog-pr-2031.yml
deleted file mode 100644
index 6d46ce6102..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2031.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "Missiles can no longer ricochet off of shuttle walls, etc."
diff --git a/html/changelogs/AutoChangeLog-pr-2040.yml b/html/changelogs/AutoChangeLog-pr-2040.yml
deleted file mode 100644
index 79dbec26db..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2040.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ninjanomnom"
-delete-after: True
-changes:
- - experiment: "Thank you for updating your ShuttlSoft product! Your last update was -ERROR- years ago. A full changelog can be found at CYG10408.SHSO.b9 along with the EULA. This update lays a foundation for new things to come and a sample in the form of new and improved docking procedures."
diff --git a/html/changelogs/AutoChangeLog-pr-2043.yml b/html/changelogs/AutoChangeLog-pr-2043.yml
deleted file mode 100644
index 5103382514..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2043.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "Winter coats now hold all flashlights properly, instead of seclites."
diff --git a/html/changelogs/AutoChangeLog-pr-2047.yml b/html/changelogs/AutoChangeLog-pr-2047.yml
deleted file mode 100644
index 0a819f5319..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2047.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Joan"
-delete-after: True
-changes:
- - bugfix: "The Ark of the Clockwork Justicar will still forcibly take up a 3x3 area even if it still needs components to activate."
diff --git a/html/changelogs/AutoChangeLog-pr-2051.yml b/html/changelogs/AutoChangeLog-pr-2051.yml
deleted file mode 100644
index 65347e20a9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2051.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - rscadd: "Borers can now inject aphrodisiac and anaphrodisiac."
- - tweak: "Borer chemicals now sends flavour text to host when injected into them."
diff --git a/html/changelogs/AutoChangeLog-pr-2052.yml b/html/changelogs/AutoChangeLog-pr-2052.yml
deleted file mode 100644
index 802b5aca94..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2052.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "LetterJay"
-delete-after: True
-changes:
- - imagedel: "Removes the 'yiff in hell' graffiti tag"
diff --git a/html/changelogs/AutoChangeLog-pr-2054.yml b/html/changelogs/AutoChangeLog-pr-2054.yml
deleted file mode 100644
index 79c1892cf6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2054.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dannno/Supermichael777/InsaneHyena"
-delete-after: True
-changes:
- - rscadd: "You can now pick from a few different styles when augmenting someone with robot parts by putting them in the augment manipulator. Alt+click to take parts out."
diff --git a/html/changelogs/AutoChangeLog-pr-2057.yml b/html/changelogs/AutoChangeLog-pr-2057.yml
deleted file mode 100644
index 357a302f84..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2057.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "Fixed the refresher variant of the anomalous crystal making holodeck items real"
diff --git a/html/changelogs/AutoChangeLog-pr-2065.yml b/html/changelogs/AutoChangeLog-pr-2065.yml
deleted file mode 100644
index 0e2c4e9e65..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2065.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Fox McCloud"
-delete-after: True
-changes:
- - tweak: "breathing plasma now causes direct tox damage"
- - tweak: "breathing hot/cold air now warns you when you're doing so, again"
- - tweak: "species heat/cold mod now impacts damage from breathing hot/cold gases"
diff --git a/html/changelogs/AutoChangeLog-pr-2068.yml b/html/changelogs/AutoChangeLog-pr-2068.yml
deleted file mode 100644
index 7f2b8243e7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2068.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "Cyborgs now regenerate oxygen damage."
- - bugfix: "If a cyborg somehow takes toxin damage, it can be healed with cables as though it was burn damage."
diff --git a/html/changelogs/AutoChangeLog-pr-2069.yml b/html/changelogs/AutoChangeLog-pr-2069.yml
deleted file mode 100644
index 124ecc2a87..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2069.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - spellcheck: "Picking up ores by walking over them now longer spams messages, instead showing one message per tile of ore picked up."
diff --git a/html/changelogs/AutoChangeLog-pr-2073.yml b/html/changelogs/AutoChangeLog-pr-2073.yml
deleted file mode 100644
index 11f89f7421..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2073.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis & MoreRobustThanYou"
-delete-after: True
-changes:
- - imageadd: "Toolbelts now have overlays for crowbars, wirecutters, screwdrivers, multitools, and wrenches."
diff --git a/html/changelogs/AutoChangeLog-pr-2075.yml b/html/changelogs/AutoChangeLog-pr-2075.yml
deleted file mode 100644
index 9ab87e9f66..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2075.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - bugfix: "Hijacking should now be possible again!"
diff --git a/html/changelogs/AutoChangeLog-pr-2083.yml b/html/changelogs/AutoChangeLog-pr-2083.yml
deleted file mode 100644
index 76f5b83aef..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2083.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "delayed chloral hydrate actually works now."
diff --git a/html/changelogs/AutoChangeLog-pr-2085.yml b/html/changelogs/AutoChangeLog-pr-2085.yml
deleted file mode 100644
index 5ff1020c4c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2085.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - tweak: "Re-enabled the custom emote for slimes."
diff --git a/html/changelogs/AutoChangeLog-pr-2086.yml b/html/changelogs/AutoChangeLog-pr-2086.yml
deleted file mode 100644
index 6511bed053..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2086.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Joan"
-delete-after: True
-changes:
- - tweak: "The blood-drunk miner will fire its KA a bit more often."
diff --git a/html/changelogs/AutoChangeLog-pr-2088.yml b/html/changelogs/AutoChangeLog-pr-2088.yml
deleted file mode 100644
index bc5d102b8c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2088.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "HAL 9000"
-delete-after: True
-changes:
- - bugfix: "I'm sorry Dave, I'm afraid I can't do that"
diff --git a/html/changelogs/AutoChangeLog-pr-2090.yml b/html/changelogs/AutoChangeLog-pr-2090.yml
deleted file mode 100644
index be21f5c4d0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2090.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Jay"
-delete-after: True
-changes:
- - imageadd: "New PDA icons"
- - bugfix: "fixes missing icons for PDAs"
diff --git a/html/changelogs/AutoChangeLog-pr-2091.yml b/html/changelogs/AutoChangeLog-pr-2091.yml
deleted file mode 100644
index b2078a5377..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2091.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "Reviving Stasis now consistently regenerates organs."
diff --git a/html/changelogs/AutoChangeLog-pr-2093.yml b/html/changelogs/AutoChangeLog-pr-2093.yml
deleted file mode 100644
index d7b4af9427..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2093.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "Mining satchels no longer hold infinite amounts of ore."
diff --git a/html/changelogs/AutoChangeLog-pr-2094.yml b/html/changelogs/AutoChangeLog-pr-2094.yml
deleted file mode 100644
index e74ec9d15f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2094.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "BeeSting12"
-delete-after: True
-changes:
- - rscdel: "Water bottles from the sustenance vendor are gone. Wait for the ice in the ice cups melt, criminal scum."
- - rscdel: "There is no longer a sink in gulag. Hygiene is for the moral members of society."
diff --git a/html/changelogs/AutoChangeLog-pr-2098.yml b/html/changelogs/AutoChangeLog-pr-2098.yml
deleted file mode 100644
index a1c9c0326c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2098.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "JStheguy"
-delete-after: True
-changes:
- - imageadd: "Resprited the tablet, including completely redone screen sprites."
- - rscadd: "Tablets can now come spawn in one of 5 colors; red, green, yellow, blue, and black."
diff --git a/html/changelogs/AutoChangeLog-pr-2099.yml b/html/changelogs/AutoChangeLog-pr-2099.yml
deleted file mode 100644
index d44b06e41d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2099.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "Medibots now properly render the overlays of the medkits they are made from."
diff --git a/html/changelogs/AutoChangeLog-pr-2101.yml b/html/changelogs/AutoChangeLog-pr-2101.yml
deleted file mode 100644
index 8be6bd4e31..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2101.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Joan"
-delete-after: True
-changes:
- - tweak: "The Hierophant will now release a burst when melee attacking instead of actually hitting its target."
- - bugfix: "The Hierophant Club's blasts will now properly aggro hostile mobs."
diff --git a/html/changelogs/AutoChangeLog-pr-2106.yml b/html/changelogs/AutoChangeLog-pr-2106.yml
deleted file mode 100644
index 27356cd378..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2106.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - tweak: "Increased minimum timer for xenomorph event from 20 to 40min. Also increased minimum living, non-afk players required from 10 to 20."
diff --git a/html/changelogs/AutoChangeLog-pr-2110.yml b/html/changelogs/AutoChangeLog-pr-2110.yml
deleted file mode 100644
index 14534a7ed6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2110.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "The latest batch of Syndicate screwdrivers fell into a vat of paint and were colored randomly. We have rinsed them off and they will no longer come in random colors."
diff --git a/html/changelogs/AutoChangeLog-pr-2111.yml b/html/changelogs/AutoChangeLog-pr-2111.yml
deleted file mode 100644
index e8fd2920c7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2111.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - rscadd: "Pizza box stacks can now fall over"
- - imageadd: "Pizza box inhands now stacks depending on how many you're holding."
diff --git a/html/changelogs/AutoChangeLog-pr-2115.yml b/html/changelogs/AutoChangeLog-pr-2115.yml
deleted file mode 100644
index b43817a7cf..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2115.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "Supermatter slivers can now be stolen properly."
diff --git a/html/changelogs/AutoChangeLog-pr-2119.yml b/html/changelogs/AutoChangeLog-pr-2119.yml
deleted file mode 100644
index 6a412027d6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2119.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - tweak: "You can now control-click action buttons to lock them and prevent them from being moved. Alt-clicking the \"Show/Hide Actions\" button will unlock all buttons."
- - tweak: "There is now a preference for if buttons should be locked by default or not."
diff --git a/html/changelogs/AutoChangeLog-pr-2120.yml b/html/changelogs/AutoChangeLog-pr-2120.yml
deleted file mode 100644
index 197c992c6f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2120.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "bandit"
-delete-after: True
-changes:
- - rscadd: "New Cards against Spess cards are available!"
diff --git a/html/changelogs/AutoChangeLog-pr-2130.yml b/html/changelogs/AutoChangeLog-pr-2130.yml
deleted file mode 100644
index c464b9214b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2130.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Y0SH1_M4S73R"
-delete-after: True
-changes:
- - bugfix: "Romerol zombies count as dead for assassinate and maroon objectives."
diff --git a/html/changelogs/AutoChangeLog-pr-2131.yml b/html/changelogs/AutoChangeLog-pr-2131.yml
deleted file mode 100644
index b9076f4a4a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2131.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - tweak: "Whenever you're trying to hack off your own limbs, you'll now always hit those limbs."
diff --git a/html/changelogs/AutoChangeLog-pr-2132.yml b/html/changelogs/AutoChangeLog-pr-2132.yml
deleted file mode 100644
index d788f4bee1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2132.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "PopNotes"
-delete-after: True
-changes:
- - soundadd: "Nar-Sie now sounds like an eldritch abomination that obliterates worlds instead of a sweet maiden that gently whispers sweet nothings in your ear."
diff --git a/html/changelogs/AutoChangeLog-pr-2133.yml b/html/changelogs/AutoChangeLog-pr-2133.yml
deleted file mode 100644
index a3df9c0374..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2133.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - bugfix: "The Subtle emote now properly cancels empty or cancelled emotes."
diff --git a/html/changelogs/AutoChangeLog-pr-2134.yml b/html/changelogs/AutoChangeLog-pr-2134.yml
deleted file mode 100644
index f16e873b5a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2134.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - tweak: "Rejoice deviants all over, as semen and other such... fluids now have a taste beyond \"Generic Food\"!"
diff --git a/html/changelogs/AutoChangeLog-pr-2135.yml b/html/changelogs/AutoChangeLog-pr-2135.yml
deleted file mode 100644
index 59b11f3982..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2135.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Tacolizard"
-delete-after: True
-changes:
- - rscadd: "Added cybernetic organs to RnD, they can be used to replace organic organs. Remember to administer corazone during implantation though!"
- - rscadd: "Added the upgraded cybernetic liver. It is exceptionally robust against toxins and alcohol poisoning."
diff --git a/html/changelogs/AutoChangeLog-pr-2139.yml b/html/changelogs/AutoChangeLog-pr-2139.yml
deleted file mode 100644
index d3136b9b6f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2139.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Raeschen"
-delete-after: True
-changes:
- - rscadd: "Added goodbyemoonmen.ogg to /strings/round_start_sounds.txt"
- - soundadd: "Added sound/music/goodbyemoonmen.ogg"
diff --git a/html/changelogs/AutoChangeLog-pr-2140.yml b/html/changelogs/AutoChangeLog-pr-2140.yml
deleted file mode 100644
index eefbf05f4b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2140.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - rscadd: "A new objective is now available for traitors, where their target to assassinate has not yet arrived at the station."
- - bugfix: "Random objective target that used to not be random now is."
diff --git a/html/changelogs/AutoChangeLog-pr-2142.yml b/html/changelogs/AutoChangeLog-pr-2142.yml
deleted file mode 100644
index 79aed9e920..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2142.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "Guns like sniper rifles now unzoom if you unequip them or move them to another hand."
diff --git a/html/changelogs/AutoChangeLog-pr-2143.yml b/html/changelogs/AutoChangeLog-pr-2143.yml
deleted file mode 100644
index ca4975e073..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2143.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Joan"
-delete-after: True
-changes:
- - tweak: "Lava rivers though the ash walker nest are now significantly less of a hassle for the ashwalkers."
diff --git a/html/changelogs/AutoChangeLog-pr-2145.yml b/html/changelogs/AutoChangeLog-pr-2145.yml
deleted file mode 100644
index e55ff2fbb5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2145.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "BeeSting12"
-delete-after: True
-changes:
- - tweak: "Janitor and service cyborgs now get pocket fire extinguishers for fire suppression and space propulsion."
diff --git a/html/changelogs/AutoChangeLog-pr-2147.yml b/html/changelogs/AutoChangeLog-pr-2147.yml
deleted file mode 100644
index 2f712f1b5b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2147.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "optional name here"
-delete-after: True
-changes:
- - imageadd: "Updated PDA Icons as well as fix the missing ones/incorrectly used ones. (Art by Cecily & Toriate)"
diff --git a/html/changelogs/AutoChangeLog-pr-2151.yml b/html/changelogs/AutoChangeLog-pr-2151.yml
deleted file mode 100644
index 75db215b0c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2151.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "Informs a person about how bomb cores work"
diff --git a/html/changelogs/AutoChangeLog-pr-2154.yml b/html/changelogs/AutoChangeLog-pr-2154.yml
deleted file mode 100644
index bb61e5cf17..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2154.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "JStheguy"
-delete-after: True
-changes:
- - imageadd: "Most alcohol bottles have been resprited, as well as a poster that used one of the current bottles as part of it's design."
diff --git a/html/changelogs/AutoChangeLog-pr-2161.yml b/html/changelogs/AutoChangeLog-pr-2161.yml
deleted file mode 100644
index 2a65d07cc2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2161.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "BeeSting12"
-delete-after: True
-changes:
- - bugfix: "Crafting satchels from leather now makes a leather satchel rather than a regular satchel."
diff --git a/html/changelogs/AutoChangeLog-pr-2162.yml b/html/changelogs/AutoChangeLog-pr-2162.yml
deleted file mode 100644
index ce63047823..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2162.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "More Robust Than You"
-delete-after: True
-changes:
- - rscadd: "Nanotrasen has begun production of the Rapid Cable Layer, a tool that helps you lay down cables faster"
- - rscadd: "You can now craft ghetto RCLs with metal, a screwdriver, welder, and wrench. They hold less cable, and may fall apart or jam!"
diff --git a/html/changelogs/AutoChangeLog-pr-2167.yml b/html/changelogs/AutoChangeLog-pr-2167.yml
deleted file mode 100644
index 6052615429..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2167.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - bugfix: "Ashstorms no longer pierces the protected people to kill anyone/anything in them."
diff --git a/html/changelogs/AutoChangeLog-pr-2168.yml b/html/changelogs/AutoChangeLog-pr-2168.yml
deleted file mode 100644
index 90eb00b416..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2168.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "ShizCalev"
-delete-after: True
-changes:
- - bugfix: "Robust coffee is now even more robust! No longer will you be drinking frozen hot coffee!"
- - bugfix: "Clockwork covenants and Ratvar will no longer go invisible by releasing a canister of freon!"
- - bugfix: "Ratvar's summoning portal will no longer be permanently broken by freon."
diff --git a/html/changelogs/AutoChangeLog-pr-2169.yml b/html/changelogs/AutoChangeLog-pr-2169.yml
deleted file mode 100644
index 1ec1927950..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2169.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "FuryMcFlurry"
-delete-after: True
-changes:
- - rscadd: "Added mummy, scarecrow, skeleton, and jester costumes. They don't spawn on the map yet, so make sure to beg the admins for them!"
diff --git a/html/changelogs/AutoChangeLog-pr-2170.yml b/html/changelogs/AutoChangeLog-pr-2170.yml
deleted file mode 100644
index baa827e813..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2170.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Fox McCloud"
-delete-after: True
-changes:
- - rscadd: "Sound should carry further, but should get quieter and quieter the further you are from it"
diff --git a/html/changelogs/AutoChangeLog-pr-2172.yml b/html/changelogs/AutoChangeLog-pr-2172.yml
deleted file mode 100644
index e11cce9cef..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2172.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - rscadd: "Badmins: Buildmode map generators have names in the list to select them, instead of paths."
- - rscadd: "Also, a new map generator has been added, repair/reload station. Use it VERY sparingly, it deletes the block of the map and reloads it to roundstart. THIS CAN CAUSE ISSUES WITH MACHINES AND ATMOSPHERICS, SO DO NOT USE IT UNLESS YOU ABSOLUTELY HAVE TO!"
- - experiment: "The reload station one tagged DO NOT USE shouldn't be used as it doesn't delete anything before loading, so if you use it you'll have two copies of things. That can result in a LOT of issues, so don't use it unless you're a codermin and know what you're doing/abusing!"
diff --git a/html/changelogs/AutoChangeLog-pr-2173.yml b/html/changelogs/AutoChangeLog-pr-2173.yml
deleted file mode 100644
index efceb122be..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2173.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Joan"
-delete-after: True
-changes:
- - tweak: "Sigils of Transmission can now drain power in a large area when activated by a Servant."
- - rscdel: "Interdiction Lenses have been removed, as they were largely only used to drain power into Sigils of Transmission.
-balance: Sigils can no longer directly be removed by Servants."
diff --git a/html/changelogs/AutoChangeLog-pr-2180.yml b/html/changelogs/AutoChangeLog-pr-2180.yml
deleted file mode 100644
index 3bb825e80e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2180.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "Stun baton overlays now appear on security belts when active."
diff --git a/html/changelogs/AutoChangeLog-pr-2184.yml b/html/changelogs/AutoChangeLog-pr-2184.yml
deleted file mode 100644
index a98deab3b8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2184.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "Syringes now properly inject targets wearing thick clothing on different slots."
diff --git a/html/changelogs/AutoChangeLog-pr-2186.yml b/html/changelogs/AutoChangeLog-pr-2186.yml
deleted file mode 100644
index 43bb2fef87..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2186.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - spellcheck: "Player-controlled medibots now receive a notice whenever they try to heal someone with too high health."
diff --git a/html/changelogs/AutoChangeLog-pr-2189.yml b/html/changelogs/AutoChangeLog-pr-2189.yml
deleted file mode 100644
index 2bdbc7d471..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2189.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Raeschen"
-delete-after: True
-changes:
- - rscdel: "Removed a whole bunch of hivebots."
- - rscadd: "Added stronger hivebots."
diff --git a/html/changelogs/AutoChangeLog-pr-2190.yml b/html/changelogs/AutoChangeLog-pr-2190.yml
deleted file mode 100644
index 901dde7c7b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2190.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "XDTM"
-delete-after: True
-changes:
- - bugfix: "Eyes can now be properly damaged."
diff --git a/html/changelogs/AutoChangeLog-pr-2193.yml b/html/changelogs/AutoChangeLog-pr-2193.yml
deleted file mode 100644
index 46988eaee1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2193.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - spellcheck: "Removed an improper period from the supermatter sliver theft objective's name."
diff --git a/html/changelogs/AutoChangeLog-pr-2196.yml b/html/changelogs/AutoChangeLog-pr-2196.yml
deleted file mode 100644
index 736d98cb66..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2196.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Joan"
-delete-after: True
-changes:
- - tweak: "Colossus's shotgun is now a static-spread blast of 6 bolts, making it more predictable."
diff --git a/html/changelogs/AutoChangeLog-pr-2197.yml b/html/changelogs/AutoChangeLog-pr-2197.yml
deleted file mode 100644
index 6d4e8f4089..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2197.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - rscadd: "Surgical toolarm to protolathe and exofab"
- - tweak: "Toolarm tools are less robust but more efficient at surgery"
- - tweak: "Arm augments are no longer a huge item"
diff --git a/html/changelogs/AutoChangeLog-pr-2209.yml b/html/changelogs/AutoChangeLog-pr-2209.yml
deleted file mode 100644
index c65bfd79cc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2209.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - tweak: "Changed how borers win-conditions are displayed. Syndicate borers are now listed with other cortical borers, as they can count for their team-objective even if they don't share it."
diff --git a/html/changelogs/AutoChangeLog-pr-2211.yml b/html/changelogs/AutoChangeLog-pr-2211.yml
deleted file mode 100644
index 9852662933..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2211.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - rscadd: "Borers of all kinds now have a HUD element to see other sentient borers and their hosts. (Hosts cannot see this HUD)"
diff --git a/html/changelogs/AutoChangeLog-pr-2215.yml b/html/changelogs/AutoChangeLog-pr-2215.yml
deleted file mode 100644
index f02f2d33cf..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2215.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Xhuis and oranges"
-delete-after: True
-changes:
- - bugfix: "Banana cream pies no longer splat when they're caught by someone."
- - soundadd: "Throwing a pie in someone's face now has a splat sound."
diff --git a/html/changelogs/AutoChangeLog-pr-2231.yml b/html/changelogs/AutoChangeLog-pr-2231.yml
deleted file mode 100644
index c25b4b2b49..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2231.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - tweak: "Spell action buttons now have their description in a tooltip."
diff --git a/html/changelogs/AutoChangeLog-pr-2232.yml b/html/changelogs/AutoChangeLog-pr-2232.yml
deleted file mode 100644
index 8d82c65d9f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2232.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "Floyd (and sprites by Maya from Yogstation13)"
-delete-after: True
-changes:
- - rscadd: "Makes rat edible. Only lizards really enjoy eating them, though."
- - rscadd: "Adds food types to all food, which means you can no longer eat whatever the hell you want."
- - rscadd: "Adds a disgust system, currently only used with food."
- - rscadd: "Pukonium, makes whoever it is injected to disgusted."
- - rscadd: "Makes pod people vegan, or well, carnivores. It depends on how you look at it, really."
diff --git a/html/changelogs/AutoChangeLog-pr-2233.yml b/html/changelogs/AutoChangeLog-pr-2233.yml
deleted file mode 100644
index 4a8109664b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2233.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - rscadd: "Adds the \"seedling\" planetstation mob to the backend"
diff --git a/html/changelogs/AutoChangeLog-pr-2242.yml b/html/changelogs/AutoChangeLog-pr-2242.yml
deleted file mode 100644
index 69b47043d3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2242.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - bugfix: "Cloning and podding people no longer forgets to put the genitals back in you."
- - bugfix: "Changeling and other DNA transformations now apply the appropriate genitalia."
diff --git a/html/changelogs/AutoChangeLog-pr-2245.yml b/html/changelogs/AutoChangeLog-pr-2245.yml
deleted file mode 100644
index 3f19f56d03..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2245.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Galactic Corgi Breeding Mills, LLC"
-delete-after: True
-changes:
- - bugfix: "Fixed corgis being able to wear spacesuit helmets despite lacking the proper code and sprites for them."
diff --git a/html/changelogs/AutoChangeLog-pr-2249.yml b/html/changelogs/AutoChangeLog-pr-2249.yml
deleted file mode 100644
index 4cc75881bc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2249.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "Alien hunters can no longer pounce through shields."
diff --git a/html/changelogs/AutoChangeLog-pr-2253.yml b/html/changelogs/AutoChangeLog-pr-2253.yml
deleted file mode 100644
index 142950f442..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2253.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Floyd"
-delete-after: True
-changes:
- - bugfix: "No longer does everyone look like a sick, nauseated weirdo!"
diff --git a/html/changelogs/AutoChangeLog-pr-2266.yml b/html/changelogs/AutoChangeLog-pr-2266.yml
deleted file mode 100644
index 2a02edfb87..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2266.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "Objects on shuttles now rotate in the correct directions."
diff --git a/html/changelogs/AutoChangeLog-pr-2274.yml b/html/changelogs/AutoChangeLog-pr-2274.yml
deleted file mode 100644
index ef5c537edd..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2274.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Lexorion"
-delete-after: True
-changes:
- - imageadd: "Hearty Punch has a new, fancier sprite."
diff --git a/html/changelogs/AutoChangeLog-pr-2281.yml b/html/changelogs/AutoChangeLog-pr-2281.yml
deleted file mode 100644
index 189f18a117..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2281.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - bugfix: "Character preview now displays genitals again."
diff --git a/html/changelogs/AutoChangeLog-pr-2287.yml b/html/changelogs/AutoChangeLog-pr-2287.yml
deleted file mode 100644
index d6b77f9436..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2287.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "Turning off APCs will no longer make the weather in that area invisible."
diff --git a/html/changelogs/AutoChangeLog-pr-2291.yml b/html/changelogs/AutoChangeLog-pr-2291.yml
deleted file mode 100644
index 4b87a21dfd..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2291.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - soundadd: "The speakers in the ceiling have been upgraded, and many sounds are now less tinny."
diff --git a/html/changelogs/AutoChangeLog-pr-2295.yml b/html/changelogs/AutoChangeLog-pr-2295.yml
deleted file mode 100644
index c34d19ac6f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2295.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "More Robust Than You"
-delete-after: True
-changes:
- - tweak: "Mulligan and non-continuous completion checks will not consider afk/logged out people to be \"living crew\"."
diff --git a/html/changelogs/AutoChangeLog-pr-2298.yml b/html/changelogs/AutoChangeLog-pr-2298.yml
deleted file mode 100644
index 3d12cf9dee..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2298.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - bugfix: "Preys being digested now get their digestion message"
diff --git a/html/changelogs/AutoChangeLog-pr-2299.yml b/html/changelogs/AutoChangeLog-pr-2299.yml
deleted file mode 100644
index 7f5e8730dc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2299.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "JStheguy"
-delete-after: True
-changes:
- - imageadd: "Laptops now have actual sprites for using the supermatter monitoring instead of defaulting to a generic one."
diff --git a/html/changelogs/AutoChangeLog-pr-2301.yml b/html/changelogs/AutoChangeLog-pr-2301.yml
deleted file mode 100644
index 2924b5a5ad..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2301.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "LetterJay"
-delete-after: True
-changes:
- - rscadd: "Adds bear ears and bear tails (Sprites courtesy of LizziePup)"
diff --git a/html/changelogs/AutoChangeLog-pr-2305.yml b/html/changelogs/AutoChangeLog-pr-2305.yml
deleted file mode 100644
index fbd7208358..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2305.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Joan"
-delete-after: True
-changes:
- - imageadd: "Belligerent now has a visible indicator over the caster."
diff --git a/html/changelogs/AutoChangeLog-pr-2308.yml b/html/changelogs/AutoChangeLog-pr-2308.yml
deleted file mode 100644
index 1d367c4d84..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2308.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - rscadd: "Penises can now climax inside someone instead of only be used for masturbating. Use passive grab to be able to spill on the floor, aggressive or higher grab to not spill a drop."
- - rscadd: "Hexacrocin and hexacamphor now adjusts your arousal up respectively down when overdosed. Hexacrocin overdoses can force orgasms at high arousal."
- - bugfix: "Penises can now be used for masturbation without containers again."
- - bugfix: "Citadel chems now sends you feedback messages properly when in effect."
diff --git a/html/changelogs/AutoChangeLog-pr-2309.yml b/html/changelogs/AutoChangeLog-pr-2309.yml
deleted file mode 100644
index 89ceed6223..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2309.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - bugfix: "Cloner and other mind-transfer things now respect client arousal settings."
diff --git a/html/changelogs/AutoChangeLog-pr-2319.yml b/html/changelogs/AutoChangeLog-pr-2319.yml
deleted file mode 100644
index 4ca8998875..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2319.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "Swarmer shells now have ghost notifications again."
diff --git a/html/changelogs/AutoChangeLog-pr-2320.yml b/html/changelogs/AutoChangeLog-pr-2320.yml
deleted file mode 100644
index 695f23e7de..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2320.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "LetterJay"
-delete-after: True
-changes:
- - tweak: "Adds the option for bear ears and tails for humans as well."
diff --git a/html/changelogs/AutoChangeLog-pr-2325.yml b/html/changelogs/AutoChangeLog-pr-2325.yml
deleted file mode 100644
index 5ad1b25324..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2325.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Pubby"
-delete-after: True
-changes:
- - rscadd: "The Curator job is now available on PubbyStation"
- - rscadd: "Beekeeping has been added to PubbyStation's monastery"
- - tweak: "PubbyStation's bar has been rearranged"
diff --git a/html/changelogs/AutoChangeLog-pr-2329.yml b/html/changelogs/AutoChangeLog-pr-2329.yml
deleted file mode 100644
index 2950b70fbb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2329.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - rscadd: "Adds flared, knotted or tapered dicks for Taur bodies."
- - tweak: "Resized the cow-taur's over-extended belly to match the profile picture, no longer completely blocking the taur penises."
- - bugfix: "Barbed, knotted penises and other such long-named cocks are now visible on the ground if dismembered."
diff --git a/html/changelogs/AutoChangeLog-pr-2335.yml b/html/changelogs/AutoChangeLog-pr-2335.yml
deleted file mode 100644
index 5681e3d5f9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2335.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - bugfix: "Flavortext is now in the DNA of mobs who has that, meaning changelings, cloners and such things use it properly."
diff --git a/html/changelogs/AutoChangeLog-pr-2339.yml b/html/changelogs/AutoChangeLog-pr-2339.yml
deleted file mode 100644
index c7f3d42698..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2339.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "More Robust Than You"
-delete-after: True
-changes:
- - tweak: "His Grace now shows up on the orbit list"
diff --git a/html/changelogs/AutoChangeLog-pr-2346.yml b/html/changelogs/AutoChangeLog-pr-2346.yml
deleted file mode 100644
index c42300a173..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2346.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "More Robust Than You"
-delete-after: True
-changes:
- - tweak: "The wiki button now asks what page you want to be taken to"
diff --git a/html/changelogs/AutoChangeLog-pr-2350.yml b/html/changelogs/AutoChangeLog-pr-2350.yml
deleted file mode 100644
index 07e0f51b62..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2350.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "Minebots no longer lack icons for their action buttons."
diff --git a/html/changelogs/AutoChangeLog-pr-2356.yml b/html/changelogs/AutoChangeLog-pr-2356.yml
deleted file mode 100644
index 218da24865..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2356.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - imageadd: "Adds icon_states to the unused and used Eldritch whetstones. Sprites by Fury McFlurry."
diff --git a/html/changelogs/AutoChangeLog-pr-2357.yml b/html/changelogs/AutoChangeLog-pr-2357.yml
deleted file mode 100644
index f63277f66f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2357.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - rscadd: "Breasts can now be used to masturbate/milk yourselves."
- - rscadd: "You can now expose genitals through clothing using a verb in the IC tab."
- - tweak: "Pressing the Arousal HUD symbol will now bring up several options to use. Pull or be pulled by someone who's exposed to have them appear as an option."
- - tweak: "Made hexacamphor/hexacrocin less verbose and trigger forced climaxes less often to avoid incredible spam."
- - tweak: "Being forced to orgasm while pulled or pulling someone now counts them as your selected partner."
diff --git a/html/changelogs/AutoChangeLog-pr-2359.yml b/html/changelogs/AutoChangeLog-pr-2359.yml
deleted file mode 100644
index 8455963dc6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2359.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Joan"
-delete-after: True
-changes:
- - imageadd: "Ported CEV-Eris's APC sprites."
diff --git a/html/changelogs/AutoChangeLog-pr-2362.yml b/html/changelogs/AutoChangeLog-pr-2362.yml
deleted file mode 100644
index 5bdc603b06..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2362.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "More Robust Than You"
-delete-after: True
-changes:
- - bugfix: "Fixes a typo in the blobbernaut spawn text"
diff --git a/html/changelogs/AutoChangeLog-pr-2363.yml b/html/changelogs/AutoChangeLog-pr-2363.yml
deleted file mode 100644
index e8f5b574ae..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2363.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - tweak: "Canisters don't flash red lights anymore when empty."
diff --git a/html/changelogs/AutoChangeLog-pr-2371.yml b/html/changelogs/AutoChangeLog-pr-2371.yml
deleted file mode 100644
index ec1810b8a6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2371.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "The Resurrect Cultist rune now works as intended."
diff --git a/html/changelogs/AutoChangeLog-pr-2376.yml b/html/changelogs/AutoChangeLog-pr-2376.yml
deleted file mode 100644
index 1d1a2007b5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2376.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ShizCalev"
-delete-after: True
-changes:
- - bugfix: "The Singularity, Tesla energy ball, tears in the fabric of reality, and Narsie will no longer be frozen by freon."
diff --git a/html/changelogs/AutoChangeLog-pr-2377.yml b/html/changelogs/AutoChangeLog-pr-2377.yml
deleted file mode 100644
index 4996a03563..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2377.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "More Robust Than You"
-delete-after: True
-changes:
- - bugfix: "Fixes mining hardsuit heat_protection"
diff --git a/html/changelogs/AutoChangeLog-pr-2399.yml b/html/changelogs/AutoChangeLog-pr-2399.yml
deleted file mode 100644
index 2d162a5edf..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2399.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "More Robust Than You"
-delete-after: True
-changes:
- - rscadd: "Blobs can now sense when they're being cuddled!"
diff --git a/html/changelogs/AutoChangeLog-pr-2402.yml b/html/changelogs/AutoChangeLog-pr-2402.yml
deleted file mode 100644
index 0ef97907fd..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2402.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - imageadd: "Nanotrasen redesigned the area power controllers!"
- - imageadd: "Thanks Xhuis for the contrast tweak on APCs"
diff --git a/html/changelogs/AutoChangeLog-pr-2408.yml b/html/changelogs/AutoChangeLog-pr-2408.yml
deleted file mode 100644
index 92f33a9292..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2408.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - soundadd: "The station's explosion now uses a new (or old) sound."
diff --git a/html/changelogs/AutoChangeLog-pr-2428.yml b/html/changelogs/AutoChangeLog-pr-2428.yml
deleted file mode 100644
index 76adf39bcd..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2428.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - spellcheck: "The chat message has been removed from *spin. I hope you're happy."
diff --git a/html/changelogs/AutoChangeLog-pr-2437.yml b/html/changelogs/AutoChangeLog-pr-2437.yml
deleted file mode 100644
index 1a54eed45e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2437.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "BeeSting12"
-delete-after: True
-changes:
- - bugfix: "Deltastation's N2O console has been renamed to be an N2O console."
- - tweak: "Deltastation's atmos now has a fire axe."
diff --git a/html/changelogs/AutoChangeLog-pr-2438.yml b/html/changelogs/AutoChangeLog-pr-2438.yml
deleted file mode 100644
index 9195a11183..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2438.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "XDTM"
-delete-after: True
-changes:
- - bugfix: "Viruses will now be able to affect more than one person at a time."
diff --git a/html/changelogs/AutoChangeLog-pr-2439.yml b/html/changelogs/AutoChangeLog-pr-2439.yml
deleted file mode 100644
index c92b5e2235..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2439.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ShizCalev"
-delete-after: True
-changes:
- - tweak: "The singularity will now dig up asteroids when in proximity of them. Please watch for flying debris."
diff --git a/html/changelogs/AutoChangeLog-pr-2440.yml b/html/changelogs/AutoChangeLog-pr-2440.yml
new file mode 100644
index 0000000000..b353d7b79b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2440.yml
@@ -0,0 +1,4 @@
+author: "XDTM"
+delete-after: True
+changes:
+ - rscadd: "You can now click on symptoms in the Pandemic to see their description and stats"
diff --git a/html/changelogs/AutoChangeLog-pr-2442.yml b/html/changelogs/AutoChangeLog-pr-2442.yml
new file mode 100644
index 0000000000..47a8464ffb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2442.yml
@@ -0,0 +1,5 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - experiment: "The amount of time spent playing, and jobs played are now tracked per player."
+ - experiment: "This tracking can be used as a requirement of playtime to unlock jobs."
diff --git a/html/changelogs/AutoChangeLog-pr-2448.yml b/html/changelogs/AutoChangeLog-pr-2448.yml
deleted file mode 100644
index 40610a2afe..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2448.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - bugfix: "Taurs now rely on their taur-sprites to render legs, instead of rendering human legs on top of them. Mostly impacts driders and such uniquely legged individuals."
diff --git a/html/changelogs/AutoChangeLog-pr-2461.yml b/html/changelogs/AutoChangeLog-pr-2461.yml
deleted file mode 100644
index 4f33badb1b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2461.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - tweak: "Garbage collection happens less often now to reduce the lag caused by hard deletions."
diff --git a/html/changelogs/AutoChangeLog-pr-2463.yml b/html/changelogs/AutoChangeLog-pr-2463.yml
new file mode 100644
index 0000000000..72c9de6edd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2463.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - bugfix: "You can now empty storage objects onto floors again."
diff --git a/html/changelogs/AutoChangeLog-pr-2465.yml b/html/changelogs/AutoChangeLog-pr-2465.yml
deleted file mode 100644
index 2b2c8bfc8b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2465.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "Boss tiles have been reconstructed out of an unstoppable force."
diff --git a/html/changelogs/AutoChangeLog-pr-2471.yml b/html/changelogs/AutoChangeLog-pr-2471.yml
deleted file mode 100644
index a7264612a1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2471.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - bugfix: "Dogborgs now properly sends chat messages when using their unique modules."
- - bugfix: "Medidogs now respect vore prefs."
- - bugfix: "Dogborg modules now respect the laws of physics, in regards to only eating/cleaning people/things near them."
- - bugfix: "Dogborg stuff now has that nice progress-bar show up when trying to do things."
diff --git a/html/changelogs/AutoChangeLog-pr-2483.yml b/html/changelogs/AutoChangeLog-pr-2483.yml
deleted file mode 100644
index f36e6c226c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2483.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - tweak: "The cooldown on communications console announcements is halved from 60 to 30 seconds."
diff --git a/html/changelogs/AutoChangeLog-pr-2487.yml b/html/changelogs/AutoChangeLog-pr-2487.yml
deleted file mode 100644
index c7e214e26e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2487.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Joan"
-delete-after: True
-changes:
- - tweak: "Geis bindings will decay slower when on a Sigil of Submission, and, if being pulled by a Servant when crossing a Sigil of Submission, will helpfully remove the pull."
- - tweak: "Removing Geis bindings is no longer instant and can be done by any Servant with a slab, not just the initiator."
- - wip: "Geis no longer prevents you from taking actions, but you remain unable to recite scripture while the target is bound. In addition, dealing damage to a bound target will cause the bindings to decay much more rapidly."
- - rscadd: "You can now remove sigils by hitting them with a clockwork slab for a small refund."
diff --git a/html/changelogs/AutoChangeLog-pr-2509.yml b/html/changelogs/AutoChangeLog-pr-2509.yml
new file mode 100644
index 0000000000..c54ef55884
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2509.yml
@@ -0,0 +1,4 @@
+author: "MMMiracles"
+delete-after: True
+changes:
+ - rscdel: "Cerestation has been decommissioned. Nanotrasen apologizes for any spikes of suicidal tendencies, sporadic outbursts of primitive anger, and other issues that may of been caused during the station's run."
diff --git a/html/changelogs/AutoChangeLog-pr-2513.yml b/html/changelogs/AutoChangeLog-pr-2513.yml
deleted file mode 100644
index 53e3fcd985..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2513.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - tweak: "Heresy has come to the station, humans must now select custom skin colours! Specific RGB values can be enterred in order to get just the right tone of skin your special snowflake needs, just like you can for other humanoids!"
diff --git a/html/changelogs/AutoChangeLog-pr-2517.yml b/html/changelogs/AutoChangeLog-pr-2517.yml
deleted file mode 100644
index 3c3c7c5283..0000000000
--- a/html/changelogs/AutoChangeLog-pr-2517.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ktccd"
-delete-after: True
-changes:
- - tweak: "Set all food preferences to NONE for all species."
diff --git a/html/changelogs/AutoChangeLog-pr-2545.yml b/html/changelogs/AutoChangeLog-pr-2545.yml
new file mode 100644
index 0000000000..b3f555c1c2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2545.yml
@@ -0,0 +1,4 @@
+author: "Cobby & Cyberboss"
+delete-after: True
+changes:
+ - rscadd: "A stealth option for the traitor microlaser has been added. When used, it adds 30 seconds to the cooldown of the device."
diff --git a/html/changelogs/AutoChangeLog-pr-2555.yml b/html/changelogs/AutoChangeLog-pr-2555.yml
new file mode 100644
index 0000000000..6991c2709b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2555.yml
@@ -0,0 +1,4 @@
+author: "Jay"
+delete-after: True
+changes:
+ - bugfix: "Fixes missing Guilmon var that prevented their bodymarkings form showing up in character creation"
diff --git a/html/changelogs/AutoChangeLog-pr-2278.yml b/html/changelogs/AutoChangeLog-pr-2557.yml
similarity index 50%
rename from html/changelogs/AutoChangeLog-pr-2278.yml
rename to html/changelogs/AutoChangeLog-pr-2557.yml
index 111ae24812..50126b4a99 100644
--- a/html/changelogs/AutoChangeLog-pr-2278.yml
+++ b/html/changelogs/AutoChangeLog-pr-2557.yml
@@ -1,4 +1,4 @@
author: "CitadelStationBot"
delete-after: True
changes:
- - bugfix: "Fixed hair sticking through headgear."
+ - balance: "Hacked AI module cost is reduced to 9TC"
diff --git a/html/changelogs/AutoChangeLog-pr-2559.yml b/html/changelogs/AutoChangeLog-pr-2559.yml
new file mode 100644
index 0000000000..467f79bd99
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2559.yml
@@ -0,0 +1,4 @@
+author: "ninjanomnom"
+delete-after: True
+changes:
+ - bugfix: "Fixed a problem with shuttles being unrepairable under certain circumstances."
diff --git a/html/changelogs/AutoChangeLog-pr-2568.yml b/html/changelogs/AutoChangeLog-pr-2568.yml
new file mode 100644
index 0000000000..fd6b478a7a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2568.yml
@@ -0,0 +1,4 @@
+author: "Kor"
+delete-after: True
+changes:
+ - balance: "Slime people can consume meat and dairy again."
diff --git a/html/changelogs/AutoChangeLog-pr-2578.yml b/html/changelogs/AutoChangeLog-pr-2578.yml
new file mode 100644
index 0000000000..479ce904f9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2578.yml
@@ -0,0 +1,6 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - bugfix: "Pouring radium into a ninja suit restores adrenaline boosts."
+ - bugfix: "Adrenaline boost works while unconscious again."
+ - bugfix: "Energy nets can be used again!"
diff --git a/html/changelogs/AutoChangeLog-pr-2588.yml b/html/changelogs/AutoChangeLog-pr-2588.yml
new file mode 100644
index 0000000000..3ab78efa1d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2588.yml
@@ -0,0 +1,4 @@
+author: "LetterJay"
+delete-after: True
+changes:
+ - bugfix: "Actually fixes missing guilmon issue and puts it correctly in the list. (I tested it.)"
diff --git a/html/changelogs/AutoChangeLog-pr-2590.yml b/html/changelogs/AutoChangeLog-pr-2590.yml
new file mode 100644
index 0000000000..acada72b29
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2590.yml
@@ -0,0 +1,4 @@
+author: "as334"
+delete-after: True
+changes:
+ - rscadd: "Added a mass spectrometer to the detective's closet"
diff --git a/html/changelogs/AutoChangeLog-pr-2592.yml b/html/changelogs/AutoChangeLog-pr-2592.yml
new file mode 100644
index 0000000000..95feb0302e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2592.yml
@@ -0,0 +1,4 @@
+author: "Jay"
+delete-after: True
+changes:
+ - rscdel: "Removes swarmers from the event table for the time being."
diff --git a/html/changelogs/AutoChangeLog-pr-2623.yml b/html/changelogs/AutoChangeLog-pr-2623.yml
new file mode 100644
index 0000000000..a78e6393ef
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2623.yml
@@ -0,0 +1,4 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - rscadd: "Sofas are now able to be built, they're basically chairs still."
diff --git a/html/changelogs/AutoChangeLog-pr-2625.yml b/html/changelogs/AutoChangeLog-pr-2625.yml
new file mode 100644
index 0000000000..df49005b81
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2625.yml
@@ -0,0 +1,4 @@
+author: "Raeschen"
+delete-after: True
+changes:
+ - tweak: "oldstation.dmm blacklisted"
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 42226c7d2b..3ed8c153d8 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/gorilla.dmi b/icons/mob/gorilla.dmi
new file mode 100644
index 0000000000..77d03fa606
Binary files /dev/null and b/icons/mob/gorilla.dmi differ
diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi
index a06f490fa7..b6d51f17ee 100644
Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ
diff --git a/icons/mob/inhands/64x64_lefthand.dmi b/icons/mob/inhands/64x64_lefthand.dmi
index ba2f54dac3..a9a952733a 100644
Binary files a/icons/mob/inhands/64x64_lefthand.dmi and b/icons/mob/inhands/64x64_lefthand.dmi differ
diff --git a/icons/mob/inhands/64x64_righthand.dmi b/icons/mob/inhands/64x64_righthand.dmi
index 05023605fa..bff96a991b 100644
Binary files a/icons/mob/inhands/64x64_righthand.dmi and b/icons/mob/inhands/64x64_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/instruments_lefthand.dmi b/icons/mob/inhands/equipment/instruments_lefthand.dmi
index 3c168f9d3d..11ae1895d1 100644
Binary files a/icons/mob/inhands/equipment/instruments_lefthand.dmi and b/icons/mob/inhands/equipment/instruments_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/instruments_righthand.dmi b/icons/mob/inhands/equipment/instruments_righthand.dmi
index bb264c1370..fcf891a581 100644
Binary files a/icons/mob/inhands/equipment/instruments_righthand.dmi and b/icons/mob/inhands/equipment/instruments_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/medical_lefthand.dmi b/icons/mob/inhands/equipment/medical_lefthand.dmi
index d55cf81f92..24c79727d0 100644
Binary files a/icons/mob/inhands/equipment/medical_lefthand.dmi and b/icons/mob/inhands/equipment/medical_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/medical_righthand.dmi b/icons/mob/inhands/equipment/medical_righthand.dmi
index 764c5c542a..427e29c49c 100644
Binary files a/icons/mob/inhands/equipment/medical_righthand.dmi and b/icons/mob/inhands/equipment/medical_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/security_lefthand.dmi b/icons/mob/inhands/equipment/security_lefthand.dmi
index a9f3c36ac1..6ccdfba3fc 100644
Binary files a/icons/mob/inhands/equipment/security_lefthand.dmi and b/icons/mob/inhands/equipment/security_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/security_righthand.dmi b/icons/mob/inhands/equipment/security_righthand.dmi
index 201eaa19aa..e3f930a13e 100644
Binary files a/icons/mob/inhands/equipment/security_righthand.dmi and b/icons/mob/inhands/equipment/security_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/tools_lefthand.dmi b/icons/mob/inhands/equipment/tools_lefthand.dmi
index c694968cd1..4f256eea92 100644
Binary files a/icons/mob/inhands/equipment/tools_lefthand.dmi and b/icons/mob/inhands/equipment/tools_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/tools_righthand.dmi b/icons/mob/inhands/equipment/tools_righthand.dmi
index 18de0a1d68..4661d879c8 100644
Binary files a/icons/mob/inhands/equipment/tools_righthand.dmi and b/icons/mob/inhands/equipment/tools_righthand.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 414d12d508..198c2ee663 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 e6c633294e..cef6409ca2 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/inhands/misc/books_lefthand.dmi b/icons/mob/inhands/misc/books_lefthand.dmi
index 180e1999a4..71d06d345a 100644
Binary files a/icons/mob/inhands/misc/books_lefthand.dmi and b/icons/mob/inhands/misc/books_lefthand.dmi differ
diff --git a/icons/mob/inhands/misc/books_righthand.dmi b/icons/mob/inhands/misc/books_righthand.dmi
index ac7ed504d6..906f47bfe9 100644
Binary files a/icons/mob/inhands/misc/books_righthand.dmi and b/icons/mob/inhands/misc/books_righthand.dmi differ
diff --git a/icons/mob/inhands/misc/lavaland_lefthand.dmi b/icons/mob/inhands/misc/lavaland_lefthand.dmi
new file mode 100644
index 0000000000..74654a89a4
Binary files /dev/null and b/icons/mob/inhands/misc/lavaland_lefthand.dmi differ
diff --git a/icons/mob/inhands/misc/lavaland_righthand.dmi b/icons/mob/inhands/misc/lavaland_righthand.dmi
new file mode 100644
index 0000000000..c1b2447e22
Binary files /dev/null and b/icons/mob/inhands/misc/lavaland_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/bombs_lefthand.dmi b/icons/mob/inhands/weapons/bombs_lefthand.dmi
index a084091414..df168f848d 100644
Binary files a/icons/mob/inhands/weapons/bombs_lefthand.dmi and b/icons/mob/inhands/weapons/bombs_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/bombs_righthand.dmi b/icons/mob/inhands/weapons/bombs_righthand.dmi
index 39b50584ce..718441b312 100644
Binary files a/icons/mob/inhands/weapons/bombs_righthand.dmi and b/icons/mob/inhands/weapons/bombs_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi
index 60233a4dc9..de77656a15 100644
Binary files a/icons/mob/inhands/weapons/guns_lefthand.dmi and b/icons/mob/inhands/weapons/guns_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/guns_righthand.dmi b/icons/mob/inhands/weapons/guns_righthand.dmi
index fe15449aba..33f88d0d96 100644
Binary files a/icons/mob/inhands/weapons/guns_righthand.dmi and b/icons/mob/inhands/weapons/guns_righthand.dmi differ
diff --git a/icons/mob/jungle/arachnid.dmi b/icons/mob/jungle/arachnid.dmi
index ccd52eeb7d..23482d00eb 100644
Binary files a/icons/mob/jungle/arachnid.dmi and b/icons/mob/jungle/arachnid.dmi differ
diff --git a/icons/mob/jungle/leaper.dmi b/icons/mob/jungle/leaper.dmi
new file mode 100644
index 0000000000..39f807a191
Binary files /dev/null and b/icons/mob/jungle/leaper.dmi differ
diff --git a/icons/mob/jungle/mook.dmi b/icons/mob/jungle/mook.dmi
new file mode 100644
index 0000000000..c9265b22a0
Binary files /dev/null and b/icons/mob/jungle/mook.dmi differ
diff --git a/icons/mob/jungle/seedling.dmi b/icons/mob/jungle/seedling.dmi
new file mode 100644
index 0000000000..01e91c6c29
Binary files /dev/null and b/icons/mob/jungle/seedling.dmi differ
diff --git a/icons/mob/mam_body_markings.dmi b/icons/mob/mam_body_markings.dmi
index fdb97490c8..ea4ca10627 100644
Binary files a/icons/mob/mam_body_markings.dmi and b/icons/mob/mam_body_markings.dmi differ
diff --git a/icons/mob/mam_bodyparts.dmi b/icons/mob/mam_bodyparts.dmi
index 7de9b40734..8adb82544e 100644
Binary files a/icons/mob/mam_bodyparts.dmi and b/icons/mob/mam_bodyparts.dmi differ
diff --git a/icons/obj/clothing/cloaks.dmi b/icons/obj/clothing/cloaks.dmi
index dd1ae7d727..b61ea963da 100644
Binary files a/icons/obj/clothing/cloaks.dmi and b/icons/obj/clothing/cloaks.dmi differ
diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi
new file mode 100644
index 0000000000..3b812e445a
Binary files /dev/null and b/icons/obj/custom.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index 92ce2efa3e..7667672715 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/sofa.dmi b/icons/obj/sofa.dmi
new file mode 100644
index 0000000000..dafe06a7f1
Binary files /dev/null and b/icons/obj/sofa.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index ee1d186509..a0521414f1 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/sound/creatures/gorilla.ogg b/sound/creatures/gorilla.ogg
new file mode 100644
index 0000000000..cde0bc1edc
Binary files /dev/null and b/sound/creatures/gorilla.ogg differ
diff --git a/sound/music/flytothemoon_otomatone.ogg b/sound/music/flytothemoon_otomatone.ogg
new file mode 100644
index 0000000000..d0267dd12b
Binary files /dev/null and b/sound/music/flytothemoon_otomatone.ogg differ
diff --git a/strings/brain_damage_lines.json b/strings/brain_damage_lines.json
index af040d5ba0..5efd3ac9b2 100644
--- a/strings/brain_damage_lines.json
+++ b/strings/brain_damage_lines.json
@@ -101,6 +101,7 @@
"SINGULO eNGINE 2 DANGER, SOLARS PLS!",
"nerf blob!1",
"iM NOT A FUWRRYY!!!",
+ "DON'T EVER TUCH ME",
"FOURTEEN INCHES SOFT!!!"
],
diff --git a/strings/brain_damage_lines.json.rej b/strings/brain_damage_lines.json.rej
deleted file mode 100644
index 6d8e1cdb62..0000000000
--- a/strings/brain_damage_lines.json.rej
+++ /dev/null
@@ -1,10 +0,0 @@
-diff a/strings/brain_damage_lines.json b/strings/brain_damage_lines.json (rejected hunks)
-@@ -131,7 +131,7 @@
- "",
- "IS TIS A BUG??",
- "SI IST A BUGG/",
-- "BUG!!!"
-+ "BUG!!!"
- ],
-
- "semicolon": [
diff --git a/strings/greek_letters.txt b/strings/greek_letters.txt
new file mode 100644
index 0000000000..b1014aa178
--- /dev/null
+++ b/strings/greek_letters.txt
@@ -0,0 +1,24 @@
+Alpha
+Beta
+Gamma
+Delta
+Epsilon
+Zeta
+Eta
+Theta
+Iota
+Kappa
+Lambda
+Mu
+Nu
+Xi
+Omicron
+Pi
+Rho
+Sigma
+Tau
+Upsilon
+Phi
+Chi
+Psi
+Omega
\ No newline at end of file
diff --git a/strings/numbers_as_words.txt b/strings/numbers_as_words.txt
new file mode 100644
index 0000000000..f7c620cd9b
--- /dev/null
+++ b/strings/numbers_as_words.txt
@@ -0,0 +1,20 @@
+One
+Two
+Three
+Four
+Five
+Six
+Seven
+Eight
+Nine
+Ten
+Eleven
+Twelve
+Thirteen
+Fourteen
+Fifteen
+Sixteen
+Seventeen
+Eighteen
+Nineteen
+Twenty
\ No newline at end of file
diff --git a/strings/phonetic_alphabet.txt b/strings/phonetic_alphabet.txt
new file mode 100644
index 0000000000..d77c1164ca
--- /dev/null
+++ b/strings/phonetic_alphabet.txt
@@ -0,0 +1,26 @@
+Alpha
+Bravo
+Charlie
+Delta
+Echo
+Foxtrot
+Golf
+Hotel
+India
+Juliet
+Kilo
+Lima
+Mike
+November
+Oscar
+Papa
+Quebec
+Romeo
+Sierra
+Tango
+Uniform
+Victor
+Whiskey
+X-ray
+Yankee
+Zulu
\ No newline at end of file
diff --git a/strings/round_start_sounds.txt b/strings/round_start_sounds.txt
index 620c4af537..01323a6120 100644
--- a/strings/round_start_sounds.txt
+++ b/strings/round_start_sounds.txt
@@ -18,4 +18,5 @@ sound/music/torvus.ogg
sound/music/shootingstars.ogg
sound/music/oceanman.ogg
sound/music/indeep.ogg
-sound/music/goodbyemoonmen.ogg
\ No newline at end of file
+sound/music/goodbyemoonmen.ogg
+sound/music/flytothemoon_otomatone.ogg
diff --git a/strings/station_names.txt b/strings/station_names.txt
new file mode 100644
index 0000000000..0937a10da6
--- /dev/null
+++ b/strings/station_names.txt
@@ -0,0 +1,82 @@
+Stanford
+Dorf
+Alium
+Prefix
+Clowning
+Aegis
+Ishimura
+Scaredy
+Death-World
+Mime
+Honk
+Rogue
+MacRagge
+Ultrameens
+Safety
+Paranoia
+Explosive
+Neckbear
+Donk
+Muppet
+North
+West
+East
+South
+Slant-ways
+Widdershins
+Rimward
+Expensive
+Procreatory
+Imperial
+Unidentified
+Immoral
+Carp
+Ork
+Pete
+Control
+Nettle
+Aspie
+Class
+Crab
+Fist
+Corrogated
+Skeleton
+Race
+Fatguy
+Gentleman
+Capitalist
+Communist
+Bear
+Beard
+Space
+Spess
+Star
+Moon
+System
+Mining
+Neckbeard
+Research
+Supply
+Military
+Orbital
+Battle
+Science
+Asteroid
+Home
+Production
+Transport
+Delivery
+Extraplanetary
+Orbital
+Correctional
+Robot
+Hats
+Pizza
+Taco
+Burger
+Box
+Meta
+Pub
+Ship
+Book
+Refactor
\ No newline at end of file
diff --git a/strings/station_prefixes.txt b/strings/station_prefixes.txt
new file mode 100644
index 0000000000..576e68dc1e
--- /dev/null
+++ b/strings/station_prefixes.txt
@@ -0,0 +1,41 @@
+Imperium
+Heretical
+Cuban
+Psychic
+Elegant
+Common
+Uncommon
+Rare
+Unique
+Houseruled
+Religious
+Atheist
+Traditional
+Houseruled
+Mad
+Super
+Ultra
+Secret
+Top Secret
+Deep
+Death
+Zybourne
+Central
+Main
+Government
+Uoi
+Fat
+Automated
+Experimental
+Augmented
+American
+Funky
+Thin
+Legendary
+Szechuan
+White
+Black
+Grey
+Grim
+Electric
+Burning
\ No newline at end of file
diff --git a/strings/station_suffixes.txt b/strings/station_suffixes.txt
new file mode 100644
index 0000000000..c30e18c245
--- /dev/null
+++ b/strings/station_suffixes.txt
@@ -0,0 +1,64 @@
+Station
+Frontier
+Suffix
+Death-trap
+Space-hulk
+Lab
+Hazard
+Spess Junk
+Fishery
+No-Moon
+Tomb
+Crypt
+Hut
+Monkey
+Bomb
+Trade Post
+Fortress
+Village
+Town
+City
+Edition
+Hive
+Complex
+Base
+Facility
+Depot
+Outpost
+Installation
+Drydock
+Observatory
+Array
+Relay
+Monitor
+Platform
+Construct
+Hangar
+Prison
+Center
+Port
+Waystation
+Factory
+Waypoint
+Stopover
+Hub
+HQ
+Office
+Object
+Fortification
+Colony
+Planet-Cracker
+Roost
+Fat Camp
+Airstrip
+Harbor
+Garden
+Continent
+Environment
+Course
+Country
+Province
+Workspace
+Metro
+Warehouse
+Space Junk
\ No newline at end of file
diff --git a/tgstation.dme b/tgstation.dme
old mode 100644
new mode 100755
index 3b58a075e4..4206f25117
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -21,6 +21,7 @@
#include "code\__DATASTRUCTURES\linked_lists.dm"
#include "code\__DATASTRUCTURES\priority_queue.dm"
#include "code\__DATASTRUCTURES\stacks.dm"
+#include "code\__DEFINES\_tick.dm"
#include "code\__DEFINES\access.dm"
#include "code\__DEFINES\admin.dm"
#include "code\__DEFINES\antagonists.dm"
@@ -71,7 +72,6 @@
#include "code\__DEFINES\status_effects.dm"
#include "code\__DEFINES\subsystems.dm"
#include "code\__DEFINES\tgui.dm"
-#include "code\__DEFINES\tick.dm"
#include "code\__DEFINES\time.dm"
#include "code\__DEFINES\typeids.dm"
#include "code\__DEFINES\voreconstants.dm"
@@ -173,6 +173,9 @@
#include "code\citadel\cit_uniforms.dm"
#include "code\citadel\cit_vendors.dm"
#include "code\citadel\dogborgstuff.dm"
+#include "code\citadel\custom_loadout\custom_items.dm"
+#include "code\citadel\custom_loadout\load_to_mob.dm"
+#include "code\citadel\custom_loadout\read_from_file.dm"
#include "code\citadel\organs\breasts.dm"
#include "code\citadel\organs\eggsack.dm"
#include "code\citadel\organs\genitals.dm"
@@ -269,6 +272,7 @@
#include "code\datums\ruins.dm"
#include "code\datums\shuttles.dm"
#include "code\datums\soullink.dm"
+#include "code\datums\spawners_menu.dm"
#include "code\datums\verbs.dm"
#include "code\datums\antagonists\antag_datum.dm"
#include "code\datums\antagonists\datum_clockcult.dm"
@@ -979,6 +983,7 @@
#include "code\game\objects\structures\beds_chairs\alien_nest.dm"
#include "code\game\objects\structures\beds_chairs\bed.dm"
#include "code\game\objects\structures\beds_chairs\chair.dm"
+#include "code\game\objects\structures\beds_chairs\sofa.dm"
#include "code\game\objects\structures\crates_lockers\closets.dm"
#include "code\game\objects\structures\crates_lockers\crates.dm"
#include "code\game\objects\structures\crates_lockers\closets\bodybag.dm"
@@ -1458,6 +1463,7 @@
#include "code\modules\hydroponics\grown\tomato.dm"
#include "code\modules\hydroponics\grown\towercap.dm"
#include "code\modules\jobs\access.dm"
+#include "code\modules\jobs\job_exp.dm"
#include "code\modules\jobs\jobs.dm"
#include "code\modules\jobs\job_types\assistant.dm"
#include "code\modules\jobs\job_types\captain.dm"
@@ -1784,7 +1790,6 @@
#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm"
#include "code\modules\mob\living\simple_animal\hostile\hostile.dm"
#include "code\modules\mob\living\simple_animal\hostile\illusion.dm"
-#include "code\modules\mob\living\simple_animal\hostile\jungle_mobs.dm"
#include "code\modules\mob\living\simple_animal\hostile\killertomato.dm"
#include "code\modules\mob\living\simple_animal\hostile\mecha_pilot.dm"
#include "code\modules\mob\living\simple_animal\hostile\mimic.dm"
@@ -1802,6 +1807,14 @@
#include "code\modules\mob\living\simple_animal\hostile\wumborian_fugu.dm"
#include "code\modules\mob\living\simple_animal\hostile\bosses\boss.dm"
#include "code\modules\mob\living\simple_animal\hostile\bosses\paperwizard.dm"
+#include "code\modules\mob\living\simple_animal\hostile\gorilla\emotes.dm"
+#include "code\modules\mob\living\simple_animal\hostile\gorilla\gorilla.dm"
+#include "code\modules\mob\living\simple_animal\hostile\gorilla\visuals_icons.dm"
+#include "code\modules\mob\living\simple_animal\hostile\jungle\_jungle_mobs.dm"
+#include "code\modules\mob\living\simple_animal\hostile\jungle\leaper.dm"
+#include "code\modules\mob\living\simple_animal\hostile\jungle\mega_arachnid.dm"
+#include "code\modules\mob\living\simple_animal\hostile\jungle\mook.dm"
+#include "code\modules\mob\living\simple_animal\hostile\jungle\seedling.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm"
@@ -1888,7 +1901,6 @@
#include "code\modules\ninja\suit\suit_attackby.dm"
#include "code\modules\ninja\suit\suit_initialisation.dm"
#include "code\modules\ninja\suit\suit_process.dm"
-#include "code\modules\ninja\suit\suit_verbs_handlers.dm"
#include "code\modules\ninja\suit\n_suit_verbs\energy_net_nets.dm"
#include "code\modules\ninja\suit\n_suit_verbs\ninja_adrenaline.dm"
#include "code\modules\ninja\suit\n_suit_verbs\ninja_cost_check.dm"
@@ -2147,6 +2159,7 @@
#include "code\modules\spells\spell_types\rightandwrong.dm"
#include "code\modules\spells\spell_types\rod_form.dm"
#include "code\modules\spells\spell_types\santa.dm"
+#include "code\modules\spells\spell_types\shadow_walk.dm"
#include "code\modules\spells\spell_types\shapeshift.dm"
#include "code\modules\spells\spell_types\spacetime_distortion.dm"
#include "code\modules\spells\spell_types\summonitem.dm"
diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css
index ffe61666b9..e0cc437429 100644
--- a/tgui/assets/tgui.css
+++ b/tgui/assets/tgui.css
@@ -1 +1 @@
-@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffb18b25",endColorstr="#ff5f380e",GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button.gridable.center{text-align:center;width:75px}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display.tabular{padding:0;margin:0}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input.number{width:35px}body.clockwork input::-webkit-input-placeholder{color:#999}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .cell,body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork section .cell:not(:first-child){text-align:center;padding-top:0}body.clockwork section .cell span.button{width:75px}body.clockwork section:not(:last-child){padding-right:4px}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button.gridable.center{text-align:center;width:75px}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display.tabular{padding:0;margin:0}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input.number{width:35px}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen section .cell:not(:first-child){text-align:center;padding-top:0}body.nanotrasen section .cell span.button{width:75px}body.nanotrasen section:not(:last-child){padding-right:4px}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff750000",endColorstr="#ff340404",GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button.gridable.center{text-align:center;width:75px}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display.tabular{padding:0;margin:0}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input.number{width:35px}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate section .cell:not(:first-child){text-align:center;padding-top:0}body.syndicate section .cell span.button{width:75px}body.syndicate section:not(:last-child){padding-right:4px}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"}
\ No newline at end of file
+@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffb18b25",endColorstr="#ff5f380e",GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button.gridable.center{text-align:center;width:75px}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display.tabular{padding:0;margin:0}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input.number{width:35px}body.clockwork input::-webkit-input-placeholder{color:#999}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .cell,body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork section .cell:not(:first-child){text-align:center;padding-top:0}body.clockwork section .cell span.button{width:75px}body.clockwork section:not(:last-child){padding-right:4px}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCA0MjUgMjAwIiBvcGFjaXR5PSIuMzMiPgogIDxwYXRoIGQ9Im0gMTc4LjAwMzk5LDAuMDM4NjkgLTcxLjIwMzkzLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM0LDYuMDI1NTUgbCAwLDE4Ny44NzE0NyBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgNi43NjEzNCw2LjAyNTU0IGwgNTMuMTA3MiwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTAxLjU0NDAxOCA3Mi4yMTYyOCwxMDQuNjk5Mzk4IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA1Ljc2MDE1LDIuODcwMTYgbCA3My41NTQ4NywwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzNSwtNi4wMjU1NSBsIC01NC43MTY0NCwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzMyw2LjAyNTU1IGwgMCwxMDIuNjE5MzUgTCAxODMuNzY0MTMsMi45MDg4NiBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTUuNzYwMTQsLTIuODcwMTcgeiIgLz4KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPgogIDxwYXRoIGQ9Im0gNDIwLjE1NTM1LDE3Ny44OTExOSBhIDEzLjQxMjAzOCwxMi41MDE4NDIgMCAwIDEgLTguNjMyOTUsMjIuMDY5NTEgbCAtNjYuMTE4MzIsMCBhIDUuMzY0ODE1Miw1LjAwMDczNyAwIDAgMSAtNS4zNjQ4MiwtNS4wMDA3NCBsIDAsLTc5Ljg3OTMxIHoiIC8+Cjwvc3ZnPgo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4KPCEtLSBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvIC0tPgo=") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button.gridable.center{text-align:center;width:75px}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display.tabular{padding:0;margin:0}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input.number{width:35px}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen section .cell:not(:first-child){text-align:center;padding-top:0}body.nanotrasen section .cell span.button{width:75px}body.nanotrasen section:not(:last-child){padding-right:4px}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCAyMDAgMjg5Ljc0MiIgb3BhY2l0eT0iLjMzIj4KICA8cGF0aCBkPSJtIDkzLjUzNzY3NywwIGMgLTE4LjExMzEyNSwwIC0zNC4yMjAxMzMsMy4xMTE2NCAtNDguMzIzNDg0LDkuMzM0MzcgLTEzLjk2NTA5Miw2LjIyMTY3IC0yNC42MTI0NDIsMTUuMDcxMTQgLTMxLjk0MDY1MSwyNi41NDcxIC03LjE4OTkzOTgsMTEuMzM3ODkgLTEwLjMwMTIyNjYsMjQuNzQ5MTEgLTEwLjMwMTIyNjYsNDAuMjM0NzggMCwxMC42NDY2MiAyLjcyNTAwMjYsMjAuNDY0NjUgOC4xNzUxMTE2LDI5LjQ1MjU4IDUuNjE1Mjc3LDguOTg2ODYgMTQuMDM4Mjc3LDE3LjM1MjA0IDI1LjI2ODgyMSwyNS4wOTQzNiAxMS4yMzA1NDQsNy42MDUzMSAyNi41MDc0MjEsMTUuNDE4MzUgNDUuODMwNTE0LDIzLjQzNzgyIDE5Ljk4Mzc0OCw4LjI5NTU3IDM0Ljg0ODg0OCwxNS41NTQ3MSA0NC41OTI5OTgsMjEuNzc2MzggOS43NDQxNCw2LjIyMjczIDE2Ljc2MTcsMTIuODU4NSAyMS4wNTU3MiwxOS45MDk1MSA0LjI5NDA0LDcuMDUyMDggNi40NDE5MywxNS43NjQwOCA2LjQ0MTkzLDI2LjEzNDU5IDAsMTYuMTc3MDIgLTUuMjAxOTYsMjguNDgyMjIgLTE1LjYwNjczLDM2LjkxNjgyIC0xMC4yMzk2LDguNDM0NyAtMjUuMDIyMDMsMTIuNjUyMyAtNDQuMzQ1MTY5LDEyLjY1MjMgLTE0LjAzODE3MSwwIC0yNS41MTUyNDcsLTEuNjU5NCAtMzQuNDMzNjE4LC00Ljk3NzcgLTguOTE4MzcsLTMuNDU2NiAtMTYuMTg1NTcyLC04LjcxMTMgLTIxLjgwMDgzOSwtMTUuNzYzMyAtNS42MTUyNzcsLTcuMDUyMSAtMTAuMDc0Nzk1LC0xNi42NjA4OCAtMTMuMzc3ODk5LC0yOC44MjgxMiBsIC0yNC43NzMxNjI2MjkzOTQ1LDAgMCw1Ni44MjYzMiBDIDMzLjg1Njc2OSwyODYuMDc2MDEgNjMuNzQ5MDQsMjg5Ljc0MjAxIDg5LjY3ODM4MywyODkuNzQyMDEgYyAxNi4wMjAwMjcsMCAzMC43MTk3ODcsLTEuMzgyNyA0NC4wOTczMzcsLTQuMTQ3OSAxMy41NDI3MiwtMi45MDQzIDI1LjEwNDEsLTcuNDY3NiAzNC42ODMwOSwtMTMuNjg5MyA5Ljc0NDEzLC02LjM1OTcgMTcuMzQwNDIsLTE0LjUxOTUgMjIuNzkwNTIsLTI0LjQ3NDggNS40NTAxLC0xMC4wOTMzMiA4LjE3NTExLC0yMi4zOTk1OSA4LjE3NTExLC0zNi45MTY4MiAwLC0xMi45OTc2NCAtMy4zMDIxLC0yNC4zMzUzOSAtOS45MDgyOSwtMzQuMDE0NiAtNi40NDEwNSwtOS44MTcyNSAtMTUuNTI1NDUsLTE4LjUyNzA3IC0yNy4yNTE0NiwtMjYuMTMxMzMgLTExLjU2MDg1LC03LjYwNDI3IC0yNy45MTA4MywtMTUuODMxNDIgLTQ5LjA1MDY2LC0yNC42ODAyMiAtMTcuNTA2NDQsLTcuMTkwMTIgLTMwLjcxOTY2OCwtMTMuNjg5NDggLTM5LjYzODAzOCwtMTkuNDk3MDEgLTguOTE4MzcxLC01LjgwNzUyIC0xOC42MDc0NzQsLTEyLjQzNDA5IC0yNC4wOTY1MjQsLTE4Ljg3NDE3IC01LjQyNjA0MywtNi4zNjYxNiAtOS42NTg4MjYsLTE1LjA3MDAzIC05LjY1ODgyNiwtMjQuODg3MjkgMCwtOS4yNjQwMSAyLjA3NTQxNCwtMTcuMjEzNDUgNi4yMjM0NTQsLTIzLjg1MDMzIDExLjA5ODI5OCwtMTQuMzk3NDggNDEuMjg2NjM4LC0xLjc5NTA3IDQ1LjA3NTYwOSwyNC4zNDc2MiA0LjgzOTM5Miw2Ljc3NDkxIDguODQ5MzUsMTYuMjQ3MjkgMTIuMDI5NTE1LDI4LjQxNTYgbCAyMC41MzIzNCwwIDAsLTU1Ljk5OTY3IGMgLTQuNDc4MjUsLTUuOTI0NDggLTkuOTU0ODgsLTEwLjYzMjIyIC0xNS45MDgzNywtMTQuMzc0MTEgMS42NDA1NSwwLjQ3OTA1IDMuMTkwMzksMS4wMjM3NiA0LjYzODY1LDEuNjQwMjQgNi40OTg2MSwyLjYyNjA3IDEyLjE2NzkzLDcuMzI3NDcgMTcuMDA3MywxNC4xMDM0NSA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNSwxNi4yNDU2NyAxMi4wMjk1MiwyOC40MTM5NyAwLDAgOC40ODEyOCwtMC4xMjg5NCA4LjQ4OTc4LC0wLjAwMiAwLjQxNzc2LDYuNDE0OTQgLTEuNzUzMzksOS40NTI4NiAtNC4xMjM0MiwxMi41NjEwNCAtMi40MTc0LDMuMTY5NzggLTUuMTQ0ODYsNi43ODk3MyAtNC4wMDI3OCwxMy4wMDI5IDEuNTA3ODYsOC4yMDMxOCAxMC4xODM1NCwxMC41OTY0MiAxNC42MjE5NCw5LjMxMTU0IC0zLjMxODQyLC0wLjQ5OTExIC01LjMxODU1LC0xLjc0OTQ4IC01LjMxODU1LC0xLjc0OTQ4IDAsMCAxLjg3NjQ2LDAuOTk4NjggNS42NTExNywtMS4zNTk4MSAtMy4yNzY5NSwwLjk1NTcxIC0xMC43MDUyOSwtMC43OTczOCAtMTEuODAxMjUsLTYuNzYzMTMgLTAuOTU3NTIsLTUuMjA4NjEgMC45NDY1NCwtNy4yOTUxNCAzLjQwMTEzLC0xMC41MTQ4MiAyLjQ1NDYyLC0zLjIxOTY4IDUuMjg0MjYsLTYuOTU4MzEgNC42ODQzLC0xNC40ODgyNCBsIDAuMDAzLDAuMDAyIDguOTI2NzYsMCAwLC01NS45OTk2NyBjIC0xNS4wNzEyNSwtMy44NzE2OCAtMjcuNjUzMTQsLTYuMzYwNDIgLTM3Ljc0NjcxLC03LjQ2NTg2IC05Ljk1NTMxLC0xLjEwNzU1IC0yMC4xODgyMywtMS42NTk4MSAtMzAuNjk2NjEzLC0xLjY1OTgxIHogbSA3MC4zMjE2MDMsMTcuMzA4OTMgMC4yMzgwNSw0MC4zMDQ5IGMgMS4zMTgwOCwxLjIyNjY2IDIuNDM5NjUsMi4yNzgxNSAzLjM0MDgxLDMuMTA2MDIgNC44MzkzOSw2Ljc3NDkxIDguODQ5MzQsMTYuMjQ1NjYgMTIuMDI5NTEsMjguNDEzOTcgbCAyMC41MzIzNCwwIDAsLTU1Ljk5OTY3IGMgLTYuNjc3MzEsLTQuNTkzODEgLTE5LjgzNjQzLC0xMC40NzMwOSAtMzYuMTQwNzEsLTE1LjgyNTIyIHogbSAtMjguMTIwNDksNS42MDU1MSA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM3LC02LjQ2Njk3IC0xMy44NDY3OCwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NzA1LDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiBtIDE1LjIyMTk1LDI0LjAwODQ4IDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzgsLTYuNDY2OTcgLTEzLjg0Njc5LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDQsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gLTk5LjExMzg0LDIuMjA3NjQgOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzODIsLTYuNDY2OTcgLTEzLjg0Njc4MiwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NTQyLDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiIgLz4KPC9zdmc+CjwhLS0gVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIC0tPgo8IS0tIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8gLS0+Cg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff750000",endColorstr="#ff340404",GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button.gridable.center{text-align:center;width:75px}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display.tabular{padding:0;margin:0}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input.number{width:35px}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate section .cell:not(:first-child){text-align:center;padding-top:0}body.syndicate section .cell span.button{width:75px}body.syndicate section:not(:last-child){padding-right:4px}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"}
\ No newline at end of file
diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js
index 89a66ecaf0..5d42acb654 100644
--- a/tgui/assets/tgui.js
+++ b/tgui/assets/tgui.js
@@ -1,16 +1,16 @@
-require=function t(e,n,a){function r(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(i)return i(o,!0);var p=Error("Cannot find module '"+o+"'");throw p.code="MODULE_NOT_FOUND",p}var c=n[o]={exports:{}};e[o][0].call(c.exports,function(t){var n=e[o][1][t];return r(n?n:t)},c,c.exports,t,e,n,a)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o2?p[2]:void 0,l=Math.min((void 0===c?o:r(c,o))-u,o-s),f=1;for(s>u&&u+l>s&&(f=-1,u+=l-1,s+=l-1);l-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{76:76,79:79,80:80}],6:[function(t,e,n){"use strict";var a=t(80),r=t(76),i=t(79);e.exports=[].fill||function(t){for(var e=a(this),n=i(e.length),o=arguments,s=o.length,u=r(s>1?o[1]:void 0,n),p=s>2?o[2]:void 0,c=void 0===p?n:r(p,n);c>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var a=t(78),r=t(79),i=t(76);e.exports=function(t){return function(e,n,o){var s,u=a(e),p=r(u.length),c=i(o,p);if(t&&n!=n){for(;p>c;)if(s=u[c++],s!=s)return!0}else for(;p>c;c++)if((t||c in u)&&u[c]===n)return t||c;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var a=t(17),r=t(34),i=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,p=4==t,c=6==t,l=5==t||c;return function(f,d,h){for(var m,v,g=i(f),b=r(g),y=a(d,h,3),x=o(b.length),_=0,w=e?s(f,x):n?s(f,0):void 0;x>_;_++)if((l||_ in b)&&(m=b[_],v=y(m,_,g),t))if(e)w[_]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return _;case 2:w.push(m)}else if(p)return!1;return c?-1:u||p?p:w}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var a=t(38),r=t(36),i=t(83)("species");e.exports=function(t,e){var n;return r(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!r(n.prototype)||(n=void 0),a(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var a=t(11),r=t(83)("toStringTag"),i="Arguments"==a(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[r])?n:i?a(e):"Object"==(o=a(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var a=t(46),r=t(31),i=t(60),o=t(17),s=t(69),u=t(18),p=t(27),c=t(42),l=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),g=Object.isExtensible||h,b=v?"_s":"size",y=0,x=function(t,e){if(!h(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!d(t,f)){if(!g(t))return"F";if(!e)return"E";r(t,f,++y)}return"O"+t[f]},_=function(t,e){var n,a=x(e);if("F"!==a)return t._i[a];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,r){var c=t(function(t,i){s(t,c,e),t._i=a.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=i&&p(i,n,t[r],t)});return i(c.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[b]=0},"delete":function(t){var e=this,n=_(e,t);if(n){var a=n.n,r=n.p;delete e._i[n.i],n.r=!0,r&&(r.n=a),a&&(a.p=r),e._f==n&&(e._f=a),e._l==n&&(e._l=r),e[b]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!_(this,t)}}),v&&a.setDesc(c.prototype,"size",{get:function(){return u(this[b])}}),c},def:function(t,e,n){var a,r,i=_(t,e);return i?i.v=n:(t._l=i={i:r=x(e,!0),k:e,v:n,p:a=t._l,n:void 0,r:!1},t._f||(t._f=i),a&&(a.n=i),t[b]++,"F"!==r&&(t._i[r]=i)),t},getEntry:_,setStrong:function(t,e,n){c(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?l(0,n.k):"values"==e?l(0,n.v):l(0,[n.k,n.v]):(t._t=void 0,l(1))},n?"entries":"values",!n,!0),m(e)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,e,n){var a=t(27),r=t(10);e.exports=function(t){return function(){if(r(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return a(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var a=t(31),r=t(60),i=t(4),o=t(38),s=t(69),u=t(27),p=t(8),c=t(30),l=t(82)("weak"),f=Object.isExtensible||o,d=p(5),h=p(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},b=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=b(this,t);return e?e[1]:void 0},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,a){var i=t(function(t,r){s(t,i,e),t._i=m++,t._l=void 0,void 0!=r&&u(r,n,t[a],t)});return r(i.prototype,{"delete":function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(c(e,l)||a(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,e,n){"use strict";var a=t(29),r=t(22),i=t(61),o=t(60),s=t(27),u=t(69),p=t(38),c=t(24),l=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=a[t],g=v,b=h?"set":"add",y=g&&g.prototype,x={},_=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!p(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||y.forEach&&!c(function(){(new g).entries().next()}))){var w,k=new g,E=k[b](m?{}:-0,1)!=k,S=c(function(){k.has(1)}),C=l(function(t){new g(t)});C||(g=e(function(e,n){u(e,g,t);var a=new v;return void 0!=n&&s(n,h,a[b],a),a}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){w=1/e===-(1/0)}),(S||w)&&(_("delete"),_("has"),h&&_("get")),(w||E)&&_(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),x[t]=g,r(r.G+r.W+r.F*(g!=v),x),m||d.setStrong(g,t,h),g}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,e,n){var a=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=a)},{}],17:[function(t,e,n){var a=t(2);e.exports=function(t,e,n){if(a(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,a){return t.call(e,n,a)};case 3:return function(n,a,r){return t.call(e,n,a,r)}}return function(){return t.apply(e,arguments)}}},{2:2}],18:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],19:[function(t,e,n){e.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,e,n){var a=t(38),r=t(29).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var a=t(46);e.exports=function(t){var e=a.getKeys(t),n=a.getSymbols;if(n)for(var r,i=n(t),o=a.isEnum,s=0;i.length>s;)o.call(t,r=i[s++])&&e.push(r);return e}},{46:46}],22:[function(t,e,n){var a=t(29),r=t(16),i=t(31),o=t(61),s=t(17),u="prototype",p=function(t,e,n){var c,l,f,d,h=t&p.F,m=t&p.G,v=t&p.S,g=t&p.P,b=t&p.B,y=m?a:v?a[e]||(a[e]={}):(a[e]||{})[u],x=m?r:r[e]||(r[e]={}),_=x[u]||(x[u]={});m&&(n=e);for(c in n)l=!h&&y&&c in y,f=(l?y:n)[c],d=b&&l?s(f,a):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,c,f),x[c]!=f&&i(x,c,d),g&&_[c]!=f&&(_[c]=f)};a.core=r,p.F=1,p.G=2,p.S=4,p.P=8,p.B=16,p.W=32,e.exports=p},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var a=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}return!0}},{83:83}],24:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],25:[function(t,e,n){"use strict";var a=t(31),r=t(61),i=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),p=""[t];i(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(r(String.prototype,t,n(o,u,p)),a(RegExp.prototype,u,2==e?function(t,e){return p.call(t,this,e)}:function(t){return p.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var a=t(4);e.exports=function(){var t=a(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{4:4}],27:[function(t,e,n){var a=t(17),r=t(40),i=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,p){var c,l,f,d=u(t),h=a(n,p,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(c=s(t.length);c>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)r(f,h,l.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var a=t(78),r=t(46).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return r(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):r(a(t))}},{46:46,78:78}],29:[function(t,e,n){var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},{}],30:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],31:[function(t,e,n){var a=t(46),r=t(59);e.exports=t(19)?function(t,e,n){return a.setDesc(t,e,r(1,n))}:function(t,e,n){return t[e]=n,t}},{19:19,46:46,59:59}],32:[function(t,e,n){e.exports=t(29).document&&document.documentElement},{29:29}],33:[function(t,e,n){e.exports=function(t,e,n){var a=void 0===n;switch(e.length){case 0:return a?t():t.call(n);case 1:return a?t(e[0]):t.call(n,e[0]);case 2:return a?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return a?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return a?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],34:[function(t,e,n){var a=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var a=t(45),r=t(83)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{45:45,83:83}],36:[function(t,e,n){var a=t(11);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{11:11}],37:[function(t,e,n){var a=t(38),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(t)===t}},{38:38}],38:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,e,n){var a=t(38),r=t(11),i=t(83)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var a=t(4);e.exports=function(t,e,n,r){try{return r?e(a(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&a(o.call(t)),i}}},{4:4}],41:[function(t,e,n){"use strict";var a=t(46),r=t(59),i=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a.create(o,{next:r(1,n)}),i(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var a=t(48),r=t(22),i=t(61),o=t(31),s=t(30),u=t(45),p=t(41),c=t(66),l=t(46).getProto,f=t(83)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,b,y,x,_){p(n,e,b);var w,k,E=function(t){if(!d&&t in A)return A[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},S=e+" Iterator",C=y==v,P=!1,A=t.prototype,O=A[f]||A[h]||y&&A[y],T=O||E(y);if(O){var M=l(T.call(new t));c(M,S,!0),!a&&s(A,h)&&o(M,f,g),C&&O.name!==v&&(P=!0,T=function(){return O.call(this)})}if(a&&!_||!d&&!P&&A[f]||o(A,f,T),u[e]=T,u[S]=g,y)if(w={values:C?T:E(v),keys:x?T:E(m),entries:C?E("entries"):T},_)for(k in w)k in A||i(A,k,w[k]);else r(r.P+r.F*(d||P),e,w);return w}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,e,n){var a=t(83)("iterator"),r=!1;try{var i=[7][a]();i["return"]=function(){r=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!r)return!1;var n=!1;try{var i=[7],o=i[a]();o.next=function(){return{done:n=!0}},i[a]=function(){return o},t(i)}catch(s){}return n}},{83:83}],44:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],45:[function(t,e,n){e.exports={}},{}],46:[function(t,e,n){var a=Object;e.exports={create:a.create,getProto:a.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:a.getOwnPropertyDescriptor,setDesc:a.defineProperty,setDescs:a.defineProperties,getKeys:a.keys,getNames:a.getOwnPropertyNames,getSymbols:a.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var a=t(46),r=t(78);e.exports=function(t,e){for(var n,i=r(t),o=a.getKeys(i),s=o.length,u=0;s>u;)if(i[n=o[u++]]===e)return n}},{46:46,78:78}],48:[function(t,e,n){e.exports=!1},{}],49:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],50:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],51:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,e,n){var a,r,i,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,p=o.process,c=o.Promise,l="process"==t(11)(p),f=function(){var t,e,n;for(l&&(t=p.domain)&&(p.domain=null,t.exit());a;)e=a.domain,n=a.fn,e&&e.enter(),n(),e&&e.exit(),a=a.next;r=void 0,t&&t.enter()};if(l)i=function(){p.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=c&&c.resolve?function(){c.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&p.domain};r&&(r.next=e),a||(a=e,i()),r=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var a=t(46),r=t(80),i=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},a=Symbol(),r="abcdefghijklmnopqrst";return e[a]=7,r.split("").forEach(function(t){n[t]=t}),7!=t({},e)[a]||Object.keys(t({},n)).join("")!=r})?function(t,e){for(var n=r(t),o=arguments,s=o.length,u=1,p=a.getKeys,c=a.getSymbols,l=a.isEnum;s>u;)for(var f,d=i(o[u++]),h=c?p(d).concat(c(d)):p(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{24:24,34:34,46:46,80:80}],54:[function(t,e,n){var a=t(22),r=t(16),i=t(24);e.exports=function(t,e){var n=(r.Object||{})[t]||Object[t],o={};o[t]=e(n),a(a.S+a.F*i(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var a=t(46),r=t(78),i=a.isEnum;e.exports=function(t){return function(e){for(var n,o=r(e),s=a.getKeys(o),u=s.length,p=0,c=[];u>p;)i.call(o,n=s[p++])&&c.push(t?[n,o[n]]:o[n]);return c}}},{46:46,78:78}],56:[function(t,e,n){var a=t(46),r=t(4),i=t(29).Reflect;e.exports=i&&i.ownKeys||function(t){var e=a.getNames(r(t)),n=a.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var a=t(58),r=t(33),i=t(2);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=a._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var a,i=this,o=arguments,p=o.length,c=0,l=0;if(!u&&!p)return r(t,n,i);if(a=n.slice(),u)for(;e>c;c++)a[c]===s&&(a[c]=o[l++]);for(;p>l;)a.push(o[l++]);return r(t,a,i)}}},{2:2,33:33,58:58}],58:[function(t,e,n){e.exports=t(29)},{29:29}],59:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],60:[function(t,e,n){var a=t(61);e.exports=function(t,e){for(var n in e)a(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var a=t(29),r=t(31),i=t(82)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(16).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(i)||r(n,i,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||r(n,"name",e)),t===a?t[e]=n:(o||delete t[e],r(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||s.call(this)})},{16:16,29:29,31:31,82:82}],62:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],63:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],64:[function(t,e,n){var a=t(46).getDesc,r=t(38),i=t(4),o=function(t,e){if(i(t),!r(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,r){try{r=t(17)(Function.call,a(Object.prototype,"__proto__").set,2),r(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var a=t(29),r=t(46),i=t(19),o=t(83)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var a=t(46).setDesc,r=t(30),i=t(83)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var a=t(29),r="__core-js_shared__",i=a[r]||(a[r]={});e.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,e,n){var a=t(4),r=t(2),i=t(83)("species");e.exports=function(t,e){var n,o=a(t).constructor;return void 0===o||void 0==(n=a(o)[i])?e:r(n)}},{2:2,4:4,83:83}],69:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],70:[function(t,e,n){var a=t(77),r=t(18);e.exports=function(t){return function(e,n){var i,o,s=r(e)+"",u=a(n),p=s.length;return 0>u||u>=p?t?"":void 0:(i=s.charCodeAt(u),55296>i||i>56319||u+1===p||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):i:t?s.slice(u,u+2):(i-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var a=t(39),r=t(18);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{18:18,39:39}],72:[function(t,e,n){var a=t(79),r=t(73),i=t(18);e.exports=function(t,e,n,o){var s=i(t)+"",u=s.length,p=void 0===n?" ":n+"",c=a(e);if(u>=c)return s;""==p&&(p=" ");var l=c-u,f=r.call(p,Math.ceil(l/p.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var a=t(77),r=t(18);e.exports=function(t){var e=r(this)+"",n="",i=a(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{18:18,77:77}],74:[function(t,e,n){var a=t(22),r=t(18),i=t(24),o=" \n\x0B\f\r Â áš€á Žâ€€â€â€‚         âŸã€€\u2028\u2029\ufeff",s="["+o+"]",u="​…",p=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),a(a.P+a.F*i(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=l.trim=function(t,e){return t=r(t)+"",1&e&&(t=t.replace(p,"")),2&e&&(t=t.replace(c,"")),t};e.exports=l},{18:18,22:22,24:24}],75:[function(t,e,n){var a,r,i,o=t(17),s=t(33),u=t(32),p=t(20),c=t(29),l=c.process,f=c.setImmediate,d=c.clearImmediate,h=c.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},a(m),m},d=function(t){delete v[t]},"process"==t(11)(l)?a=function(t){l.nextTick(o(b,t,1))}:h?(r=new h,i=r.port2,r.port1.onmessage=y,a=o(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(a=function(t){c.postMessage(t+"","*")},c.addEventListener("message",y,!1)):a=g in p("script")?function(t){u.appendChild(p("script"))[g]=function(){u.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,e,n){var a=t(77),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{77:77}],77:[function(t,e,n){var a=Math.ceil,r=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?r:a)(t)}},{}],78:[function(t,e,n){var a=t(34),r=t(18);e.exports=function(t){return a(r(t))}},{18:18,34:34}],79:[function(t,e,n){var a=t(77),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var a=t(18);e.exports=function(t){return Object(a(t))}},{18:18}],81:[function(t,e,n){var a=t(38);e.exports=function(t,e){if(!a(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!a(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var a=0,r=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++a+r).toString(36))}},{}],83:[function(t,e,n){var a=t(67)("wks"),r=t(82),i=t(29).Symbol;e.exports=function(t){return a[t]||(a[t]=i&&i[t]||(i||r)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var a=t(10),r=t(83)("iterator"),i=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var a,r=t(46),i=t(22),o=t(19),s=t(59),u=t(32),p=t(20),c=t(30),l=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),b=t(78),y=t(77),x=t(76),_=t(79),w=t(34),k=t(82)("__proto__"),E=t(8),S=t(7)(!1),C=Object.prototype,P=Array.prototype,A=P.slice,O=P.join,T=r.setDesc,M=r.getDesc,R=r.setDescs,j={};o||(a=!d(function(){return 7!=T(p("div"),"a",{get:function(){return 7}}).a}),r.setDesc=function(t,e,n){if(a)try{return T(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},r.getDesc=function(t,e){if(a)try{return M(t,e)}catch(n){}return c(t,e)?s(!C.propertyIsEnumerable.call(t,e),t[e]):void 0},r.setDescs=R=function(t,e){h(t);for(var n,a=r.getKeys(e),i=a.length,o=0;i>o;)r.setDesc(t,n=a[o++],e[n]);return t}),i(i.S+i.F*!o,"Object",{getOwnPropertyDescriptor:r.getDesc,defineProperty:r.setDesc,defineProperties:R});var L="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),D=L.concat("length","prototype"),N=L.length,F=function(){var t,e=p("iframe"),n=N,a=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("i;)c(r,a=t[i++])&&(~S(o,a)||o.push(a));return o}},B=function(){};i(i.S,"Object",{getPrototypeOf:r.getProto=r.getProto||function(t){return t=g(t),c(t,k)?t[k]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?C:null},getOwnPropertyNames:r.getNames=r.getNames||I(D,D.length,!0),create:r.create=r.create||function(t,e){var n;return null!==t?(B.prototype=h(t),n=new B,B.prototype=null,n[k]=t):n=F(),void 0===e?n:R(n,e)},keys:r.getKeys=r.getKeys||I(L,N,!1)});var q=function(t,e,n){if(!(e in j)){for(var a=[],r=0;e>r;r++)a[r]="a["+r+"]";j[e]=Function("F,a","return new F("+a.join(",")+")")}return j[e](t,n)};i(i.P,"Function",{bind:function(t){var e=m(this),n=A.call(arguments,1),a=function(){var r=n.concat(A.call(arguments));return this instanceof a?q(e,r.length,r):f(e,r,t)};return v(e.prototype)&&(a.prototype=e.prototype),a}}),i(i.P+i.F*d(function(){u&&A.call(u)}),"Array",{slice:function(t,e){var n=_(this.length),a=l(this);if(e=void 0===e?n:e,"Array"==a)return A.call(this,t,e);for(var r=x(t,n),i=x(e,n),o=_(i-r),s=Array(o),u=0;o>u;u++)s[u]="String"==a?this.charAt(r+u):this[r+u];return s}}),i(i.P+i.F*(w!=Object),"Array",{join:function(t){return O.call(w(this),void 0===t?",":t)}}),i(i.S,"Array",{isArray:t(36)});var U=function(t){return function(e,n){m(e);var a=w(this),r=_(a.length),i=t?r-1:0,o=t?-1:1;if(arguments.length<2)for(;;){if(i in a){n=a[i],i+=o;break}if(i+=o,t?0>i:i>=r)throw TypeError("Reduce of empty array with no initial value")}for(;t?i>=0:r>i;i+=o)i in a&&(n=e(n,a[i],i,this));return n}},G=function(t){return function(e){return t(this,e,arguments[1])}};i(i.P,"Array",{forEach:r.each=r.each||G(E(0)),map:G(E(1)),filter:G(E(2)),some:G(E(3)),every:G(E(4)),reduce:U(!1),reduceRight:U(!0),indexOf:G(S),lastIndexOf:function(t,e){var n=b(this),a=_(n.length),r=a-1;for(arguments.length>1&&(r=Math.min(r,y(e))),0>r&&(r=_(a+r));r>=0;r--)if(r in n&&n[r]===t)return r;return-1}}),i(i.S,"Date",{now:function(){return+new Date}});var V=function(t){return t>9?t:"0"+t};i(i.P+i.F*(d(function(){return"0385-07-25T07:06:39.999Z"!=new Date(-5e13-1).toISOString()})||!d(function(){new Date(NaN).toISOString()})),"Date",{toISOString:function(){if(!isFinite(this))throw RangeError("Invalid time value");var t=this,e=t.getUTCFullYear(),n=t.getUTCMilliseconds(),a=0>e?"-":e>9999?"+":"";return a+("00000"+Math.abs(e)).slice(a?-6:-4)+"-"+V(t.getUTCMonth()+1)+"-"+V(t.getUTCDate())+"T"+V(t.getUTCHours())+":"+V(t.getUTCMinutes())+":"+V(t.getUTCSeconds())+"."+(n>99?n:"0"+V(n))+"Z"}})},{11:11,19:19,2:2,20:20,22:22,24:24,30:30,32:32,33:33,34:34,36:36,38:38,4:4,46:46,59:59,7:7,76:76,77:77,78:78,79:79,8:8,80:80,82:82}],86:[function(t,e,n){var a=t(22);a(a.P,"Array",{copyWithin:t(5)}),t(3)("copyWithin")},{22:22,3:3,5:5}],87:[function(t,e,n){var a=t(22);a(a.P,"Array",{fill:t(6)}),t(3)("fill")},{22:22,3:3,6:6}],88:[function(t,e,n){"use strict";var a=t(22),r=t(8)(6),i="findIndex",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{findIndex:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],89:[function(t,e,n){"use strict";var a=t(22),r=t(8)(5),i="find",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{find:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],90:[function(t,e,n){"use strict";var a=t(17),r=t(22),i=t(80),o=t(40),s=t(35),u=t(79),p=t(84);r(r.S+r.F*!t(43)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,r,c,l=i(t),f="function"==typeof this?this:Array,d=arguments,h=d.length,m=h>1?d[1]:void 0,v=void 0!==m,g=0,b=p(l);if(v&&(m=a(m,h>2?d[2]:void 0,2)),void 0==b||f==Array&&s(b))for(e=u(l.length),n=new f(e);e>g;g++)n[g]=v?m(l[g],g):l[g];else for(c=b.call(l),n=new f;!(r=c.next()).done;g++)n[g]=v?o(c,m,[r.value,g],!0):r.value;return n.length=g,n}})},{17:17,22:22,35:35,40:40,43:43,79:79,80:80,84:84}],91:[function(t,e,n){"use strict";var a=t(3),r=t(44),i=t(45),o=t(78);e.exports=t(42)(Array,"Array",function(t,e){this._t=o(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,r(1)):"keys"==e?r(0,n):"values"==e?r(0,t[n]):r(0,[n,t[n]])},"values"),i.Arguments=i.Array,a("keys"),a("values"),a("entries")},{3:3,42:42,44:44,45:45,78:78}],92:[function(t,e,n){"use strict";var a=t(22);a(a.S+a.F*t(24)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,e=arguments,n=e.length,a=new("function"==typeof this?this:Array)(n);n>t;)a[t]=e[t++];return a.length=n,a}})},{22:22,24:24}],93:[function(t,e,n){t(65)("Array")},{65:65}],94:[function(t,e,n){"use strict";var a=t(46),r=t(38),i=t(83)("hasInstance"),o=Function.prototype;i in o||a.setDesc(o,i,{value:function(t){if("function"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=a.getProto(t);)if(this.prototype===t)return!0;return!1}})},{38:38,46:46,83:83}],95:[function(t,e,n){var a=t(46).setDesc,r=t(59),i=t(30),o=Function.prototype,s=/^\s*function ([^ (]*)/,u="name";u in o||t(19)&&a(o,u,{configurable:!0,get:function(){var t=(""+this).match(s),e=t?t[1]:"";return i(this,u)||a(this,u,r(5,e)),e}})},{19:19,30:30,46:46,59:59}],96:[function(t,e,n){"use strict";var a=t(12);t(15)("Map",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=a.getEntry(this,t);return e&&e.v},set:function(t,e){return a.def(this,0===t?0:t,e)}},a,!0)},{12:12,15:15}],97:[function(t,e,n){var a=t(22),r=t(50),i=Math.sqrt,o=Math.acosh;a(a.S+a.F*!(o&&710==Math.floor(o(Number.MAX_VALUE))),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:r(t-1+i(t-1)*i(t+1))}})},{22:22,50:50}],98:[function(t,e,n){function a(t){return isFinite(t=+t)&&0!=t?0>t?-a(-t):Math.log(t+Math.sqrt(t*t+1)):t}var r=t(22);r(r.S,"Math",{asinh:a})},{22:22}],99:[function(t,e,n){var a=t(22);a(a.S,"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},{22:22}],100:[function(t,e,n){var a=t(22),r=t(51);a(a.S,"Math",{cbrt:function(t){return r(t=+t)*Math.pow(Math.abs(t),1/3)}})},{22:22,51:51}],101:[function(t,e,n){var a=t(22);a(a.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},{22:22}],102:[function(t,e,n){var a=t(22),r=Math.exp;a(a.S,"Math",{cosh:function(t){return(r(t=+t)+r(-t))/2}})},{22:22}],103:[function(t,e,n){var a=t(22);a(a.S,"Math",{expm1:t(49)})},{22:22,49:49}],104:[function(t,e,n){var a=t(22),r=t(51),i=Math.pow,o=i(2,-52),s=i(2,-23),u=i(2,127)*(2-s),p=i(2,-126),c=function(t){return t+1/o-1/o};a(a.S,"Math",{fround:function(t){var e,n,a=Math.abs(t),i=r(t);return p>a?i*c(a/p/s)*p*s:(e=(1+s/o)*a,n=e-(e-a),n>u||n!=n?i*(1/0):i*n)}})},{22:22,51:51}],105:[function(t,e,n){var a=t(22),r=Math.abs;a(a.S,"Math",{hypot:function(t,e){for(var n,a,i=0,o=0,s=arguments,u=s.length,p=0;u>o;)n=r(s[o++]),n>p?(a=p/n,i=i*a*a+1,p=n):n>0?(a=n/p,i+=a*a):i+=n;return p===1/0?1/0:p*Math.sqrt(i)}})},{22:22}],106:[function(t,e,n){var a=t(22),r=Math.imul;a(a.S+a.F*t(24)(function(){return-5!=r(4294967295,5)||2!=r.length}),"Math",{imul:function(t,e){var n=65535,a=+t,r=+e,i=n&a,o=n&r;return 0|i*o+((n&a>>>16)*o+i*(n&r>>>16)<<16>>>0)}})},{22:22,24:24}],107:[function(t,e,n){var a=t(22);a(a.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},{22:22}],108:[function(t,e,n){var a=t(22);a(a.S,"Math",{log1p:t(50)})},{22:22,50:50}],109:[function(t,e,n){var a=t(22);a(a.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{22:22}],110:[function(t,e,n){var a=t(22);a(a.S,"Math",{sign:t(51)})},{22:22,51:51}],111:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S+a.F*t(24)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(r(t)-r(-t))/2:(i(t-1)-i(-t-1))*(Math.E/2)}})},{22:22,24:24,49:49}],112:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S,"Math",{tanh:function(t){var e=r(t=+t),n=r(-t);return e==1/0?1:n==1/0?-1:(e-n)/(i(t)+i(-t))}})},{22:22,49:49}],113:[function(t,e,n){var a=t(22);a(a.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{22:22}],114:[function(t,e,n){"use strict";var a=t(46),r=t(29),i=t(30),o=t(11),s=t(81),u=t(24),p=t(74).trim,c="Number",l=r[c],f=l,d=l.prototype,h=o(a.create(d))==c,m="trim"in String.prototype,v=function(t){
-var e=s(t,!1);if("string"==typeof e&&e.length>2){e=m?e.trim():p(e,3);var n,a,r,i=e.charCodeAt(0);if(43===i||45===i){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===i){switch(e.charCodeAt(1)){case 66:case 98:a=2,r=49;break;case 79:case 111:a=8,r=55;break;default:return+e}for(var o,u=e.slice(2),c=0,l=u.length;l>c;c++)if(o=u.charCodeAt(c),48>o||o>r)return NaN;return parseInt(u,a)}}return+e};l(" 0o1")&&l("0b1")&&!l("+0x1")||(l=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof l&&(h?u(function(){d.valueOf.call(n)}):o(n)!=c)?new f(v(e)):v(e)},a.each.call(t(19)?a.getNames(f):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),function(t){i(f,t)&&!i(l,t)&&a.setDesc(l,t,a.getDesc(f,t))}),l.prototype=d,d.constructor=l,t(61)(r,c,l))},{11:11,19:19,24:24,29:29,30:30,46:46,61:61,74:74,81:81}],115:[function(t,e,n){var a=t(22);a(a.S,"Number",{EPSILON:Math.pow(2,-52)})},{22:22}],116:[function(t,e,n){var a=t(22),r=t(29).isFinite;a(a.S,"Number",{isFinite:function(t){return"number"==typeof t&&r(t)}})},{22:22,29:29}],117:[function(t,e,n){var a=t(22);a(a.S,"Number",{isInteger:t(37)})},{22:22,37:37}],118:[function(t,e,n){var a=t(22);a(a.S,"Number",{isNaN:function(t){return t!=t}})},{22:22}],119:[function(t,e,n){var a=t(22),r=t(37),i=Math.abs;a(a.S,"Number",{isSafeInteger:function(t){return r(t)&&i(t)<=9007199254740991}})},{22:22,37:37}],120:[function(t,e,n){var a=t(22);a(a.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{22:22}],121:[function(t,e,n){var a=t(22);a(a.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{22:22}],122:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseFloat:parseFloat})},{22:22}],123:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseInt:parseInt})},{22:22}],124:[function(t,e,n){var a=t(22);a(a.S+a.F,"Object",{assign:t(53)})},{22:22,53:53}],125:[function(t,e,n){var a=t(38);t(54)("freeze",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],126:[function(t,e,n){var a=t(78);t(54)("getOwnPropertyDescriptor",function(t){return function(e,n){return t(a(e),n)}})},{54:54,78:78}],127:[function(t,e,n){t(54)("getOwnPropertyNames",function(){return t(28).get})},{28:28,54:54}],128:[function(t,e,n){var a=t(80);t(54)("getPrototypeOf",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],129:[function(t,e,n){var a=t(38);t(54)("isExtensible",function(t){return function(e){return a(e)?t?t(e):!0:!1}})},{38:38,54:54}],130:[function(t,e,n){var a=t(38);t(54)("isFrozen",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],131:[function(t,e,n){var a=t(38);t(54)("isSealed",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],132:[function(t,e,n){var a=t(22);a(a.S,"Object",{is:t(63)})},{22:22,63:63}],133:[function(t,e,n){var a=t(80);t(54)("keys",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],134:[function(t,e,n){var a=t(38);t(54)("preventExtensions",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],135:[function(t,e,n){var a=t(38);t(54)("seal",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],136:[function(t,e,n){var a=t(22);a(a.S,"Object",{setPrototypeOf:t(64).set})},{22:22,64:64}],137:[function(t,e,n){"use strict";var a=t(10),r={};r[t(83)("toStringTag")]="z",r+""!="[object z]"&&t(61)(Object.prototype,"toString",function(){return"[object "+a(this)+"]"},!0)},{10:10,61:61,83:83}],138:[function(t,e,n){"use strict";var a,r=t(46),i=t(48),o=t(29),s=t(17),u=t(10),p=t(22),c=t(38),l=t(4),f=t(2),d=t(69),h=t(27),m=t(64).set,v=t(63),g=t(83)("species"),b=t(68),y=t(52),x="Promise",_=o.process,w="process"==u(_),k=o[x],E=function(){},S=function(t){var e,n=new k(E);return t&&(n.constructor=function(t){t(E,E)}),(e=k.resolve(n))["catch"](E),e===n},C=function(){function e(t){var n=new k(t);return m(n,e.prototype),n}var n=!1;try{if(n=k&&k.resolve&&S(),m(e,k),e.prototype=r.create(k.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(n=!1),n&&t(19)){var a=!1;k.resolve(r.setDesc({},"then",{get:function(){a=!0}})),n=a}}catch(i){n=!1}return n}(),P=function(t,e){return i&&t===k&&e===a?!0:v(t,e)},A=function(t){var e=l(t)[g];return void 0!=e?e:t},O=function(t){var e;return c(t)&&"function"==typeof(e=t.then)?e:!1},T=function(t){var e,n;this.promise=new t(function(t,a){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=a}),this.resolve=f(e),this.reject=f(n)},M=function(t){try{t()}catch(e){return{error:e}}},R=function(t,e){if(!t.n){t.n=!0;var n=t.c;y(function(){for(var a=t.v,r=1==t.s,i=0,s=function(e){var n,i,o=r?e.ok:e.fail,s=e.resolve,u=e.reject;try{o?(r||(t.h=!0),n=o===!0?a:o(a),n===e.promise?u(TypeError("Promise-chain cycle")):(i=O(n))?i.call(n,s,u):s(n)):u(a)}catch(p){u(p)}};n.length>i;)s(n[i++]);n.length=0,t.n=!1,e&&setTimeout(function(){var e,n,r=t.p;j(r)&&(w?_.emit("unhandledRejection",a,r):(e=o.onunhandledrejection)?e({promise:r,reason:a}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",a)),t.a=void 0},1)})}},j=function(t){var e,n=t._d,a=n.a||n.c,r=0;if(n.h)return!1;for(;a.length>r;)if(e=a[r++],e.fail||!j(e.promise))return!1;return!0},L=function(t){var e=this;e.d||(e.d=!0,e=e.r||e,e.v=t,e.s=2,e.a=e.c.slice(),R(e,!0))},D=function(t){var e,n=this;if(!n.d){n.d=!0,n=n.r||n;try{if(n.p===t)throw TypeError("Promise can't be resolved itself");(e=O(t))?y(function(){var a={r:n,d:!1};try{e.call(t,s(D,a,1),s(L,a,1))}catch(r){L.call(a,r)}}):(n.v=t,n.s=1,R(n,!1))}catch(a){L.call({r:n,d:!1},a)}}};C||(k=function(t){f(t);var e=this._d={p:d(this,k,x),c:[],a:void 0,s:0,d:!1,v:void 0,h:!1,n:!1};try{t(s(D,e,1),s(L,e,1))}catch(n){L.call(e,n)}},t(60)(k.prototype,{then:function(t,e){var n=new T(b(this,k)),a=n.promise,r=this._d;return n.ok="function"==typeof t?t:!0,n.fail="function"==typeof e&&e,r.c.push(n),r.a&&r.a.push(n),r.s&&R(r,!1),a},"catch":function(t){return this.then(void 0,t)}})),p(p.G+p.W+p.F*!C,{Promise:k}),t(66)(k,x),t(65)(x),a=t(16)[x],p(p.S+p.F*!C,x,{reject:function(t){var e=new T(this),n=e.reject;return n(t),e.promise}}),p(p.S+p.F*(!C||S(!0)),x,{resolve:function(t){if(t instanceof k&&P(t.constructor,this))return t;var e=new T(this),n=e.resolve;return n(t),e.promise}}),p(p.S+p.F*!(C&&t(43)(function(t){k.all(t)["catch"](function(){})})),x,{all:function(t){var e=A(this),n=new T(e),a=n.resolve,i=n.reject,o=[],s=M(function(){h(t,!1,o.push,o);var n=o.length,s=Array(n);n?r.each.call(o,function(t,r){var o=!1;e.resolve(t).then(function(t){o||(o=!0,s[r]=t,--n||a(s))},i)}):a(s)});return s&&i(s.error),n.promise},race:function(t){var e=A(this),n=new T(e),a=n.reject,r=M(function(){h(t,!1,function(t){e.resolve(t).then(n.resolve,a)})});return r&&a(r.error),n.promise}})},{10:10,16:16,17:17,19:19,2:2,22:22,27:27,29:29,38:38,4:4,43:43,46:46,48:48,52:52,60:60,63:63,64:64,65:65,66:66,68:68,69:69,83:83}],139:[function(t,e,n){var a=t(22),r=Function.apply,i=t(4);a(a.S,"Reflect",{apply:function(t,e,n){return r.call(t,e,i(n))}})},{22:22,4:4}],140:[function(t,e,n){var a=t(46),r=t(22),i=t(2),o=t(4),s=t(38),u=Function.bind||t(16).Function.prototype.bind;r(r.S+r.F*t(24)(function(){function t(){}return!(Reflect.construct(function(){},[],t)instanceof t)}),"Reflect",{construct:function(t,e){i(t),o(e);var n=arguments.length<3?t:i(arguments[2]);if(t==n){switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var r=[null];return r.push.apply(r,e),new(u.apply(t,r))}var p=n.prototype,c=a.create(s(p)?p:Object.prototype),l=Function.apply.call(t,c,e);return s(l)?l:c}})},{16:16,2:2,22:22,24:24,38:38,4:4,46:46}],141:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S+r.F*t(24)(function(){Reflect.defineProperty(a.setDesc({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t);try{return a.setDesc(t,e,n),!0}catch(r){return!1}}})},{22:22,24:24,4:4,46:46}],142:[function(t,e,n){var a=t(22),r=t(46).getDesc,i=t(4);a(a.S,"Reflect",{deleteProperty:function(t,e){var n=r(i(t),e);return n&&!n.configurable?!1:delete t[e]}})},{22:22,4:4,46:46}],143:[function(t,e,n){"use strict";var a=t(22),r=t(4),i=function(t){this._t=r(t),this._i=0;var e,n=this._k=[];for(e in t)n.push(e)};t(41)(i,"Object",function(){var t,e=this,n=e._k;do if(e._i>=n.length)return{value:void 0,done:!0};while(!((t=n[e._i++])in e._t));return{value:t,done:!1}}),a(a.S,"Reflect",{enumerate:function(t){return new i(t)}})},{22:22,4:4,41:41}],144:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return a.getDesc(i(t),e)}})},{22:22,4:4,46:46}],145:[function(t,e,n){var a=t(22),r=t(46).getProto,i=t(4);a(a.S,"Reflect",{getPrototypeOf:function(t){return r(i(t))}})},{22:22,4:4,46:46}],146:[function(t,e,n){function a(t,e){var n,o,p=arguments.length<3?t:arguments[2];return u(t)===p?t[e]:(n=r.getDesc(t,e))?i(n,"value")?n.value:void 0!==n.get?n.get.call(p):void 0:s(o=r.getProto(t))?a(o,e,p):void 0}var r=t(46),i=t(30),o=t(22),s=t(38),u=t(4);o(o.S,"Reflect",{get:a})},{22:22,30:30,38:38,4:4,46:46}],147:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{has:function(t,e){return e in t}})},{22:22}],148:[function(t,e,n){var a=t(22),r=t(4),i=Object.isExtensible;a(a.S,"Reflect",{isExtensible:function(t){return r(t),i?i(t):!0}})},{22:22,4:4}],149:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{ownKeys:t(56)})},{22:22,56:56}],150:[function(t,e,n){var a=t(22),r=t(4),i=Object.preventExtensions;a(a.S,"Reflect",{preventExtensions:function(t){r(t);try{return i&&i(t),!0}catch(e){return!1}}})},{22:22,4:4}],151:[function(t,e,n){var a=t(22),r=t(64);r&&a(a.S,"Reflect",{setPrototypeOf:function(t,e){r.check(t,e);try{return r.set(t,e),!0}catch(n){return!1}}})},{22:22,64:64}],152:[function(t,e,n){function a(t,e,n){var o,c,l=arguments.length<4?t:arguments[3],f=r.getDesc(u(t),e);if(!f){if(p(c=r.getProto(t)))return a(c,e,n,l);f=s(0)}return i(f,"value")?f.writable!==!1&&p(l)?(o=r.getDesc(l,e)||s(0),o.value=n,r.setDesc(l,e,o),!0):!1:void 0===f.set?!1:(f.set.call(l,n),!0)}var r=t(46),i=t(30),o=t(22),s=t(59),u=t(4),p=t(38);o(o.S,"Reflect",{set:a})},{22:22,30:30,38:38,4:4,46:46,59:59}],153:[function(t,e,n){var a=t(46),r=t(29),i=t(39),o=t(26),s=r.RegExp,u=s,p=s.prototype,c=/a/g,l=/a/g,f=new s(c)!==c;!t(19)||f&&!t(24)(function(){return l[t(83)("match")]=!1,s(c)!=c||s(l)==l||"/a/i"!=s(c,"i")})||(s=function(t,e){var n=i(t),a=void 0===e;return this instanceof s||!n||t.constructor!==s||!a?f?new u(n&&!a?t.source:t,e):u((n=t instanceof s)?t.source:t,n&&a?o.call(t):e):t},a.each.call(a.getNames(u),function(t){t in s||a.setDesc(s,t,{configurable:!0,get:function(){return u[t]},set:function(e){u[t]=e}})}),p.constructor=s,s.prototype=p,t(61)(r,"RegExp",s)),t(65)("RegExp")},{19:19,24:24,26:26,29:29,39:39,46:46,61:61,65:65,83:83}],154:[function(t,e,n){var a=t(46);t(19)&&"g"!=/./g.flags&&a.setDesc(RegExp.prototype,"flags",{configurable:!0,get:t(26)})},{19:19,26:26,46:46}],155:[function(t,e,n){t(25)("match",1,function(t,e){return function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],156:[function(t,e,n){t(25)("replace",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],157:[function(t,e,n){t(25)("search",1,function(t,e){return function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],158:[function(t,e,n){t(25)("split",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],159:[function(t,e,n){"use strict";var a=t(12);t(15)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t=0===t?0:t,t)}},a)},{12:12,15:15}],160:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!1);a(a.P,"String",{codePointAt:function(t){return r(this,t)}})},{22:22,70:70}],161:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="endsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{endsWith:function(t){var e=i(this,t,o),n=arguments,a=n.length>1?n[1]:void 0,u=r(e.length),p=void 0===a?u:Math.min(r(a),u),c=t+"";return s?s.call(e,c,p):e.slice(p-c.length,p)===c}})},{22:22,23:23,71:71,79:79}],162:[function(t,e,n){var a=t(22),r=t(76),i=String.fromCharCode,o=String.fromCodePoint;a(a.S+a.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],a=arguments,o=a.length,s=0;o>s;){if(e=+a[s++],r(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(65536>e?i(e):i(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},{22:22,76:76}],163:[function(t,e,n){"use strict";var a=t(22),r=t(71),i="includes";a(a.P+a.F*t(23)(i),"String",{includes:function(t){return!!~r(this,t,i).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},{22:22,23:23,71:71}],164:[function(t,e,n){"use strict";var a=t(70)(!0);t(42)(String,"String",function(t){this._t=t+"",this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=a(e,n),this._i+=t.length,{value:t,done:!1})})},{42:42,70:70}],165:[function(t,e,n){var a=t(22),r=t(78),i=t(79);a(a.S,"String",{raw:function(t){for(var e=r(t.raw),n=i(e.length),a=arguments,o=a.length,s=[],u=0;n>u;)s.push(e[u++]+""),o>u&&s.push(a[u]+"");return s.join("")}})},{22:22,78:78,79:79}],166:[function(t,e,n){var a=t(22);a(a.P,"String",{repeat:t(73)})},{22:22,73:73}],167:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="startsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{startsWith:function(t){var e=i(this,t,o),n=arguments,a=r(Math.min(n.length>1?n[1]:void 0,e.length)),u=t+"";return s?s.call(e,u,a):e.slice(a,a+u.length)===u}})},{22:22,23:23,71:71,79:79}],168:[function(t,e,n){"use strict";t(74)("trim",function(t){return function(){return t(this,3)}})},{74:74}],169:[function(t,e,n){"use strict";var a=t(46),r=t(29),i=t(30),o=t(19),s=t(22),u=t(61),p=t(24),c=t(67),l=t(66),f=t(82),d=t(83),h=t(47),m=t(28),v=t(21),g=t(36),b=t(4),y=t(78),x=t(59),_=a.getDesc,w=a.setDesc,k=a.create,E=m.get,S=r.Symbol,C=r.JSON,P=C&&C.stringify,A=!1,O=d("_hidden"),T=a.isEnum,M=c("symbol-registry"),R=c("symbols"),j="function"==typeof S,L=Object.prototype,D=o&&p(function(){return 7!=k(w({},"a",{get:function(){return w(this,"a",{value:7}).a}})).a})?function(t,e,n){var a=_(L,e);a&&delete L[e],w(t,e,n),a&&t!==L&&w(L,e,a)}:w,N=function(t){var e=R[t]=k(S.prototype);return e._k=t,o&&A&&D(L,t,{configurable:!0,set:function(e){i(this,O)&&i(this[O],t)&&(this[O][t]=!1),D(this,t,x(1,e))}}),e},F=function(t){return"symbol"==typeof t},I=function(t,e,n){return n&&i(R,e)?(n.enumerable?(i(t,O)&&t[O][e]&&(t[O][e]=!1),n=k(n,{enumerable:x(0,!1)})):(i(t,O)||w(t,O,x(1,{})),t[O][e]=!0),D(t,e,n)):w(t,e,n)},B=function(t,e){b(t);for(var n,a=v(e=y(e)),r=0,i=a.length;i>r;)I(t,n=a[r++],e[n]);return t},q=function(t,e){return void 0===e?k(t):B(k(t),e)},U=function(t){var e=T.call(this,t);return e||!i(this,t)||!i(R,t)||i(this,O)&&this[O][t]?e:!0},G=function(t,e){var n=_(t=y(t),e);return!n||!i(R,e)||i(t,O)&&t[O][e]||(n.enumerable=!0),n},V=function(t){for(var e,n=E(y(t)),a=[],r=0;n.length>r;)i(R,e=n[r++])||e==O||a.push(e);return a},z=function(t){for(var e,n=E(y(t)),a=[],r=0;n.length>r;)i(R,e=n[r++])&&a.push(R[e]);return a},W=function(t){if(void 0!==t&&!F(t)){for(var e,n,a=[t],r=1,i=arguments;i.length>r;)a.push(i[r++]);return e=a[1],"function"==typeof e&&(n=e),(n||!g(e))&&(e=function(t,e){return n&&(e=n.call(this,t,e)),F(e)?void 0:e}),a[1]=e,P.apply(C,a)}},H=p(function(){var t=S();return"[null]"!=P([t])||"{}"!=P({a:t})||"{}"!=P(Object(t))});j||(S=function(){if(F(this))throw TypeError("Symbol is not a constructor");return N(f(arguments.length>0?arguments[0]:void 0))},u(S.prototype,"toString",function(){return this._k}),F=function(t){return t instanceof S},a.create=q,a.isEnum=U,a.getDesc=G,a.setDesc=I,a.setDescs=B,a.getNames=m.get=V,a.getSymbols=z,o&&!t(48)&&u(L,"propertyIsEnumerable",U,!0));var K={"for":function(t){return i(M,t+="")?M[t]:M[t]=S(t)},keyFor:function(t){return h(M,t)},useSetter:function(){A=!0},useSimple:function(){A=!1}};a.each.call("hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),function(t){var e=d(t);K[t]=j?e:N(e)}),A=!0,s(s.G+s.W,{Symbol:S}),s(s.S,"Symbol",K),s(s.S+s.F*!j,"Object",{create:q,defineProperty:I,defineProperties:B,getOwnPropertyDescriptor:G,getOwnPropertyNames:V,getOwnPropertySymbols:z}),C&&s(s.S+s.F*(!j||H),"JSON",{stringify:W}),l(S,"Symbol"),l(Math,"Math",!0),l(r.JSON,"JSON",!0)},{19:19,21:21,22:22,24:24,28:28,29:29,30:30,36:36,4:4,46:46,47:47,48:48,59:59,61:61,66:66,67:67,78:78,82:82,83:83}],170:[function(t,e,n){"use strict";var a=t(46),r=t(61),i=t(14),o=t(38),s=t(30),u=i.frozenStore,p=i.WEAK,c=Object.isExtensible||o,l={},f=t(15)("WeakMap",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){if(o(t)){if(!c(t))return u(this).get(t);if(s(t,p))return t[p][this._i]}},set:function(t,e){return i.def(this,t,e)}},i,!0,!0);7!=(new f).set((Object.freeze||Object)(l),7).get(l)&&a.each.call(["delete","has","get","set"],function(t){var e=f.prototype,n=e[t];r(e,t,function(e,a){if(o(e)&&!c(e)){var r=u(this)[t](e,a);return"set"==t?this:r}return n.call(this,e,a)})})},{14:14,15:15,30:30,38:38,46:46,61:61}],171:[function(t,e,n){"use strict";var a=t(14);t(15)("WeakSet",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t,!0)}},a,!1,!0)},{14:14,15:15}],172:[function(t,e,n){"use strict";var a=t(22),r=t(7)(!0);a(a.P,"Array",{includes:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)("includes")},{22:22,3:3,7:7}],173:[function(t,e,n){var a=t(22);a(a.P,"Map",{toJSON:t(13)("Map")})},{13:13,22:22}],174:[function(t,e,n){var a=t(22),r=t(55)(!0);a(a.S,"Object",{entries:function(t){return r(t)}})},{22:22,55:55}],175:[function(t,e,n){var a=t(46),r=t(22),i=t(56),o=t(78),s=t(59);r(r.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,r=o(t),u=a.setDesc,p=a.getDesc,c=i(r),l={},f=0;c.length>f;)n=p(r,e=c[f++]),e in l?u(l,e,s(0,n)):l[e]=n;return l}})},{22:22,46:46,56:56,59:59,78:78}],176:[function(t,e,n){var a=t(22),r=t(55)(!1);a(a.S,"Object",{values:function(t){return r(t)}})},{22:22,55:55}],177:[function(t,e,n){var a=t(22),r=t(62)(/[\\^$*+?.()|[\]{}]/g,"\\$&");a(a.S,"RegExp",{escape:function(t){return r(t)}})},{22:22,62:62}],178:[function(t,e,n){var a=t(22);a(a.P,"Set",{toJSON:t(13)("Set")})},{13:13,22:22}],179:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!0);a(a.P,"String",{at:function(t){return r(this,t)}})},{22:22,70:70}],180:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padLeft:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{22:22,72:72}],181:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padRight:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},{22:22,72:72}],182:[function(t,e,n){"use strict";t(74)("trimLeft",function(t){return function(){return t(this,1)}})},{74:74}],183:[function(t,e,n){"use strict";t(74)("trimRight",function(t){return function(){return t(this,2)}})},{74:74}],184:[function(t,e,n){var a=t(46),r=t(22),i=t(17),o=t(16).Array||Array,s={},u=function(t,e){a.each.call(t.split(","),function(t){void 0==e&&t in o?s[t]=o[t]:t in[]&&(s[t]=i(Function.call,[][t],e))})};u("pop,reverse,shift,keys,values,entries",1),u("indexOf,every,some,forEach,map,filter,find,findIndex,includes",3),u("join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill"),r(r.S,"Array",s)},{16:16,17:17,22:22,46:46}],185:[function(t,e,n){t(91);var a=t(29),r=t(31),i=t(45),o=t(83)("iterator"),s=a.NodeList,u=a.HTMLCollection,p=s&&s.prototype,c=u&&u.prototype,l=i.NodeList=i.HTMLCollection=i.Array;p&&!p[o]&&r(p,o,l),c&&!c[o]&&r(c,o,l)},{29:29,31:31,45:45,83:83,91:91}],186:[function(t,e,n){var a=t(22),r=t(75);a(a.G+a.B,{setImmediate:r.set,clearImmediate:r.clear})},{22:22,75:75}],187:[function(t,e,n){var a=t(29),r=t(22),i=t(33),o=t(57),s=a.navigator,u=!!s&&/MSIE .\./.test(s.userAgent),p=function(t){return u?function(e,n){return t(i(o,[].slice.call(arguments,2),"function"==typeof e?e:Function(e)),n)}:t};r(r.G+r.B+r.F*u,{setTimeout:p(a.setTimeout),setInterval:p(a.setInterval)})},{22:22,29:29,33:33,57:57}],188:[function(t,e,n){t(85),t(169),t(124),t(132),t(136),t(137),t(125),t(135),t(134),t(130),t(131),t(129),t(126),t(128),t(133),t(127),t(95),t(94),t(114),t(115),t(116),t(117),t(118),t(119),t(120),t(121),t(122),t(123),t(97),t(98),t(99),t(100),t(101),t(102),t(103),t(104),t(105),t(106),t(107),t(108),t(109),t(110),t(111),t(112),t(113),t(162),t(165),t(168),t(164),t(160),t(161),t(163),t(166),t(167),t(90),t(92),t(91),t(93),t(86),t(87),t(89),t(88),t(153),t(154),t(155),t(156),t(157),t(158),t(138),t(96),t(159),t(170),t(171),t(139),t(140),t(141),t(142),t(143),t(146),t(144),t(145),t(147),t(148),t(149),t(150),t(152),t(151),t(172),t(179),t(180),t(181),t(182),t(183),t(177),t(175),t(176),t(174),t(173),t(178),t(184),t(187),t(186),t(185),e.exports=t(16)},{100:100,101:101,102:102,103:103,104:104,105:105,106:106,107:107,108:108,109:109,110:110,111:111,112:112,113:113,114:114,115:115,116:116,117:117,118:118,119:119,120:120,121:121,122:122,123:123,124:124,125:125,126:126,127:127,128:128,129:129,130:130,131:131,132:132,133:133,134:134,135:135,136:136,137:137,138:138,139:139,140:140,141:141,142:142,143:143,144:144,145:145,146:146,147:147,148:148,149:149,150:150,151:151,152:152,153:153,154:154,155:155,156:156,157:157,158:158,159:159,16:16,160:160,161:161,162:162,163:163,164:164,165:165,166:166,167:167,168:168,169:169,170:170,171:171,172:172,173:173,174:174,175:175,176:176,177:177,178:178,179:179,180:180,181:181,182:182,183:183,184:184,185:185,186:186,187:187,85:85,86:86,87:87,88:88,89:89,90:90,91:91,92:92,93:93,94:94,95:95,96:96,97:97,98:98,99:99}],189:[function(t,e,n){(function(n){(function(t,n){!function(n){"use strict";function a(t,e,n,a){var r=Object.create((e||i).prototype),o=new h(a||[]);return r._invoke=l(t,n,o),r}function r(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(a){return{type:"throw",arg:a}}}function i(){}function o(){}function s(){}function u(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function p(t){this.arg=t}function c(e){function n(t,n){var a=e[t](n),r=a.value;return r instanceof p?Promise.resolve(r.arg).then(i,o):Promise.resolve(r).then(function(t){return a.value=t,a})}function a(t,e){function a(){return n(t,e)}return r=r?r.then(a,a):new Promise(function(t){t(a())})}"object"==typeof t&&t.domain&&(n=t.domain.bind(n));var r,i=n.bind(e,"next"),o=n.bind(e,"throw");n.bind(e,"return");this._invoke=a}function l(t,e,n){var a=w;return function(i,o){if(a===E)throw Error("Generator is already running");if(a===S){if("throw"===i)throw o;return v()}for(;;){var s=n.delegate;if(s){if("return"===i||"throw"===i&&s.iterator[i]===g){n.delegate=null;var u=s.iterator["return"];if(u){var p=r(u,s.iterator,o);if("throw"===p.type){i="throw",o=p.arg;continue}}if("return"===i)continue}var p=r(s.iterator[i],s.iterator,o);if("throw"===p.type){n.delegate=null,i="throw",o=p.arg;continue}i="next",o=g;var c=p.arg;if(!c.done)return a=k,c;n[s.resultName]=c.value,n.next=s.nextLoc,n.delegate=null}if("next"===i)n._sent=o,a===k?n.sent=o:n.sent=g;else if("throw"===i){if(a===w)throw a=S,o;n.dispatchException(o)&&(i="next",o=g)}else"return"===i&&n.abrupt("return",o);a=E;var p=r(t,e,n);if("normal"===p.type){a=n.done?S:k;var c={value:p.arg,done:n.done};if(p.arg!==C)return c;n.delegate&&"next"===i&&(o=g)}else"throw"===p.type&&(a=S,i="throw",o=p.arg)}}}function f(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function d(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function h(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(f,this),this.reset(!0)}function m(t){if(t){var e=t[y];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,a=function r(){for(;++n=0;--a){var r=this.tryEntries[a],i=r.completion;if("root"===r.tryLoc)return e("end");if(r.tryLoc<=this.prev){var o=b.call(r,"catchLoc"),s=b.call(r,"finallyLoc");if(o&&s){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&b.call(a,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),C}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var a=n.completion;if("throw"===a.type){var r=a.arg;d(n)}return r}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},C}}}("object"==typeof n?n:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,t(202),void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{202:202}],190:[function(t,e,n){!function(t){"use strict";function e(){return c.createDocumentFragment()}function n(t){return c.createElement(t)}function a(t){if(1===t.length)return r(t[0]);for(var n=e(),a=B.call(t),i=0;i-1}}([].indexOf||function(t){for(q=this.length;q--&&this[q]!==t;);return q}),item:function(t){return this[t]||null},remove:function(){for(var t,e=0;e=u?e(i):document.fonts.load(p(i,i.family),s).then(function(e){1<=e.length?t(i):setTimeout(f,25)},function(){e(i)})};f()}else n(function(){function n(){var e;(e=-1!=v&&-1!=g||-1!=v&&-1!=b||-1!=g&&-1!=b)&&((e=v!=g&&v!=b&&g!=b)||(null===l&&(e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),l=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))),e=l&&(v==y&&g==y&&b==y||v==x&&g==x&&b==x||v==_&&g==_&&b==_)),e=!e),e&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),t(i))}function f(){if((new Date).getTime()-c>=u)null!==w.parentNode&&w.parentNode.removeChild(w),e(i);else{var t=document.hidden;(!0===t||void 0===t)&&(v=d.a.offsetWidth,g=h.a.offsetWidth,b=m.a.offsetWidth,n()),k=setTimeout(f,50)}}var d=new a(s),h=new a(s),m=new a(s),v=-1,g=-1,b=-1,y=-1,x=-1,_=-1,w=document.createElement("div"),k=0;w.dir="ltr",r(d,p(i,"sans-serif")),r(h,p(i,"serif")),r(m,p(i,"monospace")),w.appendChild(d.a),w.appendChild(h.a),w.appendChild(m.a),document.body.appendChild(w),y=d.a.offsetWidth,x=h.a.offsetWidth,_=m.a.offsetWidth,f(),o(d,function(t){v=t,n()}),r(d,p(i,'"'+i.family+'",sans-serif')),o(h,function(t){g=t,n()}),r(h,p(i,'"'+i.family+'",serif')),o(m,function(t){b=t,n()}),r(m,p(i,'"'+i.family+'",monospace'))})})},window.FontFaceObserver=s,window.FontFaceObserver.prototype.check=s.prototype.a,void 0!==e&&(e.exports=window.FontFaceObserver)}()},{}],193:[function(t,e,n){!function(t,n){function a(t,e){var n=t.createElement("p"),a=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",a.insertBefore(n.lastChild,a.firstChild)}function r(){var t=x.elements;return"string"==typeof t?t.split(" "):t}function i(t,e){var n=x.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),x.elements=n+" "+t,c(e)}function o(t){var e=y[t[g]];return e||(e={},b++,t[g]=b,y[b]=e),e}function s(t,e,a){if(e||(e=n),f)return e.createElement(t);a||(a=o(e));var r;return r=a.cache[t]?a.cache[t].cloneNode():v.test(t)?(a.cache[t]=a.createElem(t)).cloneNode():a.createElem(t),!r.canHaveChildren||m.test(t)||r.tagUrn?r:a.frag.appendChild(r)}function u(t,e){if(t||(t=n),f)return t.createDocumentFragment();e=e||o(t);for(var a=e.frag.cloneNode(),i=0,s=r(),u=s.length;u>i;i++)a.createElement(s[i]);return a}function p(t,e){e.cache||(e.cache={},e.createElem=t.createElement,e.createFrag=t.createDocumentFragment,e.frag=e.createFrag()),t.createElement=function(n){return x.shivMethods?s(n,t,e):e.createElem(n)},t.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+r().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(x,e.frag)}function c(t){t||(t=n);var e=o(t);return!x.shivCSS||l||e.hasCSS||(e.hasCSS=!!a(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),f||p(t,e),t}var l,f,d="3.7.3-pre",h=t.html5||{},m=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,v=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,g="_html5shiv",b=0,y={};!function(){try{var t=n.createElement("a");t.innerHTML="",l="hidden"in t,f=1==t.childNodes.length||function(){n.createElement("a");var t=n.createDocumentFragment();return void 0===t.cloneNode||void 0===t.createDocumentFragment||void 0===t.createElement}()}catch(e){l=!0,f=!0}}();var x={elements:h.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:d,shivCSS:h.shivCSS!==!1,supportsUnknownElements:f,shivMethods:h.shivMethods!==!1,type:"default",shivDocument:c,createElement:s,createDocumentFragment:u,addElements:i};t.html5=x,c(n),"object"==typeof e&&e.exports&&(e.exports=x)}("undefined"!=typeof window?window:this,document)},{}],194:[function(t,e,n){(function(t){(function(t){!function(t){function e(t,e,n,a){for(var i,o=n.slice(),s=r(e,t),u=0,p=o.length;p>u&&(handler=o[u],"object"==typeof handler?"function"==typeof handler.handleEvent&&handler.handleEvent(s):handler.call(t,s),!s.stoppedImmediatePropagation);u++);return i=!s.stoppedPropagation,a&&i&&t.parentNode?t.parentNode.dispatchEvent(s):!s.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function a(t,e,a){var r=b(e||t,a);v(t,"textContent",n(function(){return r.get.call(this)},function(t){r.set.call(this,t)}))}function r(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function i(t,e){for(var n=t.length;n--&&t[n]!==e;);return n}function o(){if("BR"===this.tagName)return"\n";for(var t=this.firstChild,e=[];t;)8!==t.nodeType&&7!==t.nodeType&&e.push(t.textContent),t=t.nextSibling;return e.join("")}function s(t){var e=document.createEvent("Event");e.initEvent("input",!0,!0),(t.srcElement||t.fromElement||document).dispatchEvent(e)}function u(t){!f&&k.test(document.readyState)&&(f=!f,document.detachEvent(d,u),t=document.createEvent("Event"),t.initEvent(h,!0,!0),document.dispatchEvent(t))}function p(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function c(e,n){return n||(n=t.event),n.target||(n.target=n.srcElement||n.fromElement||document),n.timeStamp||(n.timeStamp=(new Date).getTime()),n}if(!document.createEvent){var l=!0,f=!1,d="onreadystatechange",h="DOMContentLoaded",m="__IE8__"+Math.random(),v=Object.defineProperty||function(t,e,n){t[e]=n.value},g=Object.defineProperties||function(e,n){for(var a in n)if(y.call(n,a))try{v(e,a,n[a])}catch(r){t.console&&console.log(a+" failed on object:",e,r.message)}},b=Object.getOwnPropertyDescriptor,y=Object.prototype.hasOwnProperty,x=t.Element.prototype,_=t.Text.prototype,w=/^[a-z]+$/,k=/loaded|complete/,E={},S=document.createElement("div"),C=document.documentElement,P=C.removeAttribute,A=C.setAttribute;a(t.HTMLCommentElement.prototype,x,"nodeValue"),a(t.HTMLScriptElement.prototype,null,"text"),a(_,null,"nodeValue"),a(t.HTMLTitleElement.prototype,null,"text"),v(t.HTMLStyleElement.prototype,"textContent",function(t){return n(function(){return t.get.call(this.styleSheet)},function(e){t.set.call(this.styleSheet,e)})}(b(t.CSSStyleSheet.prototype,"cssText"))),g(x,{textContent:{get:o,set:p},firstElementChild:{get:function(){for(var t=this.childNodes||[],e=0,n=t.length;n>e;e++)if(1==t[e].nodeType)return t[e]}},lastElementChild:{get:function(){for(var t=this.childNodes||[],e=t.length;e--;)if(1==t[e].nodeType)return t[e]}},oninput:{get:function(){return this._oninput||null},set:function(t){this._oninput&&(this.removeEventListener("input",this._oninput),this._oninput=t,t&&this.addEventListener("input",t))}},previousElementSibling:{get:function(){for(var t=this.previousSibling;t&&1!=t.nodeType;)t=t.previousSibling;return t}},nextElementSibling:{get:function(){for(var t=this.nextSibling;t&&1!=t.nodeType;)t=t.nextSibling;return t}},childElementCount:{get:function(){for(var t=0,e=this.childNodes||[],n=e.length;n--;t+=1==e[n].nodeType);return t}},addEventListener:{value:function(t,n,a){if("function"==typeof n||"object"==typeof n){var r,o,u=this,p="on"+t,l=u[m]||v(u,m,{value:{}})[m],f=l[p]||(l[p]={}),d=f.h||(f.h=[]);if(!y.call(f,"w")){if(f.w=function(t){return t[m]||e(u,c(u,t),d,!1)},!y.call(E,p))if(w.test(t)){try{r=document.createEventObject(),r[m]=!0,9!=u.nodeType&&(null==u.parentNode&&S.appendChild(u),(o=u.getAttribute(p))&&P.call(u,p)),u.fireEvent(p,r),E[p]=!0}catch(r){for(E[p]=!1;S.hasChildNodes();)S.removeChild(S.firstChild)}null!=o&&A.call(u,p,o)}else E[p]=!1;(f.n=E[p])&&u.attachEvent(p,f.w)}i(d,n)<0&&d[a?"unshift":"push"](n),"input"===t&&u.attachEvent("onkeyup",s)}}},dispatchEvent:{value:function(t){var n,a=this,r="on"+t.type,i=a[m],o=i&&i[r],s=!!o;return t.target||(t.target=a),s?o.n?a.fireEvent(r,t):e(a,t,o.h,!0):(n=a.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}},removeEventListener:{value:function(t,e,n){if("function"==typeof e||"object"==typeof e){var a=this,r="on"+t,o=a[m],s=o&&o[r],u=s&&s.h,p=u?i(u,e):-1;p>-1&&u.splice(p,1)}}}}),g(_,{addEventListener:{value:x.addEventListener},dispatchEvent:{value:x.dispatchEvent},removeEventListener:{value:x.removeEventListener}}),g(t.XMLHttpRequest.prototype,{addEventListener:{value:function(t,e,n){var a=this,r="on"+t,o=a[m]||v(a,m,{value:{}})[m],s=o[r]||(o[r]={}),u=s.h||(s.h=[]);i(u,e)<0&&(a[r]||(a[r]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),a.dispatchEvent(e)}),u[n?"unshift":"push"](e))}},dispatchEvent:{value:function(t){var n=this,a="on"+t.type,r=n[m],i=r&&r[a],o=!!i;return o&&(i.n?n.fireEvent(a,t):e(n,t,i.h,!0))}},removeEventListener:{value:x.removeEventListener}}),g(t.Event.prototype,{bubbles:{value:!0,writable:!0},cancelable:{value:!0,writable:!0},preventDefault:{value:function(){this.cancelable&&(this.defaultPrevented=!0,this.returnValue=!1)}},stopPropagation:{value:function(){this.stoppedPropagation=!0,this.cancelBubble=!0}},stopImmediatePropagation:{value:function(){this.stoppedImmediatePropagation=!0,this.stopPropagation()}},initEvent:{value:function(t,e,n){this.type=t,this.bubbles=!!e,this.cancelable=!!n,this.bubbles||this.stopPropagation()}}}),g(t.HTMLDocument.prototype,{defaultView:{get:function(){return this.parentWindow}},textContent:{get:function(){return 11===this.nodeType?o.call(this):null},set:function(t){11===this.nodeType&&p.call(this,t)}},addEventListener:{value:function(e,n,a){var r=this;x.addEventListener.call(r,e,n,a),l&&e===h&&!k.test(r.readyState)&&(l=!1,r.attachEvent(d,u),t==top&&!function i(t){try{r.documentElement.doScroll("left"),u()}catch(e){setTimeout(i,50)}}())}},dispatchEvent:{value:x.dispatchEvent},removeEventListener:{value:x.removeEventListener},createEvent:{value:function(t){var e;if("Event"!==t)throw Error("unsupported "+t);return e=document.createEventObject(),e.timeStamp=(new Date).getTime(),e}}}),g(t.Window.prototype,{getComputedStyle:{value:function(){function t(t){this._=t}function e(){}var n=/^(?:[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/,a=/^(top|right|bottom|left)$/,r=/\-([a-z])/g,i=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,u=this._,p=u.style,c=u.currentStyle,l=u.runtimeStyle;return t=("float"===t?"style-float":t).replace(r,i),e=c?c[t]:p[t],n.test(e)&&!a.test(t)&&(o=p.left,s=l&&l.left,s&&(l.left=c.left),p.left="fontSize"===t?"1em":e,e=p.pixelLeft+"px",p.left=o,s&&(l.left=s)),null==e?e:e+""||"auto"},e.prototype.getPropertyValue=function(){return null},function(n,a){return a?new e(n):new t(n)}}()},addEventListener:{value:function(n,a,r){var o,s=t,u="on"+n;s[u]||(s[u]=function(t){return e(s,c(s,t),o,!1)}),o=s[u][m]||(s[u][m]=[]),i(o,a)<0&&o[r?"unshift":"push"](a)}},dispatchEvent:{value:function(e){var n=t["on"+e.type];return n?n.call(t,e)!==!1&&!e.defaultPrevented:!0}},removeEventListener:{value:function(e,n,a){var r="on"+e,o=(t[r]||Object)[m],s=o?i(o,n):-1;s>-1&&o.splice(s,1)}}}),function(t,e,n){for(n=0;n=s)return(0,u["default"])({points:n});for(var l=1;s-1>=l;l++)i.push((0,p.times)(a,(0,p.minus)(n[l],n[l-1])));for(var f=[(0,p.plus)(n[0],c(i[0],i[1]))],l=1;s-2>=l;l++)f.push((0,p.minus)(n[l],(0,p.average)([i[l],i[l-1]])));f.push((0,p.minus)(n[s-1],c(i[s-2],i[s-3])));var d=f[0],h=f[1],m=n[0],v=n[1],g=(e=(0,o["default"])()).moveto.apply(e,r(m)).curveto(d[0],d[1],h[0],h[1],v[0],v[1]);return{path:(0,p.range)(2,s).reduce(function(t,e){var a=f[e],r=n[e];return t.smoothcurveto(a[0],a[1],r[0],r[1])},g),centroid:(0,p.average)(n)}},e.exports=n["default"]},{198:198,199:199,200:200}],196:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=t(197),o=a(i),s=t(198),u=1e-5,p=function(t,e){var n=t.map(e),a=n.sort(function(t,e){var n=r(t,2),a=n[0],i=(n[1],r(e,2)),o=i[0];i[1];return a-o}),i=a.length,o=a[0][0],p=a[i-1][0],c=(0,s.minBy)(a,function(t){return t[1]}),l=(0,s.maxBy)(a,function(t){return t[1]});return o==p&&(p+=u),c==l&&(l+=u),{points:a,xmin:o,xmax:p,ymin:c,ymax:l}};n["default"]=function(t){var e=t.data,n=t.xaccessor,a=t.yaccessor,i=t.width,u=t.height,c=t.closed,l=t.min,f=t.max;n||(n=function(t){var e=r(t,2),n=e[0];e[1];return n}),a||(a=function(t){var e=r(t,2),n=(e[0],e[1]);return n});var d=function(t){return[n(t),a(t)]},h=e.map(function(t){return p(t,d)}),m=(0,s.minBy)(h,function(t){return t.xmin}),v=(0,s.maxBy)(h,function(t){return t.xmax}),g=null==l?(0,s.minBy)(h,function(t){return t.ymin}):l,b=null==f?(0,s.maxBy)(h,function(t){return t.ymax}):f;c&&(g=Math.min(g,0),b=Math.max(b,0));var y=c?0:g,x=(0,o["default"])([m,v],[0,i]),_=(0,o["default"])([g,b],[u,0]),w=function(t){var e=r(t,2),n=e[0],a=e[1];return[x(n),_(a)]};return{arranged:h,scale:w,xscale:x,yscale:_,base:y}},e.exports=n["default"]},{197:197,198:198}],197:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t,e){var n=a(t,2),r=n[0],o=n[1],s=a(e,2),u=s[0],p=s[1],c=function(t){return u+(p-u)*(t-r)/(o-r)};return c.inverse=function(){return i([u,p],[r,o])},c};n["default"]=r,e.exports=n["default"]},{}],198:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function(t){return t.reduce(function(t,e){return t+e},0)},i=function(t){return t.reduce(function(t,e){return Math.min(t,e)})},o=function(t){return t.reduce(function(t,e){return Math.max(t,e)})},s=function(t,e){return t.reduce(function(t,n){return t+e(n)},0)},u=function(t,e){return t.reduce(function(t,n){return Math.min(t,e(n))},1/0)},p=function(t,e){return t.reduce(function(t,n){return Math.max(t,e(n))},-(1/0))},c=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r+s,i+u]},l=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r-s,i-u]},f=function(t,e){var n=a(e,2),r=n[0],i=n[1];return[t*r,t*i]},d=function(t){var e=a(t,2),n=e[0],r=e[1];return Math.sqrt(n*n+r*r)},h=function(t){return t.reduce(c,[0,0])},m=function(t){return f(1/t.length,t.reduce(c))},v=function(t,e){return f(t,[Math.sin(e),-Math.cos(e)])},g=function(t,e){var n=t||{};for(var a in n){var r=n[a];e[a]=r(e.index,e.item,e.group)}return e},b=function(t,e,n){for(var a=[],r=t;e>r;r++)a.push(r);return n&&a.push(e),a},y=function(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=Object.keys(t)[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,p=t[u];n.push(e(u,p))}}catch(c){r=!0,i=c}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n},x=function(t){return y(t,function(t,e){return[t,e]})},_=function(t){return t};n.sum=r,n.min=i,n.max=o,n.sumBy=s,n.minBy=u,n.maxBy=p,n.plus=c,n.minus=l,n.times=f,n.id=_,n.length=d,n.sumVectors=h,n.average=m,n.onCircle=v,n.enhance=g,n.range=b,n.mapObject=y,n.pairs=x,n["default"]={sum:r,min:i,max:o,sumBy:s,minBy:u,maxBy:p,plus:c,minus:l,times:f,id:_,length:d,sumVectors:h,average:m,onCircle:v,enhance:g,range:b,mapObject:y,pairs:x}},{}],199:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t){var e=t||[],n=function(t,e){var n=t.slice(0,t.length);return n.push(e),n},r=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return r===s&&i===u},o=function(t,e){for(var n=t.length;"0"===t.charAt(n-1);)n-=1;return"."===t.charAt(n-1)&&(n-=1),t.substr(0,n)},s=function(t,e){var n=t.toFixed(e);return o(n)},u=function(t){var e=t.command,n=t.params,a=n.map(function(t){return s(t,6)});return e+" "+a.join(" ")},p=function(t,e){var n=t.command,r=t.params,i=a(e,2),o=i[0],s=i[1];switch(n){case"M":return[r[0],r[1]];case"L":return[r[0],r[1]];case"H":return[r[0],s];case"V":return[o,r[0]];case"Z":return null;case"C":return[r[4],r[5]];case"S":return[r[2],r[3]];case"Q":return[r[2],r[3]];case"T":return[r[0],r[1]];case"A":return[r[5],r[6]]}},c=function(t,e){return function(n){var a="object"==typeof n?t.map(function(t){return n[t]}):arguments;return e.apply(null,a)}},l=function(t){return i(n(e,t))};return{moveto:c(["x","y"],function(t,e){return l({command:"M",params:[t,e]})}),lineto:c(["x","y"],function(t,e){return l({command:"L",params:[t,e]})}),hlineto:c(["x"],function(t){return l({command:"H",params:[t]})}),vlineto:c(["y"],function(t){return l({command:"V",params:[t]})}),closepath:function(){return l({command:"Z",params:[]})},curveto:c(["x1","y1","x2","y2","x","y"],function(t,e,n,a,r,i){return l({command:"C",params:[t,e,n,a,r,i]})}),smoothcurveto:c(["x2","y2","x","y"],function(t,e,n,a){return l({command:"S",params:[t,e,n,a]})}),qcurveto:c(["x1","y1","x","y"],function(t,e,n,a){return l({command:"Q",params:[t,e,n,a]})}),smoothqcurveto:c(["x","y"],function(t,e){return l({command:"T",params:[t,e]})}),arc:c(["rx","ry","xrot","largeArcFlag","sweepFlag","x","y"],function(t,e,n,a,r,i,o){return l({command:"A",params:[t,e,n,a,r,i,o]})}),print:function(){return e.map(u).join(" ")},points:function(){var t=[],n=[0,0],a=!0,r=!1,i=void 0;try{for(var o,s=e[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,c=p(u,n);n=c,c&&t.push(c)}}catch(l){r=!0,i=l}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return t},instructions:function(){return e.slice(0,e.length)},connect:function(t){var e=this.points(),n=e[e.length-1],a=t.points()[0],o=t.instructions().slice(1);return r(n,a)||o.unshift({command:"L",params:a}),i(this.instructions().concat(o))}}};n["default"]=function(){return r()},e.exports=n["default"]},{}],200:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1)for(var n=1;n1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];for(var r,i;i=n.shift();)for(r in i)Ro.call(i,r)&&(t[r]=i[r]);return t}function r(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function i(t){return"[object Array]"===jo.call(t)}function o(t){return Lo.test(jo.call(t))}function s(t,e){return null===t&&null===e?!0:"object"==typeof t||"object"==typeof e?!1:t===e}function u(t){return!isNaN(parseFloat(t))&&isFinite(t)}function p(t){return t&&"[object Object]"===jo.call(t)}function c(t,e){return t.replace(/%s/g,function(){return e.shift()})}function l(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];throw t=c(t,n),Error(t)}function f(){Rv.DEBUG&&Oo.apply(null,arguments)}function d(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),To(t,n)}function h(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),Do[t]||(Do[t]=!0,To(t,n))}function m(){Rv.DEBUG&&d.apply(null,arguments)}function v(){Rv.DEBUG&&h.apply(null,arguments)}function g(t,e,n){var a=b(t,e,n);return a?a[t][n]:null}function b(t,e,n){for(;e;){if(n in e[t])return e;if(e.isolated)return null;e=e.parent}}function y(t){return function(){return t}}function x(t){var e,n,a,r,i,o;for(e=t.split("."),(n=zo[e.length])||(n=_(e.length)),i=[],a=function(t,n){return t?"*":e[n]},r=n.length;r--;)o=n[r].map(a).join("."),i.hasOwnProperty(o)||(i.push(o),i[o]=!0);return i}function _(t){var e,n,a,r,i,o,s,u,p="";if(!zo[t]){for(a=[];p.length=i;i+=1){for(n=i.toString(2);n.lengtho;o++)u.push(r(n[o]));a[i]=u}zo[t]=a}return zo[t]}function w(t,e,n,a){var r=t[e];if(!r||!r.equalsOrStartsWith(a)&&r.equalsOrStartsWith(n))return t[e]=r?r.replace(n,a):a,!0}function k(t){var e=t.slice(2);return"i"===t[1]&&u(e)?+e:e}function E(t){return null==t?t:(Ko.hasOwnProperty(t)||(Ko[t]=new Qo(t)),Ko[t])}function S(t,e){function n(e,n){var a,r,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(a=t.viewmodel.wrapped[n.str],r=a?a.get():t.viewmodel.get(n),o=r?Object.keys(r):null),o&&o.forEach(function(t){"_ractive"===t&&i(r)||e.push(n.join(t))}),e}var a,r,o;for(a=e.str.split("."),o=[Yo];r=a.shift();)"*"===r?o=o.reduce(n,[]):o[0]===Yo?o[0]=E(r):o=o.map(C(r));return o}function C(t){return function(e){return e.join(t)}}function P(t){return t?t.replace(Wo,".$1"):""}function A(t,e,n){if("string"!=typeof e||!u(n))throw Error("Bad arguments");var a=void 0,r=void 0;if(/\*/.test(e))return r={},S(t,E(P(e))).forEach(function(e){var a=t.viewmodel.get(e);if(!u(a))throw Error(Xo);r[e.str]=a+n}),t.set(r);if(a=t.get(e),!u(a))throw Error(Xo);
-return t.set(e,+a+n)}function O(t,e){return Jo(this,t,void 0===e?1:+e)}function T(t){this.event=t,this.method="on"+t,this.deprecate=as[t]}function M(t,e){var n=t.indexOf(e);-1===n&&t.push(e)}function R(t,e){for(var n=0,a=t.length;a>n;n++)if(t[n]==e)return!0;return!1}function j(t,e){var n;if(!i(t)||!i(e))return!1;if(t.length!==e.length)return!1;for(n=t.length;n--;)if(t[n]!==e[n])return!1;return!0}function L(t){return"string"==typeof t?[t]:void 0===t?[]:t}function D(t){return t[t.length-1]}function N(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function F(t){for(var e=[],n=t.length;n--;)e[n]=t[n];return e}function I(t){setTimeout(t,0)}function B(t,e){return function(){for(var n;n=t.shift();)n(e)}}function q(t,e,n,a){var r;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");if(e instanceof rs)e.then(n,a);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{r=e.then}catch(i){return void a(i)}if("function"==typeof r){var o,s,u;s=function(e){o||(o=!0,q(t,e,n,a))},u=function(t){o||(o=!0,a(t))};try{r.call(e,s,u)}catch(i){if(!o)return a(i),void(o=!0)}}else n(e)}}function U(t,e,n){var a;return e=P(e),"~/"===e.substr(0,2)?(a=E(e.substring(2)),z(t,a.firstKey,n)):"."===e[0]?(a=G(cs(n),e),a&&z(t,a.firstKey,n)):a=V(t,E(e),n),a}function G(t,e){var n;if(void 0!=t&&"string"!=typeof t&&(t=t.str),"."===e)return E(t);if(n=t?t.split("."):[],"../"===e.substr(0,3)){for(;"../"===e.substr(0,3);){if(!n.length)throw Error('Could not resolve reference - too many "../" prefixes');n.pop(),e=e.substring(3)}return n.push(e),E(n.join("."))}return E(t?t+e.replace(/^\.\//,"."):e.replace(/^\.\/?/,""))}function V(t,e,n,a){var r,i,o,s,u;if(e.isRoot)return e;for(i=e.firstKey;n;)if(r=n.context,n=n.parent,r&&(s=!0,o=t.viewmodel.get(r),o&&("object"==typeof o||"function"==typeof o)&&i in o))return r.join(e.str);return W(t.viewmodel,i)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,i=E(i),u=V(t.parent,i,n,!0))?(t.viewmodel.map(i,{origin:t.parent.viewmodel,keypath:u}),e):a||s?void 0:(t.viewmodel.set(e,void 0),e)}function z(t,e){var n;!t.parent||t.isolated||W(t.viewmodel,e)||(e=E(e),(n=V(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function W(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function H(t){t.teardown()}function K(t){t.unbind()}function Q(t){t.unrender()}function $(t){t.cancel()}function Y(t){t.detach()}function J(t){t.detachNodes()}function X(t){!t.ready||t.outros.length||t.outroChildren||(t.outrosComplete||(t.parent?t.parent.decrementOutros(t):t.detachNodes(),t.outrosComplete=!0),t.intros.length||t.totalChildren||("function"==typeof t.callback&&t.callback(),t.parent&&t.parent.decrementTotal()))}function Z(){for(var t,e,n;ds.ractives.length;)e=ds.ractives.pop(),n=e.viewmodel.applyChanges(),n&&gs.fire(e,n);for(tt(),t=0;t=0;i--)r=t._subs[e[i]],r&&(s=gt(t,r,n,a)&&s);if(Vs.dequeue(t),t.parent&&s){if(o&&t.component){var u=t.component.name+"."+e[e.length-1];e=E(u).wildcardMatches(),n&&(n.component=t)}vt(t.parent,e,n,a)}}function gt(t,e,n,a){var r=null,i=!1;n&&!n._noArg&&(a=[n].concat(a)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,a)===!1&&(i=!0);return n&&!n._noArg&&i&&(r=n.original)&&(r.preventDefault&&r.preventDefault(),r.stopPropagation&&r.stopPropagation()),!i}function bt(t){var e={args:Array.prototype.slice.call(arguments,1)};zs(this,t,e)}function yt(t){var e;return t=E(P(t)),e=this.viewmodel.get(t,Ks),void 0===e&&this.parent&&!this.isolated&&ls(this,t.str,this.component.parentFragment)&&(e=this.viewmodel.get(t)),e}function xt(e,n){if(!this.fragment.rendered)throw Error("The API has changed - you must call `ractive.render(target[, anchor])` to render your Ractive instance. Once rendered you can use `ractive.insert()`.");if(e=t(e),n=t(n)||null,!e)throw Error("You must specify a valid target to insert into");e.insertBefore(this.detach(),n),this.el=e,(e.__ractive_instances__||(e.__ractive_instances__=[])).push(this),this.detached=null,_t(this)}function _t(t){$s.fire(t),t.findAllComponents("*").forEach(function(t){_t(t.instance)})}function wt(t,e,n){var a,r;return t=E(P(t)),a=this.viewmodel.get(t),i(a)&&i(e)?(r=bs.start(this,!0),this.viewmodel.merge(t,a,e,n),bs.end(),r):this.set(t,e,n&&n.complete)}function kt(t,e){var n,a;return n=S(t,e),a={},n.forEach(function(e){a[e.str]=t.get(e.str)}),a}function Et(t,e,n,a){var r,i,o;e=E(P(e)),a=a||cu,e.isPattern?(r=new uu(t,e,n,a),t.viewmodel.patternObservers.push(r),i=!0):r=new Zs(t,e,n,a),r.init(a.init),t.viewmodel.register(e,r,i?"patternObservers":"observers"),r.ready=!0;var s={cancel:function(){var n;o||(i?(n=t.viewmodel.patternObservers.indexOf(r),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,r,"patternObservers")):t.viewmodel.unregister(e,r,"observers"),o=!0)}};return t._observers.push(s),s}function St(t,e,n){var a,r,i,o;if(p(t)){n=e,r=t,a=[];for(t in r)r.hasOwnProperty(t)&&(e=r[t],a.push(this.observe(t,e,n)));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",pu(this,t,e,n);if(i=t.split(" "),1===i.length)return pu(this,t,e,n);for(a=[],o=i.length;o--;)t=i[o],t&&a.push(pu(this,t,e,n));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}function Ct(t,e,n){var a=this.observe(t,function(){e.apply(this,arguments),a.cancel()},{init:!1,defer:n&&n.defer});return a}function Pt(t,e){var n,a=this;if(t)n=t.split(" ").map(du).filter(hu),n.forEach(function(t){var n,r;(n=a._subs[t])&&(e?(r=n.indexOf(e),-1!==r&&n.splice(r,1)):a._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function At(t,e){var n,a,r,i=this;if("object"==typeof t){n=[];for(a in t)t.hasOwnProperty(a)&&n.push(this.on(a,t[a]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return r=t.split(" ").map(du).filter(hu),r.forEach(function(t){(i._subs[t]||(i._subs[t]=[])).push(e)}),{cancel:function(){return i.off(t,e)}}}function Ot(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function Tt(t,e,n){var a,r,i,o,s,u,p=[];if(a=Mt(t,e,n),!a)return null;for(r=t.length,s=a.length-2-a[1],i=Math.min(r,a[0]),o=i+a[1],u=0;i>u;u+=1)p.push(u);for(;o>u;u+=1)p.push(-1);for(;r>u;u+=1)p.push(u+s);return 0!==s?p.touchedFrom=a[0]:p.touchedFrom=t.length,p}function Mt(t,e,n){switch(e){case"splice":for(void 0!==n[0]&&n[0]<0&&(n[0]=t.length+Math.max(n[0],-t.length));n.length<2;)n.push(0);return n[1]=Math.min(n[1],t.length-n[0]),n;case"sort":case"reverse":return null;case"pop":return t.length?[t.length-1,1]:[0,0];case"push":return[t.length,0].concat(n);case"shift":return[0,t.length?1:0];case"unshift":return[0,0].concat(n)}}function Rt(e,n){var a,r,i,o=this;if(i=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),a=bs.start(this,!0),bs.scheduleTask(function(){return Mu.fire(o)},!0),this.fragment.rendered)throw Error("You cannot call ractive.render() on an already rendered instance! Call ractive.unrender() first");if(e=t(e)||this.el,n=t(n)||this.anchor,this.el=e,this.anchor=n,!this.append&&e){var s=e.__ractive_instances__;s&&s.length&&jt(s),e.innerHTML=""}return this.cssId&&Ou.apply(),e&&((r=e.__ractive_instances__)?r.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),bs.end(),this.transitionsEnabled=i,a.then(function(){return Ru.fire(o)})}function jt(t){t.splice(0,t.length).forEach(H)}function Lt(t,e){for(var n=t.slice(),a=e.length;a--;)~n.indexOf(e[a])||n.push(e[a]);return n}function Dt(t,e){var n,a,r;return a='[data-ractive-css~="{'+e+'}"]',r=function(t){var e,n,r,i,o,s,u,p=[];for(e=[];n=Iu.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(i=e.map(Ft),u=e.length;u--;)s=i.slice(),r=e[u],s[u]=r.base+a+r.modifiers||"",o=i.slice(),o[u]=a+" "+o[u],p.push(s.join(" "),o.join(" "));return p.join(", ")},n=qu.test(t)?t.replace(qu,a):t.replace(Fu,"").replace(Nu,function(t,e){var n,a;return Bu.test(e)?t:(n=e.split(",").map(Nt),a=n.map(r).join(", ")+" ",t.replace(e,a))})}function Nt(t){return t.trim?t.trim():t.replace(/^\s+/,"").replace(/\s+$/,"")}function Ft(t){return t.str}function It(t){t&&t.constructor!==Object&&("function"==typeof t||("object"!=typeof t?l("data option must be an object or a function, `"+t+"` is not valid"):m("If supplied, options.data should be a plain JavaScript object - using a non-POJO as the root object may work, but is discouraged")))}function Bt(t,e){It(e);var n="function"==typeof t,a="function"==typeof e;return e||n||(e={}),n||a?function(){var r=a?qt(e,this):e,i=n?qt(t,this):t;return Ut(r,i)}:Ut(e,t)}function qt(t,e){var n=t.call(e);if(n)return"object"!=typeof n&&l("Data function must return an object"),n.constructor!==Object&&v("Data function returned something other than a plain JavaScript object. This might work, but is strongly discouraged"),n}function Ut(t,e){if(t&&e){for(var n in e)n in t||(t[n]=e[n]);return t}return t||e}function Gt(t){var e=Eo(Qu);return e.parse=function(e,n){return Vt(e,n||t)},e}function Vt(t,e){if(!Hu)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Hu(t,e||this.options)}function zt(t,e){var n;if(!Xi){if(e&&e.noThrow)return;throw Error("Cannot retrieve template #"+t+" as Ractive is not running in a browser.")}if(Wt(t)&&(t=t.substring(1)),!(n=document.getElementById(t))){if(e&&e.noThrow)return;throw Error("Could not find template element with id #"+t)}if("SCRIPT"!==n.tagName.toUpperCase()){if(e&&e.noThrow)return;throw Error("Template element with id #"+t+", must be a i;)c(r,a=t[i++])&&(~S(o,a)||o.push(a));return o}},B=function(){};i(i.S,"Object",{getPrototypeOf:r.getProto=r.getProto||function(t){return t=g(t),c(t,k)?t[k]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?C:null},getOwnPropertyNames:r.getNames=r.getNames||I(D,D.length,!0),create:r.create=r.create||function(t,e){var n;return null!==t?(B.prototype=h(t),n=new B,B.prototype=null,n[k]=t):n=F(),void 0===e?n:j(n,e)},keys:r.getKeys=r.getKeys||I(L,N,!1)});var q=function(t,e,n){if(!(e in M)){for(var a=[],r=0;e>r;r++)a[r]="a["+r+"]";M[e]=Function("F,a","return new F("+a.join(",")+")")}return M[e](t,n)};i(i.P,"Function",{bind:function(t){var e=m(this),n=A.call(arguments,1),a=function(){var r=n.concat(A.call(arguments));return this instanceof a?q(e,r.length,r):f(e,r,t)};return v(e.prototype)&&(a.prototype=e.prototype),a}}),i(i.P+i.F*d(function(){u&&A.call(u)}),"Array",{slice:function(t,e){var n=_(this.length),a=l(this);if(e=void 0===e?n:e,"Array"==a)return A.call(this,t,e);for(var r=x(t,n),i=x(e,n),o=_(i-r),s=Array(o),u=0;o>u;u++)s[u]="String"==a?this.charAt(r+u):this[r+u];return s}}),i(i.P+i.F*(w!=Object),"Array",{join:function(t){return O.call(w(this),void 0===t?",":t)}}),i(i.S,"Array",{isArray:t(36)});var G=function(t){return function(e,n){m(e);var a=w(this),r=_(a.length),i=t?r-1:0,o=t?-1:1;if(arguments.length<2)for(;;){if(i in a){n=a[i],i+=o;break}if(i+=o,t?0>i:i>=r)throw TypeError("Reduce of empty array with no initial value")}for(;t?i>=0:r>i;i+=o)i in a&&(n=e(n,a[i],i,this));return n}},U=function(t){return function(e){return t(this,e,arguments[1])}};i(i.P,"Array",{forEach:r.each=r.each||U(E(0)),map:U(E(1)),filter:U(E(2)),some:U(E(3)),every:U(E(4)),reduce:G(!1),reduceRight:G(!0),indexOf:U(S),lastIndexOf:function(t,e){var n=b(this),a=_(n.length),r=a-1;for(arguments.length>1&&(r=Math.min(r,y(e))),0>r&&(r=_(a+r));r>=0;r--)if(r in n&&n[r]===t)return r;return-1}}),i(i.S,"Date",{now:function(){return+new Date}});var V=function(t){return t>9?t:"0"+t};i(i.P+i.F*(d(function(){return"0385-07-25T07:06:39.999Z"!=new Date(-5e13-1).toISOString()})||!d(function(){new Date(NaN).toISOString()})),"Date",{toISOString:function(){if(!isFinite(this))throw RangeError("Invalid time value");var t=this,e=t.getUTCFullYear(),n=t.getUTCMilliseconds(),a=0>e?"-":e>9999?"+":"";return a+("00000"+Math.abs(e)).slice(a?-6:-4)+"-"+V(t.getUTCMonth()+1)+"-"+V(t.getUTCDate())+"T"+V(t.getUTCHours())+":"+V(t.getUTCMinutes())+":"+V(t.getUTCSeconds())+"."+(n>99?n:"0"+V(n))+"Z"}})},{11:11,19:19,2:2,20:20,22:22,24:24,30:30,32:32,33:33,34:34,36:36,38:38,4:4,46:46,59:59,7:7,76:76,77:77,78:78,79:79,8:8,80:80,82:82}],86:[function(t,e,n){var a=t(22);a(a.P,"Array",{copyWithin:t(5)}),t(3)("copyWithin")},{22:22,3:3,5:5}],87:[function(t,e,n){var a=t(22);a(a.P,"Array",{fill:t(6)}),t(3)("fill")},{22:22,3:3,6:6}],88:[function(t,e,n){"use strict";var a=t(22),r=t(8)(6),i="findIndex",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{findIndex:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],89:[function(t,e,n){"use strict";var a=t(22),r=t(8)(5),i="find",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{find:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],90:[function(t,e,n){"use strict";var a=t(17),r=t(22),i=t(80),o=t(40),s=t(35),u=t(79),p=t(84);r(r.S+r.F*!t(43)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,r,c,l=i(t),f="function"==typeof this?this:Array,d=arguments,h=d.length,m=h>1?d[1]:void 0,v=void 0!==m,g=0,b=p(l);if(v&&(m=a(m,h>2?d[2]:void 0,2)),void 0==b||f==Array&&s(b))for(e=u(l.length),n=new f(e);e>g;g++)n[g]=v?m(l[g],g):l[g];else for(c=b.call(l),n=new f;!(r=c.next()).done;g++)n[g]=v?o(c,m,[r.value,g],!0):r.value;return n.length=g,n}})},{17:17,22:22,35:35,40:40,43:43,79:79,80:80,84:84}],91:[function(t,e,n){"use strict";var a=t(3),r=t(44),i=t(45),o=t(78);e.exports=t(42)(Array,"Array",function(t,e){this._t=o(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,r(1)):"keys"==e?r(0,n):"values"==e?r(0,t[n]):r(0,[n,t[n]])},"values"),i.Arguments=i.Array,a("keys"),a("values"),a("entries")},{3:3,42:42,44:44,45:45,78:78}],92:[function(t,e,n){"use strict";var a=t(22);a(a.S+a.F*t(24)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,e=arguments,n=e.length,a=new("function"==typeof this?this:Array)(n);n>t;)a[t]=e[t++];return a.length=n,a}})},{22:22,24:24}],93:[function(t,e,n){t(65)("Array")},{65:65}],94:[function(t,e,n){"use strict";var a=t(46),r=t(38),i=t(83)("hasInstance"),o=Function.prototype;i in o||a.setDesc(o,i,{value:function(t){if("function"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=a.getProto(t);)if(this.prototype===t)return!0;return!1}})},{38:38,46:46,83:83}],95:[function(t,e,n){var a=t(46).setDesc,r=t(59),i=t(30),o=Function.prototype,s=/^\s*function ([^ (]*)/,u="name";u in o||t(19)&&a(o,u,{configurable:!0,get:function(){var t=(""+this).match(s),e=t?t[1]:"";return i(this,u)||a(this,u,r(5,e)),e}})},{19:19,30:30,46:46,59:59}],96:[function(t,e,n){"use strict";var a=t(12);t(15)("Map",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=a.getEntry(this,t);return e&&e.v},set:function(t,e){return a.def(this,0===t?0:t,e)}},a,!0)},{12:12,15:15}],97:[function(t,e,n){var a=t(22),r=t(50),i=Math.sqrt,o=Math.acosh;a(a.S+a.F*!(o&&710==Math.floor(o(Number.MAX_VALUE))),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:r(t-1+i(t-1)*i(t+1))}})},{22:22,50:50}],98:[function(t,e,n){function a(t){return isFinite(t=+t)&&0!=t?0>t?-a(-t):Math.log(t+Math.sqrt(t*t+1)):t}var r=t(22);r(r.S,"Math",{asinh:a})},{22:22}],99:[function(t,e,n){var a=t(22);a(a.S,"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},{22:22}],100:[function(t,e,n){var a=t(22),r=t(51);a(a.S,"Math",{cbrt:function(t){return r(t=+t)*Math.pow(Math.abs(t),1/3)}})},{22:22,51:51}],101:[function(t,e,n){var a=t(22);a(a.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},{22:22}],102:[function(t,e,n){var a=t(22),r=Math.exp;a(a.S,"Math",{cosh:function(t){return(r(t=+t)+r(-t))/2}})},{22:22}],103:[function(t,e,n){var a=t(22);a(a.S,"Math",{expm1:t(49)})},{22:22,49:49}],104:[function(t,e,n){var a=t(22),r=t(51),i=Math.pow,o=i(2,-52),s=i(2,-23),u=i(2,127)*(2-s),p=i(2,-126),c=function(t){return t+1/o-1/o};a(a.S,"Math",{fround:function(t){var e,n,a=Math.abs(t),i=r(t);return p>a?i*c(a/p/s)*p*s:(e=(1+s/o)*a,n=e-(e-a),n>u||n!=n?i*(1/0):i*n)}})},{22:22,51:51}],105:[function(t,e,n){var a=t(22),r=Math.abs;a(a.S,"Math",{hypot:function(t,e){for(var n,a,i=0,o=0,s=arguments,u=s.length,p=0;u>o;)n=r(s[o++]),n>p?(a=p/n,i=i*a*a+1,p=n):n>0?(a=n/p,i+=a*a):i+=n;return p===1/0?1/0:p*Math.sqrt(i)}})},{22:22}],106:[function(t,e,n){var a=t(22),r=Math.imul;a(a.S+a.F*t(24)(function(){return-5!=r(4294967295,5)||2!=r.length}),"Math",{imul:function(t,e){var n=65535,a=+t,r=+e,i=n&a,o=n&r;return 0|i*o+((n&a>>>16)*o+i*(n&r>>>16)<<16>>>0)}})},{22:22,24:24}],107:[function(t,e,n){var a=t(22);a(a.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},{22:22}],108:[function(t,e,n){var a=t(22);a(a.S,"Math",{log1p:t(50)})},{22:22,50:50}],109:[function(t,e,n){var a=t(22);a(a.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{22:22}],110:[function(t,e,n){var a=t(22);a(a.S,"Math",{sign:t(51)})},{22:22,51:51}],111:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S+a.F*t(24)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(r(t)-r(-t))/2:(i(t-1)-i(-t-1))*(Math.E/2)}})},{22:22,24:24,49:49}],112:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S,"Math",{tanh:function(t){var e=r(t=+t),n=r(-t);return e==1/0?1:n==1/0?-1:(e-n)/(i(t)+i(-t))}})},{22:22,49:49}],113:[function(t,e,n){var a=t(22);a(a.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{22:22}],114:[function(t,e,n){"use strict";var a=t(46),r=t(29),i=t(30),o=t(11),s=t(81),u=t(24),p=t(74).trim,c="Number",l=r[c],f=l,d=l.prototype,h=o(a.create(d))==c,m="trim"in String.prototype,v=function(t){
+var e=s(t,!1);if("string"==typeof e&&e.length>2){e=m?e.trim():p(e,3);var n,a,r,i=e.charCodeAt(0);if(43===i||45===i){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===i){switch(e.charCodeAt(1)){case 66:case 98:a=2,r=49;break;case 79:case 111:a=8,r=55;break;default:return+e}for(var o,u=e.slice(2),c=0,l=u.length;l>c;c++)if(o=u.charCodeAt(c),48>o||o>r)return NaN;return parseInt(u,a)}}return+e};l(" 0o1")&&l("0b1")&&!l("+0x1")||(l=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof l&&(h?u(function(){d.valueOf.call(n)}):o(n)!=c)?new f(v(e)):v(e)},a.each.call(t(19)?a.getNames(f):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),function(t){i(f,t)&&!i(l,t)&&a.setDesc(l,t,a.getDesc(f,t))}),l.prototype=d,d.constructor=l,t(61)(r,c,l))},{11:11,19:19,24:24,29:29,30:30,46:46,61:61,74:74,81:81}],115:[function(t,e,n){var a=t(22);a(a.S,"Number",{EPSILON:Math.pow(2,-52)})},{22:22}],116:[function(t,e,n){var a=t(22),r=t(29).isFinite;a(a.S,"Number",{isFinite:function(t){return"number"==typeof t&&r(t)}})},{22:22,29:29}],117:[function(t,e,n){var a=t(22);a(a.S,"Number",{isInteger:t(37)})},{22:22,37:37}],118:[function(t,e,n){var a=t(22);a(a.S,"Number",{isNaN:function(t){return t!=t}})},{22:22}],119:[function(t,e,n){var a=t(22),r=t(37),i=Math.abs;a(a.S,"Number",{isSafeInteger:function(t){return r(t)&&i(t)<=9007199254740991}})},{22:22,37:37}],120:[function(t,e,n){var a=t(22);a(a.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{22:22}],121:[function(t,e,n){var a=t(22);a(a.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{22:22}],122:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseFloat:parseFloat})},{22:22}],123:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseInt:parseInt})},{22:22}],124:[function(t,e,n){var a=t(22);a(a.S+a.F,"Object",{assign:t(53)})},{22:22,53:53}],125:[function(t,e,n){var a=t(38);t(54)("freeze",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],126:[function(t,e,n){var a=t(78);t(54)("getOwnPropertyDescriptor",function(t){return function(e,n){return t(a(e),n)}})},{54:54,78:78}],127:[function(t,e,n){t(54)("getOwnPropertyNames",function(){return t(28).get})},{28:28,54:54}],128:[function(t,e,n){var a=t(80);t(54)("getPrototypeOf",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],129:[function(t,e,n){var a=t(38);t(54)("isExtensible",function(t){return function(e){return a(e)?t?t(e):!0:!1}})},{38:38,54:54}],130:[function(t,e,n){var a=t(38);t(54)("isFrozen",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],131:[function(t,e,n){var a=t(38);t(54)("isSealed",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],132:[function(t,e,n){var a=t(22);a(a.S,"Object",{is:t(63)})},{22:22,63:63}],133:[function(t,e,n){var a=t(80);t(54)("keys",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],134:[function(t,e,n){var a=t(38);t(54)("preventExtensions",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],135:[function(t,e,n){var a=t(38);t(54)("seal",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],136:[function(t,e,n){var a=t(22);a(a.S,"Object",{setPrototypeOf:t(64).set})},{22:22,64:64}],137:[function(t,e,n){"use strict";var a=t(10),r={};r[t(83)("toStringTag")]="z",r+""!="[object z]"&&t(61)(Object.prototype,"toString",function(){return"[object "+a(this)+"]"},!0)},{10:10,61:61,83:83}],138:[function(t,e,n){"use strict";var a,r=t(46),i=t(48),o=t(29),s=t(17),u=t(10),p=t(22),c=t(38),l=t(4),f=t(2),d=t(69),h=t(27),m=t(64).set,v=t(63),g=t(83)("species"),b=t(68),y=t(52),x="Promise",_=o.process,w="process"==u(_),k=o[x],E=function(){},S=function(t){var e,n=new k(E);return t&&(n.constructor=function(t){t(E,E)}),(e=k.resolve(n))["catch"](E),e===n},C=function(){function e(t){var n=new k(t);return m(n,e.prototype),n}var n=!1;try{if(n=k&&k.resolve&&S(),m(e,k),e.prototype=r.create(k.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(n=!1),n&&t(19)){var a=!1;k.resolve(r.setDesc({},"then",{get:function(){a=!0}})),n=a}}catch(i){n=!1}return n}(),P=function(t,e){return i&&t===k&&e===a?!0:v(t,e)},A=function(t){var e=l(t)[g];return void 0!=e?e:t},O=function(t){var e;return c(t)&&"function"==typeof(e=t.then)?e:!1},T=function(t){var e,n;this.promise=new t(function(t,a){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=a}),this.resolve=f(e),this.reject=f(n)},R=function(t){try{t()}catch(e){return{error:e}}},j=function(t,e){if(!t.n){t.n=!0;var n=t.c;y(function(){for(var a=t.v,r=1==t.s,i=0,s=function(e){var n,i,o=r?e.ok:e.fail,s=e.resolve,u=e.reject;try{o?(r||(t.h=!0),n=o===!0?a:o(a),n===e.promise?u(TypeError("Promise-chain cycle")):(i=O(n))?i.call(n,s,u):s(n)):u(a)}catch(p){u(p)}};n.length>i;)s(n[i++]);n.length=0,t.n=!1,e&&setTimeout(function(){var e,n,r=t.p;M(r)&&(w?_.emit("unhandledRejection",a,r):(e=o.onunhandledrejection)?e({promise:r,reason:a}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",a)),t.a=void 0},1)})}},M=function(t){var e,n=t._d,a=n.a||n.c,r=0;if(n.h)return!1;for(;a.length>r;)if(e=a[r++],e.fail||!M(e.promise))return!1;return!0},L=function(t){var e=this;e.d||(e.d=!0,e=e.r||e,e.v=t,e.s=2,e.a=e.c.slice(),j(e,!0))},D=function(t){var e,n=this;if(!n.d){n.d=!0,n=n.r||n;try{if(n.p===t)throw TypeError("Promise can't be resolved itself");(e=O(t))?y(function(){var a={r:n,d:!1};try{e.call(t,s(D,a,1),s(L,a,1))}catch(r){L.call(a,r)}}):(n.v=t,n.s=1,j(n,!1))}catch(a){L.call({r:n,d:!1},a)}}};C||(k=function(t){f(t);var e=this._d={p:d(this,k,x),c:[],a:void 0,s:0,d:!1,v:void 0,h:!1,n:!1};try{t(s(D,e,1),s(L,e,1))}catch(n){L.call(e,n)}},t(60)(k.prototype,{then:function(t,e){var n=new T(b(this,k)),a=n.promise,r=this._d;return n.ok="function"==typeof t?t:!0,n.fail="function"==typeof e&&e,r.c.push(n),r.a&&r.a.push(n),r.s&&j(r,!1),a},"catch":function(t){return this.then(void 0,t)}})),p(p.G+p.W+p.F*!C,{Promise:k}),t(66)(k,x),t(65)(x),a=t(16)[x],p(p.S+p.F*!C,x,{reject:function(t){var e=new T(this),n=e.reject;return n(t),e.promise}}),p(p.S+p.F*(!C||S(!0)),x,{resolve:function(t){if(t instanceof k&&P(t.constructor,this))return t;var e=new T(this),n=e.resolve;return n(t),e.promise}}),p(p.S+p.F*!(C&&t(43)(function(t){k.all(t)["catch"](function(){})})),x,{all:function(t){var e=A(this),n=new T(e),a=n.resolve,i=n.reject,o=[],s=R(function(){h(t,!1,o.push,o);var n=o.length,s=Array(n);n?r.each.call(o,function(t,r){var o=!1;e.resolve(t).then(function(t){o||(o=!0,s[r]=t,--n||a(s))},i)}):a(s)});return s&&i(s.error),n.promise},race:function(t){var e=A(this),n=new T(e),a=n.reject,r=R(function(){h(t,!1,function(t){e.resolve(t).then(n.resolve,a)})});return r&&a(r.error),n.promise}})},{10:10,16:16,17:17,19:19,2:2,22:22,27:27,29:29,38:38,4:4,43:43,46:46,48:48,52:52,60:60,63:63,64:64,65:65,66:66,68:68,69:69,83:83}],139:[function(t,e,n){var a=t(22),r=Function.apply,i=t(4);a(a.S,"Reflect",{apply:function(t,e,n){return r.call(t,e,i(n))}})},{22:22,4:4}],140:[function(t,e,n){var a=t(46),r=t(22),i=t(2),o=t(4),s=t(38),u=Function.bind||t(16).Function.prototype.bind;r(r.S+r.F*t(24)(function(){function t(){}return!(Reflect.construct(function(){},[],t)instanceof t)}),"Reflect",{construct:function(t,e){i(t),o(e);var n=arguments.length<3?t:i(arguments[2]);if(t==n){switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var r=[null];return r.push.apply(r,e),new(u.apply(t,r))}var p=n.prototype,c=a.create(s(p)?p:Object.prototype),l=Function.apply.call(t,c,e);return s(l)?l:c}})},{16:16,2:2,22:22,24:24,38:38,4:4,46:46}],141:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S+r.F*t(24)(function(){Reflect.defineProperty(a.setDesc({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t);try{return a.setDesc(t,e,n),!0}catch(r){return!1}}})},{22:22,24:24,4:4,46:46}],142:[function(t,e,n){var a=t(22),r=t(46).getDesc,i=t(4);a(a.S,"Reflect",{deleteProperty:function(t,e){var n=r(i(t),e);return n&&!n.configurable?!1:delete t[e]}})},{22:22,4:4,46:46}],143:[function(t,e,n){"use strict";var a=t(22),r=t(4),i=function(t){this._t=r(t),this._i=0;var e,n=this._k=[];for(e in t)n.push(e)};t(41)(i,"Object",function(){var t,e=this,n=e._k;do if(e._i>=n.length)return{value:void 0,done:!0};while(!((t=n[e._i++])in e._t));return{value:t,done:!1}}),a(a.S,"Reflect",{enumerate:function(t){return new i(t)}})},{22:22,4:4,41:41}],144:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return a.getDesc(i(t),e)}})},{22:22,4:4,46:46}],145:[function(t,e,n){var a=t(22),r=t(46).getProto,i=t(4);a(a.S,"Reflect",{getPrototypeOf:function(t){return r(i(t))}})},{22:22,4:4,46:46}],146:[function(t,e,n){function a(t,e){var n,o,p=arguments.length<3?t:arguments[2];return u(t)===p?t[e]:(n=r.getDesc(t,e))?i(n,"value")?n.value:void 0!==n.get?n.get.call(p):void 0:s(o=r.getProto(t))?a(o,e,p):void 0}var r=t(46),i=t(30),o=t(22),s=t(38),u=t(4);o(o.S,"Reflect",{get:a})},{22:22,30:30,38:38,4:4,46:46}],147:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{has:function(t,e){return e in t}})},{22:22}],148:[function(t,e,n){var a=t(22),r=t(4),i=Object.isExtensible;a(a.S,"Reflect",{isExtensible:function(t){return r(t),i?i(t):!0}})},{22:22,4:4}],149:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{ownKeys:t(56)})},{22:22,56:56}],150:[function(t,e,n){var a=t(22),r=t(4),i=Object.preventExtensions;a(a.S,"Reflect",{preventExtensions:function(t){r(t);try{return i&&i(t),!0}catch(e){return!1}}})},{22:22,4:4}],151:[function(t,e,n){var a=t(22),r=t(64);r&&a(a.S,"Reflect",{setPrototypeOf:function(t,e){r.check(t,e);try{return r.set(t,e),!0}catch(n){return!1}}})},{22:22,64:64}],152:[function(t,e,n){function a(t,e,n){var o,c,l=arguments.length<4?t:arguments[3],f=r.getDesc(u(t),e);if(!f){if(p(c=r.getProto(t)))return a(c,e,n,l);f=s(0)}return i(f,"value")?f.writable!==!1&&p(l)?(o=r.getDesc(l,e)||s(0),o.value=n,r.setDesc(l,e,o),!0):!1:void 0===f.set?!1:(f.set.call(l,n),!0)}var r=t(46),i=t(30),o=t(22),s=t(59),u=t(4),p=t(38);o(o.S,"Reflect",{set:a})},{22:22,30:30,38:38,4:4,46:46,59:59}],153:[function(t,e,n){var a=t(46),r=t(29),i=t(39),o=t(26),s=r.RegExp,u=s,p=s.prototype,c=/a/g,l=/a/g,f=new s(c)!==c;!t(19)||f&&!t(24)(function(){return l[t(83)("match")]=!1,s(c)!=c||s(l)==l||"/a/i"!=s(c,"i")})||(s=function(t,e){var n=i(t),a=void 0===e;return this instanceof s||!n||t.constructor!==s||!a?f?new u(n&&!a?t.source:t,e):u((n=t instanceof s)?t.source:t,n&&a?o.call(t):e):t},a.each.call(a.getNames(u),function(t){t in s||a.setDesc(s,t,{configurable:!0,get:function(){return u[t]},set:function(e){u[t]=e}})}),p.constructor=s,s.prototype=p,t(61)(r,"RegExp",s)),t(65)("RegExp")},{19:19,24:24,26:26,29:29,39:39,46:46,61:61,65:65,83:83}],154:[function(t,e,n){var a=t(46);t(19)&&"g"!=/./g.flags&&a.setDesc(RegExp.prototype,"flags",{configurable:!0,get:t(26)})},{19:19,26:26,46:46}],155:[function(t,e,n){t(25)("match",1,function(t,e){return function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],156:[function(t,e,n){t(25)("replace",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],157:[function(t,e,n){t(25)("search",1,function(t,e){return function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],158:[function(t,e,n){t(25)("split",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],159:[function(t,e,n){"use strict";var a=t(12);t(15)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t=0===t?0:t,t)}},a)},{12:12,15:15}],160:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!1);a(a.P,"String",{codePointAt:function(t){return r(this,t)}})},{22:22,70:70}],161:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="endsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{endsWith:function(t){var e=i(this,t,o),n=arguments,a=n.length>1?n[1]:void 0,u=r(e.length),p=void 0===a?u:Math.min(r(a),u),c=t+"";return s?s.call(e,c,p):e.slice(p-c.length,p)===c}})},{22:22,23:23,71:71,79:79}],162:[function(t,e,n){var a=t(22),r=t(76),i=String.fromCharCode,o=String.fromCodePoint;a(a.S+a.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],a=arguments,o=a.length,s=0;o>s;){if(e=+a[s++],r(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(65536>e?i(e):i(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},{22:22,76:76}],163:[function(t,e,n){"use strict";var a=t(22),r=t(71),i="includes";a(a.P+a.F*t(23)(i),"String",{includes:function(t){return!!~r(this,t,i).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},{22:22,23:23,71:71}],164:[function(t,e,n){"use strict";var a=t(70)(!0);t(42)(String,"String",function(t){this._t=t+"",this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=a(e,n),this._i+=t.length,{value:t,done:!1})})},{42:42,70:70}],165:[function(t,e,n){var a=t(22),r=t(78),i=t(79);a(a.S,"String",{raw:function(t){for(var e=r(t.raw),n=i(e.length),a=arguments,o=a.length,s=[],u=0;n>u;)s.push(e[u++]+""),o>u&&s.push(a[u]+"");return s.join("")}})},{22:22,78:78,79:79}],166:[function(t,e,n){var a=t(22);a(a.P,"String",{repeat:t(73)})},{22:22,73:73}],167:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="startsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{startsWith:function(t){var e=i(this,t,o),n=arguments,a=r(Math.min(n.length>1?n[1]:void 0,e.length)),u=t+"";return s?s.call(e,u,a):e.slice(a,a+u.length)===u}})},{22:22,23:23,71:71,79:79}],168:[function(t,e,n){"use strict";t(74)("trim",function(t){return function(){return t(this,3)}})},{74:74}],169:[function(t,e,n){"use strict";var a=t(46),r=t(29),i=t(30),o=t(19),s=t(22),u=t(61),p=t(24),c=t(67),l=t(66),f=t(82),d=t(83),h=t(47),m=t(28),v=t(21),g=t(36),b=t(4),y=t(78),x=t(59),_=a.getDesc,w=a.setDesc,k=a.create,E=m.get,S=r.Symbol,C=r.JSON,P=C&&C.stringify,A=!1,O=d("_hidden"),T=a.isEnum,R=c("symbol-registry"),j=c("symbols"),M="function"==typeof S,L=Object.prototype,D=o&&p(function(){return 7!=k(w({},"a",{get:function(){return w(this,"a",{value:7}).a}})).a})?function(t,e,n){var a=_(L,e);a&&delete L[e],w(t,e,n),a&&t!==L&&w(L,e,a)}:w,N=function(t){var e=j[t]=k(S.prototype);return e._k=t,o&&A&&D(L,t,{configurable:!0,set:function(e){i(this,O)&&i(this[O],t)&&(this[O][t]=!1),D(this,t,x(1,e))}}),e},F=function(t){return"symbol"==typeof t},I=function(t,e,n){return n&&i(j,e)?(n.enumerable?(i(t,O)&&t[O][e]&&(t[O][e]=!1),n=k(n,{enumerable:x(0,!1)})):(i(t,O)||w(t,O,x(1,{})),t[O][e]=!0),D(t,e,n)):w(t,e,n)},B=function(t,e){b(t);for(var n,a=v(e=y(e)),r=0,i=a.length;i>r;)I(t,n=a[r++],e[n]);return t},q=function(t,e){return void 0===e?k(t):B(k(t),e)},G=function(t){var e=T.call(this,t);return e||!i(this,t)||!i(j,t)||i(this,O)&&this[O][t]?e:!0},U=function(t,e){var n=_(t=y(t),e);return!n||!i(j,e)||i(t,O)&&t[O][e]||(n.enumerable=!0),n},V=function(t){for(var e,n=E(y(t)),a=[],r=0;n.length>r;)i(j,e=n[r++])||e==O||a.push(e);return a},z=function(t){for(var e,n=E(y(t)),a=[],r=0;n.length>r;)i(j,e=n[r++])&&a.push(j[e]);return a},W=function(t){if(void 0!==t&&!F(t)){for(var e,n,a=[t],r=1,i=arguments;i.length>r;)a.push(i[r++]);return e=a[1],"function"==typeof e&&(n=e),(n||!g(e))&&(e=function(t,e){return n&&(e=n.call(this,t,e)),F(e)?void 0:e}),a[1]=e,P.apply(C,a)}},H=p(function(){var t=S();return"[null]"!=P([t])||"{}"!=P({a:t})||"{}"!=P(Object(t))});M||(S=function(){if(F(this))throw TypeError("Symbol is not a constructor");return N(f(arguments.length>0?arguments[0]:void 0))},u(S.prototype,"toString",function(){return this._k}),F=function(t){return t instanceof S},a.create=q,a.isEnum=G,a.getDesc=U,a.setDesc=I,a.setDescs=B,a.getNames=m.get=V,a.getSymbols=z,o&&!t(48)&&u(L,"propertyIsEnumerable",G,!0));var K={"for":function(t){return i(R,t+="")?R[t]:R[t]=S(t)},keyFor:function(t){return h(R,t)},useSetter:function(){A=!0},useSimple:function(){A=!1}};a.each.call("hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),function(t){var e=d(t);K[t]=M?e:N(e)}),A=!0,s(s.G+s.W,{Symbol:S}),s(s.S,"Symbol",K),s(s.S+s.F*!M,"Object",{create:q,defineProperty:I,defineProperties:B,getOwnPropertyDescriptor:U,getOwnPropertyNames:V,getOwnPropertySymbols:z}),C&&s(s.S+s.F*(!M||H),"JSON",{stringify:W}),l(S,"Symbol"),l(Math,"Math",!0),l(r.JSON,"JSON",!0)},{19:19,21:21,22:22,24:24,28:28,29:29,30:30,36:36,4:4,46:46,47:47,48:48,59:59,61:61,66:66,67:67,78:78,82:82,83:83}],170:[function(t,e,n){"use strict";var a=t(46),r=t(61),i=t(14),o=t(38),s=t(30),u=i.frozenStore,p=i.WEAK,c=Object.isExtensible||o,l={},f=t(15)("WeakMap",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){if(o(t)){if(!c(t))return u(this).get(t);if(s(t,p))return t[p][this._i]}},set:function(t,e){return i.def(this,t,e)}},i,!0,!0);7!=(new f).set((Object.freeze||Object)(l),7).get(l)&&a.each.call(["delete","has","get","set"],function(t){var e=f.prototype,n=e[t];r(e,t,function(e,a){if(o(e)&&!c(e)){var r=u(this)[t](e,a);return"set"==t?this:r}return n.call(this,e,a)})})},{14:14,15:15,30:30,38:38,46:46,61:61}],171:[function(t,e,n){"use strict";var a=t(14);t(15)("WeakSet",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t,!0)}},a,!1,!0)},{14:14,15:15}],172:[function(t,e,n){"use strict";var a=t(22),r=t(7)(!0);a(a.P,"Array",{includes:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)("includes")},{22:22,3:3,7:7}],173:[function(t,e,n){var a=t(22);a(a.P,"Map",{toJSON:t(13)("Map")})},{13:13,22:22}],174:[function(t,e,n){var a=t(22),r=t(55)(!0);a(a.S,"Object",{entries:function(t){return r(t)}})},{22:22,55:55}],175:[function(t,e,n){var a=t(46),r=t(22),i=t(56),o=t(78),s=t(59);r(r.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,r=o(t),u=a.setDesc,p=a.getDesc,c=i(r),l={},f=0;c.length>f;)n=p(r,e=c[f++]),e in l?u(l,e,s(0,n)):l[e]=n;return l}})},{22:22,46:46,56:56,59:59,78:78}],176:[function(t,e,n){var a=t(22),r=t(55)(!1);a(a.S,"Object",{values:function(t){return r(t)}})},{22:22,55:55}],177:[function(t,e,n){var a=t(22),r=t(62)(/[\\^$*+?.()|[\]{}]/g,"\\$&");a(a.S,"RegExp",{escape:function(t){return r(t)}})},{22:22,62:62}],178:[function(t,e,n){var a=t(22);a(a.P,"Set",{toJSON:t(13)("Set")})},{13:13,22:22}],179:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!0);a(a.P,"String",{at:function(t){return r(this,t)}})},{22:22,70:70}],180:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padLeft:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{22:22,72:72}],181:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padRight:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},{22:22,72:72}],182:[function(t,e,n){"use strict";t(74)("trimLeft",function(t){return function(){return t(this,1)}})},{74:74}],183:[function(t,e,n){"use strict";t(74)("trimRight",function(t){return function(){return t(this,2)}})},{74:74}],184:[function(t,e,n){var a=t(46),r=t(22),i=t(17),o=t(16).Array||Array,s={},u=function(t,e){a.each.call(t.split(","),function(t){void 0==e&&t in o?s[t]=o[t]:t in[]&&(s[t]=i(Function.call,[][t],e))})};u("pop,reverse,shift,keys,values,entries",1),u("indexOf,every,some,forEach,map,filter,find,findIndex,includes",3),u("join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill"),r(r.S,"Array",s)},{16:16,17:17,22:22,46:46}],185:[function(t,e,n){t(91);var a=t(29),r=t(31),i=t(45),o=t(83)("iterator"),s=a.NodeList,u=a.HTMLCollection,p=s&&s.prototype,c=u&&u.prototype,l=i.NodeList=i.HTMLCollection=i.Array;p&&!p[o]&&r(p,o,l),c&&!c[o]&&r(c,o,l)},{29:29,31:31,45:45,83:83,91:91}],186:[function(t,e,n){var a=t(22),r=t(75);a(a.G+a.B,{setImmediate:r.set,clearImmediate:r.clear})},{22:22,75:75}],187:[function(t,e,n){var a=t(29),r=t(22),i=t(33),o=t(57),s=a.navigator,u=!!s&&/MSIE .\./.test(s.userAgent),p=function(t){return u?function(e,n){return t(i(o,[].slice.call(arguments,2),"function"==typeof e?e:Function(e)),n)}:t};r(r.G+r.B+r.F*u,{setTimeout:p(a.setTimeout),setInterval:p(a.setInterval)})},{22:22,29:29,33:33,57:57}],188:[function(t,e,n){t(85),t(169),t(124),t(132),t(136),t(137),t(125),t(135),t(134),t(130),t(131),t(129),t(126),t(128),t(133),t(127),t(95),t(94),t(114),t(115),t(116),t(117),t(118),t(119),t(120),t(121),t(122),t(123),t(97),t(98),t(99),t(100),t(101),t(102),t(103),t(104),t(105),t(106),t(107),t(108),t(109),t(110),t(111),t(112),t(113),t(162),t(165),t(168),t(164),t(160),t(161),t(163),t(166),t(167),t(90),t(92),t(91),t(93),t(86),t(87),t(89),t(88),t(153),t(154),t(155),t(156),t(157),t(158),t(138),t(96),t(159),t(170),t(171),t(139),t(140),t(141),t(142),t(143),t(146),t(144),t(145),t(147),t(148),t(149),t(150),t(152),t(151),t(172),t(179),t(180),t(181),t(182),t(183),t(177),t(175),t(176),t(174),t(173),t(178),t(184),t(187),t(186),t(185),e.exports=t(16)},{100:100,101:101,102:102,103:103,104:104,105:105,106:106,107:107,108:108,109:109,110:110,111:111,112:112,113:113,114:114,115:115,116:116,117:117,118:118,119:119,120:120,121:121,122:122,123:123,124:124,125:125,126:126,127:127,128:128,129:129,130:130,131:131,132:132,133:133,134:134,135:135,136:136,137:137,138:138,139:139,140:140,141:141,142:142,143:143,144:144,145:145,146:146,147:147,148:148,149:149,150:150,151:151,152:152,153:153,154:154,155:155,156:156,157:157,158:158,159:159,16:16,160:160,161:161,162:162,163:163,164:164,165:165,166:166,167:167,168:168,169:169,170:170,171:171,172:172,173:173,174:174,175:175,176:176,177:177,178:178,179:179,180:180,181:181,182:182,183:183,184:184,185:185,186:186,187:187,85:85,86:86,87:87,88:88,89:89,90:90,91:91,92:92,93:93,94:94,95:95,96:96,97:97,98:98,99:99}],189:[function(t,e,n){(function(n){(function(t,n){!function(n){"use strict";function a(t,e,n,a){var r=Object.create((e||i).prototype),o=new h(a||[]);return r._invoke=l(t,n,o),r}function r(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(a){return{type:"throw",arg:a}}}function i(){}function o(){}function s(){}function u(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function p(t){this.arg=t}function c(e){function n(t,n){var a=e[t](n),r=a.value;return r instanceof p?Promise.resolve(r.arg).then(i,o):Promise.resolve(r).then(function(t){return a.value=t,a})}function a(t,e){function a(){return n(t,e)}return r=r?r.then(a,a):new Promise(function(t){t(a())})}"object"==typeof t&&t.domain&&(n=t.domain.bind(n));var r,i=n.bind(e,"next"),o=n.bind(e,"throw");n.bind(e,"return");this._invoke=a}function l(t,e,n){var a=w;return function(i,o){if(a===E)throw Error("Generator is already running");if(a===S){if("throw"===i)throw o;return v()}for(;;){var s=n.delegate;if(s){if("return"===i||"throw"===i&&s.iterator[i]===g){n.delegate=null;var u=s.iterator["return"];if(u){var p=r(u,s.iterator,o);if("throw"===p.type){i="throw",o=p.arg;continue}}if("return"===i)continue}var p=r(s.iterator[i],s.iterator,o);if("throw"===p.type){n.delegate=null,i="throw",o=p.arg;continue}i="next",o=g;var c=p.arg;if(!c.done)return a=k,c;n[s.resultName]=c.value,n.next=s.nextLoc,n.delegate=null}if("next"===i)n._sent=o,a===k?n.sent=o:n.sent=g;else if("throw"===i){if(a===w)throw a=S,o;n.dispatchException(o)&&(i="next",o=g)}else"return"===i&&n.abrupt("return",o);a=E;var p=r(t,e,n);if("normal"===p.type){a=n.done?S:k;var c={value:p.arg,done:n.done};if(p.arg!==C)return c;n.delegate&&"next"===i&&(o=g)}else"throw"===p.type&&(a=S,i="throw",o=p.arg)}}}function f(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function d(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function h(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(f,this),this.reset(!0)}function m(t){if(t){var e=t[y];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,a=function r(){for(;++n=0;--a){var r=this.tryEntries[a],i=r.completion;if("root"===r.tryLoc)return e("end");if(r.tryLoc<=this.prev){var o=b.call(r,"catchLoc"),s=b.call(r,"finallyLoc");if(o&&s){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&b.call(a,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),C}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var a=n.completion;if("throw"===a.type){var r=a.arg;d(n)}return r}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},C}}}("object"==typeof n?n:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,t(202),void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{202:202}],190:[function(t,e,n){!function(t){"use strict";function e(){return c.createDocumentFragment()}function n(t){return c.createElement(t)}function a(t){if(1===t.length)return r(t[0]);for(var n=e(),a=B.call(t),i=0;i-1}}([].indexOf||function(t){for(q=this.length;q--&&this[q]!==t;);return q}),item:function(t){return this[t]||null},remove:function(){for(var t,e=0;e=u?e(i):document.fonts.load(p(i,i.family),s).then(function(e){1<=e.length?t(i):setTimeout(f,25)},function(){e(i)})};f()}else n(function(){function n(){var e;(e=-1!=v&&-1!=g||-1!=v&&-1!=b||-1!=g&&-1!=b)&&((e=v!=g&&v!=b&&g!=b)||(null===l&&(e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),l=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))),e=l&&(v==y&&g==y&&b==y||v==x&&g==x&&b==x||v==_&&g==_&&b==_)),e=!e),e&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),t(i))}function f(){if((new Date).getTime()-c>=u)null!==w.parentNode&&w.parentNode.removeChild(w),e(i);else{var t=document.hidden;(!0===t||void 0===t)&&(v=d.a.offsetWidth,g=h.a.offsetWidth,b=m.a.offsetWidth,n()),k=setTimeout(f,50)}}var d=new a(s),h=new a(s),m=new a(s),v=-1,g=-1,b=-1,y=-1,x=-1,_=-1,w=document.createElement("div"),k=0;w.dir="ltr",r(d,p(i,"sans-serif")),r(h,p(i,"serif")),r(m,p(i,"monospace")),w.appendChild(d.a),w.appendChild(h.a),w.appendChild(m.a),document.body.appendChild(w),y=d.a.offsetWidth,x=h.a.offsetWidth,_=m.a.offsetWidth,f(),o(d,function(t){v=t,n()}),r(d,p(i,'"'+i.family+'",sans-serif')),o(h,function(t){g=t,n()}),r(h,p(i,'"'+i.family+'",serif')),o(m,function(t){b=t,n()}),r(m,p(i,'"'+i.family+'",monospace'))})})},window.FontFaceObserver=s,window.FontFaceObserver.prototype.check=s.prototype.a,void 0!==e&&(e.exports=window.FontFaceObserver)}()},{}],193:[function(t,e,n){!function(t,n){function a(t,e){var n=t.createElement("p"),a=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",a.insertBefore(n.lastChild,a.firstChild)}function r(){var t=x.elements;return"string"==typeof t?t.split(" "):t}function i(t,e){var n=x.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),x.elements=n+" "+t,c(e)}function o(t){var e=y[t[g]];return e||(e={},b++,t[g]=b,y[b]=e),e}function s(t,e,a){if(e||(e=n),f)return e.createElement(t);a||(a=o(e));var r;return r=a.cache[t]?a.cache[t].cloneNode():v.test(t)?(a.cache[t]=a.createElem(t)).cloneNode():a.createElem(t),!r.canHaveChildren||m.test(t)||r.tagUrn?r:a.frag.appendChild(r)}function u(t,e){if(t||(t=n),f)return t.createDocumentFragment();e=e||o(t);for(var a=e.frag.cloneNode(),i=0,s=r(),u=s.length;u>i;i++)a.createElement(s[i]);return a}function p(t,e){e.cache||(e.cache={},e.createElem=t.createElement,e.createFrag=t.createDocumentFragment,e.frag=e.createFrag()),t.createElement=function(n){return x.shivMethods?s(n,t,e):e.createElem(n)},t.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+r().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(x,e.frag)}function c(t){t||(t=n);var e=o(t);return!x.shivCSS||l||e.hasCSS||(e.hasCSS=!!a(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),f||p(t,e),t}var l,f,d="3.7.3-pre",h=t.html5||{},m=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,v=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,g="_html5shiv",b=0,y={};!function(){try{var t=n.createElement("a");t.innerHTML="",l="hidden"in t,f=1==t.childNodes.length||function(){n.createElement("a");var t=n.createDocumentFragment();return void 0===t.cloneNode||void 0===t.createDocumentFragment||void 0===t.createElement}()}catch(e){l=!0,f=!0}}();var x={elements:h.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:d,shivCSS:h.shivCSS!==!1,supportsUnknownElements:f,shivMethods:h.shivMethods!==!1,type:"default",shivDocument:c,createElement:s,createDocumentFragment:u,addElements:i};t.html5=x,c(n),"object"==typeof e&&e.exports&&(e.exports=x)}("undefined"!=typeof window?window:this,document)},{}],194:[function(t,e,n){(function(t){(function(t){!function(t){function e(t,e,n,a){for(var i,o=n.slice(),s=r(e,t),u=0,p=o.length;p>u&&(handler=o[u],"object"==typeof handler?"function"==typeof handler.handleEvent&&handler.handleEvent(s):handler.call(t,s),!s.stoppedImmediatePropagation);u++);return i=!s.stoppedPropagation,a&&i&&t.parentNode?t.parentNode.dispatchEvent(s):!s.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function a(t,e,a){var r=b(e||t,a);v(t,"textContent",n(function(){return r.get.call(this)},function(t){r.set.call(this,t)}))}function r(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function i(t,e){for(var n=t.length;n--&&t[n]!==e;);return n}function o(){if("BR"===this.tagName)return"\n";for(var t=this.firstChild,e=[];t;)8!==t.nodeType&&7!==t.nodeType&&e.push(t.textContent),t=t.nextSibling;return e.join("")}function s(t){var e=document.createEvent("Event");e.initEvent("input",!0,!0),(t.srcElement||t.fromElement||document).dispatchEvent(e)}function u(t){!f&&k.test(document.readyState)&&(f=!f,document.detachEvent(d,u),t=document.createEvent("Event"),t.initEvent(h,!0,!0),document.dispatchEvent(t))}function p(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function c(e,n){return n||(n=t.event),n.target||(n.target=n.srcElement||n.fromElement||document),n.timeStamp||(n.timeStamp=(new Date).getTime()),n}if(!document.createEvent){var l=!0,f=!1,d="onreadystatechange",h="DOMContentLoaded",m="__IE8__"+Math.random(),v=Object.defineProperty||function(t,e,n){t[e]=n.value},g=Object.defineProperties||function(e,n){for(var a in n)if(y.call(n,a))try{v(e,a,n[a])}catch(r){t.console&&console.log(a+" failed on object:",e,r.message)}},b=Object.getOwnPropertyDescriptor,y=Object.prototype.hasOwnProperty,x=t.Element.prototype,_=t.Text.prototype,w=/^[a-z]+$/,k=/loaded|complete/,E={},S=document.createElement("div"),C=document.documentElement,P=C.removeAttribute,A=C.setAttribute;a(t.HTMLCommentElement.prototype,x,"nodeValue"),a(t.HTMLScriptElement.prototype,null,"text"),a(_,null,"nodeValue"),a(t.HTMLTitleElement.prototype,null,"text"),v(t.HTMLStyleElement.prototype,"textContent",function(t){return n(function(){return t.get.call(this.styleSheet)},function(e){t.set.call(this.styleSheet,e)})}(b(t.CSSStyleSheet.prototype,"cssText"))),g(x,{textContent:{get:o,set:p},firstElementChild:{get:function(){for(var t=this.childNodes||[],e=0,n=t.length;n>e;e++)if(1==t[e].nodeType)return t[e]}},lastElementChild:{get:function(){for(var t=this.childNodes||[],e=t.length;e--;)if(1==t[e].nodeType)return t[e]}},oninput:{get:function(){return this._oninput||null},set:function(t){this._oninput&&(this.removeEventListener("input",this._oninput),this._oninput=t,t&&this.addEventListener("input",t))}},previousElementSibling:{get:function(){for(var t=this.previousSibling;t&&1!=t.nodeType;)t=t.previousSibling;return t}},nextElementSibling:{get:function(){for(var t=this.nextSibling;t&&1!=t.nodeType;)t=t.nextSibling;return t}},childElementCount:{get:function(){for(var t=0,e=this.childNodes||[],n=e.length;n--;t+=1==e[n].nodeType);return t}},addEventListener:{value:function(t,n,a){if("function"==typeof n||"object"==typeof n){var r,o,u=this,p="on"+t,l=u[m]||v(u,m,{value:{}})[m],f=l[p]||(l[p]={}),d=f.h||(f.h=[]);if(!y.call(f,"w")){if(f.w=function(t){return t[m]||e(u,c(u,t),d,!1)},!y.call(E,p))if(w.test(t)){try{r=document.createEventObject(),r[m]=!0,9!=u.nodeType&&(null==u.parentNode&&S.appendChild(u),(o=u.getAttribute(p))&&P.call(u,p)),u.fireEvent(p,r),E[p]=!0}catch(r){for(E[p]=!1;S.hasChildNodes();)S.removeChild(S.firstChild)}null!=o&&A.call(u,p,o)}else E[p]=!1;(f.n=E[p])&&u.attachEvent(p,f.w)}i(d,n)<0&&d[a?"unshift":"push"](n),"input"===t&&u.attachEvent("onkeyup",s)}}},dispatchEvent:{value:function(t){var n,a=this,r="on"+t.type,i=a[m],o=i&&i[r],s=!!o;return t.target||(t.target=a),s?o.n?a.fireEvent(r,t):e(a,t,o.h,!0):(n=a.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}},removeEventListener:{value:function(t,e,n){if("function"==typeof e||"object"==typeof e){var a=this,r="on"+t,o=a[m],s=o&&o[r],u=s&&s.h,p=u?i(u,e):-1;p>-1&&u.splice(p,1)}}}}),g(_,{addEventListener:{value:x.addEventListener},dispatchEvent:{value:x.dispatchEvent},removeEventListener:{value:x.removeEventListener}}),g(t.XMLHttpRequest.prototype,{addEventListener:{value:function(t,e,n){var a=this,r="on"+t,o=a[m]||v(a,m,{value:{}})[m],s=o[r]||(o[r]={}),u=s.h||(s.h=[]);i(u,e)<0&&(a[r]||(a[r]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),a.dispatchEvent(e)}),u[n?"unshift":"push"](e))}},dispatchEvent:{value:function(t){var n=this,a="on"+t.type,r=n[m],i=r&&r[a],o=!!i;return o&&(i.n?n.fireEvent(a,t):e(n,t,i.h,!0))}},removeEventListener:{value:x.removeEventListener}}),g(t.Event.prototype,{bubbles:{value:!0,writable:!0},cancelable:{value:!0,writable:!0},preventDefault:{value:function(){this.cancelable&&(this.defaultPrevented=!0,this.returnValue=!1)}},stopPropagation:{value:function(){this.stoppedPropagation=!0,this.cancelBubble=!0}},stopImmediatePropagation:{value:function(){this.stoppedImmediatePropagation=!0,this.stopPropagation()}},initEvent:{value:function(t,e,n){this.type=t,this.bubbles=!!e,this.cancelable=!!n,this.bubbles||this.stopPropagation()}}}),g(t.HTMLDocument.prototype,{defaultView:{get:function(){return this.parentWindow}},textContent:{get:function(){return 11===this.nodeType?o.call(this):null},set:function(t){11===this.nodeType&&p.call(this,t)}},addEventListener:{value:function(e,n,a){var r=this;x.addEventListener.call(r,e,n,a),l&&e===h&&!k.test(r.readyState)&&(l=!1,r.attachEvent(d,u),t==top&&!function i(t){try{r.documentElement.doScroll("left"),u()}catch(e){setTimeout(i,50)}}())}},dispatchEvent:{value:x.dispatchEvent},removeEventListener:{value:x.removeEventListener},createEvent:{value:function(t){var e;if("Event"!==t)throw Error("unsupported "+t);return e=document.createEventObject(),e.timeStamp=(new Date).getTime(),e}}}),g(t.Window.prototype,{getComputedStyle:{value:function(){function t(t){this._=t}function e(){}var n=/^(?:[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/,a=/^(top|right|bottom|left)$/,r=/\-([a-z])/g,i=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,u=this._,p=u.style,c=u.currentStyle,l=u.runtimeStyle;return t=("float"===t?"style-float":t).replace(r,i),e=c?c[t]:p[t],n.test(e)&&!a.test(t)&&(o=p.left,s=l&&l.left,s&&(l.left=c.left),p.left="fontSize"===t?"1em":e,e=p.pixelLeft+"px",p.left=o,s&&(l.left=s)),null==e?e:e+""||"auto"},e.prototype.getPropertyValue=function(){return null},function(n,a){return a?new e(n):new t(n)}}()},addEventListener:{value:function(n,a,r){var o,s=t,u="on"+n;s[u]||(s[u]=function(t){return e(s,c(s,t),o,!1)}),o=s[u][m]||(s[u][m]=[]),i(o,a)<0&&o[r?"unshift":"push"](a)}},dispatchEvent:{value:function(e){var n=t["on"+e.type];return n?n.call(t,e)!==!1&&!e.defaultPrevented:!0}},removeEventListener:{value:function(e,n,a){var r="on"+e,o=(t[r]||Object)[m],s=o?i(o,n):-1;s>-1&&o.splice(s,1)}}}),function(t,e,n){for(n=0;n=s)return(0,u["default"])({points:n});for(var l=1;s-1>=l;l++)i.push((0,p.times)(a,(0,p.minus)(n[l],n[l-1])));for(var f=[(0,p.plus)(n[0],c(i[0],i[1]))],l=1;s-2>=l;l++)f.push((0,p.minus)(n[l],(0,p.average)([i[l],i[l-1]])));f.push((0,p.minus)(n[s-1],c(i[s-2],i[s-3])));var d=f[0],h=f[1],m=n[0],v=n[1],g=(e=(0,o["default"])()).moveto.apply(e,r(m)).curveto(d[0],d[1],h[0],h[1],v[0],v[1]);return{path:(0,p.range)(2,s).reduce(function(t,e){var a=f[e],r=n[e];return t.smoothcurveto(a[0],a[1],r[0],r[1])},g),centroid:(0,p.average)(n)}},e.exports=n["default"]},{198:198,199:199,200:200}],196:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=t(197),o=a(i),s=t(198),u=1e-5,p=function(t,e){var n=t.map(e),a=n.sort(function(t,e){var n=r(t,2),a=n[0],i=(n[1],r(e,2)),o=i[0];i[1];return a-o}),i=a.length,o=a[0][0],p=a[i-1][0],c=(0,s.minBy)(a,function(t){return t[1]}),l=(0,s.maxBy)(a,function(t){return t[1]});return o==p&&(p+=u),c==l&&(l+=u),{points:a,xmin:o,xmax:p,ymin:c,ymax:l}};n["default"]=function(t){var e=t.data,n=t.xaccessor,a=t.yaccessor,i=t.width,u=t.height,c=t.closed,l=t.min,f=t.max;n||(n=function(t){var e=r(t,2),n=e[0];e[1];return n}),a||(a=function(t){var e=r(t,2),n=(e[0],e[1]);return n});var d=function(t){return[n(t),a(t)]},h=e.map(function(t){return p(t,d)}),m=(0,s.minBy)(h,function(t){return t.xmin}),v=(0,s.maxBy)(h,function(t){return t.xmax}),g=null==l?(0,s.minBy)(h,function(t){return t.ymin}):l,b=null==f?(0,s.maxBy)(h,function(t){return t.ymax}):f;c&&(g=Math.min(g,0),b=Math.max(b,0));var y=c?0:g,x=(0,o["default"])([m,v],[0,i]),_=(0,o["default"])([g,b],[u,0]),w=function(t){var e=r(t,2),n=e[0],a=e[1];return[x(n),_(a)]};return{arranged:h,scale:w,xscale:x,yscale:_,base:y}},e.exports=n["default"]},{197:197,198:198}],197:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t,e){var n=a(t,2),r=n[0],o=n[1],s=a(e,2),u=s[0],p=s[1],c=function(t){return u+(p-u)*(t-r)/(o-r)};return c.inverse=function(){return i([u,p],[r,o])},c};n["default"]=r,e.exports=n["default"]},{}],198:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function(t){return t.reduce(function(t,e){return t+e},0)},i=function(t){return t.reduce(function(t,e){return Math.min(t,e)})},o=function(t){return t.reduce(function(t,e){return Math.max(t,e)})},s=function(t,e){return t.reduce(function(t,n){return t+e(n)},0)},u=function(t,e){return t.reduce(function(t,n){return Math.min(t,e(n))},1/0)},p=function(t,e){return t.reduce(function(t,n){return Math.max(t,e(n))},-(1/0))},c=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r+s,i+u]},l=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r-s,i-u]},f=function(t,e){var n=a(e,2),r=n[0],i=n[1];return[t*r,t*i]},d=function(t){var e=a(t,2),n=e[0],r=e[1];return Math.sqrt(n*n+r*r)},h=function(t){return t.reduce(c,[0,0])},m=function(t){return f(1/t.length,t.reduce(c))},v=function(t,e){return f(t,[Math.sin(e),-Math.cos(e)])},g=function(t,e){var n=t||{};for(var a in n){var r=n[a];e[a]=r(e.index,e.item,e.group)}return e},b=function(t,e,n){for(var a=[],r=t;e>r;r++)a.push(r);return n&&a.push(e),a},y=function(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=Object.keys(t)[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,p=t[u];n.push(e(u,p))}}catch(c){r=!0,i=c}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n},x=function(t){return y(t,function(t,e){return[t,e]})},_=function(t){return t};n.sum=r,n.min=i,n.max=o,n.sumBy=s,n.minBy=u,n.maxBy=p,n.plus=c,n.minus=l,n.times=f,n.id=_,n.length=d,n.sumVectors=h,n.average=m,n.onCircle=v,n.enhance=g,n.range=b,n.mapObject=y,n.pairs=x,n["default"]={sum:r,min:i,max:o,sumBy:s,minBy:u,maxBy:p,plus:c,minus:l,times:f,id:_,length:d,sumVectors:h,average:m,onCircle:v,enhance:g,range:b,mapObject:y,pairs:x}},{}],199:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t){var e=t||[],n=function(t,e){var n=t.slice(0,t.length);return n.push(e),n},r=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return r===s&&i===u},o=function(t,e){for(var n=t.length;"0"===t.charAt(n-1);)n-=1;return"."===t.charAt(n-1)&&(n-=1),t.substr(0,n)},s=function(t,e){var n=t.toFixed(e);return o(n)},u=function(t){var e=t.command,n=t.params,a=n.map(function(t){return s(t,6)});return e+" "+a.join(" ")},p=function(t,e){var n=t.command,r=t.params,i=a(e,2),o=i[0],s=i[1];switch(n){case"M":return[r[0],r[1]];case"L":return[r[0],r[1]];case"H":return[r[0],s];case"V":return[o,r[0]];case"Z":return null;case"C":return[r[4],r[5]];case"S":return[r[2],r[3]];case"Q":return[r[2],r[3]];case"T":return[r[0],r[1]];case"A":return[r[5],r[6]]}},c=function(t,e){return function(n){var a="object"==typeof n?t.map(function(t){return n[t]}):arguments;return e.apply(null,a)}},l=function(t){return i(n(e,t))};return{moveto:c(["x","y"],function(t,e){return l({command:"M",params:[t,e]})}),lineto:c(["x","y"],function(t,e){return l({command:"L",params:[t,e]})}),hlineto:c(["x"],function(t){return l({command:"H",params:[t]})}),vlineto:c(["y"],function(t){return l({command:"V",params:[t]})}),closepath:function(){return l({command:"Z",params:[]})},curveto:c(["x1","y1","x2","y2","x","y"],function(t,e,n,a,r,i){return l({command:"C",params:[t,e,n,a,r,i]})}),smoothcurveto:c(["x2","y2","x","y"],function(t,e,n,a){return l({command:"S",params:[t,e,n,a]})}),qcurveto:c(["x1","y1","x","y"],function(t,e,n,a){return l({command:"Q",params:[t,e,n,a]})}),smoothqcurveto:c(["x","y"],function(t,e){return l({command:"T",params:[t,e]})}),arc:c(["rx","ry","xrot","largeArcFlag","sweepFlag","x","y"],function(t,e,n,a,r,i,o){return l({command:"A",params:[t,e,n,a,r,i,o]})}),print:function(){return e.map(u).join(" ")},points:function(){var t=[],n=[0,0],a=!0,r=!1,i=void 0;try{for(var o,s=e[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,c=p(u,n);n=c,c&&t.push(c)}}catch(l){r=!0,i=l}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return t},instructions:function(){return e.slice(0,e.length)},connect:function(t){var e=this.points(),n=e[e.length-1],a=t.points()[0],o=t.instructions().slice(1);return r(n,a)||o.unshift({command:"L",params:a}),i(this.instructions().concat(o))}}};n["default"]=function(){return r()},e.exports=n["default"]},{}],200:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1)for(var n=1;n1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];for(var r,i;i=n.shift();)for(r in i)jo.call(i,r)&&(t[r]=i[r]);return t}function r(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function i(t){return"[object Array]"===Mo.call(t)}function o(t){return Lo.test(Mo.call(t))}function s(t,e){return null===t&&null===e?!0:"object"==typeof t||"object"==typeof e?!1:t===e}function u(t){return!isNaN(parseFloat(t))&&isFinite(t)}function p(t){return t&&"[object Object]"===Mo.call(t)}function c(t,e){return t.replace(/%s/g,function(){return e.shift()})}function l(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];throw t=c(t,n),Error(t)}function f(){jv.DEBUG&&Oo.apply(null,arguments)}function d(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),To(t,n)}function h(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),Do[t]||(Do[t]=!0,To(t,n))}function m(){jv.DEBUG&&d.apply(null,arguments)}function v(){jv.DEBUG&&h.apply(null,arguments)}function g(t,e,n){var a=b(t,e,n);return a?a[t][n]:null}function b(t,e,n){for(;e;){if(n in e[t])return e;if(e.isolated)return null;e=e.parent}}function y(t){return function(){return t}}function x(t){var e,n,a,r,i,o;for(e=t.split("."),(n=zo[e.length])||(n=_(e.length)),i=[],a=function(t,n){return t?"*":e[n]},r=n.length;r--;)o=n[r].map(a).join("."),i.hasOwnProperty(o)||(i.push(o),i[o]=!0);return i}function _(t){var e,n,a,r,i,o,s,u,p="";if(!zo[t]){for(a=[];p.length=i;i+=1){for(n=i.toString(2);n.lengtho;o++)u.push(r(n[o]));a[i]=u}zo[t]=a}return zo[t]}function w(t,e,n,a){var r=t[e];if(!r||!r.equalsOrStartsWith(a)&&r.equalsOrStartsWith(n))return t[e]=r?r.replace(n,a):a,!0}function k(t){var e=t.slice(2);return"i"===t[1]&&u(e)?+e:e}function E(t){return null==t?t:(Ko.hasOwnProperty(t)||(Ko[t]=new Qo(t)),Ko[t])}function S(t,e){function n(e,n){var a,r,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(a=t.viewmodel.wrapped[n.str],r=a?a.get():t.viewmodel.get(n),o=r?Object.keys(r):null),o&&o.forEach(function(t){"_ractive"===t&&i(r)||e.push(n.join(t))}),e}var a,r,o;for(a=e.str.split("."),o=[Yo];r=a.shift();)"*"===r?o=o.reduce(n,[]):o[0]===Yo?o[0]=E(r):o=o.map(C(r));return o}function C(t){return function(e){return e.join(t)}}function P(t){return t?t.replace(Wo,".$1"):""}function A(t,e,n){if("string"!=typeof e||!u(n))throw Error("Bad arguments");var a=void 0,r=void 0;if(/\*/.test(e))return r={},S(t,E(P(e))).forEach(function(e){var a=t.viewmodel.get(e);if(!u(a))throw Error(Xo);r[e.str]=a+n}),t.set(r);if(a=t.get(e),!u(a))throw Error(Xo);return t.set(e,+a+n)}function O(t,e){return Jo(this,t,void 0===e?1:+e)}
+function T(t){this.event=t,this.method="on"+t,this.deprecate=as[t]}function R(t,e){var n=t.indexOf(e);-1===n&&t.push(e)}function j(t,e){for(var n=0,a=t.length;a>n;n++)if(t[n]==e)return!0;return!1}function M(t,e){var n;if(!i(t)||!i(e))return!1;if(t.length!==e.length)return!1;for(n=t.length;n--;)if(t[n]!==e[n])return!1;return!0}function L(t){return"string"==typeof t?[t]:void 0===t?[]:t}function D(t){return t[t.length-1]}function N(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function F(t){for(var e=[],n=t.length;n--;)e[n]=t[n];return e}function I(t){setTimeout(t,0)}function B(t,e){return function(){for(var n;n=t.shift();)n(e)}}function q(t,e,n,a){var r;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");if(e instanceof rs)e.then(n,a);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{r=e.then}catch(i){return void a(i)}if("function"==typeof r){var o,s,u;s=function(e){o||(o=!0,q(t,e,n,a))},u=function(t){o||(o=!0,a(t))};try{r.call(e,s,u)}catch(i){if(!o)return a(i),void(o=!0)}}else n(e)}}function G(t,e,n){var a;return e=P(e),"~/"===e.substr(0,2)?(a=E(e.substring(2)),z(t,a.firstKey,n)):"."===e[0]?(a=U(cs(n),e),a&&z(t,a.firstKey,n)):a=V(t,E(e),n),a}function U(t,e){var n;if(void 0!=t&&"string"!=typeof t&&(t=t.str),"."===e)return E(t);if(n=t?t.split("."):[],"../"===e.substr(0,3)){for(;"../"===e.substr(0,3);){if(!n.length)throw Error('Could not resolve reference - too many "../" prefixes');n.pop(),e=e.substring(3)}return n.push(e),E(n.join("."))}return E(t?t+e.replace(/^\.\//,"."):e.replace(/^\.\/?/,""))}function V(t,e,n,a){var r,i,o,s,u;if(e.isRoot)return e;for(i=e.firstKey;n;)if(r=n.context,n=n.parent,r&&(s=!0,o=t.viewmodel.get(r),o&&("object"==typeof o||"function"==typeof o)&&i in o))return r.join(e.str);return W(t.viewmodel,i)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,i=E(i),u=V(t.parent,i,n,!0))?(t.viewmodel.map(i,{origin:t.parent.viewmodel,keypath:u}),e):a||s?void 0:(t.viewmodel.set(e,void 0),e)}function z(t,e){var n;!t.parent||t.isolated||W(t.viewmodel,e)||(e=E(e),(n=V(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function W(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function H(t){t.teardown()}function K(t){t.unbind()}function Q(t){t.unrender()}function $(t){t.cancel()}function Y(t){t.detach()}function J(t){t.detachNodes()}function X(t){!t.ready||t.outros.length||t.outroChildren||(t.outrosComplete||(t.parent?t.parent.decrementOutros(t):t.detachNodes(),t.outrosComplete=!0),t.intros.length||t.totalChildren||("function"==typeof t.callback&&t.callback(),t.parent&&t.parent.decrementTotal()))}function Z(){for(var t,e,n;ds.ractives.length;)e=ds.ractives.pop(),n=e.viewmodel.applyChanges(),n&&gs.fire(e,n);for(tt(),t=0;t=0;i--)r=t._subs[e[i]],r&&(s=gt(t,r,n,a)&&s);if(Vs.dequeue(t),t.parent&&s){if(o&&t.component){var u=t.component.name+"."+e[e.length-1];e=E(u).wildcardMatches(),n&&(n.component=t)}vt(t.parent,e,n,a)}}function gt(t,e,n,a){var r=null,i=!1;n&&!n._noArg&&(a=[n].concat(a)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,a)===!1&&(i=!0);return n&&!n._noArg&&i&&(r=n.original)&&(r.preventDefault&&r.preventDefault(),r.stopPropagation&&r.stopPropagation()),!i}function bt(t){var e={args:Array.prototype.slice.call(arguments,1)};zs(this,t,e)}function yt(t){var e;return t=E(P(t)),e=this.viewmodel.get(t,Ks),void 0===e&&this.parent&&!this.isolated&&ls(this,t.str,this.component.parentFragment)&&(e=this.viewmodel.get(t)),e}function xt(e,n){if(!this.fragment.rendered)throw Error("The API has changed - you must call `ractive.render(target[, anchor])` to render your Ractive instance. Once rendered you can use `ractive.insert()`.");if(e=t(e),n=t(n)||null,!e)throw Error("You must specify a valid target to insert into");e.insertBefore(this.detach(),n),this.el=e,(e.__ractive_instances__||(e.__ractive_instances__=[])).push(this),this.detached=null,_t(this)}function _t(t){$s.fire(t),t.findAllComponents("*").forEach(function(t){_t(t.instance)})}function wt(t,e,n){var a,r;return t=E(P(t)),a=this.viewmodel.get(t),i(a)&&i(e)?(r=bs.start(this,!0),this.viewmodel.merge(t,a,e,n),bs.end(),r):this.set(t,e,n&&n.complete)}function kt(t,e){var n,a;return n=S(t,e),a={},n.forEach(function(e){a[e.str]=t.get(e.str)}),a}function Et(t,e,n,a){var r,i,o;e=E(P(e)),a=a||cu,e.isPattern?(r=new uu(t,e,n,a),t.viewmodel.patternObservers.push(r),i=!0):r=new Zs(t,e,n,a),r.init(a.init),t.viewmodel.register(e,r,i?"patternObservers":"observers"),r.ready=!0;var s={cancel:function(){var n;o||(i?(n=t.viewmodel.patternObservers.indexOf(r),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,r,"patternObservers")):t.viewmodel.unregister(e,r,"observers"),o=!0)}};return t._observers.push(s),s}function St(t,e,n){var a,r,i,o;if(p(t)){n=e,r=t,a=[];for(t in r)r.hasOwnProperty(t)&&(e=r[t],a.push(this.observe(t,e,n)));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",pu(this,t,e,n);if(i=t.split(" "),1===i.length)return pu(this,t,e,n);for(a=[],o=i.length;o--;)t=i[o],t&&a.push(pu(this,t,e,n));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}function Ct(t,e,n){var a=this.observe(t,function(){e.apply(this,arguments),a.cancel()},{init:!1,defer:n&&n.defer});return a}function Pt(t,e){var n,a=this;if(t)n=t.split(" ").map(du).filter(hu),n.forEach(function(t){var n,r;(n=a._subs[t])&&(e?(r=n.indexOf(e),-1!==r&&n.splice(r,1)):a._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function At(t,e){var n,a,r,i=this;if("object"==typeof t){n=[];for(a in t)t.hasOwnProperty(a)&&n.push(this.on(a,t[a]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return r=t.split(" ").map(du).filter(hu),r.forEach(function(t){(i._subs[t]||(i._subs[t]=[])).push(e)}),{cancel:function(){return i.off(t,e)}}}function Ot(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function Tt(t,e,n){var a,r,i,o,s,u,p=[];if(a=Rt(t,e,n),!a)return null;for(r=t.length,s=a.length-2-a[1],i=Math.min(r,a[0]),o=i+a[1],u=0;i>u;u+=1)p.push(u);for(;o>u;u+=1)p.push(-1);for(;r>u;u+=1)p.push(u+s);return 0!==s?p.touchedFrom=a[0]:p.touchedFrom=t.length,p}function Rt(t,e,n){switch(e){case"splice":for(void 0!==n[0]&&n[0]<0&&(n[0]=t.length+Math.max(n[0],-t.length));n.length<2;)n.push(0);return n[1]=Math.min(n[1],t.length-n[0]),n;case"sort":case"reverse":return null;case"pop":return t.length?[t.length-1,1]:[0,0];case"push":return[t.length,0].concat(n);case"shift":return[0,t.length?1:0];case"unshift":return[0,0].concat(n)}}function jt(e,n){var a,r,i,o=this;if(i=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),a=bs.start(this,!0),bs.scheduleTask(function(){return Ru.fire(o)},!0),this.fragment.rendered)throw Error("You cannot call ractive.render() on an already rendered instance! Call ractive.unrender() first");if(e=t(e)||this.el,n=t(n)||this.anchor,this.el=e,this.anchor=n,!this.append&&e){var s=e.__ractive_instances__;s&&s.length&&Mt(s),e.innerHTML=""}return this.cssId&&Ou.apply(),e&&((r=e.__ractive_instances__)?r.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),bs.end(),this.transitionsEnabled=i,a.then(function(){return ju.fire(o)})}function Mt(t){t.splice(0,t.length).forEach(H)}function Lt(t,e){for(var n=t.slice(),a=e.length;a--;)~n.indexOf(e[a])||n.push(e[a]);return n}function Dt(t,e){var n,a,r;return a='[data-ractive-css~="{'+e+'}"]',r=function(t){var e,n,r,i,o,s,u,p=[];for(e=[];n=Iu.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(i=e.map(Ft),u=e.length;u--;)s=i.slice(),r=e[u],s[u]=r.base+a+r.modifiers||"",o=i.slice(),o[u]=a+" "+o[u],p.push(s.join(" "),o.join(" "));return p.join(", ")},n=qu.test(t)?t.replace(qu,a):t.replace(Fu,"").replace(Nu,function(t,e){var n,a;return Bu.test(e)?t:(n=e.split(",").map(Nt),a=n.map(r).join(", ")+" ",t.replace(e,a))})}function Nt(t){return t.trim?t.trim():t.replace(/^\s+/,"").replace(/\s+$/,"")}function Ft(t){return t.str}function It(t){t&&t.constructor!==Object&&("function"==typeof t||("object"!=typeof t?l("data option must be an object or a function, `"+t+"` is not valid"):m("If supplied, options.data should be a plain JavaScript object - using a non-POJO as the root object may work, but is discouraged")))}function Bt(t,e){It(e);var n="function"==typeof t,a="function"==typeof e;return e||n||(e={}),n||a?function(){var r=a?qt(e,this):e,i=n?qt(t,this):t;return Gt(r,i)}:Gt(e,t)}function qt(t,e){var n=t.call(e);if(n)return"object"!=typeof n&&l("Data function must return an object"),n.constructor!==Object&&v("Data function returned something other than a plain JavaScript object. This might work, but is strongly discouraged"),n}function Gt(t,e){if(t&&e){for(var n in e)n in t||(t[n]=e[n]);return t}return t||e}function Ut(t){var e=Eo(Qu);return e.parse=function(e,n){return Vt(e,n||t)},e}function Vt(t,e){if(!Hu)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Hu(t,e||this.options)}function zt(t,e){var n;if(!Xi){if(e&&e.noThrow)return;throw Error("Cannot retrieve template #"+t+" as Ractive is not running in a browser.")}if(Wt(t)&&(t=t.substring(1)),!(n=document.getElementById(t))){if(e&&e.noThrow)return;throw Error("Could not find template element with id #"+t)}if("SCRIPT"!==n.tagName.toUpperCase()){if(e&&e.noThrow)return;throw Error("Template element with id #"+t+", must be a