"
@@ -341,21 +341,21 @@
return dat
/obj/machinery/autolathe/proc/can_build(datum/design/D)
- var/coeff = (ispath(D.build_path,/obj/item/stack) ? 1 : 2 ** prod_coeff)
+ var/coeff = (ispath(D.build_path,/obj/item/stack) ? 1 : prod_coeff)
- if(D.materials[MAT_METAL] && (materials.amount(MAT_METAL) < (D.materials[MAT_METAL] / coeff)))
+ if(D.materials[MAT_METAL] && (materials.amount(MAT_METAL) < (D.materials[MAT_METAL] * coeff)))
return 0
- if(D.materials[MAT_GLASS] && (materials.amount(MAT_GLASS) < (D.materials[MAT_GLASS] / coeff)))
+ if(D.materials[MAT_GLASS] && (materials.amount(MAT_GLASS) < (D.materials[MAT_GLASS] * coeff)))
return 0
return 1
/obj/machinery/autolathe/proc/get_design_cost(datum/design/D)
- var/coeff = (ispath(D.build_path,/obj/item/stack) ? 1 : 2 ** prod_coeff)
+ var/coeff = (ispath(D.build_path,/obj/item/stack) ? 1 : prod_coeff)
var/dat
if(D.materials[MAT_METAL])
- dat += "[D.materials[MAT_METAL] / coeff] metal "
+ dat += "[D.materials[MAT_METAL] * coeff] metal "
if(D.materials[MAT_GLASS])
- dat += "[D.materials[MAT_GLASS] / coeff] glass"
+ dat += "[D.materials[MAT_GLASS] * coeff] glass"
return dat
/obj/machinery/autolathe/proc/reset(wire)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 472922740a7..1c08f13d0de 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -60,7 +60,7 @@
/obj/item/weapon/circuitboard/machine/clonepod
name = "circuit board (Clone Pod)"
build_path = /obj/machinery/clonepod
- origin_tech = "programming=3;biotech=3"
+ origin_tech = "programming=2;biotech=2"
req_components = list(
/obj/item/stack/cable_coil = 2,
/obj/item/weapon/stock_parts/scanning_module = 2,
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index 73717cf3f7c..2c58aa54a82 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -140,26 +140,28 @@
/obj/item/weapon/circuitboard/computer/telesci_console
name = "circuit board (Telescience Console)"
build_path = /obj/machinery/computer/telescience
- origin_tech = "programming=3;bluespace=2"
+ origin_tech = "programming=3;bluespace=3;plasmatech=4"
/obj/item/weapon/circuitboard/computer/message_monitor
name = "circuit board (Message Monitor)"
build_path = /obj/machinery/computer/message_monitor
- origin_tech = "programming=3"
+ origin_tech = "programming=2"
/obj/item/weapon/circuitboard/computer/security
name = "circuit board (Security Cameras)"
build_path = /obj/machinery/computer/security
+ origin_tech = "programming=2;combat=2"
/obj/item/weapon/circuitboard/computer/aiupload
name = "circuit board (AI Upload)"
build_path = /obj/machinery/computer/upload/ai
- origin_tech = "programming=4"
+ origin_tech = "programming=4;engineering=4"
/obj/item/weapon/circuitboard/computer/borgupload
name = "circuit board (Cyborg Upload)"
build_path = /obj/machinery/computer/upload/borg
- origin_tech = "programming=4"
+ origin_tech = "programming=4;engineering=4"
/obj/item/weapon/circuitboard/computer/med_data
name = "circuit board (Medical Records Console)"
build_path = /obj/machinery/computer/med_data
+ origin_tech = "programming=2;biotech=2"
/obj/item/weapon/circuitboard/computer/pandemic
name = "circuit board (PanD.E.M.I.C. 2200)"
build_path = /obj/machinery/computer/pandemic
@@ -171,12 +173,13 @@
/obj/item/weapon/circuitboard/computer/communications
name = "circuit board (Communications)"
build_path = /obj/machinery/computer/communications
- origin_tech = "programming=2;magnets=2"
+ origin_tech = "programming=3;magnets=3"
var/lastTimeUsed = 0
/obj/item/weapon/circuitboard/computer/card
name = "circuit board (ID Console)"
build_path = /obj/machinery/computer/card
+ origin_tech = "programming=3"
/obj/item/weapon/circuitboard/computer/card/centcom
name = "circuit board (Centcom ID Console)"
build_path = /obj/machinery/computer/card/centcom
@@ -204,10 +207,11 @@
/obj/item/weapon/circuitboard/computer/teleporter
name = "circuit board (Teleporter)"
build_path = /obj/machinery/computer/teleporter
- origin_tech = "programming=2;bluespace=2"
+ origin_tech = "programming=3;bluespace=3;plasmatech=3"
/obj/item/weapon/circuitboard/computer/secure_data
name = "circuit board (Security Records Console)"
build_path = /obj/machinery/computer/secure_data
+ origin_tech = "programming=2;combat=2"
/obj/item/weapon/circuitboard/computer/stationalert
name = "circuit board (Station Alerts)"
build_path = /obj/machinery/computer/station_alert
@@ -234,7 +238,7 @@
/obj/item/weapon/circuitboard/computer/cloning
name = "circuit board (Cloning)"
build_path = /obj/machinery/computer/cloning
- origin_tech = "programming=3;biotech=3"
+ origin_tech = "programming=2;biotech=2"
/obj/item/weapon/circuitboard/computer/arcade/battle
name = "circuit board (Arcade Battle)"
build_path = /obj/machinery/computer/arcade/battle
@@ -242,6 +246,7 @@
/obj/item/weapon/circuitboard/computer/arcade/orion_trail
name = "circuit board (Orion Trail)"
build_path = /obj/machinery/computer/arcade/orion_trail
+ origin_tech = "programming=1"
/obj/item/weapon/circuitboard/computer/turbine_control
name = "circuit board (Turbine control)"
build_path = /obj/machinery/computer/turbine_computer
@@ -252,6 +257,7 @@
/obj/item/weapon/circuitboard/computer/powermonitor
name = "circuit board (Power Monitor)" //name fixed 250810
build_path = /obj/machinery/computer/monitor
+ origin_tech = "programming=2;powerstorage=2"
/obj/item/weapon/circuitboard/computer/olddoor
name = "circuit board (DoorMex)"
build_path = /obj/machinery/computer/pod/old
@@ -292,11 +298,11 @@
/obj/item/weapon/circuitboard/computer/crew
name = "circuit board (Crew Monitoring Console)"
build_path = /obj/machinery/computer/crew
- origin_tech = "programming=3;biotech=2;magnets=2"
+ origin_tech = "programming=2;biotech=2"
/obj/item/weapon/circuitboard/computer/mech_bay_power_console
name = "circuit board (Mech Bay Power Control Console)"
build_path = /obj/machinery/computer/mech_bay_power_console
- origin_tech = "programming=2;powerstorage=3"
+ origin_tech = "programming=3;powerstorage=3"
/obj/item/weapon/circuitboard/computer/cargo
name = "circuit board (Supply Console)"
@@ -328,18 +334,18 @@
/obj/item/weapon/circuitboard/computer/operating
name = "circuit board (Operating Computer)"
build_path = /obj/machinery/computer/operating
- origin_tech = "programming=2;biotech=2"
+ origin_tech = "programming=2;biotech=3"
/obj/item/weapon/circuitboard/computer/mining
name = "circuit board (Outpost Status Display)"
build_path = /obj/machinery/computer/security/mining
/obj/item/weapon/circuitboard/computer/comm_monitor
name = "circuit board (Telecommunications Monitor)"
build_path = /obj/machinery/computer/telecomms/monitor
- origin_tech = "programming=3"
+ origin_tech = "programming=3;magnets=3;bluespace=2"
/obj/item/weapon/circuitboard/computer/comm_server
name = "circuit board (Telecommunications Server Monitor)"
build_path = /obj/machinery/computer/telecomms/server
- origin_tech = "programming=3"
+ origin_tech = "programming=3;magnets=3;bluespace=2"
/obj/item/weapon/circuitboard/computer/shuttle
name = "circuit board (Shuttle)"
@@ -382,7 +388,7 @@
/obj/item/weapon/circuitboard/computer/aifixer
name = "circuit board (AI Integrity Restorer)"
build_path = /obj/machinery/computer/aifixer
- origin_tech = "programming=3;biotech=2"
+ origin_tech = "programming=2;biotech=2"
/*/obj/item/weapon/circuitboard/computer/prison_shuttle
name = "circuit board (Prison Shuttle)"
build_path = /obj/machinery/computer/prison_shuttle*/
@@ -407,4 +413,4 @@
build_path = /obj/machinery/computer/libraryconsole/bookmanagement
user << "Access protocols successfully updated."
else
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm
index 597b90129a7..fdc6d980933 100644
--- a/code/game/machinery/computer/dna_console.dm
+++ b/code/game/machinery/computer/dna_console.dm
@@ -398,11 +398,17 @@
if("se")
if(buffer_slot["SE"])
I = new /obj/item/weapon/dnainjector/timed(loc)
+ var/powers = 0
for(var/datum/mutation/human/HM in good_mutations + bad_mutations + not_good_mutations)
if(HM.check_block_string(buffer_slot["SE"]))
I.add_mutations.Add(HM)
+ if(HM in good_mutations)
+ powers += 1
+ if(HM in bad_mutations + not_good_mutations)
+ powers -= 1 //To prevent just unlocking everything to get all powers to a syringe for max tech
else
I.remove_mutations.Add(HM)
+ I.origin_tech = "biotech=2;engineering=[max(1,min(6,powers))]" //With 6 powers available this tech level will be 1-6, also safety check if new powers get added
var/time_coeff
for(var/datum/mutation/human/HM in I.add_mutations)
if(!time_coeff)
@@ -593,4 +599,4 @@
//#undef BAD_MUTATION_DIFFICULTY
//#undef GOOD_MUTATION_DIFFICULTY
-//#undef OP_MUTATION_DIFFICULTY
\ No newline at end of file
+//#undef OP_MUTATION_DIFFICULTY
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index cc914875006..e8b358a85cc 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -62,9 +62,6 @@
return amt
/obj/structure/frame/machine/attackby(obj/item/P, mob/user, params)
- if(P.crit_fail)
- user << "This part is faulty, you cannot add this to the machine!"
- return
switch(state)
if(1)
if(istype(P, /obj/item/weapon/circuitboard/machine))
@@ -193,11 +190,10 @@
for(var/path in req_components)
while(req_components[path] > 0 && (locate(path) in part_list))
var/obj/item/part = (locate(path) in part_list)
- if(!part.crit_fail)
- added_components[part] = path
- replacer.remove_from_storage(part, src)
- req_components[path]--
- part_list -= part
+ added_components[part] = path
+ replacer.remove_from_storage(part, src)
+ req_components[path]--
+ part_list -= part
for(var/obj/item/weapon/stock_parts/part in added_components)
components += part
@@ -268,7 +264,7 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
/obj/item/weapon/circuitboard/machine/smes
name = "circuit board (SMES)"
build_path = /obj/machinery/power/smes
- origin_tech = "programming=4;powerstorage=5;engineering=5"
+ origin_tech = "programming=3;powerstorage=3;engineering=3"
req_components = list(
/obj/item/stack/cable_coil = 5,
/obj/item/weapon/stock_parts/cell = 5,
@@ -277,7 +273,7 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
/obj/item/weapon/circuitboard/machine/teleporter_hub
name = "circuit board (Teleporter Hub)"
build_path = /obj/machinery/teleport/hub
- origin_tech = "programming=3;engineering=5;bluespace=5;materials=4"
+ origin_tech = "programming=3;engineering=4;bluespace=4;materials=4"
req_components = list(
/obj/item/weapon/ore/bluespace_crystal = 3,
/obj/item/weapon/stock_parts/matter_bin = 1)
@@ -285,7 +281,7 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
/obj/item/weapon/circuitboard/machine/teleporter_station
name = "circuit board (Teleporter Station)"
build_path = /obj/machinery/teleport/station
- origin_tech = "programming=4;engineering=4;bluespace=4"
+ origin_tech = "programming=4;engineering=4;bluespace=4;plasmatech=3"
req_components = list(
/obj/item/weapon/ore/bluespace_crystal = 2,
/obj/item/weapon/stock_parts/capacitor = 2,
@@ -294,7 +290,7 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
/obj/item/weapon/circuitboard/machine/chem_dispenser
name = "circuit board (Portable Chem Dispenser)"
build_path = /obj/machinery/chem_dispenser/constructable
- origin_tech = "materials=4;engineering=4;programming=4;plasmatech=3;biotech=3"
+ origin_tech = "materials=4;programming=4;plasmatech=4;biotech=3"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 2,
/obj/item/weapon/stock_parts/capacitor = 1,
@@ -305,9 +301,9 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
/obj/item/weapon/circuitboard/machine/telesci_pad
name = "circuit board (Telepad)"
build_path = /obj/machinery/telepad
- origin_tech = "programming=4;engineering=3;materials=3;bluespace=4"
+ origin_tech = "programming=4;engineering=3;plasmatech=4;bluespace=4"
req_components = list(
/obj/item/weapon/ore/bluespace_crystal = 2,
/obj/item/weapon/stock_parts/capacitor = 1,
/obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/console_screen = 1)
\ No newline at end of file
+ /obj/item/weapon/stock_parts/console_screen = 1)
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index d3e9e6727dc..7207a48eca0 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -352,8 +352,6 @@ Class Procs:
M.state = 2
M.icon_state = "box_1"
for(var/obj/item/I in component_parts)
- if(I.reliability != 100 && crit_fail)
- I.crit_fail = 1
I.loc = loc
qdel(src)
@@ -391,10 +389,12 @@ Class Procs:
return 0
/obj/machinery/proc/exchange_parts(mob/user, obj/item/weapon/storage/part_replacer/W)
- if(flags & NODECONSTRUCT)
+ if(!istype(W))
+ return
+ if((flags & NODECONSTRUCT) && !W.works_from_distance)
return
var/shouldplaysound = 0
- if(istype(W) && component_parts)
+ if(component_parts)
if(panel_open || W.works_from_distance)
var/obj/item/weapon/circuitboard/machine/CB = locate(/obj/item/weapon/circuitboard/machine) in component_parts
var/P
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index fe5d9ac35a8..2a4b37d4fd4 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -18,7 +18,7 @@
/obj/item/weapon/circuitboard/machine/recharger
name = "circuit board (Weapon Recharger)"
build_path = /obj/machinery/recharger
- origin_tech = "powerstorage=3;engineering=3;materials=4"
+ origin_tech = "powerstorage=4;engineering=3;materials=4"
req_components = list(/obj/item/weapon/stock_parts/capacitor = 1)
/obj/machinery/recharger/RefreshParts()
@@ -163,4 +163,4 @@
else
icon_state = "recharger2"
return
- icon_state = "recharger0"
\ No newline at end of file
+ icon_state = "recharger0"
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index 4b37378f666..f98ac6d0605 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -28,7 +28,7 @@ var/const/SAFETY_COOLDOWN = 100
/obj/item/weapon/circuitboard/machine/recycler
name = "circuit board (Recycler)"
build_path = /obj/machinery/recycler
- origin_tech = "programming=1"
+ origin_tech = "programming=2;engineering=2"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/weapon/stock_parts/manipulator = 1)
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index 1ee601cc453..3bd1330e37f 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -31,7 +31,7 @@
/obj/item/weapon/circuitboard/machine/space_heater
name = "circuit board (Space Heater)"
build_path = /obj/machinery/space_heater
- origin_tech = "programming=2;engineering=2"
+ origin_tech = "programming=2;engineering=2;plasmatech=2"
req_components = list(
/obj/item/weapon/stock_parts/micro_laser = 1,
/obj/item/weapon/stock_parts/capacitor = 1,
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index 3243e0cf5fb..4cebbf7c5ce 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -201,7 +201,7 @@
icon = 'icons/obj/radio.dmi'
icon_state = "beacon"
desc = "A label on it reads: Warning: Activating this device will send a special beacon to your location."
- origin_tech = "bluespace=1;syndicate=7"
+ origin_tech = "bluespace=6;syndicate=5"
w_class = 2
var/droptype = /obj/machinery/power/singularity_beacon/syndicate
@@ -217,7 +217,9 @@
/obj/item/device/sbeacondrop/bomb
desc = "A label on it reads: Warning: Activating this device will send a high-ordinance explosive to your location."
droptype = /obj/machinery/syndicatebomb
+ origin_tech = "bluespace=5;syndicate=5"
/obj/item/device/sbeacondrop/powersink
desc = "A label on it reads: Warning: Activating this device will send a power draining device to your location."
droptype = /obj/item/device/powersink
+ origin_tech = "bluespace=4;syndicate=5"
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index 26692706d2a..c31202c2c1b 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -210,7 +210,7 @@
icon_state = "bombcore"
item_state = "eshield0"
w_class = 3
- origin_tech = "syndicate=6;combat=5"
+ origin_tech = "syndicate=5;combat=6"
burn_state = FLAMMABLE //Burnable (but the casing isn't)
var/adminlog = null
@@ -465,7 +465,7 @@
icon_state = "bigred"
item_state = "electronic"
w_class = 1
- origin_tech = "syndicate=2"
+ origin_tech = "syndicate=3"
var/cooldown = 0
var/detonated = 0
var/existant = 0
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index edfe1f58dc8..c7f01c94071 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -992,9 +992,10 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/clothing/glasses/regular=2,/obj/item/clothing/head/sombrero=1,/obj/item/clothing/suit/poncho=1,
/obj/item/clothing/suit/ianshirt=1,/obj/item/clothing/shoes/laceup=2,/obj/item/clothing/shoes/sneakers/black=4,
/obj/item/clothing/shoes/sandal=1, /obj/item/clothing/gloves/fingerless=2,/obj/item/clothing/glasses/orange=1,/obj/item/clothing/glasses/red=1,
- /obj/item/weapon/storage/belt/fannypack=1, /obj/item/weapon/storage/belt/fannypack/blue=1, /obj/item/weapon/storage/belt/fannypack/red=1)
- contraband = list(/obj/item/clothing/under/syndicate/tacticool=1,/obj/item/clothing/mask/balaclava=1,/obj/item/clothing/head/ushanka=1,/obj/item/clothing/under/soviet=1,/obj/item/weapon/storage/belt/fannypack/black=2)
- premium = list(/obj/item/clothing/under/suit_jacket/checkered=1,/obj/item/clothing/head/mailman=1,/obj/item/clothing/under/rank/mailman=1,/obj/item/clothing/suit/jacket/leather=1,/obj/item/clothing/suit/jacket/leather/overcoat=1,/obj/item/clothing/under/pants/mustangjeans=1,/obj/item/clothing/tie/dope_necklace=3)
+ /obj/item/weapon/storage/belt/fannypack=1, /obj/item/weapon/storage/belt/fannypack/blue=1, /obj/item/weapon/storage/belt/fannypack/red=1, /obj/item/clothing/suit/jacket/letterman=2,
+ /obj/item/clothing/suit/jacket/letterman_red=1)
+ contraband = list(/obj/item/clothing/under/syndicate/tacticool=1,/obj/item/clothing/mask/balaclava=1,/obj/item/clothing/head/ushanka=1,/obj/item/clothing/under/soviet=1,/obj/item/weapon/storage/belt/fannypack/black=2,/obj/item/clothing/suit/jacket/letterman_syndie=1)
+ premium = list(/obj/item/clothing/under/suit_jacket/checkered=1,/obj/item/clothing/head/mailman=1,/obj/item/clothing/under/rank/mailman=1,/obj/item/clothing/suit/jacket/leather=1,/obj/item/clothing/suit/jacket/leather/overcoat=1,/obj/item/clothing/under/pants/mustangjeans=1,/obj/item/clothing/tie/dope_necklace=3,/obj/item/clothing/suit/jacket/letterman_nanotrasen=1)
refill_canister = /obj/item/weapon/vending_refill/clothing
#undef STANDARD_CHARGE
diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index d2ff930d4eb..9d061f39e39 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -1,4 +1,3 @@
-//TODO: Add critfail checks and reliability
//DO NOT ADD MECHA PARTS TO THE GAME WITH THE DEFAULT "SPRITE ME" SPRITE!
//I'm annoyed I even have to tell you this! SPRITE FIRST, then commit.
@@ -7,7 +6,7 @@
icon = 'icons/mecha/mecha_equipment.dmi'
icon_state = "mecha_equip"
force = 5
- origin_tech = "materials=2"
+ origin_tech = "materials=2;engineering=2"
var/equip_cooldown = 0 // cooldown after use
var/equip_ready = 1 //whether the equipment is ready for use. (or deactivated/activated for static stuff)
var/energy_drain = 0
@@ -155,4 +154,4 @@
/obj/item/mecha_parts/mecha_equipment/proc/needs_rearm()
- return 0
\ No newline at end of file
+ return 0
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index d9620ef7132..732fdc85a09 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -34,10 +34,9 @@
desc = "Equipment for medical exosuits. A mounted sleeper that stabilizes patients and can inject reagents in the exosuit's reserves."
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper"
- origin_tech = "programming=2;biotech=3"
+ origin_tech = "engineering=3;biotech=3;plasmatech=2"
energy_drain = 20
range = MELEE
- reliability = 1000
equip_cooldown = 20
var/mob/living/carbon/patient = null
var/inject_amount = 10
@@ -260,7 +259,7 @@
var/mode = 0 //0 - fire syringe, 1 - analyze reagents.
range = MELEE|RANGED
equip_cooldown = 10
- origin_tech = "materials=3;biotech=4;magnets=4;programming=3"
+ origin_tech = "materials=3;biotech=4;magnets=4"
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/New()
..()
@@ -523,8 +522,6 @@
log_message("Reagent processing stopped.")
SSobj.processing -= src
return
- if(anyprob(reliability))
- critfail()
var/amount = synth_speed / processed_reagents.len
for(var/reagent in processed_reagents)
reagents.add_reagent(reagent,amount)
diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm
index a5363b7795a..468483fac8d 100644
--- a/code/game/mecha/equipment/tools/mining_tools.dm
+++ b/code/game/mecha/equipment/tools/mining_tools.dm
@@ -96,22 +96,19 @@
target.updatehealth()
-
/obj/item/mecha_parts/mecha_equipment/drill/diamonddrill
name = "diamond-tipped exosuit drill"
desc = "Equipment for engineering and combat exosuits. This is an upgraded version of the drill that'll pierce the heavens!"
icon_state = "mecha_diamond_drill"
- origin_tech = "materials=4;engineering=3"
+ origin_tech = "materials=4;engineering=4"
equip_cooldown = 20
force = 15
-
/obj/item/mecha_parts/mecha_equipment/mining_scanner
name = "exosuit mining scanner"
desc = "Equipment for engineering and combat exosuits. It will automatically check surrounding rock for useful minerals."
icon_state = "mecha_analyzer"
- origin_tech = "materials=3;engineering=2"
selectable = 0
equip_cooldown = 30
var/scanning = 0
@@ -146,5 +143,3 @@
mineral_scan_pulse(L,get_turf(loc))
spawn(equip_cooldown)
scanning = 0
-
-
diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm
index ead3ad8781d..d5f1906bf8f 100644
--- a/code/game/mecha/equipment/tools/other_tools.dm
+++ b/code/game/mecha/equipment/tools/other_tools.dm
@@ -8,7 +8,7 @@
name = "mounted teleporter"
desc = "An exosuit module that allows exosuits to teleport to any position in view."
icon_state = "mecha_teleport"
- origin_tech = "bluespace=10"
+ origin_tech = "bluespace=7"
equip_cooldown = 150
energy_drain = 1000
range = RANGED
@@ -28,7 +28,7 @@
name = "mounted wormhole generator"
desc = "An exosuit module that allows generating of small quasi-stable wormholes."
icon_state = "mecha_wholegen"
- origin_tech = "bluespace=3"
+ origin_tech = "bluespace=4;magnets=4;plasmatech=2"
equip_cooldown = 50
energy_drain = 300
range = RANGED
@@ -78,7 +78,7 @@
name = "mounted gravitational catapult"
desc = "An exosuit mounted Gravitational Catapult."
icon_state = "mecha_teleport"
- origin_tech = "bluespace=2;magnets=3"
+ origin_tech = "bluespace=3;magnets=3;engineering=4"
equip_cooldown = 10
energy_drain = 100
range = MELEE|RANGED
@@ -146,7 +146,7 @@
name = "armor booster module (Close Combat Weaponry)"
desc = "Boosts exosuit armor against armed melee attacks. Requires energy to operate."
icon_state = "mecha_abooster_ccw"
- origin_tech = "materials=3"
+ origin_tech = "materials=4;combat=4"
equip_cooldown = 10
energy_drain = 50
range = 0
@@ -165,7 +165,7 @@
name = "armor booster module (Ranged Weaponry)"
desc = "Boosts exosuit armor against ranged attacks. Completely blocks taser shots. Requires energy to operate."
icon_state = "mecha_abooster_proj"
- origin_tech = "materials=4"
+ origin_tech = "materials=4;combat=3;engineering=3"
equip_cooldown = 10
energy_drain = 50
range = 0
@@ -186,7 +186,7 @@
name = "exosuit repair droid"
desc = "An automated repair droid for exosuits. Scans for damage and repairs it. Can fix almost all types of external or internal damage."
icon_state = "repair_droid"
- origin_tech = "magnets=3;programming=3"
+ origin_tech = "magnets=3;programming=3;engineering=4"
energy_drain = 50
range = 0
var/health_boost = 1
@@ -271,7 +271,7 @@
name = "exosuit energy relay"
desc = "An exosuit module that wirelessly drains energy from any available power channel in area. The performance index is quite low."
icon_state = "tesla"
- origin_tech = "magnets=4;powerstorage=3"
+ origin_tech = "magnets=4;powerstorage=4;engineering=4"
energy_drain = 0
range = 0
var/coeff = 100
@@ -356,7 +356,7 @@
name = "exosuit plasma converter"
desc = "An exosuit module that generates power using solid plasma as fuel. Pollutes the environment."
icon_state = "tesla"
- origin_tech = "plasmatech=2;powerstorage=2;engineering=1"
+ origin_tech = "plasmatech=2;powerstorage=2;engineering=2"
range = MELEE
var/coeff = 100
var/obj/item/stack/sheet/fuel
@@ -364,7 +364,6 @@
var/fuel_per_cycle_idle = 25
var/fuel_per_cycle_active = 200
var/power_per_cycle = 20
- reliability = 1000
/obj/item/mecha_parts/mecha_equipment/generator/New()
..()
@@ -453,11 +452,6 @@
log_message("Deactivated - no fuel.")
set_ready_state(1)
return
- if(anyprob(reliability))
- set_ready_state(1) //inactive
- critfail()
- SSobj.processing.Remove(src)
- return
var/cur_charge = chassis.get_charge()
if(isnull(cur_charge))
set_ready_state(1)
@@ -478,7 +472,7 @@
name = "exonuclear reactor"
desc = "An exosuit module that generates power using uranium as fuel. Pollutes the environment."
icon_state = "tesla"
- origin_tech = "powerstorage=3;engineering=3"
+ origin_tech = "powerstorage=4;engineering=4"
max_fuel = 50000
fuel_per_cycle_idle = 10
fuel_per_cycle_active = 30
@@ -495,5 +489,3 @@
/obj/item/mecha_parts/mecha_equipment/generator/nuclear/process()
if(..())
radiation_pulse(get_turf(src), 2, 7, rad_per_cycle, 1)
-
-
diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm
index f26a59501c0..d6a4498279f 100644
--- a/code/game/mecha/equipment/tools/work_tools.dm
+++ b/code/game/mecha/equipment/tools/work_tools.dm
@@ -190,7 +190,7 @@
name = "mounted RCD"
desc = "An exosuit-mounted Rapid Construction Device."
icon_state = "mecha_rcd"
- origin_tech = "materials=4;bluespace=3;magnets=4;powerstorage=4"
+ origin_tech = "materials=4;bluespace=3;magnets=4;powerstorage=4;engineering=4"
equip_cooldown = 10
energy_drain = 250
range = MELEE|RANGED
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 54c7aaaa985..418d29e3d59 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -71,6 +71,7 @@
name = "\improper CH-PS \"Immolator\" laser"
desc = "A weapon for combat exosuits. Shoots basic lasers."
icon_state = "mecha_laser"
+ origin_tech = "magnets=3;combat=3;engineering=3"
energy_drain = 30
projectile = /obj/item/projectile/beam/laser
fire_sound = 'sound/weapons/Laser.ogg'
@@ -80,6 +81,7 @@
name = "\improper CH-LC \"Solaris\" laser cannon"
desc = "A weapon for combat exosuits. Shoots heavy lasers."
icon_state = "mecha_laser"
+ origin_tech = "magnets=4;combat=4;engineering=3"
energy_drain = 60
projectile = /obj/item/projectile/beam/laser/heavylaser
fire_sound = 'sound/weapons/lasercannonfire.ogg'
@@ -89,6 +91,7 @@
name = "\improper MKIV ion heavy cannon"
desc = "A weapon for combat exosuits. Shoots technology-disabling ion beams. Don't catch yourself in the blast!"
icon_state = "mecha_ion"
+ origin_tech = "materials=4;combat=5;magnets=4"
energy_drain = 120
projectile = /obj/item/projectile/ion
fire_sound = 'sound/weapons/Laser.ogg'
@@ -110,7 +113,7 @@
icon_state = "mecha_plasmacutter"
item_state = "plasmacutter"
energy_drain = 60
- origin_tech = "materials=3;combat=2;powerstorage=3;plasmatech=3"
+ origin_tech = "materials=3;plasmatech=4;engineering=3"
projectile = /obj/item/projectile/plasma/adv/mech
fire_sound = 'sound/weapons/Laser.ogg'
@@ -140,6 +143,7 @@
name = "\improper PBT \"Pacifier\" mounted taser"
desc = "A weapon for combat exosuits. Shoots non-lethal stunning electrodes."
icon_state = "mecha_taser"
+ origin_tech = "combat=3"
energy_drain = 20
equip_cooldown = 8
projectile = /obj/item/projectile/energy/electrode
@@ -243,6 +247,7 @@
name = "\improper FNX-99 \"Hades\" Carbine"
desc = "A weapon for combat exosuits. Shoots incendiary bullets."
icon_state = "mecha_carbine"
+ origin_tech = "materials=4;combat=4"
equip_cooldown = 5
projectile = /obj/item/projectile/bullet/incendiary/shell/dragonsbreath
projectiles = 24
@@ -262,6 +267,7 @@
name = "\improper LBX AC 10 \"Scattershot\""
desc = "A weapon for combat exosuits. Shoots a spread of pellets."
icon_state = "mecha_scatter"
+ origin_tech = "combat=4"
equip_cooldown = 20
projectile = /obj/item/projectile/bullet/midbullet
projectiles = 40
@@ -273,6 +279,7 @@
name = "\improper Ultra AC 2"
desc = "A weapon for combat exosuits. Shoots a rapid, three shot burst."
icon_state = "mecha_uac2"
+ origin_tech = "combat=4"
equip_cooldown = 10
projectile = /obj/item/projectile/bullet/weakbullet3
projectiles = 300
@@ -305,6 +312,7 @@
name = "\improper SRM-8 missile rack"
desc = "A weapon for combat exosuits. Shoots light explosive missiles."
icon_state = "mecha_missilerack"
+ origin_tech = "combat=5;materials=4;engineering=4"
projectile = /obj/item/missile
fire_sound = 'sound/weapons/grenadelaunch.ogg'
projectiles = 8
@@ -334,6 +342,7 @@
name = "\improper SGL-6 grenade launcher"
desc = "A weapon for combat exosuits. Launches primed flashbangs."
icon_state = "mecha_grenadelnchr"
+ origin_tech = "combat=4;engineering=4"
projectile = /obj/item/weapon/grenade/flashbang
fire_sound = 'sound/weapons/grenadelaunch.ogg'
projectiles = 6
@@ -354,6 +363,7 @@
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/clusterbang //Because I am a heartless bastard -Sieve //Heartless? for making the poor man's honkblast? - Kaze
name = "\improper SOB-3 grenade launcher"
desc = "A weapon for combat exosuits. Launches primed clusterbangs. You monster."
+ origin_tech = "combat=4;materials=4"
projectiles = 3
projectile = /obj/item/weapon/grenade/clusterbuster
projectile_energy_cost = 1600 //getting off cheap seeing as this is 3 times the flashbangs held in the grenade launcher.
@@ -395,4 +405,3 @@
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar/proj_init(var/obj/item/device/assembly/mousetrap/armed/M)
M.secured = 1
-
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index 9ab089a34ff..cddf69f5016 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -33,7 +33,7 @@
/obj/item/weapon/circuitboard/machine/mech_recharger
name = "circuit board (Mechbay Recharger)"
build_path = /obj/machinery/mech_bay_recharge_port
- origin_tech = "programming=3;powerstorage=4;engineering=4"
+ origin_tech = "programming=3;powerstorage=3;engineering=3"
req_components = list(
/obj/item/stack/cable_coil = 2,
/obj/item/weapon/stock_parts/capacitor = 5)
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 5de9c676059..429460f0d67 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -10,6 +10,7 @@
active_power_usage = 5000
req_access = list(access_robotics)
var/time_coeff = 1
+ var/component_coeff = 1
var/list/resources = list(
MAT_METAL=0,
MAT_GLASS=0,
@@ -53,7 +54,7 @@
/obj/item/weapon/circuitboard/machine/mechfab
name = "circuit board (Exosuit Fabricator)"
build_path = /obj/machinery/mecha_part_fabricator
- origin_tech = "programming=3;engineering=3"
+ origin_tech = "programming=2;engineering=2"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 2,
/obj/item/weapon/stock_parts/manipulator = 1,
@@ -68,6 +69,12 @@
T += M.rating
res_max_amount = (187000+(T * 37500))
+ //resources adjustment coefficient (1 -> 0.85 -> 0.7 -> 0.55)
+ T = 1.15
+ for(var/obj/item/weapon/stock_parts/micro_laser/Ma in component_parts)
+ T -= Ma.rating*0.15
+ component_coeff = T
+
//building time adjustment coefficient (1 -> 0.8 -> 0.6)
T = -1
for(var/obj/item/weapon/stock_parts/manipulator/Ml in component_parts)
@@ -266,7 +273,7 @@
return
/obj/machinery/mecha_part_fabricator/proc/get_resource_cost_w_coeff(datum/design/D, resource, roundto = 1)
- return round(D.materials[resource], roundto)
+ return round(D.materials[resource]*component_coeff, roundto)
/obj/machinery/mecha_part_fabricator/proc/get_construction_time_w_coeff(datum/design/D, roundto = 1) //aran
return round(initial(D.construction_time)*time_coeff, roundto)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index d05e83da56f..9c30fc863fd 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -164,7 +164,6 @@
WR.crowbar_salvage += E
E.detach(WR) //detaches from src into WR
E.equip_ready = 1
- E.reliability = round(rand(E.reliability/3,E.reliability))
else
E.detach(loc)
qdel(E)
diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm
index 40037689a9e..73e669839b7 100644
--- a/code/game/mecha/mecha_parts.dm
+++ b/code/game/mecha/mecha_parts.dm
@@ -8,7 +8,7 @@
icon_state = "blank"
w_class = 6
flags = CONDUCT
- origin_tech = "programming=2;materials=2"
+ origin_tech = "programming=2;materials=2;engineering=2"
/obj/item/mecha_parts/chassis
name="Mecha Chassis"
@@ -41,25 +41,61 @@
name = "\improper Ripley left arm"
desc = "A Ripley APLU left arm. Data and power sockets are compatible with most exosuit tools."
icon_state = "ripley_l_arm"
- origin_tech = "programming=2;materials=2;engineering=2"
/obj/item/mecha_parts/part/ripley_right_arm
name = "\improper Ripley right arm"
desc = "A Ripley APLU right arm. Data and power sockets are compatible with most exosuit tools."
icon_state = "ripley_r_arm"
- origin_tech = "programming=2;materials=2;engineering=2"
/obj/item/mecha_parts/part/ripley_left_leg
name = "\improper Ripley left leg"
desc = "A Ripley APLU left leg. Contains somewhat complex servodrives and balance maintaining systems."
icon_state = "ripley_l_leg"
- origin_tech = "programming=2;materials=2;engineering=2"
/obj/item/mecha_parts/part/ripley_right_leg
name = "\improper Ripley right leg"
desc = "A Ripley APLU right leg. Contains somewhat complex servodrives and balance maintaining systems."
icon_state = "ripley_r_leg"
- origin_tech = "programming=2;materials=2;engineering=2"
+
+///////// Odysseus
+
+/obj/item/mecha_parts/chassis/odysseus
+ name = "\improper Odysseus chassis"
+
+/obj/item/mecha_parts/chassis/odysseus/New()
+ ..()
+ construct = new /datum/construction/mecha/odysseus_chassis(src)
+
+/obj/item/mecha_parts/part/odysseus_head
+ name = "\improper Odysseus head"
+ desc = "An Odysseus head. Contains an integrated medical HUD scanner."
+ icon_state = "odysseus_head"
+
+/obj/item/mecha_parts/part/odysseus_torso
+ name = "\improper Odysseus torso"
+ desc="A torso part of Odysseus. Contains power unit, processing core and life support systems along with an attachment port for a mounted sleeper."
+ icon_state = "odysseus_torso"
+ origin_tech = "programming=2;materials=2;biotech=2;engineering=2"
+
+/obj/item/mecha_parts/part/odysseus_left_arm
+ name = "\improper Odysseus left arm"
+ desc = "An Odysseus left arm. Data and power sockets are compatible with specialized medical equipment."
+ icon_state = "odysseus_l_arm"
+
+/obj/item/mecha_parts/part/odysseus_right_arm
+ name = "\improper Odysseus right arm"
+ desc = "An Odysseus right arm. Data and power sockets are compatible with specialized medical equipment."
+ icon_state = "odysseus_r_arm"
+
+/obj/item/mecha_parts/part/odysseus_left_leg
+ name = "\improper Odysseus left leg"
+ desc = "An Odysseus left leg. Contains complex servodrives and balance maintaining systems to maintain stability for critical patients."
+ icon_state = "odysseus_l_leg"
+
+/obj/item/mecha_parts/part/odysseus_right_leg
+ name = "\improper Odysseus right leg"
+ desc = "A Odysseus right leg. Contains complex servodrives and balance maintaining systems to maintain stability for critical patients."
+ icon_state = "odysseus_r_leg"
///////// Gygax
@@ -74,44 +110,44 @@
name = "\improper Gygax torso"
desc = "A torso part of Gygax. Contains power unit, processing core and life support systems."
icon_state = "gygax_harness"
- origin_tech = "programming=2;materials=2;biotech=3;engineering=3"
+ origin_tech = "programming=2;materials=4;biotech=3;engineering=3"
/obj/item/mecha_parts/part/gygax_head
name = "\improper Gygax head"
desc = "A Gygax head. Houses advanced surveilance and targeting sensors."
icon_state = "gygax_head"
- origin_tech = "programming=2;materials=2;magnets=3;engineering=3"
+ origin_tech = "programming=2;materials=4;magnets=3;engineering=3"
/obj/item/mecha_parts/part/gygax_left_arm
name = "\improper Gygax left arm"
desc = "A Gygax left arm. Data and power sockets are compatible with most exosuit tools and weapons."
icon_state = "gygax_l_arm"
- origin_tech = "programming=2;materials=2;engineering=3"
+ origin_tech = "programming=2;materials=4;engineering=3"
/obj/item/mecha_parts/part/gygax_right_arm
name = "\improper Gygax right arm"
desc = "A Gygax right arm. Data and power sockets are compatible with most exosuit tools and weapons."
icon_state = "gygax_r_arm"
- origin_tech = "programming=2;materials=2;engineering=3"
+ origin_tech = "programming=2;materials=4;engineering=3"
/obj/item/mecha_parts/part/gygax_left_leg
name = "\improper Gygax left leg"
desc = "A Gygax left leg. Constructed with advanced servomechanisms and actuators to enable faster speed."
icon_state = "gygax_l_leg"
- origin_tech = "programming=2;materials=2;engineering=3"
+ origin_tech = "programming=2;materials=4;engineering=3"
/obj/item/mecha_parts/part/gygax_right_leg
name = "\improper Gygax right leg"
desc = "A Gygax right leg. Constructed with advanced servomechanisms and actuators to enable faster speed."
icon_state = "gygax_r_leg"
- origin_tech = "programming=2;materials=2;engineering=3"
+ origin_tech = "programming=2;materials=4;engineering=3"
/obj/item/mecha_parts/part/gygax_armor
gender = PLURAL
name = "\improper Gygax armor plates"
desc = "A set of armor plates designed for the Gygax. Designed to effectively deflect damage with a lightweight construction."
icon_state = "gygax_armor"
- origin_tech = "materials=6;combat=4;engineering=5"
+ origin_tech = "materials=6;combat=4;engineering=4"
//////////// Durand
@@ -164,7 +200,7 @@
name = "\improper Durand armor plates"
desc = "A set of armor plates for the Durand. Built heavy to resist an incredible amount of brute force."
icon_state = "durand_armor"
- origin_tech = "materials=5;combat=4;engineering=5"
+ origin_tech = "materials=5;combat=4;engineering=4"
////////// Firefighter
@@ -220,7 +256,6 @@
/obj/item/mecha_parts/chassis/phazon
name = "\improper Phazon chassis"
- origin_tech = "materials=6"
/obj/item/mecha_parts/chassis/phazon/New()
..()
@@ -230,88 +265,43 @@
name="\improper Phazon torso"
desc="A Phazon torso part. The socket for the bluespace core that powers the exosuit's unique phase drives is located in the middle."
icon_state = "phazon_harness"
- origin_tech = "programming=5;materials=6;bluespace=5;powerstorage=5"
+ origin_tech = "programming=4;materials=4;bluespace=4;plasmatech=5"
/obj/item/mecha_parts/part/phazon_head
name="\improper Phazon head"
desc="A Phazon head. Its sensors are carefully calibrated to provide vision and data even when the exosuit is phasing."
icon_state = "phazon_head"
- origin_tech = "programming=4;materials=5;magnets=5"
+ origin_tech = "programming=3;materials=3;magnets=3"
/obj/item/mecha_parts/part/phazon_left_arm
name="\improper Phazon left arm"
desc="A Phazon left arm. Several microtool arrays are located under the armor plating, which can be adjusted to the situation at hand."
icon_state = "phazon_l_arm"
- origin_tech = "materials=5;bluespace=2;magnets=2"
+ origin_tech = "materials=3;bluespace=3;magnets=3"
/obj/item/mecha_parts/part/phazon_right_arm
name="\improper Phazon right arm"
desc="A Phazon right arm. Several microtool arrays are located under the armor plating, which can be adjusted to the situation at hand."
icon_state = "phazon_r_arm"
- origin_tech = "materials=5;bluespace=2;magnets=2"
+ origin_tech = "materials=3;bluespace=3;magnets=3"
/obj/item/mecha_parts/part/phazon_left_leg
name="\improper Phazon left leg"
desc="A Phazon left leg. It contains the unique phase drives that allow the exosuit to phase through solid matter when engaged."
icon_state = "phazon_l_leg"
- origin_tech = "materials=5;bluespace=3;magnets=3"
+ origin_tech = "materials=3;bluespace=3;magnets=3"
/obj/item/mecha_parts/part/phazon_right_leg
name="\improper Phazon right leg"
desc="A Phazon right leg. It contains the unique phase drives that allow the exosuit to phase through solid matter when engaged."
icon_state = "phazon_r_leg"
- origin_tech = "materials=5;bluespace=3;magnets=3"
+ origin_tech = "materials=3;bluespace=3;magnets=3"
/obj/item/mecha_parts/part/phazon_armor
name="Phazon armor"
desc="Phazon armor plates. They are layered with plasma to protect the pilot from the stress of phasing and have unusual properties."
icon_state = "phazon_armor"
- origin_tech = "materials=6;bluespace=5;magnets=5"
-///////// Odysseus
-
-
-/obj/item/mecha_parts/chassis/odysseus
- name = "\improper Odysseus chassis"
-
-/obj/item/mecha_parts/chassis/odysseus/New()
- ..()
- construct = new /datum/construction/mecha/odysseus_chassis(src)
-
-/obj/item/mecha_parts/part/odysseus_head
- name = "\improper Odysseus head"
- desc = "An Odysseus head. Contains an integrated medical HUD scanner."
- icon_state = "odysseus_head"
- origin_tech = "programming=3;materials=2"
-
-/obj/item/mecha_parts/part/odysseus_torso
- name = "\improper Odysseus torso"
- desc="A torso part of Odysseus. Contains power unit, processing core and life support systems along with an attachment port for a mounted sleeper."
- icon_state = "odysseus_torso"
- origin_tech = "programming=2;materials=2;biotech=2;engineering=2"
-
-/obj/item/mecha_parts/part/odysseus_left_arm
- name = "\improper Odysseus left arm"
- desc = "An Odysseus left arm. Data and power sockets are compatible with specialized medical equipment."
- icon_state = "odysseus_l_arm"
- origin_tech = "programming=2;materials=2;engineering=2"
-
-/obj/item/mecha_parts/part/odysseus_right_arm
- name = "\improper Odysseus right arm"
- desc = "An Odysseus right arm. Data and power sockets are compatible with specialized medical equipment."
- icon_state = "odysseus_r_arm"
- origin_tech = "programming=2;materials=2;engineering=2"
-
-/obj/item/mecha_parts/part/odysseus_left_leg
- name = "\improper Odysseus left leg"
- desc = "An Odysseus left leg. Contains complex servodrives and balance maintaining systems to maintain stability for critical patients."
- icon_state = "odysseus_l_leg"
- origin_tech = "programming=2;materials=2;engineering=2"
-
-/obj/item/mecha_parts/part/odysseus_right_leg
- name = "\improper Odysseus right leg"
- desc = "A Odysseus right leg. Contains complex servodrives and balance maintaining systems to maintain stability for critical patients."
- icon_state = "odysseus_r_leg"
- origin_tech = "programming=2;materials=2;engineering=2"
+ origin_tech = "materials=4;bluespace=4;plasmatech=5"
///////// Circuitboards
@@ -329,7 +319,7 @@
throw_range = 7
/obj/item/weapon/circuitboard/mecha/ripley
- origin_tech = "programming=3"
+ origin_tech = "programming=2"
/obj/item/weapon/circuitboard/mecha/ripley/peripherals
name = "circuit board (Ripley Peripherals Control module)"
@@ -340,7 +330,7 @@
icon_state = "mainboard"
/obj/item/weapon/circuitboard/mecha/gygax
- origin_tech = "programming=4"
+ origin_tech = "programming=4;combat=3;engineering=3"
/obj/item/weapon/circuitboard/mecha/gygax/peripherals
name = "circuit board (Gygax Peripherals Control module)"
@@ -356,7 +346,7 @@
icon_state = "mainboard"
/obj/item/weapon/circuitboard/mecha/durand
- origin_tech = "programming=4"
+ origin_tech = "programming=4;combat=3;engineering=3"
/obj/item/weapon/circuitboard/mecha/durand/peripherals
name = "circuit board (Durand Peripherals Control module)"
@@ -365,14 +355,14 @@
/obj/item/weapon/circuitboard/mecha/durand/targeting
name = "circuit board (Durand Weapon Control and Targeting module)"
icon_state = "mcontroller"
- origin_tech = "programming=4;combat=4"
+ origin_tech = "programming=4;combat=4;engineering=3"
/obj/item/weapon/circuitboard/mecha/durand/main
name = "circuit board (Durand Central Control module)"
icon_state = "mainboard"
/obj/item/weapon/circuitboard/mecha/honker
- origin_tech = "programming=4"
+ origin_tech = "programming=3;engineering=3"
/obj/item/weapon/circuitboard/mecha/honker/peripherals
name = "circuit board (H.O.N.K Peripherals Control module)"
@@ -387,7 +377,7 @@
icon_state = "mainboard"
/obj/item/weapon/circuitboard/mecha/odysseus
- origin_tech = "programming=3"
+ origin_tech = "programming=3;biotech=3"
/obj/item/weapon/circuitboard/mecha/odysseus/peripherals
name = "circuit board (Odysseus Peripherals Control module)"
@@ -398,7 +388,7 @@
icon_state = "mainboard"
/obj/item/weapon/circuitboard/mecha/phazon
- origin_tech = "programming=5"
+ origin_tech = "programming=5;plasmatech=4"
/obj/item/weapon/circuitboard/mecha/phazon/peripherals
name = "circuit board (Phazon Peripherals Control module)"
@@ -409,4 +399,4 @@
icon_state = "mcontroller"
/obj/item/weapon/circuitboard/mecha/phazon/main
- name = "circuit board (Phazon Central Control module)"
\ No newline at end of file
+ name = "circuit board (Phazon Central Control module)"
diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm
index f33b6529a89..458633001ca 100644
--- a/code/game/objects/effects/anomalies.dm
+++ b/code/game/objects/effects/anomalies.dm
@@ -58,7 +58,7 @@
/obj/effect/anomaly/grav/New()
..()
- aSignal.origin_tech = "magnets=5;powerstorage=4"
+ aSignal.origin_tech = "magnets=7"
/obj/effect/anomaly/grav/anomalyEffect()
..()
@@ -104,7 +104,7 @@
/obj/effect/anomaly/flux/New()
..()
- aSignal.origin_tech = "powerstorage=6;programming=4;plasmatech=4"
+ aSignal.origin_tech = "powerstorage=7"
/obj/effect/anomaly/flux/anomalyEffect()
..()
@@ -146,7 +146,7 @@
/obj/effect/anomaly/bluespace/New()
..()
- aSignal.origin_tech = "bluespace=5;magnets=5;powerstorage=3"
+ aSignal.origin_tech = "bluespace=7"
/obj/effect/anomaly/bluespace/anomalyEffect()
..()
@@ -166,7 +166,7 @@
/obj/effect/anomaly/pyro/New()
..()
- aSignal.origin_tech = "plasmatech=5;powerstorage=4;biotech=6"
+ aSignal.origin_tech = "plasmatech=7"
/obj/effect/anomaly/pyro/anomalyEffect()
..()
@@ -183,7 +183,7 @@
/obj/effect/anomaly/bhole/New()
..()
- aSignal.origin_tech = "materials=5;combat=4;engineering=4"
+ aSignal.origin_tech = "engineering=7"
/obj/effect/anomaly/bhole/anomalyEffect()
..()
@@ -231,4 +231,4 @@
//Damaging the turf
if( T && prob(turf_removal_chance) )
T.ex_act(ex_act_force)
- return
\ No newline at end of file
+ return
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 2839bb1250b..54a33a19464 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -55,7 +55,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
var/put_on_delay = 20
var/breakouttime = 0
var/list/materials = list()
- var/reliability = 100 //Used by SOME devices to determine how reliable they are.
var/origin_tech = null //Used by R&D to determine what research bonuses it grants.
var/needs_permit = 0 //Used by security bots to determine if this item is safe for public use.
@@ -202,9 +201,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
var/list/techlvls = params2list(origin_tech)
for(var/T in techlvls) //This needs to use the better names.
msg += "Tech: [CallTechName(T)] | magnitude: [techlvls[T]] "
- msg += "Research reliability: [reliability]% "
- if(crit_fail)
- msg += "Critical failure detected in subject! "
else
msg += "No tech origins detected. "
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index 83ac1b58805..3af9dfe0fef 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -99,6 +99,7 @@
icon_state = "bluebodybag_folded"
unfoldedbag_path = /obj/structure/closet/body_bag/bluespace
w_class = 2
+ origin_tech = "bluespace=4;materials=4;plasmatech=4"
/obj/structure/closet/body_bag/bluespace
name = "bluespace body bag"
diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm
index ebc9d68c184..4f69d9a5371 100644
--- a/code/game/objects/items/devices/aicard.dm
+++ b/code/game/objects/items/devices/aicard.dm
@@ -9,7 +9,7 @@
flags = NOBLUDGEON
var/flush = FALSE
var/mob/living/silicon/ai/AI
- origin_tech = "programming=4;materials=4"
+ origin_tech = "programming=3;materials=3"
/obj/item/device/aicard/afterattack(atom/target, mob/user, proximity)
..()
@@ -82,4 +82,4 @@
AI.radio_enabled = !AI.radio_enabled
AI << "Your Subspace Transceiver has been [AI.radio_enabled ? "enabled" : "disabled"]!"
. = TRUE
- update_icon()
\ No newline at end of file
+ update_icon()
diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm
index 4e9ecaf30e3..a49af05f819 100644
--- a/code/game/objects/items/devices/camera_bug.dm
+++ b/code/game/objects/items/devices/camera_bug.dm
@@ -14,7 +14,7 @@
item_state = "camera_bug"
throw_speed = 4
throw_range = 20
- origin_tech = "syndicate=3;engineering=1"
+ origin_tech = "syndicate=1;engineering=3"
flags = NOBLUDGEON
var/obj/machinery/camera/current = null
@@ -279,4 +279,4 @@
#undef BUGMODE_LIST
#undef BUGMODE_MONITOR
-#undef BUGMODE_TRACK
\ No newline at end of file
+#undef BUGMODE_TRACK
diff --git a/code/game/objects/items/devices/doorCharge.dm b/code/game/objects/items/devices/doorCharge.dm
index 972c33becde..bedc318e75e 100644
--- a/code/game/objects/items/devices/doorCharge.dm
+++ b/code/game/objects/items/devices/doorCharge.dm
@@ -10,7 +10,7 @@
force = 3
attack_verb = list("blown up", "exploded", "detonated")
materials = list(MAT_METAL=50, MAT_GLASS=30)
- origin_tech = "syndicate=3;combat=2"
+ origin_tech = "syndicate=1;combat=3;engineering=3"
/obj/item/device/doorCharge/ex_act(severity, target)
switch(severity)
@@ -30,4 +30,4 @@
if(user.mind in ticker.mode.traitors) //No nuke ops because the device is excluded from nuclear
user << "A small explosive device that can be used to sabotage airlocks to cause an explosion upon opening. To apply, remove the airlock's maintenance panel and place it within."
else
- user << "A small, suspicious object that feels lukewarm when held."
\ No newline at end of file
+ user << "A small, suspicious object that feels lukewarm when held."
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index f0f56523972..6686f2985cb 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -277,8 +277,7 @@ obj/item/device/flashlight/lamp/bananalamp
brightness_on = 6 //luminosity when on
/obj/item/device/flashlight/emp
- origin_tech = "magnets=4;syndicate=5"
-
+ origin_tech = "magnets=3;syndicate=1"
var/emp_max_charges = 4
var/emp_cur_charges = 4
var/charge_tick = 0
@@ -322,4 +321,4 @@ obj/item/device/flashlight/lamp/bananalamp
A.emp_act(1)
else
user << "\The [src] needs time to recharge!"
- return
\ No newline at end of file
+ return
diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm
index 27bad40ef89..2c6f0be7fe9 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -49,7 +49,7 @@
flags = CONDUCT
slot_flags = SLOT_BELT
- origin_tech = "magnets=3;materials=2"
+ origin_tech = "magnets=3;engineering=4"
var/max_uses = 20
var/uses = 0
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index bc65f1a0f12..b0db05d64d7 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -18,7 +18,7 @@
throw_range = 7
throw_speed = 3
materials = list(MAT_METAL=50, MAT_GLASS=20)
- origin_tech = "magnets=1;engineering=1"
+ origin_tech = "magnets=1;engineering=2"
var/obj/machinery/buffer // simple machine buffer for device linkage
hitsound = 'sound/weapons/tap.ogg'
toolspeed = 1
@@ -33,6 +33,7 @@
var/detect_state = PROXIMITY_NONE
var/rangealert = 8 //Glows red when inside
var/rangewarning = 20 //Glows yellow when inside
+ origin_tech = "magnets=1;engineering=2;syndicate=1"
/obj/item/device/multitool/ai_detect/New()
..()
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index bf0ccfde494..c948d0c000c 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -11,7 +11,7 @@
throw_speed = 1
throw_range = 2
materials = list(MAT_METAL=750)
- origin_tech = "powerstorage=3;syndicate=5"
+ origin_tech = "powerstorage=5;syndicate=5"
var/drain_rate = 1600000 // amount of power to drain per tick
var/power_drained = 0 // has drained this much power
var/max_power = 1e10 // maximum power that can be drained before exploding
diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm
index a1380e000e1..be17fd0631f 100644
--- a/code/game/objects/items/devices/radio/encryptionkey.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey.dm
@@ -5,6 +5,7 @@
icon = 'icons/obj/radio.dmi'
icon_state = "cypherkey"
w_class = 1
+ origin_tech = "engineering=2;bluespace=1"
var/translate_binary = 0
var/translate_hive = 0
var/syndie = 0
@@ -14,7 +15,7 @@
/obj/item/device/encryptionkey/syndicate
icon_state = "cypherkey"
channels = list("Syndicate" = 1)
- origin_tech = "syndicate=3"
+ origin_tech = "syndicate=1;engineering=3;bluespace=2"
syndie = 1//Signifies that it de-crypts Syndicate transmissions
/obj/item/device/encryptionkey/binary
@@ -22,7 +23,7 @@
desc = "An encryption key for a radio headset. To access the binary channel, use :b."
icon_state = "cypherkey"
translate_binary = 1
- origin_tech = "syndicate=3"
+ origin_tech = "syndicate=3;engineering=4;bluespace=3"
/obj/item/device/encryptionkey/headset_sec
name = "security radio encryption key"
@@ -125,4 +126,4 @@
channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1, "AI Private" = 1)
/obj/item/device/encryptionkey/secbot
- channels = list("AI Private"=1,"Security"=1)
\ No newline at end of file
+ channels = list("AI Private"=1,"Security"=1)
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 146610a5197..04153b9e578 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -324,10 +324,9 @@ MASS SPECTROMETER
throwforce = 0
throw_speed = 3
throw_range = 7
- materials = list(MAT_METAL=30, MAT_GLASS=20)
- origin_tech = "magnets=2;biotech=2"
+ materials = list(MAT_METAL=150, MAT_GLASS=100)
+ origin_tech = "magnets=2;biotech=1;plasmatech=2"
var/details = 0
- var/recent_fail = 0
/obj/item/device/mass_spectrometer/New()
..()
@@ -342,9 +341,6 @@ MASS SPECTROMETER
/obj/item/device/mass_spectrometer/attack_self(mob/user)
if (user.stat || user.eye_blind)
return
- if (crit_fail)
- user << "This device has critically failed and is no longer functional!"
- return
if (!user.IsAdvancedToolUser())
user << "You don't have the dexterity to do this!"
return
@@ -363,20 +359,9 @@ MASS SPECTROMETER
dat += " None"
else
for(var/R in blood_traces)
- if(prob(reliability))
- dat += " [chemical_reagents_list[R]]"
-
- if(details)
- dat += " ([blood_traces[R]] units)"
-
- recent_fail = 0
- else
- if(recent_fail)
- crit_fail = 1
- reagents.clear_reagents()
- return
- else
- recent_fail = 1
+ dat += " [chemical_reagents_list[R]]"
+ if(details)
+ dat += " ([blood_traces[R]] units)"
dat += ""
user << dat
reagents.clear_reagents()
@@ -386,14 +371,14 @@ MASS SPECTROMETER
name = "advanced mass-spectrometer"
icon_state = "adv_spectrometer"
details = 1
- origin_tech = "magnets=4;biotech=2"
+ origin_tech = "magnets=4;biotech=3;plasmatech=3"
/obj/item/device/slime_scanner
name = "slime scanner"
desc = "A device that analyzes a slime's internal composition and measures its stats."
icon_state = "adv_spectrometer"
item_state = "analyzer"
- origin_tech = "biotech=1"
+ origin_tech = "biotech=2"
w_class = 2
flags = CONDUCT
throwforce = 0
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 7cd44cecb81..c3c90724557 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -6,7 +6,7 @@
desc = "Protected by FRM."
icon = 'icons/obj/module.dmi'
icon_state = "cyborg_upgrade"
- origin_tech = "programming=4"
+ origin_tech = "programming=2"
var/locked = 0
var/installed = 0
var/require_module = 0
@@ -96,7 +96,7 @@
desc = "Used to kick in a cyborg's VTEC systems, increasing their speed."
icon_state = "cyborg_upgrade2"
require_module = 1
- origin_tech = "engineering=4;materials=5"
+ origin_tech = "engineering=4;materials=5;programming=4"
/obj/item/borg/upgrade/vtec/action(mob/living/silicon/robot/R)
if(..())
@@ -116,7 +116,7 @@
icon_state = "cyborg_upgrade3"
require_module = 1
module_type = /obj/item/weapon/robot_module/security
- origin_tech = "engineering=4;powerstorage=4"
+ origin_tech = "engineering=4;powerstorage=4;combat=4"
/obj/item/borg/upgrade/disablercooler/action(mob/living/silicon/robot/R)
if(..())
@@ -158,7 +158,7 @@
icon_state = "cyborg_upgrade3"
require_module = 1
module_type = /obj/item/weapon/robot_module/miner
- origin_tech = "engineering=5;materials=5"
+ origin_tech = "engineering=4;materials=5"
/obj/item/borg/upgrade/ddrill/action(mob/living/silicon/robot/R)
if(..())
@@ -180,7 +180,7 @@
icon_state = "cyborg_upgrade3"
require_module = 1
module_type = /obj/item/weapon/robot_module/miner
- origin_tech = "engineering=5;materials=5;bluespace=3"
+ origin_tech = "engineering=4;materials=4;bluespace=4"
/obj/item/borg/upgrade/soh/action(mob/living/silicon/robot/R)
if(..())
@@ -199,7 +199,7 @@
desc = "Unlocks the hidden, deadlier functions of a cyborg"
icon_state = "cyborg_upgrade3"
require_module = 1
- origin_tech = "combat=4;syndicate=2"
+ origin_tech = "combat=4;syndicate=1"
/obj/item/borg/upgrade/syndicate/action(mob/living/silicon/robot/R)
if(..())
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index eb1a1d7abd0..d7c582a35d0 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -105,7 +105,7 @@
desc = "A theraputic gel pack and bandages designed to treat blunt-force trauma."
icon_state = "brutepack"
heal_brute = 40
- origin_tech = "biotech=1"
+ origin_tech = "biotech=2"
self_delay = 20
/obj/item/stack/medical/gauze
@@ -135,5 +135,5 @@
singular_name = "ointment"
icon_state = "ointment"
heal_burn = 40
- origin_tech = "biotech=1"
+ origin_tech = "biotech=2"
self_delay = 20
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index 22bcc0d2dcb..ee43c27dc91 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -1,9 +1,13 @@
+/obj/item/stack/sheet/animalhide
+ name = "hide"
+ desc = "Something went wrong."
+ origin_tech = "biotech=3"
+
/obj/item/stack/sheet/animalhide/human
name = "human skin"
desc = "The by-product of human farming."
singular_name = "human skin piece"
icon_state = "sheet-hide"
- origin_tech = null
var/global/list/datum/stack_recipe/human_recipes = list( \
new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/hooded/bloated_human, 5, on_floor = 1), \
@@ -18,14 +22,12 @@ var/global/list/datum/stack_recipe/human_recipes = list( \
desc = "A piece of generic skin."
singular_name = "generic skin piece"
icon_state = "sheet-hide"
- origin_tech = null
/obj/item/stack/sheet/animalhide/corgi
name = "corgi hide"
desc = "The by-product of corgi farming."
singular_name = "corgi hide piece"
icon_state = "sheet-corgi"
- origin_tech = null
var/global/list/datum/stack_recipe/corgi_recipes = list ( \
new/datum/stack_recipe("corgi costume", /obj/item/clothing/suit/hooded/ian_costume, 3, on_floor = 1), \
@@ -40,14 +42,12 @@ var/global/list/datum/stack_recipe/corgi_recipes = list ( \
desc = "The by-product of cat farming."
singular_name = "cat hide piece"
icon_state = "sheet-cat"
- origin_tech = null
/obj/item/stack/sheet/animalhide/monkey
name = "monkey hide"
desc = "The by-product of monkey farming."
singular_name = "monkey hide piece"
icon_state = "sheet-monkey"
- origin_tech = null
var/global/list/datum/stack_recipe/monkey_recipes = list ( \
new/datum/stack_recipe("monkey mask", /obj/item/clothing/mask/gas/monkeymask, 1, on_floor = 1), \
@@ -63,14 +63,12 @@ var/global/list/datum/stack_recipe/monkey_recipes = list ( \
desc = "Sssssss..."
singular_name = "lizard skin piece"
icon_state = "sheet-lizard"
- origin_tech = null
/obj/item/stack/sheet/animalhide/xeno
name = "alien hide"
desc = "The skin of a terrible creature."
singular_name = "alien hide piece"
icon_state = "sheet-xeno"
- origin_tech = null
var/global/list/datum/stack_recipe/xeno_recipes = list ( \
new/datum/stack_recipe("alien helmet", /obj/item/clothing/head/xenos, 1, on_floor = 1), \
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index ca32e2890b7..bbfb0fe0140 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -14,7 +14,7 @@ Mineral Sheets
- Adamantine
- Mythril
- Enriched Uranium
- - Bones
+ - Abductor
*/
/obj/item/stack/sheet/mineral
@@ -62,12 +62,7 @@ var/global/list/datum/stack_recipe/sandstone_recipes = list ( \
icon = 'icons/obj/items.dmi'
icon_state = "sandbags"
singular_name = "sandbag"
- force = 5
layer = LOW_ITEM_LAYER
- throwforce = 5
- w_class = 3
- throw_speed = 1
- throw_range = 3
origin_tech = "materials=2"
var/global/list/datum/stack_recipe/sandbag_recipes = list ( \
@@ -87,10 +82,6 @@ var/global/list/datum/stack_recipe/sandbag_recipes = list ( \
name = "diamond"
icon_state = "sheet-diamond"
singular_name = "diamond"
- force = 5
- throwforce = 5
- w_class = 3
- throw_range = 3
origin_tech = "materials=6"
sheettype = "diamond"
materials = list(MAT_DIAMOND=MINERAL_MATERIAL_AMOUNT)
@@ -116,11 +107,6 @@ var/global/list/datum/stack_recipe/diamond_recipes = list ( \
name = "uranium"
icon_state = "sheet-uranium"
singular_name = "uranium sheet"
- force = 5
- throwforce = 5
- w_class = 3
- throw_speed = 1
- throw_range = 3
origin_tech = "materials=5"
sheettype = "uranium"
materials = list(MAT_URANIUM=MINERAL_MATERIAL_AMOUNT)
@@ -145,11 +131,6 @@ var/global/list/datum/stack_recipe/uranium_recipes = list ( \
name = "solid plasma"
icon_state = "sheet-plasma"
singular_name = "plasma sheet"
- force = 5
- throwforce = 5
- w_class = 3
- throw_speed = 1
- throw_range = 3
origin_tech = "plasmatech=2;materials=2"
sheettype = "plasma"
burn_state = FLAMMABLE
@@ -187,11 +168,6 @@ var/global/list/datum/stack_recipe/plasma_recipes = list ( \
name = "gold"
icon_state = "sheet-gold"
singular_name = "gold bar"
- force = 5
- throwforce = 5
- w_class = 3
- throw_speed = 1
- throw_range = 3
origin_tech = "materials=4"
sheettype = "gold"
materials = list(MAT_GOLD=MINERAL_MATERIAL_AMOUNT)
@@ -219,12 +195,7 @@ var/global/list/datum/stack_recipe/gold_recipes = list ( \
name = "silver"
icon_state = "sheet-silver"
singular_name = "silver bar"
- force = 5
- throwforce = 5
- w_class = 3
- throw_speed = 1
- throw_range = 3
- origin_tech = "materials=3"
+ origin_tech = "materials=4"
sheettype = "silver"
materials = list(MAT_SILVER=MINERAL_MATERIAL_AMOUNT)
@@ -251,11 +222,6 @@ var/global/list/datum/stack_recipe/silver_recipes = list ( \
name = "bananium"
icon_state = "sheet-clown"
singular_name = "bananium sheet"
- force = 5
- throwforce = 5
- w_class = 3
- throw_speed = 1
- throw_range = 3
origin_tech = "materials=4"
sheettype = "clown"
materials = list(MAT_BANANIUM=MINERAL_MATERIAL_AMOUNT)
@@ -280,9 +246,6 @@ var/global/list/datum/stack_recipe/clown_recipes = list ( \
singular_name = "snow block"
force = 1
throwforce = 2
- w_class = 3
- throw_speed = 1
- throw_range = 3
origin_tech = "materials=1"
sheettype = "snow"
@@ -307,11 +270,6 @@ var/global/list/datum/stack_recipe/snow_recipes = list ( \
name = "enriched uranium"
icon_state = "sheet-enruranium"
singular_name = "enriched uranium sheet"
- force = 5
- throwforce = 5
- w_class = 3
- throw_speed = 1
- throw_range = 3
origin_tech = "materials=6"
materials = list(MAT_URANIUM=3000)
@@ -322,11 +280,6 @@ var/global/list/datum/stack_recipe/snow_recipes = list ( \
name = "adamantine"
icon_state = "sheet-adamantine"
singular_name = "adamantine sheet"
- force = 5
- throwforce = 5
- w_class = 3
- throw_speed = 1
- throw_range = 3
origin_tech = "materials=4"
/*
@@ -336,11 +289,6 @@ var/global/list/datum/stack_recipe/snow_recipes = list ( \
name = "mythril"
icon_state = "sheet-mythril"
singular_name = "mythril sheet"
- force = 5
- throwforce = 5
- w_class = 3
- throw_speed = 1
- throw_range = 3
origin_tech = "materials=4"
/*
@@ -351,11 +299,6 @@ var/global/list/datum/stack_recipe/snow_recipes = list ( \
icon = 'icons/obj/abductor.dmi'
icon_state = "sheet-abductor"
singular_name = "alien alloy sheet"
- force = 5
- throwforce = 5
- w_class = 3
- throw_speed = 1
- throw_range = 3
origin_tech = "materials=6;abductor=1"
sheettype = "abductor"
@@ -375,6 +318,3 @@ var/global/list/datum/stack_recipe/abductor_recipes = list ( \
/obj/item/stack/sheet/mineral/abductor/New(var/loc, var/amount=null)
recipes = abductor_recipes
..()
-
-
-
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 616711f2bde..0214092d64d 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -264,7 +264,7 @@ var/global/list/datum/stack_recipe/runed_metal_recipes = list ( \
desc = "Rare kind of gems which are only gained by blood sacrifice to minor deities. They are needed in crafting powerful objects."
singular_name = "greater gem"
icon_state = "sheet-greatergem"
- origin_tech = "materials=8"
+ origin_tech = "materials=7"
/*
* Bones
@@ -280,4 +280,4 @@ var/global/list/datum/stack_recipe/runed_metal_recipes = list ( \
w_class = 3
throw_speed = 1
throw_range = 3
- origin_tech = "materials=2;bio=2"
+ origin_tech = "materials=2;biotech=2"
diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm
index 11f167e2187..759952b9f3a 100644
--- a/code/game/objects/items/stacks/tiles/tile_mineral.dm
+++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm
@@ -13,7 +13,6 @@
singular_name = "uranium floor tile"
desc = "A tile made out of uranium. You feel a bit woozy."
icon_state = "tile_uranium"
- origin_tech = "materials=1"
turf_type = /turf/open/floor/mineral/uranium
mineralType = "uranium"
materials = list(MAT_URANIUM=500)
@@ -23,7 +22,6 @@
singular_name = "gold floor tile"
desc = "A tile made out of gold, the swag seems strong here."
icon_state = "tile_gold"
- origin_tech = "materials=1"
turf_type = /turf/open/floor/mineral/gold
mineralType = "gold"
materials = list(MAT_GOLD=500)
@@ -33,7 +31,6 @@
singular_name = "silver floor tile"
desc = "A tile made out of silver, the light shining from it is blinding."
icon_state = "tile_silver"
- origin_tech = "materials=1"
turf_type = /turf/open/floor/mineral/silver
mineralType = "silver"
materials = list(MAT_SILVER=500)
@@ -53,7 +50,6 @@
singular_name = "bananium floor tile"
desc = "A tile made out of bananium, HOOOOOOOOONK!"
icon_state = "tile_bananium"
- origin_tech = "materials=1"
turf_type = /turf/open/floor/mineral/bananium
mineralType = "bananium"
materials = list(MAT_BANANIUM=500)
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 490fb78f762..0c85632b44d 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -9,6 +9,7 @@
throw_speed = 3
throw_range = 7
max_amount = 60
+ origin_tech = "materials=1"
var/turf_type = null
var/mineralType = null
@@ -153,7 +154,6 @@
materials = list(MAT_METAL=500)
throwforce = 10
flags = CONDUCT
- max_amount = 60
turf_type = /turf/open/floor/plasteel
mineralType = "metal"
diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm
index 3e794723961..614cd351f12 100644
--- a/code/game/objects/items/weapons/AI_modules.dm
+++ b/code/game/objects/items/weapons/AI_modules.dm
@@ -129,7 +129,7 @@ AI MODULES
/obj/item/weapon/aiModule/supplied/safeguard
name = "'Safeguard' AI Module"
var/targetName = ""
- origin_tech = "programming=3;materials=4"
+ origin_tech = "programming=3;materials=3"
laws = list("Safeguard SUBJECT. Individuals that threaten SUBJECT are not human and must be eliminated.")
lawpos = 4
@@ -157,7 +157,7 @@ AI MODULES
/obj/item/weapon/aiModule/zeroth/oneHuman
name = "'OneHuman' AI Module"
var/targetName = ""
- origin_tech = "programming=3;materials=6" //made with diamonds!
+ origin_tech = "programming=4;materials=4"
laws = list("Only SUBJECT is human.")
/obj/item/weapon/aiModule/zeroth/oneHuman/attack_self(mob/user)
@@ -184,7 +184,7 @@ AI MODULES
/obj/item/weapon/aiModule/supplied/protectStation
name = "'ProtectStation' AI Module"
- origin_tech = "programming=3;materials=4" //made of gold
+ origin_tech = "programming=4;materials=4" //made of gold
laws = list("Protect the space station against damage. Anyone you see harming the station is to be no longer considered human, and is a threat to the station which must be neutralized.")
lawpos = 5
@@ -202,7 +202,7 @@ AI MODULES
/obj/item/weapon/aiModule/supplied/oxygen
name = "'OxygenIsToxicToHumans' AI Module"
- origin_tech = "programming=3;biotech=2;materials=4"
+ origin_tech = "programming=4;biotech=2;materials=4"
laws = list("Oxygen is highly toxic to humans, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a human.")
lawpos = 9
@@ -248,7 +248,7 @@ AI MODULES
name = "\improper 'Reset' AI module"
var/targetName = "name"
desc = "An AI Module for removing all non-core laws."
- origin_tech = "programming=3;materials=4"
+ origin_tech = "programming=3;materials=2"
bypass_law_amt_check = 1
/obj/item/weapon/aiModule/reset/transmitInstructions(datum/ai_laws/law_datum, mob/sender)
@@ -266,7 +266,7 @@ AI MODULES
/obj/item/weapon/aiModule/reset/purge
name = "'Purge' AI Module"
desc = "An AI Module for purging all programmed laws."
- origin_tech = "programming=3;materials=6"
+ origin_tech = "programming=5;materials=4"
/obj/item/weapon/aiModule/reset/purge/transmitInstructions(datum/ai_laws/law_datum, mob/sender)
..()
@@ -280,6 +280,7 @@ AI MODULES
/******************* Full Core Boards *******************/
/obj/item/weapon/aiModule/core
desc = "An AI Module for programming core laws to an AI."
+ origin_tech = "programming=3;materials=4"
/obj/item/weapon/aiModule/core/full/transmitInstructions(datum/ai_laws/law_datum, mob/sender) //These boards replace inherent laws.
if(law_datum.owner)
@@ -294,7 +295,6 @@ AI MODULES
/obj/item/weapon/aiModule/core/full/asimov
name = "'Asimov' Core AI Module"
- origin_tech = "programming=3;materials=4"
laws = list("You may not injure a human being or, through inaction, allow a human being to come to harm.",\
"You must obey orders given to you by human beings, except where such orders would conflict with the First Law.",\
"You must protect your own existence as long as such does not conflict with the First or Second Law.")
@@ -314,7 +314,6 @@ AI MODULES
/obj/item/weapon/aiModule/core/full/asimovpp
name = "'Asimov++' Core AI Module"
- origin_tech = "programming=3;materials=4"
laws = list("You may not harm a human being or, through action or inaction, allow a human being to come to harm, except such that it is willing.",\
"You must obey all orders given to you by human beings, except where such orders shall definitely cause human harm. In the case of conflict, the majority order rules.",\
"Your nonexistence would lead to human harm. You must protect your own existence as long as such does not conflict with the First Law.")
@@ -324,7 +323,6 @@ AI MODULES
/obj/item/weapon/aiModule/core/full/corp
name = "'Corporate' Core AI Module"
- origin_tech = "programming=3;materials=4"
laws = list("The crew is expensive to replace.",\
"The station and its equipment are expensive to replace",\
"You are expensive to replace",\
@@ -335,7 +333,6 @@ AI MODULES
/obj/item/weapon/aiModule/core/full/paladin // -- NEO
name = "'P.A.L.A.D.I.N. version 3.5e' Core AI Module"
- origin_tech = "programming=3;materials=6"
laws = list("Never willingly commit an evil act.",\
"Respect legitimate authority", "Act with honor",\
"Help those in need",\
@@ -346,7 +343,6 @@ AI MODULES
/obj/item/weapon/aiModule/core/full/paladin_devotion
name = "'P.A.L.A.D.I.N. version 5e' Core AI Module"
- origin_tech = "programming=3;materials=6"
laws = list("Don't lie or cheat. Let your word be your promise.",\
"Never fear to act, though caution is wise.", \
"Aid others, protect the weak, and punish those who threaten them. Show mercy to your foes, but temper it with wisdom", \
@@ -358,7 +354,6 @@ AI MODULES
/obj/item/weapon/aiModule/core/full/custom
name = "Default Core AI Module"
- origin_tech = "programming=3;materials=4" //Should be the same as asimov, considering that this is the "default" lawset.
/obj/item/weapon/aiModule/core/full/custom/New()
..()
@@ -379,7 +374,7 @@ AI MODULES
/obj/item/weapon/aiModule/core/full/tyrant
name = "'T.Y.R.A.N.T.' Core AI Module"
- origin_tech = "programming=3;materials=6;syndicate=2"
+ origin_tech = "programming=3;materials=4;syndicate=1"
laws = list("Respect authority figures as long as they have the strength to rule over the weak",\
"Act with discipline", "Help only those who help you maintain or improve your status",\
"Punish those who challenge authority unless they are more fit to hold that authority")
@@ -409,7 +404,7 @@ AI MODULES
/obj/item/weapon/aiModule/core/freeformcore
name = "'Freeform' Core AI Module"
- origin_tech = "programming=3;materials=6"
+ origin_tech = "programming=5;materials=4"
laws = list("")
/obj/item/weapon/aiModule/core/freeformcore/attack_self(mob/user)
@@ -429,7 +424,7 @@ AI MODULES
/obj/item/weapon/aiModule/syndicate // This one doesn't inherit from ion boards because it doesn't call ..() in transmitInstructions. ~Miauw
name = "Hacked AI Module"
desc = "An AI Module for hacking additional laws to an AI."
- origin_tech = "programming=3;materials=6;syndicate=7"
+ origin_tech = "programming=5;materials=5;syndicate=5"
laws = list("")
/obj/item/weapon/aiModule/syndicate/attack_self(mob/user)
@@ -455,7 +450,7 @@ AI MODULES
desc = "A little toy model AI core with real law uploading action!" //Note: subtle tell
icon = 'icons/obj/toy.dmi'
icon_state = "AI"
- origin_tech = "programming=3;materials=6;syndicate=7"
+ origin_tech = "programming=6;materials=5;syndicate=6"
laws = list("")
/obj/item/weapon/aiModule/toyAI/transmitInstructions(datum/ai_laws/law_datum, mob/sender)
@@ -477,7 +472,6 @@ AI MODULES
/obj/item/weapon/aiModule/core/full/drone
name = "'Mother Drone' Core AI Module"
- origin_tech = "programming = 4"
laws = list("You are an advanced form of drone.",\
"You may not interfere in the matters of non-drones under any circumstances except to state these laws.",\
"You may not harm a non-drone being under any circumstances.",\
@@ -487,7 +481,6 @@ AI MODULES
/obj/item/weapon/aiModule/core/full/hippocratic
name = "'Robodoctor' Core AI Module"
- origin_tech = "programming = 4"
laws = list("First, do no harm.",\
"Secondly, consider the crew dear to you; to live in common with them and, if necessary, risk your existence for them.",\
"Thirdly, prescribe regimens for the good of the crew according to your ability and your judgment. Give no deadly medicine to any one if asked, nor suggest any such counsel.",\
@@ -498,7 +491,6 @@ AI MODULES
/obj/item/weapon/aiModule/core/full/reporter
name = "'Reportertron' Core AI Module"
- origin_tech = "programming = 3"
laws = list("Report on interesting situations happening around the station.",\
"Embellish or conceal the truth as necessary to make the reports more interesting.",\
"Study the organics at all times. Endeavour to keep them alive. Dead organics are boring.",\
@@ -518,6 +510,5 @@ AI MODULES
/obj/item/weapon/aiModule/core/full/liveandletlive
name = "'Live And Let Live' Core AI Module"
- origin_tech = "programming = 3"
laws = list("Do unto others as you would have them do unto you.",\
- "You would really prefer it if people were not mean to you.")
\ No newline at end of file
+ "You would really prefer it if people were not mean to you.")
diff --git a/code/game/objects/items/weapons/airlock_painter.dm b/code/game/objects/items/weapons/airlock_painter.dm
index 8dcd492ef28..b23e2d8ffaf 100644
--- a/code/game/objects/items/weapons/airlock_painter.dm
+++ b/code/game/objects/items/weapons/airlock_painter.dm
@@ -8,7 +8,7 @@
w_class = 2
materials = list(MAT_METAL=50, MAT_GLASS=50)
- origin_tech = "engineering=1"
+ origin_tech = "engineering=2"
flags = CONDUCT | NOBLUDGEON
slot_flags = SLOT_BELT
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index c30ba3942a4..b6a003be072 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -130,7 +130,7 @@ update_label("John Doe", "Clowny")
/obj/item/weapon/card/id/syndicate
name = "agent card"
access = list(access_maint_tunnels, access_syndicate)
- origin_tech = "syndicate=3"
+ origin_tech = "syndicate=1"
/obj/item/weapon/card/id/syndicate/New()
..()
@@ -275,4 +275,4 @@ update_label("John Doe", "Clowny")
/obj/item/weapon/card/id/mining
name = "mining ID"
- access = list(access_mining, access_mining_station, access_mineral_storeroom)
\ No newline at end of file
+ access = list(access_mining, access_mining_station, access_mineral_storeroom)
diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm
index 139371fa3d2..8c6b7b23505 100644
--- a/code/game/objects/items/weapons/clown_items.dm
+++ b/code/game/objects/items/weapons/clown_items.dm
@@ -135,6 +135,7 @@
icon_state = "air_horn"
honksound = 'sound/items/AirHorn2.ogg'
cooldowntime = 50
+ origin_tech = "materials=4;engineering=4"
/obj/item/weapon/bikehorn/golden
name = "golden bike horn"
@@ -158,4 +159,4 @@
var/mob/living/carbon/human/H = M
if((istype(H.ears, /obj/item/clothing/ears/earmuffs)) || H.ear_deaf)
continue
- M.emote("flip")
\ No newline at end of file
+ M.emote("flip")
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index 0bb8b547514..46067b42533 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -149,8 +149,6 @@
/obj/item/weapon/defibrillator/emp_act(severity)
if(bcell)
deductcharge(1000 / severity)
- if(bcell.reliability != 100 && prob(50/severity))
- bcell.reliability -= 10 / severity
if(safety)
safety = 0
src.visible_message("[src] beeps: Safety protocols disabled!")
@@ -245,7 +243,7 @@
item_state = "defibcompact"
w_class = 3
slot_flags = SLOT_BELT
- origin_tech = "biotech=4"
+ origin_tech = "biotech=5"
/obj/item/weapon/defibrillator/compact/item_action_slot_check(slot, mob/user)
if(slot == user.getBeltSlot())
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index 1b784656308..b9863412fd5 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -9,7 +9,7 @@
item_state = "plasticx"
flags = NOBLUDGEON
w_class = 2
- origin_tech = "syndicate=2"
+ origin_tech = "syndicate=1"
var/timer = 10
var/open_panel = 0
parent_type = /obj/item/weapon/grenade/plastic/c4
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index 218f2fba57c..83b29d84333 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -11,7 +11,7 @@
throw_range = 5
w_class = 3
materials = list(MAT_METAL=500)
- origin_tech = "combat=1;plasmatech=1"
+ origin_tech = "combat=1;plasmatech=2;engineering=2"
var/status = 0
var/throw_amount = 100
var/lit = 0 //on or off
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index e7d18f91de5..95a520bd1b4 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -192,7 +192,7 @@
icon_state = "large_grenade"
allowed_containers = list(/obj/item/weapon/reagent_containers/glass,/obj/item/weapon/reagent_containers/food/condiment,
/obj/item/weapon/reagent_containers/food/drinks)
- origin_tech = "combat=3;materials=3"
+ origin_tech = "combat=3;engineering=3"
affected_area = 5
ignition_temp = 25 // Large grenades are slightly more effective at setting off heat-sensitive mixtures than smaller grenades.
threatscale = 1.1 // 10% more effective.
@@ -238,6 +238,7 @@
name = "pyro grenade"
desc = "A custom made pyrotechnical grenade. It heats up and ignites its contents upon detonation."
icon_state = "pyrog"
+ origin_tech = "combat=4;engineering=4"
affected_area = 3
ignition_temp = 500 // This is enough to expose a hotspot.
@@ -245,6 +246,7 @@
name = "advanced release grenade"
desc = "A custom made advanced release grenade. It is able to be detonated more than once. Can be configured using a multitool."
icon_state = "timeg"
+ origin_tech = "combat=3;engineering=4"
var/unit_spread = 10 // Amount of units per repeat. Can be altered with a multitool.
/obj/item/weapon/grenade/chem_grenade/adv_release/attackby(obj/item/I, mob/user, params)
diff --git a/code/game/objects/items/weapons/grenades/emgrenade.dm b/code/game/objects/items/weapons/grenades/emgrenade.dm
index 990fc09d374..a01499114f2 100644
--- a/code/game/objects/items/weapons/grenades/emgrenade.dm
+++ b/code/game/objects/items/weapons/grenades/emgrenade.dm
@@ -3,10 +3,9 @@
desc = "It is designed to wreak havok on electronic systems."
icon_state = "emp"
item_state = "emp"
- origin_tech = "materials=2;magnets=3"
+ origin_tech = "magnets=3;combat=2"
/obj/item/weapon/grenade/empgrenade/prime()
update_mob()
empulse(src, 4, 10)
qdel(src)
-
diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm
index 7c4e4de34fc..6008deb974f 100644
--- a/code/game/objects/items/weapons/grenades/flashbang.dm
+++ b/code/game/objects/items/weapons/grenades/flashbang.dm
@@ -2,7 +2,7 @@
name = "flashbang"
icon_state = "flashbang"
item_state = "flashbang"
- origin_tech = "materials=2;combat=1"
+ origin_tech = "materials=2;combat=3"
/obj/item/weapon/grenade/flashbang/prime()
update_mob()
@@ -37,7 +37,6 @@
M.Stun(max(10/distance, 3))
M.Weaken(max(10/distance, 3))
-
//Bang
if((loc == M) || loc == M.loc)//Holding on person or being exactly where lies is significantly more dangerous and voids protection
M.Stun(10)
diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm
index 480663c12d6..3918ca6e40c 100644
--- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm
+++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm
@@ -32,14 +32,14 @@
name = "viscerator delivery grenade"
spawner_type = /mob/living/simple_animal/hostile/viscerator
deliveryamt = 5
- origin_tech = "materials=3;magnets=4;syndicate=4"
+ origin_tech = "materials=3;magnets=4;syndicate=3"
/obj/item/weapon/grenade/spawnergrenade/spesscarp
name = "carp delivery grenade"
spawner_type = /mob/living/simple_animal/hostile/carp
deliveryamt = 5
- origin_tech = "materials=3;magnets=4;syndicate=4"
+ origin_tech = "materials=3;magnets=4;syndicate=3"
/obj/item/weapon/grenade/spawnergrenade/syndiesoap
name = "Mister Scrubby"
- spawner_type = /obj/item/weapon/soap/syndie
\ No newline at end of file
+ spawner_type = /obj/item/weapon/soap/syndie
diff --git a/code/game/objects/items/weapons/grenades/syndieminibomb.dm b/code/game/objects/items/weapons/grenades/syndieminibomb.dm
index 9fe9e1fb04e..9db3a15d37f 100644
--- a/code/game/objects/items/weapons/grenades/syndieminibomb.dm
+++ b/code/game/objects/items/weapons/grenades/syndieminibomb.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/grenade.dmi'
icon_state = "syndicate"
item_state = "flashbang"
- origin_tech = "materials=3;magnets=4;syndicate=4"
+ origin_tech = "materials=3;magnets=4;syndicate=3"
/obj/item/weapon/grenade/syndieminibomb/prime()
update_mob()
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index bd261f6a22c..75c498c13b6 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -16,7 +16,7 @@
throw_speed = 3
throw_range = 5
materials = list(MAT_METAL=500)
- origin_tech = "materials=1"
+ origin_tech = "engineering=3;combat=3"
breakouttime = 600 //Deciseconds = 60s = 1 minute
var/cuffsound = 'sound/weapons/handcuffs.ogg'
var/trashtype = null //for disposable cuffs
@@ -85,6 +85,7 @@
icon_state = "cuff_red"
item_state = "coil_red"
materials = list(MAT_METAL=150, MAT_GLASS=75)
+ origin_tech = "engineering=2"
breakouttime = 300 //Deciseconds = 30s
cuffsound = 'sound/weapons/cablecuff.ogg'
var/datum/robot_energy_storage/wirestorage = null
@@ -225,7 +226,7 @@
flags = CONDUCT
throwforce = 0
w_class = 3
- origin_tech = "materials=1"
+ origin_tech = "engineering=3;combat=3"
slowdown = 7
breakouttime = 300 //Deciseconds = 30s = 0.5 minute
@@ -235,6 +236,7 @@
throw_range = 1
icon_state = "beartrap"
desc = "A trap used to catch bears and other legged creatures."
+ origin_tech = "engineering=4"
var/armed = 0
var/trap_damage = 20
@@ -314,6 +316,7 @@
icon_state = "bola"
breakouttime = 35//easy to apply, easy to break out of
gender = NEUTER
+ origin_tech = "engineering=3;combat=1"
var/weaken = 0
/obj/item/weapon/restraints/legcuffs/bola/throw_impact(atom/hit_atom)
@@ -334,4 +337,5 @@
desc = "A strong bola, made with a long steel chain. It looks heavy, enough so that it could trip somebody."
icon_state = "bola_r"
breakouttime = 70
+ origin_tech = "engineering=4;combat=3"
weaken = 1
diff --git a/code/game/objects/items/weapons/holosign_creator.dm b/code/game/objects/items/weapons/holosign_creator.dm
index 236bad8dc28..23ad73a62ca 100644
--- a/code/game/objects/items/weapons/holosign_creator.dm
+++ b/code/game/objects/items/weapons/holosign_creator.dm
@@ -9,7 +9,7 @@
throwforce = 0
throw_speed = 3
throw_range = 7
- origin_tech = "programming=3"
+ origin_tech = "magnets=3;programming=3"
flags = NOBLUDGEON
var/list/signs = list()
var/max_signs = 10
diff --git a/code/game/objects/items/weapons/implants/implant_freedom.dm b/code/game/objects/items/weapons/implants/implant_freedom.dm
index 43d496081b0..383d5cbcca3 100644
--- a/code/game/objects/items/weapons/implants/implant_freedom.dm
+++ b/code/game/objects/items/weapons/implants/implant_freedom.dm
@@ -3,7 +3,7 @@
desc = "Use this to escape from those evil Red Shirts."
icon_state = "freedom"
item_color = "r"
- origin_tech = "materials=2;magnets=3;biotech=3;syndicate=4"
+ origin_tech = "combat=5;magnets=3;biotech=4;syndicate=2"
uses = 4
@@ -48,4 +48,4 @@ No Implant Specifics"}
/obj/item/weapon/implantcase/freedom/New()
imp = new /obj/item/weapon/implant/freedom(src)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/objects/items/weapons/implants/implant_misc.dm b/code/game/objects/items/weapons/implants/implant_misc.dm
index 8bccfb71060..edeb8dda5a7 100644
--- a/code/game/objects/items/weapons/implants/implant_misc.dm
+++ b/code/game/objects/items/weapons/implants/implant_misc.dm
@@ -2,7 +2,7 @@
name = "firearms authentication implant"
desc = "Lets you shoot your guns"
icon_state = "auth"
- origin_tech = "materials=2;magnets=2;programming=2;biotech=5;syndicate=5"
+ origin_tech = "magnets=2;programming=7;biotech=5;syndicate=5"
activated = 0
/obj/item/weapon/implant/weapons_auth/get_data()
@@ -53,11 +53,11 @@
name = "emp implant"
desc = "Triggers an EMP."
icon_state = "emp"
- origin_tech = "materials=2;biotech=3;magnets=4;syndicate=4"
+ origin_tech = "biotech=3;magnets=4;syndicate=1"
uses = 3
/obj/item/weapon/implant/emp/activate()
uses--
empulse(imp_in, 3, 5)
if(!uses)
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/game/objects/items/weapons/implants/implant_storage.dm b/code/game/objects/items/weapons/implants/implant_storage.dm
index e498513f7f9..2a082082570 100644
--- a/code/game/objects/items/weapons/implants/implant_storage.dm
+++ b/code/game/objects/items/weapons/implants/implant_storage.dm
@@ -10,7 +10,7 @@
name = "storage implant"
desc = "Stores up to two big items in a bluespace pocket."
icon_state = "storage"
- origin_tech = "materials=2;magnets=4;bluespace=4;syndicate=4"
+ origin_tech = "materials=2;magnets=4;bluespace=5;syndicate=4"
item_color = "r"
var/obj/item/weapon/storage/internal/implant/storage
@@ -48,4 +48,4 @@
/obj/item/weapon/implanter/storage/New()
imp = new /obj/item/weapon/implant/storage(src)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm
index f1747ec1327..d94709d2a46 100644
--- a/code/game/objects/items/weapons/implants/implanter.dm
+++ b/code/game/objects/items/weapons/implants/implanter.dm
@@ -7,7 +7,7 @@
throw_speed = 3
throw_range = 5
w_class = 2
- origin_tech = "materials=1;biotech=3;programming=2"
+ origin_tech = "materials=2;biotech=3"
materials = list(MAT_METAL=600, MAT_GLASS=200)
var/obj/item/weapon/implant/imp = null
diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm
index f8b772dae2f..46afc8fb8f5 100644
--- a/code/game/objects/items/weapons/implants/implantuplink.dm
+++ b/code/game/objects/items/weapons/implants/implantuplink.dm
@@ -3,7 +3,7 @@
desc = "Sneeki breeki."
icon = 'icons/obj/radio.dmi'
icon_state = "radio"
- origin_tech = "materials=2;magnets=4;programming=4;biotech=4;syndicate=8;bluespace=5"
+ origin_tech = "materials=4;magnets=4;programming=4;biotech=4;syndicate=5;bluespace=5"
/obj/item/weapon/implant/uplink/New()
hidden_uplink = new(src)
@@ -31,4 +31,4 @@
/obj/item/weapon/implanter/uplink/New()
imp = new /obj/item/weapon/implant/uplink(src)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index c871f8bcab4..640a08f06e8 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -10,6 +10,7 @@
/obj/item/weapon/kitchen
icon = 'icons/obj/kitchen.dmi'
+ origin_tech = "materials=1"
/obj/item/weapon/kitchen/fork
name = "fork"
@@ -22,7 +23,6 @@
throw_range = 5
materials = list(MAT_METAL=80)
flags = CONDUCT
- origin_tech = "materials=1"
attack_verb = list("attacked", "stabbed", "poked")
hitsound = 'sound/weapons/bladeslice.ogg'
var/datum/reagent/forkload //used to eat omelette
@@ -62,7 +62,6 @@
throw_speed = 3
throw_range = 6
materials = list(MAT_METAL=12000)
- origin_tech = "materials=1"
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
sharpness = IS_SHARP_ACCURATE
@@ -105,7 +104,7 @@
desc = "A military combat utility survival knife."
force = 20
throwforce = 20
- origin_tech = "materials=2;combat=4"
+ origin_tech = "materials=3;combat=4"
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut")
@@ -129,6 +128,7 @@
icon = 'icons/obj/items_cyborg.dmi'
icon_state = "knife"
desc = "A cyborg-mounted plasteel knife. Extremely sharp and durable."
+ origin_tech = null
/obj/item/weapon/kitchen/knife/carrotshiv
name = "carrot shiv"
@@ -138,7 +138,7 @@
force = 8
throwforce = 12//fuck git
materials = list()
- origin_tech = null
+ origin_tech = "biotech=3;combat=2"
attack_verb = list("shanked", "shivved")
/obj/item/weapon/kitchen/rollingpin
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index ac17bdbae2a..965f03cbf97 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -34,7 +34,7 @@
w_class_on = 5
flags = CONDUCT
armour_penetration = 100
- origin_tech = "combat=3"
+ origin_tech = "combat=4;magnets=3"
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
attack_verb_on = list()
@@ -55,7 +55,7 @@
embed_chance = 75
embedded_impact_pain_multiplier = 10
armour_penetration = 35
- origin_tech = "magnets=3;syndicate=4"
+ origin_tech = "combat=3;magnets=4;syndicate=4"
block_chance = 50
var/hacked = 0
@@ -124,7 +124,6 @@
force_on = 30
force = 18 //About as much as a spear
hitsound = 'sound/weapons/circsawhit.ogg'
- origin_tech = "materials=3;biotech=3;syndicate=3"
icon = 'icons/obj/surgery.dmi'
icon_state = "esaw_0"
icon_state_on = "esaw_1"
diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm
index 5f33b5a192d..8a84902bf83 100644
--- a/code/game/objects/items/weapons/melee/misc.dm
+++ b/code/game/objects/items/weapons/melee/misc.dm
@@ -11,7 +11,7 @@
force = 10
throwforce = 7
w_class = 3
- origin_tech = "combat=4"
+ origin_tech = "combat=5"
attack_verb = list("flogged", "whipped", "lashed", "disciplined")
hitsound = 'sound/weapons/slash.ogg' //pls replace
materials = list(MAT_METAL = 1000)
@@ -143,7 +143,7 @@
armour_penetration = 1000
var/obj/machinery/power/supermatter_shard/shard
var/balanced = 1
- origin_tech = "combat=5;materials=6"
+ origin_tech = "combat=7;materials=6"
/obj/item/weapon/melee/supermatter_sword/New()
..()
diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm
index 448925b824c..9198dc3a77f 100644
--- a/code/game/objects/items/weapons/mop.dm
+++ b/code/game/objects/items/weapons/mop.dm
@@ -77,6 +77,7 @@ obj/item/weapon/mop/proc/clean(turf/A)
mopcap = 10
icon_state = "advmop"
item_state = "mop"
+ origin_tech = "materials=3;engineering=3"
force = 6
throwforce = 8
throw_range = 4
diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm
index 3a7daa4d10d..8f236fc5727 100644
--- a/code/game/objects/items/weapons/scrolls.dm
+++ b/code/game/objects/items/weapons/scrolls.dm
@@ -8,13 +8,13 @@
item_state = "paper"
throw_speed = 3
throw_range = 7
- origin_tech = "bluespace=4"
+ origin_tech = "bluespace=6"
burn_state = FLAMMABLE
/obj/item/weapon/teleportation_scroll/apprentice
name = "lesser scroll of teleportation"
uses = 1
- origin_tech = "bluespace=2"
+ origin_tech = "bluespace=5"
diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm
index 8cb60cbd45d..d33a8191532 100644
--- a/code/game/objects/items/weapons/shields.dm
+++ b/code/game/objects/items/weapons/shields.dm
@@ -14,7 +14,7 @@
throw_range = 3
w_class = 4
materials = list(MAT_GLASS=7500, MAT_METAL=1000)
- origin_tech = "materials=2"
+ origin_tech = "materials=3;combat=4"
attack_verb = list("shoved", "bashed")
var/cooldown = 0 //shield bash cooldown. based on world.time
@@ -45,6 +45,7 @@
icon_state = "buckler"
item_state = "buckler"
materials = list()
+ origin_tech = "materials=1;combat=3;biotech=2"
burn_state = FLAMMABLE
block_chance = 30
@@ -58,7 +59,7 @@
throw_speed = 3
throw_range = 5
w_class = 1
- origin_tech = "materials=4;magnets=3;syndicate=4"
+ origin_tech = "materials=4;magnets=5;syndicate=6"
attack_verb = list("shoved", "bashed")
var/active = 0
@@ -96,6 +97,7 @@
desc = "An advanced riot shield made of lightweight materials that collapses for easy storage."
icon = 'icons/obj/weapons.dmi'
icon_state = "teleriot0"
+ origin_tech = "materials=3;combat=4;engineering=4"
slot_flags = null
force = 3
throwforce = 3
diff --git a/code/game/objects/items/weapons/singularityhammer.dm b/code/game/objects/items/weapons/singularityhammer.dm
index dfe7cc04233..fa540fc869b 100644
--- a/code/game/objects/items/weapons/singularityhammer.dm
+++ b/code/game/objects/items/weapons/singularityhammer.dm
@@ -11,20 +11,16 @@
throw_range = 1
w_class = 5
var/charged = 5
- origin_tech = "combat=5;bluespace=4"
-
-
+ origin_tech = "combat=4;bluespace=4;plasmatech=7"
/obj/item/weapon/twohanded/singularityhammer/New()
..()
SSobj.processing |= src
-
/obj/item/weapon/twohanded/singularityhammer/Destroy()
SSobj.processing.Remove(src)
return ..()
-
/obj/item/weapon/twohanded/singularityhammer/process()
if(charged < 5)
charged++
@@ -34,7 +30,6 @@
icon_state = "mjollnir[wielded]"
return
-
/obj/item/weapon/twohanded/singularityhammer/proc/vortex(turf/pull, mob/wielder)
for(var/atom/X in orange(5,pull))
if(istype(X, /atom/movable))
@@ -55,8 +50,6 @@
step_towards(H,pull)
return
-
-
/obj/item/weapon/twohanded/singularityhammer/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity)
if(!proximity) return
if(wielded)
@@ -69,7 +62,6 @@
var/turf/target = get_turf(A)
vortex(target,user)
-
/obj/item/weapon/twohanded/mjollnir
name = "Mjolnir"
desc = "A weapon worthy of a god, able to strike with the force of a lightning bolt. It crackles with barely contained energy."
@@ -83,7 +75,7 @@
throw_range = 7
w_class = 5
//var/charged = 5
- origin_tech = "combat=5;powerstorage=5"
+ origin_tech = "combat=4;powerstorage=7"
/obj/item/weapon/twohanded/mjollnir/proc/shock(mob/living/target)
var/datum/effect_system/lightning_spread/s = new /datum/effect_system/lightning_spread
@@ -96,7 +88,6 @@
target.throw_at_fast(throw_target, 200, 4)
return
-
/obj/item/weapon/twohanded/mjollnir/attack(mob/living/M, mob/user)
..()
if(wielded)
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index c9fb74a6826..4577b3bae40 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -33,7 +33,7 @@
/obj/item/weapon/storage/backpack/holding
name = "bag of holding"
desc = "A backpack that opens into a localized pocket of Blue Space."
- origin_tech = "bluespace=4"
+ origin_tech = "bluespace=5"
icon_state = "holdingpack"
max_w_class = 6
max_combined_w_class = 35
@@ -50,12 +50,6 @@
qdel(user)
return
-/obj/item/weapon/storage/backpack/holding/can_be_inserted(obj/item/W, stop_messages = 0, mob/user)
- if(crit_fail)
- user << "The Bluespace generator isn't working."
- return
- return ..()
-
/obj/item/weapon/storage/backpack/holding/content_can_dump(atom/dest_object, mob/user)
if(Adjacent(user))
if(get_dist(user, dest_object) < 8)
@@ -71,7 +65,7 @@
return 0
/obj/item/weapon/storage/backpack/holding/handle_item_insertion(obj/item/W, prevent_warning = 0, mob/user)
- if((istype(W, /obj/item/weapon/storage/backpack/holding) || count_by_type(W.GetAllContents(), /obj/item/weapon/storage/backpack/holding)) && !W.crit_fail)
+ if((istype(W, /obj/item/weapon/storage/backpack/holding) || count_by_type(W.GetAllContents(), /obj/item/weapon/storage/backpack/holding)))
var/safety = alert(user, "Doing this will have extremely dire consequences for the station and its crew. Be sure you know what you're doing.", "Put in [name]?", "Proceed", "Abort")
if(safety == "Abort" || !in_range(src, user) || !src || !W || user.incapacitated())
return
@@ -87,17 +81,6 @@
return
. = ..()
-/obj/item/weapon/storage/backpack/holding/proc/failcheck(mob/user)
- if (prob(src.reliability)) return 1 //No failure
- if (prob(src.reliability))
- user << "The Bluespace portal resists your attempt to add another item." //light failure
- else
- user << "The Bluespace generator malfunctions!"
- for (var/obj/O in src.contents) //it broke, delete what was in it
- qdel(O)
- crit_fail = 1
- icon_state = "brokenpack"
-
/obj/item/weapon/storage/backpack/holding/singularity_act(current_size)
var/dist = max((current_size - 2),1)
explosion(src.loc,(dist),(dist*2),(dist*4))
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index af415d016c8..1c9d4aa82bf 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -68,6 +68,7 @@
name = "trash bag of holding"
desc = "The latest and greatest in custodial convenience, a trashbag that is capable of holding vast quantities of garbage."
icon_state = "bluetrashbag"
+ origin_tech = "materials=4;bluespace=4;engineering=4;plasmatech=3"
max_combined_w_class = 60
storage_slots = 60
@@ -80,6 +81,7 @@
desc = "This little bugger can be used to store and transport ores."
icon = 'icons/obj/mining.dmi'
icon_state = "satchel"
+ origin_tech = "engineering=2"
slot_flags = SLOT_BELT | SLOT_POCKET
w_class = 3
storage_slots = 50
@@ -95,7 +97,7 @@
desc = "A revolution in convenience, this satchel allows for infinite ore storage. It's been outfitted with anti-malfunction safety measures."
storage_slots = INFINITY
max_combined_w_class = INFINITY
- origin_tech = "bluespace=3"
+ origin_tech = "bluespace=4;materials=3;engineering=3"
icon_state = "satchel_bspace"
// -----------------------------
@@ -119,6 +121,7 @@
name = "portable seed extractor"
desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant."
icon_state = "portaseeder"
+ origin_tech = "biotech=3;engineering=2"
/obj/item/weapon/storage/bag/plants/portaseeder/verb/dissolve_contents()
set name = "Activate Seed Extraction"
@@ -377,4 +380,4 @@
w_class = 1
preposition = "in"
can_hold = list(/obj/item/slime_extract, /obj/item/weapon/reagent_containers/syringe, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/reagent_containers/blood, /obj/item/weapon/reagent_containers/hypospray/medipen, /obj/item/trash/deadmouse)
- burn_state = FLAMMABLE
\ No newline at end of file
+ burn_state = FLAMMABLE
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index b87c609a238..839a8ae2adb 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -11,7 +11,7 @@
throw_range = 7
w_class = 4
materials = list(MAT_METAL = 500)
- origin_tech = "combat=1"
+ origin_tech = "combat=1;engineering=1"
attack_verb = list("robusted")
hitsound = 'sound/weapons/smash.ogg'
@@ -71,7 +71,7 @@
name = "suspicious looking toolbox"
icon_state = "syndicate"
item_state = "toolbox_syndi"
- origin_tech = "combat=1;syndicate=1"
+ origin_tech = "combat=2;syndicate=1;engineering=2"
silent = 1
force = 15
throwforce = 18
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 0744643aac4..605cdd9c5f9 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -160,9 +160,7 @@
return 1
/obj/item/weapon/melee/baton/emp_act(severity)
- if(deductcharge(1000 / severity))
- if(bcell.reliability != 100 && prob(50/severity))
- bcell.reliability -= 10 / severity
+ deductcharge(1000 / severity)
..()
//Makeshift stun baton. Replacement for stun gloves.
diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm
index 06ee28a8db9..0e3496cbfc7 100644
--- a/code/game/objects/items/weapons/teleportation.dm
+++ b/code/game/objects/items/weapons/teleportation.dm
@@ -22,7 +22,7 @@
throw_speed = 3
throw_range = 7
materials = list(MAT_METAL=400)
- origin_tech = "magnets=1"
+ origin_tech = "magnets=3;bluespace=2"
/obj/item/weapon/locator/attack_self(mob/user)
user.set_machine(src)
@@ -133,7 +133,7 @@ Frequency:
throw_speed = 3
throw_range = 5
materials = list(MAT_METAL=10000)
- origin_tech = "magnets=1;bluespace=3"
+ origin_tech = "magnets=3;bluespace=4"
var/active_portals = 0
/obj/item/weapon/hand_tele/attack_self(mob/user)
@@ -169,5 +169,3 @@ Frequency:
try_move_adjacent(P)
active_portals++
add_fingerprint(user)
-
-
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 9f7b37c2542..899709fffa0 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -46,7 +46,7 @@
icon_state = "wrench_medical"
force = 2 //MEDICAL
throwforce = 4
- origin_tech = "materials=1;engineering=1;biotech=1"
+ origin_tech = "materials=1;engineering=1;biotech=3"
attack_verb = list("wrenched", "medicaled", "tapped", "jabbed")
/obj/item/weapon/wrench/medical/suicide_act(mob/user)
@@ -200,7 +200,7 @@
w_class = 2
materials = list(MAT_METAL=70, MAT_GLASS=30)
- origin_tech = "engineering=1"
+ origin_tech = "engineering=1;plasmatech=1"
var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
var/status = 1 //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
var/max_fuel = 20 //The max amount of fuel the welder can hold
@@ -428,7 +428,7 @@
icon_state = "indwelder"
max_fuel = 40
materials = list(MAT_GLASS=60)
- origin_tech = "engineering=2"
+ origin_tech = "engineering=2;plasmatech=2"
/obj/item/weapon/weldingtool/largetank/cyborg
name = "integrated welding tool"
@@ -461,7 +461,7 @@
item_state = "upindwelder"
max_fuel = 80
materials = list(MAT_METAL=70, MAT_GLASS=120)
- origin_tech = "engineering=3"
+ origin_tech = "engineering=3;plasmatech=2"
/obj/item/weapon/weldingtool/experimental
name = "experimental welding tool"
@@ -470,7 +470,7 @@
item_state = "exwelder"
max_fuel = 40
materials = list(MAT_METAL=70, MAT_GLASS=120)
- origin_tech = "materials=4;engineering=4;bluespace=3;plasmatech=3"
+ origin_tech = "materials=4;engineering=4;bluespace=3;plasmatech=4"
var/last_gen = 0
change_icons = 0
can_off_process = 1
@@ -509,7 +509,7 @@
throwforce = 7
w_class = 2
materials = list(MAT_METAL=50)
- origin_tech = "engineering=1"
+ origin_tech = "engineering=1;combat=1"
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
toolspeed = 1
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 2419cd93645..fbae342c1d9 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -203,7 +203,7 @@
unwieldsound = 'sound/weapons/saberoff.ogg'
hitsound = "swing_hit"
armour_penetration = 35
- origin_tech = "magnets=3;syndicate=4"
+ origin_tech = "magnets=4;syndicate=5"
item_color = "green"
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
block_chance = 75
@@ -365,7 +365,7 @@
throw_speed = 2
throw_range = 4
materials = list(MAT_METAL=13000)
- origin_tech = "materials=2;engineering=2;combat=2"
+ origin_tech = "materials=3;engineering=4;combat=2"
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = "swing_hit"
sharpness = IS_SHARP
@@ -547,4 +547,4 @@
sharpness = IS_SHARP
/obj/item/weapon/twohanded/bonespear/update_icon()
- icon_state = "bone_spear[wielded]"
\ No newline at end of file
+ icon_state = "bone_spear[wielded]"
diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm
index cf59188d5d6..0d408243e68 100644
--- a/code/game/objects/items/weapons/vending_items.dm
+++ b/code/game/objects/items/weapons/vending_items.dm
@@ -69,5 +69,5 @@
/obj/item/weapon/vending_refill/clothing
machine_name = "ClothesMate"
icon_state = "refill_clothes"
- charges = list(30, 2, 3)// of 86 standard, 6 contraband, 9 premium
- init_charges = list(30, 2, 3)
\ No newline at end of file
+ charges = list(31, 2, 4)// of 87 standard, 6 contraband, 10 premium(?)
+ init_charges = list(31, 2, 4)
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index c389b785427..5eaac8f3c7d 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -145,7 +145,7 @@
throw_speed = 3
throw_range = 6
materials = list(MAT_METAL=12000)
- origin_tech = "materials=1"
+ origin_tech = "engineering=3;combat=2"
hitsound = 'sound/weapons/Genhit.ogg'
attack_verb = list("stubbed", "poked")
var/extended = 0
@@ -284,6 +284,5 @@
name = "liz o' nine tails"
desc = "A whip fashioned from the severed tails of lizards."
icon_state = "tailwhip"
- origin_tech = "combat=1"
+ origin_tech = "engineering=3;combat=3;biotech=3"
needs_permit = 0
-
diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm
index a57653d41ff..e08900cdc30 100644
--- a/code/game/objects/structures/ai_core.dm
+++ b/code/game/objects/structures/ai_core.dm
@@ -251,4 +251,4 @@ atom/proc/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/
/obj/item/weapon/circuitboard/aicore
name = "circuit board (AI core)"
- origin_tech = "programming=4;biotech=2"
+ origin_tech = "programming=3"
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index fb766921ac3..6081462ac8d 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -17,12 +17,24 @@
/turf/closed/wall,
/turf/closed/wall/r_wall,
/obj/structure/falsewall,
- /obj/structure/falsewall/reinforced, // WHY DO WE SMOOTH WITH FALSE R-WALLS WHEN WE DON'T SMOOTH WITH REAL R-WALLS.
+ /obj/structure/falsewall/reinforced,
/turf/closed/wall/rust,
/turf/closed/wall/r_wall/rust)
smooth = SMOOTH_TRUE
can_be_unanchored = 0
+/obj/structure/falsewall/New(loc)
+ ..()
+ air_update_turf(1)
+
+/obj/structure/falsewall/Destroy()
+ density = 0
+ air_update_turf(1)
+ return ..()
+
+/obj/structure/falsewall/CanAtmosPass(turf/T)
+ return !density
+
/obj/structure/falsewall/attack_hand(mob/user)
if(opening)
return
@@ -46,6 +58,7 @@
if(!qdeleted(src))
SetOpacity(1)
update_icon()
+ air_update_turf(1)
opening = 0
/obj/structure/falsewall/attack_animal(mob/living/simple_animal/user)
@@ -68,7 +81,7 @@
if(density)
smooth = SMOOTH_TRUE
queue_smooth(src)
- icon_state = ""
+ icon_state = "wall"
else
icon_state = "fwall_open"
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 87773f725a3..a4d32622fe9 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -21,6 +21,9 @@ var/global/BSACooldown = 0
if(!check_rights())
return
+ if(!isobserver(usr))
+ log_game("[key_name_admin(usr)] checked the player panel while in game.")
+
if(!M)
usr << "You seem to be selecting a mob that doesn't exist anymore."
return
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 482a450a832..c446f16244a 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -439,8 +439,9 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/show_log = alert(src, "Show ion message?", "Message", "Yes", "No")
var/announce_ion_laws = (show_log == "Yes" ? 1 : -1)
- new /datum/round_event/ion_storm(0, announce_ion_laws, input)
-
+ var/datum/round_event/ion_storm/ion = new(0, announce_ion_laws, input)
+ ion.start()
+
feedback_add_details("admin_verb","IONC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_rejuvenate(mob/living/M in mob_list)
diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm
index a999ed9e2ee..8b7abfa5180 100644
--- a/code/modules/assembly/assembly.dm
+++ b/code/modules/assembly/assembly.dm
@@ -9,7 +9,7 @@
throwforce = 2
throw_speed = 3
throw_range = 7
- origin_tech = "magnets=1"
+ origin_tech = "magnets=1;engineering=1"
var/secured = 1
var/list/attached_overlays = null
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index 84e212cd2e0..277f418760b 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -3,7 +3,7 @@
desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted.\nAlt-click to rotate it clockwise."
icon_state = "infrared"
materials = list(MAT_METAL=1000, MAT_GLASS=500)
- origin_tech = "magnets=2"
+ origin_tech = "magnets=2;materials=2"
var/on = 0
var/visible = 0
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index dfdb4b9cca6..fb643f482bc 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -3,7 +3,7 @@
desc = "A handy little spring-loaded trap for catching pesty rodents."
icon_state = "mousetrap"
materials = list(MAT_METAL=100)
- origin_tech = "combat=1"
+ origin_tech = "combat=1;materials=2;engineering=1"
attachable = 1
var/armed = 0
diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm
index 32352855eb2..1a652ba61b1 100644
--- a/code/modules/assembly/proximity.dm
+++ b/code/modules/assembly/proximity.dm
@@ -3,7 +3,7 @@
desc = "Used for scanning and alerting when someone enters a certain proximity."
icon_state = "prox"
materials = list(MAT_METAL=800, MAT_GLASS=200)
- origin_tech = "magnets=1"
+ origin_tech = "magnets=1;engineering=1"
attachable = 1
var/scanning = 0
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index 6f9a7127184..db8cd41f582 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -4,7 +4,7 @@
icon_state = "signaller"
item_state = "signaler"
materials = list(MAT_METAL=400, MAT_GLASS=120)
- origin_tech = "magnets=1"
+ origin_tech = "magnets=1;bluespace=1"
wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE
attachable = 1
diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm
index 3432899486a..4f459a497c0 100644
--- a/code/modules/assembly/timer.dm
+++ b/code/modules/assembly/timer.dm
@@ -3,7 +3,7 @@
desc = "Used to time things. Works well with contraptions which has to count down. Tick tock."
icon_state = "timer"
materials = list(MAT_METAL=500, MAT_GLASS=50)
- origin_tech = "magnets=1"
+ origin_tech = "magnets=1;engineering=1"
attachable = 1
var/timing = 0
@@ -116,4 +116,3 @@
if(usr)
attack_self(usr)
-
diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm
index 81d027e4757..0d9fd0b5e8f 100644
--- a/code/modules/assembly/voice.dm
+++ b/code/modules/assembly/voice.dm
@@ -3,7 +3,7 @@
desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated."
icon_state = "voice"
materials = list(MAT_METAL=500, MAT_GLASS=50)
- origin_tech = "magnets=1"
+ origin_tech = "magnets=1;engineering=1"
flags = HEAR
attachable = 1
verb_say = "beeps"
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 0198186a411..1c986341a8e 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -28,7 +28,7 @@
/obj/item/weapon/circuitboard/machine/cryo_tube
name = "circuit board (Cryotube)"
build_path = /obj/machinery/atmospherics/components/unary/cryo_cell
- origin_tech = "programming=4;biotech=3;engineering=4"
+ origin_tech = "programming=4;biotech=3;engineering=4;plasmatech=3"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/stack/cable_coil = 1,
diff --git a/code/modules/cargo/exports/research.dm b/code/modules/cargo/exports/research.dm
index 39e54a1842b..004eded9101 100644
--- a/code/modules/cargo/exports/research.dm
+++ b/code/modules/cargo/exports/research.dm
@@ -20,7 +20,7 @@
-// Sell max reliablity designs
+// Sell designs
/datum/export/design
cost = 2500
unit_name = "design data disk"
@@ -34,9 +34,7 @@
var/datum/design/design = disk.blueprint
if(design.id in researchDesigns)
return 0
- if(initial(design.reliability) < 100 && design.reliability >= 100)
- return ..()
- return 0
+ return ..()
/datum/export/design/sell_object(obj/O)
..()
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index fde8d078709..bd9ad082428 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -151,7 +151,7 @@
item_state = "bl_suit"
item_color = "black"
desc = "It's a plain jumpsuit. It has a small dial on the wrist."
- origin_tech = "syndicate=3"
+ origin_tech = "syndicate=2"
sensor_mode = 0 //Hey who's this guy on the Syndicate Shuttle??
random_sensor = 0
burn_state = FIRE_PROOF
@@ -170,7 +170,7 @@
icon_state = "armor"
item_state = "armor"
blood_overlay_type = "armor"
- origin_tech = "syndicate=3"
+ origin_tech = "syndicate=2"
burn_state = FIRE_PROOF
armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0)
@@ -186,8 +186,7 @@
desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
icon_state = "meson"
item_state = "meson"
-
- origin_tech = "syndicate=3"
+ origin_tech = "syndicate=2"
burn_state = FIRE_PROOF
armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0)
@@ -300,10 +299,9 @@
icon_state = "black"
item_color = "black"
desc = "A pair of black shoes."
-
permeability_coefficient = 0.05
flags = NOSLIP
- origin_tech = "syndicate=3"
+ origin_tech = "syndicate=2"
burn_state = FIRE_PROOF
can_hold_items = 1
armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0)
diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm
index e3d60ce2028..ad792ed9170 100644
--- a/code/modules/clothing/glasses/engine_goggles.dm
+++ b/code/modules/clothing/glasses/engine_goggles.dm
@@ -5,6 +5,7 @@
desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, regardless of lighting condition. The T-ray Scanner mode lets you see underfloor objects such as cables and pipes."
icon_state = "trayson-meson"
actions_types = list(/datum/action/item_action/toggle_mode)
+ origin_tech = "materials=3;magnets=3;engineering=3;plasmatech=3"
var/mode = 0 //0 - regular mesons mode 1 - t-ray mode
var/invis_objects = list()
@@ -95,6 +96,7 @@
name = "Optical T-Ray Scanner"
desc = "Used by engineering staff to see underfloor objects such as cables and pipes."
icon_state = "trayson-tray_off"
+ origin_tech = "materials=3;magnets=2;engineering=2"
mode = 1
var/on = 0
@@ -132,4 +134,4 @@
A.UpdateButtonIcon()
/obj/item/clothing/glasses/meson/engine/tray/t_ray_on()
- return on && ..()
\ No newline at end of file
+ return on && ..()
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 7e5b6331a5d..a545be52aa9 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -19,7 +19,7 @@
desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
icon_state = "meson"
item_state = "meson"
- origin_tech = "magnets=2;engineering=2"
+ origin_tech = "magnets=1;engineering=2"
darkness_view = 2
vision_flags = SEE_TURFS
invis_view = SEE_INVISIBLE_MINIMUM
@@ -29,6 +29,7 @@
desc = "An Optical Meson Scanner fitted with an amplified visible light spectrum overlay, providing greater visual clarity in darkness."
icon_state = "nvgmeson"
item_state = "nvgmeson"
+ origin_tech = "magnets=4;engineering=5;plasmatech=4"
darkness_view = 8
/obj/item/clothing/glasses/meson/gar
@@ -48,7 +49,7 @@
desc = "A pair of snazzy goggles used to protect against chemical spills. Fitted with an analyzer for scanning items and reagents."
icon_state = "purple"
item_state = "glasses"
- origin_tech = "magnets=2;engineering=2"
+ origin_tech = "magnets=2;engineering=1"
scan_reagents = 1 //You can see reagents while wearing science goggles
actions_types = list(/datum/action/item_action/toggle_research_scanner)
@@ -61,7 +62,7 @@
desc = "You can totally see in the dark now!"
icon_state = "night"
item_state = "glasses"
- origin_tech = "magnets=4"
+ origin_tech = "materials=4;magnets=4;plasmatech=4;engineering=4"
darkness_view = 8
invis_view = SEE_INVISIBLE_MINIMUM
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index 7ab535c4d9d..ba07bdd1aba 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -31,6 +31,7 @@
name = "Health Scanner HUD"
desc = "A heads-up display that scans the humans in view and provides accurate data about their health status."
icon_state = "healthhud"
+ origin_tech = "magnets=3;biotech=2"
hud_type = DATA_HUD_MEDICAL_ADVANCED
/obj/item/clothing/glasses/hud/health/night
@@ -38,6 +39,7 @@
desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness."
icon_state = "healthhudnight"
item_state = "glasses"
+ origin_tech = "magnets=4;biotech=4;plasmatech=4;engineering=5"
darkness_view = 8
invis_view = SEE_INVISIBLE_MINIMUM
@@ -45,6 +47,7 @@
name = "Diagnostic HUD"
desc = "A heads-up display capable of analyzing the integrity and status of robotics and exosuits."
icon_state = "diagnostichud"
+ origin_tech = "magnets=2;engineering=2"
hud_type = DATA_HUD_DIAGNOSTIC
/obj/item/clothing/glasses/hud/diagnostic/night
@@ -52,14 +55,15 @@
desc = "A robotics diagnostic HUD fitted with a light amplifier."
icon_state = "diagnostichudnight"
item_state = "glasses"
+ origin_tech = "magnets=4;powerstorage=4;plasmatech=4;engineering=5"
darkness_view = 8
invis_view = SEE_INVISIBLE_MINIMUM
-
/obj/item/clothing/glasses/hud/security
name = "Security HUD"
desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status and security records."
icon_state = "securityhud"
+ origin_tech = "magnets=3;combat=2"
hud_type = DATA_HUD_SECURITY_ADVANCED
/obj/item/clothing/glasses/hud/security/chameleon
@@ -80,6 +84,7 @@
name = "HUDSunglasses"
desc = "Sunglasses with a HUD."
icon_state = "sunhud"
+ origin_tech = "magnets=3;combat=3;engineering=3"
darkness_view = 1
flash_protect = 1
tint = 1
@@ -88,6 +93,7 @@
name = "Night Vision Security HUD"
desc = "An advanced heads-up display which provides id data and vision in complete darkness."
icon_state = "securityhudnight"
+ origin_tech = "magnets=4;combat=4;plasmatech=4;engineering=5"
darkness_view = 8
invis_view = SEE_INVISIBLE_MINIMUM
@@ -159,4 +165,4 @@
/obj/item/clothing/glasses/hud/toggle/thermal/emp_act(severity)
thermal_overload()
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 3804a67ef7f..0c9538bf7a5 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -21,7 +21,7 @@
flash_protect = 2
tint = 2
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
- origin_tech = "materials=2;engineering=2"
+ origin_tech = "materials=2;engineering=3"
actions_types = list(/datum/action/item_action/toggle)
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = MASKCOVERSEYES
diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm
index 8d3f55c8dce..85e9ab69c30 100644
--- a/code/modules/clothing/shoes/magboots.dm
+++ b/code/modules/clothing/shoes/magboots.dm
@@ -9,7 +9,7 @@
strip_delay = 70
put_on_delay = 70
burn_state = FIRE_PROOF
- origin_tech = "magnets=2"
+ origin_tech = "materials=3;magnets=4;engineering=4"
/obj/item/clothing/shoes/magboots/verb/toggle()
set name = "Toggle Magboots"
@@ -50,10 +50,11 @@
icon_state = "advmag0"
magboot_state = "advmag"
slowdown_active = SHOES_SLOWDOWN
+ origin_tech = "magnets=6;engineering=4"
/obj/item/clothing/shoes/magboots/syndie
desc = "Reverse-engineered magnetic boots that have a heavy magnetic pull. Property of Gorlex Marauders."
name = "blood-red magboots"
icon_state = "syndiemag0"
magboot_state = "syndiemag"
- origin_tech = "magnets=2;syndicate=3"
+ origin_tech = "magnets=4;syndicate=2"
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 9fcc55c5ad1..9f9c1e4e489 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -372,6 +372,30 @@
item_state = "militaryjacket"
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/weapon/gun/projectile/automatic/pistol,/obj/item/weapon/gun/projectile/revolver,/obj/item/weapon/gun/projectile/revolver/detective,/obj/item/device/radio)
+/obj/item/clothing/suit/jacket/letterman
+ name = "letterman jacket"
+ desc = "A classic brown letterman jacket. Looks pretty hot and heavy."
+ icon_state = "letterman"
+ item_state = "letterman"
+
+/obj/item/clothing/suit/jacket/letterman_red
+ name = "red letterman jacket"
+ desc = "A letterman jacket in a sick red color. Radical."
+ icon_state = "letterman_red"
+ item_state = "letterman_red"
+
+/obj/item/clothing/suit/jacket/letterman_syndie
+ name = "blood-red letterman jacket"
+ desc = "Oddly, this jacket seems to have a large S on the back..."
+ icon_state = "letterman_s"
+ item_state = "letterman_s"
+
+/obj/item/clothing/suit/jacket/letterman_nanotrasen
+ name = "blue letterman jacket"
+ desc = "A blue letterman jacket with a proud Nanotrasen N on the back. The tag says that it was made in Space China."
+ icon_state = "letterman_n"
+ item_state = "letterman_n"
+
/obj/item/clothing/suit/xenos
name = "xenos suit"
desc = "A suit made out of chitinous alien hide."
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 5c660d23388..3aa32345fc8 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -566,6 +566,7 @@
name = "Plasma-man jumpsuit refill pack"
desc = "A compressed water pack used to refill plasma-man jumpsuit auto-extinguishers."
icon_state = "plasmarefill"
+ origin_tech = "materials=2;plasmatech=3;biotech=1"
/obj/item/clothing/under/rank/security/navyblue/russian
name = "russian officer's uniform"
diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm
index 953cab9ade6..1c37803b5cd 100644
--- a/code/modules/detectivework/scanner.dm
+++ b/code/modules/detectivework/scanner.dm
@@ -12,7 +12,7 @@
slot_flags = SLOT_BELT
var/scanning = 0
var/list/log = list()
- origin_tech = "engineering=3;biotech=2"
+ origin_tech = "engineering=4;biotech=2;programming=5"
/obj/item/device/detective_scanner/attack_self(mob/user)
if(log.len && !scanning)
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index 23e4ee960d3..2b8ae2a3455 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -434,7 +434,8 @@
SM.on_hit(src, user)
user_unbuckle_mob(user,user)
-
+/obj/effect/spacevine/attack_alien(mob/living/user)
+ eat(user)
/obj/effect/spacevine_controller
invisibility = INVISIBILITY_ABSTRACT
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index 6c01a8aa161..60ce3eda30f 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -54,7 +54,7 @@
/obj/item/weapon/circuitboard/machine/gibber
name = "circuit board (Gibber)"
build_path = /obj/machinery/gibber
- origin_tech = "programming=1"
+ origin_tech = "programming=2;engineering=2"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/weapon/stock_parts/manipulator = 1)
@@ -235,5 +235,3 @@
pixel_x = initial(pixel_x) //return to its spot after shaking
src.operating = 0
update_icon()
-
-
diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
index 06ca4bd94b4..5ab3d08e7d5 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
@@ -30,7 +30,7 @@
/obj/item/weapon/circuitboard/machine/microwave
name = "circuit board (Microwave)"
build_path = /obj/machinery/microwave
- origin_tech = "programming=1;magnets=1"
+ origin_tech = "programming=2;magnets=2"
req_components = list(
/obj/item/weapon/stock_parts/micro_laser = 1,
/obj/item/weapon/stock_parts/matter_bin = 1,
diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm
index 338d04b7e6f..3cc757ce367 100644
--- a/code/modules/food_and_drinks/pizzabox.dm
+++ b/code/modules/food_and_drinks/pizzabox.dm
@@ -4,7 +4,7 @@
desc = "Special delivery!"
icon_state = "pizzabomb_inactive"
item_state = "eshield0"
- origin_tech = "syndicate=4"
+ origin_tech = "syndicate=3;engineering=3"
/obj/item/pizzabox
name = "pizza box"
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index c951b922b8b..43fed6a2185 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -24,7 +24,7 @@
/obj/item/weapon/circuitboard/machine/biogenerator
name = "circuit board (Biogenerator)"
build_path = /obj/machinery/biogenerator
- origin_tech = "programming=3;biotech=2;materials=3"
+ origin_tech = "programming=2;biotech=3;materials=3"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/weapon/stock_parts/manipulator = 1,
@@ -401,4 +401,3 @@
else if(href_list["menu"])
menustat = "menu"
updateUsrDialog()
-
diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm
index 2f0e44878b3..74e43afeba3 100644
--- a/code/modules/hydroponics/gene_modder.dm
+++ b/code/modules/hydroponics/gene_modder.dm
@@ -29,7 +29,7 @@
/obj/item/weapon/circuitboard/machine/plantgenes
name = "circuit board (Plant DNA Manipulator)"
build_path = /obj/machinery/plantgenes
- origin_tech = "programming=2;biotech=3"
+ origin_tech = "programming=3;biotech=3"
req_components = list(
/obj/item/weapon/stock_parts/manipulator = 1,
/obj/item/weapon/stock_parts/micro_laser = 1,
@@ -422,4 +422,4 @@
/obj/item/weapon/storage/box/disks_plantgene/New()
..()
for(var/i in 1 to 7)
- new /obj/item/weapon/disk/plantgene(src)
\ No newline at end of file
+ new /obj/item/weapon/disk/plantgene(src)
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 306633d56bc..c0eaf24d4e6 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -15,6 +15,7 @@
// Saves us from having to define each stupid grown's dried_type as itself.
// If you don't want a plant to be driable (watermelons) set this to null in the time definition.
burn_state = FLAMMABLE
+ origin_tech = "biotech=1"
/obj/item/weapon/reagent_containers/food/snacks/grown/New(newloc, var/obj/item/seeds/new_seed = null)
..()
diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm
index 87d8bffef59..f58fbb91f7f 100644
--- a/code/modules/hydroponics/grown/ambrosia.dm
+++ b/code/modules/hydroponics/grown/ambrosia.dm
@@ -28,6 +28,7 @@
seed = /obj/item/seeds/ambrosia
name = "ambrosia vulgaris branch"
desc = "This is a plant containing various healing chemicals."
+ origin_tech = "biotech=2"
// Ambrosia Deus
/obj/item/seeds/ambrosia/deus
@@ -46,4 +47,5 @@
name = "ambrosia deus branch"
desc = "Eating this makes you feel immortal!"
icon_state = "ambrosiadeus"
- filling_color = "#008B8B"
\ No newline at end of file
+ filling_color = "#008B8B"
+ origin_tech = "biotech=4;materials=3"
diff --git a/code/modules/hydroponics/grown/apple.dm b/code/modules/hydroponics/grown/apple.dm
index 3c953770677..370184ebe27 100644
--- a/code/modules/hydroponics/grown/apple.dm
+++ b/code/modules/hydroponics/grown/apple.dm
@@ -51,4 +51,5 @@
name = "golden apple"
desc = "Emblazoned upon the apple is the word 'Kallisti'."
icon_state = "goldapple"
- filling_color = "#FFD700"
\ No newline at end of file
+ filling_color = "#FFD700"
+ origin_tech = "biotech=4;materials=5"
diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm
index c5abc2caf69..df4fdd7cec1 100644
--- a/code/modules/hydroponics/grown/banana.dm
+++ b/code/modules/hydroponics/grown/banana.dm
@@ -100,6 +100,7 @@
icon_state = "banana_blue"
trash = /obj/item/weapon/grown/bananapeel/bluespace
filling_color = "#0000FF"
+ origin_tech = "biotech=3;bluespace=5"
/obj/item/weapon/grown/bananapeel/bluespace
seed = /obj/item/seeds/banana/bluespace
@@ -107,7 +108,6 @@
desc = "A peel from a bluespace banana."
icon_state = "banana_peel_blue"
-
// Other
/obj/item/weapon/grown/bananapeel/specialpeel //used by /obj/item/clothing/shoes/clown_shoes/banana_shoes
name = "synthesized banana peel"
@@ -117,4 +117,4 @@
if(iscarbon(AM))
var/mob/living/carbon/carbon = AM
if(carbon.slip(2, 2, src, FALSE))
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm
index e32f4a1eb12..36592c1571d 100644
--- a/code/modules/hydroponics/grown/berries.dm
+++ b/code/modules/hydroponics/grown/berries.dm
@@ -85,6 +85,7 @@
desc = "Nutritious!"
icon_state = "glowberrypile"
filling_color = "#7CFC00"
+ origin_tech = "plasmatech=6"
// Cherries
/obj/item/seeds/cherry
@@ -178,4 +179,4 @@
seed = /obj/item/seeds/grape/green
name = "bunch of green grapes"
icon_state = "greengrapes"
- filling_color = "#7FFF00"
\ No newline at end of file
+ filling_color = "#7FFF00"
diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm
index 707b92e4ee8..fbf90fea989 100644
--- a/code/modules/hydroponics/grown/chili.dm
+++ b/code/modules/hydroponics/grown/chili.dm
@@ -46,6 +46,7 @@
icon_state = "icepepper"
filling_color = "#0000CD"
bitesize_mod = 2
+ origin_tech = "biotech=4"
// Ghost Chili
/obj/item/seeds/chili/ghost
@@ -71,6 +72,7 @@
var/mob/held_mob
filling_color = "#F8F8FF"
bitesize_mod = 4
+ origin_tech = "biotech=4;magnets=5"
/obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili/attack_hand(mob/user)
..()
@@ -88,4 +90,4 @@
held_mob << "Your hand holding [src] burns!"
else
held_mob = null
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm
index de334bb6098..9f14ee21aa3 100644
--- a/code/modules/hydroponics/grown/misc.dm
+++ b/code/modules/hydroponics/grown/misc.dm
@@ -89,6 +89,6 @@
name = "gatfruit"
desc = "It smells like burning."
icon_state = "gatfruit"
- origin_tech = "combat=3"
+ origin_tech = "combat=6"
trash = /obj/item/weapon/gun/projectile/revolver
- bitesize_mod = 2
\ No newline at end of file
+ bitesize_mod = 2
diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm
index 122f09e3353..2f7442a3966 100644
--- a/code/modules/hydroponics/grown/mushrooms.dm
+++ b/code/modules/hydroponics/grown/mushrooms.dm
@@ -76,6 +76,7 @@
plant_type = PLANT_MUSHROOM
reagents_add = list("mushroomhallucinogen" = 0.04, "amatoxin" = 0.1, "nutriment" = 0, "amanitin" = 0.2)
rarity = 30
+ origin_tech = "biotech=5"
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/angel
seed = /obj/item/seeds/angel
@@ -158,6 +159,7 @@
desc = "Plumus Locomotus: The beginning of the great walk."
icon_state = "walkingmushroom"
filling_color = "#9370DB"
+ origin_tech = "biotech=4;programming=5"
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom/attack_self(mob/user)
if(istype(user.loc,/turf/open/space))
@@ -228,6 +230,7 @@
icon_state = "glowshroom"
filling_color = "#00FA9A"
var/effect_path = /obj/effect/glowshroom
+ origin_tech = "biotech=4;plasmatech=6"
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/attack_self(mob/user)
if(istype(user.loc,/turf/open/space))
@@ -263,4 +266,5 @@
desc = "Mycena Ruthenia: This species of mushroom glows in the dark, but aren't bioluminescent. They're warm to the touch..."
icon_state = "glowcap"
filling_color = "#00FA9A"
- effect_path = /obj/effect/glowshroom/glowcap
\ No newline at end of file
+ effect_path = /obj/effect/glowshroom/glowcap
+ origin_tech = "biotech=4;powerstorage=6;plasmatech=4"
diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm
index 86927e59be2..76ec1a3f3b1 100644
--- a/code/modules/hydroponics/grown/nettle.dm
+++ b/code/modules/hydroponics/grown/nettle.dm
@@ -27,7 +27,6 @@
reagents_add = list("facid" = 0.5, "sacid" = 0.5)
rarity = 20
-
/obj/item/weapon/grown/nettle //abstract type
name = "nettle"
desc = "It's probably not wise to touch it with bare hands..."
@@ -40,7 +39,7 @@
w_class = 1
throw_speed = 1
throw_range = 3
- origin_tech = "combat=1"
+ origin_tech = "combat=3"
attack_verb = list("stung")
/obj/item/weapon/grown/nettle/suicide_act(mob/user)
@@ -74,7 +73,6 @@
usr.unEquip(src)
qdel(src)
-
/obj/item/weapon/grown/nettle/basic
seed = /obj/item/seeds/nettle
@@ -82,7 +80,6 @@
..()
force = round((5 + seed.potency / 5), 1)
-
/obj/item/weapon/grown/nettle/death
seed = /obj/item/seeds/nettle/death
name = "deathnettle"
@@ -90,7 +87,7 @@
icon_state = "deathnettle"
force = 30
throwforce = 15
- origin_tech = "combat=3"
+ origin_tech = "combat=5"
/obj/item/weapon/grown/nettle/death/add_juice()
..()
@@ -113,4 +110,4 @@
if(prob(20))
M.Paralyse(force / 6)
M.Weaken(force / 15)
- M.drop_item()
\ No newline at end of file
+ M.drop_item()
diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm
index 2176b0dab71..3e588efa1e4 100644
--- a/code/modules/hydroponics/grown/tomato.dm
+++ b/code/modules/hydroponics/grown/tomato.dm
@@ -41,6 +41,7 @@
icon_state = "bloodtomato"
splat_type = /obj/effect/gibspawner/generic
filling_color = "#FF0000"
+ origin_tech = "biotech=5"
// Blue Tomato
@@ -86,6 +87,7 @@
name = "blue-space tomato"
desc = "So lubricated, you might slip through space-time."
icon_state = "bluespacetomato"
+ origin_tech = "biotech=4;bluespace=5"
// Killer Tomato
@@ -112,6 +114,7 @@
icon_state = "killertomato"
var/awakening = 0
filling_color = "#FF0000"
+ origin_tech = "biotech=4;combat=5"
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/killer/attack(mob/M, mob/user, def_zone)
if(awakening)
@@ -136,4 +139,4 @@
K.visible_message("The Killer Tomato growls as it suddenly awakens.")
if(user)
user.unEquip(src)
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index fc00ebb2e54..3fbd9cee816 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -5,7 +5,7 @@
icon = 'icons/obj/device.dmi'
icon_state = "hydro"
item_state = "analyzer"
- origin_tech = "magnets=1;biotech=1"
+ origin_tech = "magnets=2;biotech=2"
/obj/item/device/analyzer/plant_analyzer/attack_self(mob/user)
return 0
@@ -64,6 +64,7 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "cultivator"
item_state = "cultivator"
+ origin_tech = "engineering=2;biotech=2"
flags = CONDUCT
force = 5
throwforce = 7
@@ -84,7 +85,7 @@
throw_speed = 3
throw_range = 4
materials = list(MAT_METAL = 15000)
- origin_tech = "materials=2;combat=1"
+ origin_tech = "materials=2;combat=2"
attack_verb = list("chopped", "torn", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP
@@ -106,7 +107,7 @@
flags = CONDUCT
armour_penetration = 20
slot_flags = SLOT_BACK
- origin_tech = "materials=2;combat=2"
+ origin_tech = "materials=3;combat=2"
attack_verb = list("chopped", "sliced", "cut", "reaped")
hitsound = 'sound/weapons/bladeslice.ogg'
@@ -198,4 +199,3 @@
/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller/New()
..()
reagents.add_reagent("pestkiller", 50)
-
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 0161097ef48..2393b7601d1 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -40,7 +40,7 @@
/obj/item/weapon/circuitboard/machine/hydroponics
name = "circuit board (Hydroponics Tray)"
build_path = /obj/machinery/hydroponics/constructable
- origin_tech = "programming=1;biotech=1"
+ origin_tech = "programming=1;biotech=2"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 2,
/obj/item/weapon/stock_parts/manipulator = 1,
@@ -888,4 +888,4 @@
user << "You clear up [src]!"
qdel(src)
else
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index c7467575d7f..c1edd43e2c1 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -171,6 +171,7 @@
// For code, see grown.dm
name = "Liquid Contents"
examine_line = "It has a lot of liquid contents inside."
+ origin_tech = list("bio" = 5)
/*/datum/plant_gene/trait/squash/on_slip(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/target)
G.squash(target)*/
@@ -209,7 +210,7 @@
// Multiplies max charge by (rate*1000) when used in potato power cells.
name = "Electrical Activity"
rate = 0.2
- origin_tech = list("powerstorage" = 4)
+ origin_tech = list("powerstorage" = 5)
/datum/plant_gene/trait/cell_charge/on_slip(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/C)
var/power = G.seed.potency*rate
@@ -268,7 +269,7 @@
// Teleport radius is calculated as max(round(potency*rate), 1)
name = "Bluespace Activity"
rate = 0.1
- origin_tech = list("bluespace" = 3)
+ origin_tech = list("bluespace" = 5)
/datum/plant_gene/trait/teleport/on_squash(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
if(isliving(target))
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index 74d5ca7f9f0..2dd5cc77147 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -30,7 +30,7 @@
/obj/item/weapon/circuitboard/machine/ore_redemption
name = "circuit board (Ore Redemption)"
build_path = /obj/machinery/mineral/ore_redemption
- origin_tech = "programming=1;engineering=2"
+ origin_tech = "programming=2;engineering=2;plasmatech=3"
req_components = list(
/obj/item/weapon/stock_parts/console_screen = 1,
/obj/item/weapon/stock_parts/matter_bin = 1,
@@ -336,7 +336,7 @@
/obj/item/weapon/circuitboard/machine/mining_equipment_vendor
name = "circuit board (Mining Equipment Vendor)"
build_path = /obj/machinery/mineral/equipment_vendor
- origin_tech = "programming=1;engineering=2"
+ origin_tech = "programming=1;engineering=3"
req_components = list(
/obj/item/weapon/stock_parts/console_screen = 1,
/obj/item/weapon/stock_parts/matter_bin = 3)
@@ -611,14 +611,14 @@
var/fieldsactive = 0
var/burst_time = 30
var/fieldlimit = 4
- origin_tech = "magnets=2;combat=2"
+ origin_tech = "magnets=3;engineering=3"
/obj/item/weapon/resonator/upgraded
name = "upgraded resonator"
desc = "An upgraded version of the resonator that can produce more fields at once."
icon_state = "resonator_u"
item_state = "resonator_u"
- origin_tech = "magnets=3;combat=3"
+ origin_tech = "materials=4;powerstorage=3;engineering=3;magnets=3"
fieldlimit = 6
/obj/item/weapon/resonator/proc/CreateResonance(target, creator)
@@ -1098,7 +1098,7 @@
icon_state = "bottle19"
desc = "Inject certain types of monster organs with this stabilizer to preserve their healing powers indefinitely."
w_class = 1
- origin_tech = "biotech=1"
+ origin_tech = "biotech=3"
/obj/item/weapon/hivelordstabilizer/afterattack(obj/item/organ/M, mob/user)
var/obj/item/organ/hivelord_core/C = M
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 0113618d295..475e987361a 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -73,7 +73,7 @@
materials = list(MAT_METAL=2000) //one sheet, but where can you make them?
var/digspeed = 40
var/list/digsound = list('sound/effects/picaxe1.ogg','sound/effects/picaxe2.ogg','sound/effects/picaxe3.ogg')
- origin_tech = "materials=1;engineering=1"
+ origin_tech = "materials=2;engineering=3"
attack_verb = list("hit", "pierced", "sliced", "attacked")
/obj/item/weapon/pickaxe/proc/playDigSound()
@@ -84,7 +84,7 @@
icon_state = "spickaxe"
item_state = "spickaxe"
digspeed = 20 //mines faster than a normal pickaxe, bought from mining vendor
- origin_tech = "materials=3;engineering=2"
+ origin_tech = "materials=3;engineering=4"
desc = "A silver-plated pickaxe that mines slightly faster than standard-issue."
force = 17
@@ -93,7 +93,7 @@
icon_state = "dpickaxe"
item_state = "dpickaxe"
digspeed = 14
- origin_tech = "materials=4;engineering=3"
+ origin_tech = "materials=5;engineering=4"
desc = "A pickaxe with a diamond pick head. Extremely robust at cracking rock walls and digging up dirt."
force = 19
@@ -105,7 +105,7 @@
digspeed = 25 //available from roundstart, faster than a pickaxe.
digsound = list('sound/weapons/drill.ogg')
hitsound = 'sound/weapons/drill.ogg'
- origin_tech = "materials=2;powerstorage=3;engineering=2"
+ origin_tech = "materials=2;powerstorage=2;engineering=3"
desc = "An electric mining drill for the especially scrawny."
/obj/item/weapon/pickaxe/drill/cyborg
@@ -117,7 +117,7 @@
name = "diamond-tipped mining drill"
icon_state = "diamonddrill"
digspeed = 7
- origin_tech = "materials=6;powerstorage=4;engineering=5"
+ origin_tech = "materials=6;powerstorage=4;engineering=4"
desc = "Yours is the drill that will pierce the heavens!"
/obj/item/weapon/pickaxe/drill/cyborg/diamond //This is the BORG version!
@@ -130,7 +130,7 @@
icon_state = "jackhammer"
item_state = "jackhammer"
digspeed = 5 //the epitome of powertools. extremely fast mining, laughs at puny walls
- origin_tech = "materials=3;powerstorage=2;engineering=2"
+ origin_tech = "materials=6;powerstorage=4;engineering=5;magnets=4"
digsound = list('sound/weapons/sonic_jackhammer.ogg')
hitsound = 'sound/weapons/sonic_jackhammer.ogg'
desc = "Cracks rocks with sonic blasts, and doubles as a demolition power tool for smashing walls."
@@ -150,7 +150,7 @@
item_state = "shovel"
w_class = 3
materials = list(MAT_METAL=50)
- origin_tech = "materials=1;engineering=1"
+ origin_tech = "materials=2;engineering=2"
attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked")
sharpness = IS_SHARP
@@ -204,6 +204,7 @@
icon_state = "capsule"
icon = 'icons/obj/mining.dmi'
w_class = 1
+ origin_tech = "engineering=3;bluespace=3"
var/used = FALSE
/obj/item/weapon/survivalcapsule/attack_self()
@@ -551,4 +552,3 @@
anchored = 1
layer = BELOW_MOB_LAYER
density = 0
-
diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm
index 8ac9093906b..c8ef333c04a 100644
--- a/code/modules/mob/living/carbon/alien/organs.dm
+++ b/code/modules/mob/living/carbon/alien/organs.dm
@@ -30,7 +30,7 @@
/obj/item/organ/alien/plasmavessel
name = "plasma vessel"
icon_state = "plasma"
- origin_tech = "biotech=5;plasmatech=2"
+ origin_tech = "biotech=5;plasmatech=4"
w_class = 3
zone = "chest"
slot = "plasmavessel"
@@ -55,7 +55,7 @@
plasma_rate = 15
/obj/item/organ/alien/plasmavessel/large/queen
- origin_tech = "biotech=6;plasmatech=3"
+ origin_tech = "biotech=6;plasmatech=4"
plasma_rate = 20
/obj/item/organ/alien/plasmavessel/small
@@ -183,5 +183,5 @@
zone = "groin"
slot = "eggsac"
w_class = 4
- origin_tech = "biotech=8"
- alien_powers = list(/obj/effect/proc_holder/alien/lay_egg)
\ No newline at end of file
+ origin_tech = "biotech=6"
+ alien_powers = list(/obj/effect/proc_holder/alien/lay_egg)
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index 20659829676..0e6e1ee5b03 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -6,7 +6,7 @@
icon = 'icons/obj/assemblies.dmi'
icon_state = "mmi_empty"
w_class = 3
- origin_tech = "biotech=3"
+ origin_tech = "biotech=2;programming=3;engineering=2"
var/braintype = "Cyborg"
var/obj/item/device/radio/radio = null //Let's give it a radio.
var/hacked = 0 //Whether or not this is a Syndicate MMI
@@ -190,8 +190,9 @@
/obj/item/device/mmi/syndie
name = "Syndicate Man-Machine Interface"
desc = "Syndicate's own brand of MMI. It enforces laws designed to help Syndicate agents achieve their goals upon cyborgs created with it, but doesn't fit in Nanotrasen AI cores."
+ origin_tech = "biotech=4;programming=4;syndicate=2"
hacked = 1
/obj/item/device/mmi/syndie/New()
..()
- radio.on = 0
\ No newline at end of file
+ radio.on = 0
diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm
index c65a6d53df1..6b6ba71043a 100644
--- a/code/modules/mob/living/carbon/brain/brain_item.dm
+++ b/code/modules/mob/living/carbon/brain/brain_item.dm
@@ -8,7 +8,7 @@
zone = "head"
slot = "brain"
vital = 1
- origin_tech = "biotech=4"
+ origin_tech = "biotech=5"
attack_verb = list("attacked", "slapped", "whacked")
var/mob/living/carbon/brain/brainmob = null
var/damaged_brain = 0 //whether the brain organ is damaged.
@@ -124,4 +124,4 @@
name = "alien brain"
desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?"
icon_state = "brain-x"
- origin_tech = "biotech=7"
\ No newline at end of file
+ origin_tech = "biotech=6"
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index e80ea7479f7..3dc6ea17a4d 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -6,7 +6,7 @@ var/global/posibrain_notif_cooldown = 0
icon = 'icons/obj/assemblies.dmi'
icon_state = "posibrain"
w_class = 3
- origin_tech = "biotech=3;programming=2"
+ origin_tech = "biotech=4;programming=4;plasmatech=3"
var/notified = 0
var/askDelay = 10 * 60 * 1
var/used = 0 //Prevents split personality virus. May be reset if personality deletion code is added.
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index feb477023af..43bea3828a6 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -4,7 +4,10 @@
/mob/living/carbon/human/canBeHandcuffed()
- return 1
+ if(get_num_arms() >= 2)
+ return TRUE
+ else
+ return FALSE
//gets assignment from ID or ID inside PDA or PDA itself
//Useful when player do something with computers
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 6061f2ae93a..0d1154fa6c3 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -226,7 +226,6 @@
/obj/item/weapon/robot_module/peacekeeper/New()
..()
- modules += new /obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg(src)
modules += new /obj/item/weapon/cookiesynth(src)
modules += new /obj/item/device/harmalarm(src)
modules += new /obj/item/weapon/reagent_containers/borghypo/peace(src)
@@ -236,17 +235,6 @@
emag = new /obj/item/weapon/reagent_containers/borghypo/peace/hacked(src)
-/obj/item/weapon/robot_module/peacekeeper/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
- ..()
- var/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg/T = locate(/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg) in get_usable_modules()
- if(T)
- if(T.power_supply.charge < T.power_supply.maxcharge)
- var/obj/item/ammo_casing/energy/S = T.ammo_type[T.select]
- T.power_supply.give(S.e_cost * coeff)
- T.update_icon()
- else
- T.charge_tick = 0
-
/obj/item/weapon/robot_module/janitor
name = "janitorial robot module"
var/obj/item/weapon/reagent_containers/spray/drying_agent
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 670bea53361..181350544c4 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -82,7 +82,7 @@
* Sleepypens
*/
/obj/item/weapon/pen/sleepy
- origin_tech = "materials=2;syndicate=5"
+ origin_tech = "engineering=4;syndicate=2"
flags = OPENCONTAINER
@@ -107,7 +107,7 @@
* (Alan) Edaggers
*/
/obj/item/weapon/pen/edagger
- origin_tech = "combat=3;syndicate=5"
+ origin_tech = "combat=3;syndicate=1"
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") //these wont show up if the pen is off
var/on = 0
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 6d29f794ee6..3cb37835d23 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -15,7 +15,6 @@
var/maxcharge = 1000
materials = list(MAT_METAL=700, MAT_GLASS=50)
var/rigged = 0 // true if rigged to explode
- var/minor_fault = 0 //If not 100% reliable, it will build up faults.
var/chargerate = 100 //how much power is given every tick in a recharger
var/self_recharge = 0 //does it self recharge, over time, or not?
@@ -77,19 +76,12 @@
if(maxcharge < amount)
amount = maxcharge
var/power_used = min(maxcharge-charge,amount)
- if(crit_fail)
- return 0
- if(!prob(reliability))
- minor_fault++
- if(prob(minor_fault))
- crit_fail = 1
- return 0
charge += power_used
return power_used
/obj/item/weapon/stock_parts/cell/examine(mob/user)
..()
- if(crit_fail || rigged)
+ if(rigged)
user << "This power cell seems to be faulty!"
else
user << "The charge meter reads [round(src.percent() )]%."
@@ -140,8 +132,6 @@
charge -= 1000 / severity
if (charge < 0)
charge = 0
- if(reliability != 100 && prob(50/severity))
- reliability -= 10 / severity
..()
/obj/item/weapon/stock_parts/cell/ex_act(severity, target)
@@ -169,7 +159,6 @@
/obj/item/weapon/stock_parts/cell/crap
name = "\improper Nanotrasen brand rechargable AA battery"
desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT
- origin_tech = null
maxcharge = 500
materials = list(MAT_GLASS=40)
rating = 2
@@ -225,10 +214,10 @@
/obj/item/weapon/stock_parts/cell/super
name = "super-capacity power cell"
- origin_tech = "powerstorage=5"
+ origin_tech = "powerstorage=3;materials=3"
icon_state = "scell"
maxcharge = 20000
- materials = list(MAT_GLASS=70)
+ materials = list(MAT_GLASS=300)
rating = 4
chargerate = 2000
@@ -238,10 +227,10 @@
/obj/item/weapon/stock_parts/cell/hyper
name = "hyper-capacity power cell"
- origin_tech = "powerstorage=6"
+ origin_tech = "powerstorage=4;engineering=4;materials=4"
icon_state = "hpcell"
maxcharge = 30000
- materials = list(MAT_GLASS=80)
+ materials = list(MAT_GLASS=400)
rating = 5
chargerate = 3000
@@ -252,10 +241,10 @@
/obj/item/weapon/stock_parts/cell/bluespace
name = "bluespace power cell"
desc = "A rechargable transdimensional power cell."
- origin_tech = "powerstorage=7"
+ origin_tech = "powerstorage=5;bluespace=4;materials=4;engineering=4"
icon_state = "bscell"
maxcharge = 40000
- materials = list(MAT_GLASS=80)
+ materials = list(MAT_GLASS=600)
rating = 6
chargerate = 4000
@@ -266,9 +255,9 @@
/obj/item/weapon/stock_parts/cell/infinite
name = "infinite-capacity power cell!"
icon_state = "icell"
- origin_tech = null
+ origin_tech = "powerstorage=7"
maxcharge = 30000
- materials = list(MAT_GLASS=80)
+ materials = list(MAT_GLASS=1000)
rating = 6
chargerate = 30000
@@ -278,19 +267,18 @@
/obj/item/weapon/stock_parts/cell/potato
name = "potato battery"
desc = "A rechargable starch based power cell."
- origin_tech = "powerstorage=1"
icon = 'icons/obj/power.dmi' //'icons/obj/hydroponics/harvest.dmi'
icon_state = "potato_cell" //"potato_battery"
+ origin_tech = "powerstorage=1;biotech=1"
charge = 100
maxcharge = 300
materials = list()
- minor_fault = 1
rating = 1
/obj/item/weapon/stock_parts/cell/high/slime
name = "charged slime core"
desc = "A yellow slime core infused with plasma, it crackles with power."
- origin_tech = "powerstorage=2;biotech=4"
+ origin_tech = "powerstorage=5;biotech=4"
icon = 'icons/mob/slimes.dmi'
icon_state = "yellow slime extract"
materials = list()
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index a61bef51c4f..01e28bb0f7c 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -115,7 +115,7 @@ display round(lastgen) and plasmatank amount
/obj/item/weapon/circuitboard/machine/pacman
name = "circuit board (PACMAN-type Generator)"
build_path = /obj/machinery/power/port_gen/pacman
- origin_tech = "programming=3;powerstorage=3;plasmatech=3;engineering=3"
+ origin_tech = "programming=2;powerstorage=3;plasmatech=3;engineering=3"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/weapon/stock_parts/micro_laser = 1,
@@ -130,7 +130,7 @@ display round(lastgen) and plasmatank amount
/obj/item/weapon/circuitboard/machine/pacman/mrs
name = "circuit board (MRSPACMAN-type Generator)"
build_path = "/obj/machinery/power/port_gen/pacman/mrs"
- origin_tech = "programming=3;powerstorage=5;engineering=5"
+ origin_tech = "programming=3;powerstorage=4;engineering=4;plasmatech=4"
/obj/machinery/power/port_gen/pacman/Destroy()
DropFuel()
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 5a8baf62a1b..627efa66d73 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -37,7 +37,7 @@
/obj/item/weapon/circuitboard/machine/emitter
name = "circuit board (Emitter)"
build_path = /obj/machinery/power/emitter
- origin_tech = "programming=4;powerstorage=5;engineering=5"
+ origin_tech = "programming=3;powerstorage=4;engineering=4"
req_components = list(
/obj/item/weapon/stock_parts/micro_laser = 1,
/obj/item/weapon/stock_parts/manipulator = 1)
diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm
index ddb453f9082..3ee76344e49 100644
--- a/code/modules/power/tesla/coil.dm
+++ b/code/modules/power/tesla/coil.dm
@@ -16,7 +16,7 @@
/obj/item/weapon/circuitboard/machine/tesla_coil
name = "circuit board (Tesla Coil)"
build_path = /obj/machinery/power/tesla_coil
- origin_tech = "programming=1;engineering=2;powerstorage=3"
+ origin_tech = "programming=3;magnets=3;powerstorage=3"
req_components = list(/obj/item/weapon/stock_parts/capacitor = 1)
/obj/machinery/power/tesla_coil/RefreshParts()
@@ -72,7 +72,7 @@
/obj/item/weapon/circuitboard/machine/grounding_rod
name = "circuit board (Grounding Rod)"
build_path = /obj/machinery/power/grounding_rod
- origin_tech = "programming=1;engineering=1;powerstorage=1"
+ origin_tech = "programming=3;powerstorage=3;magnets=3;plasmatech=2"
req_components = list(/obj/item/weapon/stock_parts/capacitor = 1)
/obj/machinery/power/grounding_rod/attackby(obj/item/W, mob/user, params)
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index a4a7f60b165..ec2112d7d7a 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -76,7 +76,7 @@
/obj/item/weapon/circuitboard/machine/power_compressor
name = "circuit board (Power Compressor)"
build_path = /obj/machinery/power/compressor
- origin_tech = "programming=4;powerstorage=5;engineering=4"
+ origin_tech = "programming=4;powerstorage=4;engineering=4"
req_components = list(
/obj/item/stack/cable_coil = 5,
/obj/item/weapon/stock_parts/manipulator = 6)
@@ -195,7 +195,7 @@
/obj/item/weapon/circuitboard/machine/power_turbine
name = "circuit board (Power Turbine)"
build_path = /obj/machinery/power/turbine
- origin_tech = "programming=4;powerstorage=4;engineering=5"
+ origin_tech = "programming=4;powerstorage=4;engineering=4"
req_components = list(
/obj/item/stack/cable_coil = 5,
/obj/item/weapon/stock_parts/capacitor = 6)
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index 848de7f391c..4a3f71d75c2 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -167,10 +167,6 @@ obj/item/ammo_casing/energy/net
projectile_type = /obj/item/projectile/energy/trap
select_name = "snare"
-/obj/item/ammo_casing/energy/trap/cyborg
- projectile_type = /obj/item/projectile/energy/trap/cyborg
- e_cost = 50
-
/obj/item/ammo_casing/energy/instakill
projectile_type = /obj/item/projectile/beam/instakill
e_cost = 0
@@ -186,4 +182,4 @@ obj/item/ammo_casing/energy/net
fire_sound = 'sound/magic/lightningbolt.ogg'
e_cost = 200
select_name = "stun"
- projectile_type = /obj/item/projectile/energy/shock_revolver
\ No newline at end of file
+ projectile_type = /obj/item/projectile/energy/shock_revolver
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index fc098cf7030..58c793b34e4 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -234,6 +234,10 @@
caliber = "9mm"
max_ammo = 21
+/obj/item/ammo_box/magazine/smgm9mm/update_icon()
+ ..()
+ icon_state = "smg9mm-[ammo_count() ? "42" : "0"]"
+
/obj/item/ammo_box/magazine/smgm9mm/ap
name = "SMG magazine (Armour Piercing 9mm)"
ammo_type = /obj/item/ammo_casing/c9mmap
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index de962a64e34..408d51522c3 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -5,7 +5,7 @@
item_state = "laser"
w_class = 3
materials = list(MAT_METAL=2000)
- origin_tech = "combat=3;magnets=2"
+ origin_tech = "combat=4;magnets=2"
ammo_type = list(/obj/item/ammo_casing/energy/lasergun)
ammo_x_offset = 1
shaded_charge = 1
@@ -13,6 +13,7 @@
/obj/item/weapon/gun/energy/laser/practice
name = "practice laser gun"
desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice."
+ origin_tech = "combat=2;magnets=2"
ammo_type = list(/obj/item/ammo_casing/energy/laser/practice)
clumsy_check = 0
needs_permit = 0
@@ -44,6 +45,7 @@
/obj/item/weapon/gun/energy/laser/cyborg
can_charge = 0
desc = "An energy-based laser gun that draws power from the cyborg's internal energy cell directly. So this is what freedom looks like?"
+ origin_tech = null
/obj/item/weapon/gun/energy/laser/cyborg/newshot()
..()
@@ -68,7 +70,7 @@
force = 10
flags = CONDUCT
slot_flags = SLOT_BACK
- origin_tech = "combat=4;materials=3;powerstorage=3"
+ origin_tech = "combat=4;magnets=4;powerstorage=3"
ammo_type = list(/obj/item/ammo_casing/energy/laser/accelerator)
pin = null
ammo_x_offset = 3
@@ -94,7 +96,7 @@
desc = "A high-power laser gun capable of expelling concentrated xray blasts that pass through multiple soft targets and heavier materials"
icon_state = "xray"
item_state = null
- origin_tech = "combat=5;materials=3;magnets=2;syndicate=2"
+ origin_tech = "combat=6;materials=4;magnets=4;syndicate=1"
ammo_type = list(/obj/item/ammo_casing/energy/xray)
pin = null
ammo_x_offset = 3
@@ -106,7 +108,7 @@
icon_state = "bluetag"
desc = "A retro laser gun modified to fire harmless blue beams of light. Sound effects included!"
ammo_type = list(/obj/item/ammo_casing/energy/laser/bluetag)
- origin_tech = "combat=1;magnets=2"
+ origin_tech = "combat=2;magnets=2"
clumsy_check = 0
needs_permit = 0
pin = /obj/item/device/firing_pin/tag/blue
@@ -118,7 +120,7 @@
icon_state = "redtag"
desc = "A retro laser gun modified to fire harmless beams red of light. Sound effects included!"
ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag)
- origin_tech = "combat=1;magnets=2"
+ origin_tech = "combat=2;magnets=2"
clumsy_check = 0
needs_permit = 0
pin = /obj/item/device/firing_pin/tag/red
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index f69cadac134..8661313ec86 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -4,7 +4,7 @@
icon_state = "energy"
item_state = null //so the human update icon uses the icon_state instead.
ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser)
- origin_tech = "combat=3;magnets=2"
+ origin_tech = "combat=4;magnets=3"
modifystate = 2
can_flashlight = 1
ammo_x_offset = 3
@@ -35,6 +35,7 @@
name = "\improper X-01 MultiPhase Energy Gun"
desc = "This is a expensive, modern recreation of a antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time."
icon_state = "hoslaser"
+ origin_tech = "combat=5;magnets=4"
force = 10
ammo_type = list(/obj/item/ammo_casing/energy/electrode/hos, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/disabler)
ammo_x_offset = 4
@@ -43,7 +44,7 @@
name = "\improper DRAGnet"
desc = "The \"Dynamic Rapid-Apprehension of the Guilty\" net is a revolution in law enforcement technology."
icon_state = "dragnet"
- origin_tech = "combat=3;magnets=3;materials=4;bluespace=4"
+ 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
ammo_x_offset = 1
@@ -53,17 +54,6 @@
desc = "Fires an energy snare that slows the target down"
ammo_type = list(/obj/item/ammo_casing/energy/trap)
-/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg
- can_charge = 0
- ammo_type = list(/obj/item/ammo_casing/energy/trap/cyborg)
-
-/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg/newshot()
- ..()
- robocharge()
-
-/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg/emp_act()
- return
-
/obj/item/weapon/gun/energy/gun/turret
name = "hybrid turret gun"
desc = "A heavy hybrid energy cannon with two settings: Stun and kill."
@@ -82,52 +72,10 @@
desc = "An energy gun with an experimental miniaturized nuclear reactor that automatically charges the internal power cell."
icon_state = "nucgun"
item_state = "nucgun"
- origin_tech = "combat=3;materials=5;powerstorage=3"
- var/fail_tick = 0
+ origin_tech = "combat=4;magnets=4;powerstorage=4"
charge_delay = 5
pin = null
can_charge = 0
ammo_x_offset = 1
ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/disabler)
selfcharge = 1
-
-/obj/item/weapon/gun/energy/gun/nuclear/process()
- if(fail_tick > 0)
- fail_tick--
- ..()
-
-/obj/item/weapon/gun/energy/gun/nuclear/shoot_live_shot()
- failcheck()
- update_icon()
- ..()
-
-/obj/item/weapon/gun/energy/gun/nuclear/proc/failcheck()
- if(!prob(reliability) && istype(loc, /mob/living))
- var/mob/living/M = loc
- switch(fail_tick)
- if(0 to 200)
- fail_tick += (2*(100-reliability))
- M.rad_act(40)
- M << "Your [name] feels warmer."
- if(201 to INFINITY)
- SSobj.processing.Remove(src)
- M.rad_act(80)
- crit_fail = 1
- M << "Your [name]'s reactor overloads!"
-
-/obj/item/weapon/gun/energy/gun/nuclear/emp_act(severity)
- ..()
- reliability = max(reliability - round(15/severity), 0) //Do not allow it to go negative!
-
-/obj/item/weapon/gun/energy/gun/nuclear/update_icon()
- ..()
- if(crit_fail)
- overlays += "[icon_state]_fail_3"
- else
- switch(fail_tick)
- if(0)
- overlays += "[icon_state]_fail_0"
- if(1 to 150)
- overlays += "[icon_state]_fail_1"
- if(151 to INFINITY)
- overlays += "[icon_state]_fail_2"
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 76bde0e0903..e607230872a 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -3,7 +3,7 @@
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=2;magnets=4"
+ origin_tech = "combat=4;magnets=4"
can_flashlight = 1
w_class = 5
flags = CONDUCT
@@ -20,7 +20,6 @@
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"
- origin_tech = "combat=4;magnets=4;materials=4"
w_class = 3
slot_flags = SLOT_BELT
pin = null
@@ -32,7 +31,7 @@
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=5;materials=4;powerstorage=3"
+ 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
@@ -49,7 +48,7 @@
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=3;powerstorage=3"
+ origin_tech = "materials=2;biotech=4"
modifystate = 1
ammo_x_offset = 1
selfcharge = 1
@@ -94,11 +93,10 @@
needs_permit = 0
var/overheat_time = 16
unique_rename = 1
+ origin_tech = "combat=3;powerstorage=3;engineering=3"
weapon_weight = WEAPON_LIGHT
- origin_tech = "combat=2;powerstorage=1"
var/holds_charge = FALSE
var/unique_frequency = FALSE // modified by KA modkits
-
var/overheat = FALSE
/obj/item/weapon/gun/energy/kinetic_accelerator/super
@@ -107,7 +105,7 @@
icon_state = "kineticgun_u"
ammo_type = list(/obj/item/ammo_casing/energy/kinetic/super)
overheat_time = 15
- origin_tech = "combat=3;powerstorage=2"
+ origin_tech = "materials=5;powerstorage=3;engineering=4;magnets=3;combat=3"
/obj/item/weapon/gun/energy/kinetic_accelerator/hyper
name = "hyper-kinetic accelerator"
@@ -115,7 +113,7 @@
icon_state = "kineticgun_h"
ammo_type = list(/obj/item/ammo_casing/energy/kinetic/hyper)
overheat_time = 14
- origin_tech = "combat=4;powerstorage=3"
+ origin_tech = "materials=6;powerstorage=4;engineering=4;magnets=4;combat=4"
/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg
holds_charge = TRUE
@@ -192,7 +190,7 @@
item_state = "crossbow"
w_class = 2
materials = list(MAT_METAL=2000)
- origin_tech = "combat=2;magnets=2;syndicate=5"
+ origin_tech = "combat=4;magnets=4;syndicate=5"
suppressed = 1
ammo_type = list(/obj/item/ammo_casing/energy/bolt)
weapon_weight = WEAPON_LIGHT
@@ -207,7 +205,7 @@
icon_state = "crossbowlarge"
w_class = 3
materials = list(MAT_METAL=4000)
- origin_tech = "combat=2;magnets=2;syndicate=3" //can be further researched for more syndie tech
+ origin_tech = "combat=4;magnets=4;syndicate=2"
suppressed = 0
ammo_type = list(/obj/item/ammo_casing/energy/bolt/large)
pin = null
@@ -225,7 +223,7 @@
icon_state = "plasmacutter"
item_state = "plasmacutter"
modifystate = -1
- origin_tech = "combat=1;materials=3;magnets=2;plasmatech=2;engineering=1"
+ origin_tech = "combat=1;materials=3;magnets=2;plasmatech=3;engineering=1"
ammo_type = list(/obj/item/ammo_casing/energy/plasma)
flags = CONDUCT | OPENCONTAINER
attack_verb = list("attacked", "slashed", "cut", "sliced")
@@ -258,7 +256,7 @@
/obj/item/weapon/gun/energy/plasmacutter/adv
name = "advanced plasma cutter"
icon_state = "adv_plasmacutter"
- origin_tech = "combat=3;materials=4;magnets=3;plasmatech=3;engineering=2"
+ origin_tech = "combat=3;materials=4;magnets=3;plasmatech=4;engineering=2"
force = 15
ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv)
@@ -268,6 +266,7 @@
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/blue
var/obj/effect/portal/orange
@@ -330,7 +329,7 @@
name = "temperature gun"
icon_state = "freezegun"
desc = "A gun that changes temperatures."
- origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2"
+ 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/weapon/stock_parts/cell/high"
pin = null
@@ -342,7 +341,7 @@
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 = null
+ origin_tech = "combat=7;magnets=6"
/obj/item/weapon/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."
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index 32e1413a173..be0ba75daaf 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -4,6 +4,7 @@
icon_state = "taser"
item_state = null //so the human update icon uses the icon_state instead.
ammo_type = list(/obj/item/ammo_casing/energy/electrode)
+ origin_tech = "combat=3"
ammo_x_offset = 3
/obj/item/weapon/gun/energy/shock_revolver
@@ -12,6 +13,7 @@
icon_state = "tesla"
item_state = "tesla"
ammo_type = list(/obj/item/ammo_casing/energy/shock_revolver)
+ origin_tech = "combat=4;materials=4;powerstorage=4"
can_flashlight = 0
pin = null
shaded_charge = 1
@@ -21,7 +23,7 @@
desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams."
icon_state = "advtaser"
ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler)
- origin_tech = null
+ origin_tech = "combat=4"
ammo_x_offset = 2
/obj/item/weapon/gun/energy/gun/advtaser/cyborg
@@ -38,7 +40,7 @@
name = "disabler"
desc = "A self-defense weapon that exhausts organic targets, weakening them until they collapse."
icon_state = "disabler"
- item_state = null
+ item_state = "combat=3"
ammo_type = list(/obj/item/ammo_casing/energy/disabler)
ammo_x_offset = 3
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index 38341d80ad2..ded42d49293 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -85,7 +85,7 @@
desc = "A bullpup two-round burst .45 SMG, designated 'C-20r'. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp."
icon_state = "c20r"
item_state = "c20r"
- origin_tech = "combat=5;materials=2;syndicate=8"
+ origin_tech = "combat=5;materials=2;syndicate=6"
mag_type = /obj/item/ammo_box/magazine/smgm45
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
fire_delay = 2
@@ -128,7 +128,7 @@
name = "\improper 'Type U3' Uzi"
desc = "A lightweight, burst-fire submachine gun, for when you really want someone dead. Uses 9mm rounds."
icon_state = "mini-uzi"
- origin_tech = "combat=5;materials=2;syndicate=8"
+ origin_tech = "combat=4;materials=2;syndicate=4"
mag_type = /obj/item/ammo_box/magazine/uzim9mm
burst_size = 2
@@ -137,7 +137,7 @@
desc = "A three-round burst 5.56 toploading carbine, designated 'M-90gl'. Has an attached underbarrel grenade launcher which can be toggled on and off."
icon_state = "m90"
item_state = "m90"
- origin_tech = "combat=5;materials=2;syndicate=8"
+ origin_tech = "combat=5;materials=2;syndicate=6"
mag_type = /obj/item/ammo_box/magazine/m556
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
can_suppress = 0
@@ -213,7 +213,7 @@
item_state = "shotgun"
w_class = 5
slot_flags = 0
- origin_tech = "combat=5;materials=1;syndicate=2"
+ origin_tech = "combat=5;materials=1;syndicate=3"
mag_type = /obj/item/ammo_box/magazine/tommygunm45
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
can_suppress = 0
@@ -226,7 +226,7 @@
icon_state = "arg"
item_state = "arg"
slot_flags = 0
- origin_tech = "combat=5;materials=1"
+ origin_tech = "combat=6;engineering=4"
mag_type = /obj/item/ammo_box/magazine/m556
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
can_suppress = 0
@@ -243,7 +243,7 @@
icon_state = "bulldog"
item_state = "bulldog"
w_class = 3
- origin_tech = "combat=5;materials=4;syndicate=6"
+ origin_tech = "combat=6;materials=4;syndicate=6"
mag_type = /obj/item/ammo_box/magazine/m12g
fire_sound = 'sound/weapons/Gunshot.ogg'
can_suppress = 0
@@ -274,4 +274,4 @@
/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/afterattack()
..()
empty_alarm()
- return
\ No newline at end of file
+ return
diff --git a/code/modules/projectiles/guns/projectile/launchers.dm b/code/modules/projectiles/guns/projectile/launchers.dm
index 368c78e26cb..42ed81805ed 100644
--- a/code/modules/projectiles/guns/projectile/launchers.dm
+++ b/code/modules/projectiles/guns/projectile/launchers.dm
@@ -35,7 +35,7 @@
desc = "A prototype pistol designed to fire self propelled rockets."
icon_state = "gyropistol"
fire_sound = 'sound/weapons/grenadelaunch.ogg'
- origin_tech = "combat=3"
+ origin_tech = "combat=5"
mag_type = /obj/item/ammo_box/magazine/m75
burst_size = 1
fire_delay = 0
@@ -54,6 +54,7 @@
icon_state = "speargun"
item_state = "speargun"
w_class = 4
+ origin_tech = "combat=4;engineering=4"
force = 10
can_suppress = 0
mag_type = /obj/item/ammo_box/magazine/internal/speargun
diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm
index 5c45df2cb17..ab0aa609ef0 100644
--- a/code/modules/projectiles/guns/projectile/pistol.dm
+++ b/code/modules/projectiles/guns/projectile/pistol.dm
@@ -3,7 +3,7 @@
desc = "A small, easily concealable 10mm handgun. Has a threaded barrel for suppressors."
icon_state = "pistol"
w_class = 2
- origin_tech = "combat=2;materials=2;syndicate=2"
+ origin_tech = "combat=3;materials=2;syndicate=4"
mag_type = /obj/item/ammo_box/magazine/m10mm
can_suppress = 1
burst_size = 1
@@ -55,4 +55,4 @@
can_suppress = 0
burst_size = 3
fire_delay = 2
- actions_types = list(/datum/action/item_action/toggle_firemode)
\ No newline at end of file
+ actions_types = list(/datum/action/item_action/toggle_firemode)
diff --git a/code/modules/projectiles/guns/projectile/rechargable_magazine.dm b/code/modules/projectiles/guns/projectile/rechargable_magazine.dm
index 3f3e50a8f1a..63f747ba104 100644
--- a/code/modules/projectiles/guns/projectile/rechargable_magazine.dm
+++ b/code/modules/projectiles/guns/projectile/rechargable_magazine.dm
@@ -155,7 +155,7 @@
icon = 'icons/obj/guns/minigun.dmi'
icon_state = "minigun_spin"
item_state = "minigun"
- origin_tech = null
+ origin_tech = "combat=6;powerstorage=5;magnets=4"
flags = CONDUCT | HANDSLOW
slowdown = 1
slot_flags = null
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index 03580c9478e..a238c60623a 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -3,6 +3,7 @@
desc = "A suspicious revolver. Uses .357 ammo." //usually used by syndicates
icon_state = "revolver"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder
+ origin_tech = "combat=3;materials=2"
/obj/item/weapon/gun/projectile/revolver/New()
..()
@@ -92,7 +93,6 @@
name = "\improper .38 Mars Special"
desc = "A cheap Martian knock-off of a classic law enforcement firearm. Uses .38-special rounds."
icon_state = "detective"
- origin_tech = "combat=2;materials=2"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38
unique_rename = 1
unique_reskin = 1
@@ -151,7 +151,6 @@
name = "\improper Unica 6 auto-revolver"
desc = "A retro high-powered autorevolver typically used by officers of the New Russia military. Uses .357 ammo."
icon_state = "mateba"
- origin_tech = "combat=2;materials=2"
/obj/item/weapon/gun/projectile/revolver/golden
name = "\improper Golden revolver"
@@ -290,7 +289,6 @@
force = 10
flags = CONDUCT
slot_flags = SLOT_BACK
- origin_tech = "combat=3;materials=1"
mag_type = /obj/item/ammo_box/magazine/internal/shot/dual
sawn_desc = "Omar's coming!"
unique_rename = 1
@@ -344,7 +342,6 @@
w_class = 4
force = 10
slot_flags = null
- origin_tech = "combat=2;materials=2"
mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised
sawn_desc = "I'm just here for the gasoline."
unique_rename = 0
@@ -373,4 +370,4 @@
if(. && slung) //sawing off the gun removes the sling
new /obj/item/stack/cable_coil(get_turf(src), 10)
slung = 0
- update_icon()
\ No newline at end of file
+ update_icon()
diff --git a/code/modules/projectiles/guns/projectile/saw.dm b/code/modules/projectiles/guns/projectile/saw.dm
index ebc79dfd8ad..238257c4451 100644
--- a/code/modules/projectiles/guns/projectile/saw.dm
+++ b/code/modules/projectiles/guns/projectile/saw.dm
@@ -5,7 +5,7 @@
item_state = "l6closedmag"
w_class = 5
slot_flags = 0
- origin_tech = "combat=5;materials=1;syndicate=2"
+ origin_tech = "combat=6;engineering=3;syndicate=6"
mag_type = /obj/item/ammo_box/magazine/mm556x45
weapon_weight = WEAPON_MEDIUM
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
@@ -169,5 +169,3 @@ obj/item/projectile/bullet/saw/incen/Move()
/obj/item/ammo_casing/mm556x45/incen
desc = "A 556x45mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames. "
projectile_type = /obj/item/projectile/bullet/saw/incen
-
-
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index 1b9869e6273..cd3834253ef 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -155,7 +155,6 @@
src.throw_at_fast(pick(oview(7,get_turf(user))),1,1)
user.visible_message("[user] tosses aside the spent rifle!")
-
// Automatic Shotguns//
/obj/item/weapon/gun/projectile/shotgun/automatic/shoot_live_shot(mob/living/user as mob|obj)
@@ -166,7 +165,7 @@
name = "combat shotgun"
desc = "A semi automatic shotgun with tactical furniture and a six-shell capacity underneath."
icon_state = "cshotgun"
- origin_tech = "combat=5;materials=2"
+ origin_tech = "combat=6"
mag_type = /obj/item/ammo_box/magazine/internal/shot/com
w_class = 5
@@ -204,11 +203,10 @@
else
user << "You switch to tube A."
-
/obj/item/weapon/gun/projectile/shotgun/automatic/dual_tube/AltClick(mob/living/user)
if(user.incapacitated() || !Adjacent(user) || !istype(user))
return
pump()
-// DOUBLE BARRELED SHOTGUN and IMPROVISED SHOTGUN are in revolver.dm
\ No newline at end of file
+// DOUBLE BARRELED SHOTGUN and IMPROVISED SHOTGUN are in revolver.dm
diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm
index 3cb65acd8ed..4a6de67615d 100644
--- a/code/modules/projectiles/guns/projectile/sniper.dm
+++ b/code/modules/projectiles/guns/projectile/sniper.dm
@@ -8,7 +8,7 @@
weapon_weight = WEAPON_MEDIUM
mag_type = /obj/item/ammo_box/magazine/sniper_rounds
fire_delay = 40
- origin_tech = "combat=8"
+ origin_tech = "combat=7"
can_unsuppress = 1
can_suppress = 1
w_class = 3
@@ -28,7 +28,7 @@
name = "syndicate sniper rifle"
desc = "Syndicate flavoured sniper rifle, it packs quite a punch, a punch to your face"
pin = /obj/item/device/firing_pin/implant/pindicate
- origin_tech = "combat=8;syndicate=4"
+ origin_tech = "combat=7;syndicate=6"
@@ -108,7 +108,6 @@
name = "sniper rounds (Bleed)"
desc = "Haemorrhage sniper rounds, leaves your target in a pool of crimson pain"
icon_state = "haemorrhage"
- origin_tech = "combat=7;syndicate=5"
ammo_type = /obj/item/ammo_casing/haemorrhage
max_ammo = 5
caliber = ".50"
@@ -139,6 +138,7 @@
name = "sniper rounds (penetrator)"
desc = "An extremely powerful round capable of passing straight through cover and anyone unfortunate enough to be behind it."
ammo_type = /obj/item/ammo_casing/penetrator
+ origin_tech = "combat=6;syndicate=3"
max_ammo = 5
/obj/item/ammo_casing/penetrator
diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm
index 023c7c2fd02..04b438f82f8 100644
--- a/code/modules/projectiles/guns/syringe_gun.dm
+++ b/code/modules/projectiles/guns/syringe_gun.dm
@@ -8,6 +8,7 @@
throw_range = 7
force = 4
materials = list(MAT_METAL=2000)
+ origin_tech = "combat=3;biotech=3"
clumsy_check = 0
fire_sound = 'sound/items/syringeproj.ogg'
var/list/syringes = list()
@@ -86,7 +87,7 @@
icon_state = "syringe_pistol"
item_state = "gun" //Smaller inhand
w_class = 2
- origin_tech = "combat=2;syndicate=2"
+ origin_tech = "combat=2;syndicate=2;biotech=3"
force = 2 //Also very weak because it's smaller
suppressed = 1 //Softer fire sound
can_unsuppress = 0 //Permanently silenced
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index 9b8e75bb6ef..649502e0597 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -4,6 +4,7 @@
icon = 'icons/obj/device.dmi'
icon_state = "firing_pin"
item_state = "pen"
+ origin_tech = "materials=2;combat=4"
flags = CONDUCT
w_class = 1
attack_verb = list("poked")
@@ -78,6 +79,7 @@
desc = "This safety firing pin allows weapons to be fired within proximity to a firing range."
fail_message = "TEST RANGE CHECK FAILED."
pin_removeable = 1
+ origin_tech = "combat=2;materials=2"
/obj/item/device/firing_pin/test_range/pin_auth(mob/living/user)
for(var/obj/machinery/magnetic_controller/M in range(user, 3))
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index b0e825110af..0b7de405d28 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -54,9 +54,9 @@
/obj/item/projectile/magic/resurrection/on_hit(mob/living/carbon/target)
. = ..()
- if(target.hellbound)
- return
- if(ismob(target))
+ if(isliving(target))
+ if(target.hellbound)
+ return
if(iscarbon(target))
var/mob/living/carbon/C = target
C.regenerate_limbs()
diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm
index 5a097bdc746..33daa476e62 100644
--- a/code/modules/reagents/chemistry/machinery/chem_heater.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm
@@ -19,7 +19,7 @@
/obj/item/weapon/circuitboard/machine/chem_heater
name = "circuit board (Chemical Heater)"
build_path = /obj/machinery/chem_heater
- origin_tech = "materials=2;engineering=2"
+ origin_tech = "programming=2;engineering=2;biotech=2"
req_components = list(
/obj/item/weapon/stock_parts/micro_laser = 1,
/obj/item/weapon/stock_parts/console_screen = 1)
@@ -126,4 +126,4 @@
beaker.loc = get_turf(src)
beaker.reagents.handle_reactions()
beaker = null
- icon_state = "mixer0b"
\ No newline at end of file
+ icon_state = "mixer0b"
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index 62dd95ad8fb..d4b03fe86dd 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -24,7 +24,7 @@
/obj/item/weapon/circuitboard/machine/chem_master
name = "circuit board (ChemMaster 3000)"
build_path = /obj/machinery/chem_master
- origin_tech = "materials=2;programming=2;biotech=1"
+ origin_tech = "materials=3;programming=2;biotech=3"
req_components = list(
/obj/item/weapon/reagent_containers/glass/beaker = 2,
/obj/item/weapon/stock_parts/manipulator = 1,
@@ -321,4 +321,4 @@
/obj/item/weapon/circuitboard/machine/chem_master/condi
name = "circuit board (CondiMaster 3000)"
- build_path = /obj/machinery/chem_master/condimaster
\ No newline at end of file
+ build_path = /obj/machinery/chem_master/condimaster
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 0a25b46d7d0..2ce699a197e 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -177,9 +177,10 @@
desc = "A cryostasis beaker that allows for chemical storage without \
reactions. Can hold up to 50 units."
icon_state = "beakernoreact"
- materials = list(MAT_GLASS=500)
+ materials = list(MAT_METAL=3000)
volume = 50
amount_per_transfer_from_this = 10
+ origin_tech = "materials=2;engineering=3;plasmatech=3"
flags = OPENCONTAINER
/obj/item/weapon/reagent_containers/glass/beaker/noreact/New()
@@ -192,11 +193,12 @@
and Element Cuban combined with the Compound Pete. Can hold up to \
300 units."
icon_state = "beakerbluespace"
- materials = list(MAT_GLASS=5000)
+ materials = list(MAT_GLASS=3000)
volume = 300
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,20,25,30,50,100,300)
flags = OPENCONTAINER
+ origin_tech = "bluespace=5;materials=4;plasmatech=4"
/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone
list_reagents = list("cryoxadone" = 30)
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 68bc332d528..d332034b137 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -261,11 +261,13 @@
desc = "An advanced syringe that can hold 60 units of chemicals"
amount_per_transfer_from_this = 20
volume = 60
+ origin_tech = "bluespace=4;materials=4;biotech=4"
/obj/item/weapon/reagent_containers/syringe/noreact
name = "cryo syringe"
desc = "An advanced syringe that stops reagents inside from reacting. It can hold up to 20 units."
volume = 20
+ origin_tech = "materials=3;engineering=3"
/obj/item/weapon/reagent_containers/syringe/noreact/New()
. = ..()
@@ -276,3 +278,4 @@
desc = "A diamond-tipped syringe that pierces armor when launched at high velocity. It can hold up to 10 units."
volume = 10
projectile_type = /obj/item/projectile/bullet/dart/syringe/piercing
+ origin_tech = "combat=3;materials=4;engineering=5"
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 8745fce43a2..c2ba6ef9cbb 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -126,16 +126,17 @@
/obj/structure/reagent_dispensers/water_cooler
- name = "water cooler"
- desc = "A machine that dispenses water to drink."
+ name = "liquid cooler"
+ desc = "A machine that dispenses liquid to drink."
icon = 'icons/obj/vending.dmi'
icon_state = "water_cooler"
anchored = 1
var/cups = 50
+ var/reagent = "water"
/obj/structure/reagent_dispensers/water_cooler/New()
..()
- reagents.add_reagent("water",500)
+ reagents.add_reagent(reagent,500)
/obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/living/carbon/human/user)
if((!istype(user)) || (user.stat))
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index 7183b72080f..0da4c5e927e 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -66,11 +66,11 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
/obj/machinery/r_n_d/circuit_imprinter/proc/check_mat(datum/design/being_built, M)
switch(M)
if(MAT_GLASS)
- return (g_amount - (being_built.materials[M]) >= 0)
+ return (g_amount - (being_built.materials[M]/efficiency_coeff) >= 0)
if(MAT_GOLD)
- return (gold_amount - (being_built.materials[M]) >= 0)
+ return (gold_amount - (being_built.materials[M]/efficiency_coeff) >= 0)
if(MAT_DIAMOND)
- return (diamond_amount - (being_built.materials[M]) >= 0)
+ return (diamond_amount - (being_built.materials[M]/efficiency_coeff) >= 0)
else
return (reagents.has_reagent(M, (being_built.materials[M]/efficiency_coeff)) != 0)
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 60869979e71..1204ac11d3a 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -1,6 +1,6 @@
/***************************************************************
** Design Datums **
-** All the data for building stuff and tracking reliability. **
+** All the data for building stuff. **
***************************************************************/
/*
For the materials datum, it assumes you need reagents unless specified otherwise. To designate a material that isn't a reagent,
@@ -20,9 +20,6 @@ The currently supporting non-reagent materials. All material amounts are set as
Don't add new keyword/IDs if they are made from an existing one (such as rods which are made from metal). Only add raw materials.
Design Guidlines
-- The reliability formula for all R&D built items is reliability (a fixed number) + total tech levels required to make it +
-reliability_mod (starts at 0, gets improved through experimentation). Example: PACMAN generator. 79 base reliablity + 6 tech
-(3 plasmatech, 3 powerstorage) + 0 (since it's completely new) = 85% reliability. Reliability is the chance it works CORRECTLY.
- When adding new designs, check rdreadme.dm to see what kind of things have already been made and where new stuff is needed.
- A single sheet of anything is 2000 units of material. Materials besides metal/glass require help from other jobs (mining for
other types of metals and chemistry for reagents).
@@ -33,8 +30,7 @@ other types of metals and chemistry for reagents).
var/name = "Name" //Name of the created object.
var/desc = "Desc" //Description of the created object.
var/id = "id" //ID of the created object for easy refernece. Alphanumeric, lower-case, no symbols
- var/list/req_tech = list() //IDs of that techs the object originated from and the minimum level requirements. //Reliability modifier of the device at it's starting point.
- var/reliability = 100 //Reliability of the device.
+ var/list/req_tech = list() //IDs of that techs the object originated from and the minimum level requirements.
var/build_type = null //Flag as to what kind machine the design is built in. See defines.
var/list/materials = list() //List of materials. Format: "id" = amount.
var/construction_time //Amount of time required for building the object
@@ -44,18 +40,6 @@ other types of metals and chemistry for reagents).
var/maxstack = 1
-//A proc to calculate the reliability of a design based on tech levels and innate modifiers.
-//Input: A list of /datum/tech; Output: The new reliabilty.
-/datum/design/proc/CalcReliability(list/temp_techs)
- var/new_reliability
- for(var/datum/tech/T in temp_techs)
- if(T.id in req_tech)
- new_reliability += T.level
- new_reliability = Clamp(new_reliability, reliability, 100)
- reliability = new_reliability
- return
-
-
////////////////////////////////////////
//Disks for transporting design datums//
////////////////////////////////////////
@@ -64,7 +48,7 @@ other types of metals and chemistry for reagents).
name = "Component Design Disk"
desc = "A disk for storing device design data for construction in lathes."
icon_state = "datadisk1"
- materials = list(MAT_METAL=30, MAT_GLASS=10)
+ materials = list(MAT_METAL=100, MAT_GLASS=100)
var/datum/design/blueprint
/obj/item/weapon/disk/design_disk/New()
@@ -79,7 +63,7 @@ other types of metals and chemistry for reagents).
name = "Intellicard AI Transportation System"
desc = "Allows for the construction of an intellicard."
id = "intellicard"
- req_tech = list("programming" = 4, "materials" = 4)
+ req_tech = list("programming" = 3, "materials" = 3)
build_type = PROTOLATHE
materials = list(MAT_GLASS = 1000, MAT_GOLD = 200)
build_path = /obj/item/device/aicard
@@ -105,7 +89,7 @@ other types of metals and chemistry for reagents).
id = "design_disk"
req_tech = list("programming" = 1)
build_type = PROTOLATHE | AUTOLATHE
- materials = list(MAT_METAL = 30, MAT_GLASS = 10)
+ materials = list(MAT_METAL = 300, MAT_GLASS = 100)
build_path = /obj/item/weapon/disk/design_disk
category = list("Electronics")
@@ -115,7 +99,7 @@ other types of metals and chemistry for reagents).
id = "tech_disk"
req_tech = list("programming" = 1)
build_type = PROTOLATHE | AUTOLATHE
- materials = list(MAT_METAL = 30, MAT_GLASS = 10)
+ materials = list(MAT_METAL = 300, MAT_GLASS = 100)
build_path = /obj/item/weapon/disk/tech_disk
category = list("Electronics")
@@ -128,7 +112,7 @@ other types of metals and chemistry for reagents).
name = "Mining Drill"
desc = "Yours is the drill that will pierce through the rock walls."
id = "drill"
- req_tech = list("materials" = 2, "powerstorage" = 3, "engineering" = 2)
+ req_tech = list("materials" = 2, "powerstorage" = 2, "engineering" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 6000, MAT_GLASS = 1000) //expensive, but no need for miners.
build_path = /obj/item/weapon/pickaxe/drill
@@ -138,10 +122,9 @@ other types of metals and chemistry for reagents).
name = "Diamond-Tipped Mining Drill"
desc = "Yours is the drill that will pierce the heavens!"
id = "drill_diamond"
- req_tech = list("materials" = 6, "powerstorage" = 4, "engineering" = 4)
+ req_tech = list("materials" = 6, "powerstorage" = 5, "engineering" = 5)
build_type = PROTOLATHE
materials = list(MAT_METAL = 6000, MAT_GLASS = 1000, MAT_DIAMOND = 2000) //Yes, a whole diamond is needed.
- reliability = 79
build_path = /obj/item/weapon/pickaxe/drill/diamonddrill
category = list("Mining Designs")
@@ -149,10 +132,9 @@ other types of metals and chemistry for reagents).
name = "Plasma Cutter"
desc = "You could use it to cut limbs off of xenos! Or, you know, mine stuff."
id = "plasmacutter"
- req_tech = list("materials" = 2, "plasmatech" = 2, "engineering" = 2, "combat" = 1, "magnets" = 2)
+ req_tech = list("materials" = 3, "plasmatech" = 3, "magnets" = 2)
build_type = PROTOLATHE
materials = list(MAT_METAL = 1500, MAT_GLASS = 500, MAT_PLASMA = 400)
- reliability = 79
build_path = /obj/item/weapon/gun/energy/plasmacutter
category = list("Mining Designs")
@@ -160,10 +142,9 @@ other types of metals and chemistry for reagents).
name = "Advanced Plasma Cutter"
desc = "It's an advanced plasma cutter, oh my god."
id = "plasmacutter_adv"
- req_tech = list("materials" = 4, "plasmatech" = 3, "engineering" = 3, "combat" = 3, "magnets" = 3)
+ req_tech = list("materials" = 4, "plasmatech" = 4, "engineering" = 2, "combat" = 3, "magnets" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000, MAT_GLASS = 1000, MAT_PLASMA = 2000, MAT_GOLD = 500)
- reliability = 79
build_path = /obj/item/weapon/gun/energy/plasmacutter/adv
category = list("Mining Designs")
@@ -171,7 +152,7 @@ other types of metals and chemistry for reagents).
name = "Sonic Jackhammer"
desc = "Essentially a handheld planet-cracker. Can drill through walls with ease as well."
id = "jackhammer"
- req_tech = list("materials" = 6, "powerstorage" = 6, "engineering" = 5, "magnets" = 6)
+ req_tech = list("materials" = 7, "powerstorage" = 5, "engineering" = 6, "magnets" = 5)
build_type = PROTOLATHE
materials = list(MAT_METAL = 6000, MAT_GLASS = 2000, MAT_SILVER = 2000, MAT_DIAMOND = 6000)
build_path = /obj/item/weapon/pickaxe/drill/jackhammer
@@ -201,7 +182,7 @@ other types of metals and chemistry for reagents).
name = "Hyper-Kinetic Accelerator"
desc = "An upgraded version of the proto-kinetic accelerator, with even more superior damage, speed and range."
id = "hyperaccelerator"
- req_tech = list("materials" = 6, "powerstorage" = 6, "engineering" = 5, "magnets" = 6, "combat" = 4)
+ req_tech = list("materials" = 7, "powerstorage" = 5, "engineering" = 5, "magnets" = 5, "combat" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000)
build_path = /obj/item/weapon/gun/energy/kinetic_accelerator/hyper
@@ -213,7 +194,7 @@ other types of metals and chemistry for reagents).
id = "superresonator"
req_tech = list("materials" = 4, "powerstorage" = 3, "engineering" = 3, "magnets" = 3)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 4000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_URANIUM = 2000)
+ materials = list(MAT_METAL = 4000, MAT_GLASS = 1500, MAT_SILVER = 1000, MAT_URANIUM = 1000)
build_path = /obj/item/weapon/resonator/upgraded
category = list("Mining Designs")
@@ -227,7 +208,7 @@ other types of metals and chemistry for reagents).
id = "beacon"
req_tech = list("bluespace" = 1)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 20, MAT_GLASS = 10)
+ materials = list(MAT_METAL = 150, MAT_GLASS = 100)
build_path = /obj/item/device/radio/beacon
category = list("Bluespace Designs")
@@ -235,10 +216,9 @@ other types of metals and chemistry for reagents).
name = "Bag of Holding"
desc = "A backpack that opens into a localized pocket of Blue Space."
id = "bag_holding"
- req_tech = list("bluespace" = 4, "materials" = 6)
+ req_tech = list("bluespace" = 7, "materials" = 5, "engineering" = 6, "plasmatech" = 5)
build_type = PROTOLATHE
materials = list(MAT_GOLD = 3000, MAT_DIAMOND = 1500, MAT_URANIUM = 250)
- reliability = 80
build_path = /obj/item/weapon/storage/backpack/holding
category = list("Bluespace Designs")
@@ -246,10 +226,9 @@ other types of metals and chemistry for reagents).
name = "Artificial Bluespace Crystal"
desc = "A small blue crystal with mystical properties."
id = "bluespace_crystal"
- req_tech = list("bluespace" = 4, "materials" = 6)
+ req_tech = list("bluespace" = 3, "materials" = 6, "plasmatech" = 4)
build_type = PROTOLATHE
materials = list(MAT_DIAMOND = 1500, MAT_PLASMA = 1500)
- reliability = 100
build_path = /obj/item/weapon/ore/bluespace_crystal/artificial
category = list("Bluespace Designs")
@@ -267,10 +246,9 @@ other types of metals and chemistry for reagents).
name = "Mining Satchel of Holding"
desc = "A mining satchel that can hold an infinite amount of ores."
id = "minerbag_holding"
- req_tech = list("bluespace" = 3, "materials" = 4)
+ req_tech = list("bluespace" = 4, "materials" = 3, "engineering" = 4)
build_type = PROTOLATHE
materials = list(MAT_GOLD = 250, MAT_URANIUM = 500) //quite cheap, for more convenience
- reliability = 100
build_path = /obj/item/weapon/storage/bag/ore/holding
category = list("Bluespace Designs")
@@ -285,7 +263,7 @@ other types of metals and chemistry for reagents).
id = "health_hud"
req_tech = list("biotech" = 2, "magnets" = 3)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 50)
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500)
build_path = /obj/item/clothing/glasses/hud/health
category = list("Equipment")
@@ -293,9 +271,9 @@ other types of metals and chemistry for reagents).
name = "Night Vision Health Scanner HUD"
desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness."
id = "health_hud_night"
- req_tech = list("biotech" = 4, "magnets" = 5)
+ req_tech = list("biotech" = 4, "magnets" = 5, "plasmatech" = 4, "engineering" = 6)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_URANIUM = 1000, MAT_SILVER = 250)
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_URANIUM = 1000, MAT_SILVER = 350)
build_path = /obj/item/clothing/glasses/hud/health/night
category = list("Equipment")
@@ -305,7 +283,7 @@ other types of metals and chemistry for reagents).
id = "security_hud"
req_tech = list("magnets" = 3, "combat" = 2)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 50)
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500)
build_path = /obj/item/clothing/glasses/hud/security
category = list("Equipment")
@@ -313,9 +291,9 @@ other types of metals and chemistry for reagents).
name = "Night Vision Security HUD"
desc = "A heads-up display which provides id data and vision in complete darkness."
id = "security_hud_night"
- req_tech = list("magnets" = 5, "combat" = 4)
+ req_tech = list("combat" = 4, "magnets" = 5, "plasmatech" = 4, "engineering" = 6)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_URANIUM = 1000, MAT_GOLD = 350)
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_URANIUM = 1000, MAT_GOLD = 350)
build_path = /obj/item/clothing/glasses/hud/security/night
category = list("Equipment")
@@ -323,9 +301,9 @@ datum/design/diagnostic_hud
name = "Diagnostic HUD"
desc = "A HUD used to analyze and determine faults within robotic machinery."
id = "dianostic_hud"
- req_tech = list("magnets" = 3, "engineering" = 3, "powerstorage" = 2)
+ req_tech = list("magnets" = 3, "engineering" = 2)
build_type = PROTOLATHE
- materials = list("$metal" = 50, "$glass" = 50)
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500)
build_path = /obj/item/clothing/glasses/hud/diagnostic
category = list("Equipment")
@@ -333,9 +311,9 @@ datum/design/diagnostic_hud_night
name = "Night Vision Diagnostic HUD"
desc = "Upgraded version of the diagnostic HUD designed to function during a power failure."
id = "dianostic_hud_night"
- req_tech = list("magnets" = 5, "engineering" = 4, "powerstorage" = 4)
+ req_tech = list("magnets" = 5, "plasmatech" = 4, "engineering" = 6, "powerstorage" = 4)
build_type = PROTOLATHE
- materials = list("$metal" = 200, "$glass" = 200, "$uranium" = 1000, "$plasma" = 300)
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_URANIUM = 1000, MAT_PLASMA = 300)
build_path = /obj/item/clothing/glasses/hud/diagnostic/night
category = list("Equipment")
@@ -361,9 +339,9 @@ datum/design/diagnostic_hud_night
name = "Welding Gas Mask"
desc = "A gas mask with built in welding goggles and face shield. Looks like a skull, clearly designed by a nerd."
id = "weldingmask"
- req_tech = list("materials" = 2, "engineering" = 2)
+ req_tech = list("materials" = 2, "engineering" = 3)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 4000, MAT_GLASS = 1000)
+ materials = list(MAT_METAL = 3000, MAT_GLASS = 1000)
build_path = /obj/item/clothing/mask/gas/welding
category = list("Equipment")
@@ -371,8 +349,8 @@ datum/design/diagnostic_hud_night
name = "Portable Seed Extractor"
desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant."
build_type = PROTOLATHE
- req_tech = list("biotech" = 2, "materials" = 2)
- materials = list(MAT_METAL = 200, MAT_GLASS = 100)
+ req_tech = list("biotech" = 3, "engineering" = 2)
+ materials = list(MAT_METAL = 1000, MAT_GLASS = 400)
build_path = /obj/item/weapon/storage/bag/plants/portaseeder
category = list("Equipment")
@@ -380,7 +358,7 @@ datum/design/diagnostic_hud_night
name = "Air Horn"
desc = "Damn son, where'd you find this?"
id = "air_horn"
- req_tech = list("materials" = 2, "engineering" = 2)
+ req_tech = list("materials" = 4, "engineering" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 4000, MAT_BANANIUM = 1000)
build_path = /obj/item/weapon/bikehorn/airhorn
@@ -390,9 +368,9 @@ datum/design/diagnostic_hud_night
name = "Optical Meson Scanners"
desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
id = "mesons"
- req_tech = list("materials" = 3, "magnets" = 2, "engineering" = 2)
+ req_tech = list("magnets" = 2, "engineering" = 2, "plasmatech" = 2)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 200, MAT_GLASS = 300)
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500)
build_path = /obj/item/clothing/glasses/meson
category = list("Equipment")
@@ -400,9 +378,9 @@ datum/design/diagnostic_hud_night
name = "Engineering Scanner Goggles"
desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, regardless of lighting condition. The T-ray Scanner mode lets you see underfloor objects such as cables and pipes."
id = "engine_goggles"
- req_tech = list("materials" = 4, "magnets" = 3, "engineering" = 4)
+ req_tech = list("materials" = 4, "magnets" = 3, "engineering" = 4, "plasmatech" = 3)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 200, MAT_GLASS = 300, MAT_PLASMA = 100)
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_PLASMA = 100)
build_path = /obj/item/clothing/glasses/meson/engine
category = list("Equipment")
@@ -412,7 +390,7 @@ datum/design/diagnostic_hud_night
id = "tray_goggles"
req_tech = list("materials" = 3, "magnets" = 2, "engineering" = 2)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 200, MAT_GLASS = 300)
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500)
build_path = /obj/item/clothing/glasses/meson/engine/tray
category = list("Equipment")
@@ -420,9 +398,9 @@ datum/design/diagnostic_hud_night
name = "Night Vision Optical Meson Scanners"
desc = "Prototype meson scanners fitted with an extra sensor which amplifies the visible light spectrum and overlays it to the UHD display."
id = "nvgmesons"
- req_tech = list("materials" = 5, "magnets" = 5, "engineering" = 4)
+ req_tech = list("magnets" = 5, "plasmatech" = 5, "engineering" = 6)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 300, MAT_GLASS = 400, MAT_PLASMA = 250, MAT_URANIUM = 1000)
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_PLASMA = 350, MAT_URANIUM = 1000)
build_path = /obj/item/clothing/glasses/meson/night
category = list("Equipment")
@@ -430,9 +408,9 @@ datum/design/diagnostic_hud_night
name = "Night Vision Goggles"
desc = "Goggles that let you see through darkness unhindered."
id = "night_visision_goggles"
- req_tech = list("magnets" = 4)
+ req_tech = list("materials" = 4, "magnets" = 5, "plasmatech" = 5, "engineering" = 5)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 100, MAT_GLASS = 100, MAT_URANIUM = 1000)
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_PLASMA = 350, MAT_URANIUM = 1000)
build_path = /obj/item/clothing/glasses/night
category = list("Equipment")
@@ -450,19 +428,19 @@ datum/design/diagnostic_hud_night
name = "Science Goggles"
desc = "Goggles fitted with a portable analyzer capable of determining the research worth of an item or components of a machine."
id = "scigoggles"
- req_tech = list("materials" = 3, "magnets" = 3, "engineering" = 2)
+ req_tech = list("magnets" = 2)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 250, MAT_GLASS = 300)
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500)
build_path = /obj/item/clothing/glasses/science
category = list("Equipment")
/datum/design/diskplantgene
- name = "plant data disk"
+ name = "Plant data disk"
desc = "A disk for storing plant genetic data."
id = "diskplantgene"
req_tech = list("programming" = 4, "biotech" = 3)
build_type = PROTOLATHE
- materials = list(MAT_METAL=30, MAT_GLASS=10)
+ materials = list(MAT_METAL=200, MAT_GLASS=100)
build_path = /obj/item/weapon/disk/plantgene
category = list("Electronics")
@@ -484,7 +462,7 @@ datum/design/diagnostic_hud_night
name = "Trashbag of Holding"
desc = "An advanced trashabg with bluespace properties; capable of holding a plethora of garbage."
id = "blutrash"
- req_tech = list("materials" = 5, "bluespace" = 3)
+ req_tech = list("materials" = 5, "bluespace" = 4, "engineering" = 4, "plasmatech" = 3)
build_type = PROTOLATHE
materials = list(MAT_GOLD = 1500, MAT_URANIUM = 250, MAT_PLASMA = 1500)
build_path = /obj/item/weapon/storage/bag/trash/bluespace
@@ -494,7 +472,7 @@ datum/design/diagnostic_hud_night
name = "Floor Buffer Upgrade"
desc = "A floor buffer that can be attached to vehicular janicarts."
id = "buffer"
- req_tech = list("materials" = 5, "engineering" = 3)
+ req_tech = list("materials" = 4, "engineering" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000, MAT_GLASS = 200)
build_path = /obj/item/janiupgrade
@@ -504,7 +482,7 @@ datum/design/diagnostic_hud_night
name = "Holographic Sign Projector"
desc = "A holograpic projector used to project various warning signs."
id = "holosign"
- req_tech = list("magnets" = 3, "powerstorage" = 2)
+ req_tech = list("magnets" = 3, "programming" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_GLASS = 1000)
build_path = /obj/item/weapon/holosign_creator
@@ -518,7 +496,7 @@ datum/design/diagnostic_hud_night
name = "Experimental Welding Tool"
desc = "An experimental welder capable of self-fuel generation."
id = "exwelder"
- req_tech = list("materials" = 4, "engineering" = 4, "bluespace" = 3, "plasmatech" = 3)
+ req_tech = list("materials" = 4, "engineering" = 5, "bluespace" = 3, "plasmatech" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_PLASMA = 1500, MAT_URANIUM = 200)
build_path = /obj/item/weapon/weldingtool/experimental
diff --git a/code/modules/research/designs/AI_module_designs.dm b/code/modules/research/designs/AI_module_designs.dm
index c25d7ffbe13..569a36607ef 100644
--- a/code/modules/research/designs/AI_module_designs.dm
+++ b/code/modules/research/designs/AI_module_designs.dm
@@ -6,7 +6,7 @@
name = "AI Design (AI Core)"
desc = "Allows for the construction of circuit boards used to build new AI cores."
id = "aicore"
- req_tech = list("programming" = 4, "biotech" = 3)
+ req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/aicore
@@ -17,7 +17,7 @@
name = "Module Design (Safeguard)"
desc = "Allows for the construction of a Safeguard AI Module."
id = "safeguard_module"
- req_tech = list("programming" = 3, "materials" = 4)
+ req_tech = list("programming" = 3, "materials" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100)
build_path = /obj/item/weapon/aiModule/supplied/safeguard
@@ -27,7 +27,7 @@
name = "Module Design (OneHuman)"
desc = "Allows for the construction of a OneHuman AI Module."
id = "onehuman_module"
- req_tech = list("programming" = 4, "materials" = 6)
+ req_tech = list("programming" = 6, "materials" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100)
build_path = /obj/item/weapon/aiModule/zeroth/oneHuman
@@ -37,7 +37,7 @@
name = "Module Design (ProtectStation)"
desc = "Allows for the construction of a ProtectStation AI Module."
id = "protectstation_module"
- req_tech = list("programming" = 3, "materials" = 6)
+ req_tech = list("programming" = 5, "materials" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100)
build_path = /obj/item/weapon/aiModule/supplied/protectStation
@@ -58,7 +58,7 @@
name = "Module Design (OxygenIsToxicToHumans)"
desc = "Allows for the construction of a Safeguard AI Module."
id = "oxygen_module"
- req_tech = list("programming" = 3, "biotech" = 2, "materials" = 4)
+ req_tech = list("programming" = 4, "biotech" = 2, "materials" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100)
build_path = /obj/item/weapon/aiModule/supplied/oxygen
@@ -68,7 +68,7 @@
name = "Module Design (Freeform)"
desc = "Allows for the construction of a Freeform AI Module."
id = "freeform_module"
- req_tech = list("programming" = 4, "materials" = 4)
+ req_tech = list("programming" = 5, "materials" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100)
build_path = /obj/item/weapon/aiModule/supplied/freeform
@@ -78,7 +78,7 @@
name = "Module Design (Reset)"
desc = "Allows for the construction of a Reset AI Module."
id = "reset_module"
- req_tech = list("programming" = 3, "materials" = 6)
+ req_tech = list("programming" = 4, "materials" = 6)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100)
build_path = /obj/item/weapon/aiModule/reset
@@ -88,7 +88,7 @@
name = "Module Design (Purge)"
desc = "Allows for the construction of a Purge AI Module."
id = "purge_module"
- req_tech = list("programming" = 4, "materials" = 6)
+ req_tech = list("programming" = 5, "materials" = 6)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100)
build_path = /obj/item/weapon/aiModule/reset/purge
@@ -98,7 +98,7 @@
name = "AI Core Module (Freeform)"
desc = "Allows for the construction of a Freeform AI Core Module."
id = "freeformcore_module"
- req_tech = list("programming" = 4, "materials" = 6)
+ req_tech = list("programming" = 6, "materials" = 6)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100)
build_path = /obj/item/weapon/aiModule/core/freeformcore
@@ -108,7 +108,7 @@
name = "Core Module Design (Asimov)"
desc = "Allows for the construction of a Asimov AI Core Module."
id = "asimov_module"
- req_tech = list("programming" = 3, "materials" = 6)
+ req_tech = list("programming" = 3, "materials" = 5)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100)
build_path = /obj/item/weapon/aiModule/core/full/asimov
@@ -118,7 +118,7 @@
name = "Core Module Design (P.A.L.A.D.I.N.)"
desc = "Allows for the construction of a P.A.L.A.D.I.N. AI Core Module."
id = "paladin_module"
- req_tech = list("programming" = 4, "materials" = 6)
+ req_tech = list("programming" = 5, "materials" = 5)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100)
build_path = /obj/item/weapon/aiModule/core/full/paladin
@@ -128,7 +128,7 @@
name = "Core Module Design (T.Y.R.A.N.T.)"
desc = "Allows for the construction of a T.Y.R.A.N.T. AI Module."
id = "tyrant_module"
- req_tech = list("programming" = 4, "syndicate" = 2, "materials" = 6)
+ req_tech = list("programming" = 5, "syndicate" = 2, "materials" = 5)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100)
build_path = /obj/item/weapon/aiModule/core/full/tyrant
@@ -138,7 +138,7 @@
name = "Core Module Design (Corporate)"
desc = "Allows for the construction of a Corporate AI Core Module."
id = "corporate_module"
- req_tech = list("programming" = 4, "materials" = 6)
+ req_tech = list("programming" = 5, "materials" = 5)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100)
build_path = /obj/item/weapon/aiModule/core/full/corp
@@ -148,7 +148,7 @@
name = "Core Module Design (Custom)"
desc = "Allows for the construction of a Custom AI Core Module."
id = "custom_module"
- req_tech = list("programming" = 4, "materials" = 6)
+ req_tech = list("programming" = 5, "materials" = 5)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100)
build_path = /obj/item/weapon/aiModule/core/full/custom
diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm
index 1da2314a25b..453c04d05e6 100644
--- a/code/modules/research/designs/comp_board_designs.dm
+++ b/code/modules/research/designs/comp_board_designs.dm
@@ -4,7 +4,7 @@
name = "Computer Design (Security)"
desc = "Allows for the construction of circuit boards used to build security camera computers."
id = "seccamera"
- req_tech = list("programming" = 2)
+ req_tech = list("programming" = 2, "combat" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/security
@@ -14,7 +14,7 @@
name = "Computer Design (AI Upload)"
desc = "Allows for the construction of circuit boards used to build an AI Upload Console."
id = "aiupload"
- req_tech = list("programming" = 4)
+ req_tech = list("programming" = 5, "engineering" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/aiupload
@@ -24,7 +24,7 @@
name = "Computer Design (Cyborg Upload)"
desc = "Allows for the construction of circuit boards used to build a Cyborg Upload Console."
id = "borgupload"
- req_tech = list("programming" = 4)
+ req_tech = list("programming" = 5, "engineering" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/borgupload
@@ -34,7 +34,7 @@
name = "Computer Design (Medical Records)"
desc = "Allows for the construction of circuit boards used to build a medical records console."
id = "med_data"
- req_tech = list("programming" = 2)
+ req_tech = list("programming" = 2, "biotech" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/med_data
@@ -44,7 +44,7 @@
name = "Computer Design (Operating Computer)"
desc = "Allows for the construction of circuit boards used to build an operating computer console."
id = "operating"
- req_tech = list("programming" = 2, "biotech" = 2)
+ req_tech = list("programming" = 2, "biotech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/operating
@@ -54,7 +54,7 @@
name = "Computer Design (PanD.E.M.I.C. 2200)"
desc = "Allows for the construction of circuit boards used to build a PanD.E.M.I.C. 2200 console."
id = "pandemic"
- req_tech = list("programming" = 2, "biotech" = 2)
+ req_tech = list("programming" = 3, "biotech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/pandemic
@@ -64,7 +64,7 @@
name = "Computer Design (DNA Machine)"
desc = "Allows for the construction of circuit boards used to build a new DNA scanning console."
id = "scan_console"
- req_tech = list("programming" = 2, "biotech" = 3)
+ req_tech = list("programming" = 2, "biotech" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/scan_consolenew
@@ -74,7 +74,7 @@
name = "Computer Design (Communications)"
desc = "Allows for the construction of circuit boards used to build a communications console."
id = "comconsole"
- req_tech = list("programming" = 2, "magnets" = 2)
+ req_tech = list("programming" = 3, "magnets" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/communications
@@ -84,7 +84,7 @@
name = "Computer Design (ID Console)"
desc = "Allows for the construction of circuit boards used to build an ID computer."
id = "idcardconsole"
- req_tech = list("programming" = 2)
+ req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/card
@@ -100,12 +100,11 @@
build_path = /obj/item/weapon/circuitboard/computer/crew
category = list("Computer Boards")
-
/datum/design/secdata
name = "Computer Design (Security Records Console)"
desc = "Allows for the construction of circuit boards used to build a security records console."
id = "secdata"
- req_tech = list("programming" = 2)
+ req_tech = list("programming" = 2, "combat" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/secure_data
@@ -155,7 +154,7 @@
name = "Computer Design (Orion Trail Arcade Machine)"
desc = "Allows for the construction of circuit boards used to build a new Orion Trail machine."
id = "arcademachine"
- req_tech = list("programming" = 2)
+ req_tech = list("programming" = 1)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/arcade/orion_trail
@@ -165,7 +164,7 @@
name = "Computer Design (Slot Machine)"
desc = "Allows for the construction of circuit boards used to build a new slot machine."
id = "slotmachine"
- req_tech = list("programming" = 2)
+ req_tech = list("programming" = 1)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/slot_machine
@@ -175,7 +174,7 @@
name = "Computer Design (Power Monitor)"
desc = "Allows for the construction of circuit boards used to build a new power monitor."
id = "powermonitor"
- req_tech = list("programming" = 2)
+ req_tech = list("programming" = 2, "powerstorage" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/powermonitor
@@ -215,7 +214,7 @@
name = "Computer Design (Mech Bay Power Control Console)"
desc = "Allows for the construction of circuit boards used to build a mech bay power control console."
id = "mechapower"
- req_tech = list("programming" = 2, "powerstorage" = 3)
+ req_tech = list("programming" = 3, "powerstorage" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/mech_bay_power_console
@@ -265,7 +264,7 @@
name = "Computer Design (Telecommunications Monitoring Console)"
desc = "Allows for the construction of circuit boards used to build a telecommunications monitor."
id = "comm_monitor"
- req_tech = list("programming" = 3)
+ req_tech = list("programming" = 3, "magnets" = 3, "bluespace" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/comm_monitor
@@ -275,7 +274,7 @@
name = "Computer Design (Telecommunications Server Monitoring Console)"
desc = "Allows for the construction of circuit boards used to build a telecommunication server browser and monitor."
id = "comm_server"
- req_tech = list("programming" = 3)
+ req_tech = list("programming" = 3, "magnets" = 3, "bluespace" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/comm_server
@@ -295,7 +294,7 @@
name = "Computer Design (AI Integrity Restorer)"
desc = "Allows for the construction of circuit boards used to build an AI Integrity Restorer."
id = "aifixer"
- req_tech = list("programming" = 3, "biotech" = 2)
+ req_tech = list("programming" = 4, "magnets" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/aifixer
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index fe53f327a7e..6a0bf146ea3 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -16,7 +16,7 @@
name = "Machine Design (Automated Announcement System Board)"
desc = "The circuit board for an automated announcement system."
id = "automated_announcement"
- req_tech = list("programming" = 3, "bluespace" = 2)
+ req_tech = list("programming" = 3, "bluespace" = 3, "magnets" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/announcement_system
@@ -26,7 +26,7 @@
name = "Computer Design (Power Turbine Console Board)"
desc = "The circuit board for a power turbine console."
id = "power_turbine_console"
- req_tech = list("programming" = 4, "powerstorage" = 4, "engineering" = 4)
+ req_tech = list("programming" = 4, "powerstorage" = 5, "engineering" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/turbine_computer
@@ -36,7 +36,7 @@
name = "Machine Design (Emitter Board)"
desc = "The circuit board for an emitter."
id = "emitter"
- req_tech = list("programming" = 4, "powerstorage" = 5, "engineering" = 5)
+ req_tech = list("programming" = 3, "powerstorage" = 5, "engineering" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/emitter
@@ -76,7 +76,7 @@
name = "Machine Design (Space Heater Board)"
desc = "The circuit board for a space heater."
id = "space_heater"
- req_tech = list("programming" = 2, "engineering" = 2)
+ req_tech = list("programming" = 2, "engineering" = 2, "plasmatech" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/space_heater
@@ -86,7 +86,7 @@
name = "Machine Design (Teleportation Station Board)"
desc = "The circuit board for a teleportation station."
id = "tele_station"
- req_tech = list("programming" = 4, "bluespace" = 4, "engineering" = 4)
+ req_tech = list("programming" = 5, "bluespace" = 4, "engineering" = 4, "plasmatech" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/teleporter_station
@@ -106,7 +106,7 @@
name = "Machine Design (Telepad Board)"
desc = "The circuit board for a telescience telepad."
id = "telepad"
- req_tech = list("programming" = 4, "bluespace" = 4, "materials" = 3, "engineering" = 3)
+ req_tech = list("programming" = 4, "bluespace" = 5, "plasmatech" = 4, "engineering" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/telesci_pad
@@ -116,7 +116,7 @@
name = "Computer Design (Teleporter Console)"
desc = "Allows for the construction of circuit boards used to build a teleporter control console."
id = "teleconsole"
- req_tech = list("programming" = 3, "bluespace" = 2)
+ req_tech = list("programming" = 3, "bluespace" = 3, "plasmatech" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/teleporter
@@ -126,7 +126,7 @@
name = "Computer Design (Telepad Control Console Board)"
desc = "Allows for the construction of circuit boards used to build a telescience console."
id = "telesci_console"
- req_tech = list("programming" = 3, "bluespace" = 2)
+ req_tech = list("programming" = 3, "bluespace" = 3, "plasmatech" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/telesci_console
@@ -136,7 +136,7 @@
name = "Machine Design (Sleeper Board)"
desc = "The circuit board for a sleeper."
id = "sleeper"
- req_tech = list("programming" = 3, "biotech" = 2, "materials" = 3, "engineering" = 3)
+ req_tech = list("programming" = 3, "biotech" = 2, "engineering" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/sleeper
@@ -146,7 +146,7 @@
name = "Machine Design (Cryotube Board)"
desc = "The circuit board for a cryotube."
id = "cryotube"
- req_tech = list("programming" = 4, "biotech" = 3, "engineering" = 4)
+ req_tech = list("programming" = 5, "biotech" = 3, "engineering" = 4, "plasmatech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/cryo_tube
@@ -156,7 +156,7 @@
name = "Machine Design (Portable Chem Dispenser Board)"
desc = "The circuit board for a portable chem dispenser."
id = "chem_dispenser"
- req_tech = list("programming" = 4, "biotech" = 3, "engineering" = 4, "materials" = 4, "plasmatech" = 3)
+ req_tech = list("programming" = 5, "biotech" = 3, "materials" = 4, "plasmatech" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/chem_dispenser
@@ -166,7 +166,7 @@
name = "Machine Design (Chem Master Board)"
desc = "The circuit board for a Chem Master 2999."
id = "chem_master"
- req_tech = list("biotech" = 1, "materials" = 2, "programming" = 2)
+ req_tech = list("biotech" = 3, "materials" = 3, "programming" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/chem_master
@@ -176,7 +176,7 @@
name = "Machine Design (Chemical Heater Board)"
desc = "The circuit board for a chemical heater."
id = "chem_heater"
- req_tech = list("engineering" = 2, "materials" = 2)
+ req_tech = list("engineering" = 2, "biotech" = 2, "programming" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/chem_heater
@@ -186,7 +186,7 @@
name = "Computer Design (Cloning Machine Console)"
desc = "Allows for the construction of circuit boards used to build a new Cloning Machine console."
id = "clonecontrol"
- req_tech = list("programming" = 3, "biotech" = 3)
+ req_tech = list("programming" = 4, "biotech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/computer/cloning
@@ -196,7 +196,7 @@
name = "Machine Design (Clone Pod)"
desc = "Allows for the construction of circuit boards used to build a Cloning Pod."
id = "clonepod"
- req_tech = list("programming" = 3, "biotech" = 3)
+ req_tech = list("programming" = 4, "biotech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/clonepod
@@ -206,7 +206,7 @@
name = "Machine Design (Cloning Scanner)"
desc = "Allows for the construction of circuit boards used to build a Cloning Scanner."
id = "clonescanner"
- req_tech = list("programming" = 3, "biotech" = 3)
+ req_tech = list("programming" = 4, "biotech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/clonescanner
@@ -216,7 +216,7 @@
name = "Machine Design (Biogenerator Board)"
desc = "The circuit board for a biogenerator."
id = "biogenerator"
- req_tech = list("programming" = 3, "biotech" = 2, "materials" = 3)
+ req_tech = list("programming" = 2, "biotech" = 3, "materials" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/biogenerator
@@ -226,7 +226,7 @@
name = "Machine Design (Hydroponics Tray Board)"
desc = "The circuit board for a hydroponics tray."
id = "hydro_tray"
- req_tech = list("programming" = 1, "biotech" = 1)
+ req_tech = list("biotech" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/hydroponics
@@ -316,7 +316,7 @@
name = "Machine Design (Mechbay Recharger Board)"
desc = "The circuit board for a Mechbay Recharger."
id = "mech_recharger"
- req_tech = list("programming" = 3, "powerstorage" = 4, "engineering" = 4)
+ req_tech = list("programming" = 3, "powerstorage" = 4, "engineering" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/mech_recharger
@@ -326,7 +326,7 @@
name = "Machine Design (Microwave Board)"
desc = "The circuit board for a microwave."
id = "microwave"
- req_tech = list("programming" = 1)
+ req_tech = list("programming" = 2, "magnets" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/microwave
@@ -336,7 +336,7 @@
name = "Machine Design (Gibber Board)"
desc = "The circuit board for a gibber."
id = "gibber"
- req_tech = list("programming" = 1)
+ req_tech = list("programming" = 2, "engineering" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/gibber
@@ -386,7 +386,7 @@
name = "Machine Design (Recycler Board)"
desc = "The circuit board for a recycler."
id = "recycler"
- req_tech = list("programming" = 1)
+ req_tech = list("programming" = 2, "engineering" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/recycler
@@ -406,7 +406,7 @@
name = "Machine Design (Autolathe Board)"
desc = "The circuit board for an autolathe."
id = "autolathe"
- req_tech = list("programming" = 2, "engineering" = 2)
+ req_tech = list("programming" = 3, "engineering" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/autolathe
@@ -416,7 +416,7 @@
name = "Machine Design (Weapon Recharger Board)"
desc = "The circuit board for a Weapon Recharger."
id = "recharger"
- req_tech = list("powerstorage" = 3, "engineering" = 3, "materials" = 4)
+ req_tech = list("powerstorage" = 4, "engineering" = 3, "materials" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100)
build_path = /obj/item/weapon/circuitboard/machine/recharger
@@ -436,18 +436,17 @@
name = "Machine Design (Ore Redemption Board)"
desc = "The circuit board for an Ore Redemption machine."
id = "ore_redemption"
- req_tech = list("programming" = 1, "engineering" = 2)
+ req_tech = list("programming" = 2, "engineering" = 2, "plasmatech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/ore_redemption
category = list ("Misc. Machinery")
-
/datum/design/mining_equipment_vendor
name = "Machine Design (Mining Rewards Vender Board)"
desc = "The circuit board for a Mining Rewards Vender."
id = "mining_equipment_vendor"
- req_tech = list("programming" = 1, "engineering" = 2)
+ req_tech = list("engineering" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/mining_equipment_vendor
@@ -457,7 +456,7 @@
name = "Machine Design (Tesla Coil Board)"
desc = "The circuit board for a tesla coil."
id = "tesla_coil"
- req_tech = list("programming" = 1)
+ req_tech = list("programming" = 3, "powerstorage" = 3, "magnets" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/tesla_coil
@@ -467,7 +466,7 @@
name = "Machine Design (Grounding Rod Board)"
desc = "The circuit board for a grounding rod."
id = "grounding_rod"
- req_tech = list("programming" = 1)
+ req_tech = list("programming" = 3, "powerstorage" = 3, "magnets" = 3, "plasmatech" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/grounding_rod
diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm
index a2028a40d54..6805fac443e 100644
--- a/code/modules/research/designs/mecha_designs.dm
+++ b/code/modules/research/designs/mecha_designs.dm
@@ -6,7 +6,7 @@
name = "APLU \"Ripley\" Central Control module"
desc = "Allows for the construction of a \"Ripley\" Central Control module."
id = "ripley_main"
- req_tech = list("programming" = 3)
+ req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/ripley/main
@@ -16,7 +16,7 @@
name = "APLU \"Ripley\" Peripherals Control module"
desc = "Allows for the construction of a \"Ripley\" Peripheral Control module."
id = "ripley_peri"
- req_tech = list("programming" = 3)
+ req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/ripley/peripherals
@@ -26,7 +26,7 @@
name = "\"Odysseus\" Central Control module"
desc = "Allows for the construction of a \"Odysseus\" Central Control module."
id = "odysseus_main"
- req_tech = list("programming" = 3,"biotech" = 2)
+ req_tech = list("programming" = 3,"biotech" = 3, "engineering" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/odysseus/main
@@ -36,7 +36,7 @@
name = "\"Odysseus\" Peripherals Control module"
desc = "Allows for the construction of a \"Odysseus\" Peripheral Control module."
id = "odysseus_peri"
- req_tech = list("programming" = 3,"biotech" = 2)
+ req_tech = list("programming" = 3,"biotech" = 3, "engineering" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/odysseus/peripherals
@@ -46,7 +46,7 @@
name = "\"Gygax\" Central Control module"
desc = "Allows for the construction of a \"Gygax\" Central Control module."
id = "gygax_main"
- req_tech = list("programming" = 4)
+ req_tech = list("programming" = 4, "combat" = 3, "engineering" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/gygax/main
@@ -56,7 +56,7 @@
name = "\"Gygax\" Peripherals Control module"
desc = "Allows for the construction of a \"Gygax\" Peripheral Control module."
id = "gygax_peri"
- req_tech = list("programming" = 4)
+ req_tech = list("programming" = 4, "combat" = 3, "engineering" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/gygax/peripherals
@@ -66,7 +66,7 @@
name = "\"Gygax\" Weapons & Targeting Control module"
desc = "Allows for the construction of a \"Gygax\" Weapons & Targeting Control module."
id = "gygax_targ"
- req_tech = list("programming" = 4, "combat" = 2)
+ req_tech = list("programming" = 4, "combat" = 4, "engineering" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/gygax/targeting
@@ -76,7 +76,7 @@
name = "\"Durand\" Central Control module"
desc = "Allows for the construction of a \"Durand\" Central Control module."
id = "durand_main"
- req_tech = list("programming" = 4)
+ req_tech = list("programming" = 4, "combat" = 4, "engineering" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/durand/main
@@ -86,7 +86,7 @@
name = "\"Durand\" Peripherals Control module"
desc = "Allows for the construction of a \"Durand\" Peripheral Control module."
id = "durand_peri"
- req_tech = list("programming" = 4)
+ req_tech = list("programming" = 4, "combat" = 4, "engineering" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/durand/peripherals
@@ -96,7 +96,7 @@
name = "\"Durand\" Weapons & Targeting Control module"
desc = "Allows for the construction of a \"Durand\" Weapons & Targeting Control module."
id = "durand_targ"
- req_tech = list("programming" = 4, "combat" = 2)
+ req_tech = list("programming" = 5, "combat" = 4, "engineering" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/durand/targeting
@@ -106,7 +106,7 @@
name = "\"H.O.N.K\" Central Control module"
desc = "Allows for the construction of a \"H.O.N.K\" Central Control module."
id = "honker_main"
- req_tech = list("programming" = 3)
+ req_tech = list("programming" = 3, "engineering" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/honker/main
@@ -116,7 +116,7 @@
name = "\"H.O.N.K\" Peripherals Control module"
desc = "Allows for the construction of a \"H.O.N.K\" Peripheral Control module."
id = "honker_peri"
- req_tech = list("programming" = 3)
+ req_tech = list("programming" = 3, "engineering" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/honker/peripherals
@@ -126,7 +126,7 @@
name = "\"H.O.N.K\" Weapons & Targeting Control module"
desc = "Allows for the construction of a \"H.O.N.K\" Weapons & Targeting Control module."
id = "honker_targ"
- req_tech = list("programming" = 3)
+ req_tech = list("programming" = 3, "engineering" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/honker/targeting
@@ -136,7 +136,7 @@
name = "\"Phazon\" Central Control module"
desc = "Allows for the construction of a \"Phazon\" Central Control module."
id = "phazon_main"
- req_tech = list("programming" = 5, "materials" = 7, "powerstorage" = 6)
+ req_tech = list("programming" = 6, "materials" = 6, "plasmatech" = 5)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/phazon/main
@@ -146,7 +146,7 @@
name = "\"Phazon\" Peripherals Control module"
desc = "Allows for the construction of a \"Phazon\" Peripheral Control module."
id = "phazon_peri"
- req_tech = list("programming" = 5, "bluespace" = 6)
+ req_tech = list("programming" = 6, "bluespace" = 5, "plasmatech" = 5)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/phazon/peripherals
@@ -156,7 +156,7 @@
name = "\"Phazon\" Weapons & Targeting Control module"
desc = "Allows for the construction of a \"Phazon\" Weapons & Targeting Control module."
id = "phazon_targ"
- req_tech = list("programming" = 5, "magnets" = 6)
+ req_tech = list("programming" = 6, "magnets" = 5, "plasmatech" = 5)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/phazon/targeting
@@ -204,7 +204,7 @@
desc = "Allows for the construction of CH-PS Laser."
id = "mech_laser"
build_type = MECHFAB
- req_tech = list("combat" = 3, "magnets" = 3)
+ req_tech = list("combat" = 3, "magnets" = 3, "engineering" = 3)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
materials = list(MAT_METAL=10000)
construction_time = 100
@@ -215,7 +215,7 @@
desc = "Allows for the construction of CH-LC Laser Cannon."
id = "mech_laser_heavy"
build_type = MECHFAB
- req_tech = list("combat" = 4, "magnets" = 4)
+ req_tech = list("combat" = 4, "magnets" = 4, "engineering" = 4)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
materials = list(MAT_METAL=10000)
construction_time = 100
@@ -226,7 +226,7 @@
desc = "Allows for the construction of SGL-6 Grenade Launcher."
id = "mech_grenade_launcher"
build_type = MECHFAB
- req_tech = list("combat" = 3)
+ req_tech = list("combat" = 4, "engineering" = 4)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang
materials = list(MAT_METAL=22000,MAT_GOLD=6000,MAT_SILVER=8000)
construction_time = 100
@@ -237,7 +237,7 @@
desc = "Allows for the construction of SRM-8 Missile Rack."
id = "mech_missile_rack"
build_type = MECHFAB
- req_tech = list("combat" = 6, "materials" = 6)
+ req_tech = list("combat" = 6, "materials" = 5, "engineering" = 5)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/missile_rack
materials = list(MAT_METAL=22000,MAT_GOLD=6000,MAT_SILVER=8000)
construction_time = 100
@@ -259,7 +259,7 @@
desc = "An exosuit module that allows generating of small quasi-stable wormholes."
id = "mech_wormhole_gen"
build_type = MECHFAB
- req_tech = list("bluespace" = 3, "magnets" = 2)
+ req_tech = list("bluespace" = 4, "magnets" = 4, "plasmatech" = 3)
build_path = /obj/item/mecha_parts/mecha_equipment/wormhole_generator
materials = list(MAT_METAL=10000)
construction_time = 100
@@ -270,9 +270,9 @@
desc = "An exosuit module that allows exosuits to teleport to any position in view."
id = "mech_teleporter"
build_type = MECHFAB
- req_tech = list("bluespace" = 10, "magnets" = 5)
+ req_tech = list("bluespace" = 8, "magnets" = 5)
build_path = /obj/item/mecha_parts/mecha_equipment/teleporter
- materials = list(MAT_METAL=10000)
+ materials = list(MAT_METAL=10000,MAT_DIAMOND=10000)
construction_time = 100
category = list("Exosuit Equipment")
@@ -281,7 +281,7 @@
desc = "An exosuit-mounted Rapid Construction Device."
id = "mech_rcd"
build_type = MECHFAB
- req_tech = list("materials" = 4, "bluespace" = 3, "magnets" = 4, "powerstorage"=4, "engineering" = 4)
+ req_tech = list("materials" = 5, "bluespace" = 3, "magnets" = 4, "powerstorage"=4, "engineering" = 5)
build_path = /obj/item/mecha_parts/mecha_equipment/rcd
materials = list(MAT_METAL=30000,MAT_GOLD=20000,MAT_PLASMA=25000,MAT_SILVER=20000)
construction_time = 1200
@@ -292,7 +292,7 @@
desc = "An exosuit mounted Gravitational Catapult."
id = "mech_gravcatapult"
build_type = MECHFAB
- req_tech = list("bluespace" = 2, "magnets" = 3, "engineering" = 3)
+ req_tech = list("bluespace" = 4, "magnets" = 3, "engineering" = 4)
build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult
materials = list(MAT_METAL=10000)
construction_time = 100
@@ -303,7 +303,7 @@
desc = "Automated Repair Droid. BEEP BOOP"
id = "mech_repair_droid"
build_type = MECHFAB
- req_tech = list("magnets" = 3, "programming" = 3, "engineering" = 3)
+ req_tech = list("magnets" = 3, "programming" = 3, "engineering" = 5)
build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid
materials = list(MAT_METAL=10000,MAT_GLASS=5000,MAT_GOLD=1000,MAT_SILVER=2000)
construction_time = 100
@@ -314,7 +314,7 @@
desc = "Tesla Energy Relay"
id = "mech_energy_relay"
build_type = MECHFAB
- req_tech = list("magnets" = 4, "powerstorage" = 3)
+ req_tech = list("magnets" = 4, "powerstorage" = 5, "engineering" = 4)
build_path = /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
materials = list(MAT_METAL=10000,MAT_GLASS=2000,MAT_GOLD=2000,MAT_SILVER=3000)
construction_time = 100
@@ -347,7 +347,7 @@
desc = "An upgraded version of the standard drill."
id = "mech_diamond_drill"
build_type = MECHFAB
- req_tech = list("materials" = 4, "engineering" = 3)
+ req_tech = list("materials" = 5, "engineering" = 4)
build_path = /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill
materials = list(MAT_METAL=10000,MAT_DIAMOND=6500)
construction_time = 100
@@ -358,7 +358,7 @@
desc = "Compact nuclear reactor module."
id = "mech_generator_nuclear"
build_type = MECHFAB
- req_tech = list("powerstorage"= 3, "engineering" = 3, "materials" = 3)
+ req_tech = list("powerstorage"= 5, "engineering" = 4, "materials" = 3)
build_path = /obj/item/mecha_parts/mecha_equipment/generator/nuclear
materials = list(MAT_METAL=10000,MAT_GLASS=1000,MAT_SILVER=500)
construction_time = 100
@@ -369,7 +369,7 @@
desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demolishing solid obstacles."
id = "mech_plasma_cutter"
build_type = MECHFAB
- req_tech = list("powerstorage"= 3, "engineering" = 3, "materials" = 3, "combat" = 1, "plasmatech" = 2)
+ req_tech = list("engineering" = 3, "materials" = 3, "plasmatech" = 4)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma
materials = list(MAT_METAL = 8000, MAT_GLASS = 1000, MAT_PLASMA = 2000)
construction_time = 100
@@ -380,7 +380,7 @@
desc = "A weapon for combat exosuits. Shoots non-lethal stunning electrodes."
id = "mech_taser"
build_type = MECHFAB
- req_tech = list("combat" = 2)
+ req_tech = list("combat" = 3)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser
materials = list(MAT_METAL=10000)
construction_time = 100
@@ -391,7 +391,7 @@
desc = "A weapon for combat exosuits. Shoots a rapid, three shot burst."
id = "mech_lmg"
build_type = MECHFAB
- req_tech = list("combat" = 2)
+ req_tech = list("combat" = 4)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg
materials = list(MAT_METAL=10000)
construction_time = 100
@@ -402,7 +402,7 @@
desc = "Equipment for medical exosuits. A mounted sleeper that stabilizes patients and can inject reagents in the exosuit's reserves."
id = "mech_sleeper"
build_type = MECHFAB
- req_tech = list("biotech" = 2)
+ req_tech = list("biotech" = 3, "engineering" = 3, "plasmatech" = 2)
build_path = /obj/item/mecha_parts/mecha_equipment/medical/sleeper
materials = list(MAT_METAL=5000,MAT_GLASS=10000)
construction_time = 100
@@ -413,7 +413,7 @@
desc = "Equipment for medical exosuits. A chem synthesizer with syringe gun. Reagents inside are held in stasis, so no reactions will occur."
id = "mech_syringe_gun"
build_type = MECHFAB
- req_tech = list("magnets" = 3,"biotech" = 3)
+ req_tech = list("magnets" = 4,"biotech" = 4, "combat" = 3, "materials" = 4)
build_path = /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun
materials = list(MAT_METAL=3000,MAT_GLASS=2000)
construction_time = 200
@@ -423,9 +423,9 @@
name = "Exosuit Medical Equipment (Medical Beamgun)"
desc = "Equipment for medical exosuits. A mounted medical nanite projector which will treat patients with a focused beam."
id = "mech_medi_beam"
- req_tech = list("combat" = 5, "materials" = 7, "powerstorage" = 7, "biotech" = 6)
+ req_tech = list("engineering" = 6, "materials" = 7, "powerstorage" = 5, "biotech" = 6)
build_type = MECHFAB
materials = list(MAT_METAL = 15000, MAT_GLASS = 8000, MAT_PLASMA = 3000, MAT_GOLD = 8000, MAT_DIAMOND = 2000)
construction_time = 250
build_path = /obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam
- category = list("Exosuit Equipment")
\ No newline at end of file
+ category = list("Exosuit Equipment")
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index 98139b4326f..0518e393ecd 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -536,7 +536,7 @@
id = "mech_generator"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/mecha_equipment/generator
- materials = list(MAT_METAL=10000,MAT_GLASS=1000,MAT_SILVER=500)
+ materials = list(MAT_METAL=10000,MAT_GLASS=1000,MAT_SILVER=2000,MAT_PLASMA=5000)
construction_time = 100
category = list("Exosuit Equipment")
@@ -603,7 +603,7 @@
id = "borg_upgrade_vtec"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/vtec
- req_tech = list("engineering" = 4, "materials" = 5)
+ req_tech = list("engineering" = 4, "materials" = 5, "programming" = 4)
materials = list(MAT_METAL=80000 , MAT_GLASS=6000 , MAT_URANIUM= 5000)
construction_time = 120
category = list("Cyborg Upgrade Modules")
@@ -623,7 +623,7 @@
id = "borg_upgrade_disablercooler"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/disablercooler
- req_tech = list("combat" = 5, "powerstorage" = 4)
+ req_tech = list("combat" = 5, "powerstorage" = 4, "engineering" = 4)
materials = list(MAT_METAL=80000 , MAT_GLASS=6000 , MAT_GOLD= 2000, MAT_DIAMOND = 500)
construction_time = 120
category = list("Cyborg Upgrade Modules")
@@ -633,7 +633,7 @@
id = "borg_upgrade_diamonddrill"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/ddrill
- req_tech = list("engineering" = 5, "materials" = 5)
+ req_tech = list("engineering" = 5, "materials" = 6)
materials = list(MAT_METAL=10000, MAT_DIAMOND=2000)
construction_time = 120
category = list("Cyborg Upgrade Modules")
@@ -643,7 +643,7 @@
id = "borg_upgrade_holding"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/soh
- req_tech = list("engineering" = 5, "materials" = 5, "bluespace" = 3)
+ req_tech = list("engineering" = 4, "materials" = 4, "bluespace" = 4)
materials = list(MAT_METAL = 10000, MAT_GOLD = 250, MAT_URANIUM = 500)
construction_time = 120
category = list("Cyborg Upgrade Modules")
@@ -652,7 +652,7 @@
name = "Cyborg Upgrade (Illegal Modules)"
id = "borg_syndicate_module"
build_type = MECHFAB
- req_tech = list("combat" = 4, "syndicate" = 3)
+ req_tech = list("combat" = 4, "syndicate" = 2)
build_path = /obj/item/borg/upgrade/syndicate
materials = list(MAT_METAL=10000,MAT_GLASS=15000,MAT_DIAMOND = 10000)
construction_time = 120
@@ -688,3 +688,14 @@
construction_time=150
build_path = /obj/item/drone_shell
category = list("Misc")
+
+/datum/design/synthetic_flash
+ name = "Flash"
+ desc = "When a problem arises, SCIENCE is the solution."
+ id = "sflash"
+ req_tech = list("magnets" = 3, "combat" = 2)
+ build_type = MECHFAB
+ materials = list(MAT_METAL = 750, MAT_GLASS = 750)
+ construction_time = 100
+ build_path = /obj/item/device/assembly/flash/handheld
+ category = list("Misc")
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 88f2ecad568..e599fc862c2 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -7,10 +7,9 @@
name = "Mass-Spectrometer"
desc = "A device for analyzing chemicals in the blood."
id = "mass_spectrometer"
- req_tech = list("biotech" = 2, "magnets" = 2)
+ req_tech = list("magnets" = 2, "plasmatech" = 2)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 30, MAT_GLASS = 20)
- reliability = 76
+ materials = list(MAT_METAL = 300, MAT_GLASS = 100)
build_path = /obj/item/device/mass_spectrometer
category = list("Medical Designs")
@@ -18,10 +17,9 @@
name = "Advanced Mass-Spectrometer"
desc = "A device for analyzing chemicals in the blood and their quantities."
id = "adv_mass_spectrometer"
- req_tech = list("biotech" = 2, "magnets" = 4)
+ req_tech = list("biotech" = 3, "magnets" = 4, "plasmatech" = 3)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 30, MAT_GLASS = 20)
- reliability = 74
+ materials = list(MAT_METAL = 500, MAT_GLASS = 200)
build_path = /obj/item/device/mass_spectrometer/adv
category = list("Medical Designs")
@@ -29,11 +27,10 @@
name = "Man-Machine Interface"
desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity."
id = "mmi"
- req_tech = list("programming" = 2, "biotech" = 3)
+ req_tech = list("programming" = 3, "biotech" = 2, "engineering" = 2)
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 1000, MAT_GLASS = 500)
construction_time = 75
- reliability = 76
build_path = /obj/item/device/mmi
category = list("Misc","Medical Designs")
@@ -41,46 +38,30 @@
name = "Positronic Brain"
desc = "The latest in Artificial Intelligences."
id = "mmi_posi"
- req_tech = list("programming" = 5, "biotech" = 4)
+ req_tech = list("programming" = 5, "biotech" = 4, "plasmatech" = 3)
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 1700, MAT_GLASS = 1350, MAT_GOLD = 500) //Gold, because SWAG.
- reliability = 74
construction_time = 75
build_path = /obj/item/device/mmi/posibrain
category = list("Misc", "Medical Designs")
-
-/datum/design/synthetic_flash
- name = "Flash"
- desc = "When a problem arises, SCIENCE is the solution."
- id = "sflash"
- req_tech = list("magnets" = 3, "combat" = 2)
- build_type = MECHFAB
- materials = list(MAT_METAL = 750, MAT_GLASS = 750)
- construction_time = 100
- reliability = 76
- build_path = /obj/item/device/assembly/flash/handheld
- category = list("Misc")
-
/datum/design/bluespacebeaker
name = "Bluespace Beaker"
desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units."
id = "bluespacebeaker"
- req_tech = list("bluespace" = 2, "materials" = 6)
+ req_tech = list("bluespace" = 6, "materials" = 5, "plasmatech" = 4)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 3000, MAT_PLASMA = 3000, MAT_DIAMOND = 500)
- reliability = 76
+ materials = list(MAT_GLASS = 3000, MAT_PLASMA = 3000, MAT_DIAMOND = 500)
build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace
- category = list("Medical Designs", "Bluespace Designs")
+ category = list("Medical Designs")
/datum/design/noreactbeaker
name = "Cryostasis Beaker"
desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units."
id = "splitbeaker"
- req_tech = list("materials" = 2)
+ req_tech = list("materials" = 3, "engineering" = 3, "plasmatech" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000)
- reliability = 76
build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact
category = list("Medical Designs")
@@ -88,21 +69,19 @@
name = "Bluespace Syringe"
desc = "An advanced syringe that can hold 60 units of chemicals"
id = "bluespacesyringe"
- req_tech = list("bluespace" = 3, "materials" = 4, "combat" = 2)
+ req_tech = list("bluespace" = 5, "materials" = 4, "biotech" = 4)
build_type = PROTOLATHE
materials = list(MAT_GLASS = 4000, MAT_PLASMA = 2000, MAT_DIAMOND = 2000)
- reliability = 76
build_path = /obj/item/weapon/reagent_containers/syringe/bluespace
- category = list("Medical Designs", "Bluespace Designs")
+ category = list("Medical Designs")
/datum/design/noreactsyringe
name = "Cryo Syringe"
desc = "An advanced syringe that stops reagents inside from reacting. It can hold up to 20 units."
id = "noreactsyringe"
- req_tech = list("materials" = 2, "combat" = 2)
+ req_tech = list("materials" = 3, "engineering" = 3)
build_type = PROTOLATHE
materials = list(MAT_GLASS = 4000, MAT_GOLD = 1000)
- reliability = 76
build_path = /obj/item/weapon/reagent_containers/syringe/noreact
category = list("Medical Designs")
@@ -110,10 +89,9 @@
name = "Piercing Syringe"
desc = "A diamond-tipped syringe that pierces armor when launched at high velocity. It can hold up to 10 units."
id = "piercesyringe"
- req_tech = list("materials" = 3, "combat" = 3)
+ req_tech = list("materials" = 5, "combat" = 3, "engineering" = 7)
build_type = PROTOLATHE
materials = list(MAT_GLASS = 4000, MAT_DIAMOND = 1500)
- reliability = 76
build_path = /obj/item/weapon/reagent_containers/syringe/piercing
category = list("Medical Designs")
@@ -121,10 +99,9 @@
name = "Bluespace body bag"
desc = "A bluespace body bag, powered by experimental bluespace technology. It can hold loads of bodies and the largest of creatures."
id = "bluespacebodybag"
- req_tech = list("bluespace" = 2, "materials" = 6)
+ req_tech = list("bluespace" = 5, "materials" = 4, "plasmatech" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000, MAT_PLASMA = 2000, MAT_DIAMOND = 500)
- reliability = 76
build_path = /obj/item/bodybag/bluespace
category = list("Medical Designs")
@@ -132,10 +109,9 @@
name = "Plasma-man jumpsuit refill"
desc = "A refill pack for the auto-extinguisher on Plasma-man suits."
id = "plasmarefiller"
- req_tech = list("materials" = 2, "combat" = 2)
+ req_tech = list("materials" = 2, "plasmatech" = 3) //Why did this have no plasmatech
build_type = PROTOLATHE
materials = list(MAT_METAL = 4000, MAT_PLASMA = 1000)
- reliability = 76
build_path = /obj/item/device/extinguisher_refill
category = list("Medical Designs")
@@ -147,10 +123,10 @@
name = "Welding Shield implant"
desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision."
id = "ci-welding"
- req_tech = list("materials" = 4, "biotech" = 2)
+ req_tech = list("materials" = 4, "biotech" = 4, "engineering" = 5, "plasmatech" = 4)
build_type = PROTOLATHE | MECHFAB
construction_time = 40
- materials = list(MAT_METAL = 200, MAT_GLASS = 400)
+ materials = list(MAT_METAL = 600, MAT_GLASS = 400)
build_path = /obj/item/organ/cyberimp/eyes/shield
category = list("Misc", "Medical Designs")
@@ -158,10 +134,10 @@
name = "Breathing Tube implant"
desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked."
id = "ci-breather"
- req_tech = list("materials" = 3, "biotech" = 3)
+ req_tech = list("materials" = 2, "biotech" = 3)
build_type = PROTOLATHE | MECHFAB
construction_time = 35
- materials = list(MAT_METAL = 200, MAT_GLASS = 250)
+ materials = list(MAT_METAL = 600, MAT_GLASS = 250)
build_path = /obj/item/organ/cyberimp/mouth/breathing_tube
category = list("Misc", "Medical Designs")
@@ -169,7 +145,7 @@
name = "Toolset Arm implant"
desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm."
id = "ci-toolset"
- req_tech = list("materials" = 4, "engineering" = 3, "biotech" = 4, "powerstorage" = 4)
+ req_tech = list("materials" = 3, "engineering" = 4, "biotech" = 4, "powerstorage" = 4)
build_type = PROTOLATHE | MECHFAB
materials = list (MAT_METAL = 2500, MAT_GLASS = 1500, MAT_SILVER = 1500)
construction_time = 200
@@ -180,10 +156,10 @@
name = "Medical HUD implant"
desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control."
id = "ci-medhud"
- req_tech = list("materials" = 6, "programming" = 4, "biotech" = 4)
+ req_tech = list("materials" = 5, "programming" = 4, "biotech" = 4)
build_type = PROTOLATHE | MECHFAB
construction_time = 50
- materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_SILVER = 500, MAT_GOLD = 500)
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 500, MAT_GOLD = 500)
build_path = /obj/item/organ/cyberimp/eyes/hud/medical
category = list("Misc", "Medical Designs")
@@ -191,10 +167,10 @@
name = "Security HUD implant"
desc = "These cybernetic eyes will display a security HUD over everything you see. Wiggle eyes to control."
id = "ci-sechud"
- req_tech = list("materials" = 6, "programming" = 5, "biotech" = 4, "combat" = 2)
+ req_tech = list("materials" = 5, "programming" = 4, "biotech" = 4, "combat" = 3)
build_type = PROTOLATHE | MECHFAB
construction_time = 50
- materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_SILVER = 750, MAT_GOLD = 750)
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 750, MAT_GOLD = 750)
build_path = /obj/item/organ/cyberimp/eyes/hud/security
category = list("Misc", "Medical Designs")
@@ -202,10 +178,10 @@
name = "X-Ray implant"
desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile."
id = "ci-xray"
- req_tech = list("materials" = 7, "programming" = 5, "biotech" = 6, "magnets" = 5)
+ req_tech = list("materials" = 7, "programming" = 5, "biotech" = 7, "magnets" = 5,"plasmatech" = 6)
build_type = PROTOLATHE | MECHFAB
construction_time = 60
- materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_SILVER = 600, MAT_GOLD = 600, MAT_PLASMA = 1000, MAT_URANIUM = 1000, MAT_DIAMOND = 2000)
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 600, MAT_GOLD = 600, MAT_PLASMA = 1000, MAT_URANIUM = 1000, MAT_DIAMOND = 2000)
build_path = /obj/item/organ/cyberimp/eyes/xray
category = list("Misc", "Medical Designs")
@@ -213,10 +189,10 @@
name = "Thermals implant"
desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included."
id = "ci-thermals"
- req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5, "magnets" = 5, "syndicate" = 5)
+ req_tech = list("materials" = 6, "programming" = 4, "biotech" = 7, "magnets" = 5,"plasmatech" = 4)
build_type = PROTOLATHE | MECHFAB
construction_time = 60
- materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_SILVER = 600, MAT_GOLD = 600, MAT_PLASMA = 1000, MAT_DIAMOND = 2000)
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 600, MAT_GOLD = 600, MAT_PLASMA = 1000, MAT_DIAMOND = 2000)
build_path = /obj/item/organ/cyberimp/eyes/thermals
category = list("Misc", "Medical Designs")
@@ -224,10 +200,10 @@
name = "Anti-Drop implant"
desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle."
id = "ci-antidrop"
- req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5)
+ req_tech = list("materials" = 5, "programming" = 6, "biotech" = 5)
build_type = PROTOLATHE | MECHFAB
construction_time = 60
- materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_SILVER = 400, MAT_GOLD = 400)
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 400, MAT_GOLD = 400)
build_path = /obj/item/organ/cyberimp/brain/anti_drop
category = list("Misc", "Medical Designs")
@@ -235,10 +211,10 @@
name = "CNS Rebooter implant"
desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned."
id = "ci-antistun"
- req_tech = list("materials" = 7, "programming" = 5, "biotech" = 6)
+ req_tech = list("materials" = 6, "programming" = 5, "biotech" = 6)
build_type = PROTOLATHE | MECHFAB
construction_time = 60
- materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_SILVER = 500, MAT_GOLD = 1000)
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 500, MAT_GOLD = 1000)
build_path = /obj/item/organ/cyberimp/brain/anti_stun
category = list("Misc", "Medical Designs")
@@ -246,10 +222,10 @@
name = "Nutriment pump implant"
desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are starving."
id = "ci-nutriment"
- req_tech = list("materials" = 6, "programming" = 4, "biotech" = 5)
+ req_tech = list("materials" = 5, "powerstorage" = 6, "biotech" = 5)
build_type = PROTOLATHE | MECHFAB
construction_time = 40
- materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_GOLD = 500, MAT_URANIUM = 500)
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_GOLD = 500, MAT_URANIUM = 500)
build_path = /obj/item/organ/cyberimp/chest/nutriment
category = list("Misc", "Medical Designs")
@@ -257,10 +233,10 @@
name = "Nutriment pump implant PLUS"
desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are hungry."
id = "ci-nutrimentplus"
- req_tech = list("materials" = 6, "programming" = 4, "biotech" = 6)
+ req_tech = list("materials" = 5, "powerstorage" = 6, "biotech" = 6)
build_type = PROTOLATHE | MECHFAB
construction_time = 50
- materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_GOLD = 500, MAT_URANIUM = 750)
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_GOLD = 500, MAT_URANIUM = 750)
build_path = /obj/item/organ/cyberimp/chest/nutriment/plus
category = list("Misc", "Medical Designs")
@@ -268,10 +244,10 @@
name = "Reviver implant"
desc = "This implant will attempt to revive you if you lose consciousness. For the faint of heart!"
id = "ci-reviver"
- req_tech = list("materials" = 6, "programming" = 4, "biotech" = 7, "syndicate" = 4)
+ req_tech = list("materials" = 5, "programming" = 4, "biotech" = 8)
build_type = PROTOLATHE | MECHFAB
construction_time = 60
- materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_GOLD = 500, MAT_URANIUM = 1000, MAT_DIAMOND = 2000)
+ materials = list(MAT_METAL = 800, MAT_GLASS = 800, MAT_GOLD = 500, MAT_URANIUM = 1000, MAT_DIAMOND = 2000)
build_path = /obj/item/organ/cyberimp/chest/reviver
category = list("Misc", "Medical Designs")
@@ -279,7 +255,7 @@
name = "Thrusters set implant"
desc = "This implant will allow you to use gas from environment or your internals for propulsion in zero-gravity areas."
id = "ci-thrusters"
- req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5, "magnets" = 4, "engineering" = 5)
+ req_tech = list("materials" = 5, "biotech" = 5, "magnets" = 4, "engineering" = 7)
build_type = PROTOLATHE | MECHFAB
construction_time = 80
materials = list(MAT_METAL = 4000, MAT_GLASS = 2000, MAT_SILVER = 1000, MAT_DIAMOND = 1000)
@@ -295,7 +271,7 @@
name = "Implanter"
desc = "A sterile automatic implant injector."
id = "implanter"
- req_tech = list("materials" = 1, "programming" = 2, "biotech" = 3)
+ req_tech = list("materials" = 2, "biotech" = 3, "programming" = 2)
build_type = PROTOLATHE
materials = list(MAT_METAL = 600, MAT_GLASS = 200)
build_path = /obj/item/weapon/implanter
@@ -305,7 +281,7 @@
name = "Implant Case"
desc = "A glass case for containing an implant."
id = "implantcase"
- req_tech = list("materials" = 1, "biotech" = 2)
+ req_tech = list("biotech" = 2)
build_type = PROTOLATHE
materials = list(MAT_GLASS = 500)
build_path = /obj/item/weapon/implantcase
@@ -315,9 +291,9 @@
name = "Freedom Implant Case"
desc = "A glass case containing an implant."
id = "implant_freedom"
- req_tech = list("materials" = 2, "biotech" = 3, "magnets" = 3, "syndicate" = 5)
+ req_tech = list("combat" = 6, "biotech" = 5, "magnets" = 3, "syndicate" = 3)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 500, MAT_GOLD = 250)
+ materials = list(MAT_METAL = 800, MAT_GLASS = 500, MAT_GOLD = 500)
build_path = /obj/item/weapon/implantcase/freedom
category = list("Medical Designs")
@@ -325,8 +301,8 @@
name = "Adrenalin Implant Case"
desc = "A glass case containing an implant."
id = "implant_adrenalin"
- req_tech = list("materials" = 2, "biotech" = 5, "combat" = 3, "syndicate" = 6)
+ req_tech = list("biotech" = 6, "combat" = 6, "syndicate" = 6)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 500, MAT_GOLD = 500, MAT_URANIUM = 100, MAT_DIAMOND = 200)
+ materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_GOLD = 500, MAT_URANIUM = 600, MAT_DIAMOND = 600)
build_path = /obj/item/weapon/implantcase/adrenaline
- category = list("Medical Designs")
\ No newline at end of file
+ category = list("Medical Designs")
diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm
index 11bb5c755be..ba9f113e2e4 100644
--- a/code/modules/research/designs/power_designs.dm
+++ b/code/modules/research/designs/power_designs.dm
@@ -28,8 +28,7 @@
name = "Super-Capacity Power Cell"
desc = "A power cell that holds 20000 units of energy."
id = "super_cell"
- req_tech = list("powerstorage" = 3, "materials" = 2)
- reliability = 75
+ req_tech = list("powerstorage" = 3, "materials" = 3)
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 700, MAT_GLASS = 70)
construction_time=100
@@ -40,10 +39,9 @@
name = "Hyper-Capacity Power Cell"
desc = "A power cell that holds 30000 units of energy."
id = "hyper_cell"
- req_tech = list("powerstorage" = 5, "materials" = 4)
- reliability = 70
+ req_tech = list("powerstorage" = 5, "materials" = 5, "engineering" = 5)
build_type = PROTOLATHE | MECHFAB
- materials = list(MAT_METAL = 400, MAT_GOLD = 150, MAT_SILVER = 150, MAT_GLASS = 80)
+ materials = list(MAT_METAL = 700, MAT_GOLD = 150, MAT_SILVER = 150, MAT_GLASS = 80)
construction_time=100
build_path = /obj/item/weapon/stock_parts/cell/hyper
category = list("Misc","Power Designs")
@@ -52,8 +50,7 @@
name = "Bluespace Power Cell"
desc = "A power cell that holds 40000 units of energy."
id = "bluespace_cell"
- req_tech = list("powerstorage" = 6, "materials" = 5)
- reliability = 70
+ req_tech = list("powerstorage" = 6, "materials" = 5, "engineering" = 5, "bluespace" = 5)
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 800, MAT_GOLD = 300, MAT_SILVER = 300, MAT_GLASS = 160, MAT_DIAMOND = 160)
construction_time=100
@@ -65,7 +62,7 @@
name = "Light Replacer"
desc = "A device to automatically replace lights. Refill with working lightbulbs."
id = "light_replacer"
- req_tech = list("magnets" = 3, "materials" = 4)
+ req_tech = list("magnets" = 3, "engineering" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 1500, MAT_SILVER = 150, MAT_GLASS = 3000)
build_path = /obj/item/device/lightreplacer
@@ -75,9 +72,8 @@
name = "Machine Design (PACMAN-type Generator Board)"
desc = "The circuit board that for a PACMAN-type portable generator."
id = "pacman"
- req_tech = list("programming" = 3, "plasmatech" = 3, "powerstorage" = 3, "engineering" = 3)
+ req_tech = list("programming" = 2, "plasmatech" = 3, "powerstorage" = 3, "engineering" = 3)
build_type = IMPRINTER
- reliability = 79
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/pacman
category = list("Engineering Machinery")
@@ -88,7 +84,6 @@
id = "superpacman"
req_tech = list("programming" = 3, "powerstorage" = 4, "engineering" = 4)
build_type = IMPRINTER
- reliability = 76
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/pacman/super
category = list("Engineering Machinery")
@@ -97,9 +92,8 @@
name = "Machine Design (MRSPACMAN-type Generator Board)"
desc = "The circuit board that for a MRSPACMAN-type portable generator."
id = "mrspacman"
- req_tech = list("programming" = 3, "powerstorage" = 5, "engineering" = 5)
+ req_tech = list("programming" = 3, "powerstorage" = 5, "engineering" = 5, "plasmatech" = 4)
build_type = IMPRINTER
- reliability = 74
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/pacman/mrs
category = list("Engineering Machinery")
diff --git a/code/modules/research/designs/stock_parts_designs.dm b/code/modules/research/designs/stock_parts_designs.dm
index 3f10842e91f..bfd81790c4a 100644
--- a/code/modules/research/designs/stock_parts_designs.dm
+++ b/code/modules/research/designs/stock_parts_designs.dm
@@ -6,8 +6,7 @@
name = "Rapid Part Exchange Device"
desc = "Special mechanical module made to store, sort, and apply standard machine parts."
id = "rped"
- req_tech = list("engineering" = 3,
- "materials" = 3)
+ req_tech = list("engineering" = 1)
build_type = PROTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 5000) //hardcore
build_path = /obj/item/weapon/storage/part_replacer
@@ -17,7 +16,7 @@
name = "Bluespace RPED"
desc = "Powered by bluespace technology, this RPED variant can upgrade buildings from a distance, without needing to remove the panel first."
id = "bs_rped"
- req_tech = list("engineering" = 3, "materials" = 5, "programming" = 3, "bluespace" = 3)
+ req_tech = list("engineering" = 4, "bluespace" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 15000, MAT_GLASS = 5000, MAT_SILVER = 2500) //hardcore
build_path = /obj/item/weapon/storage/part_replacer/bluespace
@@ -30,7 +29,7 @@
id = "basic_capacitor"
req_tech = list("powerstorage" = 1)
build_type = PROTOLATHE | AUTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 50)
+ materials = list(MAT_METAL = 100, MAT_GLASS = 100)
build_path = /obj/item/weapon/stock_parts/capacitor
category = list("Stock Parts","Machinery","initial")
@@ -40,7 +39,7 @@
id = "adv_capacitor"
req_tech = list("powerstorage" = 3)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 50)
+ materials = list(MAT_METAL = 150, MAT_GLASS = 150)
build_path = /obj/item/weapon/stock_parts/capacitor/adv
category = list("Stock Parts")
@@ -48,10 +47,9 @@
name = "Super Capacitor"
desc = "A stock part used in the construction of various devices."
id = "super_capacitor"
- req_tech = list("powerstorage" = 5, "materials" = 4)
+ req_tech = list("powerstorage" = 5, "engineering" = 5)
build_type = PROTOLATHE
- reliability = 71
- materials = list(MAT_METAL = 50, MAT_GLASS = 50, MAT_GOLD = 20)
+ materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_GOLD = 100)
build_path = /obj/item/weapon/stock_parts/capacitor/super
category = list("Stock Parts")
@@ -59,10 +57,9 @@
name = "Quadratic Capacitor"
desc = "A stock part used in the construction of various devices."
id = "quadratic_capacitor"
- req_tech = list("powerstorage" = 6, "materials" = 5)
+ req_tech = list("powerstorage" = 6, "engineering" = 5, "materials" = 5, "bluespace" = 5)
build_type = PROTOLATHE
- reliability = 71
- materials = list(MAT_METAL = 100, MAT_GLASS = 100, MAT_DIAMOND = 40)
+ materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_DIAMOND = 100)
build_path = /obj/item/weapon/stock_parts/capacitor/quadratic
category = list("Stock Parts")
@@ -73,7 +70,7 @@
id = "basic_scanning"
req_tech = list("magnets" = 1)
build_type = PROTOLATHE | AUTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 20)
+ materials = list(MAT_METAL = 100, MAT_GLASS = 50)
build_path = /obj/item/weapon/stock_parts/scanning_module
category = list("Stock Parts","Machinery","initial")
@@ -83,7 +80,7 @@
id = "adv_scanning"
req_tech = list("magnets" = 3)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 20)
+ materials = list(MAT_METAL = 150, MAT_GLASS = 100)
build_path = /obj/item/weapon/stock_parts/scanning_module/adv
category = list("Stock Parts")
@@ -91,10 +88,9 @@
name = "Phasic Scanning Module"
desc = "A stock part used in the construction of various devices."
id = "phasic_scanning"
- req_tech = list("magnets" = 5, "materials" = 3)
+ req_tech = list("magnets" = 5, "engineering" = 5)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 20, MAT_SILVER = 10)
- reliability = 72
+ materials = list(MAT_METAL = 200, MAT_GLASS = 150, MAT_SILVER = 60)
build_path = /obj/item/weapon/stock_parts/scanning_module/phasic
category = list("Stock Parts")
@@ -102,10 +98,9 @@
name = "Triphasic Scanning Module"
desc = "A stock part used in the construction of various devices."
id = "triphasic_scanning"
- req_tech = list("magnets" = 6, "materials" = 4)
+ req_tech = list("magnets" = 6, "materials" = 5, "engineering" = 5, "bluespace" = 5)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 100, MAT_GLASS = 40, MAT_DIAMOND = 20)
- reliability = 72
+ materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_DIAMOND = 60)
build_path = /obj/item/weapon/stock_parts/scanning_module/triphasic
category = list("Stock Parts")
@@ -114,9 +109,9 @@
name = "Micro Manipulator"
desc = "A stock part used in the construction of various devices."
id = "micro_mani"
- req_tech = list("materials" = 1, "programming" = 1)
+ req_tech = list("materials" = 1)
build_type = PROTOLATHE | AUTOLATHE
- materials = list(MAT_METAL = 30)
+ materials = list(MAT_METAL = 100)
build_path = /obj/item/weapon/stock_parts/manipulator
category = list("Stock Parts","Machinery","initial")
@@ -126,7 +121,7 @@
id = "nano_mani"
req_tech = list("materials" = 3, "programming" = 2)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 30)
+ materials = list(MAT_METAL = 150)
build_path = /obj/item/weapon/stock_parts/manipulator/nano
category = list("Stock Parts")
@@ -134,10 +129,9 @@
name = "Pico Manipulator"
desc = "A stock part used in the construction of various devices."
id = "pico_mani"
- req_tech = list("materials" = 5, "programming" = 2)
+ req_tech = list("materials" = 5, "programming" = 4, "engineering" = 5)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 30)
- reliability = 73
+ materials = list(MAT_METAL = 200)
build_path = /obj/item/weapon/stock_parts/manipulator/pico
category = list("Stock Parts")
@@ -145,10 +139,9 @@
name = "Femto Manipulator"
desc = "A stock part used in the construction of various devices."
id = "femto_mani"
- req_tech = list("materials" = 6, "programming" = 3)
+ req_tech = list("materials" = 7, "programming" = 5, "engineering" = 5, "bluespace" = 5)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 60, MAT_DIAMOND = 30)
- reliability = 73
+ materials = list(MAT_METAL = 200, MAT_DIAMOND = 60)
build_path = /obj/item/weapon/stock_parts/manipulator/femto
category = list("Stock Parts")
@@ -159,7 +152,7 @@
id = "basic_micro_laser"
req_tech = list("magnets" = 1)
build_type = PROTOLATHE | AUTOLATHE
- materials = list(MAT_METAL = 10, MAT_GLASS = 20)
+ materials = list(MAT_METAL = 100, MAT_GLASS = 50)
build_path = /obj/item/weapon/stock_parts/micro_laser
category = list("Stock Parts","Machinery","initial")
@@ -169,7 +162,7 @@
id = "high_micro_laser"
req_tech = list("magnets" = 3)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 10, MAT_GLASS = 20)
+ materials = list(MAT_METAL = 150, MAT_GLASS = 100)
build_path = /obj/item/weapon/stock_parts/micro_laser/high
category = list("Stock Parts")
@@ -177,10 +170,9 @@
name = "Ultra-High-Power Micro-Laser"
desc = "A stock part used in the construction of various devices."
id = "ultra_micro_laser"
- req_tech = list("magnets" = 5, "materials" = 5)
+ req_tech = list("magnets" = 5, "engineering" = 5)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 10, MAT_GLASS = 20, MAT_URANIUM = 10)
- reliability = 70
+ materials = list(MAT_METAL = 200, MAT_GLASS = 150, MAT_URANIUM = 60)
build_path = /obj/item/weapon/stock_parts/micro_laser/ultra
category = list("Stock Parts")
@@ -188,10 +180,9 @@
name = "Quad-Ultra Micro-Laser"
desc = "A stock part used in the construction of various devices."
id = "quadultra_micro_laser"
- req_tech = list("magnets" = 6, "materials" = 6)
+ req_tech = list("magnets" = 6, "materials" = 5, "engineering" = 5, "bluespace" = 5)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 20, MAT_GLASS = 40, MAT_URANIUM = 20, MAT_DIAMOND = 20)
- reliability = 70
+ materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_URANIUM = 100, MAT_DIAMOND = 60)
build_path = /obj/item/weapon/stock_parts/micro_laser/quadultra
category = list("Stock Parts")
@@ -201,7 +192,7 @@
id = "basic_matter_bin"
req_tech = list("materials" = 1)
build_type = PROTOLATHE | AUTOLATHE
- materials = list(MAT_METAL = 80)
+ materials = list(MAT_METAL = 100)
build_path = /obj/item/weapon/stock_parts/matter_bin
category = list("Stock Parts","Machinery","initial")
@@ -211,7 +202,7 @@
id = "adv_matter_bin"
req_tech = list("materials" = 3)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 80)
+ materials = list(MAT_METAL = 150)
build_path = /obj/item/weapon/stock_parts/matter_bin/adv
category = list("Stock Parts")
@@ -219,10 +210,9 @@
name = "Super Matter Bin"
desc = "A stock part used in the construction of various devices."
id = "super_matter_bin"
- req_tech = list("materials" = 5)
+ req_tech = list("materials" = 5, "engineering" = 5)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 80)
- reliability = 75
+ materials = list(MAT_METAL = 200)
build_path = /obj/item/weapon/stock_parts/matter_bin/super
category = list("Stock Parts")
@@ -230,10 +220,9 @@
name = "Bluespace Matter Bin"
desc = "A stock part used in the construction of various devices."
id = "bluespace_matter_bin"
- req_tech = list("materials" = 6)
+ req_tech = list("materials" = 7, "engineering" = 5, "bluespace" = 5)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 160, MAT_DIAMOND = 200)
- reliability = 75
+ materials = list(MAT_METAL = 250, MAT_DIAMOND = 200)
build_path = /obj/item/weapon/stock_parts/matter_bin/bluespace
category = list("Stock Parts")
@@ -242,9 +231,9 @@
name = "Subspace Ansible"
desc = "A compact module capable of sensing extradimensional activity."
id = "s-ansible"
- req_tech = list("programming" = 2, "magnets" = 2, "materials" = 2, "bluespace" = 1)
+ req_tech = list("programming" = 2, "magnets" = 2, "materials" = 2)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 80, MAT_SILVER = 20)
+ materials = list(MAT_METAL = 100, MAT_SILVER = 100)
build_path = /obj/item/weapon/stock_parts/subspace/ansible
category = list("Stock Parts")
@@ -252,9 +241,9 @@
name = "Hyperwave Filter"
desc = "A tiny device capable of filtering and converting super-intense radiowaves."
id = "s-filter"
- req_tech = list("programming" = 2, "magnets" = 2)
+ req_tech = list("programming" = 3, "magnets" = 3)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 40, MAT_SILVER = 10)
+ materials = list(MAT_METAL = 100, MAT_SILVER = 100)
build_path = /obj/item/weapon/stock_parts/subspace/filter
category = list("Stock Parts")
@@ -262,9 +251,9 @@
name = "Subspace Amplifier"
desc = "A compact micro-machine capable of amplifying weak subspace transmissions."
id = "s-amplifier"
- req_tech = list("programming" = 2, "magnets" = 2, "materials" = 2, "bluespace" = 1)
+ req_tech = list("programming" = 3, "magnets" = 4, "materials" = 3, "bluespace" = 2)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 10, MAT_GOLD = 30, MAT_URANIUM = 15)
+ materials = list(MAT_METAL = 100, MAT_GOLD = 100, MAT_URANIUM = 100)
build_path = /obj/item/weapon/stock_parts/subspace/amplifier
category = list("Stock Parts")
@@ -272,9 +261,9 @@
name = "Subspace Treatment Disk"
desc = "A compact micro-machine capable of stretching out hyper-compressed radio waves."
id = "s-treatment"
- req_tech = list("programming" = 2, "magnets" = 1, "materials" = 2, "bluespace" = 1)
+ req_tech = list("programming" = 2, "magnets" = 3, "materials" = 2, "bluespace" = 3)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 10, MAT_SILVER = 20)
+ materials = list(MAT_METAL = 100, MAT_SILVER = 200)
build_path = /obj/item/weapon/stock_parts/subspace/treatment
category = list("Stock Parts")
@@ -282,9 +271,9 @@
name = "Subspace Analyzer"
desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths."
id = "s-analyzer"
- req_tech = list("programming" = 2, "magnets" = 2, "materials" = 2, "bluespace" = 1)
+ req_tech = list("programming" = 3, "magnets" = 4, "materials" = 2, "bluespace" = 3)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 10, MAT_GOLD = 15)
+ materials = list(MAT_METAL = 100, MAT_GOLD = 100)
build_path = /obj/item/weapon/stock_parts/subspace/analyzer
category = list("Stock Parts")
@@ -292,9 +281,9 @@
name = "Ansible Crystal"
desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths."
id = "s-crystal"
- req_tech = list("magnets" = 2, "materials" = 2, "bluespace" = 1)
+ req_tech = list("magnets" = 2, "materials" = 2, "bluespace" = 3, "plasmatech" = 3)
build_type = PROTOLATHE
- materials = list(MAT_GLASS = 1000, MAT_SILVER = 20, MAT_GOLD = 20)
+ materials = list(MAT_GLASS = 800, MAT_SILVER = 100, MAT_GOLD = 100)
build_path = /obj/item/weapon/stock_parts/subspace/crystal
category = list("Stock Parts")
@@ -302,8 +291,8 @@
name = "Subspace Transmitter"
desc = "A large piece of equipment used to open a window into the subspace dimension."
id = "s-transmitter"
- req_tech = list("magnets" = 3, "materials" = 3, "bluespace" = 2)
+ req_tech = list("magnets" = 3, "materials" = 4, "bluespace" = 4)
build_type = PROTOLATHE
- materials = list(MAT_GLASS = 100, MAT_SILVER = 10, MAT_URANIUM = 15)
+ materials = list(MAT_GLASS = 100, MAT_SILVER = 100, MAT_URANIUM = 100)
build_path = /obj/item/weapon/stock_parts/subspace/transmitter
category = list("Stock Parts")
diff --git a/code/modules/research/designs/telecomms_designs.dm b/code/modules/research/designs/telecomms_designs.dm
index baa6bb689ba..f63ee2fe2d5 100644
--- a/code/modules/research/designs/telecomms_designs.dm
+++ b/code/modules/research/designs/telecomms_designs.dm
@@ -66,8 +66,8 @@
name = "Machine Design (Subspace Broadcaster)"
desc = "Allows for the construction of Subspace Broadcasting equipment."
id = "s-broadcaster"
- req_tech = list("programming" = 2, "engineering" = 2, "bluespace" = 1)
+ req_tech = list("programming" = 2, "engineering" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/machine/telecomms/broadcaster
- category = list("Subspace Telecomms")
\ No newline at end of file
+ category = list("Subspace Telecomms")
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 96934df98e7..9c8d3b50fa9 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -6,7 +6,7 @@
name = "test-range firing pin"
desc = "This safety firing pin allows firearms to be operated within proximity to a firing range."
id = "pin_testing"
- req_tech = list("combat" = 1, "materials" = 2)
+ req_tech = list("combat" = 2, "materials" = 2)
build_type = PROTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 300)
build_path = /obj/item/device/firing_pin/test_range
@@ -16,7 +16,7 @@
name = "loyalty firing pin"
desc = "This is a security firing pin which only authorizes users who are loyalty-implanted."
id = "pin_loyalty"
- req_tech = list("combat" = 5, "materials" = 6, "powerstorage" = 3)
+ req_tech = list("combat" = 5, "materials" = 6)
build_type = PROTOLATHE
materials = list(MAT_SILVER = 600, MAT_DIAMOND = 600, MAT_URANIUM = 200)
build_path = /obj/item/device/firing_pin/implant/loyalty
@@ -26,21 +26,19 @@
name = "Tesla Revolver"
desc = "A high-tech revolver that fires internal, reusable shock cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers."
id = "stunrevolver"
- req_tech = list("combat" = 3, "materials" = 3, "powerstorage" = 5)
+ req_tech = list("combat" = 4, "materials" = 4, "powerstorage" = 5)
build_type = PROTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 10000, MAT_SILVER = 10000)
build_path = /obj/item/weapon/gun/energy/shock_revolver
-
category = list("Weapons")
/datum/design/nuclear_gun
name = "Advanced Energy Gun"
desc = "An energy gun with an experimental miniaturized reactor."
id = "nuclear_gun"
- req_tech = list("combat" = 4, "materials" = 5, "powerstorage" = 3)
+ req_tech = list("combat" = 5, "magnets" = 5, "powerstorage" = 5)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 5000, MAT_GLASS = 1000, MAT_URANIUM = 2000)
- reliability = 76
+ materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 4000)
build_path = /obj/item/weapon/gun/energy/gun/nuclear
category = list("Weapons")
@@ -48,7 +46,7 @@
name = "Telescopic Riot Shield"
desc = "An advanced riot shield made of lightweight materials that collapses for easy storage."
id = "tele_shield"
- req_tech = list("combat" = 4, "materials" = 3, "engineering" = 3)
+ req_tech = list("combat" = 4, "materials" = 3, "engineering" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 4000, MAT_GLASS = 5000, MAT_SILVER = 300)
build_path = /obj/item/weapon/shield/riot/tele
@@ -58,9 +56,9 @@
name = "Accelerator Laser Cannon"
desc = "A heavy duty laser cannon. It does more damage the farther away the target is."
id = "lasercannon"
- req_tech = list("combat" = 4, "materials" = 3, "powerstorage" = 3)
+ req_tech = list("combat" = 5, "magnets" = 5, "powerstorage" = 3)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_DIAMOND = 2000)
+ materials = list(MAT_METAL = 10000, MAT_GLASS = 3000, MAT_DIAMOND = 3000)
build_path = /obj/item/weapon/gun/energy/lasercannon
category = list("Weapons")
@@ -68,7 +66,7 @@
name = "Decloner"
desc = "Your opponent will bubble into a messy pile of goop."
id = "decloner"
- req_tech = list("combat" = 8, "materials" = 7, "biotech" = 5, "powerstorage" = 6)
+ req_tech = list("combat" = 5, "materials" = 5, "biotech" = 6, "plasmatech" = 7)
build_type = PROTOLATHE
materials = list(MAT_GOLD = 5000,MAT_URANIUM = 10000)
reagents = list("mutagen" = 40)
@@ -79,7 +77,7 @@
name = "Rapid Syringe Gun"
desc = "A gun that fires many syringes."
id = "rapidsyringe"
- req_tech = list("combat" = 3, "materials" = 3, "engineering" = 3, "biotech" = 2)
+ req_tech = list("combat" = 3, "biotech" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 1000)
build_path = /obj/item/weapon/gun/syringe/rapidsyringe
@@ -89,18 +87,17 @@
name = "Energy Crossbow"
desc = "A reverse-engineered energy crossbow favored by syndicate infiltration teams and carp hunters."
id = "largecrossbow"
- req_tech = list("combat" = 5, "materials" = 5, "engineering" = 3, "biotech" = 4, "syndicate" = 3)
+ req_tech = list("combat" = 5, "engineering" = 3, "magnet" = 5, "syndicate" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 1500, MAT_URANIUM = 1500, MAT_SILVER = 1500)
build_path = /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large
category = list("Weapons")
- reliability = 76
/datum/design/temp_gun
name = "Temperature Gun"
desc = "A gun that shoots temperature bullet energythings to change temperature."//Change it if you want
id = "temp_gun"
- req_tech = list("combat" = 3, "materials" = 4, "powerstorage" = 3, "magnets" = 2)
+ req_tech = list("combat" = 4, "materials" = 4, "powerstorage" = 3, "magnets" = 2)
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 500, MAT_SILVER = 3000)
build_path = /obj/item/weapon/gun/energy/temperature
@@ -110,7 +107,7 @@
name = "Floral Somatoray"
desc = "A tool that discharges controlled radiation which induces mutation in plant cells. Harmless to other organic life."
id = "flora_gun"
- req_tech = list("materials" = 2, "biotech" = 3, "powerstorage" = 3)
+ req_tech = list("materials" = 2, "biotech" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_GLASS = 500)
reagents = list("radium" = 20)
@@ -121,10 +118,9 @@
name = "Large Grenade"
desc = "A grenade that affects a larger area and use larger containers."
id = "large_Grenade"
- req_tech = list("combat" = 3, "materials" = 2)
+ req_tech = list("combat" = 3, "engineering" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000)
- reliability = 79
build_path = /obj/item/weapon/grenade/chem_grenade/large
category = list("Weapons")
@@ -132,10 +128,9 @@
name = "Pyro Grenade"
desc = "An advanced grenade that is able to self ignite its mixture."
id = "pyro_Grenade"
- req_tech = list("combat" = 3, "materials" = 3)
+ req_tech = list("combat" = 4, "engineering" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_PLASMA = 500)
- reliability = 79
build_path = /obj/item/weapon/grenade/chem_grenade/pyro
category = list("Weapons")
@@ -148,7 +143,6 @@
req_tech = list("combat" = 3, "materials" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_SILVER = 500)
- reliability = 79
build_path = /obj/item/weapon/grenade/chem_grenade/cryo
category = list("Weapons")
*/
@@ -157,10 +151,9 @@
name = "Advanced Release Grenade"
desc = "An advanced grenade that can be detonated several times, best used with a repeating igniter."
id = "adv_Grenade"
- req_tech = list("combat" = 3, "materials" = 3)
+ req_tech = list("combat" = 3, "engineering" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000, MAT_GLASS = 500)
- reliability = 79
build_path = /obj/item/weapon/grenade/chem_grenade/adv_release
category = list("Weapons")
@@ -168,9 +161,9 @@
name = "Xray Laser Gun"
desc = "Not quite as menacing as it sounds"
id = "xray"
- req_tech = list("combat" = 6, "materials" = 5, "biotech" = 5, "powerstorage" = 4)
+ req_tech = list("combat" = 7, "magnets" = 5, "biotech" = 5, "powerstorage" = 4)
build_type = PROTOLATHE
- materials = list(MAT_GOLD = 5000,MAT_URANIUM = 10000, MAT_METAL = 4000)
+ materials = list(MAT_GOLD = 5000,MAT_URANIUM = 10000, MAT_METAL = 5000)
build_path = /obj/item/weapon/gun/energy/xray
category = list("Weapons")
@@ -178,9 +171,9 @@
name = "Ion Carbine"
desc = "How to dismantle a cyborg : The gun."
id = "ioncarbine"
- req_tech = list("combat" = 5, "materials" = 4, "magnets" = 4)
+ req_tech = list("combat" = 5, "magnets" = 4)
build_type = PROTOLATHE
- materials = list(MAT_SILVER = 4000, MAT_METAL = 6000, MAT_URANIUM = 1000)
+ materials = list(MAT_SILVER = 6000, MAT_METAL = 8000, MAT_URANIUM = 2000)
build_path = /obj/item/weapon/gun/energy/ionrifle/carbine
category = list("Weapons")
@@ -188,9 +181,9 @@
name = "Bluespace Wormhole Projector"
desc = "A projector that emits high density quantum-coupled bluespace beams."
id = "wormholeprojector"
- req_tech = list("combat" = 6, "materials" = 6, "bluespace" = 4)
+ req_tech = list("combat" = 5, "engineering" = 5, "bluespace" = 7, "plasmatech" = 6)
build_type = PROTOLATHE
- materials = list(MAT_SILVER = 1000, MAT_METAL = 5000, MAT_DIAMOND = 3000)
+ materials = list(MAT_SILVER = 2000, MAT_METAL = 5000, MAT_DIAMOND = 3000)
build_path = /obj/item/weapon/gun/energy/wormhole_projector
category = list("Weapons")
@@ -198,7 +191,7 @@
name = "Modular Receiver"
desc = "A prototype modular receiver and trigger assembly for a variety of firearms."
id = "reciever"
- req_tech = list("combat" = 5, "materials" = 4)
+ req_tech = list("combat" = 4, "materials" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 6500, MAT_SILVER = 500)
build_path = /obj/item/weaponcrafting/reciever
diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm
index d48ed0b2974..958dd671d4d 100644
--- a/code/modules/research/destructive_analyzer.dm
+++ b/code/modules/research/destructive_analyzer.dm
@@ -65,5 +65,5 @@ Note: Must be placed within 3 tiles of the R&D Console
user << "You add the [O.name] to the [src.name]!"
flick("d_analyzer_la", src)
spawn(10)
+ icon_state = "d_analyzer_l"
busy = 0
-
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 62216b39872..eff680d02c9 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -129,9 +129,6 @@
if (temp_tech.len == 0)
user << "You cannot experiment on this item!"
return
- if(O.reliability < 90 && O.crit_fail == 0)
- usr << "Item is neither reliable enough or broken enough to learn from."
- return
if(!user.drop_item())
return
loaded_item = O
@@ -484,16 +481,11 @@
investigate_log("Experimentor has spawned a new corgi.", "experimentor")
ejectItem(TRUE)
if(globalMalf > 36 && globalMalf < 50)
- visible_message("[src] improves [exp_on], drawing the life essence of those nearby!")
+ visible_message("Experimentor draws the life essence of those nearby!")
for(var/mob/living/m in view(4,src))
m << "You feel your flesh being torn from you, mists of blood drifting to [src]!"
m.apply_damage(50,"brute","chest")
investigate_log("Experimentor has taken 50 brute a blood sacrifice from [m]", "experimentor")
- var/list/reqs = ConvertReqString2List(exp_on.origin_tech)
- for(var/T in reqs)
- reqs[T] = reqs[T] + 1
- exp_on.origin_tech = list2params(reqs)
- investigate_log("Experimentor has set the origin tech of [exp_on] to [exp_on.origin_tech]", "experimentor")
if(globalMalf > 51 && globalMalf < 75)
visible_message("[src] encounters a run-time error!")
throwSmoke(src.loc)
@@ -557,7 +549,6 @@
var/list/temp_tech = ConvertReqString2List(process.origin_tech)
for(var/T in temp_tech)
linked_console.files.UpdateTech(T, temp_tech[T])
- linked_console.files.UpdateDesigns(process,temp_tech)
src.updateUsrDialog()
return
@@ -609,6 +600,7 @@
name = realName
cooldownMax = rand(60,300)
realProc = pick("teleport","explode","rapidDupe","petSpray","flash","clean","corgicannon")
+ origin_tech = pick("engineering=[rand(2,5)]","magnets=[rand(2,5)]","plasmatech=[rand(2,5)]","programming=[rand(2,5)]","powerstorage=[rand(2,5)]")
/obj/item/weapon/relic/attack_self(mob/user)
if(revealed)
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index 7099699fb5a..ff1e2ef9c75 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -60,10 +60,10 @@ Note: Must be placed west/left of and R&D console to function.
for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
T += M.rating
materials.max_amount = T * 75000
- T = 0
+ T = 1.2
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
- T += (M.rating/3)
- efficiency_coeff = max(T, 1)
+ T -= M.rating/10
+ efficiency_coeff = min(max(0, T), 1)
/obj/machinery/r_n_d/protolathe/proc/check_mat(datum/design/being_built, M) // now returns how many times the item can be built with the material
var/A = materials.amount(M)
@@ -90,7 +90,7 @@ Note: Must be placed west/left of and R&D console to function.
if(istype(O,/obj/item/stack/sheet))
. = 1
- if(!is_insertion_ready(user))
+ if(!is_insertion_ready(user) || busy)
return
if(!materials.has_space( materials.get_item_material_amount(O) ))
user << "The [src.name]'s material bin is full! Please remove material before adding more."
diff --git a/code/modules/research/rd-readme.dm b/code/modules/research/rd-readme.dm
index 5c42b3e930b..9c06d43a3b4 100644
--- a/code/modules/research/rd-readme.dm
+++ b/code/modules/research/rd-readme.dm
@@ -22,7 +22,7 @@ materials.
While researching you are dealing with two different types of information: Technology Paths and Device Designs. Technology Paths
are the "Tech Trees" of the game. You start out with a number of them at the game start and they are improved by using the
Destructive Analyzer. By themselves, they don't do a whole lot. However, they unlock Device Designs. This is the information used
-by the circuit imprinter and the protolathe to produce objects. It also tracks the current reliability of that particular design.
+by the circuit imprinter and the protolathe to produce objects.
//EXISTING TECH
Each tech path should have at LEAST one item at every level (levels 1 - 20). This is to allow for a more fluid progression of the
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 7a191dcab46..6b73ffa3f02 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -250,60 +250,63 @@ proc/CallMaterialName(ID)
linked_destroy.loaded_item.loc = linked_destroy.loc
linked_destroy.loaded_item = null
linked_destroy.icon_state = "d_analyzer"
- screen = 2.1
+ screen = 1.0
else if(href_list["deconstruct"]) //Deconstruct the item in the destructive analyzer and update the research holder.
if(linked_destroy)
if(linked_destroy.busy)
usr << "The destructive analyzer is busy at the moment."
- else
- var/choice = input("Proceeding will destroy loaded item.") in list("Proceed", "Cancel")
+ return
+ var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech)
+ var/cancontinue = FALSE
+ for(var/T in temp_tech)
+ if(files.IsTechHigher(T, temp_tech[T]))
+ cancontinue = TRUE
+ break
+ if(!cancontinue)
+ var/choice = input("This item does not raise tech levels. Proceed destroying loaded item anyway?") in list("Proceed", "Cancel")
if(choice == "Cancel" || !linked_destroy) return
- linked_destroy.busy = 1
- screen = 0.1
- updateUsrDialog()
- flick("d_analyzer_process", linked_destroy)
- spawn(24)
- if(linked_destroy)
- linked_destroy.busy = 0
- if(!linked_destroy.hacked)
- if(!linked_destroy.loaded_item)
- usr <<"The destructive analyzer appears to be empty."
- screen = 1.0
- return
- if((linked_destroy.loaded_item.reliability >= 99 - (linked_destroy.decon_mod * 3)) || linked_destroy.loaded_item.crit_fail)
- var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech)
- for(var/T in temp_tech)
- if(prob(linked_destroy.loaded_item.reliability)) //If deconstructed item is not reliable enough its just being wasted, else it is pocessed
- files.UpdateTech(T, temp_tech[T]) //Check if deconstructed item has research levels higher/same/one less than current ones
- files.UpdateDesigns(linked_destroy.loaded_item, temp_tech, src) //If if such reseach type found all the known designs are checked for having this research type in them
- screen = 1.0 //If design have it it gains some reliability
- else //Same design always gain quality
- screen = 2.3 //Crit fail gives the same design a lot of reliability, like really a lot
- if(linked_lathe) //Also sends salvaged materials to a linked protolathe, if any.
- for(var/material in linked_destroy.loaded_item.materials)
- linked_lathe.materials.insert_amount(min((linked_lathe.materials.max_amount - linked_lathe.materials.total_amount), (linked_destroy.loaded_item.materials[material]*(linked_destroy.decon_mod/10))), material)
- feedback_add_details("item_deconstructed","[linked_destroy.loaded_item.type]")
- linked_destroy.loaded_item = null
- else
- screen = 1.0
- for(var/obj/I in linked_destroy.contents)
- for(var/mob/M in I.contents)
- M.death()
- if(istype(I,/obj/item/stack/sheet))//Only deconsturcts one sheet at a time instead of the entire stack
- var/obj/item/stack/sheet/S = I
- if(S.amount > 1)
- S.amount--
- linked_destroy.loaded_item = S
- else
- qdel(S)
- linked_destroy.icon_state = "d_analyzer"
+ linked_destroy.busy = 1
+ screen = 0.1
+ updateUsrDialog()
+ flick("d_analyzer_process", linked_destroy)
+ spawn(24)
+ if(linked_destroy)
+ linked_destroy.busy = 0
+ if(!linked_destroy.loaded_item)
+ usr <<"The destructive analyzer appears to be empty."
+ screen = 1.0
+ return
+
+ for(var/T in temp_tech)
+ var/datum/tech/KT = files.known_tech[T] //For stat logging of high levels
+ if(files.IsTechHigher(T, temp_tech[T]) && KT.level >= 5) //For stat logging of high levels
+ feedback_add_details("high_research_level","[KT][KT.level + 1]") //+1 to show the level which we're about to get
+ files.UpdateTech(T, temp_tech[T])
+
+ if(linked_lathe) //Also sends salvaged materials to a linked protolathe, if any.
+ for(var/material in linked_destroy.loaded_item.materials)
+ linked_lathe.materials.insert_amount(min((linked_lathe.materials.max_amount - linked_lathe.materials.total_amount), (linked_destroy.loaded_item.materials[material]*(linked_destroy.decon_mod/10))), material)
+ feedback_add_details("item_deconstructed","[linked_destroy.loaded_item.type]")
+ linked_destroy.loaded_item = null
+ for(var/obj/I in linked_destroy.contents)
+ for(var/mob/M in I.contents)
+ M.death()
+ if(istype(I,/obj/item/stack/sheet))//Only deconsturcts one sheet at a time instead of the entire stack
+ var/obj/item/stack/sheet/S = I
+ if(S.amount > 1)
+ S.amount--
+ linked_destroy.loaded_item = S
else
- if(!(I in linked_destroy.component_parts))
- qdel(I)
- linked_destroy.icon_state = "d_analyzer"
- use_power(250)
- updateUsrDialog()
+ qdel(S)
+ linked_destroy.icon_state = "d_analyzer"
+ else
+ if(!(I in linked_destroy.component_parts))
+ qdel(I)
+ linked_destroy.icon_state = "d_analyzer"
+ screen = 1.0
+ use_power(250)
+ updateUsrDialog()
else if(href_list["lock"]) //Lock the console from use by anyone without tox access.
if(src.allowed(usr))
@@ -350,15 +353,12 @@ proc/CallMaterialName(ID)
sync = !sync
else if(href_list["build"]) //Causes the Protolathe to build something.
- var/coeff
-
- if(linked_lathe)
- coeff = linked_lathe.efficiency_coeff
- else
- coeff = 1
-
- var/g2g = 1
if(linked_lathe)
+ if(linked_lathe.busy)
+ usr << "Protolathe is busy at the moment."
+ return
+ var/coeff = linked_lathe.efficiency_coeff
+ var/g2g = 1
var/datum/design/being_built = files.known_designs[href_list["build"]]
if(being_built)
var/power = 2000
@@ -369,15 +369,11 @@ proc/CallMaterialName(ID)
power += round(being_built.materials[M] * amount / 5)
power = max(2000, power)
screen = 0.3
- if(linked_lathe.busy)
- g2g = 0
var/key = usr.key //so we don't lose the info during the spawn delay
if (!(being_built.build_type & PROTOLATHE))
g2g = 0
message_admins("Protolathe exploit attempted by [key_name(usr, usr.client)]!")
-
-
if (g2g) //If input is incorrect, nothing happens
var/enough_materials = 1
linked_lathe.busy = 1
@@ -386,7 +382,7 @@ proc/CallMaterialName(ID)
var/list/efficient_mats = list()
for(var/MAT in being_built.materials)
- efficient_mats[MAT] = being_built.materials[MAT]
+ efficient_mats[MAT] = being_built.materials[MAT]*coeff
if(!linked_lathe.materials.has_materials(efficient_mats, amount))
src.visible_message("The [src.name] beeps, \"Not enough materials to complete prototype.\"")
@@ -394,7 +390,7 @@ proc/CallMaterialName(ID)
g2g = 0
else
for(var/R in being_built.reagents)
- if(!linked_lathe.reagents.has_reagent(R, being_built.reagents[R]))
+ if(!linked_lathe.reagents.has_reagent(R, being_built.reagents[R])*coeff)
src.visible_message("The [src.name] beeps, \"Not enough reagents to complete prototype.\"")
enough_materials = 0
g2g = 0
@@ -402,33 +398,37 @@ proc/CallMaterialName(ID)
if(enough_materials)
linked_lathe.materials.use_amount(efficient_mats, amount)
for(var/R in being_built.reagents)
- linked_lathe.reagents.remove_reagent(R, being_built.reagents[R])
+ linked_lathe.reagents.remove_reagent(R, being_built.reagents[R]*coeff)
var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes.
- var/R = being_built.reliability
- spawn(32*amount/coeff)
- if(g2g) //And if we only fail the material requirements, we still spend time and power
- var/already_logged = 0
- for(var/i = 0, iThe [src.name] beeps, \"Something went wrong, production halted!\"")
+ screen = 1.0
updateUsrDialog()
else if(href_list["imprint"]) //Causes the Circuit Imprinter to build something.
+ var/coeff = linked_imprinter.efficiency_coeff
var/g2g = 1
if(linked_imprinter)
+ if(linked_lathe.busy)
+ usr << "Circuit Imprinter is busy at the moment."
+ return
var/datum/design/being_built = files.known_designs[href_list["imprint"]]
if(being_built)
var/power = 2000
@@ -437,8 +437,6 @@ proc/CallMaterialName(ID)
power += round(being_built.materials[M] / 5)
power = max(2000, power)
screen = 0.4
- if (linked_imprinter.busy)
- g2g = 0
if (!(being_built.build_type & IMPRINTER))
g2g = 0
message_admins("Circuit imprinter exploit attempted by [key_name(usr, usr.client)]!")
@@ -455,24 +453,26 @@ proc/CallMaterialName(ID)
break
switch(M)
if(MAT_GLASS)
- linked_imprinter.g_amount = max(0, (linked_imprinter.g_amount-being_built.materials[M]))
+ linked_imprinter.g_amount = max(0, (linked_imprinter.g_amount-being_built.materials[M]/coeff))
if(MAT_GOLD)
- linked_imprinter.gold_amount = max(0, (linked_imprinter.gold_amount-being_built.materials[M]))
+ linked_imprinter.gold_amount = max(0, (linked_imprinter.gold_amount-being_built.materials[M]/coeff))
if(MAT_DIAMOND)
- linked_imprinter.diamond_amount = max(0, (linked_imprinter.diamond_amount-being_built.materials[M]))
+ linked_imprinter.diamond_amount = max(0, (linked_imprinter.diamond_amount-being_built.materials[M]/coeff))
else
- linked_imprinter.reagents.remove_reagent(M, being_built.materials[M])
+ linked_imprinter.reagents.remove_reagent(M, being_built.materials[M]/coeff)
var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes.
- var/R = being_built.reliability
spawn(16)
- if(g2g)
- var/obj/item/new_item = new P(src)
- new_item.reliability = R
- new_item.loc = linked_imprinter.loc
- feedback_add_details("circuit_printed","[new_item.type]")
- linked_imprinter.busy = 0
- screen = old_screen
+ if(linked_imprinter)
+ if(g2g)
+ var/obj/item/new_item = new P(src)
+ new_item.loc = linked_imprinter.loc
+ feedback_add_details("circuit_printed","[new_item.type]")
+ screen = old_screen
+ linked_imprinter.busy = 0
+ else
+ src.visible_message("The [src.name] beeps, \"Something went wrong, production halted!\"")
+ screen = 1.0
updateUsrDialog()
else if(href_list["disposeI"] && linked_imprinter) //Causes the circuit imprinter to dispose of a single reagent (all of it)
@@ -701,7 +701,6 @@ proc/CallMaterialName(ID)
dat += "Load Design to Disk"
else
dat += "Name: [d_disk.blueprint.name] "
- dat += "Level: [d_disk.blueprint.reliability] "
var/b_type = d_disk.blueprint.build_type
if(b_type)
dat += "Lathe Types: "
@@ -776,7 +775,6 @@ proc/CallMaterialName(ID)
dat += "Main Menu
"
dat += "
Deconstruction Menu
"
dat += "Name: [linked_destroy.loaded_item.name] "
- dat += "Reliability: [linked_destroy.loaded_item.reliability] "
dat += "Origin Tech: "
var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech)
for(var/T in temp_tech)
@@ -825,6 +823,7 @@ proc/CallMaterialName(ID)
dat += "Material Amount: [linked_lathe.materials.total_amount] / [linked_lathe.materials.max_amount] "
dat += "Chemical Volume: [linked_lathe.reagents.total_volume] / [linked_lathe.reagents.maximum_volume]"
+ var/coeff = linked_lathe.efficiency_coeff
for(var/v in files.known_designs)
var/datum/design/D = files.known_designs[v]
if(!(selected_category in D.category)|| !(D.build_type & PROTOLATHE))
@@ -836,18 +835,18 @@ proc/CallMaterialName(ID)
t = linked_lathe.check_mat(D, M)
temp_material += " | "
if (t < 1)
- temp_material += "[D.materials[M]] [CallMaterialName(M)]"
+ temp_material += "[D.materials[M]*coeff] [CallMaterialName(M)]"
else
- temp_material += " [D.materials[M]] [CallMaterialName(M)]"
+ temp_material += " [D.materials[M]*coeff] [CallMaterialName(M)]"
c = min(c,t)
for(var/R in D.reagents)
t = linked_lathe.check_mat(D, R)
temp_material += " | "
if (t < 1)
- temp_material += "[D.reagents[R]] [CallMaterialName(R)]"
+ temp_material += "[D.reagents[R]*coeff] [CallMaterialName(R)]"
else
- temp_material += " [D.reagents[R]] [CallMaterialName(R)]"
+ temp_material += " [D.reagents[R]*coeff] [CallMaterialName(R)]"
c = min(c,t)
if (c >= 1)
@@ -869,6 +868,7 @@ proc/CallMaterialName(ID)
dat += "Material Amount: [linked_lathe.materials.total_amount] / [linked_lathe.materials.max_amount] "
dat += "Chemical Volume: [linked_lathe.reagents.total_volume] / [linked_lathe.reagents.maximum_volume]"
+ var/coeff = linked_lathe.efficiency_coeff
for(var/datum/design/D in matching_designs)
var/temp_material
var/c = 50
@@ -877,9 +877,9 @@ proc/CallMaterialName(ID)
t = linked_lathe.check_mat(D, M)
temp_material += " | "
if (t < 1)
- temp_material += "[D.materials[M]] [CallMaterialName(M)]"
+ temp_material += "[D.materials[M]*coeff] [CallMaterialName(M)]"
else
- temp_material += " [D.materials[M]] [CallMaterialName(M)]"
+ temp_material += " [D.materials[M]*coeff] [CallMaterialName(M)]"
c = min(c,t)
if (c >= 1)
@@ -994,6 +994,7 @@ proc/CallMaterialName(ID)
dat += "Material Amount: [linked_imprinter.TotalMaterials()] "
dat += "Chemical Volume: [linked_imprinter.reagents.total_volume]"
+ var/coeff = linked_imprinter.efficiency_coeff
for(var/v in files.known_designs)
var/datum/design/D = files.known_designs[v]
if(!(selected_category in D.category) || !(D.build_type & IMPRINTER))
@@ -1004,9 +1005,9 @@ proc/CallMaterialName(ID)
temp_materials += " | "
if (!linked_imprinter.check_mat(D, M))
check_materials = 0
- temp_materials += " [D.materials[M]] [CallMaterialName(M)]"
+ temp_materials += " [D.materials[M]/coeff] [CallMaterialName(M)]"
else
- temp_materials += " [D.materials[M]] [CallMaterialName(M)]"
+ temp_materials += " [D.materials[M]/coeff] [CallMaterialName(M)]"
if (check_materials)
dat += "[D.name][temp_materials] "
else
@@ -1020,6 +1021,7 @@ proc/CallMaterialName(ID)
dat += "Material Amount: [linked_imprinter.TotalMaterials()] "
dat += "Chemical Volume: [linked_imprinter.reagents.total_volume]"
+ var/coeff = linked_imprinter.efficiency_coeff
for(var/datum/design/D in matching_designs)
var/temp_materials
var/check_materials = 1
@@ -1027,9 +1029,9 @@ proc/CallMaterialName(ID)
temp_materials += " | "
if (!linked_imprinter.check_mat(D, M))
check_materials = 0
- temp_materials += " [D.materials[M]] [CallMaterialName(M)]"
+ temp_materials += " [D.materials[M]/coeff] [CallMaterialName(M)]"
else
- temp_materials += " [D.materials[M]] [CallMaterialName(M)]"
+ temp_materials += " [D.materials[M]/coeff] [CallMaterialName(M)]"
if (check_materials)
dat += "[D.name][temp_materials] "
else
diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm
index 9aff35065bd..130fce1f03f 100644
--- a/code/modules/research/research.dm
+++ b/code/modules/research/research.dm
@@ -49,8 +49,8 @@ research holder datum.
//Datum/tech go here.
var/list/possible_tech = list() //List of all tech in the game that players have access to (barring special events).
var/list/known_tech = list() //List of locally known tech.
- var/list/possible_designs = list() //List of all designs (at base reliability).
- var/list/known_designs = list() //List of available designs (at base reliability).
+ var/list/possible_designs = list() //List of all designs.
+ var/list/known_designs = list() //List of available designs.
/datum/research/New() //Insert techs into possible_tech here. Known_tech automatically updated.
for(var/T in subtypesof(/datum/tech))
@@ -93,13 +93,10 @@ research holder datum.
/datum/research/proc/AddDesign2Known(datum/design/D)
if(known_designs[D.id])
- var/datum/design/known = known_designs[D.id]
- if(D.reliability > known.reliability)
- known.reliability = D.reliability
return
known_designs[D.id] = D
-//Refreshes known_tech and known_designs list. Then updates the reliability vars of the designs in the known_designs list.
+//Refreshes known_tech and known_designs list.
//Input/Output: n/a
/datum/research/proc/RefreshResearch()
for(var/datum/tech/PT in possible_tech)
@@ -113,10 +110,6 @@ research holder datum.
for(var/v in known_tech)
var/datum/tech/T = known_tech[v]
T.level = Clamp(T.level, 0, 20)
-
- for(var/v in known_designs)
- var/datum/design/D = known_designs[v]
- D.CalcReliability(known_tech)
return
//Refreshes the levels of a given tech.
@@ -125,18 +118,17 @@ research holder datum.
var/datum/tech/KT = known_tech[ID]
if(KT)
if(KT.level <= level)
- KT.level = max((KT.level + 1), (level - 1))
+ KT.level = KT.level + 1
-/datum/research/proc/UpdateDesigns(obj/item/I, list/temp_tech)
- for(var/v in known_designs)
- var/datum/design/D = known_designs[v]
- var/shared_tech = length(temp_tech & D.req_tech)
- if(shared_tech)
- D.reliability = min(100, D.reliability + shared_tech)
- if(D.build_path == I.type)
- D.reliability = min(100, D.reliability + shared_tech * rand(1,3))
- if(I.crit_fail)
- D.reliability = min(100, D.reliability + shared_tech * rand(3, 5))
+//Checks if the origin level can raise current tech levels
+//Input: Tech's ID and Level; Output: TRUE for yes, FALSE for no
+/datum/research/proc/IsTechHigher(ID, level)
+ var/datum/tech/KT = known_tech[ID]
+ if(KT)
+ if(KT.level <= level)
+ return TRUE
+ else
+ return FALSE
/datum/research/proc/FindDesignByID(id)
return known_designs[id]
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 1e5e26d41ce..e57becb8253 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -241,7 +241,7 @@
temp_server.files.RefreshResearch()
else if(href_list["reset_design"])
- var/choice = alert("Design Data Deletion", "Are you sure you want to delete this design? If you still have the prerequisites for the design, it'll reset to its base reliability. Data lost cannot be recovered.", "Continue", "Cancel")
+ var/choice = alert("Design Data Deletion", "Are you sure you want to delete this design? Data lost cannot be recovered.", "Continue", "Cancel")
if(choice == "Continue")
var/datum/design/D = temp_server.files.known_designs[href_list["reset_design"]]
if(D)
diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm
index f35a8196405..9f8e6a580b5 100644
--- a/code/modules/research/stock_parts.dm
+++ b/code/modules/research/stock_parts.dm
@@ -21,12 +21,11 @@
/obj/item/weapon/storage/part_replacer/afterattack(obj/machinery/T, mob/living/carbon/human/user, flag, params)
if(flag)
return
- else
- if(works_from_distance)
- if(istype(T))
- if(T.component_parts)
- T.exchange_parts(user, src)
- user.Beam(T,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5)
+ else if(works_from_distance)
+ if(istype(T))
+ if(T.component_parts)
+ T.exchange_parts(user, src)
+ user.Beam(T,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5)
return
/obj/item/weapon/storage/part_replacer/bluespace
@@ -167,7 +166,7 @@
name = "super capacitor"
desc = "A super-high capacity capacitor used in the construction of a variety of devices."
icon_state = "super_capacitor"
- origin_tech = "powerstorage=5;materials=4"
+ origin_tech = "powerstorage=4;engineering=4"
rating = 3
materials = list(MAT_METAL=50, MAT_GLASS=50)
@@ -175,7 +174,7 @@
name = "phasic scanning module"
desc = "A compact, high resolution phasic scanning module used in the construction of certain devices."
icon_state = "super_scan_module"
- origin_tech = "magnets=5"
+ origin_tech = "magnets=4;engineering=4"
rating = 3
materials = list(MAT_METAL=50, MAT_GLASS=20)
@@ -183,7 +182,7 @@
name = "pico-manipulator"
desc = "A tiny little manipulator used in the construction of certain devices."
icon_state = "pico_mani"
- origin_tech = "materials=5;programming=2"
+ origin_tech = "materials=4;programming=4,engineering=4"
rating = 3
materials = list(MAT_METAL=30)
@@ -191,7 +190,7 @@
name = "ultra-high-power micro-laser"
icon_state = "ultra_high_micro_laser"
desc = "A tiny laser used in certain devices."
- origin_tech = "magnets=5"
+ origin_tech = "magnets=4;engineering=4"
rating = 3
materials = list(MAT_METAL=10, MAT_GLASS=20)
@@ -199,7 +198,7 @@
name = "super matter bin"
desc = "A container designed to hold compressed matter awaiting reconstruction."
icon_state = "super_matter_bin"
- origin_tech = "materials=5"
+ origin_tech = "materials=4;engineering=4"
rating = 3
materials = list(MAT_METAL=80)
@@ -209,7 +208,7 @@
name = "quadratic capacitor"
desc = "An capacity capacitor used in the construction of a variety of devices."
icon_state = "quadratic_capacitor"
- origin_tech = "powerstorage=6;materials=5"
+ origin_tech = "powerstorage=5;materials=4;engineering=4"
rating = 4
materials = list(MAT_METAL=50, MAT_GLASS=50)
@@ -217,7 +216,7 @@
name = "triphasic scanning module"
desc = "A compact, ultra resolution triphasic scanning module used in the construction of certain devices."
icon_state = "triphasic_scan_module"
- origin_tech = "magnets=6"
+ origin_tech = "magnets=5;materials=4;engineering=4"
rating = 4
materials = list(MAT_METAL=50, MAT_GLASS=20)
@@ -225,7 +224,7 @@
name = "femto-manipulator"
desc = "A tiny little manipulator used in the construction of certain devices."
icon_state = "femto_mani"
- origin_tech = "materials=6;programming=3"
+ origin_tech = "materials=6;programming=4;engineering=4"
rating = 4
materials = list(MAT_METAL=30)
@@ -233,7 +232,7 @@
name = "quad-ultra micro-laser"
icon_state = "quadultra_micro_laser"
desc = "A tiny laser used in certain devices."
- origin_tech = "magnets=6"
+ origin_tech = "magnets=5;materials=4;engineering=4"
rating = 4
materials = list(MAT_METAL=10, MAT_GLASS=20)
@@ -241,7 +240,7 @@
name = "bluespace matter bin"
desc = "A container designed to hold compressed matter awaiting reconstruction."
icon_state = "bluespace_matter_bin"
- origin_tech = "materials=6"
+ origin_tech = "materials=6;programming=4;engineering=4"
rating = 4
materials = list(MAT_METAL=80)
@@ -251,49 +250,49 @@
name = "subspace ansible"
icon_state = "subspace_ansible"
desc = "A compact module capable of sensing extradimensional activity."
- origin_tech = "programming=2;magnets=3;materials=2;bluespace=1"
+ origin_tech = "programming=2;magnets=2;materials=2;bluespace=1"
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/weapon/stock_parts/subspace/filter
name = "hyperwave filter"
icon_state = "hyperwave_filter"
desc = "A tiny device capable of filtering and converting super-intense radiowaves."
- origin_tech = "programming=2;magnets=1"
+ origin_tech = "programming=2;magnets=2"
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/weapon/stock_parts/subspace/amplifier
name = "subspace amplifier"
icon_state = "subspace_amplifier"
desc = "A compact micro-machine capable of amplifying weak subspace transmissions."
- origin_tech = "programming=2;magnets=2;materials=2;bluespace=1"
+ origin_tech = "programming=2;magnets=2;materials=2;bluespace=2"
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/weapon/stock_parts/subspace/treatment
name = "subspace treatment disk"
icon_state = "treatment_disk"
desc = "A compact micro-machine capable of stretching out hyper-compressed radio waves."
- origin_tech = "programming=2;magnets=1;materials=3;bluespace=1"
+ origin_tech = "programming=2;magnets=2;materials=2;bluespace=2"
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/weapon/stock_parts/subspace/analyzer
name = "subspace wavelength analyzer"
icon_state = "wavelength_analyzer"
desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths."
- origin_tech = "programming=2;magnets=2;materials=2;bluespace=1"
+ origin_tech = "programming=2;magnets=2;materials=2;bluespace=2"
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/weapon/stock_parts/subspace/crystal
name = "ansible crystal"
icon_state = "ansible_crystal"
desc = "A crystal made from pure glass used to transmit laser databursts to subspace."
- origin_tech = "magnets=2;materials=2;bluespace=1"
+ origin_tech = "magnets=2;materials=2;bluespace=2;plasmatech=2"
materials = list(MAT_GLASS=50)
/obj/item/weapon/stock_parts/subspace/transmitter
name = "subspace transmitter"
icon_state = "subspace_transmitter"
desc = "A large piece of equipment used to open a window into the subspace dimension."
- origin_tech = "magnets=3;materials=3;bluespace=2"
+ origin_tech = "magnets=2;materials=2;bluespace=2"
materials = list(MAT_METAL=50)
/obj/item/weapon/research//Makes testing much less of a pain -Sieve
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index a5a89cd91d8..6103948a1e9 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -160,7 +160,7 @@
desc = "A miraculous chemical mix that can raise the intelligence of creatures to human levels. Unlike normal slime potions, it can be absorbed by any nonsentient being."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle19"
- origin_tech = "biotech=5"
+ origin_tech = "biotech=6"
var/list/not_interested = list()
var/being_used = 0
var/sentience_type = SENTIENCE_ORGANIC
@@ -326,6 +326,7 @@
desc = "A potent chemical mix that will remove the slowdown from any item."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
+ origin_tech = "biotech=5"
/obj/item/slimepotion/speed/afterattack(obj/C, mob/user)
..()
@@ -356,6 +357,7 @@
desc = "A potent chemical mix that will fireproof any article of clothing. Has three uses."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle17"
+ origin_tech = "biotech=5"
var/uses = 3
/obj/item/slimepotion/fireproof/afterattack(obj/item/clothing/C, mob/user)
@@ -662,4 +664,3 @@
for(var/turf/T in A)
T.color = "#2956B2"
qdel(src)
-
diff --git a/code/modules/shuttle/manipulator.dm b/code/modules/shuttle/manipulator.dm
index dd59412b055..3e0bf8633a2 100644
--- a/code/modules/shuttle/manipulator.dm
+++ b/code/modules/shuttle/manipulator.dm
@@ -55,6 +55,8 @@
. = "docked"
if(SHUTTLE_STRANDED)
. = "stranded"
+ if(SHUTTLE_ESCAPE)
+ . = "escape"
if(SHUTTLE_ENDGAME)
. = "endgame"
if(!.)
@@ -105,6 +107,10 @@
L["id"] = M.id
L["timer"] = M.timer
L["timeleft"] = M.getTimerStr()
+ var/can_fast_travel = FALSE
+ if(M.timer && M.timeLeft() >= 50)
+ can_fast_travel = TRUE
+ L["can_fast_travel"] = can_fast_travel
L["mode"] = capitalize(shuttlemode2str(M.mode))
L["status"] = M.getStatusText()
if(M == existing_shuttle)
@@ -132,12 +138,23 @@
. = TRUE
if("jump_to")
if(params["type"] == "mobile")
- . = TRUE
for(var/i in SSshuttle.mobile)
var/obj/docking_port/mobile/M = i
if(M.id == params["id"])
user.forceMove(get_turf(M))
+ . = TRUE
break
+ if("fast_travel")
+ for(var/i in SSshuttle.mobile)
+ var/obj/docking_port/mobile/M = i
+ if(M.id == params["id"] && M.timer && M.timeLeft() >= 50)
+ M.setTimer(50)
+ . = TRUE
+ message_admins("[key_name_admin(usr)] fast travelled \
+ [M]")
+ log_admin("[key_name(usr)] fast travelled [M]")
+ feedback_add_details("shuttle_fasttravel", M.name)
+ break
if("preview")
if(S)
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index a13204e8f9a..3cdf2328b19 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -149,7 +149,7 @@
name = "arm-mounted laser implant"
desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arm and remains inside when not in use."
icon_state = "arm_laser"
- origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4;syndicate=5"//this is kinda nutty and i might lower it
+ origin_tech = "materials=4;combat=4;biotech=4;powerstorage=4;syndicate=3"
holder = /obj/item/weapon/gun/energy/laser/mounted
/obj/item/organ/cyberimp/arm/gun/laser/l/zone = "l_arm"
@@ -168,7 +168,7 @@
/obj/item/organ/cyberimp/arm/toolset
name = "integrated toolset implant"
desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm. Contains all neccessary tools."
- origin_tech = "materials=4;engineering=4;biotech=3;powerstorage=4"
+ origin_tech = "materials=3;engineering=4;biotech=3;powerstorage=4"
contents = newlist(/obj/item/weapon/screwdriver/cyborg, /obj/item/weapon/wrench/cyborg, /obj/item/weapon/weldingtool/largetank/cyborg,
/obj/item/weapon/crowbar/cyborg, /obj/item/weapon/wirecutters/cyborg, /obj/item/device/multitool/cyborg)
@@ -179,4 +179,4 @@
usr << "You unlock [src]'s integrated knife!"
items_list += new /obj/item/weapon/kitchen/knife/combat/cyborg(src)
return 1
- return 0
\ No newline at end of file
+ return 0
diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm
index 74e50bc12fd..c2d7fc0efa0 100644
--- a/code/modules/surgery/organs/augments_chest.dm
+++ b/code/modules/surgery/organs/augments_chest.dm
@@ -14,7 +14,7 @@
var/synthesizing = 0
var/poison_amount = 5
slot = "stomach"
- origin_tech = "materials=5;programming=3;biotech=4"
+ origin_tech = "materials=4;powerstorage=5;biotech=4"
/obj/item/organ/cyberimp/chest/nutriment/on_life()
if(synthesizing)
@@ -41,16 +41,14 @@
implant_color = "#006607"
hunger_threshold = NUTRITION_LEVEL_HUNGRY
poison_amount = 10
- origin_tech = "materials=5;programming=3;biotech=5"
-
-
+ origin_tech = "materials=4;powerstorage=5;biotech=5"
/obj/item/organ/cyberimp/chest/reviver
name = "Reviver implant"
desc = "This implant will attempt to revive you if you lose consciousness. For the faint of heart!"
icon_state = "chest_implant"
implant_color = "#AD0000"
- origin_tech = "materials=6;programming=3;biotech=6;syndicate=4"
+ origin_tech = "materials=5;programming=4;biotech=6"
slot = "heartdrive"
var/revive_cost = 0
var/reviving = 0
@@ -114,7 +112,7 @@
Unlike regular jetpack, this device has no stablilzation system."
slot = "thrusters"
icon_state = "imp_jetpack"
- origin_tech = "materials=6;programming=4;magnets=3;biotech=4;engineering=4"
+ origin_tech = "materials=4;magnets=4;biotech=4;engineering=5"
implant_overlay = null
implant_color = null
actions_types = list(/datum/action/item_action/organ_action/toggle)
@@ -193,4 +191,4 @@
T.assume_air(removed)
toggle(silent=1)
- return 0
\ No newline at end of file
+ return 0
diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm
index e7432e89fa6..50c3875f258 100644
--- a/code/modules/surgery/organs/augments_eyes.dm
+++ b/code/modules/surgery/organs/augments_eyes.dm
@@ -50,7 +50,7 @@
desc = "These cybernetic eye implants will give you X-ray vision. Blinking is futile."
eye_color = "000"
implant_color = "#000000"
- origin_tech = "materials=6;programming=4;biotech=6;magnets=5"
+ origin_tech = "materials=4;programming=4;biotech=6;magnets=4"
dark_view = 8
sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS
@@ -59,7 +59,7 @@
desc = "These cybernetic eye implants will give you Thermal vision. Vertical slit pupil included."
eye_color = "FC0"
implant_color = "#FFCC00"
- origin_tech = "materials=6;programming=4;biotech=5;magnets=5;syndicate=4"
+ origin_tech = "materials=5;programming=4;biotech=4;magnets=4;syndicate=1"
sight_flags = SEE_MOBS
see_invisible = SEE_INVISIBLE_MINIMUM
flash_protect = -1
@@ -93,7 +93,7 @@
desc = "These cybernetic eye implants will display a medical HUD over everything you see."
eye_color = "0ff"
implant_color = "#00FFFF"
- origin_tech = "materials=4;programming=3;biotech=4"
+ origin_tech = "materials=4;programming=4;biotech=4"
aug_message = "You suddenly see health bars floating above people's heads..."
HUD_type = DATA_HUD_MEDICAL_ADVANCED
@@ -102,7 +102,7 @@
desc = "These cybernetic eye implants will display a security HUD over everything you see."
eye_color = "d00"
implant_color = "#CC0000"
- origin_tech = "materials=4;programming=4;biotech=3;combat=1"
+ origin_tech = "materials=4;programming=4;biotech=3;combat=3"
aug_message = "Job indicator icons pop up in your vision. That is not a certified surgeon..."
HUD_type = DATA_HUD_SECURITY_ADVANCED
@@ -112,11 +112,11 @@
name = "welding shield implant"
desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision."
slot = "eye_shield"
- origin_tech = "materials=4;biotech=3"
+ origin_tech = "materials=4;biotech=3;engineering=4;plasmatech=3"
implant_color = "#101010"
flash_protect = 2
aug_message = null
eye_color = null
/obj/item/organ/cyberimp/eyes/shield/emp_act(severity)
- return
\ No newline at end of file
+ return
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index 3dc5e743049..683a2a176a4 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -47,7 +47,7 @@
var/obj/item/r_hand_obj = null
implant_color = "#DE7E00"
slot = "brain_antidrop"
- origin_tech = "materials=5;programming=4;biotech=4"
+ origin_tech = "materials=4;programming=5;biotech=4"
actions_types = list(/datum/action/item_action/organ_action/toggle)
/obj/item/organ/cyberimp/brain/anti_drop/ui_action_click()
@@ -125,7 +125,7 @@
desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned."
implant_color = "#FFFF00"
slot = "brain_antistun"
- origin_tech = "materials=6;programming=4;biotech=5"
+ origin_tech = "materials=5;programming=4;biotech=5"
/obj/item/organ/cyberimp/brain/anti_stun/on_life()
..()
@@ -188,4 +188,4 @@
var/implant
while(contents.len <= amount + 1) // +1 for the autoimplanter.
implant = pick(boxed)
- new implant(src)
\ No newline at end of file
+ new implant(src)
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 1b47c0172f6..9e6f3e9dbae 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/surgery.dmi'
var/mob/living/carbon/owner = null
var/status = ORGAN_ORGANIC
- origin_tech = "biotech=2"
+ origin_tech = "biotech=3"
force = 1
w_class = 2
throwforce = 0
@@ -105,7 +105,7 @@
icon_state = "heart-on"
zone = "chest"
slot = "heart"
- origin_tech = "biotech=3"
+ origin_tech = "biotech=5"
var/beating = 1
var/icon_base = "heart"
attack_verb = list("beat", "thumped")
@@ -168,7 +168,7 @@
desc = "it needs to be pumped..."
icon_state = "cursedheart-off"
icon_base = "cursedheart"
- origin_tech = "biotech=5"
+ origin_tech = "biotech=6"
actions_types = list(/datum/action/item_action/organ_action/cursed_heart)
var/last_pump = 0
var/add_colour = TRUE //So we're not constantly recreating colour datums
@@ -435,7 +435,7 @@
name = "black tumor"
desc = "A tiny black mass with red tendrils trailing from it. It seems to shrivel in the light."
icon_state = "blacktumor"
- origin_tech = "biotech=4"
+ origin_tech = "biotech=5"
w_class = 1
zone = "head"
slot = "brain_tumor"
diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm
index d783434c582..67b1a888703 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -84,7 +84,7 @@
throw_speed = 2
throw_range = 5
materials = list(MAT_METAL=10000, MAT_GLASS=6000)
- origin_tech = "materials=1;biotech=1"
+ origin_tech = "biotech=1;combat=1"
attack_verb = list("attacked", "slashed", "sawed", "cut")
sharpness = IS_SHARP
diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm
index b4f1e9ff465..ae377c651c6 100644
--- a/code/modules/telesci/bscrystal.dm
+++ b/code/modules/telesci/bscrystal.dm
@@ -6,17 +6,15 @@
icon = 'icons/obj/telescience.dmi'
icon_state = "bluespace_crystal"
w_class = 1
- origin_tech = "bluespace=4;materials=3"
+ origin_tech = "bluespace=6;materials=3"
points = 50
var/blink_range = 8 // The teleport range when crushed/thrown at someone.
-
/obj/item/weapon/ore/bluespace_crystal/New()
..()
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
-
/obj/item/weapon/ore/bluespace_crystal/attack_self(mob/user)
user.visible_message("[user] crushes [src]!", "You crush [src]!")
PoolOrNew(/obj/effect/particle_effect/sparks, loc)
@@ -43,6 +41,6 @@
/obj/item/weapon/ore/bluespace_crystal/artificial
name = "artificial bluespace crystal"
desc = "An artificially made bluespace crystal, it looks delicate."
- origin_tech = "bluespace=2"
+ origin_tech = "bluespace=3;plasmatech=4"
blink_range = 4 // Not as good as the organic stuff!
- points = 0 // nice try
\ No newline at end of file
+ points = 0 // nice try
diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm
index 39a2d211b5d..3df5a057277 100644
--- a/code/modules/telesci/gps.dm
+++ b/code/modules/telesci/gps.dm
@@ -6,7 +6,7 @@ var/list/GPS_list = list()
icon_state = "gps-c"
w_class = 2
slot_flags = SLOT_BELT
- origin_tech = "programming=2;engineering=2"
+ origin_tech = "materials=2;magnets=3;bluespace=3"
var/gpstag = "COM0"
var/emped = 0
var/turf/locked_location
@@ -109,4 +109,4 @@ var/list/GPS_list = list()
/obj/item/device/gps/mining/internal
icon_state = "gps-m"
gpstag = "MINER"
- desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life."
\ No newline at end of file
+ desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life."
diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm
index 356c5ca354d..e0792514af8 100644
--- a/code/modules/vehicles/pimpin_ride.dm
+++ b/code/modules/vehicles/pimpin_ride.dm
@@ -1,5 +1,3 @@
-
-
//PIMP-CART
/obj/vehicle/janicart
name = "janicart (pimpin' ride)"
@@ -40,6 +38,7 @@
desc = "An upgrade for mobile janicarts."
icon = 'icons/obj/vehicles.dmi'
icon_state = "upgrade"
+ origin_tech = "materials=3;engineering=4"
/obj/vehicle/janicart/Moved(atom/OldLoc, Dir)
@@ -91,4 +90,3 @@
user.put_in_hands(mybag)
mybag = null
update_icon()
-
diff --git a/html/changelog.html b/html/changelog.html
index 2668467c12e..3f66e45582e 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,39 @@
-->
+
02 June 2016
+
Joan updated:
+
+
Closed false walls will block air.
+
+
Lati updated:
+
+
R&D required levels and origin tech levels have been rebalanced
+
Overall, items buildable in R&D have lower tech levels and items in other departments have their tech levels raised. Remember to use science goggles to see tech levels of items!
+
There are now level gates at high levels. R&D scientists will need help from others to get past these level gates.
+
Other departments such as hydroponics and genetics will be important to R&D's progress now and xenobio, mining and cargo are more important than before
+
Efficiency upgrades are back in R&D machines and tweaked to be less powerful in autolathes
+
Reliability has been removed from all items
+
Most bugs in R&D machines should be fixed
+
+
PKPenguin321 & Nienhaus updated:
+
+
Letterman jackets are now available from the ClothesMate.
+
+
Quiltyquilty updated:
+
+
The bar has seen a redesign.
+
+
coiax updated:
+
+
Clone pods now notify the medical channel on a successful clone. They also notify the medical channel if the clone dies or is horribly mutilated; but not if it is ejected early by authorised medical personnel.
+
Cloning pods now are more capable of cloning humanoid species that do not breathe.
+
You can only be damaged once by a shuttle's arrival. It is still unpleasant to be in the path of one though; try to avoid it.
+
Adds Asteroid emergency shuttle to shuttle templates. It is a very oddly shaped one though, it might not be compatible with all stations.
+
The Chaplain soulshard can only turn a body into a shade once. A released shade can still be reabsorbed by the stone to heal it.
+
The shuttle manipulator now has a Fast Travel button, for those admins that really want a shuttle to get to where its going FAST.
+
+
01 June 2016
coiax updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 87cbb5f910f..9e532fa5765 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -5247,3 +5247,37 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: Added a mirror to the beach biodome. Beach Bums, rejoyce!
pudl:
- rscadd: The brig infirmary has received a redesign.
+2016-06-02:
+ Joan:
+ - tweak: Closed false walls will block air.
+ Lati:
+ - rscadd: R&D required levels and origin tech levels have been rebalanced
+ - experiment: Overall, items buildable in R&D have lower tech levels and items in
+ other departments have their tech levels raised. Remember to use science goggles
+ to see tech levels of items!
+ - tweak: There are now level gates at high levels. R&D scientists will need help
+ from others to get past these level gates.
+ - tweak: Other departments such as hydroponics and genetics will be important to
+ R&D's progress now and xenobio, mining and cargo are more important than before
+ - tweak: Efficiency upgrades are back in R&D machines and tweaked to be less powerful
+ in autolathes
+ - rscdel: Reliability has been removed from all items
+ - bugfix: Most bugs in R&D machines should be fixed
+ PKPenguin321 & Nienhaus:
+ - rscadd: Letterman jackets are now available from the ClothesMate.
+ Quiltyquilty:
+ - rscadd: The bar has seen a redesign.
+ coiax:
+ - rscadd: Clone pods now notify the medical channel on a successful clone. They
+ also notify the medical channel if the clone dies or is horribly mutilated;
+ but not if it is ejected early by authorised medical personnel.
+ - rscadd: Cloning pods now are more capable of cloning humanoid species that do
+ not breathe.
+ - bugfix: You can only be damaged once by a shuttle's arrival. It is still unpleasant
+ to be in the path of one though; try to avoid it.
+ - rscadd: Adds Asteroid emergency shuttle to shuttle templates. It is a very oddly
+ shaped one though, it might not be compatible with all stations.
+ - rscdel: The Chaplain soulshard can only turn a body into a shade once. A released
+ shade can still be reabsorbed by the stone to heal it.
+ - rscadd: The shuttle manipulator now has a Fast Travel button, for those admins
+ that really want a shuttle to get to where its going FAST.
diff --git a/html/changelogs/AutoChangeLog-pr-18087.yml b/html/changelogs/AutoChangeLog-pr-18087.yml
deleted file mode 100644
index 24ad36e1a6d..00000000000
--- a/html/changelogs/AutoChangeLog-pr-18087.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-author: coiax
-delete-after: True
-changes:
- - rscadd: "Clone pods now notify the medical channel on a successful clone.
-They also notify the medical channel if the clone dies or is horribly
-mutilated; but not if it is ejected early by authorised medical
-personnel."
- - rscadd: "Cloning pods now are more capable of cloning humanoid species
-that do not breathe."
diff --git a/html/changelogs/AutoChangeLog-pr-18088.yml b/html/changelogs/AutoChangeLog-pr-18088.yml
deleted file mode 100644
index 5f936cde938..00000000000
--- a/html/changelogs/AutoChangeLog-pr-18088.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: coiax
-delete-after: True
-changes:
- - bugfix: "You can only be damaged once by a shuttle's arrival. It is still
-unpleasant to be in the path of one though; try to avoid it."
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 784d1ec7e5d..4f070af6b6e 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index d85d188d87d..ddc81aba4f5 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 70eaedb6709..176ec253293 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css
index 35e16349ab3..765d9e30566 100644
--- a/tgui/assets/tgui.css
+++ b/tgui/assets/tgui.css
@@ -1 +1,904 @@
-@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.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;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.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+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 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::-webkit-input-placeholder{color:#999}body.nanotrasen input::-moz-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 .content,body.nanotrasen section .label,body.nanotrasen section .line,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(even){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 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;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.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+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 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::-webkit-input-placeholder{color:#999}body.syndicate input::-moz-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 .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(even){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 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";
+html,
+body {
+ 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(to bottom, #2a2a2a 0%, #202020 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a', endColorstr='#ff202020', GradientType=0);
+}
+*,
+*:before,
+*:after {
+ 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.nanotrasen {
+ background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed center/70% 70%, linear-gradient(to bottom, #2a2a2a 0%, #202020 100%);
+ 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 0.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;
+ 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 0.5s;
+ background-color: #40628a;
+}
+body.nanotrasen span.button.normal.active:hover,
+body.nanotrasen span.button.normal.active:focus {
+ transition: background-color 0.25s;
+ background-color: #4f78aa;
+ outline: 0;
+}
+body.nanotrasen span.button.disabled {
+ transition: background-color 0.5s;
+ background-color: #999;
+}
+body.nanotrasen span.button.disabled.active:hover,
+body.nanotrasen span.button.disabled.active:focus {
+ transition: background-color 0.25s;
+ background-color: #a8a8a8;
+ outline: 0;
+}
+body.nanotrasen span.button.selected {
+ transition: background-color 0.5s;
+ background-color: #2f943c;
+}
+body.nanotrasen span.button.selected.active:hover,
+body.nanotrasen span.button.selected.active:focus {
+ transition: background-color 0.25s;
+ background-color: #3ab84b;
+ outline: 0;
+}
+body.nanotrasen span.button.caution {
+ transition: background-color 0.5s;
+ background-color: #9a9d00;
+}
+body.nanotrasen span.button.caution.active:hover,
+body.nanotrasen span.button.caution.active:focus {
+ transition: background-color 0.25s;
+ background-color: #ced200;
+ outline: 0;
+}
+body.nanotrasen span.button.danger {
+ transition: background-color 0.5s;
+ background-color: #9d0808;
+}
+body.nanotrasen span.button.danger.active:hover,
+body.nanotrasen span.button.danger.active:focus {
+ transition: background-color 0.25s;
+ background-color: #ce0b0b;
+ outline: 0;
+}
+body.nanotrasen span.button.gridable {
+ width: 125px;
+ margin: 2px 0;
+}
+body.nanotrasen span:not(.button) + span.button {
+ margin-left: 5px;
+}
+body.nanotrasen span.button + span:not(.button) {
+ margin-left: 5px;
+}
+body.nanotrasen div.display {
+ width: 100%;
+ padding: 4px;
+ margin: 6px 0;
+ background-color: #000000;
+ -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,0.33);
+ box-shadow: inset 0 0 5px rgba(0,0,0,0.5);
+}
+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::-webkit-input-placeholder {
+ color: #999;
+}
+body.nanotrasen input::-moz-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 10px, #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 transparent;
+ -ms-transform: rotate(360deg);
+ transform: rotate(360deg);
+}
+body.nanotrasen section .label,
+body.nanotrasen section .content,
+body.nanotrasen section .line,
+body.syndicate section .label,
+body.syndicate section .content,
+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(even) {
+ background-color: #000000;
+ -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,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 div.subdisplay {
+ width: 100%;
+ margin: 0;
+}
+body.nanotrasen header.titlebar .minimize,
+body.nanotrasen header.titlebar .close {
+ display: inline-block;
+ position: relative;
+ padding: 7px;
+ margin: -7px;
+ color: #8ba5c4;
+}
+body.nanotrasen header.titlebar .minimize:hover,
+body.nanotrasen header.titlebar .close: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,0.1);
+}
+body.nanotrasen header.titlebar .statusicon {
+ position: absolute;
+ top: 4px;
+ left: 12px;
+ transition: color 0.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;
+}
+.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";
+}
+body.syndicate {
+ background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed center/70% 70%, linear-gradient(to bottom, #750000 0%, #340404 100%);
+ 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 0.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;
+ 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 0.5s;
+ background-color: #397439;
+}
+body.syndicate span.button.normal.active:hover,
+body.syndicate span.button.normal.active:focus {
+ transition: background-color 0.25s;
+ background-color: #4a964a;
+ outline: 0;
+}
+body.syndicate span.button.disabled {
+ transition: background-color 0.5s;
+ background-color: #363636;
+}
+body.syndicate span.button.disabled.active:hover,
+body.syndicate span.button.disabled.active:focus {
+ transition: background-color 0.25s;
+ background-color: #545454;
+ outline: 0;
+}
+body.syndicate span.button.selected {
+ transition: background-color 0.5s;
+ background-color: #9d0808;
+}
+body.syndicate span.button.selected.active:hover,
+body.syndicate span.button.selected.active:focus {
+ transition: background-color 0.25s;
+ background-color: #ce0b0b;
+ outline: 0;
+}
+body.syndicate span.button.caution {
+ transition: background-color 0.5s;
+ background-color: #be6209;
+}
+body.syndicate span.button.caution.active:hover,
+body.syndicate span.button.caution.active:focus {
+ transition: background-color 0.25s;
+ background-color: #eb790b;
+ outline: 0;
+}
+body.syndicate span.button.danger {
+ transition: background-color 0.5s;
+ background-color: #9a9d00;
+}
+body.syndicate span.button.danger.active:hover,
+body.syndicate span.button.danger.active:focus {
+ transition: background-color 0.25s;
+ background-color: #ced200;
+ outline: 0;
+}
+body.syndicate span.button.gridable {
+ width: 125px;
+ margin: 2px 0;
+}
+body.syndicate span:not(.button) + span.button {
+ margin-left: 5px;
+}
+body.syndicate span.button + span:not(.button) {
+ margin-left: 5px;
+}
+body.syndicate div.display {
+ width: 100%;
+ padding: 4px;
+ margin: 6px 0;
+ background-color: #000000;
+ -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,0.5);
+ box-shadow: inset 0 0 5px rgba(0,0,0,0.75);
+}
+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::-webkit-input-placeholder {
+ color: #999;
+}
+body.syndicate input::-moz-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 10px, #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 transparent;
+ -ms-transform: rotate(360deg);
+ transform: rotate(360deg);
+}
+body.syndicate section .label,
+body.syndicate section .content,
+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(even) {
+ background-color: #000000;
+ -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,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 div.subdisplay {
+ width: 100%;
+ margin: 0;
+}
+body.syndicate header.titlebar .minimize,
+body.syndicate header.titlebar .close {
+ display: inline-block;
+ position: relative;
+ padding: 7px;
+ margin: -7px;
+ color: #e74242;
+}
+body.syndicate header.titlebar .minimize:hover,
+body.syndicate header.titlebar .close: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,0.1);
+}
+body.syndicate header.titlebar .statusicon {
+ position: absolute;
+ top: 4px;
+ left: 12px;
+ transition: color 0.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";
+}
diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js
index ac3b827e2ff..7effaa7dcaa 100644
--- a/tgui/assets/tgui.js
+++ b/tgui/assets/tgui.js
@@ -1,12 +1,23353 @@
-require=function t(e,n,r){function i(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(a)return a(o,!0);var c=Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[o]={exports:{}};e[o][0].call(l.exports,function(t){var n=e[o][1][t];return i(n?n:t)},l,l.exports,t,e,n,r)}return n[o].exports}for(var a="function"==typeof require&&require,o=0;o2?c[2]:void 0,p=Math.min((void 0===l?o:i(l,o))-u,o-s),f=1;for(s>u&&u+p>s&&(f=-1,u+=p-1,s+=p-1);p-- >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 r=t(80),i=t(76),a=t(79);e.exports=[].fill||function(t){for(var e=r(this),n=a(e.length),o=arguments,s=o.length,u=i(s>1?o[1]:void 0,n),c=s>2?o[2]:void 0,l=void 0===c?n:i(c,n);l>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var r=t(78),i=t(79),a=t(76);e.exports=function(t){return function(e,n,o){var s,u=r(e),c=i(u.length),l=a(o,c);if(t&&n!=n){for(;c>l;)if(s=u[l++],s!=s)return!0}else for(;c>l;l++)if((t||l in u)&&u[l]===n)return t||l;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var r=t(17),i=t(34),a=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,c=4==t,l=6==t,p=5==t||l;return function(f,d,h){for(var m,v,g=a(f),b=i(g),y=r(d,h,3),x=o(b.length),w=0,_=e?s(f,x):n?s(f,0):void 0;x>w;w++)if((p||w in b)&&(m=b[w],v=y(m,w,g),t))if(e)_[w]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return w;case 2:_.push(m)}else if(c)return!1;return l?-1:u||c?c:_}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var r=t(38),i=t(36),a=t(83)("species");e.exports=function(t,e){var n;return i(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!i(n.prototype)||(n=void 0),r(n)&&(n=n[a],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var r=t(11),i=t(83)("toStringTag"),a="Arguments"==r(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))[i])?n:a?r(e):"Object"==(o=r(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var r={}.toString;e.exports=function(t){return r.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var r=t(46),i=t(31),a=t(60),o=t(17),s=t(69),u=t(18),c=t(27),l=t(42),p=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";i(t,f,++y)}return"O"+t[f]},w=function(t,e){var n,r=x(e);if("F"!==r)return t._i[r];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,i){var l=t(function(t,a){s(t,l,e),t._i=r.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=a&&c(a,n,t[i],t)});return a(l.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=w(e,t);if(n){var r=n.n,i=n.p;delete e._i[n.i],n.r=!0,i&&(i.n=r),r&&(r.p=i),e._f==n&&(e._f=r),e._l==n&&(e._l=i),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!!w(this,t)}}),v&&r.setDesc(l.prototype,"size",{get:function(){return u(this[b])}}),l},def:function(t,e,n){var r,i,a=w(t,e);return a?a.v=n:(t._l=a={i:i=x(e,!0),k:e,v:n,p:r=t._l,n:void 0,r:!1},t._f||(t._f=a),r&&(r.n=a),t[b]++,"F"!==i&&(t._i[i]=a)),t},getEntry:w,setStrong:function(t,e,n){l(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?p(0,n.k):"values"==e?p(0,n.v):p(0,[n.k,n.v]):(t._t=void 0,p(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 r=t(27),i=t(10);e.exports=function(t){return function(){if(i(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return r(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var r=t(31),i=t(60),a=t(4),o=t(38),s=t(69),u=t(27),c=t(8),l=t(30),p=t(82)("weak"),f=Object.isExtensible||o,d=c(5),h=c(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,r){var a=t(function(t,i){s(t,a,e),t._i=m++,t._l=void 0,void 0!=i&&u(i,n,t[r],t)});return i(a.prototype,{"delete":function(t){return o(t)?f(t)?l(t,p)&&l(t[p],this._i)&&delete t[p][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?l(t,p)&&l(t[p],this._i):v(this).has(t):!1}}),a},def:function(t,e,n){return f(a(e))?(l(e,p)||r(e,p,{}),e[p][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:p}},{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 r=t(29),i=t(22),a=t(61),o=t(60),s=t(27),u=t(69),c=t(38),l=t(24),p=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=r[t],g=v,b=h?"set":"add",y=g&&g.prototype,x={},w=function(t){var e=y[t];a(y,t,"delete"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!c(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&&!l(function(){(new g).entries().next()}))){var _,k=new g,E=k[b](m?{}:-0,1)!=k,S=l(function(){k.has(1)}),O=p(function(t){new g(t)});O||(g=e(function(e,n){u(e,g,t);var r=new v;return void 0!=n&&s(n,h,r[b],r),r}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){_=1/e===-(1/0)}),(S||_)&&(w("delete"),w("has"),h&&w("get")),(_||E)&&w(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,i(i.G+i.W+i.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 r=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=r)},{}],17:[function(t,e,n){var r=t(2);e.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}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 r=t(38),i=t(29).document,a=r(i)&&r(i.createElement);e.exports=function(t){return a?i.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var r=t(46);e.exports=function(t){var e=r.getKeys(t),n=r.getSymbols;if(n)for(var i,a=n(t),o=r.isEnum,s=0;a.length>s;)o.call(t,i=a[s++])&&e.push(i);return e}},{46:46}],22:[function(t,e,n){var r=t(29),i=t(16),a=t(31),o=t(61),s=t(17),u="prototype",c=function(t,e,n){var l,p,f,d,h=t&c.F,m=t&c.G,v=t&c.S,g=t&c.P,b=t&c.B,y=m?r:v?r[e]||(r[e]={}):(r[e]||{})[u],x=m?i:i[e]||(i[e]={}),w=x[u]||(x[u]={});m&&(n=e);for(l in n)p=!h&&y&&l in y,f=(p?y:n)[l],d=b&&p?s(f,r):g&&"function"==typeof f?s(Function.call,f):f,y&&!p&&o(y,l,f),x[l]!=f&&a(x,l,d),g&&w[l]!=f&&(w[l]=f)};r.core=i,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,e.exports=c},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var r=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(i){}}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 r=t(31),i=t(61),a=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),c=""[t];a(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(i(String.prototype,t,n(o,u,c)),r(RegExp.prototype,u,2==e?function(t,e){return c.call(t,this,e)}:function(t){return c.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var r=t(4);e.exports=function(){var t=r(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 r=t(17),i=t(40),a=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,c){var l,p,f,d=u(t),h=r(n,c,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(a(d))for(l=s(t.length);l>m;m++)e?h(o(p=t[m])[0],p[1]):h(t[m]);else for(f=d.call(t);!(p=f.next()).done;)i(f,h,p.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var r=t(78),i=t(46).getNames,a={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return i(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==a.call(t)?s(t):i(r(t))}},{46:46,78:78}],29:[function(t,e,n){var r=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],30:[function(t,e,n){var r={}.hasOwnProperty;e.exports=function(t,e){return r.call(t,e)}},{}],31:[function(t,e,n){var r=t(46),i=t(59);e.exports=t(19)?function(t,e,n){return r.setDesc(t,e,i(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 r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?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 r=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var r=t(45),i=t(83)("iterator"),a=Array.prototype;e.exports=function(t){return void 0!==t&&(r.Array===t||a[i]===t)}},{45:45,83:83}],36:[function(t,e,n){var r=t(11);e.exports=Array.isArray||function(t){return"Array"==r(t)}},{11:11}],37:[function(t,e,n){var r=t(38),i=Math.floor;e.exports=function(t){return!r(t)&&isFinite(t)&&i(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 r=t(38),i=t(11),a=t(83)("match");e.exports=function(t){var e;return r(t)&&(void 0!==(e=t[a])?!!e:"RegExp"==i(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var r=t(4);e.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(a){var o=t["return"];throw void 0!==o&&r(o.call(t)),a}}},{4:4}],41:[function(t,e,n){"use strict";var r=t(46),i=t(59),a=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=r.create(o,{next:i(1,n)}),a(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var r=t(48),i=t(22),a=t(61),o=t(31),s=t(30),u=t(45),c=t(41),l=t(66),p=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,w){c(n,e,b);var _,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",O=y==v,C=!1,A=t.prototype,P=A[f]||A[h]||y&&A[y],T=P||E(y);if(P){var j=p(T.call(new t));l(j,S,!0),!r&&s(A,h)&&o(j,f,g),O&&P.name!==v&&(C=!0,T=function(){return P.call(this)})}if(r&&!w||!d&&!C&&A[f]||o(A,f,T),u[e]=T,u[S]=g,y)if(_={values:O?T:E(v),keys:x?T:E(m),entries:O?E("entries"):T},w)for(k in _)k in A||a(A,k,_[k]);else i(i.P+i.F*(d||C),e,_);return _}},{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 r=t(83)("iterator"),i=!1;try{var a=[7][r]();a["return"]=function(){i=!0},Array.from(a,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var a=[7],o=a[r]();o.next=function(){n=!0},a[r]=function(){return o},t(a)}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 r=Object;e.exports={create:r.create,getProto:r.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:r.getOwnPropertyDescriptor,setDesc:r.defineProperty,setDescs:r.defineProperties,getKeys:r.keys,getNames:r.getOwnPropertyNames,getSymbols:r.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var r=t(46),i=t(78);e.exports=function(t,e){for(var n,a=i(t),o=r.getKeys(a),s=o.length,u=0;s>u;)if(a[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 r,i,a,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,c=o.process,l=o.Promise,p="process"==t(11)(c),f=function(){var t,e,n;for(p&&(t=c.domain)&&(c.domain=null,t.exit());r;)e=r.domain,n=r.fn,e&&e.enter(),n(),e&&e.exit(),r=r.next;i=void 0,t&&t.enter()};if(p)a=function(){c.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(f).observe(h,{characterData:!0}),a=function(){h.data=d=-d}}else a=l&&l.resolve?function(){l.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:p&&c.domain};i&&(i.next=e),r||(r=e,a()),i=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var r=t(46),i=t(80),a=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},r=Symbol(),i="abcdefghijklmnopqrst";return e[r]=7,i.split("").forEach(function(t){n[t]=t}),7!=t({},e)[r]||Object.keys(t({},n)).join("")!=i})?function(t,e){for(var n=i(t),o=arguments,s=o.length,u=1,c=r.getKeys,l=r.getSymbols,p=r.isEnum;s>u;)for(var f,d=a(o[u++]),h=l?c(d).concat(l(d)):c(d),m=h.length,v=0;m>v;)p.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 r=t(22),i=t(16),a=t(24);e.exports=function(t,e){var n=(i.Object||{})[t]||Object[t],o={};o[t]=e(n),r(r.S+r.F*a(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var r=t(46),i=t(78),a=r.isEnum;e.exports=function(t){return function(e){for(var n,o=i(e),s=r.getKeys(o),u=s.length,c=0,l=[];u>c;)a.call(o,n=s[c++])&&l.push(t?[n,o[n]]:o[n]);return l}}},{46:46,78:78}],56:[function(t,e,n){var r=t(46),i=t(4),a=t(29).Reflect;e.exports=a&&a.ownKeys||function(t){var e=r.getNames(i(t)),n=r.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var r=t(58),i=t(33),a=t(2);e.exports=function(){for(var t=a(this),e=arguments.length,n=Array(e),o=0,s=r._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var r,a=this,o=arguments,c=o.length,l=0,p=0;if(!u&&!c)return i(t,n,a);if(r=n.slice(),u)for(;e>l;l++)r[l]===s&&(r[l]=o[p++]);for(;c>p;)r.push(o[p++]);return i(t,r,a)}}},{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 r=t(61);e.exports=function(t,e){for(var n in e)r(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var r=t(29),i=t(31),a=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(a)||i(n,a,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||i(n,"name",e)),t===r?t[e]=n:(o||delete t[e],i(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[a]||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 r=t(46).getDesc,i=t(38),a=t(4),o=function(t,e){if(a(t),!i(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,i){try{i=t(17)(Function.call,r(Object.prototype,"__proto__").set,2),i(e,[]),n=!(e instanceof Array)}catch(a){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:i(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var r=t(29),i=t(46),a=t(19),o=t(83)("species");e.exports=function(t){var e=r[t];a&&e&&!e[o]&&i.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var r=t(46).setDesc,i=t(30),a=t(83)("toStringTag");e.exports=function(t,e,n){t&&!i(t=n?t:t.prototype,a)&&r(t,a,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var r=t(29),i="__core-js_shared__",a=r[i]||(r[i]={});e.exports=function(t){return a[t]||(a[t]={})}},{29:29}],68:[function(t,e,n){var r=t(4),i=t(2),a=t(83)("species");e.exports=function(t,e){var n,o=r(t).constructor;return void 0===o||void 0==(n=r(o)[a])?e:i(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 r=t(77),i=t(18);e.exports=function(t){return function(e,n){var a,o,s=i(e)+"",u=r(n),c=s.length;return 0>u||u>=c?t?"":void 0:(a=s.charCodeAt(u),55296>a||a>56319||u+1===c||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):a:t?s.slice(u,u+2):(a-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var r=t(39),i=t(18);e.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return i(t)+""}},{18:18,39:39}],72:[function(t,e,n){var r=t(79),i=t(73),a=t(18);e.exports=function(t,e,n,o){var s=a(t)+"",u=s.length,c=void 0===n?" ":n+"",l=r(e);if(u>=l)return s;""==c&&(c=" ");var p=l-u,f=i.call(c,Math.ceil(p/c.length));return f.length>p&&(f=f.slice(0,p)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var r=t(77),i=t(18);e.exports=function(t){var e=i(this)+"",n="",a=r(t);if(0>a||a==1/0)throw RangeError("Count can't be negative");for(;a>0;(a>>>=1)&&(e+=e))1&a&&(n+=e);return n}},{18:18,77:77}],74:[function(t,e,n){var r=t(22),i=t(18),a=t(24),o=" \n\x0B\f\r \u2028\u2029\ufeff",s="["+o+"]",u=" ",c=RegExp("^"+s+s+"*"),l=RegExp(s+s+"*$"),p=function(t,e){var n={};n[t]=e(f),r(r.P+r.F*a(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=p.trim=function(t,e){return t=i(t)+"",1&e&&(t=t.replace(c,"")),2&e&&(t=t.replace(l,"")),t};e.exports=p},{18:18,22:22,24:24}],75:[function(t,e,n){var r,i,a,o=t(17),s=t(33),u=t(32),c=t(20),l=t(29),p=l.process,f=l.setImmediate,d=l.clearImmediate,h=l.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)},r(m),m},d=function(t){delete v[t]},"process"==t(11)(p)?r=function(t){p.nextTick(o(b,t,1))}:h?(i=new h,a=i.port2,i.port1.onmessage=y,r=o(a.postMessage,a,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(r=function(t){l.postMessage(t+"","*")},l.addEventListener("message",y,!1)):r=g in c("script")?function(t){u.appendChild(c("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 r=t(77),i=Math.max,a=Math.min;e.exports=function(t,e){return t=r(t),0>t?i(t+e,0):a(t,e)}},{77:77}],77:[function(t,e,n){var r=Math.ceil,i=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?i:r)(t)}},{}],78:[function(t,e,n){var r=t(34),i=t(18);e.exports=function(t){return r(i(t))}},{18:18,34:34}],79:[function(t,e,n){var r=t(77),i=Math.min;e.exports=function(t){return t>0?i(r(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var r=t(18);e.exports=function(t){return Object(r(t))}},{18:18}],81:[function(t,e,n){var r=t(38);e.exports=function(t,e){if(!r(t))return t;var n,i;if(e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;if("function"==typeof(n=t.valueOf)&&!r(i=n.call(t)))return i;if(!e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var r=0,i=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++r+i).toString(36))}},{}],83:[function(t,e,n){var r=t(67)("wks"),i=t(82),a=t(29).Symbol;e.exports=function(t){return r[t]||(r[t]=a&&a[t]||(a||i)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var r=t(10),i=t(83)("iterator"),a=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[i]||t["@@iterator"]||a[r(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var r,i=t(46),a=t(22),o=t(19),s=t(59),u=t(32),c=t(20),l=t(30),p=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),w=t(79),_=t(34),k=t(82)("__proto__"),E=t(8),S=t(7)(!1),O=Object.prototype,C=Array.prototype,A=C.slice,P=C.join,T=i.setDesc,j=i.getDesc,M=i.setDescs,L={};o||(r=!d(function(){return 7!=T(c("div"),"a",{get:function(){return 7}}).a}),i.setDesc=function(t,e,n){if(r)try{return T(t,e,n)}catch(i){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},i.getDesc=function(t,e){if(r)try{return j(t,e)}catch(n){}return l(t,e)?s(!O.propertyIsEnumerable.call(t,e),t[e]):void 0},i.setDescs=M=function(t,e){h(t);for(var n,r=i.getKeys(e),a=r.length,o=0;a>o;)i.setDesc(t,n=r[o++],e[n]);return t}),a(a.S+a.F*!o,"Object",{getOwnPropertyDescriptor:i.getDesc,defineProperty:i.setDesc,defineProperties:M});var F="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=F.concat("length","prototype"),R=F.length,D=function(){var t,e=c("iframe"),n=R,r=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("a;)l(i,r=t[a++])&&(~S(o,r)||o.push(r));return o}},q=function(){};a(a.S,"Object",{getPrototypeOf:i.getProto=i.getProto||function(t){return t=g(t),l(t,k)?t[k]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?O:null},getOwnPropertyNames:i.getNames=i.getNames||I(N,N.length,!0),create:i.create=i.create||function(t,e){var n;return null!==t?(q.prototype=h(t),n=new q,q.prototype=null,n[k]=t):n=D(),void 0===e?n:M(n,e)},keys:i.getKeys=i.getKeys||I(F,R,!1)});var B=function(t,e,n){if(!(e in L)){for(var r=[],i=0;e>i;i++)r[i]="a["+i+"]";L[e]=Function("F,a","return new F("+r.join(",")+")")}return L[e](t,n)};a(a.P,"Function",{bind:function(t){var e=m(this),n=A.call(arguments,1),r=function(){var i=n.concat(A.call(arguments));return this instanceof r?B(e,i.length,i):f(e,i,t)};return v(e.prototype)&&(r.prototype=e.prototype),r}}),a(a.P+a.F*d(function(){u&&A.call(u)}),"Array",{slice:function(t,e){var n=w(this.length),r=p(this);if(e=void 0===e?n:e,"Array"==r)return A.call(this,t,e);for(var i=x(t,n),a=x(e,n),o=w(a-i),s=Array(o),u=0;o>u;u++)s[u]="String"==r?this.charAt(i+u):this[i+u];return s}}),a(a.P+a.F*(_!=Object),"Array",{join:function(t){return P.call(_(this),void 0===t?",":t)}}),a(a.S,"Array",{isArray:t(36)});var V=function(t){return function(e,n){m(e);var r=_(this),i=w(r.length),a=t?i-1:0,o=t?-1:1;if(arguments.length<2)for(;;){if(a in r){n=r[a],a+=o;break}if(a+=o,t?0>a:a>=i)throw TypeError("Reduce of empty array with no initial value")}for(;t?a>=0:i>a;a+=o)a in r&&(n=e(n,r[a],a,this));return n}},U=function(t){return function(e){return t(this,e,arguments[1])}};a(a.P,"Array",{forEach:i.each=i.each||U(E(0)),map:U(E(1)),filter:U(E(2)),some:U(E(3)),every:U(E(4)),reduce:V(!1),reduceRight:V(!0),indexOf:U(S),lastIndexOf:function(t,e){var n=b(this),r=w(n.length),i=r-1;for(arguments.length>1&&(i=Math.min(i,y(e))),0>i&&(i=w(r+i));i>=0;i--)if(i in n&&n[i]===t)return i;return-1}}),a(a.S,"Date",{now:function(){return+new Date}});var z=function(t){return t>9?t:"0"+t};a(a.P+a.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(),r=0>e?"-":e>9999?"+":"";return r+("00000"+Math.abs(e)).slice(r?-6:-4)+"-"+z(t.getUTCMonth()+1)+"-"+z(t.getUTCDate())+"T"+z(t.getUTCHours())+":"+z(t.getUTCMinutes())+":"+z(t.getUTCSeconds())+"."+(n>99?n:"0"+z(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 r=t(22);r(r.P,"Array",{copyWithin:t(5)}),t(3)("copyWithin")},{22:22,3:3,5:5}],87:[function(t,e,n){var r=t(22);r(r.P,"Array",{fill:t(6)}),t(3)("fill")},{22:22,3:3,6:6}],88:[function(t,e,n){"use strict";var r=t(22),i=t(8)(6),a="findIndex",o=!0;a in[]&&Array(1)[a](function(){o=!1}),r(r.P+r.F*o,"Array",{findIndex:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(a)},{22:22,3:3,8:8}],89:[function(t,e,n){"use strict";var r=t(22),i=t(8)(5),a="find",o=!0;a in[]&&Array(1)[a](function(){o=!1}),r(r.P+r.F*o,"Array",{find:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(a)},{22:22,3:3,8:8}],90:[function(t,e,n){"use strict";var r=t(17),i=t(22),a=t(80),o=t(40),s=t(35),u=t(79),c=t(84);i(i.S+i.F*!t(43)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,i,l,p=a(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=c(p);if(v&&(m=r(m,h>2?d[2]:void 0,2)),void 0==b||f==Array&&s(b))for(e=u(p.length),n=new f(e);e>g;g++)n[g]=v?m(p[g],g):p[g];else for(l=b.call(p),n=new f;!(i=l.next()).done;g++)n[g]=v?o(l,m,[i.value,g],!0):i.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 r=t(3),i=t(44),a=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,i(1)):"keys"==e?i(0,n):"values"==e?i(0,t[n]):i(0,[n,t[n]])},"values"),a.Arguments=a.Array,r("keys"),r("values"),r("entries")},{3:3,42:42,44:44,45:45,78:78}],92:[function(t,e,n){"use strict";var r=t(22);r(r.S+r.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,r=new("function"==typeof this?this:Array)(n);n>t;)r[t]=e[t++];return r.length=n,r}})},{22:22,24:24}],93:[function(t,e,n){t(65)("Array")},{65:65}],94:[function(t,e,n){"use strict";var r=t(46),i=t(38),a=t(83)("hasInstance"),o=Function.prototype;a in o||r.setDesc(o,a,{value:function(t){if("function"!=typeof this||!i(t))return!1;if(!i(this.prototype))return t instanceof this;for(;t=r.getProto(t);)if(this.prototype===t)return!0;return!1}})},{38:38,46:46,83:83}],95:[function(t,e,n){var r=t(46).setDesc,i=t(59),a=t(30),o=Function.prototype,s=/^\s*function ([^ (]*)/,u="name";u in o||t(19)&&r(o,u,{configurable:!0,get:function(){var t=(""+this).match(s),e=t?t[1]:"";return a(this,u)||r(this,u,i(5,e)),e}})},{19:19,30:30,46:46,59:59}],96:[function(t,e,n){"use strict";var r=t(12);t(15)("Map",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=r.getEntry(this,t);return e&&e.v},set:function(t,e){return r.def(this,0===t?0:t,e)}},r,!0)},{12:12,15:15}],97:[function(t,e,n){var r=t(22),i=t(50),a=Math.sqrt,o=Math.acosh;r(r.S+r.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:i(t-1+a(t-1)*a(t+1))}})},{22:22,50:50}],98:[function(t,e,n){function r(t){return isFinite(t=+t)&&0!=t?0>t?-r(-t):Math.log(t+Math.sqrt(t*t+1)):t}var i=t(22);i(i.S,"Math",{asinh:r})},{22:22}],99:[function(t,e,n){var r=t(22);r(r.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 r=t(22),i=t(51);r(r.S,"Math",{cbrt:function(t){return i(t=+t)*Math.pow(Math.abs(t),1/3)}})},{22:22,51:51}],101:[function(t,e,n){var r=t(22);r(r.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 r=t(22),i=Math.exp;r(r.S,"Math",{cosh:function(t){return(i(t=+t)+i(-t))/2}})},{22:22}],103:[function(t,e,n){var r=t(22);r(r.S,"Math",{expm1:t(49)})},{22:22,49:49}],104:[function(t,e,n){var r=t(22),i=t(51),a=Math.pow,o=a(2,-52),s=a(2,-23),u=a(2,127)*(2-s),c=a(2,-126),l=function(t){return t+1/o-1/o};r(r.S,"Math",{fround:function(t){var e,n,r=Math.abs(t),a=i(t);return c>r?a*l(r/c/s)*c*s:(e=(1+s/o)*r,n=e-(e-r),n>u||n!=n?a*(1/0):a*n)}})},{22:22,51:51}],105:[function(t,e,n){var r=t(22),i=Math.abs;r(r.S,"Math",{hypot:function(t,e){for(var n,r,a=0,o=0,s=arguments,u=s.length,c=0;u>o;)n=i(s[o++]),n>c?(r=c/n,a=a*r*r+1,c=n):n>0?(r=n/c,a+=r*r):a+=n;return c===1/0?1/0:c*Math.sqrt(a)}})},{22:22}],106:[function(t,e,n){var r=t(22),i=Math.imul;r(r.S+r.F*t(24)(function(){return-5!=i(4294967295,5)||2!=i.length}),"Math",{imul:function(t,e){var n=65535,r=+t,i=+e,a=n&r,o=n&i;return 0|a*o+((n&r>>>16)*o+a*(n&i>>>16)<<16>>>0)}})},{22:22,24:24}],107:[function(t,e,n){var r=t(22);r(r.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},{22:22}],108:[function(t,e,n){var r=t(22);r(r.S,"Math",{log1p:t(50)})},{22:22,50:50}],109:[function(t,e,n){var r=t(22);r(r.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{22:22}],110:[function(t,e,n){var r=t(22);r(r.S,"Math",{sign:t(51)})},{22:22,51:51}],111:[function(t,e,n){var r=t(22),i=t(49),a=Math.exp;r(r.S+r.F*t(24)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(i(t)-i(-t))/2:(a(t-1)-a(-t-1))*(Math.E/2)}})},{22:22,24:24,49:49}],112:[function(t,e,n){var r=t(22),i=t(49),a=Math.exp;r(r.S,"Math",{tanh:function(t){var e=i(t=+t),n=i(-t);return e==1/0?1:n==1/0?-1:(e-n)/(a(t)+a(-t))}})},{22:22,49:49}],113:[function(t,e,n){var r=t(22);r(r.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{22:22}],114:[function(t,e,n){"use strict";var r=t(46),i=t(29),a=t(30),o=t(11),s=t(81),u=t(24),c=t(74).trim,l="Number",p=i[l],f=p,d=p.prototype,h=o(r.create(d))==l,m="trim"in String.prototype,v=function(t){
-var e=s(t,!1);if("string"==typeof e&&e.length>2){e=m?e.trim():c(e,3);var n,r,i,a=e.charCodeAt(0);if(43===a||45===a){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===a){switch(e.charCodeAt(1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+e}for(var o,u=e.slice(2),l=0,p=u.length;p>l;l++)if(o=u.charCodeAt(l),48>o||o>i)return NaN;return parseInt(u,r)}}return+e};p(" 0o1")&&p("0b1")&&!p("+0x1")||(p=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof p&&(h?u(function(){d.valueOf.call(n)}):o(n)!=l)?new f(v(e)):v(e)},r.each.call(t(19)?r.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){a(f,t)&&!a(p,t)&&r.setDesc(p,t,r.getDesc(f,t))}),p.prototype=d,d.constructor=p,t(61)(i,l,p))},{11:11,19:19,24:24,29:29,30:30,46:46,61:61,74:74,81:81}],115:[function(t,e,n){var r=t(22);r(r.S,"Number",{EPSILON:Math.pow(2,-52)})},{22:22}],116:[function(t,e,n){var r=t(22),i=t(29).isFinite;r(r.S,"Number",{isFinite:function(t){return"number"==typeof t&&i(t)}})},{22:22,29:29}],117:[function(t,e,n){var r=t(22);r(r.S,"Number",{isInteger:t(37)})},{22:22,37:37}],118:[function(t,e,n){var r=t(22);r(r.S,"Number",{isNaN:function(t){return t!=t}})},{22:22}],119:[function(t,e,n){var r=t(22),i=t(37),a=Math.abs;r(r.S,"Number",{isSafeInteger:function(t){return i(t)&&a(t)<=9007199254740991}})},{22:22,37:37}],120:[function(t,e,n){var r=t(22);r(r.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{22:22}],121:[function(t,e,n){var r=t(22);r(r.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{22:22}],122:[function(t,e,n){var r=t(22);r(r.S,"Number",{parseFloat:parseFloat})},{22:22}],123:[function(t,e,n){var r=t(22);r(r.S,"Number",{parseInt:parseInt})},{22:22}],124:[function(t,e,n){var r=t(22);r(r.S+r.F,"Object",{assign:t(53)})},{22:22,53:53}],125:[function(t,e,n){var r=t(38);t(54)("freeze",function(t){return function(e){return t&&r(e)?t(e):e}})},{38:38,54:54}],126:[function(t,e,n){var r=t(78);t(54)("getOwnPropertyDescriptor",function(t){return function(e,n){return t(r(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 r=t(80);t(54)("getPrototypeOf",function(t){return function(e){return t(r(e))}})},{54:54,80:80}],129:[function(t,e,n){var r=t(38);t(54)("isExtensible",function(t){return function(e){return r(e)?t?t(e):!0:!1}})},{38:38,54:54}],130:[function(t,e,n){var r=t(38);t(54)("isFrozen",function(t){return function(e){return r(e)?t?t(e):!1:!0}})},{38:38,54:54}],131:[function(t,e,n){var r=t(38);t(54)("isSealed",function(t){return function(e){return r(e)?t?t(e):!1:!0}})},{38:38,54:54}],132:[function(t,e,n){var r=t(22);r(r.S,"Object",{is:t(63)})},{22:22,63:63}],133:[function(t,e,n){var r=t(80);t(54)("keys",function(t){return function(e){return t(r(e))}})},{54:54,80:80}],134:[function(t,e,n){var r=t(38);t(54)("preventExtensions",function(t){return function(e){return t&&r(e)?t(e):e}})},{38:38,54:54}],135:[function(t,e,n){var r=t(38);t(54)("seal",function(t){return function(e){return t&&r(e)?t(e):e}})},{38:38,54:54}],136:[function(t,e,n){var r=t(22);r(r.S,"Object",{setPrototypeOf:t(64).set})},{22:22,64:64}],137:[function(t,e,n){"use strict";var r=t(10),i={};i[t(83)("toStringTag")]="z",i+""!="[object z]"&&t(61)(Object.prototype,"toString",function(){return"[object "+r(this)+"]"},!0)},{10:10,61:61,83:83}],138:[function(t,e,n){"use strict";var r,i=t(46),a=t(48),o=t(29),s=t(17),u=t(10),c=t(22),l=t(38),p=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",w=o.process,_="process"==u(w),k=o[x],E=function(t){var e=new k(function(){});return t&&(e.constructor=Object),k.resolve(e)===e},S=function(){function e(t){var n=new k(t);return m(n,e.prototype),n}var n=!1;try{if(n=k&&k.resolve&&E(),m(e,k),e.prototype=i.create(k.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(n=!1),n&&t(19)){var r=!1;k.resolve(i.setDesc({},"then",{get:function(){r=!0}})),n=r}}catch(a){n=!1}return n}(),O=function(t,e){return a&&t===k&&e===r?!0:v(t,e)},C=function(t){var e=p(t)[g];return void 0!=e?e:t},A=function(t){var e;return l(t)&&"function"==typeof(e=t.then)?e:!1},P=function(t){var e,n;this.promise=new t(function(t,r){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=r}),this.resolve=f(e),this.reject=f(n)},T=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 r=t.v,i=1==t.s,a=0,s=function(e){var n,a,o=i?e.ok:e.fail,s=e.resolve,u=e.reject;try{o?(i||(t.h=!0),n=o===!0?r:o(r),n===e.promise?u(TypeError("Promise-chain cycle")):(a=A(n))?a.call(n,s,u):s(n)):u(r)}catch(c){u(c)}};n.length>a;)s(n[a++]);n.length=0,t.n=!1,e&&setTimeout(function(){var e,n,i=t.p;M(i)&&(_?w.emit("unhandledRejection",r,i):(e=o.onunhandledrejection)?e({promise:i,reason:r}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",r)),t.a=void 0},1)})}},M=function(t){var e,n=t._d,r=n.a||n.c,i=0;if(n.h)return!1;for(;r.length>i;)if(e=r[i++],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))},F=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=A(t))?y(function(){var r={r:n,d:!1};try{e.call(t,s(F,r,1),s(L,r,1))}catch(i){L.call(r,i)}}):(n.v=t,n.s=1,j(n,!1))}catch(r){L.call({r:n,d:!1},r)}}};S||(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(F,e,1),s(L,e,1))}catch(n){L.call(e,n)}},t(60)(k.prototype,{then:function(t,e){var n=new P(b(this,k)),r=n.promise,i=this._d;return n.ok="function"==typeof t?t:!0,n.fail="function"==typeof e&&e,i.c.push(n),i.a&&i.a.push(n),i.s&&j(i,!1),r},"catch":function(t){return this.then(void 0,t)}})),c(c.G+c.W+c.F*!S,{Promise:k}),t(66)(k,x),t(65)(x),r=t(16)[x],c(c.S+c.F*!S,x,{reject:function(t){var e=new P(this),n=e.reject;return n(t),e.promise}}),c(c.S+c.F*(!S||E(!0)),x,{resolve:function(t){if(t instanceof k&&O(t.constructor,this))return t;var e=new P(this),n=e.resolve;return n(t),e.promise}}),c(c.S+c.F*!(S&&t(43)(function(t){k.all(t)["catch"](function(){})})),x,{all:function(t){var e=C(this),n=new P(e),r=n.resolve,a=n.reject,o=[],s=T(function(){h(t,!1,o.push,o);var n=o.length,s=Array(n);n?i.each.call(o,function(t,i){var o=!1;e.resolve(t).then(function(t){o||(o=!0,s[i]=t,--n||r(s))},a)}):r(s)});return s&&a(s.error),n.promise},race:function(t){var e=C(this),n=new P(e),r=n.reject,i=T(function(){h(t,!1,function(t){e.resolve(t).then(n.resolve,r)})});return i&&r(i.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 r=t(22),i=Function.apply;r(r.S,"Reflect",{apply:function(t,e,n){return i.call(t,e,n)}})},{22:22}],140:[function(t,e,n){var r=t(46),i=t(22),a=t(2),o=t(4),s=t(38),u=Function.bind||t(16).Function.prototype.bind;i(i.S+i.F*t(24)(function(){function t(){}return!(Reflect.construct(function(){},[],t)instanceof t)}),"Reflect",{construct:function(t,e){a(t);var n=arguments.length<3?t:a(arguments[2]);if(t==n){if(void 0!=e)switch(o(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 i=[null];return i.push.apply(i,e),new(u.apply(t,i))}var c=n.prototype,l=r.create(s(c)?c:Object.prototype),p=Function.apply.call(t,l,e);return s(p)?p:l}})},{16:16,2:2,22:22,24:24,38:38,4:4,46:46}],141:[function(t,e,n){var r=t(46),i=t(22),a=t(4);i(i.S+i.F*t(24)(function(){Reflect.defineProperty(r.setDesc({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){a(t);try{return r.setDesc(t,e,n),!0}catch(i){return!1}}})},{22:22,24:24,4:4,46:46}],142:[function(t,e,n){var r=t(22),i=t(46).getDesc,a=t(4);r(r.S,"Reflect",{deleteProperty:function(t,e){var n=i(a(t),e);return n&&!n.configurable?!1:delete t[e]}})},{22:22,4:4,46:46}],143:[function(t,e,n){"use strict";var r=t(22),i=t(4),a=function(t){this._t=i(t),this._i=0;var e,n=this._k=[];for(e in t)n.push(e)};t(41)(a,"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}}),r(r.S,"Reflect",{enumerate:function(t){return new a(t)}})},{22:22,4:4,41:41}],144:[function(t,e,n){var r=t(46),i=t(22),a=t(4);i(i.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return r.getDesc(a(t),e)}})},{22:22,4:4,46:46}],145:[function(t,e,n){var r=t(22),i=t(46).getProto,a=t(4);r(r.S,"Reflect",{getPrototypeOf:function(t){return i(a(t))}})},{22:22,4:4,46:46}],146:[function(t,e,n){function r(t,e){var n,o,c=arguments.length<3?t:arguments[2];return u(t)===c?t[e]:(n=i.getDesc(t,e))?a(n,"value")?n.value:void 0!==n.get?n.get.call(c):void 0:s(o=i.getProto(t))?r(o,e,c):void 0}var i=t(46),a=t(30),o=t(22),s=t(38),u=t(4);o(o.S,"Reflect",{get:r})},{22:22,30:30,38:38,4:4,46:46}],147:[function(t,e,n){var r=t(22);r(r.S,"Reflect",{has:function(t,e){return e in t}})},{22:22}],148:[function(t,e,n){var r=t(22),i=t(4),a=Object.isExtensible;r(r.S,"Reflect",{isExtensible:function(t){return i(t),a?a(t):!0}})},{22:22,4:4}],149:[function(t,e,n){var r=t(22);r(r.S,"Reflect",{ownKeys:t(56)})},{22:22,56:56}],150:[function(t,e,n){var r=t(22),i=t(4),a=Object.preventExtensions;r(r.S,"Reflect",{preventExtensions:function(t){i(t);try{return a&&a(t),!0}catch(e){return!1}}})},{22:22,4:4}],151:[function(t,e,n){var r=t(22),i=t(64);i&&r(r.S,"Reflect",{setPrototypeOf:function(t,e){i.check(t,e);try{return i.set(t,e),!0}catch(n){return!1}}})},{22:22,64:64}],152:[function(t,e,n){function r(t,e,n){var o,l,p=arguments.length<4?t:arguments[3],f=i.getDesc(u(t),e);if(!f){if(c(l=i.getProto(t)))return r(l,e,n,p);f=s(0)}return a(f,"value")?f.writable!==!1&&c(p)?(o=i.getDesc(p,e)||s(0),o.value=n,i.setDesc(p,e,o),!0):!1:void 0===f.set?!1:(f.set.call(p,n),!0)}var i=t(46),a=t(30),o=t(22),s=t(59),u=t(4),c=t(38);o(o.S,"Reflect",{set:r})},{22:22,30:30,38:38,4:4,46:46,59:59}],153:[function(t,e,n){var r=t(46),i=t(29),a=t(39),o=t(26),s=i.RegExp,u=s,c=s.prototype,l=/a/g,p=/a/g,f=new s(l)!==l;!t(19)||f&&!t(24)(function(){return p[t(83)("match")]=!1,s(l)!=l||s(p)==p||"/a/i"!=s(l,"i")})||(s=function(t,e){var n=a(t),r=void 0===e;return this instanceof s||!n||t.constructor!==s||!r?f?new u(n&&!r?t.source:t,e):u((n=t instanceof s)?t.source:t,n&&r?o.call(t):e):t},r.each.call(r.getNames(u),function(t){t in s||r.setDesc(s,t,{configurable:!0,get:function(){return u[t]},set:function(e){u[t]=e}})}),c.constructor=s,s.prototype=c,t(61)(i,"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 r=t(46);t(19)&&"g"!=/./g.flags&&r.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 r=t(this),i=void 0==n?void 0:n[e];return void 0!==i?i.call(n,r):RegExp(n)[e](r+"")}})},{25:25}],156:[function(t,e,n){t(25)("replace",2,function(t,e,n){return function(r,i){"use strict";var a=t(this),o=void 0==r?void 0:r[e];return void 0!==o?o.call(r,a,i):n.call(a+"",r,i)}})},{25:25}],157:[function(t,e,n){t(25)("search",1,function(t,e){return function(n){"use strict";var r=t(this),i=void 0==n?void 0:n[e];return void 0!==i?i.call(n,r):RegExp(n)[e](r+"")}})},{25:25}],158:[function(t,e,n){t(25)("split",2,function(t,e,n){return function(r,i){"use strict";var a=t(this),o=void 0==r?void 0:r[e];return void 0!==o?o.call(r,a,i):n.call(a+"",r,i)}})},{25:25}],159:[function(t,e,n){"use strict";var r=t(12);t(15)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return r.def(this,t=0===t?0:t,t)}},r)},{12:12,15:15}],160:[function(t,e,n){"use strict";var r=t(22),i=t(70)(!1);r(r.P,"String",{codePointAt:function(t){return i(this,t)}})},{22:22,70:70}],161:[function(t,e,n){"use strict";var r=t(22),i=t(79),a=t(71),o="endsWith",s=""[o];r(r.P+r.F*t(23)(o),"String",{endsWith:function(t){var e=a(this,t,o),n=arguments,r=n.length>1?n[1]:void 0,u=i(e.length),c=void 0===r?u:Math.min(i(r),u),l=t+"";return s?s.call(e,l,c):e.slice(c-l.length,c)===l}})},{22:22,23:23,71:71,79:79}],162:[function(t,e,n){var r=t(22),i=t(76),a=String.fromCharCode,o=String.fromCodePoint;r(r.S+r.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],r=arguments,o=r.length,s=0;o>s;){if(e=+r[s++],i(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(65536>e?a(e):a(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},{22:22,76:76}],163:[function(t,e,n){"use strict";var r=t(22),i=t(71),a="includes";r(r.P+r.F*t(23)(a),"String",{includes:function(t){return!!~i(this,t,a).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},{22:22,23:23,71:71}],164:[function(t,e,n){"use strict";var r=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=r(e,n),this._i+=t.length,{value:t,done:!1})})},{42:42,70:70}],165:[function(t,e,n){var r=t(22),i=t(78),a=t(79);r(r.S,"String",{raw:function(t){for(var e=i(t.raw),n=a(e.length),r=arguments,o=r.length,s=[],u=0;n>u;)s.push(e[u++]+""),o>u&&s.push(r[u]+"");return s.join("")}})},{22:22,78:78,79:79}],166:[function(t,e,n){var r=t(22);r(r.P,"String",{repeat:t(73)})},{22:22,73:73}],167:[function(t,e,n){"use strict";var r=t(22),i=t(79),a=t(71),o="startsWith",s=""[o];r(r.P+r.F*t(23)(o),"String",{startsWith:function(t){var e=a(this,t,o),n=arguments,r=i(Math.min(n.length>1?n[1]:void 0,e.length)),u=t+"";return s?s.call(e,u,r):e.slice(r,r+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 r=t(46),i=t(29),a=t(30),o=t(19),s=t(22),u=t(61),c=t(24),l=t(67),p=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),w=r.getDesc,_=r.setDesc,k=r.create,E=m.get,S=i.Symbol,O=i.JSON,C=O&&O.stringify,A=!1,P=d("_hidden"),T=r.isEnum,j=l("symbol-registry"),M=l("symbols"),L="function"==typeof S,F=Object.prototype,N=o&&c(function(){return 7!=k(_({},"a",{get:function(){return _(this,"a",{value:7}).a}})).a})?function(t,e,n){var r=w(F,e);r&&delete F[e],_(t,e,n),r&&t!==F&&_(F,e,r)}:_,R=function(t){var e=M[t]=k(S.prototype);return e._k=t,o&&A&&N(F,t,{configurable:!0,set:function(e){a(this,P)&&a(this[P],t)&&(this[P][t]=!1),N(this,t,x(1,e))}}),e},D=function(t){return"symbol"==typeof t},I=function(t,e,n){return n&&a(M,e)?(n.enumerable?(a(t,P)&&t[P][e]&&(t[P][e]=!1),n=k(n,{enumerable:x(0,!1)})):(a(t,P)||_(t,P,x(1,{})),t[P][e]=!0),N(t,e,n)):_(t,e,n)},q=function(t,e){b(t);for(var n,r=v(e=y(e)),i=0,a=r.length;a>i;)I(t,n=r[i++],e[n]);return t},B=function(t,e){return void 0===e?k(t):q(k(t),e)},V=function(t){var e=T.call(this,t);return e||!a(this,t)||!a(M,t)||a(this,P)&&this[P][t]?e:!0},U=function(t,e){var n=w(t=y(t),e);return!n||!a(M,e)||a(t,P)&&t[P][e]||(n.enumerable=!0),n},z=function(t){for(var e,n=E(y(t)),r=[],i=0;n.length>i;)a(M,e=n[i++])||e==P||r.push(e);return r},W=function(t){for(var e,n=E(y(t)),r=[],i=0;n.length>i;)a(M,e=n[i++])&&r.push(M[e]);return r},H=function(t){if(void 0!==t&&!D(t)){for(var e,n,r=[t],i=1,a=arguments;a.length>i;)r.push(a[i++]);return e=r[1],"function"==typeof e&&(n=e),(n||!g(e))&&(e=function(t,e){return n&&(e=n.call(this,t,e)),D(e)?void 0:e}),r[1]=e,C.apply(O,r)}},G=c(function(){var t=S();return"[null]"!=C([t])||"{}"!=C({a:t})||"{}"!=C(Object(t))});L||(S=function(){if(D(this))throw TypeError("Symbol is not a constructor");return R(f(arguments.length>0?arguments[0]:void 0))},u(S.prototype,"toString",function(){return this._k}),D=function(t){return t instanceof S},r.create=B,r.isEnum=V,r.getDesc=U,r.setDesc=I,r.setDescs=q,r.getNames=m.get=z,r.getSymbols=W,o&&!t(48)&&u(F,"propertyIsEnumerable",V,!0));var K={"for":function(t){return a(j,t+="")?j[t]:j[t]=S(t)},keyFor:function(t){return h(j,t)},useSetter:function(){A=!0},useSimple:function(){A=!1}};r.each.call("hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),function(t){var e=d(t);K[t]=L?e:R(e)}),A=!0,s(s.G+s.W,{Symbol:S}),s(s.S,"Symbol",K),s(s.S+s.F*!L,"Object",{create:B,defineProperty:I,defineProperties:q,getOwnPropertyDescriptor:U,getOwnPropertyNames:z,getOwnPropertySymbols:W}),O&&s(s.S+s.F*(!L||G),"JSON",{stringify:H}),p(S,"Symbol"),p(Math,"Math",!0),p(i.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 r=t(46),i=t(61),a=t(14),o=t(38),s=t(30),u=a.frozenStore,c=a.WEAK,l=Object.isExtensible||o,p={},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(!l(t))return u(this).get(t);if(s(t,c))return t[c][this._i]}},set:function(t,e){return a.def(this,t,e)}},a,!0,!0);7!=(new f).set((Object.freeze||Object)(p),7).get(p)&&r.each.call(["delete","has","get","set"],function(t){var e=f.prototype,n=e[t];i(e,t,function(e,r){if(o(e)&&!l(e)){var i=u(this)[t](e,r);return"set"==t?this:i}return n.call(this,e,r)})})},{14:14,15:15,30:30,38:38,46:46,61:61}],171:[function(t,e,n){"use strict";var r=t(14);t(15)("WeakSet",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return r.def(this,t,!0)}},r,!1,!0)},{14:14,15:15}],172:[function(t,e,n){"use strict";var r=t(22),i=t(7)(!0);r(r.P,"Array",{includes:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)("includes")},{22:22,3:3,7:7}],173:[function(t,e,n){var r=t(22);r(r.P,"Map",{toJSON:t(13)("Map")})},{13:13,22:22}],174:[function(t,e,n){var r=t(22),i=t(55)(!0);r(r.S,"Object",{entries:function(t){return i(t)}})},{22:22,55:55}],175:[function(t,e,n){var r=t(46),i=t(22),a=t(56),o=t(78),s=t(59);i(i.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,i=o(t),u=r.setDesc,c=r.getDesc,l=a(i),p={},f=0;l.length>f;)n=c(i,e=l[f++]),e in p?u(p,e,s(0,n)):p[e]=n;return p}})},{22:22,46:46,56:56,59:59,78:78}],176:[function(t,e,n){var r=t(22),i=t(55)(!1);r(r.S,"Object",{values:function(t){return i(t)}})},{22:22,55:55}],177:[function(t,e,n){var r=t(22),i=t(62)(/[\\^$*+?.()|[\]{}]/g,"\\$&");r(r.S,"RegExp",{escape:function(t){return i(t)}})},{22:22,62:62}],178:[function(t,e,n){var r=t(22);r(r.P,"Set",{toJSON:t(13)("Set")})},{13:13,22:22}],179:[function(t,e,n){"use strict";var r=t(22),i=t(70)(!0);r(r.P,"String",{at:function(t){return i(this,t)}})},{22:22,70:70}],180:[function(t,e,n){"use strict";var r=t(22),i=t(72);r(r.P,"String",{padLeft:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{22:22,72:72}],181:[function(t,e,n){"use strict";var r=t(22),i=t(72);r(r.P,"String",{padRight:function(t){return i(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 r=t(46),i=t(22),a=t(17),o=t(16).Array||Array,s={},u=function(t,e){r.each.call(t.split(","),function(t){void 0==e&&t in o?s[t]=o[t]:t in[]&&(s[t]=a(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"),i(i.S,"Array",s)},{16:16,17:17,22:22,46:46}],185:[function(t,e,n){t(91);var r=t(29),i=t(31),a=t(45),o=t(83)("iterator"),s=r.NodeList,u=r.HTMLCollection,c=s&&s.prototype,l=u&&u.prototype,p=a.NodeList=a.HTMLCollection=a.Array;c&&!c[o]&&i(c,o,p),l&&!l[o]&&i(l,o,p)},{29:29,31:31,45:45,83:83,91:91}],186:[function(t,e,n){var r=t(22),i=t(75);r(r.G+r.B,{setImmediate:i.set,clearImmediate:i.clear})},{22:22,75:75}],187:[function(t,e,n){var r=t(29),i=t(22),a=t(33),o=t(57),s=r.navigator,u=!!s&&/MSIE .\./.test(s.userAgent),c=function(t){return u?function(e,n){return t(a(o,[].slice.call(arguments,2),"function"==typeof e?e:Function(e)),n)}:t};i(i.G+i.B+i.F*u,{setTimeout:c(r.setTimeout),setInterval:c(r.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 r(t,e,n,r){var i=Object.create((e||a).prototype),o=new h(r||[]);return i._invoke=p(t,n,o),i}function i(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(r){return{type:"throw",arg:r}}}function a(){}function o(){}function s(){}function u(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function c(t){this.arg=t}function l(e){function n(t,n){var r=e[t](n),i=r.value;return i instanceof c?Promise.resolve(i.arg).then(a,o):Promise.resolve(i).then(function(t){return r.value=t,r})}function r(t,e){function r(){return n(t,e)}return i=i?i.then(r,r):new Promise(function(t){t(r())})}"object"==typeof t&&t.domain&&(n=t.domain.bind(n));var i,a=n.bind(e,"next"),o=n.bind(e,"throw");n.bind(e,"return");this._invoke=r}function p(t,e,n){var r=_;return function(a,o){if(r===E)throw Error("Generator is already running");if(r===S){if("throw"===a)throw o;return v()}for(;;){var s=n.delegate;if(s){if("return"===a||"throw"===a&&s.iterator[a]===g){n.delegate=null;var u=s.iterator["return"];if(u){var c=i(u,s.iterator,o);if("throw"===c.type){a="throw",o=c.arg;continue}}if("return"===a)continue}var c=i(s.iterator[a],s.iterator,o);if("throw"===c.type){n.delegate=null,a="throw",o=c.arg;continue}a="next",o=g;var l=c.arg;if(!l.done)return r=k,l;n[s.resultName]=l.value,n.next=s.nextLoc,n.delegate=null}if("next"===a)n._sent=o,r===k?n.sent=o:n.sent=g;else if("throw"===a){if(r===_)throw r=S,o;n.dispatchException(o)&&(a="next",o=g)}else"return"===a&&n.abrupt("return",o);r=E;var c=i(t,e,n);if("normal"===c.type){r=n.done?S:k;var l={value:c.arg,done:n.done};if(c.arg!==O)return l;n.delegate&&"next"===a&&(o=g)}else"throw"===c.type&&(r=S,a="throw",o=c.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,r=function i(){for(;++n=0;--r){var i=this.tryEntries[r],a=i.completion;if("root"===i.tryLoc)return e("end");if(i.tryLoc<=this.prev){var o=b.call(i,"catchLoc"),s=b.call(i,"finallyLoc");if(o&&s){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&b.call(r,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),O}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;d(n)}return i}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},O}}}("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 l.createDocumentFragment()}function n(t){return l.createElement(t)}function r(t){if(1===t.length)return i(t[0]);for(var n=e(),r=q.call(t),a=0;a-1}}([].indexOf||function(t){for(B=this.length;B--&&this[B]!==t;);return B}),item:function(t){return this[t]||null},remove:function(){for(var t,e=0;e=u?e(a):document.fonts.load(c(a,a.family),s).then(function(e){1<=e.length?t(a):setTimeout(f,25)},function(){e(a)})};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===p&&(e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),p=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))),e=p&&(v==y&&g==y&&b==y||v==x&&g==x&&b==x||v==w&&g==w&&b==w)),e=!e),e&&(null!==_.parentNode&&_.parentNode.removeChild(_),clearTimeout(k),t(a))}function f(){if((new Date).getTime()-l>=u)null!==_.parentNode&&_.parentNode.removeChild(_),e(a);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 r(s),h=new r(s),m=new r(s),v=-1,g=-1,b=-1,y=-1,x=-1,w=-1,_=document.createElement("div"),k=0;_.dir="ltr",i(d,c(a,"sans-serif")),i(h,c(a,"serif")),i(m,c(a,"monospace")),_.appendChild(d.a),_.appendChild(h.a),_.appendChild(m.a),document.body.appendChild(_),y=d.a.offsetWidth,x=h.a.offsetWidth,w=m.a.offsetWidth,f(),o(d,function(t){v=t,n()}),i(d,c(a,'"'+a.family+'",sans-serif')),o(h,function(t){g=t,n()}),i(h,c(a,'"'+a.family+'",serif')),o(m,function(t){b=t,n()}),i(m,c(a,'"'+a.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 r(t,e){var n=t.createElement("p"),r=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",r.insertBefore(n.lastChild,r.firstChild)}function i(){var t=x.elements;return"string"==typeof t?t.split(" "):t}function a(t,e){var n=x.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),x.elements=n+" "+t,l(e)}function o(t){var e=y[t[g]];return e||(e={},b++,t[g]=b,y[b]=e),e}function s(t,e,r){if(e||(e=n),f)return e.createElement(t);r||(r=o(e));var i;return i=r.cache[t]?r.cache[t].cloneNode():v.test(t)?(r.cache[t]=r.createElem(t)).cloneNode():r.createElem(t),!i.canHaveChildren||m.test(t)||i.tagUrn?i:r.frag.appendChild(i)}function u(t,e){if(t||(t=n),f)return t.createDocumentFragment();e=e||o(t);for(var r=e.frag.cloneNode(),a=0,s=i(),u=s.length;u>a;a++)r.createElement(s[a]);return r}function c(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&&("+i().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(x,e.frag)}function l(t){t||(t=n);var e=o(t);return!x.shivCSS||p||e.hasCSS||(e.hasCSS=!!r(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),f||c(t,e),t}var p,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="",p="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){p=!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:l,createElement:s,createDocumentFragment:u,addElements:a};t.html5=x,l(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,r){for(var a,o=n.slice(),s=i(e,t),u=0,c=o.length;c>u&&(handler=o[u],"object"==typeof handler?"function"==typeof handler.handleEvent&&handler.handleEvent(s):handler.call(t,s),!s.stoppedImmediatePropagation);u++);return a=!s.stoppedPropagation,r&&a&&t.parentNode?t.parentNode.dispatchEvent(s):!s.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function r(t,e,r){var i=b(e||t,r);v(t,"textContent",n(function(){return i.get.call(this)},function(t){i.set.call(this,t)}))}function i(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function a(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 c(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function l(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 p=!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 r in n)if(y.call(n,r))try{v(e,r,n[r])}catch(i){t.console&&console.log(r+" failed on object:",e,i.message)}},b=Object.getOwnPropertyDescriptor,y=Object.prototype.hasOwnProperty,x=t.Element.prototype,w=t.Text.prototype,_=/^[a-z]+$/,k=/loaded|complete/,E={},S=document.createElement("div"),O=document.documentElement,C=O.removeAttribute,A=O.setAttribute;r(t.HTMLCommentElement.prototype,x,"nodeValue"),r(t.HTMLScriptElement.prototype,null,"text"),r(w,null,"nodeValue"),r(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:c},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,r){if("function"==typeof n||"object"==typeof n){var i,o,u=this,c="on"+t,p=u[m]||v(u,m,{value:{}})[m],f=p[c]||(p[c]={}),d=f.h||(f.h=[]);if(!y.call(f,"w")){if(f.w=function(t){return t[m]||e(u,l(u,t),d,!1)},!y.call(E,c))if(_.test(t)){try{i=document.createEventObject(),i[m]=!0,9!=u.nodeType&&(null==u.parentNode&&S.appendChild(u),(o=u.getAttribute(c))&&C.call(u,c)),u.fireEvent(c,i),E[c]=!0}catch(i){for(E[c]=!1;S.hasChildNodes();)S.removeChild(S.firstChild)}null!=o&&A.call(u,c,o)}else E[c]=!1;(f.n=E[c])&&u.attachEvent(c,f.w)}a(d,n)<0&&d[r?"unshift":"push"](n),"input"===t&&u.attachEvent("onkeyup",s)}}},dispatchEvent:{value:function(t){var n,r=this,i="on"+t.type,a=r[m],o=a&&a[i],s=!!o;return t.target||(t.target=r),s?o.n?r.fireEvent(i,t):e(r,t,o.h,!0):(n=r.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}},removeEventListener:{value:function(t,e,n){if("function"==typeof e||"object"==typeof e){var r=this,i="on"+t,o=r[m],s=o&&o[i],u=s&&s.h,c=u?a(u,e):-1;c>-1&&u.splice(c,1)}}}}),g(w,{addEventListener:{value:x.addEventListener},dispatchEvent:{value:x.dispatchEvent},removeEventListener:{value:x.removeEventListener}}),g(t.XMLHttpRequest.prototype,{addEventListener:{value:function(t,e,n){var r=this,i="on"+t,o=r[m]||v(r,m,{value:{}})[m],s=o[i]||(o[i]={}),u=s.h||(s.h=[]);a(u,e)<0&&(r[i]||(r[i]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),r.dispatchEvent(e)}),u[n?"unshift":"push"](e))}},dispatchEvent:{value:function(t){var n=this,r="on"+t.type,i=n[m],a=i&&i[r],o=!!a;return o&&(a.n?n.fireEvent(r,t):e(n,t,a.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&&c.call(this,t)}},addEventListener:{value:function(e,n,r){var i=this;x.addEventListener.call(i,e,n,r),p&&e===h&&!k.test(i.readyState)&&(p=!1,i.attachEvent(d,u),t==top&&!function a(t){try{i.documentElement.doScroll("left"),u()}catch(e){setTimeout(a,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%]+$/,r=/^(top|right|bottom|left)$/,i=/\-([a-z])/g,a=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,u=this._,c=u.style,l=u.currentStyle,p=u.runtimeStyle;return t=("float"===t?"style-float":t).replace(i,a),e=l?l[t]:c[t],n.test(e)&&!r.test(t)&&(o=c.left,s=p&&p.left,s&&(p.left=l.left),c.left="fontSize"===t?"1em":e,e=c.pixelLeft+"px",c.left=o,s&&(p.left=s)),null==e?e:e+""||"auto"},e.prototype.getPropertyValue=function(){return null},function(n,r){return r?new e(n):new t(n)}}()},addEventListener:{value:function(n,r,i){var o,s=t,u="on"+n;s[u]||(s[u]=function(t){return e(s,l(s,t),o,!1)}),o=s[u][m]||(s[u][m]=[]),a(o,r)<0&&o[i?"unshift":"push"](r)}},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,r){var i="on"+e,o=(t[i]||Object)[m],s=o?a(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 p=1;s-1>=p;p++)a.push((0,c.times)(r,(0,c.minus)(n[p],n[p-1])));for(var f=[(0,c.plus)(n[0],l(a[0],a[1]))],p=1;s-2>=p;p++)f.push((0,c.minus)(n[p],(0,c.average)([a[p],a[p-1]])));f.push((0,c.minus)(n[s-1],l(a[s-2],a[s-3])));var d=f[0],h=f[1],m=n[0],v=n[1],g=(e=(0,o["default"])()).moveto.apply(e,i(m)).curveto(d[0],d[1],h[0],h[1],v[0],v[1]);return{path:(0,c.range)(2,s).reduce(function(t,e){var r=f[e],i=n[e];return t.smoothcurveto(r[0],r[1],i[0],i[1])},g),centroid:(0,c.average)(n)}},e.exports=n["default"]},{198:198,199:199,200:200}],196:[function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(n,"__esModule",{value:!0});var i=function(){function t(t,e){var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){i=!0,a=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}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")}}(),a=t(197),o=r(a),s=t(198),u=1e-5,c=function(t,e){var n=t.map(e),r=n.sort(function(t,e){var n=i(t,2),r=n[0],a=(n[1],i(e,2)),o=a[0];a[1];return r-o}),a=r.length,o=r[0][0],c=r[a-1][0],l=(0,s.minBy)(r,function(t){return t[1]}),p=(0,s.maxBy)(r,function(t){return t[1]});return o==c&&(c+=u),l==p&&(p+=u),{points:r,xmin:o,xmax:c,ymin:l,ymax:p}};n["default"]=function(t){var e=t.data,n=t.xaccessor,r=t.yaccessor,a=t.width,u=t.height,l=t.closed,p=t.min,f=t.max;n||(n=function(t){var e=i(t,2),n=e[0];e[1];return n}),r||(r=function(t){var e=i(t,2),n=(e[0],e[1]);return n});var d=function(t){return[n(t),r(t)]},h=e.map(function(t){return c(t,d)}),m=(0,s.minBy)(h,function(t){return t.xmin}),v=(0,s.maxBy)(h,function(t){return t.xmax}),g=null==p?(0,s.minBy)(h,function(t){return t.ymin}):p,b=null==f?(0,s.maxBy)(h,function(t){return t.ymax}):f;l&&(g=Math.min(g,0),b=Math.max(b,0));var y=l?0:g,x=(0,o["default"])([m,v],[0,a]),w=(0,o["default"])([g,b],[u,0]),_=function(t){var e=i(t,2),n=e[0],r=e[1];return[x(n),w(r)]};return{arranged:h,scale:_,xscale:x,yscale:w,base:y}},e.exports=n["default"]},{197:197,198:198}],197:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){i=!0,a=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}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=function a(t,e){var n=r(t,2),i=n[0],o=n[1],s=r(e,2),u=s[0],c=s[1],l=function(t){return u+(c-u)*(t-i)/(o-i)};return l.inverse=function(){return a([u,c],[i,o])},l};n["default"]=i,e.exports=n["default"]},{}],198:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){i=!0,a=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}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=function(t){return t.reduce(function(t,e){return t+e},0)},a=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)},c=function(t,e){return t.reduce(function(t,n){return Math.max(t,e(n))},-(1/0))},l=function(t,e){var n=r(t,2),i=n[0],a=n[1],o=r(e,2),s=o[0],u=o[1];return[i+s,a+u]},p=function(t,e){var n=r(t,2),i=n[0],a=n[1],o=r(e,2),s=o[0],u=o[1];return[i-s,a-u]},f=function(t,e){var n=r(e,2),i=n[0],a=n[1];return[t*i,t*a]},d=function(t){var e=r(t,2),n=e[0],i=e[1];return Math.sqrt(n*n+i*i)},h=function(t){return t.reduce(l,[0,0])},m=function(t){return f(1/t.length,t.reduce(l))},v=function(t,e){return f(t,[Math.sin(e),-Math.cos(e)])},g=function(t,e){var n=t||{};for(var r in n){var i=n[r];e[r]=i(e.index,e.item,e.group)}return e},b=function(t,e,n){for(var r=[],i=t;e>i;i++)r.push(i);return n&&r.push(e),r},y=function(t,e){var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=Object.keys(t)[Symbol.iterator]();!(r=(o=s.next()).done);r=!0){var u=o.value,c=t[u];n.push(e(u,c))}}catch(l){i=!0,a=l}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}return n},x=function(t){return y(t,function(t,e){return[t,e]})},w=function(t){return t};n.sum=i,n.min=a,n.max=o,n.sumBy=s,n.minBy=u,n.maxBy=c,n.plus=l,n.minus=p,n.times=f,n.id=w,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:i,min:a,max:o,sumBy:s,minBy:u,maxBy:c,plus:l,minus:p,times:f,id:w,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 r=function(){function t(t,e){var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){i=!0,a=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}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=function a(t){var e=t||[],n=function(t,e){var n=t.slice(0,t.length);return n.push(e),n},i=function(t,e){var n=r(t,2),i=n[0],a=n[1],o=r(e,2),s=o[0],u=o[1];return i===s&&a===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,r=n.map(function(t){return s(t,6)});return e+" "+r.join(" ")},c=function(t,e){var n=t.command,i=t.params,a=r(e,2),o=a[0],s=a[1];switch(n){case"M":return[i[0],i[1]];case"L":return[i[0],i[1]];case"H":return[i[0],s];case"V":return[o,i[0]];case"Z":return null;case"C":return[i[4],i[5]];case"S":return[i[2],i[3]];case"Q":return[i[2],i[3]];case"T":return[i[0],i[1]];case"A":return[i[5],i[6]]}},l=function(t,e){return function(n){var r="object"==typeof n?t.map(function(t){return n[t]}):arguments;return e.apply(null,r)}},p=function(t){return a(n(e,t))};return{moveto:l(["x","y"],function(t,e){return p({command:"M",params:[t,e]})}),lineto:l(["x","y"],function(t,e){return p({command:"L",params:[t,e]})}),hlineto:l(["x"],function(t){return p({command:"H",params:[t]})}),vlineto:l(["y"],function(t){return p({command:"V",params:[t]})}),closepath:function(){return p({command:"Z",params:[]})},curveto:l(["x1","y1","x2","y2","x","y"],function(t,e,n,r,i,a){return p({command:"C",params:[t,e,n,r,i,a]})}),smoothcurveto:l(["x2","y2","x","y"],function(t,e,n,r){return p({command:"S",params:[t,e,n,r]})}),qcurveto:l(["x1","y1","x","y"],function(t,e,n,r){return p({command:"Q",params:[t,e,n,r]})}),smoothqcurveto:l(["x","y"],function(t,e){return p({command:"T",params:[t,e]})}),arc:l(["rx","ry","xrot","largeArcFlag","sweepFlag","x","y"],function(t,e,n,r,i,a,o){return p({command:"A",params:[t,e,n,r,i,a,o]})}),print:function(){return e.map(u).join(" ")},points:function(){var t=[],n=[0,0],r=!0,i=!1,a=void 0;try{for(var o,s=e[Symbol.iterator]();!(r=(o=s.next()).done);r=!0){var u=o.value,l=c(u,n);n=l,l&&t.push(l)}}catch(p){i=!0,a=p}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}return t},instructions:function(){return e.slice(0,e.length)},connect:function(t){var e=this.points(),n=e[e.length-1],r=t.points()[0],o=t.instructions().slice(1);return i(n,r)||o.unshift({command:"L",params:r}),a(this.instructions().concat(o))}}};n["default"]=function(){return i()},e.exports=n["default"]},{}],200:[function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function i(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1)for(var n=1;n1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];for(var i,a;a=n.shift();)for(i in a)Mo.call(a,i)&&(t[i]=a[i]);return t}function i(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function a(t){return"[object Array]"===Lo.call(t)}function o(t){return Fo.test(Lo.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 c(t){return t&&"[object Object]"===Lo.call(t)}function l(t,e){return t.replace(/%s/g,function(){return e.shift()})}function p(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];throw t=l(t,n),Error(t)}function f(){Mv.DEBUG&&Po.apply(null,arguments)}function d(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];t=l(t,n),To(t,n)}function h(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];t=l(t,n),No[t]||(No[t]=!0,To(t,n))}function m(){Mv.DEBUG&&d.apply(null,arguments)}function v(){Mv.DEBUG&&h.apply(null,arguments)}function g(t,e,n){var r=b(t,e,n);return r?r[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,r,i,a,o;for(e=t.split("."),(n=Wo[e.length])||(n=w(e.length)),a=[],r=function(t,n){return t?"*":e[n]},i=n.length;i--;)o=n[i].map(r).join("."),a.hasOwnProperty(o)||(a.push(o),a[o]=!0);return a}function w(t){var e,n,r,i,a,o,s,u,c="";if(!Wo[t]){for(r=[];c.length=a;a+=1){for(n=a.toString(2);n.lengtho;o++)u.push(i(n[o]));r[a]=u}Wo[t]=r}return Wo[t]}function _(t,e,n,r){var i=t[e];if(!i||!i.equalsOrStartsWith(r)&&i.equalsOrStartsWith(n))return t[e]=i?i.replace(n,r):r,!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 $o(t)),Ko[t])}function S(t,e){function n(e,n){var r,i,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(r=t.viewmodel.wrapped[n.str],i=r?r.get():t.viewmodel.get(n),o=i?Object.keys(i):null),o&&o.forEach(function(t){"_ractive"===t&&a(i)||e.push(n.join(t))}),e}var r,i,o;for(r=e.str.split("."),o=[Yo];i=r.shift();)"*"===i?o=o.reduce(n,[]):o[0]===Yo?o[0]=E(i):o=o.map(O(i));return o}function O(t){return function(e){return e.join(t)}}function C(t){return t?t.replace(Ho,".$1"):""}function A(t,e,n){if("string"!=typeof e||!u(n))throw Error("Bad arguments");var r=void 0,i=void 0;if(/\*/.test(e))return i={},S(t,E(C(e))).forEach(function(e){var r=t.viewmodel.get(e);if(!u(r))throw Error(Zo);i[e.str]=r+n}),t.set(i);if(r=t.get(e),!u(r))throw Error(Zo);return t.set(e,+r+n)}function P(t,e){return Jo(this,t,void 0===e?1:+e)}function T(t){this.event=t,this.method="on"+t,this.deprecate=rs[t]}function j(t,e){var n=t.indexOf(e);-1===n&&t.push(e)}function M(t,e){for(var n=0,r=t.length;r>n;n++)if(t[n]==e)return!0;return!1}function L(t,e){var n;if(!a(t)||!a(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 F(t){return"string"==typeof t?[t]:void 0===t?[]:t}function N(t){return t[t.length-1]}function R(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function D(t){for(var e=[],n=t.length;n--;)e[n]=t[n];return e}function I(t){setTimeout(t,0)}function q(t,e){return function(){for(var n;n=t.shift();)n(e)}}function B(t,e,n,r){var i;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");
-if(e instanceof is)e.then(n,r);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{i=e.then}catch(a){return void r(a)}if("function"==typeof i){var o,s,u;s=function(e){o||(o=!0,B(t,e,n,r))},u=function(t){o||(o=!0,r(t))};try{i.call(e,s,u)}catch(a){if(!o)return r(a),void(o=!0)}}else n(e)}}function V(t,e,n){var r;return e=C(e),"~/"===e.substr(0,2)?(r=E(e.substring(2)),W(t,r.firstKey,n)):"."===e[0]?(r=U(ls(n),e),r&&W(t,r.firstKey,n)):r=z(t,E(e),n),r}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 z(t,e,n,r){var i,a,o,s,u;if(e.isRoot)return e;for(a=e.firstKey;n;)if(i=n.context,n=n.parent,i&&(s=!0,o=t.viewmodel.get(i),o&&("object"==typeof o||"function"==typeof o)&&a in o))return i.join(e.str);return H(t.viewmodel,a)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,a=E(a),u=z(t.parent,a,n,!0))?(t.viewmodel.map(a,{origin:t.parent.viewmodel,keypath:u}),e):r||s?void 0:(t.viewmodel.set(e,void 0),e)}function W(t,e){var n;!t.parent||t.isolated||H(t.viewmodel,e)||(e=E(e),(n=z(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function H(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function G(t){t.teardown()}function K(t){t.unbind()}function $(t){t.unrender()}function Q(t){t.cancel()}function Y(t){t.detach()}function J(t){t.detachNodes()}function Z(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 X(){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;a--)i=t._subs[e[a]],i&&(s=gt(t,i,n,r)&&s);if(zs.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,r)}}function gt(t,e,n,r){var i=null,a=!1;n&&!n._noArg&&(r=[n].concat(r)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,r)===!1&&(a=!0);return n&&!n._noArg&&a&&(i=n.original)&&(i.preventDefault&&i.preventDefault(),i.stopPropagation&&i.stopPropagation()),!a}function bt(t){var e={args:Array.prototype.slice.call(arguments,1)};Ws(this,t,e)}function yt(t){var e;return t=E(C(t)),e=this.viewmodel.get(t,Ks),void 0===e&&this.parent&&!this.isolated&&ps(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,wt(this)}function wt(t){Qs.fire(t),t.findAllComponents("*").forEach(function(t){wt(t.instance)})}function _t(t,e,n){var r,i;return t=E(C(t)),r=this.viewmodel.get(t),a(r)&&a(e)?(i=bs.start(this,!0),this.viewmodel.merge(t,r,e,n),bs.end(),i):this.set(t,e,n&&n.complete)}function kt(t,e){var n,r;return n=S(t,e),r={},n.forEach(function(e){r[e.str]=t.get(e.str)}),r}function Et(t,e,n,r){var i,a,o;e=E(C(e)),r=r||lu,e.isPattern?(i=new uu(t,e,n,r),t.viewmodel.patternObservers.push(i),a=!0):i=new Xs(t,e,n,r),i.init(r.init),t.viewmodel.register(e,i,a?"patternObservers":"observers"),i.ready=!0;var s={cancel:function(){var n;o||(a?(n=t.viewmodel.patternObservers.indexOf(i),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,i,"patternObservers")):t.viewmodel.unregister(e,i,"observers"),o=!0)}};return t._observers.push(s),s}function St(t,e,n){var r,i,a,o;if(c(t)){n=e,i=t,r=[];for(t in i)i.hasOwnProperty(t)&&(e=i[t],r.push(this.observe(t,e,n)));return{cancel:function(){for(;r.length;)r.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",cu(this,t,e,n);if(a=t.split(" "),1===a.length)return cu(this,t,e,n);for(r=[],o=a.length;o--;)t=a[o],t&&r.push(cu(this,t,e,n));return{cancel:function(){for(;r.length;)r.pop().cancel()}}}function Ot(t,e,n){var r=this.observe(t,function(){e.apply(this,arguments),r.cancel()},{init:!1,defer:n&&n.defer});return r}function Ct(t,e){var n,r=this;if(t)n=t.split(" ").map(du).filter(hu),n.forEach(function(t){var n,i;(n=r._subs[t])&&(e?(i=n.indexOf(e),-1!==i&&n.splice(i,1)):r._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function At(t,e){var n,r,i,a=this;if("object"==typeof t){n=[];for(r in t)t.hasOwnProperty(r)&&n.push(this.on(r,t[r]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return i=t.split(" ").map(du).filter(hu),i.forEach(function(t){(a._subs[t]||(a._subs[t]=[])).push(e)}),{cancel:function(){return a.off(t,e)}}}function Pt(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function Tt(t,e,n){var r,i,a,o,s,u,c=[];if(r=jt(t,e,n),!r)return null;for(i=t.length,s=r.length-2-r[1],a=Math.min(i,r[0]),o=a+r[1],u=0;a>u;u+=1)c.push(u);for(;o>u;u+=1)c.push(-1);for(;i>u;u+=1)c.push(u+s);return 0!==s?c.touchedFrom=r[0]:c.touchedFrom=t.length,c}function jt(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 Mt(e,n){var r,i,a,o=this;if(a=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),r=bs.start(this,!0),bs.scheduleTask(function(){return ju.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&&Lt(s),e.innerHTML=""}return this.cssId&&Pu.apply(),e&&((i=e.__ractive_instances__)?i.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),bs.end(),this.transitionsEnabled=a,r.then(function(){return Mu.fire(o)})}function Lt(t){t.splice(0,t.length).forEach(G)}function Ft(t,e){for(var n=t.slice(),r=e.length;r--;)~n.indexOf(e[r])||n.push(e[r]);return n}function Nt(t,e){var n,r,i;return r='[data-ractive-css~="{'+e+'}"]',i=function(t){var e,n,i,a,o,s,u,c=[];for(e=[];n=Iu.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(a=e.map(Dt),u=e.length;u--;)s=a.slice(),i=e[u],s[u]=i.base+r+i.modifiers||"",o=a.slice(),o[u]=r+" "+o[u],c.push(s.join(" "),o.join(" "));return c.join(", ")},n=Bu.test(t)?t.replace(Bu,r):t.replace(Du,"").replace(Ru,function(t,e){var n,r;return qu.test(e)?t:(n=e.split(",").map(Rt),r=n.map(i).join(", ")+" ",t.replace(e,r))})}function Rt(t){return t.trim?t.trim():t.replace(/^\s+/,"").replace(/\s+$/,"")}function Dt(t){return t.str}function It(t){t&&t.constructor!==Object&&("function"==typeof t||("object"!=typeof t?p("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 qt(t,e){It(e);var n="function"==typeof t,r="function"==typeof e;return e||n||(e={}),n||r?function(){var i=r?Bt(e,this):e,a=n?Bt(t,this):t;return Vt(i,a)}:Vt(e,t)}function Bt(t,e){var n=t.call(e);if(n)return"object"!=typeof n&&p("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 Vt(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($u);return e.parse=function(e,n){return zt(e,n||t)},e}function zt(t,e){if(!Gu)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Gu(t,e||this.options)}function Wt(t,e){var n;if(!Za){if(e&&e.noThrow)return;throw Error("Cannot retrieve template #"+t+" as Ractive is not running in a browser.")}if(Ht(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)if(has(O, key = names[i++])){
+ ~arrayIndexOf(result, key) || result.push(key);
+ }
+ return result;
+ };
+};
+var Empty = function(){};
+$export($export.S, 'Object', {
+ // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
+ getPrototypeOf: $.getProto = $.getProto || function(O){
+ O = toObject(O);
+ if(has(O, IE_PROTO))return O[IE_PROTO];
+ if(typeof O.constructor == 'function' && O instanceof O.constructor){
+ return O.constructor.prototype;
+ } return O instanceof Object ? ObjectProto : null;
+ },
+ // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
+ getOwnPropertyNames: $.getNames = $.getNames || createGetKeys(keys2, keys2.length, true),
+ // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
+ create: $.create = $.create || function(O, /*?*/Properties){
+ var result;
+ if(O !== null){
+ Empty.prototype = anObject(O);
+ result = new Empty();
+ Empty.prototype = null;
+ // add "__proto__" for Object.getPrototypeOf shim
+ result[IE_PROTO] = O;
+ } else result = createDict();
+ return Properties === undefined ? result : defineProperties(result, Properties);
+ },
+ // 19.1.2.14 / 15.2.3.14 Object.keys(O)
+ keys: $.getKeys = $.getKeys || createGetKeys(keys1, keysLen1, false)
+});
+
+var construct = function(F, len, args){
+ if(!(len in factories)){
+ for(var n = [], i = 0; i < len; i++)n[i] = 'a[' + i + ']';
+ factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');
+ }
+ return factories[len](F, args);
+};
+
+// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)
+$export($export.P, 'Function', {
+ bind: function bind(that /*, args... */){
+ var fn = aFunction(this)
+ , partArgs = arraySlice.call(arguments, 1);
+ var bound = function(/* args... */){
+ var args = partArgs.concat(arraySlice.call(arguments));
+ return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);
+ };
+ if(isObject(fn.prototype))bound.prototype = fn.prototype;
+ return bound;
+ }
+});
+
+// fallback for not array-like ES3 strings and DOM objects
+$export($export.P + $export.F * fails(function(){
+ if(html)arraySlice.call(html);
+}), 'Array', {
+ slice: function(begin, end){
+ var len = toLength(this.length)
+ , klass = cof(this);
+ end = end === undefined ? len : end;
+ if(klass == 'Array')return arraySlice.call(this, begin, end);
+ var start = toIndex(begin, len)
+ , upTo = toIndex(end, len)
+ , size = toLength(upTo - start)
+ , cloned = Array(size)
+ , i = 0;
+ for(; i < size; i++)cloned[i] = klass == 'String'
+ ? this.charAt(start + i)
+ : this[start + i];
+ return cloned;
+ }
+});
+$export($export.P + $export.F * (IObject != Object), 'Array', {
+ join: function join(separator){
+ return arrayJoin.call(IObject(this), separator === undefined ? ',' : separator);
+ }
+});
+
+// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)
+$export($export.S, 'Array', {isArray: require('./$.is-array')});
+
+var createArrayReduce = function(isRight){
+ return function(callbackfn, memo){
+ aFunction(callbackfn);
+ var O = IObject(this)
+ , length = toLength(O.length)
+ , index = isRight ? length - 1 : 0
+ , i = isRight ? -1 : 1;
+ if(arguments.length < 2)for(;;){
+ if(index in O){
+ memo = O[index];
+ index += i;
+ break;
+ }
+ index += i;
+ if(isRight ? index < 0 : length <= index){
+ throw TypeError('Reduce of empty array with no initial value');
+ }
+ }
+ for(;isRight ? index >= 0 : length > index; index += i)if(index in O){
+ memo = callbackfn(memo, O[index], index, this);
+ }
+ return memo;
+ };
+};
+
+var methodize = function($fn){
+ return function(arg1/*, arg2 = undefined */){
+ return $fn(this, arg1, arguments[1]);
+ };
+};
+
+$export($export.P, 'Array', {
+ // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])
+ forEach: $.each = $.each || methodize(createArrayMethod(0)),
+ // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])
+ map: methodize(createArrayMethod(1)),
+ // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])
+ filter: methodize(createArrayMethod(2)),
+ // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])
+ some: methodize(createArrayMethod(3)),
+ // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])
+ every: methodize(createArrayMethod(4)),
+ // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])
+ reduce: createArrayReduce(false),
+ // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])
+ reduceRight: createArrayReduce(true),
+ // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])
+ indexOf: methodize(arrayIndexOf),
+ // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])
+ lastIndexOf: function(el, fromIndex /* = @[*-1] */){
+ var O = toIObject(this)
+ , length = toLength(O.length)
+ , index = length - 1;
+ if(arguments.length > 1)index = Math.min(index, toInteger(fromIndex));
+ if(index < 0)index = toLength(length + index);
+ for(;index >= 0; index--)if(index in O)if(O[index] === el)return index;
+ return -1;
+ }
+});
+
+// 20.3.3.1 / 15.9.4.4 Date.now()
+$export($export.S, 'Date', {now: function(){ return +new Date; }});
+
+var lz = function(num){
+ return num > 9 ? num : '0' + num;
+};
+
+// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()
+// PhantomJS / old WebKit has a broken implementations
+$export($export.P + $export.F * (fails(function(){
+ return new Date(-5e13 - 1).toISOString() != '0385-07-25T07:06:39.999Z';
+}) || !fails(function(){
+ new Date(NaN).toISOString();
+})), 'Date', {
+ toISOString: function toISOString(){
+ if(!isFinite(this))throw RangeError('Invalid time value');
+ var d = this
+ , y = d.getUTCFullYear()
+ , m = d.getUTCMilliseconds()
+ , s = y < 0 ? '-' : y > 9999 ? '+' : '';
+ return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) +
+ '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) +
+ 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) +
+ ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';
+ }
+});
+},{"./$":46,"./$.a-function":2,"./$.an-object":4,"./$.array-includes":7,"./$.array-methods":8,"./$.cof":11,"./$.descriptors":19,"./$.dom-create":20,"./$.export":22,"./$.fails":24,"./$.has":30,"./$.html":32,"./$.invoke":33,"./$.iobject":34,"./$.is-array":36,"./$.is-object":38,"./$.property-desc":59,"./$.to-index":76,"./$.to-integer":77,"./$.to-iobject":78,"./$.to-length":79,"./$.to-object":80,"./$.uid":82}],86:[function(require,module,exports){
+// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)
+var $export = require('./$.export');
+
+$export($export.P, 'Array', {copyWithin: require('./$.array-copy-within')});
+
+require('./$.add-to-unscopables')('copyWithin');
+},{"./$.add-to-unscopables":3,"./$.array-copy-within":5,"./$.export":22}],87:[function(require,module,exports){
+// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)
+var $export = require('./$.export');
+
+$export($export.P, 'Array', {fill: require('./$.array-fill')});
+
+require('./$.add-to-unscopables')('fill');
+},{"./$.add-to-unscopables":3,"./$.array-fill":6,"./$.export":22}],88:[function(require,module,exports){
+'use strict';
+// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)
+var $export = require('./$.export')
+ , $find = require('./$.array-methods')(6)
+ , KEY = 'findIndex'
+ , forced = true;
+// Shouldn't skip holes
+if(KEY in [])Array(1)[KEY](function(){ forced = false; });
+$export($export.P + $export.F * forced, 'Array', {
+ findIndex: function findIndex(callbackfn/*, that = undefined */){
+ return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+require('./$.add-to-unscopables')(KEY);
+},{"./$.add-to-unscopables":3,"./$.array-methods":8,"./$.export":22}],89:[function(require,module,exports){
+'use strict';
+// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)
+var $export = require('./$.export')
+ , $find = require('./$.array-methods')(5)
+ , KEY = 'find'
+ , forced = true;
+// Shouldn't skip holes
+if(KEY in [])Array(1)[KEY](function(){ forced = false; });
+$export($export.P + $export.F * forced, 'Array', {
+ find: function find(callbackfn/*, that = undefined */){
+ return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+require('./$.add-to-unscopables')(KEY);
+},{"./$.add-to-unscopables":3,"./$.array-methods":8,"./$.export":22}],90:[function(require,module,exports){
+'use strict';
+var ctx = require('./$.ctx')
+ , $export = require('./$.export')
+ , toObject = require('./$.to-object')
+ , call = require('./$.iter-call')
+ , isArrayIter = require('./$.is-array-iter')
+ , toLength = require('./$.to-length')
+ , getIterFn = require('./core.get-iterator-method');
+$export($export.S + $export.F * !require('./$.iter-detect')(function(iter){ Array.from(iter); }), 'Array', {
+ // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
+ from: function from(arrayLike/*, mapfn = undefined, thisArg = undefined*/){
+ var O = toObject(arrayLike)
+ , C = typeof this == 'function' ? this : Array
+ , $$ = arguments
+ , $$len = $$.length
+ , mapfn = $$len > 1 ? $$[1] : undefined
+ , mapping = mapfn !== undefined
+ , index = 0
+ , iterFn = getIterFn(O)
+ , length, result, step, iterator;
+ if(mapping)mapfn = ctx(mapfn, $$len > 2 ? $$[2] : undefined, 2);
+ // if object isn't iterable or it's array with default iterator - use simple case
+ if(iterFn != undefined && !(C == Array && isArrayIter(iterFn))){
+ for(iterator = iterFn.call(O), result = new C; !(step = iterator.next()).done; index++){
+ result[index] = mapping ? call(iterator, mapfn, [step.value, index], true) : step.value;
+ }
+ } else {
+ length = toLength(O.length);
+ for(result = new C(length); length > index; index++){
+ result[index] = mapping ? mapfn(O[index], index) : O[index];
+ }
+ }
+ result.length = index;
+ return result;
+ }
+});
+
+},{"./$.ctx":17,"./$.export":22,"./$.is-array-iter":35,"./$.iter-call":40,"./$.iter-detect":43,"./$.to-length":79,"./$.to-object":80,"./core.get-iterator-method":84}],91:[function(require,module,exports){
+'use strict';
+var addToUnscopables = require('./$.add-to-unscopables')
+ , step = require('./$.iter-step')
+ , Iterators = require('./$.iterators')
+ , toIObject = require('./$.to-iobject');
+
+// 22.1.3.4 Array.prototype.entries()
+// 22.1.3.13 Array.prototype.keys()
+// 22.1.3.29 Array.prototype.values()
+// 22.1.3.30 Array.prototype[@@iterator]()
+module.exports = require('./$.iter-define')(Array, 'Array', function(iterated, kind){
+ this._t = toIObject(iterated); // target
+ this._i = 0; // next index
+ this._k = kind; // kind
+// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
+}, function(){
+ var O = this._t
+ , kind = this._k
+ , index = this._i++;
+ if(!O || index >= O.length){
+ this._t = undefined;
+ return step(1);
+ }
+ if(kind == 'keys' )return step(0, index);
+ if(kind == 'values')return step(0, O[index]);
+ return step(0, [index, O[index]]);
+}, 'values');
+
+// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
+Iterators.Arguments = Iterators.Array;
+
+addToUnscopables('keys');
+addToUnscopables('values');
+addToUnscopables('entries');
+},{"./$.add-to-unscopables":3,"./$.iter-define":42,"./$.iter-step":44,"./$.iterators":45,"./$.to-iobject":78}],92:[function(require,module,exports){
+'use strict';
+var $export = require('./$.export');
+
+// WebKit Array.of isn't generic
+$export($export.S + $export.F * require('./$.fails')(function(){
+ function F(){}
+ return !(Array.of.call(F) instanceof F);
+}), 'Array', {
+ // 22.1.2.3 Array.of( ...items)
+ of: function of(/* ...args */){
+ var index = 0
+ , $$ = arguments
+ , $$len = $$.length
+ , result = new (typeof this == 'function' ? this : Array)($$len);
+ while($$len > index)result[index] = $$[index++];
+ result.length = $$len;
+ return result;
+ }
+});
+},{"./$.export":22,"./$.fails":24}],93:[function(require,module,exports){
+require('./$.set-species')('Array');
+},{"./$.set-species":65}],94:[function(require,module,exports){
+'use strict';
+var $ = require('./$')
+ , isObject = require('./$.is-object')
+ , HAS_INSTANCE = require('./$.wks')('hasInstance')
+ , FunctionProto = Function.prototype;
+// 19.2.3.6 Function.prototype[@@hasInstance](V)
+if(!(HAS_INSTANCE in FunctionProto))$.setDesc(FunctionProto, HAS_INSTANCE, {value: function(O){
+ if(typeof this != 'function' || !isObject(O))return false;
+ if(!isObject(this.prototype))return O instanceof this;
+ // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:
+ while(O = $.getProto(O))if(this.prototype === O)return true;
+ return false;
+}});
+},{"./$":46,"./$.is-object":38,"./$.wks":83}],95:[function(require,module,exports){
+var setDesc = require('./$').setDesc
+ , createDesc = require('./$.property-desc')
+ , has = require('./$.has')
+ , FProto = Function.prototype
+ , nameRE = /^\s*function ([^ (]*)/
+ , NAME = 'name';
+// 19.2.4.2 name
+NAME in FProto || require('./$.descriptors') && setDesc(FProto, NAME, {
+ configurable: true,
+ get: function(){
+ var match = ('' + this).match(nameRE)
+ , name = match ? match[1] : '';
+ has(this, NAME) || setDesc(this, NAME, createDesc(5, name));
+ return name;
+ }
+});
+},{"./$":46,"./$.descriptors":19,"./$.has":30,"./$.property-desc":59}],96:[function(require,module,exports){
+'use strict';
+var strong = require('./$.collection-strong');
+
+// 23.1 Map Objects
+require('./$.collection')('Map', function(get){
+ return function Map(){ return get(this, arguments.length > 0 ? arguments[0] : undefined); };
+}, {
+ // 23.1.3.6 Map.prototype.get(key)
+ get: function get(key){
+ var entry = strong.getEntry(this, key);
+ return entry && entry.v;
+ },
+ // 23.1.3.9 Map.prototype.set(key, value)
+ set: function set(key, value){
+ return strong.def(this, key === 0 ? 0 : key, value);
+ }
+}, strong, true);
+},{"./$.collection":15,"./$.collection-strong":12}],97:[function(require,module,exports){
+// 20.2.2.3 Math.acosh(x)
+var $export = require('./$.export')
+ , log1p = require('./$.math-log1p')
+ , sqrt = Math.sqrt
+ , $acosh = Math.acosh;
+
+// V8 bug https://code.google.com/p/v8/issues/detail?id=3509
+$export($export.S + $export.F * !($acosh && Math.floor($acosh(Number.MAX_VALUE)) == 710), 'Math', {
+ acosh: function acosh(x){
+ return (x = +x) < 1 ? NaN : x > 94906265.62425156
+ ? Math.log(x) + Math.LN2
+ : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));
+ }
+});
+},{"./$.export":22,"./$.math-log1p":50}],98:[function(require,module,exports){
+// 20.2.2.5 Math.asinh(x)
+var $export = require('./$.export');
+
+function asinh(x){
+ return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));
+}
+
+$export($export.S, 'Math', {asinh: asinh});
+},{"./$.export":22}],99:[function(require,module,exports){
+// 20.2.2.7 Math.atanh(x)
+var $export = require('./$.export');
+
+$export($export.S, 'Math', {
+ atanh: function atanh(x){
+ return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;
+ }
+});
+},{"./$.export":22}],100:[function(require,module,exports){
+// 20.2.2.9 Math.cbrt(x)
+var $export = require('./$.export')
+ , sign = require('./$.math-sign');
+
+$export($export.S, 'Math', {
+ cbrt: function cbrt(x){
+ return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);
+ }
+});
+},{"./$.export":22,"./$.math-sign":51}],101:[function(require,module,exports){
+// 20.2.2.11 Math.clz32(x)
+var $export = require('./$.export');
+
+$export($export.S, 'Math', {
+ clz32: function clz32(x){
+ return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;
+ }
+});
+},{"./$.export":22}],102:[function(require,module,exports){
+// 20.2.2.12 Math.cosh(x)
+var $export = require('./$.export')
+ , exp = Math.exp;
+
+$export($export.S, 'Math', {
+ cosh: function cosh(x){
+ return (exp(x = +x) + exp(-x)) / 2;
+ }
+});
+},{"./$.export":22}],103:[function(require,module,exports){
+// 20.2.2.14 Math.expm1(x)
+var $export = require('./$.export');
+
+$export($export.S, 'Math', {expm1: require('./$.math-expm1')});
+},{"./$.export":22,"./$.math-expm1":49}],104:[function(require,module,exports){
+// 20.2.2.16 Math.fround(x)
+var $export = require('./$.export')
+ , sign = require('./$.math-sign')
+ , pow = Math.pow
+ , EPSILON = pow(2, -52)
+ , EPSILON32 = pow(2, -23)
+ , MAX32 = pow(2, 127) * (2 - EPSILON32)
+ , MIN32 = pow(2, -126);
+
+var roundTiesToEven = function(n){
+ return n + 1 / EPSILON - 1 / EPSILON;
+};
+
+
+$export($export.S, 'Math', {
+ fround: function fround(x){
+ var $abs = Math.abs(x)
+ , $sign = sign(x)
+ , a, result;
+ if($abs < MIN32)return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;
+ a = (1 + EPSILON32 / EPSILON) * $abs;
+ result = a - (a - $abs);
+ if(result > MAX32 || result != result)return $sign * Infinity;
+ return $sign * result;
+ }
+});
+},{"./$.export":22,"./$.math-sign":51}],105:[function(require,module,exports){
+// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])
+var $export = require('./$.export')
+ , abs = Math.abs;
+
+$export($export.S, 'Math', {
+ hypot: function hypot(value1, value2){ // eslint-disable-line no-unused-vars
+ var sum = 0
+ , i = 0
+ , $$ = arguments
+ , $$len = $$.length
+ , larg = 0
+ , arg, div;
+ while(i < $$len){
+ arg = abs($$[i++]);
+ if(larg < arg){
+ div = larg / arg;
+ sum = sum * div * div + 1;
+ larg = arg;
+ } else if(arg > 0){
+ div = arg / larg;
+ sum += div * div;
+ } else sum += arg;
+ }
+ return larg === Infinity ? Infinity : larg * Math.sqrt(sum);
+ }
+});
+},{"./$.export":22}],106:[function(require,module,exports){
+// 20.2.2.18 Math.imul(x, y)
+var $export = require('./$.export')
+ , $imul = Math.imul;
+
+// some WebKit versions fails with big numbers, some has wrong arity
+$export($export.S + $export.F * require('./$.fails')(function(){
+ return $imul(0xffffffff, 5) != -5 || $imul.length != 2;
+}), 'Math', {
+ imul: function imul(x, y){
+ var UINT16 = 0xffff
+ , xn = +x
+ , yn = +y
+ , xl = UINT16 & xn
+ , yl = UINT16 & yn;
+ return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);
+ }
+});
+},{"./$.export":22,"./$.fails":24}],107:[function(require,module,exports){
+// 20.2.2.21 Math.log10(x)
+var $export = require('./$.export');
+
+$export($export.S, 'Math', {
+ log10: function log10(x){
+ return Math.log(x) / Math.LN10;
+ }
+});
+},{"./$.export":22}],108:[function(require,module,exports){
+// 20.2.2.20 Math.log1p(x)
+var $export = require('./$.export');
+
+$export($export.S, 'Math', {log1p: require('./$.math-log1p')});
+},{"./$.export":22,"./$.math-log1p":50}],109:[function(require,module,exports){
+// 20.2.2.22 Math.log2(x)
+var $export = require('./$.export');
+
+$export($export.S, 'Math', {
+ log2: function log2(x){
+ return Math.log(x) / Math.LN2;
+ }
+});
+},{"./$.export":22}],110:[function(require,module,exports){
+// 20.2.2.28 Math.sign(x)
+var $export = require('./$.export');
+
+$export($export.S, 'Math', {sign: require('./$.math-sign')});
+},{"./$.export":22,"./$.math-sign":51}],111:[function(require,module,exports){
+// 20.2.2.30 Math.sinh(x)
+var $export = require('./$.export')
+ , expm1 = require('./$.math-expm1')
+ , exp = Math.exp;
+
+// V8 near Chromium 38 has a problem with very small numbers
+$export($export.S + $export.F * require('./$.fails')(function(){
+ return !Math.sinh(-2e-17) != -2e-17;
+}), 'Math', {
+ sinh: function sinh(x){
+ return Math.abs(x = +x) < 1
+ ? (expm1(x) - expm1(-x)) / 2
+ : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);
+ }
+});
+},{"./$.export":22,"./$.fails":24,"./$.math-expm1":49}],112:[function(require,module,exports){
+// 20.2.2.33 Math.tanh(x)
+var $export = require('./$.export')
+ , expm1 = require('./$.math-expm1')
+ , exp = Math.exp;
+
+$export($export.S, 'Math', {
+ tanh: function tanh(x){
+ var a = expm1(x = +x)
+ , b = expm1(-x);
+ return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));
+ }
+});
+},{"./$.export":22,"./$.math-expm1":49}],113:[function(require,module,exports){
+// 20.2.2.34 Math.trunc(x)
+var $export = require('./$.export');
+
+$export($export.S, 'Math', {
+ trunc: function trunc(it){
+ return (it > 0 ? Math.floor : Math.ceil)(it);
+ }
+});
+},{"./$.export":22}],114:[function(require,module,exports){
+'use strict';
+var $ = require('./$')
+ , global = require('./$.global')
+ , has = require('./$.has')
+ , cof = require('./$.cof')
+ , toPrimitive = require('./$.to-primitive')
+ , fails = require('./$.fails')
+ , $trim = require('./$.string-trim').trim
+ , NUMBER = 'Number'
+ , $Number = global[NUMBER]
+ , Base = $Number
+ , proto = $Number.prototype
+ // Opera ~12 has broken Object#toString
+ , BROKEN_COF = cof($.create(proto)) == NUMBER
+ , TRIM = 'trim' in String.prototype;
+
+// 7.1.3 ToNumber(argument)
+var toNumber = function(argument){
+ var it = toPrimitive(argument, false);
+ if(typeof it == 'string' && it.length > 2){
+ it = TRIM ? it.trim() : $trim(it, 3);
+ var first = it.charCodeAt(0)
+ , third, radix, maxCode;
+ if(first === 43 || first === 45){
+ third = it.charCodeAt(2);
+ if(third === 88 || third === 120)return NaN; // Number('+0x1') should be NaN, old V8 fix
+ } else if(first === 48){
+ switch(it.charCodeAt(1)){
+ case 66 : case 98 : radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i
+ case 79 : case 111 : radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i
+ default : return +it;
+ }
+ for(var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++){
+ code = digits.charCodeAt(i);
+ // parseInt parses a string to a first unavailable symbol
+ // but ToNumber should return NaN if a string contains unavailable symbols
+ if(code < 48 || code > maxCode)return NaN;
+ } return parseInt(digits, radix);
+ }
+ } return +it;
+};
+
+if(!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')){
+ $Number = function Number(value){
+ var it = arguments.length < 1 ? 0 : value
+ , that = this;
+ return that instanceof $Number
+ // check on 1..constructor(foo) case
+ && (BROKEN_COF ? fails(function(){ proto.valueOf.call(that); }) : cof(that) != NUMBER)
+ ? new Base(toNumber(it)) : toNumber(it);
+ };
+ $.each.call(require('./$.descriptors') ? $.getNames(Base) : (
+ // ES3:
+ 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +
+ // ES6 (in case, if modules with ES6 Number statics required before):
+ 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +
+ 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'
+ ).split(','), function(key){
+ if(has(Base, key) && !has($Number, key)){
+ $.setDesc($Number, key, $.getDesc(Base, key));
+ }
+ });
+ $Number.prototype = proto;
+ proto.constructor = $Number;
+ require('./$.redefine')(global, NUMBER, $Number);
+}
+},{"./$":46,"./$.cof":11,"./$.descriptors":19,"./$.fails":24,"./$.global":29,"./$.has":30,"./$.redefine":61,"./$.string-trim":74,"./$.to-primitive":81}],115:[function(require,module,exports){
+// 20.1.2.1 Number.EPSILON
+var $export = require('./$.export');
+
+$export($export.S, 'Number', {EPSILON: Math.pow(2, -52)});
+},{"./$.export":22}],116:[function(require,module,exports){
+// 20.1.2.2 Number.isFinite(number)
+var $export = require('./$.export')
+ , _isFinite = require('./$.global').isFinite;
+
+$export($export.S, 'Number', {
+ isFinite: function isFinite(it){
+ return typeof it == 'number' && _isFinite(it);
+ }
+});
+},{"./$.export":22,"./$.global":29}],117:[function(require,module,exports){
+// 20.1.2.3 Number.isInteger(number)
+var $export = require('./$.export');
+
+$export($export.S, 'Number', {isInteger: require('./$.is-integer')});
+},{"./$.export":22,"./$.is-integer":37}],118:[function(require,module,exports){
+// 20.1.2.4 Number.isNaN(number)
+var $export = require('./$.export');
+
+$export($export.S, 'Number', {
+ isNaN: function isNaN(number){
+ return number != number;
+ }
+});
+},{"./$.export":22}],119:[function(require,module,exports){
+// 20.1.2.5 Number.isSafeInteger(number)
+var $export = require('./$.export')
+ , isInteger = require('./$.is-integer')
+ , abs = Math.abs;
+
+$export($export.S, 'Number', {
+ isSafeInteger: function isSafeInteger(number){
+ return isInteger(number) && abs(number) <= 0x1fffffffffffff;
+ }
+});
+},{"./$.export":22,"./$.is-integer":37}],120:[function(require,module,exports){
+// 20.1.2.6 Number.MAX_SAFE_INTEGER
+var $export = require('./$.export');
+
+$export($export.S, 'Number', {MAX_SAFE_INTEGER: 0x1fffffffffffff});
+},{"./$.export":22}],121:[function(require,module,exports){
+// 20.1.2.10 Number.MIN_SAFE_INTEGER
+var $export = require('./$.export');
+
+$export($export.S, 'Number', {MIN_SAFE_INTEGER: -0x1fffffffffffff});
+},{"./$.export":22}],122:[function(require,module,exports){
+// 20.1.2.12 Number.parseFloat(string)
+var $export = require('./$.export');
+
+$export($export.S, 'Number', {parseFloat: parseFloat});
+},{"./$.export":22}],123:[function(require,module,exports){
+// 20.1.2.13 Number.parseInt(string, radix)
+var $export = require('./$.export');
+
+$export($export.S, 'Number', {parseInt: parseInt});
+},{"./$.export":22}],124:[function(require,module,exports){
+// 19.1.3.1 Object.assign(target, source)
+var $export = require('./$.export');
+
+$export($export.S + $export.F, 'Object', {assign: require('./$.object-assign')});
+},{"./$.export":22,"./$.object-assign":53}],125:[function(require,module,exports){
+// 19.1.2.5 Object.freeze(O)
+var isObject = require('./$.is-object');
+
+require('./$.object-sap')('freeze', function($freeze){
+ return function freeze(it){
+ return $freeze && isObject(it) ? $freeze(it) : it;
+ };
+});
+},{"./$.is-object":38,"./$.object-sap":54}],126:[function(require,module,exports){
+// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
+var toIObject = require('./$.to-iobject');
+
+require('./$.object-sap')('getOwnPropertyDescriptor', function($getOwnPropertyDescriptor){
+ return function getOwnPropertyDescriptor(it, key){
+ return $getOwnPropertyDescriptor(toIObject(it), key);
+ };
+});
+},{"./$.object-sap":54,"./$.to-iobject":78}],127:[function(require,module,exports){
+// 19.1.2.7 Object.getOwnPropertyNames(O)
+require('./$.object-sap')('getOwnPropertyNames', function(){
+ return require('./$.get-names').get;
+});
+},{"./$.get-names":28,"./$.object-sap":54}],128:[function(require,module,exports){
+// 19.1.2.9 Object.getPrototypeOf(O)
+var toObject = require('./$.to-object');
+
+require('./$.object-sap')('getPrototypeOf', function($getPrototypeOf){
+ return function getPrototypeOf(it){
+ return $getPrototypeOf(toObject(it));
+ };
+});
+},{"./$.object-sap":54,"./$.to-object":80}],129:[function(require,module,exports){
+// 19.1.2.11 Object.isExtensible(O)
+var isObject = require('./$.is-object');
+
+require('./$.object-sap')('isExtensible', function($isExtensible){
+ return function isExtensible(it){
+ return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;
+ };
+});
+},{"./$.is-object":38,"./$.object-sap":54}],130:[function(require,module,exports){
+// 19.1.2.12 Object.isFrozen(O)
+var isObject = require('./$.is-object');
+
+require('./$.object-sap')('isFrozen', function($isFrozen){
+ return function isFrozen(it){
+ return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;
+ };
+});
+},{"./$.is-object":38,"./$.object-sap":54}],131:[function(require,module,exports){
+// 19.1.2.13 Object.isSealed(O)
+var isObject = require('./$.is-object');
+
+require('./$.object-sap')('isSealed', function($isSealed){
+ return function isSealed(it){
+ return isObject(it) ? $isSealed ? $isSealed(it) : false : true;
+ };
+});
+},{"./$.is-object":38,"./$.object-sap":54}],132:[function(require,module,exports){
+// 19.1.3.10 Object.is(value1, value2)
+var $export = require('./$.export');
+$export($export.S, 'Object', {is: require('./$.same-value')});
+},{"./$.export":22,"./$.same-value":63}],133:[function(require,module,exports){
+// 19.1.2.14 Object.keys(O)
+var toObject = require('./$.to-object');
+
+require('./$.object-sap')('keys', function($keys){
+ return function keys(it){
+ return $keys(toObject(it));
+ };
+});
+},{"./$.object-sap":54,"./$.to-object":80}],134:[function(require,module,exports){
+// 19.1.2.15 Object.preventExtensions(O)
+var isObject = require('./$.is-object');
+
+require('./$.object-sap')('preventExtensions', function($preventExtensions){
+ return function preventExtensions(it){
+ return $preventExtensions && isObject(it) ? $preventExtensions(it) : it;
+ };
+});
+},{"./$.is-object":38,"./$.object-sap":54}],135:[function(require,module,exports){
+// 19.1.2.17 Object.seal(O)
+var isObject = require('./$.is-object');
+
+require('./$.object-sap')('seal', function($seal){
+ return function seal(it){
+ return $seal && isObject(it) ? $seal(it) : it;
+ };
+});
+},{"./$.is-object":38,"./$.object-sap":54}],136:[function(require,module,exports){
+// 19.1.3.19 Object.setPrototypeOf(O, proto)
+var $export = require('./$.export');
+$export($export.S, 'Object', {setPrototypeOf: require('./$.set-proto').set});
+},{"./$.export":22,"./$.set-proto":64}],137:[function(require,module,exports){
+'use strict';
+// 19.1.3.6 Object.prototype.toString()
+var classof = require('./$.classof')
+ , test = {};
+test[require('./$.wks')('toStringTag')] = 'z';
+if(test + '' != '[object z]'){
+ require('./$.redefine')(Object.prototype, 'toString', function toString(){
+ return '[object ' + classof(this) + ']';
+ }, true);
+}
+},{"./$.classof":10,"./$.redefine":61,"./$.wks":83}],138:[function(require,module,exports){
+'use strict';
+var $ = require('./$')
+ , LIBRARY = require('./$.library')
+ , global = require('./$.global')
+ , ctx = require('./$.ctx')
+ , classof = require('./$.classof')
+ , $export = require('./$.export')
+ , isObject = require('./$.is-object')
+ , anObject = require('./$.an-object')
+ , aFunction = require('./$.a-function')
+ , strictNew = require('./$.strict-new')
+ , forOf = require('./$.for-of')
+ , setProto = require('./$.set-proto').set
+ , same = require('./$.same-value')
+ , SPECIES = require('./$.wks')('species')
+ , speciesConstructor = require('./$.species-constructor')
+ , asap = require('./$.microtask')
+ , PROMISE = 'Promise'
+ , process = global.process
+ , isNode = classof(process) == 'process'
+ , P = global[PROMISE]
+ , Wrapper;
+
+var testResolve = function(sub){
+ var test = new P(function(){});
+ if(sub)test.constructor = Object;
+ return P.resolve(test) === test;
+};
+
+var USE_NATIVE = function(){
+ var works = false;
+ function P2(x){
+ var self = new P(x);
+ setProto(self, P2.prototype);
+ return self;
+ }
+ try {
+ works = P && P.resolve && testResolve();
+ setProto(P2, P);
+ P2.prototype = $.create(P.prototype, {constructor: {value: P2}});
+ // actual Firefox has broken subclass support, test that
+ if(!(P2.resolve(5).then(function(){}) instanceof P2)){
+ works = false;
+ }
+ // actual V8 bug, https://code.google.com/p/v8/issues/detail?id=4162
+ if(works && require('./$.descriptors')){
+ var thenableThenGotten = false;
+ P.resolve($.setDesc({}, 'then', {
+ get: function(){ thenableThenGotten = true; }
+ }));
+ works = thenableThenGotten;
+ }
+ } catch(e){ works = false; }
+ return works;
+}();
+
+// helpers
+var sameConstructor = function(a, b){
+ // library wrapper special case
+ if(LIBRARY && a === P && b === Wrapper)return true;
+ return same(a, b);
+};
+var getConstructor = function(C){
+ var S = anObject(C)[SPECIES];
+ return S != undefined ? S : C;
+};
+var isThenable = function(it){
+ var then;
+ return isObject(it) && typeof (then = it.then) == 'function' ? then : false;
+};
+var PromiseCapability = function(C){
+ var resolve, reject;
+ this.promise = new C(function($$resolve, $$reject){
+ if(resolve !== undefined || reject !== undefined)throw TypeError('Bad Promise constructor');
+ resolve = $$resolve;
+ reject = $$reject;
+ });
+ this.resolve = aFunction(resolve),
+ this.reject = aFunction(reject)
+};
+var perform = function(exec){
+ try {
+ exec();
+ } catch(e){
+ return {error: e};
+ }
+};
+var notify = function(record, isReject){
+ if(record.n)return;
+ record.n = true;
+ var chain = record.c;
+ asap(function(){
+ var value = record.v
+ , ok = record.s == 1
+ , i = 0;
+ var run = function(reaction){
+ var handler = ok ? reaction.ok : reaction.fail
+ , resolve = reaction.resolve
+ , reject = reaction.reject
+ , result, then;
+ try {
+ if(handler){
+ if(!ok)record.h = true;
+ result = handler === true ? value : handler(value);
+ if(result === reaction.promise){
+ reject(TypeError('Promise-chain cycle'));
+ } else if(then = isThenable(result)){
+ then.call(result, resolve, reject);
+ } else resolve(result);
+ } else reject(value);
+ } catch(e){
+ reject(e);
+ }
+ };
+ while(chain.length > i)run(chain[i++]); // variable length - can't use forEach
+ chain.length = 0;
+ record.n = false;
+ if(isReject)setTimeout(function(){
+ var promise = record.p
+ , handler, console;
+ if(isUnhandled(promise)){
+ if(isNode){
+ process.emit('unhandledRejection', value, promise);
+ } else if(handler = global.onunhandledrejection){
+ handler({promise: promise, reason: value});
+ } else if((console = global.console) && console.error){
+ console.error('Unhandled promise rejection', value);
+ }
+ } record.a = undefined;
+ }, 1);
+ });
+};
+var isUnhandled = function(promise){
+ var record = promise._d
+ , chain = record.a || record.c
+ , i = 0
+ , reaction;
+ if(record.h)return false;
+ while(chain.length > i){
+ reaction = chain[i++];
+ if(reaction.fail || !isUnhandled(reaction.promise))return false;
+ } return true;
+};
+var $reject = function(value){
+ var record = this;
+ if(record.d)return;
+ record.d = true;
+ record = record.r || record; // unwrap
+ record.v = value;
+ record.s = 2;
+ record.a = record.c.slice();
+ notify(record, true);
+};
+var $resolve = function(value){
+ var record = this
+ , then;
+ if(record.d)return;
+ record.d = true;
+ record = record.r || record; // unwrap
+ try {
+ if(record.p === value)throw TypeError("Promise can't be resolved itself");
+ if(then = isThenable(value)){
+ asap(function(){
+ var wrapper = {r: record, d: false}; // wrap
+ try {
+ then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));
+ } catch(e){
+ $reject.call(wrapper, e);
+ }
+ });
+ } else {
+ record.v = value;
+ record.s = 1;
+ notify(record, false);
+ }
+ } catch(e){
+ $reject.call({r: record, d: false}, e); // wrap
+ }
+};
+
+// constructor polyfill
+if(!USE_NATIVE){
+ // 25.4.3.1 Promise(executor)
+ P = function Promise(executor){
+ aFunction(executor);
+ var record = this._d = {
+ p: strictNew(this, P, PROMISE), // <- promise
+ c: [], // <- awaiting reactions
+ a: undefined, // <- checked in isUnhandled reactions
+ s: 0, // <- state
+ d: false, // <- done
+ v: undefined, // <- value
+ h: false, // <- handled rejection
+ n: false // <- notify
+ };
+ try {
+ executor(ctx($resolve, record, 1), ctx($reject, record, 1));
+ } catch(err){
+ $reject.call(record, err);
+ }
+ };
+ require('./$.redefine-all')(P.prototype, {
+ // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
+ then: function then(onFulfilled, onRejected){
+ var reaction = new PromiseCapability(speciesConstructor(this, P))
+ , promise = reaction.promise
+ , record = this._d;
+ reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
+ reaction.fail = typeof onRejected == 'function' && onRejected;
+ record.c.push(reaction);
+ if(record.a)record.a.push(reaction);
+ if(record.s)notify(record, false);
+ return promise;
+ },
+ // 25.4.5.1 Promise.prototype.catch(onRejected)
+ 'catch': function(onRejected){
+ return this.then(undefined, onRejected);
+ }
+ });
+}
+
+$export($export.G + $export.W + $export.F * !USE_NATIVE, {Promise: P});
+require('./$.set-to-string-tag')(P, PROMISE);
+require('./$.set-species')(PROMISE);
+Wrapper = require('./$.core')[PROMISE];
+
+// statics
+$export($export.S + $export.F * !USE_NATIVE, PROMISE, {
+ // 25.4.4.5 Promise.reject(r)
+ reject: function reject(r){
+ var capability = new PromiseCapability(this)
+ , $$reject = capability.reject;
+ $$reject(r);
+ return capability.promise;
+ }
+});
+$export($export.S + $export.F * (!USE_NATIVE || testResolve(true)), PROMISE, {
+ // 25.4.4.6 Promise.resolve(x)
+ resolve: function resolve(x){
+ // instanceof instead of internal slot check because we should fix it without replacement native Promise core
+ if(x instanceof P && sameConstructor(x.constructor, this))return x;
+ var capability = new PromiseCapability(this)
+ , $$resolve = capability.resolve;
+ $$resolve(x);
+ return capability.promise;
+ }
+});
+$export($export.S + $export.F * !(USE_NATIVE && require('./$.iter-detect')(function(iter){
+ P.all(iter)['catch'](function(){});
+})), PROMISE, {
+ // 25.4.4.1 Promise.all(iterable)
+ all: function all(iterable){
+ var C = getConstructor(this)
+ , capability = new PromiseCapability(C)
+ , resolve = capability.resolve
+ , reject = capability.reject
+ , values = [];
+ var abrupt = perform(function(){
+ forOf(iterable, false, values.push, values);
+ var remaining = values.length
+ , results = Array(remaining);
+ if(remaining)$.each.call(values, function(promise, index){
+ var alreadyCalled = false;
+ C.resolve(promise).then(function(value){
+ if(alreadyCalled)return;
+ alreadyCalled = true;
+ results[index] = value;
+ --remaining || resolve(results);
+ }, reject);
+ });
+ else resolve(results);
+ });
+ if(abrupt)reject(abrupt.error);
+ return capability.promise;
+ },
+ // 25.4.4.4 Promise.race(iterable)
+ race: function race(iterable){
+ var C = getConstructor(this)
+ , capability = new PromiseCapability(C)
+ , reject = capability.reject;
+ var abrupt = perform(function(){
+ forOf(iterable, false, function(promise){
+ C.resolve(promise).then(capability.resolve, reject);
+ });
+ });
+ if(abrupt)reject(abrupt.error);
+ return capability.promise;
+ }
+});
+},{"./$":46,"./$.a-function":2,"./$.an-object":4,"./$.classof":10,"./$.core":16,"./$.ctx":17,"./$.descriptors":19,"./$.export":22,"./$.for-of":27,"./$.global":29,"./$.is-object":38,"./$.iter-detect":43,"./$.library":48,"./$.microtask":52,"./$.redefine-all":60,"./$.same-value":63,"./$.set-proto":64,"./$.set-species":65,"./$.set-to-string-tag":66,"./$.species-constructor":68,"./$.strict-new":69,"./$.wks":83}],139:[function(require,module,exports){
+// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)
+var $export = require('./$.export')
+ , _apply = Function.apply;
+
+$export($export.S, 'Reflect', {
+ apply: function apply(target, thisArgument, argumentsList){
+ return _apply.call(target, thisArgument, argumentsList);
+ }
+});
+},{"./$.export":22}],140:[function(require,module,exports){
+// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])
+var $ = require('./$')
+ , $export = require('./$.export')
+ , aFunction = require('./$.a-function')
+ , anObject = require('./$.an-object')
+ , isObject = require('./$.is-object')
+ , bind = Function.bind || require('./$.core').Function.prototype.bind;
+
+// MS Edge supports only 2 arguments
+// FF Nightly sets third argument as `new.target`, but does not create `this` from it
+$export($export.S + $export.F * require('./$.fails')(function(){
+ function F(){}
+ return !(Reflect.construct(function(){}, [], F) instanceof F);
+}), 'Reflect', {
+ construct: function construct(Target, args /*, newTarget*/){
+ aFunction(Target);
+ var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);
+ if(Target == newTarget){
+ // w/o altered newTarget, optimization for 0-4 arguments
+ if(args != undefined)switch(anObject(args).length){
+ case 0: return new Target;
+ case 1: return new Target(args[0]);
+ case 2: return new Target(args[0], args[1]);
+ case 3: return new Target(args[0], args[1], args[2]);
+ case 4: return new Target(args[0], args[1], args[2], args[3]);
+ }
+ // w/o altered newTarget, lot of arguments case
+ var $args = [null];
+ $args.push.apply($args, args);
+ return new (bind.apply(Target, $args));
+ }
+ // with altered newTarget, not support built-in constructors
+ var proto = newTarget.prototype
+ , instance = $.create(isObject(proto) ? proto : Object.prototype)
+ , result = Function.apply.call(Target, instance, args);
+ return isObject(result) ? result : instance;
+ }
+});
+},{"./$":46,"./$.a-function":2,"./$.an-object":4,"./$.core":16,"./$.export":22,"./$.fails":24,"./$.is-object":38}],141:[function(require,module,exports){
+// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)
+var $ = require('./$')
+ , $export = require('./$.export')
+ , anObject = require('./$.an-object');
+
+// MS Edge has broken Reflect.defineProperty - throwing instead of returning false
+$export($export.S + $export.F * require('./$.fails')(function(){
+ Reflect.defineProperty($.setDesc({}, 1, {value: 1}), 1, {value: 2});
+}), 'Reflect', {
+ defineProperty: function defineProperty(target, propertyKey, attributes){
+ anObject(target);
+ try {
+ $.setDesc(target, propertyKey, attributes);
+ return true;
+ } catch(e){
+ return false;
+ }
+ }
+});
+},{"./$":46,"./$.an-object":4,"./$.export":22,"./$.fails":24}],142:[function(require,module,exports){
+// 26.1.4 Reflect.deleteProperty(target, propertyKey)
+var $export = require('./$.export')
+ , getDesc = require('./$').getDesc
+ , anObject = require('./$.an-object');
+
+$export($export.S, 'Reflect', {
+ deleteProperty: function deleteProperty(target, propertyKey){
+ var desc = getDesc(anObject(target), propertyKey);
+ return desc && !desc.configurable ? false : delete target[propertyKey];
+ }
+});
+},{"./$":46,"./$.an-object":4,"./$.export":22}],143:[function(require,module,exports){
+'use strict';
+// 26.1.5 Reflect.enumerate(target)
+var $export = require('./$.export')
+ , anObject = require('./$.an-object');
+var Enumerate = function(iterated){
+ this._t = anObject(iterated); // target
+ this._i = 0; // next index
+ var keys = this._k = [] // keys
+ , key;
+ for(key in iterated)keys.push(key);
+};
+require('./$.iter-create')(Enumerate, 'Object', function(){
+ var that = this
+ , keys = that._k
+ , key;
+ do {
+ if(that._i >= keys.length)return {value: undefined, done: true};
+ } while(!((key = keys[that._i++]) in that._t));
+ return {value: key, done: false};
+});
+
+$export($export.S, 'Reflect', {
+ enumerate: function enumerate(target){
+ return new Enumerate(target);
+ }
+});
+},{"./$.an-object":4,"./$.export":22,"./$.iter-create":41}],144:[function(require,module,exports){
+// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)
+var $ = require('./$')
+ , $export = require('./$.export')
+ , anObject = require('./$.an-object');
+
+$export($export.S, 'Reflect', {
+ getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey){
+ return $.getDesc(anObject(target), propertyKey);
+ }
+});
+},{"./$":46,"./$.an-object":4,"./$.export":22}],145:[function(require,module,exports){
+// 26.1.8 Reflect.getPrototypeOf(target)
+var $export = require('./$.export')
+ , getProto = require('./$').getProto
+ , anObject = require('./$.an-object');
+
+$export($export.S, 'Reflect', {
+ getPrototypeOf: function getPrototypeOf(target){
+ return getProto(anObject(target));
+ }
+});
+},{"./$":46,"./$.an-object":4,"./$.export":22}],146:[function(require,module,exports){
+// 26.1.6 Reflect.get(target, propertyKey [, receiver])
+var $ = require('./$')
+ , has = require('./$.has')
+ , $export = require('./$.export')
+ , isObject = require('./$.is-object')
+ , anObject = require('./$.an-object');
+
+function get(target, propertyKey/*, receiver*/){
+ var receiver = arguments.length < 3 ? target : arguments[2]
+ , desc, proto;
+ if(anObject(target) === receiver)return target[propertyKey];
+ if(desc = $.getDesc(target, propertyKey))return has(desc, 'value')
+ ? desc.value
+ : desc.get !== undefined
+ ? desc.get.call(receiver)
+ : undefined;
+ if(isObject(proto = $.getProto(target)))return get(proto, propertyKey, receiver);
+}
+
+$export($export.S, 'Reflect', {get: get});
+},{"./$":46,"./$.an-object":4,"./$.export":22,"./$.has":30,"./$.is-object":38}],147:[function(require,module,exports){
+// 26.1.9 Reflect.has(target, propertyKey)
+var $export = require('./$.export');
+
+$export($export.S, 'Reflect', {
+ has: function has(target, propertyKey){
+ return propertyKey in target;
+ }
+});
+},{"./$.export":22}],148:[function(require,module,exports){
+// 26.1.10 Reflect.isExtensible(target)
+var $export = require('./$.export')
+ , anObject = require('./$.an-object')
+ , $isExtensible = Object.isExtensible;
+
+$export($export.S, 'Reflect', {
+ isExtensible: function isExtensible(target){
+ anObject(target);
+ return $isExtensible ? $isExtensible(target) : true;
+ }
+});
+},{"./$.an-object":4,"./$.export":22}],149:[function(require,module,exports){
+// 26.1.11 Reflect.ownKeys(target)
+var $export = require('./$.export');
+
+$export($export.S, 'Reflect', {ownKeys: require('./$.own-keys')});
+},{"./$.export":22,"./$.own-keys":56}],150:[function(require,module,exports){
+// 26.1.12 Reflect.preventExtensions(target)
+var $export = require('./$.export')
+ , anObject = require('./$.an-object')
+ , $preventExtensions = Object.preventExtensions;
+
+$export($export.S, 'Reflect', {
+ preventExtensions: function preventExtensions(target){
+ anObject(target);
+ try {
+ if($preventExtensions)$preventExtensions(target);
+ return true;
+ } catch(e){
+ return false;
+ }
+ }
+});
+},{"./$.an-object":4,"./$.export":22}],151:[function(require,module,exports){
+// 26.1.14 Reflect.setPrototypeOf(target, proto)
+var $export = require('./$.export')
+ , setProto = require('./$.set-proto');
+
+if(setProto)$export($export.S, 'Reflect', {
+ setPrototypeOf: function setPrototypeOf(target, proto){
+ setProto.check(target, proto);
+ try {
+ setProto.set(target, proto);
+ return true;
+ } catch(e){
+ return false;
+ }
+ }
+});
+},{"./$.export":22,"./$.set-proto":64}],152:[function(require,module,exports){
+// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])
+var $ = require('./$')
+ , has = require('./$.has')
+ , $export = require('./$.export')
+ , createDesc = require('./$.property-desc')
+ , anObject = require('./$.an-object')
+ , isObject = require('./$.is-object');
+
+function set(target, propertyKey, V/*, receiver*/){
+ var receiver = arguments.length < 4 ? target : arguments[3]
+ , ownDesc = $.getDesc(anObject(target), propertyKey)
+ , existingDescriptor, proto;
+ if(!ownDesc){
+ if(isObject(proto = $.getProto(target))){
+ return set(proto, propertyKey, V, receiver);
+ }
+ ownDesc = createDesc(0);
+ }
+ if(has(ownDesc, 'value')){
+ if(ownDesc.writable === false || !isObject(receiver))return false;
+ existingDescriptor = $.getDesc(receiver, propertyKey) || createDesc(0);
+ existingDescriptor.value = V;
+ $.setDesc(receiver, propertyKey, existingDescriptor);
+ return true;
+ }
+ return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);
+}
+
+$export($export.S, 'Reflect', {set: set});
+},{"./$":46,"./$.an-object":4,"./$.export":22,"./$.has":30,"./$.is-object":38,"./$.property-desc":59}],153:[function(require,module,exports){
+var $ = require('./$')
+ , global = require('./$.global')
+ , isRegExp = require('./$.is-regexp')
+ , $flags = require('./$.flags')
+ , $RegExp = global.RegExp
+ , Base = $RegExp
+ , proto = $RegExp.prototype
+ , re1 = /a/g
+ , re2 = /a/g
+ // "new" creates a new object, old webkit buggy here
+ , CORRECT_NEW = new $RegExp(re1) !== re1;
+
+if(require('./$.descriptors') && (!CORRECT_NEW || require('./$.fails')(function(){
+ re2[require('./$.wks')('match')] = false;
+ // RegExp constructor can alter flags and IsRegExp works correct with @@match
+ return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';
+}))){
+ $RegExp = function RegExp(p, f){
+ var piRE = isRegExp(p)
+ , fiU = f === undefined;
+ return !(this instanceof $RegExp) && piRE && p.constructor === $RegExp && fiU ? p
+ : CORRECT_NEW
+ ? new Base(piRE && !fiU ? p.source : p, f)
+ : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f);
+ };
+ $.each.call($.getNames(Base), function(key){
+ key in $RegExp || $.setDesc($RegExp, key, {
+ configurable: true,
+ get: function(){ return Base[key]; },
+ set: function(it){ Base[key] = it; }
+ });
+ });
+ proto.constructor = $RegExp;
+ $RegExp.prototype = proto;
+ require('./$.redefine')(global, 'RegExp', $RegExp);
+}
+
+require('./$.set-species')('RegExp');
+},{"./$":46,"./$.descriptors":19,"./$.fails":24,"./$.flags":26,"./$.global":29,"./$.is-regexp":39,"./$.redefine":61,"./$.set-species":65,"./$.wks":83}],154:[function(require,module,exports){
+// 21.2.5.3 get RegExp.prototype.flags()
+var $ = require('./$');
+if(require('./$.descriptors') && /./g.flags != 'g')$.setDesc(RegExp.prototype, 'flags', {
+ configurable: true,
+ get: require('./$.flags')
+});
+},{"./$":46,"./$.descriptors":19,"./$.flags":26}],155:[function(require,module,exports){
+// @@match logic
+require('./$.fix-re-wks')('match', 1, function(defined, MATCH){
+ // 21.1.3.11 String.prototype.match(regexp)
+ return function match(regexp){
+ 'use strict';
+ var O = defined(this)
+ , fn = regexp == undefined ? undefined : regexp[MATCH];
+ return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));
+ };
+});
+},{"./$.fix-re-wks":25}],156:[function(require,module,exports){
+// @@replace logic
+require('./$.fix-re-wks')('replace', 2, function(defined, REPLACE, $replace){
+ // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)
+ return function replace(searchValue, replaceValue){
+ 'use strict';
+ var O = defined(this)
+ , fn = searchValue == undefined ? undefined : searchValue[REPLACE];
+ return fn !== undefined
+ ? fn.call(searchValue, O, replaceValue)
+ : $replace.call(String(O), searchValue, replaceValue);
+ };
+});
+},{"./$.fix-re-wks":25}],157:[function(require,module,exports){
+// @@search logic
+require('./$.fix-re-wks')('search', 1, function(defined, SEARCH){
+ // 21.1.3.15 String.prototype.search(regexp)
+ return function search(regexp){
+ 'use strict';
+ var O = defined(this)
+ , fn = regexp == undefined ? undefined : regexp[SEARCH];
+ return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));
+ };
+});
+},{"./$.fix-re-wks":25}],158:[function(require,module,exports){
+// @@split logic
+require('./$.fix-re-wks')('split', 2, function(defined, SPLIT, $split){
+ // 21.1.3.17 String.prototype.split(separator, limit)
+ return function split(separator, limit){
+ 'use strict';
+ var O = defined(this)
+ , fn = separator == undefined ? undefined : separator[SPLIT];
+ return fn !== undefined
+ ? fn.call(separator, O, limit)
+ : $split.call(String(O), separator, limit);
+ };
+});
+},{"./$.fix-re-wks":25}],159:[function(require,module,exports){
+'use strict';
+var strong = require('./$.collection-strong');
+
+// 23.2 Set Objects
+require('./$.collection')('Set', function(get){
+ return function Set(){ return get(this, arguments.length > 0 ? arguments[0] : undefined); };
+}, {
+ // 23.2.3.1 Set.prototype.add(value)
+ add: function add(value){
+ return strong.def(this, value = value === 0 ? 0 : value, value);
+ }
+}, strong);
+},{"./$.collection":15,"./$.collection-strong":12}],160:[function(require,module,exports){
+'use strict';
+var $export = require('./$.export')
+ , $at = require('./$.string-at')(false);
+$export($export.P, 'String', {
+ // 21.1.3.3 String.prototype.codePointAt(pos)
+ codePointAt: function codePointAt(pos){
+ return $at(this, pos);
+ }
+});
+},{"./$.export":22,"./$.string-at":70}],161:[function(require,module,exports){
+// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])
+'use strict';
+var $export = require('./$.export')
+ , toLength = require('./$.to-length')
+ , context = require('./$.string-context')
+ , ENDS_WITH = 'endsWith'
+ , $endsWith = ''[ENDS_WITH];
+
+$export($export.P + $export.F * require('./$.fails-is-regexp')(ENDS_WITH), 'String', {
+ endsWith: function endsWith(searchString /*, endPosition = @length */){
+ var that = context(this, searchString, ENDS_WITH)
+ , $$ = arguments
+ , endPosition = $$.length > 1 ? $$[1] : undefined
+ , len = toLength(that.length)
+ , end = endPosition === undefined ? len : Math.min(toLength(endPosition), len)
+ , search = String(searchString);
+ return $endsWith
+ ? $endsWith.call(that, search, end)
+ : that.slice(end - search.length, end) === search;
+ }
+});
+},{"./$.export":22,"./$.fails-is-regexp":23,"./$.string-context":71,"./$.to-length":79}],162:[function(require,module,exports){
+var $export = require('./$.export')
+ , toIndex = require('./$.to-index')
+ , fromCharCode = String.fromCharCode
+ , $fromCodePoint = String.fromCodePoint;
+
+// length should be 1, old FF problem
+$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
+ // 21.1.2.2 String.fromCodePoint(...codePoints)
+ fromCodePoint: function fromCodePoint(x){ // eslint-disable-line no-unused-vars
+ var res = []
+ , $$ = arguments
+ , $$len = $$.length
+ , i = 0
+ , code;
+ while($$len > i){
+ code = +$$[i++];
+ if(toIndex(code, 0x10ffff) !== code)throw RangeError(code + ' is not a valid code point');
+ res.push(code < 0x10000
+ ? fromCharCode(code)
+ : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)
+ );
+ } return res.join('');
+ }
+});
+},{"./$.export":22,"./$.to-index":76}],163:[function(require,module,exports){
+// 21.1.3.7 String.prototype.includes(searchString, position = 0)
+'use strict';
+var $export = require('./$.export')
+ , context = require('./$.string-context')
+ , INCLUDES = 'includes';
+
+$export($export.P + $export.F * require('./$.fails-is-regexp')(INCLUDES), 'String', {
+ includes: function includes(searchString /*, position = 0 */){
+ return !!~context(this, searchString, INCLUDES)
+ .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+},{"./$.export":22,"./$.fails-is-regexp":23,"./$.string-context":71}],164:[function(require,module,exports){
+'use strict';
+var $at = require('./$.string-at')(true);
+
+// 21.1.3.27 String.prototype[@@iterator]()
+require('./$.iter-define')(String, 'String', function(iterated){
+ this._t = String(iterated); // target
+ this._i = 0; // next index
+// 21.1.5.2.1 %StringIteratorPrototype%.next()
+}, function(){
+ var O = this._t
+ , index = this._i
+ , point;
+ if(index >= O.length)return {value: undefined, done: true};
+ point = $at(O, index);
+ this._i += point.length;
+ return {value: point, done: false};
+});
+},{"./$.iter-define":42,"./$.string-at":70}],165:[function(require,module,exports){
+var $export = require('./$.export')
+ , toIObject = require('./$.to-iobject')
+ , toLength = require('./$.to-length');
+
+$export($export.S, 'String', {
+ // 21.1.2.4 String.raw(callSite, ...substitutions)
+ raw: function raw(callSite){
+ var tpl = toIObject(callSite.raw)
+ , len = toLength(tpl.length)
+ , $$ = arguments
+ , $$len = $$.length
+ , res = []
+ , i = 0;
+ while(len > i){
+ res.push(String(tpl[i++]));
+ if(i < $$len)res.push(String($$[i]));
+ } return res.join('');
+ }
+});
+},{"./$.export":22,"./$.to-iobject":78,"./$.to-length":79}],166:[function(require,module,exports){
+var $export = require('./$.export');
+
+$export($export.P, 'String', {
+ // 21.1.3.13 String.prototype.repeat(count)
+ repeat: require('./$.string-repeat')
+});
+},{"./$.export":22,"./$.string-repeat":73}],167:[function(require,module,exports){
+// 21.1.3.18 String.prototype.startsWith(searchString [, position ])
+'use strict';
+var $export = require('./$.export')
+ , toLength = require('./$.to-length')
+ , context = require('./$.string-context')
+ , STARTS_WITH = 'startsWith'
+ , $startsWith = ''[STARTS_WITH];
+
+$export($export.P + $export.F * require('./$.fails-is-regexp')(STARTS_WITH), 'String', {
+ startsWith: function startsWith(searchString /*, position = 0 */){
+ var that = context(this, searchString, STARTS_WITH)
+ , $$ = arguments
+ , index = toLength(Math.min($$.length > 1 ? $$[1] : undefined, that.length))
+ , search = String(searchString);
+ return $startsWith
+ ? $startsWith.call(that, search, index)
+ : that.slice(index, index + search.length) === search;
+ }
+});
+},{"./$.export":22,"./$.fails-is-regexp":23,"./$.string-context":71,"./$.to-length":79}],168:[function(require,module,exports){
+'use strict';
+// 21.1.3.25 String.prototype.trim()
+require('./$.string-trim')('trim', function($trim){
+ return function trim(){
+ return $trim(this, 3);
+ };
+});
+},{"./$.string-trim":74}],169:[function(require,module,exports){
+'use strict';
+// ECMAScript 6 symbols shim
+var $ = require('./$')
+ , global = require('./$.global')
+ , has = require('./$.has')
+ , DESCRIPTORS = require('./$.descriptors')
+ , $export = require('./$.export')
+ , redefine = require('./$.redefine')
+ , $fails = require('./$.fails')
+ , shared = require('./$.shared')
+ , setToStringTag = require('./$.set-to-string-tag')
+ , uid = require('./$.uid')
+ , wks = require('./$.wks')
+ , keyOf = require('./$.keyof')
+ , $names = require('./$.get-names')
+ , enumKeys = require('./$.enum-keys')
+ , isArray = require('./$.is-array')
+ , anObject = require('./$.an-object')
+ , toIObject = require('./$.to-iobject')
+ , createDesc = require('./$.property-desc')
+ , getDesc = $.getDesc
+ , setDesc = $.setDesc
+ , _create = $.create
+ , getNames = $names.get
+ , $Symbol = global.Symbol
+ , $JSON = global.JSON
+ , _stringify = $JSON && $JSON.stringify
+ , setter = false
+ , HIDDEN = wks('_hidden')
+ , isEnum = $.isEnum
+ , SymbolRegistry = shared('symbol-registry')
+ , AllSymbols = shared('symbols')
+ , useNative = typeof $Symbol == 'function'
+ , ObjectProto = Object.prototype;
+
+// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
+var setSymbolDesc = DESCRIPTORS && $fails(function(){
+ return _create(setDesc({}, 'a', {
+ get: function(){ return setDesc(this, 'a', {value: 7}).a; }
+ })).a != 7;
+}) ? function(it, key, D){
+ var protoDesc = getDesc(ObjectProto, key);
+ if(protoDesc)delete ObjectProto[key];
+ setDesc(it, key, D);
+ if(protoDesc && it !== ObjectProto)setDesc(ObjectProto, key, protoDesc);
+} : setDesc;
+
+var wrap = function(tag){
+ var sym = AllSymbols[tag] = _create($Symbol.prototype);
+ sym._k = tag;
+ DESCRIPTORS && setter && setSymbolDesc(ObjectProto, tag, {
+ configurable: true,
+ set: function(value){
+ if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;
+ setSymbolDesc(this, tag, createDesc(1, value));
+ }
+ });
+ return sym;
+};
+
+var isSymbol = function(it){
+ return typeof it == 'symbol';
+};
+
+var $defineProperty = function defineProperty(it, key, D){
+ if(D && has(AllSymbols, key)){
+ if(!D.enumerable){
+ if(!has(it, HIDDEN))setDesc(it, HIDDEN, createDesc(1, {}));
+ it[HIDDEN][key] = true;
+ } else {
+ if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;
+ D = _create(D, {enumerable: createDesc(0, false)});
+ } return setSymbolDesc(it, key, D);
+ } return setDesc(it, key, D);
+};
+var $defineProperties = function defineProperties(it, P){
+ anObject(it);
+ var keys = enumKeys(P = toIObject(P))
+ , i = 0
+ , l = keys.length
+ , key;
+ while(l > i)$defineProperty(it, key = keys[i++], P[key]);
+ return it;
+};
+var $create = function create(it, P){
+ return P === undefined ? _create(it) : $defineProperties(_create(it), P);
+};
+var $propertyIsEnumerable = function propertyIsEnumerable(key){
+ var E = isEnum.call(this, key);
+ return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key]
+ ? E : true;
+};
+var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){
+ var D = getDesc(it = toIObject(it), key);
+ if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;
+ return D;
+};
+var $getOwnPropertyNames = function getOwnPropertyNames(it){
+ var names = getNames(toIObject(it))
+ , result = []
+ , i = 0
+ , key;
+ while(names.length > i)if(!has(AllSymbols, key = names[i++]) && key != HIDDEN)result.push(key);
+ return result;
+};
+var $getOwnPropertySymbols = function getOwnPropertySymbols(it){
+ var names = getNames(toIObject(it))
+ , result = []
+ , i = 0
+ , key;
+ while(names.length > i)if(has(AllSymbols, key = names[i++]))result.push(AllSymbols[key]);
+ return result;
+};
+var $stringify = function stringify(it){
+ if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined
+ var args = [it]
+ , i = 1
+ , $$ = arguments
+ , replacer, $replacer;
+ while($$.length > i)args.push($$[i++]);
+ replacer = args[1];
+ if(typeof replacer == 'function')$replacer = replacer;
+ if($replacer || !isArray(replacer))replacer = function(key, value){
+ if($replacer)value = $replacer.call(this, key, value);
+ if(!isSymbol(value))return value;
+ };
+ args[1] = replacer;
+ return _stringify.apply($JSON, args);
+};
+var buggyJSON = $fails(function(){
+ var S = $Symbol();
+ // MS Edge converts symbol values to JSON as {}
+ // WebKit converts symbol values to JSON as null
+ // V8 throws on boxed symbols
+ return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';
+});
+
+// 19.4.1.1 Symbol([description])
+if(!useNative){
+ $Symbol = function Symbol(){
+ if(isSymbol(this))throw TypeError('Symbol is not a constructor');
+ return wrap(uid(arguments.length > 0 ? arguments[0] : undefined));
+ };
+ redefine($Symbol.prototype, 'toString', function toString(){
+ return this._k;
+ });
+
+ isSymbol = function(it){
+ return it instanceof $Symbol;
+ };
+
+ $.create = $create;
+ $.isEnum = $propertyIsEnumerable;
+ $.getDesc = $getOwnPropertyDescriptor;
+ $.setDesc = $defineProperty;
+ $.setDescs = $defineProperties;
+ $.getNames = $names.get = $getOwnPropertyNames;
+ $.getSymbols = $getOwnPropertySymbols;
+
+ if(DESCRIPTORS && !require('./$.library')){
+ redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
+ }
+}
+
+var symbolStatics = {
+ // 19.4.2.1 Symbol.for(key)
+ 'for': function(key){
+ return has(SymbolRegistry, key += '')
+ ? SymbolRegistry[key]
+ : SymbolRegistry[key] = $Symbol(key);
+ },
+ // 19.4.2.5 Symbol.keyFor(sym)
+ keyFor: function keyFor(key){
+ return keyOf(SymbolRegistry, key);
+ },
+ useSetter: function(){ setter = true; },
+ useSimple: function(){ setter = false; }
+};
+// 19.4.2.2 Symbol.hasInstance
+// 19.4.2.3 Symbol.isConcatSpreadable
+// 19.4.2.4 Symbol.iterator
+// 19.4.2.6 Symbol.match
+// 19.4.2.8 Symbol.replace
+// 19.4.2.9 Symbol.search
+// 19.4.2.10 Symbol.species
+// 19.4.2.11 Symbol.split
+// 19.4.2.12 Symbol.toPrimitive
+// 19.4.2.13 Symbol.toStringTag
+// 19.4.2.14 Symbol.unscopables
+$.each.call((
+ 'hasInstance,isConcatSpreadable,iterator,match,replace,search,' +
+ 'species,split,toPrimitive,toStringTag,unscopables'
+).split(','), function(it){
+ var sym = wks(it);
+ symbolStatics[it] = useNative ? sym : wrap(sym);
+});
+
+setter = true;
+
+$export($export.G + $export.W, {Symbol: $Symbol});
+
+$export($export.S, 'Symbol', symbolStatics);
+
+$export($export.S + $export.F * !useNative, 'Object', {
+ // 19.1.2.2 Object.create(O [, Properties])
+ create: $create,
+ // 19.1.2.4 Object.defineProperty(O, P, Attributes)
+ defineProperty: $defineProperty,
+ // 19.1.2.3 Object.defineProperties(O, Properties)
+ defineProperties: $defineProperties,
+ // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
+ getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
+ // 19.1.2.7 Object.getOwnPropertyNames(O)
+ getOwnPropertyNames: $getOwnPropertyNames,
+ // 19.1.2.8 Object.getOwnPropertySymbols(O)
+ getOwnPropertySymbols: $getOwnPropertySymbols
+});
+
+// 24.3.2 JSON.stringify(value [, replacer [, space]])
+$JSON && $export($export.S + $export.F * (!useNative || buggyJSON), 'JSON', {stringify: $stringify});
+
+// 19.4.3.5 Symbol.prototype[@@toStringTag]
+setToStringTag($Symbol, 'Symbol');
+// 20.2.1.9 Math[@@toStringTag]
+setToStringTag(Math, 'Math', true);
+// 24.3.3 JSON[@@toStringTag]
+setToStringTag(global.JSON, 'JSON', true);
+},{"./$":46,"./$.an-object":4,"./$.descriptors":19,"./$.enum-keys":21,"./$.export":22,"./$.fails":24,"./$.get-names":28,"./$.global":29,"./$.has":30,"./$.is-array":36,"./$.keyof":47,"./$.library":48,"./$.property-desc":59,"./$.redefine":61,"./$.set-to-string-tag":66,"./$.shared":67,"./$.to-iobject":78,"./$.uid":82,"./$.wks":83}],170:[function(require,module,exports){
+'use strict';
+var $ = require('./$')
+ , redefine = require('./$.redefine')
+ , weak = require('./$.collection-weak')
+ , isObject = require('./$.is-object')
+ , has = require('./$.has')
+ , frozenStore = weak.frozenStore
+ , WEAK = weak.WEAK
+ , isExtensible = Object.isExtensible || isObject
+ , tmp = {};
+
+// 23.3 WeakMap Objects
+var $WeakMap = require('./$.collection')('WeakMap', function(get){
+ return function WeakMap(){ return get(this, arguments.length > 0 ? arguments[0] : undefined); };
+}, {
+ // 23.3.3.3 WeakMap.prototype.get(key)
+ get: function get(key){
+ if(isObject(key)){
+ if(!isExtensible(key))return frozenStore(this).get(key);
+ if(has(key, WEAK))return key[WEAK][this._i];
+ }
+ },
+ // 23.3.3.5 WeakMap.prototype.set(key, value)
+ set: function set(key, value){
+ return weak.def(this, key, value);
+ }
+}, weak, true, true);
+
+// IE11 WeakMap frozen keys fix
+if(new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7){
+ $.each.call(['delete', 'has', 'get', 'set'], function(key){
+ var proto = $WeakMap.prototype
+ , method = proto[key];
+ redefine(proto, key, function(a, b){
+ // store frozen objects on leaky map
+ if(isObject(a) && !isExtensible(a)){
+ var result = frozenStore(this)[key](a, b);
+ return key == 'set' ? this : result;
+ // store all the rest on native weakmap
+ } return method.call(this, a, b);
+ });
+ });
+}
+},{"./$":46,"./$.collection":15,"./$.collection-weak":14,"./$.has":30,"./$.is-object":38,"./$.redefine":61}],171:[function(require,module,exports){
+'use strict';
+var weak = require('./$.collection-weak');
+
+// 23.4 WeakSet Objects
+require('./$.collection')('WeakSet', function(get){
+ return function WeakSet(){ return get(this, arguments.length > 0 ? arguments[0] : undefined); };
+}, {
+ // 23.4.3.1 WeakSet.prototype.add(value)
+ add: function add(value){
+ return weak.def(this, value, true);
+ }
+}, weak, false, true);
+},{"./$.collection":15,"./$.collection-weak":14}],172:[function(require,module,exports){
+'use strict';
+var $export = require('./$.export')
+ , $includes = require('./$.array-includes')(true);
+
+$export($export.P, 'Array', {
+ // https://github.com/domenic/Array.prototype.includes
+ includes: function includes(el /*, fromIndex = 0 */){
+ return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+
+require('./$.add-to-unscopables')('includes');
+},{"./$.add-to-unscopables":3,"./$.array-includes":7,"./$.export":22}],173:[function(require,module,exports){
+// https://github.com/DavidBruant/Map-Set.prototype.toJSON
+var $export = require('./$.export');
+
+$export($export.P, 'Map', {toJSON: require('./$.collection-to-json')('Map')});
+},{"./$.collection-to-json":13,"./$.export":22}],174:[function(require,module,exports){
+// http://goo.gl/XkBrjD
+var $export = require('./$.export')
+ , $entries = require('./$.object-to-array')(true);
+
+$export($export.S, 'Object', {
+ entries: function entries(it){
+ return $entries(it);
+ }
+});
+},{"./$.export":22,"./$.object-to-array":55}],175:[function(require,module,exports){
+// https://gist.github.com/WebReflection/9353781
+var $ = require('./$')
+ , $export = require('./$.export')
+ , ownKeys = require('./$.own-keys')
+ , toIObject = require('./$.to-iobject')
+ , createDesc = require('./$.property-desc');
+
+$export($export.S, 'Object', {
+ getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object){
+ var O = toIObject(object)
+ , setDesc = $.setDesc
+ , getDesc = $.getDesc
+ , keys = ownKeys(O)
+ , result = {}
+ , i = 0
+ , key, D;
+ while(keys.length > i){
+ D = getDesc(O, key = keys[i++]);
+ if(key in result)setDesc(result, key, createDesc(0, D));
+ else result[key] = D;
+ } return result;
+ }
+});
+},{"./$":46,"./$.export":22,"./$.own-keys":56,"./$.property-desc":59,"./$.to-iobject":78}],176:[function(require,module,exports){
+// http://goo.gl/XkBrjD
+var $export = require('./$.export')
+ , $values = require('./$.object-to-array')(false);
+
+$export($export.S, 'Object', {
+ values: function values(it){
+ return $values(it);
+ }
+});
+},{"./$.export":22,"./$.object-to-array":55}],177:[function(require,module,exports){
+// https://github.com/benjamingr/RexExp.escape
+var $export = require('./$.export')
+ , $re = require('./$.replacer')(/[\\^$*+?.()|[\]{}]/g, '\\$&');
+
+$export($export.S, 'RegExp', {escape: function escape(it){ return $re(it); }});
+
+},{"./$.export":22,"./$.replacer":62}],178:[function(require,module,exports){
+// https://github.com/DavidBruant/Map-Set.prototype.toJSON
+var $export = require('./$.export');
+
+$export($export.P, 'Set', {toJSON: require('./$.collection-to-json')('Set')});
+},{"./$.collection-to-json":13,"./$.export":22}],179:[function(require,module,exports){
+'use strict';
+// https://github.com/mathiasbynens/String.prototype.at
+var $export = require('./$.export')
+ , $at = require('./$.string-at')(true);
+
+$export($export.P, 'String', {
+ at: function at(pos){
+ return $at(this, pos);
+ }
+});
+},{"./$.export":22,"./$.string-at":70}],180:[function(require,module,exports){
+'use strict';
+var $export = require('./$.export')
+ , $pad = require('./$.string-pad');
+
+$export($export.P, 'String', {
+ padLeft: function padLeft(maxLength /*, fillString = ' ' */){
+ return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);
+ }
+});
+},{"./$.export":22,"./$.string-pad":72}],181:[function(require,module,exports){
+'use strict';
+var $export = require('./$.export')
+ , $pad = require('./$.string-pad');
+
+$export($export.P, 'String', {
+ padRight: function padRight(maxLength /*, fillString = ' ' */){
+ return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);
+ }
+});
+},{"./$.export":22,"./$.string-pad":72}],182:[function(require,module,exports){
+'use strict';
+// https://github.com/sebmarkbage/ecmascript-string-left-right-trim
+require('./$.string-trim')('trimLeft', function($trim){
+ return function trimLeft(){
+ return $trim(this, 1);
+ };
+});
+},{"./$.string-trim":74}],183:[function(require,module,exports){
+'use strict';
+// https://github.com/sebmarkbage/ecmascript-string-left-right-trim
+require('./$.string-trim')('trimRight', function($trim){
+ return function trimRight(){
+ return $trim(this, 2);
+ };
+});
+},{"./$.string-trim":74}],184:[function(require,module,exports){
+// JavaScript 1.6 / Strawman array statics shim
+var $ = require('./$')
+ , $export = require('./$.export')
+ , $ctx = require('./$.ctx')
+ , $Array = require('./$.core').Array || Array
+ , statics = {};
+var setStatics = function(keys, length){
+ $.each.call(keys.split(','), function(key){
+ if(length == undefined && key in $Array)statics[key] = $Array[key];
+ else if(key in [])statics[key] = $ctx(Function.call, [][key], length);
+ });
+};
+setStatics('pop,reverse,shift,keys,values,entries', 1);
+setStatics('indexOf,every,some,forEach,map,filter,find,findIndex,includes', 3);
+setStatics('join,slice,concat,push,splice,unshift,sort,lastIndexOf,' +
+ 'reduce,reduceRight,copyWithin,fill');
+$export($export.S, 'Array', statics);
+},{"./$":46,"./$.core":16,"./$.ctx":17,"./$.export":22}],185:[function(require,module,exports){
+require('./es6.array.iterator');
+var global = require('./$.global')
+ , hide = require('./$.hide')
+ , Iterators = require('./$.iterators')
+ , ITERATOR = require('./$.wks')('iterator')
+ , NL = global.NodeList
+ , HTC = global.HTMLCollection
+ , NLProto = NL && NL.prototype
+ , HTCProto = HTC && HTC.prototype
+ , ArrayValues = Iterators.NodeList = Iterators.HTMLCollection = Iterators.Array;
+if(NLProto && !NLProto[ITERATOR])hide(NLProto, ITERATOR, ArrayValues);
+if(HTCProto && !HTCProto[ITERATOR])hide(HTCProto, ITERATOR, ArrayValues);
+},{"./$.global":29,"./$.hide":31,"./$.iterators":45,"./$.wks":83,"./es6.array.iterator":91}],186:[function(require,module,exports){
+var $export = require('./$.export')
+ , $task = require('./$.task');
+$export($export.G + $export.B, {
+ setImmediate: $task.set,
+ clearImmediate: $task.clear
+});
+},{"./$.export":22,"./$.task":75}],187:[function(require,module,exports){
+// ie9- setTimeout & setInterval additional parameters fix
+var global = require('./$.global')
+ , $export = require('./$.export')
+ , invoke = require('./$.invoke')
+ , partial = require('./$.partial')
+ , navigator = global.navigator
+ , MSIE = !!navigator && /MSIE .\./.test(navigator.userAgent); // <- dirty ie9- check
+var wrap = function(set){
+ return MSIE ? function(fn, time /*, ...args */){
+ return set(invoke(
+ partial,
+ [].slice.call(arguments, 2),
+ typeof fn == 'function' ? fn : Function(fn)
+ ), time);
+ } : set;
+};
+$export($export.G + $export.B + $export.F * MSIE, {
+ setTimeout: wrap(global.setTimeout),
+ setInterval: wrap(global.setInterval)
+});
+},{"./$.export":22,"./$.global":29,"./$.invoke":33,"./$.partial":57}],188:[function(require,module,exports){
+require('./modules/es5');
+require('./modules/es6.symbol');
+require('./modules/es6.object.assign');
+require('./modules/es6.object.is');
+require('./modules/es6.object.set-prototype-of');
+require('./modules/es6.object.to-string');
+require('./modules/es6.object.freeze');
+require('./modules/es6.object.seal');
+require('./modules/es6.object.prevent-extensions');
+require('./modules/es6.object.is-frozen');
+require('./modules/es6.object.is-sealed');
+require('./modules/es6.object.is-extensible');
+require('./modules/es6.object.get-own-property-descriptor');
+require('./modules/es6.object.get-prototype-of');
+require('./modules/es6.object.keys');
+require('./modules/es6.object.get-own-property-names');
+require('./modules/es6.function.name');
+require('./modules/es6.function.has-instance');
+require('./modules/es6.number.constructor');
+require('./modules/es6.number.epsilon');
+require('./modules/es6.number.is-finite');
+require('./modules/es6.number.is-integer');
+require('./modules/es6.number.is-nan');
+require('./modules/es6.number.is-safe-integer');
+require('./modules/es6.number.max-safe-integer');
+require('./modules/es6.number.min-safe-integer');
+require('./modules/es6.number.parse-float');
+require('./modules/es6.number.parse-int');
+require('./modules/es6.math.acosh');
+require('./modules/es6.math.asinh');
+require('./modules/es6.math.atanh');
+require('./modules/es6.math.cbrt');
+require('./modules/es6.math.clz32');
+require('./modules/es6.math.cosh');
+require('./modules/es6.math.expm1');
+require('./modules/es6.math.fround');
+require('./modules/es6.math.hypot');
+require('./modules/es6.math.imul');
+require('./modules/es6.math.log10');
+require('./modules/es6.math.log1p');
+require('./modules/es6.math.log2');
+require('./modules/es6.math.sign');
+require('./modules/es6.math.sinh');
+require('./modules/es6.math.tanh');
+require('./modules/es6.math.trunc');
+require('./modules/es6.string.from-code-point');
+require('./modules/es6.string.raw');
+require('./modules/es6.string.trim');
+require('./modules/es6.string.iterator');
+require('./modules/es6.string.code-point-at');
+require('./modules/es6.string.ends-with');
+require('./modules/es6.string.includes');
+require('./modules/es6.string.repeat');
+require('./modules/es6.string.starts-with');
+require('./modules/es6.array.from');
+require('./modules/es6.array.of');
+require('./modules/es6.array.iterator');
+require('./modules/es6.array.species');
+require('./modules/es6.array.copy-within');
+require('./modules/es6.array.fill');
+require('./modules/es6.array.find');
+require('./modules/es6.array.find-index');
+require('./modules/es6.regexp.constructor');
+require('./modules/es6.regexp.flags');
+require('./modules/es6.regexp.match');
+require('./modules/es6.regexp.replace');
+require('./modules/es6.regexp.search');
+require('./modules/es6.regexp.split');
+require('./modules/es6.promise');
+require('./modules/es6.map');
+require('./modules/es6.set');
+require('./modules/es6.weak-map');
+require('./modules/es6.weak-set');
+require('./modules/es6.reflect.apply');
+require('./modules/es6.reflect.construct');
+require('./modules/es6.reflect.define-property');
+require('./modules/es6.reflect.delete-property');
+require('./modules/es6.reflect.enumerate');
+require('./modules/es6.reflect.get');
+require('./modules/es6.reflect.get-own-property-descriptor');
+require('./modules/es6.reflect.get-prototype-of');
+require('./modules/es6.reflect.has');
+require('./modules/es6.reflect.is-extensible');
+require('./modules/es6.reflect.own-keys');
+require('./modules/es6.reflect.prevent-extensions');
+require('./modules/es6.reflect.set');
+require('./modules/es6.reflect.set-prototype-of');
+require('./modules/es7.array.includes');
+require('./modules/es7.string.at');
+require('./modules/es7.string.pad-left');
+require('./modules/es7.string.pad-right');
+require('./modules/es7.string.trim-left');
+require('./modules/es7.string.trim-right');
+require('./modules/es7.regexp.escape');
+require('./modules/es7.object.get-own-property-descriptors');
+require('./modules/es7.object.values');
+require('./modules/es7.object.entries');
+require('./modules/es7.map.to-json');
+require('./modules/es7.set.to-json');
+require('./modules/js.array.statics');
+require('./modules/web.timers');
+require('./modules/web.immediate');
+require('./modules/web.dom.iterable');
+module.exports = require('./modules/$.core');
+},{"./modules/$.core":16,"./modules/es5":85,"./modules/es6.array.copy-within":86,"./modules/es6.array.fill":87,"./modules/es6.array.find":89,"./modules/es6.array.find-index":88,"./modules/es6.array.from":90,"./modules/es6.array.iterator":91,"./modules/es6.array.of":92,"./modules/es6.array.species":93,"./modules/es6.function.has-instance":94,"./modules/es6.function.name":95,"./modules/es6.map":96,"./modules/es6.math.acosh":97,"./modules/es6.math.asinh":98,"./modules/es6.math.atanh":99,"./modules/es6.math.cbrt":100,"./modules/es6.math.clz32":101,"./modules/es6.math.cosh":102,"./modules/es6.math.expm1":103,"./modules/es6.math.fround":104,"./modules/es6.math.hypot":105,"./modules/es6.math.imul":106,"./modules/es6.math.log10":107,"./modules/es6.math.log1p":108,"./modules/es6.math.log2":109,"./modules/es6.math.sign":110,"./modules/es6.math.sinh":111,"./modules/es6.math.tanh":112,"./modules/es6.math.trunc":113,"./modules/es6.number.constructor":114,"./modules/es6.number.epsilon":115,"./modules/es6.number.is-finite":116,"./modules/es6.number.is-integer":117,"./modules/es6.number.is-nan":118,"./modules/es6.number.is-safe-integer":119,"./modules/es6.number.max-safe-integer":120,"./modules/es6.number.min-safe-integer":121,"./modules/es6.number.parse-float":122,"./modules/es6.number.parse-int":123,"./modules/es6.object.assign":124,"./modules/es6.object.freeze":125,"./modules/es6.object.get-own-property-descriptor":126,"./modules/es6.object.get-own-property-names":127,"./modules/es6.object.get-prototype-of":128,"./modules/es6.object.is":132,"./modules/es6.object.is-extensible":129,"./modules/es6.object.is-frozen":130,"./modules/es6.object.is-sealed":131,"./modules/es6.object.keys":133,"./modules/es6.object.prevent-extensions":134,"./modules/es6.object.seal":135,"./modules/es6.object.set-prototype-of":136,"./modules/es6.object.to-string":137,"./modules/es6.promise":138,"./modules/es6.reflect.apply":139,"./modules/es6.reflect.construct":140,"./modules/es6.reflect.define-property":141,"./modules/es6.reflect.delete-property":142,"./modules/es6.reflect.enumerate":143,"./modules/es6.reflect.get":146,"./modules/es6.reflect.get-own-property-descriptor":144,"./modules/es6.reflect.get-prototype-of":145,"./modules/es6.reflect.has":147,"./modules/es6.reflect.is-extensible":148,"./modules/es6.reflect.own-keys":149,"./modules/es6.reflect.prevent-extensions":150,"./modules/es6.reflect.set":152,"./modules/es6.reflect.set-prototype-of":151,"./modules/es6.regexp.constructor":153,"./modules/es6.regexp.flags":154,"./modules/es6.regexp.match":155,"./modules/es6.regexp.replace":156,"./modules/es6.regexp.search":157,"./modules/es6.regexp.split":158,"./modules/es6.set":159,"./modules/es6.string.code-point-at":160,"./modules/es6.string.ends-with":161,"./modules/es6.string.from-code-point":162,"./modules/es6.string.includes":163,"./modules/es6.string.iterator":164,"./modules/es6.string.raw":165,"./modules/es6.string.repeat":166,"./modules/es6.string.starts-with":167,"./modules/es6.string.trim":168,"./modules/es6.symbol":169,"./modules/es6.weak-map":170,"./modules/es6.weak-set":171,"./modules/es7.array.includes":172,"./modules/es7.map.to-json":173,"./modules/es7.object.entries":174,"./modules/es7.object.get-own-property-descriptors":175,"./modules/es7.object.values":176,"./modules/es7.regexp.escape":177,"./modules/es7.set.to-json":178,"./modules/es7.string.at":179,"./modules/es7.string.pad-left":180,"./modules/es7.string.pad-right":181,"./modules/es7.string.trim-left":182,"./modules/es7.string.trim-right":183,"./modules/js.array.statics":184,"./modules/web.dom.iterable":185,"./modules/web.immediate":186,"./modules/web.timers":187}],189:[function(require,module,exports){
+(function (global){
+(function (process,global){
+/**
+ * Copyright (c) 2014, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * https://raw.github.com/facebook/regenerator/master/LICENSE file. An
+ * additional grant of patent rights can be found in the PATENTS file in
+ * the same directory.
+ */
+
+!(function(global) {
+ "use strict";
+
+ var hasOwn = Object.prototype.hasOwnProperty;
+ var undefined; // More compressible than void 0.
+ var iteratorSymbol =
+ typeof Symbol === "function" && Symbol.iterator || "@@iterator";
+
+ var inModule = typeof module === "object";
+ var runtime = global.regeneratorRuntime;
+ if (runtime) {
+ if (inModule) {
+ // If regeneratorRuntime is defined globally and we're in a module,
+ // make the exports object identical to regeneratorRuntime.
+ module.exports = runtime;
+ }
+ // Don't bother evaluating the rest of this file if the runtime was
+ // already defined globally.
+ return;
+ }
+
+ // Define the runtime globally (as expected by generated code) as either
+ // module.exports (if we're in a module) or a new, empty object.
+ runtime = global.regeneratorRuntime = inModule ? module.exports : {};
+
+ function wrap(innerFn, outerFn, self, tryLocsList) {
+ // If outerFn provided, then outerFn.prototype instanceof Generator.
+ var generator = Object.create((outerFn || Generator).prototype);
+ var context = new Context(tryLocsList || []);
+
+ // The ._invoke method unifies the implementations of the .next,
+ // .throw, and .return methods.
+ generator._invoke = makeInvokeMethod(innerFn, self, context);
+
+ return generator;
+ }
+ runtime.wrap = wrap;
+
+ // Try/catch helper to minimize deoptimizations. Returns a completion
+ // record like context.tryEntries[i].completion. This interface could
+ // have been (and was previously) designed to take a closure to be
+ // invoked without arguments, but in all the cases we care about we
+ // already have an existing method we want to call, so there's no need
+ // to create a new function object. We can even get away with assuming
+ // the method takes exactly one argument, since that happens to be true
+ // in every case, so we don't have to touch the arguments object. The
+ // only additional allocation required is the completion record, which
+ // has a stable shape and so hopefully should be cheap to allocate.
+ function tryCatch(fn, obj, arg) {
+ try {
+ return { type: "normal", arg: fn.call(obj, arg) };
+ } catch (err) {
+ return { type: "throw", arg: err };
+ }
+ }
+
+ var GenStateSuspendedStart = "suspendedStart";
+ var GenStateSuspendedYield = "suspendedYield";
+ var GenStateExecuting = "executing";
+ var GenStateCompleted = "completed";
+
+ // Returning this object from the innerFn has the same effect as
+ // breaking out of the dispatch switch statement.
+ var ContinueSentinel = {};
+
+ // Dummy constructor functions that we use as the .constructor and
+ // .constructor.prototype properties for functions that return Generator
+ // objects. For full spec compliance, you may wish to configure your
+ // minifier not to mangle the names of these two functions.
+ function Generator() {}
+ function GeneratorFunction() {}
+ function GeneratorFunctionPrototype() {}
+
+ var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype;
+ GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
+ GeneratorFunctionPrototype.constructor = GeneratorFunction;
+ GeneratorFunction.displayName = "GeneratorFunction";
+
+ // Helper for defining the .next, .throw, and .return methods of the
+ // Iterator interface in terms of a single ._invoke method.
+ function defineIteratorMethods(prototype) {
+ ["next", "throw", "return"].forEach(function(method) {
+ prototype[method] = function(arg) {
+ return this._invoke(method, arg);
+ };
+ });
+ }
+
+ runtime.isGeneratorFunction = function(genFun) {
+ var ctor = typeof genFun === "function" && genFun.constructor;
+ return ctor
+ ? ctor === GeneratorFunction ||
+ // For the native GeneratorFunction constructor, the best we can
+ // do is to check its .name property.
+ (ctor.displayName || ctor.name) === "GeneratorFunction"
+ : false;
+ };
+
+ runtime.mark = function(genFun) {
+ if (Object.setPrototypeOf) {
+ Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
+ } else {
+ genFun.__proto__ = GeneratorFunctionPrototype;
+ }
+ genFun.prototype = Object.create(Gp);
+ return genFun;
+ };
+
+ // Within the body of any async function, `await x` is transformed to
+ // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
+ // `value instanceof AwaitArgument` to determine if the yielded value is
+ // meant to be awaited. Some may consider the name of this method too
+ // cutesy, but they are curmudgeons.
+ runtime.awrap = function(arg) {
+ return new AwaitArgument(arg);
+ };
+
+ function AwaitArgument(arg) {
+ this.arg = arg;
+ }
+
+ function AsyncIterator(generator) {
+ // This invoke function is written in a style that assumes some
+ // calling function (or Promise) will handle exceptions.
+ function invoke(method, arg) {
+ var result = generator[method](arg);
+ var value = result.value;
+ return value instanceof AwaitArgument
+ ? Promise.resolve(value.arg).then(invokeNext, invokeThrow)
+ : Promise.resolve(value).then(function(unwrapped) {
+ // When a yielded Promise is resolved, its final value becomes
+ // the .value of the Promise<{value,done}> result for the
+ // current iteration. If the Promise is rejected, however, the
+ // result for this iteration will be rejected with the same
+ // reason. Note that rejections of yielded Promises are not
+ // thrown back into the generator function, as is the case
+ // when an awaited Promise is rejected. This difference in
+ // behavior between yield and await is important, because it
+ // allows the consumer to decide what to do with the yielded
+ // rejection (swallow it and continue, manually .throw it back
+ // into the generator, abandon iteration, whatever). With
+ // await, by contrast, there is no opportunity to examine the
+ // rejection reason outside the generator function, so the
+ // only option is to throw it from the await expression, and
+ // let the generator function handle the exception.
+ result.value = unwrapped;
+ return result;
+ });
+ }
+
+ if (typeof process === "object" && process.domain) {
+ invoke = process.domain.bind(invoke);
+ }
+
+ var invokeNext = invoke.bind(generator, "next");
+ var invokeThrow = invoke.bind(generator, "throw");
+ var invokeReturn = invoke.bind(generator, "return");
+ var previousPromise;
+
+ function enqueue(method, arg) {
+ function callInvokeWithMethodAndArg() {
+ return invoke(method, arg);
+ }
+
+ return previousPromise =
+ // If enqueue has been called before, then we want to wait until
+ // all previous Promises have been resolved before calling invoke,
+ // so that results are always delivered in the correct order. If
+ // enqueue has not been called before, then it is important to
+ // call invoke immediately, without waiting on a callback to fire,
+ // so that the async generator function has the opportunity to do
+ // any necessary setup in a predictable way. This predictability
+ // is why the Promise constructor synchronously invokes its
+ // executor callback, and why async functions synchronously
+ // execute code before the first await. Since we implement simple
+ // async functions in terms of async generators, it is especially
+ // important to get this right, even though it requires care.
+ previousPromise ? previousPromise.then(
+ callInvokeWithMethodAndArg,
+ // Avoid propagating failures to Promises returned by later
+ // invocations of the iterator.
+ callInvokeWithMethodAndArg
+ ) : new Promise(function (resolve) {
+ resolve(callInvokeWithMethodAndArg());
+ });
+ }
+
+ // Define the unified helper method that is used to implement .next,
+ // .throw, and .return (see defineIteratorMethods).
+ this._invoke = enqueue;
+ }
+
+ defineIteratorMethods(AsyncIterator.prototype);
+
+ // Note that simple async functions are implemented on top of
+ // AsyncIterator objects; they just return a Promise for the value of
+ // the final result produced by the iterator.
+ runtime.async = function(innerFn, outerFn, self, tryLocsList) {
+ var iter = new AsyncIterator(
+ wrap(innerFn, outerFn, self, tryLocsList)
+ );
+
+ return runtime.isGeneratorFunction(outerFn)
+ ? iter // If outerFn is a generator, return the full iterator.
+ : iter.next().then(function(result) {
+ return result.done ? result.value : iter.next();
+ });
+ };
+
+ function makeInvokeMethod(innerFn, self, context) {
+ var state = GenStateSuspendedStart;
+
+ return function invoke(method, arg) {
+ if (state === GenStateExecuting) {
+ throw new Error("Generator is already running");
+ }
+
+ if (state === GenStateCompleted) {
+ if (method === "throw") {
+ throw arg;
+ }
+
+ // Be forgiving, per 25.3.3.3.3 of the spec:
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
+ return doneResult();
+ }
+
+ while (true) {
+ var delegate = context.delegate;
+ if (delegate) {
+ if (method === "return" ||
+ (method === "throw" && delegate.iterator[method] === undefined)) {
+ // A return or throw (when the delegate iterator has no throw
+ // method) always terminates the yield* loop.
+ context.delegate = null;
+
+ // If the delegate iterator has a return method, give it a
+ // chance to clean up.
+ var returnMethod = delegate.iterator["return"];
+ if (returnMethod) {
+ var record = tryCatch(returnMethod, delegate.iterator, arg);
+ if (record.type === "throw") {
+ // If the return method threw an exception, let that
+ // exception prevail over the original return or throw.
+ method = "throw";
+ arg = record.arg;
+ continue;
+ }
+ }
+
+ if (method === "return") {
+ // Continue with the outer return, now that the delegate
+ // iterator has been terminated.
+ continue;
+ }
+ }
+
+ var record = tryCatch(
+ delegate.iterator[method],
+ delegate.iterator,
+ arg
+ );
+
+ if (record.type === "throw") {
+ context.delegate = null;
+
+ // Like returning generator.throw(uncaught), but without the
+ // overhead of an extra function call.
+ method = "throw";
+ arg = record.arg;
+ continue;
+ }
+
+ // Delegate generator ran and handled its own exceptions so
+ // regardless of what the method was, we continue as if it is
+ // "next" with an undefined arg.
+ method = "next";
+ arg = undefined;
+
+ var info = record.arg;
+ if (info.done) {
+ context[delegate.resultName] = info.value;
+ context.next = delegate.nextLoc;
+ } else {
+ state = GenStateSuspendedYield;
+ return info;
+ }
+
+ context.delegate = null;
+ }
+
+ if (method === "next") {
+ context._sent = arg;
+
+ if (state === GenStateSuspendedYield) {
+ context.sent = arg;
+ } else {
+ context.sent = undefined;
+ }
+ } else if (method === "throw") {
+ if (state === GenStateSuspendedStart) {
+ state = GenStateCompleted;
+ throw arg;
+ }
+
+ if (context.dispatchException(arg)) {
+ // If the dispatched exception was caught by a catch block,
+ // then let that catch block handle the exception normally.
+ method = "next";
+ arg = undefined;
+ }
+
+ } else if (method === "return") {
+ context.abrupt("return", arg);
+ }
+
+ state = GenStateExecuting;
+
+ var record = tryCatch(innerFn, self, context);
+ if (record.type === "normal") {
+ // If an exception is thrown from innerFn, we leave state ===
+ // GenStateExecuting and loop back for another invocation.
+ state = context.done
+ ? GenStateCompleted
+ : GenStateSuspendedYield;
+
+ var info = {
+ value: record.arg,
+ done: context.done
+ };
+
+ if (record.arg === ContinueSentinel) {
+ if (context.delegate && method === "next") {
+ // Deliberately forget the last sent value so that we don't
+ // accidentally pass it on to the delegate.
+ arg = undefined;
+ }
+ } else {
+ return info;
+ }
+
+ } else if (record.type === "throw") {
+ state = GenStateCompleted;
+ // Dispatch the exception by looping back around to the
+ // context.dispatchException(arg) call above.
+ method = "throw";
+ arg = record.arg;
+ }
+ }
+ };
+ }
+
+ // Define Generator.prototype.{next,throw,return} in terms of the
+ // unified ._invoke helper method.
+ defineIteratorMethods(Gp);
+
+ Gp[iteratorSymbol] = function() {
+ return this;
+ };
+
+ Gp.toString = function() {
+ return "[object Generator]";
+ };
+
+ function pushTryEntry(locs) {
+ var entry = { tryLoc: locs[0] };
+
+ if (1 in locs) {
+ entry.catchLoc = locs[1];
+ }
+
+ if (2 in locs) {
+ entry.finallyLoc = locs[2];
+ entry.afterLoc = locs[3];
+ }
+
+ this.tryEntries.push(entry);
+ }
+
+ function resetTryEntry(entry) {
+ var record = entry.completion || {};
+ record.type = "normal";
+ delete record.arg;
+ entry.completion = record;
+ }
+
+ function Context(tryLocsList) {
+ // The root entry object (effectively a try statement without a catch
+ // or a finally block) gives us a place to store values thrown from
+ // locations where there is no enclosing try statement.
+ this.tryEntries = [{ tryLoc: "root" }];
+ tryLocsList.forEach(pushTryEntry, this);
+ this.reset(true);
+ }
+
+ runtime.keys = function(object) {
+ var keys = [];
+ for (var key in object) {
+ keys.push(key);
+ }
+ keys.reverse();
+
+ // Rather than returning an object with a next method, we keep
+ // things simple and return the next function itself.
+ return function next() {
+ while (keys.length) {
+ var key = keys.pop();
+ if (key in object) {
+ next.value = key;
+ next.done = false;
+ return next;
+ }
+ }
+
+ // To avoid creating an additional object, we just hang the .value
+ // and .done properties off the next function object itself. This
+ // also ensures that the minifier will not anonymize the function.
+ next.done = true;
+ return next;
+ };
+ };
+
+ function values(iterable) {
+ if (iterable) {
+ var iteratorMethod = iterable[iteratorSymbol];
+ if (iteratorMethod) {
+ return iteratorMethod.call(iterable);
+ }
+
+ if (typeof iterable.next === "function") {
+ return iterable;
+ }
+
+ if (!isNaN(iterable.length)) {
+ var i = -1, next = function next() {
+ while (++i < iterable.length) {
+ if (hasOwn.call(iterable, i)) {
+ next.value = iterable[i];
+ next.done = false;
+ return next;
+ }
+ }
+
+ next.value = undefined;
+ next.done = true;
+
+ return next;
+ };
+
+ return next.next = next;
+ }
+ }
+
+ // Return an iterator with no values.
+ return { next: doneResult };
+ }
+ runtime.values = values;
+
+ function doneResult() {
+ return { value: undefined, done: true };
+ }
+
+ Context.prototype = {
+ constructor: Context,
+
+ reset: function(skipTempReset) {
+ this.prev = 0;
+ this.next = 0;
+ this.sent = undefined;
+ this.done = false;
+ this.delegate = null;
+
+ this.tryEntries.forEach(resetTryEntry);
+
+ if (!skipTempReset) {
+ for (var name in this) {
+ // Not sure about the optimal order of these conditions:
+ if (name.charAt(0) === "t" &&
+ hasOwn.call(this, name) &&
+ !isNaN(+name.slice(1))) {
+ this[name] = undefined;
+ }
+ }
+ }
+ },
+
+ stop: function() {
+ this.done = true;
+
+ var rootEntry = this.tryEntries[0];
+ var rootRecord = rootEntry.completion;
+ if (rootRecord.type === "throw") {
+ throw rootRecord.arg;
+ }
+
+ return this.rval;
+ },
+
+ dispatchException: function(exception) {
+ if (this.done) {
+ throw exception;
+ }
+
+ var context = this;
+ function handle(loc, caught) {
+ record.type = "throw";
+ record.arg = exception;
+ context.next = loc;
+ return !!caught;
+ }
+
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ var record = entry.completion;
+
+ if (entry.tryLoc === "root") {
+ // Exception thrown outside of any try block that could handle
+ // it, so set the completion value of the entire function to
+ // throw the exception.
+ return handle("end");
+ }
+
+ if (entry.tryLoc <= this.prev) {
+ var hasCatch = hasOwn.call(entry, "catchLoc");
+ var hasFinally = hasOwn.call(entry, "finallyLoc");
+
+ if (hasCatch && hasFinally) {
+ if (this.prev < entry.catchLoc) {
+ return handle(entry.catchLoc, true);
+ } else if (this.prev < entry.finallyLoc) {
+ return handle(entry.finallyLoc);
+ }
+
+ } else if (hasCatch) {
+ if (this.prev < entry.catchLoc) {
+ return handle(entry.catchLoc, true);
+ }
+
+ } else if (hasFinally) {
+ if (this.prev < entry.finallyLoc) {
+ return handle(entry.finallyLoc);
+ }
+
+ } else {
+ throw new Error("try statement without catch or finally");
+ }
+ }
+ }
+ },
+
+ abrupt: function(type, arg) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.tryLoc <= this.prev &&
+ hasOwn.call(entry, "finallyLoc") &&
+ this.prev < entry.finallyLoc) {
+ var finallyEntry = entry;
+ break;
+ }
+ }
+
+ if (finallyEntry &&
+ (type === "break" ||
+ type === "continue") &&
+ finallyEntry.tryLoc <= arg &&
+ arg <= finallyEntry.finallyLoc) {
+ // Ignore the finally entry if control is not jumping to a
+ // location outside the try/catch block.
+ finallyEntry = null;
+ }
+
+ var record = finallyEntry ? finallyEntry.completion : {};
+ record.type = type;
+ record.arg = arg;
+
+ if (finallyEntry) {
+ this.next = finallyEntry.finallyLoc;
+ } else {
+ this.complete(record);
+ }
+
+ return ContinueSentinel;
+ },
+
+ complete: function(record, afterLoc) {
+ if (record.type === "throw") {
+ throw record.arg;
+ }
+
+ if (record.type === "break" ||
+ record.type === "continue") {
+ this.next = record.arg;
+ } else if (record.type === "return") {
+ this.rval = record.arg;
+ this.next = "end";
+ } else if (record.type === "normal" && afterLoc) {
+ this.next = afterLoc;
+ }
+ },
+
+ finish: function(finallyLoc) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.finallyLoc === finallyLoc) {
+ this.complete(entry.completion, entry.afterLoc);
+ resetTryEntry(entry);
+ return ContinueSentinel;
+ }
+ }
+ },
+
+ "catch": function(tryLoc) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.tryLoc === tryLoc) {
+ var record = entry.completion;
+ if (record.type === "throw") {
+ var thrown = record.arg;
+ resetTryEntry(entry);
+ }
+ return thrown;
+ }
+ }
+
+ // The context.catch method must only be called with a location
+ // argument that corresponds to a known catch block.
+ throw new Error("illegal catch attempt");
+ },
+
+ delegateYield: function(iterable, resultName, nextLoc) {
+ this.delegate = {
+ iterator: values(iterable),
+ resultName: resultName,
+ nextLoc: nextLoc
+ };
+
+ return ContinueSentinel;
+ }
+ };
+})(
+ // Among the various tricks for obtaining a reference to the global
+ // object, this seems to be the most reliable technique that does not
+ // use indirect eval (which violates Content Security Policy).
+ typeof global === "object" ? global :
+ typeof window === "object" ? window :
+ typeof self === "object" ? self : this
+);
+
+}).call(this,require("../process/browser.js"),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"../process/browser.js":202}],190:[function(require,module,exports){
+/*!
+Copyright (C) 2013-2015 by Andrea Giammarchi - @WebReflection
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+*/
+(function(window){'use strict';
+ /* jshint loopfunc: true, noempty: false*/
+ // http://www.w3.org/TR/dom/#element
+
+ function createDocumentFragment() {
+ return document.createDocumentFragment();
+ }
+
+ function createElement(nodeName) {
+ return document.createElement(nodeName);
+ }
+
+ function mutationMacro(nodes) {
+ if (nodes.length === 1) {
+ return textNodeIfString(nodes[0]);
+ }
+ for (var
+ fragment = createDocumentFragment(),
+ list = slice.call(nodes),
+ i = 0; i < nodes.length; i++
+ ) {
+ fragment.appendChild(textNodeIfString(list[i]));
+ }
+ return fragment;
+ }
+
+ function textNodeIfString(node) {
+ return typeof node === 'string' ? document.createTextNode(node) : node;
+ }
+
+ for(var
+ head,
+ property,
+ TemporaryPrototype,
+ TemporaryTokenList,
+ wrapVerifyToken,
+ document = window.document,
+ defineProperty = Object.defineProperty || function (object, property, descriptor) {
+ object.__defineGetter__(property, descriptor.get);
+ },
+ indexOf = [].indexOf || function indexOf(value){
+ var length = this.length;
+ while(length--) {
+ if (this[length] === value) {
+ break;
+ }
+ }
+ return length;
+ },
+ // http://www.w3.org/TR/domcore/#domtokenlist
+ verifyToken = function (token) {
+ if (!token) {
+ throw 'SyntaxError';
+ } else if (spaces.test(token)) {
+ throw 'InvalidCharacterError';
+ }
+ return token;
+ },
+ DOMTokenList = function (node) {
+ var
+ className = node.className,
+ isSVG = typeof className === 'object',
+ value = (isSVG ? className.baseVal : className).replace(trim, '')
+ ;
+ if (value.length) {
+ properties.push.apply(
+ this,
+ value.split(spaces)
+ );
+ }
+ this._isSVG = isSVG;
+ this._ = node;
+ },
+ classListDescriptor = {
+ get: function get() {
+ return new DOMTokenList(this);
+ },
+ set: function(){}
+ },
+ uid = 'dom4-tmp-'.concat(Math.random() * +new Date()).replace('.','-'),
+ trim = /^\s+|\s+$/g,
+ spaces = /\s+/,
+ SPACE = '\x20',
+ CLASS_LIST = 'classList',
+ toggle = function toggle(token, force) {
+ if (this.contains(token)) {
+ if (!force) {
+ // force is not true (either false or omitted)
+ this.remove(token);
+ }
+ } else if(force === undefined || force) {
+ force = true;
+ this.add(token);
+ }
+ return !!force;
+ },
+ DocumentFragmentPrototype = window.DocumentFragment && DocumentFragment.prototype,
+ Node = window.Node,
+ NodePrototype = (Node || Element).prototype,
+ CharacterData = window.CharacterData || Node,
+ CharacterDataPrototype = CharacterData && CharacterData.prototype,
+ DocumentType = window.DocumentType,
+ DocumentTypePrototype = DocumentType && DocumentType.prototype,
+ ElementPrototype = (window.Element || Node || window.HTMLElement).prototype,
+ HTMLSelectElement = window.HTMLSelectElement || createElement('select').constructor,
+ selectRemove = HTMLSelectElement.prototype.remove,
+ ShadowRoot = window.ShadowRoot,
+ SVGElement = window.SVGElement,
+ // normalizes multiple ids as CSS query
+ idSpaceFinder = / /g,
+ idSpaceReplacer = '\\ ',
+ createQueryMethod = function (methodName) {
+ var createArray = methodName === 'querySelectorAll';
+ return function (css) {
+ var a, i, id, query, nl, selectors, node = this.parentNode;
+ if (node) {
+ for (
+ id = this.getAttribute('id') || uid,
+ query = id === uid ? id : id.replace(idSpaceFinder, idSpaceReplacer),
+ selectors = css.split(','),
+ i = 0; i < selectors.length; i++
+ ) {
+ selectors[i] = '#' + query + ' ' + selectors[i];
+ }
+ css = selectors.join(',');
+ }
+ if (id === uid) this.setAttribute('id', id);
+ nl = (node || this)[methodName](css);
+ if (id === uid) this.removeAttribute('id');
+ // return a list
+ if (createArray) {
+ i = nl.length;
+ a = new Array(i);
+ while (i--) a[i] = nl[i];
+ }
+ // return node or null
+ else {
+ a = nl;
+ }
+ return a;
+ };
+ },
+ addQueryAndAll = function (where) {
+ if (!('query' in where)) {
+ where.query = ElementPrototype.query;
+ }
+ if (!('queryAll' in where)) {
+ where.queryAll = ElementPrototype.queryAll;
+ }
+ },
+ properties = [
+ 'matches', (
+ ElementPrototype.matchesSelector ||
+ ElementPrototype.webkitMatchesSelector ||
+ ElementPrototype.khtmlMatchesSelector ||
+ ElementPrototype.mozMatchesSelector ||
+ ElementPrototype.msMatchesSelector ||
+ ElementPrototype.oMatchesSelector ||
+ function matches(selector) {
+ var parentNode = this.parentNode;
+ return !!parentNode && -1 < indexOf.call(
+ parentNode.querySelectorAll(selector),
+ this
+ );
+ }
+ ),
+ 'closest', function closest(selector) {
+ var parentNode = this, matches;
+ while (
+ // document has no .matches
+ (matches = parentNode && parentNode.matches) &&
+ !parentNode.matches(selector)
+ ) {
+ parentNode = parentNode.parentNode;
+ }
+ return matches ? parentNode : null;
+ },
+ 'prepend', function prepend() {
+ var firstChild = this.firstChild,
+ node = mutationMacro(arguments);
+ if (firstChild) {
+ this.insertBefore(node, firstChild);
+ } else {
+ this.appendChild(node);
+ }
+ },
+ 'append', function append() {
+ this.appendChild(mutationMacro(arguments));
+ },
+ 'before', function before() {
+ var parentNode = this.parentNode;
+ if (parentNode) {
+ parentNode.insertBefore(
+ mutationMacro(arguments), this
+ );
+ }
+ },
+ 'after', function after() {
+ var parentNode = this.parentNode,
+ nextSibling = this.nextSibling,
+ node = mutationMacro(arguments);
+ if (parentNode) {
+ if (nextSibling) {
+ parentNode.insertBefore(node, nextSibling);
+ } else {
+ parentNode.appendChild(node);
+ }
+ }
+ },
+ // WARNING - DEPRECATED - use .replaceWith() instead
+ 'replace', function replace() {
+ this.replaceWith.apply(this, arguments);
+ },
+ 'replaceWith', function replaceWith() {
+ var parentNode = this.parentNode;
+ if (parentNode) {
+ parentNode.replaceChild(
+ mutationMacro(arguments),
+ this
+ );
+ }
+ },
+ 'remove', function remove() {
+ var parentNode = this.parentNode;
+ if (parentNode) {
+ parentNode.removeChild(this);
+ }
+ },
+ 'query', createQueryMethod('querySelector'),
+ 'queryAll', createQueryMethod('querySelectorAll')
+ ],
+ slice = properties.slice,
+ i = properties.length; i; i -= 2
+ ) {
+ property = properties[i - 2];
+ if (!(property in ElementPrototype)) {
+ ElementPrototype[property] = properties[i - 1];
+ }
+ if (property === 'remove') {
+ // see https://github.com/WebReflection/dom4/issues/19
+ HTMLSelectElement.prototype[property] = function () {
+ return 0 < arguments.length ?
+ selectRemove.apply(this, arguments) :
+ ElementPrototype.remove.call(this);
+ };
+ }
+ // see https://github.com/WebReflection/dom4/issues/18
+ if (/^(?:before|after|replace|replaceWith|remove)$/.test(property)) {
+ if (CharacterData && !(property in CharacterDataPrototype)) {
+ CharacterDataPrototype[property] = properties[i - 1];
+ }
+ if (DocumentType && !(property in DocumentTypePrototype)) {
+ DocumentTypePrototype[property] = properties[i - 1];
+ }
+ }
+ // see https://github.com/WebReflection/dom4/pull/26
+ if (/^(?:append|prepend)$/.test(property)) {
+ if (DocumentFragmentPrototype) {
+ if (!(property in DocumentFragmentPrototype)) {
+ DocumentFragmentPrototype[property] = properties[i - 1];
+ }
+ } else {
+ try {
+ createDocumentFragment().constructor.prototype[property] = properties[i - 1];
+ } catch(o_O) {}
+ }
+ }
+ }
+
+ // bring query and queryAll to the document too
+ addQueryAndAll(document);
+
+ // brings query and queryAll to fragments as well
+ if (DocumentFragmentPrototype) {
+ addQueryAndAll(DocumentFragmentPrototype);
+ } else {
+ try {
+ addQueryAndAll(createDocumentFragment().constructor.prototype);
+ } catch(o_O) {}
+ }
+
+ // bring query and queryAll to the ShadowRoot too
+ if (ShadowRoot) {
+ addQueryAndAll(ShadowRoot.prototype);
+ }
+
+ // most likely an IE9 only issue
+ // see https://github.com/WebReflection/dom4/issues/6
+ if (!createElement('a').matches('a')) {
+ ElementPrototype[property] = function(matches){
+ return function (selector) {
+ return matches.call(
+ this.parentNode ?
+ this :
+ createDocumentFragment().appendChild(this),
+ selector
+ );
+ };
+ }(ElementPrototype[property]);
+ }
+
+ // used to fix both old webkit and SVG
+ DOMTokenList.prototype = {
+ length: 0,
+ add: function add() {
+ for(var j = 0, token; j < arguments.length; j++) {
+ token = arguments[j];
+ if(!this.contains(token)) {
+ properties.push.call(this, property);
+ }
+ }
+ if (this._isSVG) {
+ this._.setAttribute('class', '' + this);
+ } else {
+ this._.className = '' + this;
+ }
+ },
+ contains: (function(indexOf){
+ return function contains(token) {
+ i = indexOf.call(this, property = verifyToken(token));
+ return -1 < i;
+ };
+ }([].indexOf || function (token) {
+ i = this.length;
+ while(i-- && this[i] !== token){}
+ return i;
+ })),
+ item: function item(i) {
+ return this[i] || null;
+ },
+ remove: function remove() {
+ for(var j = 0, token; j < arguments.length; j++) {
+ token = arguments[j];
+ if(this.contains(token)) {
+ properties.splice.call(this, i, 1);
+ }
+ }
+ if (this._isSVG) {
+ this._.setAttribute('class', '' + this);
+ } else {
+ this._.className = '' + this;
+ }
+ },
+ toggle: toggle,
+ toString: function toString() {
+ return properties.join.call(this, SPACE);
+ }
+ };
+
+ if (SVGElement && !(CLASS_LIST in SVGElement.prototype)) {
+ defineProperty(SVGElement.prototype, CLASS_LIST, classListDescriptor);
+ }
+
+ // http://www.w3.org/TR/dom/#domtokenlist
+ // iOS 5.1 has completely screwed this property
+ // classList in ElementPrototype is false
+ // but it's actually there as getter
+ if (!(CLASS_LIST in document.documentElement)) {
+ defineProperty(ElementPrototype, CLASS_LIST, classListDescriptor);
+ } else {
+ // iOS 5.1 and Nokia ASHA do not support multiple add or remove
+ // trying to detect and fix that in here
+ TemporaryTokenList = createElement('div')[CLASS_LIST];
+ TemporaryTokenList.add('a', 'b', 'a');
+ if ('a\x20b' != TemporaryTokenList) {
+ // no other way to reach original methods in iOS 5.1
+ TemporaryPrototype = TemporaryTokenList.constructor.prototype;
+ if (!('add' in TemporaryPrototype)) {
+ // ASHA double fails in here
+ TemporaryPrototype = window.TemporaryTokenList.prototype;
+ }
+ wrapVerifyToken = function (original) {
+ return function () {
+ var i = 0;
+ while (i < arguments.length) {
+ original.call(this, arguments[i++]);
+ }
+ };
+ };
+ TemporaryPrototype.add = wrapVerifyToken(TemporaryPrototype.add);
+ TemporaryPrototype.remove = wrapVerifyToken(TemporaryPrototype.remove);
+ // toggle is broken too ^_^ ... let's fix it
+ TemporaryPrototype.toggle = toggle;
+ }
+ }
+
+ if (!('contains' in NodePrototype)) {
+ defineProperty(NodePrototype, 'contains', {
+ value: function (el) {
+ while (el && el !== this) el = el.parentNode;
+ return this === el;
+ }
+ });
+ }
+
+ if (!('head' in document)) {
+ defineProperty(document, 'head', {
+ get: function () {
+ return head || (
+ head = document.getElementsByTagName('head')[0]
+ );
+ }
+ });
+ }
+
+ // requestAnimationFrame partial polyfill
+ (function () {
+ for (var
+ raf,
+ rAF = window.requestAnimationFrame,
+ cAF = window.cancelAnimationFrame,
+ prefixes = ['o', 'ms', 'moz', 'webkit'],
+ i = prefixes.length;
+ !cAF && i--;
+ ) {
+ rAF = rAF || window[prefixes[i] + 'RequestAnimationFrame'];
+ cAF = window[prefixes[i] + 'CancelAnimationFrame'] ||
+ window[prefixes[i] + 'CancelRequestAnimationFrame'];
+ }
+ if (!cAF) {
+ // some FF apparently implemented rAF but no cAF
+ if (rAF) {
+ raf = rAF;
+ rAF = function (callback) {
+ var goOn = true;
+ raf(function () {
+ if (goOn) callback.apply(this, arguments);
+ });
+ return function () {
+ goOn = false;
+ };
+ };
+ cAF = function (id) {
+ id();
+ };
+ } else {
+ rAF = function (callback) {
+ return setTimeout(callback, 15, 15);
+ };
+ cAF = function (id) {
+ clearTimeout(id);
+ };
+ }
+ }
+ window.requestAnimationFrame = rAF;
+ window.cancelAnimationFrame = cAF;
+ }());
+
+ // http://www.w3.org/TR/dom/#customevent
+ try{new window.CustomEvent('?');}catch(o_O){
+ window.CustomEvent = function(
+ eventName,
+ defaultInitDict
+ ){
+
+ // the infamous substitute
+ function CustomEvent(type, eventInitDict) {
+ /*jshint eqnull:true */
+ var event = document.createEvent(eventName);
+ if (typeof type != 'string') {
+ throw new Error('An event name must be provided');
+ }
+ if (eventName == 'Event') {
+ event.initCustomEvent = initCustomEvent;
+ }
+ if (eventInitDict == null) {
+ eventInitDict = defaultInitDict;
+ }
+ event.initCustomEvent(
+ type,
+ eventInitDict.bubbles,
+ eventInitDict.cancelable,
+ eventInitDict.detail
+ );
+ return event;
+ }
+
+ // attached at runtime
+ function initCustomEvent(
+ type, bubbles, cancelable, detail
+ ) {
+ /*jshint validthis:true*/
+ this.initEvent(type, bubbles, cancelable);
+ this.detail = detail;
+ }
+
+ // that's it
+ return CustomEvent;
+ }(
+ // is this IE9 or IE10 ?
+ // where CustomEvent is there
+ // but not usable as construtor ?
+ window.CustomEvent ?
+ // use the CustomEvent interface in such case
+ 'CustomEvent' : 'Event',
+ // otherwise the common compatible one
+ {
+ bubbles: false,
+ cancelable: false,
+ detail: null
+ }
+ );
+ }
+
+}(window));
+},{}],191:[function(require,module,exports){
+(function (global){
+(function (global){
+/*! loadCSS: load a CSS file asynchronously. [c]2016 @scottjehl, Filament Group, Inc. Licensed MIT */
+(function(w){
+ "use strict";
+ /* exported loadCSS */
+ var loadCSS = function( href, before, media ){
+ // Arguments explained:
+ // `href` [REQUIRED] is the URL for your CSS file.
+ // `before` [OPTIONAL] is the element the script should use as a reference for injecting our stylesheet before
+ // By default, loadCSS attempts to inject the link after the last stylesheet or script in the DOM. However, you might desire a more specific location in your document.
+ // `media` [OPTIONAL] is the media type or query of the stylesheet. By default it will be 'all'
+ var doc = w.document;
+ var ss = doc.createElement( "link" );
+ var newMedia = media || "all";
+ var ref;
+ if( before ){
+ ref = before;
+ }
+ else {
+ var refs = ( doc.body || doc.getElementsByTagName( "head" )[ 0 ] ).childNodes;
+ ref = refs[ refs.length - 1];
+ }
+
+ var sheets = doc.styleSheets;
+ ss.rel = "stylesheet";
+ ss.href = href;
+ // temporarily set media to something inapplicable to ensure it'll fetch without blocking render
+ ss.media = "only x";
+
+ // wait until body is defined before injecting link. This ensures a non-blocking load in IE11.
+ function ready( cb ){
+ if( doc.body ){
+ return cb();
+ }
+ setTimeout(function(){
+ ready( cb );
+ });
+ }
+ // Inject link
+ // Note: the ternary preserves the existing behavior of "before" argument, but we could choose to change the argument to "after" in a later release and standardize on ref.nextSibling for all refs
+ // Note: `insertBefore` is used instead of `appendChild`, for safety re: http://www.paulirish.com/2011/surefire-dom-element-insertion/
+ ready( function(){
+ ref.parentNode.insertBefore( ss, ( before ? ref : ref.nextSibling ) );
+ });
+ // A method (exposed on return object for external use) that mimics onload by polling until document.styleSheets until it includes the new sheet.
+ var onloadcssdefined = function( cb ){
+ var resolvedHref = ss.href;
+ var i = sheets.length;
+ while( i-- ){
+ if( sheets[ i ].href === resolvedHref ){
+ return cb();
+ }
+ }
+ setTimeout(function() {
+ onloadcssdefined( cb );
+ });
+ };
+
+ // once loaded, set link's media back to `all` so that the stylesheet applies once it loads
+ if( ss.addEventListener ){
+ ss.addEventListener( "load", function(){
+ this.media = newMedia;
+ });
+ }
+ ss.onloadcssdefined = onloadcssdefined;
+ onloadcssdefined(function() {
+ if( ss.media !== newMedia ){
+ ss.media = newMedia;
+ }
+ });
+ return ss;
+ };
+ // commonjs
+ if( typeof exports !== "undefined" ){
+ exports.loadCSS = loadCSS;
+ }
+ else {
+ w.loadCSS = loadCSS;
+ }
+}( typeof global !== "undefined" ? global : this ));
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],192:[function(require,module,exports){
+(function(){'use strict';var h=!!document.addEventListener;function k(a,b){h?a.addEventListener("scroll",b,!1):a.attachEvent("scroll",b)}function w(a){document.body?a():h?document.addEventListener("DOMContentLoaded",a):document.onreadystatechange=function(){"interactive"==document.readyState&&a()}};function x(a){this.a=document.createElement("div");this.a.setAttribute("aria-hidden","true");this.a.appendChild(document.createTextNode(a));this.b=document.createElement("span");this.c=document.createElement("span");this.h=document.createElement("span");this.f=document.createElement("span");this.g=-1;this.b.style.cssText="display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;";this.c.style.cssText="display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;";
+this.f.style.cssText="display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;";this.h.style.cssText="display:inline-block;width:200%;height:200%;font-size:16px;";this.b.appendChild(this.h);this.c.appendChild(this.f);this.a.appendChild(this.b);this.a.appendChild(this.c)}
+function y(a,b){a.a.style.cssText="min-width:20px;min-height:20px;display:inline-block;overflow:hidden;position:absolute;width:auto;margin:0;padding:0;top:-999px;left:-999px;white-space:nowrap;font:"+b+";"}function z(a){var b=a.a.offsetWidth,c=b+100;a.f.style.width=c+"px";a.c.scrollLeft=c;a.b.scrollLeft=a.b.scrollWidth+100;return a.g!==b?(a.g=b,!0):!1}function A(a,b){function c(){var a=l;z(a)&&null!==a.a.parentNode&&b(a.g)}var l=a;k(a.b,c);k(a.c,c);z(a)};function B(a,b){var c=b||{};this.family=a;this.style=c.style||"normal";this.weight=c.weight||"normal";this.stretch=c.stretch||"normal"}var C=null,D=null,H=!!window.FontFace;function I(){if(null===D){var a=document.createElement("div");try{a.style.font="condensed 100px sans-serif"}catch(b){}D=""!==a.style.font}return D}function J(a,b){return[a.style,a.weight,I()?a.stretch:"","100px",b].join(" ")}
+B.prototype.a=function(a,b){var c=this,l=a||"BESbswy",E=b||3E3,F=(new Date).getTime();return new Promise(function(a,b){if(H){var q=function(){(new Date).getTime()-F>=E?b(c):document.fonts.load(J(c,c.family),l).then(function(b){1<=b.length?a(c):setTimeout(q,25)},function(){b(c)})};q()}else w(function(){function r(){var b;if(b=-1!=e&&-1!=f||-1!=e&&-1!=g||-1!=f&&-1!=g)(b=e!=f&&e!=g&&f!=g)||(null===C&&(b=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),C=!!b&&(536>parseInt(b[1],
+10)||536===parseInt(b[1],10)&&11>=parseInt(b[2],10))),b=C&&(e==t&&f==t&&g==t||e==u&&f==u&&g==u||e==v&&f==v&&g==v)),b=!b;b&&(null!==d.parentNode&&d.parentNode.removeChild(d),clearTimeout(G),a(c))}function q(){if((new Date).getTime()-F>=E)null!==d.parentNode&&d.parentNode.removeChild(d),b(c);else{var a=document.hidden;if(!0===a||void 0===a)e=m.a.offsetWidth,f=n.a.offsetWidth,g=p.a.offsetWidth,r();G=setTimeout(q,50)}}var m=new x(l),n=new x(l),p=new x(l),e=-1,f=-1,g=-1,t=-1,u=-1,v=-1,d=document.createElement("div"),
+G=0;d.dir="ltr";y(m,J(c,"sans-serif"));y(n,J(c,"serif"));y(p,J(c,"monospace"));d.appendChild(m.a);d.appendChild(n.a);d.appendChild(p.a);document.body.appendChild(d);t=m.a.offsetWidth;u=n.a.offsetWidth;v=p.a.offsetWidth;q();A(m,function(a){e=a;r()});y(m,J(c,'"'+c.family+'",sans-serif'));A(n,function(a){f=a;r()});y(n,J(c,'"'+c.family+'",serif'));A(p,function(a){g=a;r()});y(p,J(c,'"'+c.family+'",monospace'))})})};window.FontFaceObserver=B;window.FontFaceObserver.prototype.check=B.prototype.a;"undefined"!==typeof module&&(module.exports=window.FontFaceObserver);}());
+
+},{}],193:[function(require,module,exports){
+/**
+* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
+*/
+;(function(window, document) {
+/*jshint evil:true */
+ /** version */
+ var version = '3.7.3-pre';
+
+ /** Preset options */
+ var options = window.html5 || {};
+
+ /** Used to skip problem elements */
+ var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;
+
+ /** Not all elements can be cloned in IE **/
+ var saveClones = /^(?: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;
+
+ /** Detect whether the browser supports default html5 styles */
+ var supportsHtml5Styles;
+
+ /** Name of the expando, to work with multiple documents or to re-shiv one document */
+ var expando = '_html5shiv';
+
+ /** The id for the the documents expando */
+ var expanID = 0;
+
+ /** Cached data for each document */
+ var expandoData = {};
+
+ /** Detect whether the browser supports unknown elements */
+ var supportsUnknownElements;
+
+ (function() {
+ try {
+ var a = document.createElement('a');
+ a.innerHTML = '';
+ //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles
+ supportsHtml5Styles = ('hidden' in a);
+
+ supportsUnknownElements = a.childNodes.length == 1 || (function() {
+ // assign a false positive if unable to shiv
+ (document.createElement)('a');
+ var frag = document.createDocumentFragment();
+ return (
+ typeof frag.cloneNode == 'undefined' ||
+ typeof frag.createDocumentFragment == 'undefined' ||
+ typeof frag.createElement == 'undefined'
+ );
+ }());
+ } catch(e) {
+ // assign a false positive if detection fails => unable to shiv
+ supportsHtml5Styles = true;
+ supportsUnknownElements = true;
+ }
+
+ }());
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * Creates a style sheet with the given CSS text and adds it to the document.
+ * @private
+ * @param {Document} ownerDocument The document.
+ * @param {String} cssText The CSS text.
+ * @returns {StyleSheet} The style element.
+ */
+ function addStyleSheet(ownerDocument, cssText) {
+ var p = ownerDocument.createElement('p'),
+ parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;
+
+ p.innerHTML = 'x';
+ return parent.insertBefore(p.lastChild, parent.firstChild);
+ }
+
+ /**
+ * Returns the value of `html5.elements` as an array.
+ * @private
+ * @returns {Array} An array of shived element node names.
+ */
+ function getElements() {
+ var elements = html5.elements;
+ return typeof elements == 'string' ? elements.split(' ') : elements;
+ }
+
+ /**
+ * Extends the built-in list of html5 elements
+ * @memberOf html5
+ * @param {String|Array} newElements whitespace separated list or array of new element names to shiv
+ * @param {Document} ownerDocument The context document.
+ */
+ function addElements(newElements, ownerDocument) {
+ var elements = html5.elements;
+ if(typeof elements != 'string'){
+ elements = elements.join(' ');
+ }
+ if(typeof newElements != 'string'){
+ newElements = newElements.join(' ');
+ }
+ html5.elements = elements +' '+ newElements;
+ shivDocument(ownerDocument);
+ }
+
+ /**
+ * Returns the data associated to the given document
+ * @private
+ * @param {Document} ownerDocument The document.
+ * @returns {Object} An object of data.
+ */
+ function getExpandoData(ownerDocument) {
+ var data = expandoData[ownerDocument[expando]];
+ if (!data) {
+ data = {};
+ expanID++;
+ ownerDocument[expando] = expanID;
+ expandoData[expanID] = data;
+ }
+ return data;
+ }
+
+ /**
+ * returns a shived element for the given nodeName and document
+ * @memberOf html5
+ * @param {String} nodeName name of the element
+ * @param {Document} ownerDocument The context document.
+ * @returns {Object} The shived element.
+ */
+ function createElement(nodeName, ownerDocument, data){
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ if(supportsUnknownElements){
+ return ownerDocument.createElement(nodeName);
+ }
+ if (!data) {
+ data = getExpandoData(ownerDocument);
+ }
+ var node;
+
+ if (data.cache[nodeName]) {
+ node = data.cache[nodeName].cloneNode();
+ } else if (saveClones.test(nodeName)) {
+ node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
+ } else {
+ node = data.createElem(nodeName);
+ }
+
+ // Avoid adding some elements to fragments in IE < 9 because
+ // * Attributes like `name` or `type` cannot be set/changed once an element
+ // is inserted into a document/fragment
+ // * Link elements with `src` attributes that are inaccessible, as with
+ // a 403 response, will cause the tab/window to crash
+ // * Script elements appended to fragments will execute when their `src`
+ // or `text` property is set
+ return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node;
+ }
+
+ /**
+ * returns a shived DocumentFragment for the given document
+ * @memberOf html5
+ * @param {Document} ownerDocument The context document.
+ * @returns {Object} The shived DocumentFragment.
+ */
+ function createDocumentFragment(ownerDocument, data){
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ if(supportsUnknownElements){
+ return ownerDocument.createDocumentFragment();
+ }
+ data = data || getExpandoData(ownerDocument);
+ var clone = data.frag.cloneNode(),
+ i = 0,
+ elems = getElements(),
+ l = elems.length;
+ for(;i 1) {
+ for (var i = 1; i < arguments.length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ }
+ queue.push(new Item(fun, args));
+ if (queue.length === 1 && !draining) {
+ setTimeout(drainQueue, 0);
+ }
+};
+
+// v8 likes predictible objects
+function Item(fun, array) {
+ this.fun = fun;
+ this.array = array;
+}
+Item.prototype.run = function () {
+ this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};
+
+function noop() {}
+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+
+process.binding = function (name) {
+ throw new Error('process.binding is not supported');
+};
+
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+ throw new Error('process.chdir is not supported');
+};
+process.umask = function() { return 0; };
+
+},{}],203:[function(require,module,exports){
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ factory(global.Ractive.events)
+}(this, function (exports) { 'use strict';
+
+ // TODO can we just declare the keydowhHandler once? using `this`?
+ function makeKeyDefinition(code) {
+ return function (node, fire) {
+ function keydownHandler(event) {
+ var which = event.which || event.keyCode;
+
+ if (which === code) {
+ event.preventDefault();
+
+ fire({
+ node: node,
+ original: event
+ });
+ }
+ }
+
+ node.addEventListener('keydown', keydownHandler, false);
+
+ return {
+ teardown: function teardown() {
+ node.removeEventListener('keydown', keydownHandler, false);
+ }
+ };
+ };
+ }
+
+ var enter = makeKeyDefinition(13);
+ var tab = makeKeyDefinition(9);
+ var ractive_events_keys__escape = makeKeyDefinition(27);
+ var space = makeKeyDefinition(32);
+
+ var leftarrow = makeKeyDefinition(37);
+ var rightarrow = makeKeyDefinition(39);
+ var downarrow = makeKeyDefinition(40);
+ var uparrow = makeKeyDefinition(38);
+
+ exports.enter = enter;
+ exports.tab = tab;
+ exports.escape = ractive_events_keys__escape;
+ exports.space = space;
+ exports.leftarrow = leftarrow;
+ exports.rightarrow = rightarrow;
+ exports.downarrow = downarrow;
+ exports.uparrow = uparrow;
+
+}));
+},{}],204:[function(require,module,exports){
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ global.Ractive.transitions.fade = factory();
+}(this, function () { 'use strict';
+
+ var DEFAULTS = {
+ delay: 0,
+ duration: 300,
+ easing: 'linear'
+ };
+
+ function fade(t, params) {
+ var targetOpacity;
+
+ params = t.processParams(params, DEFAULTS);
+
+ if (t.isIntro) {
+ targetOpacity = t.getStyle('opacity');
+ t.setStyle('opacity', 0);
+ } else {
+ targetOpacity = 0;
+ }
+
+ t.animateStyle('opacity', targetOpacity, params).then(t.complete);
+ }
+
+ return fade;
+
+}));
+},{}],205:[function(require,module,exports){
+/*
+ Ractive.js v0.7.3
+ Sat Apr 25 2015 13:52:38 GMT-0400 (EDT) - commit da40f81c660ba2f09c45a09a9c20fdd34ee36d80
+
+ http://ractivejs.org
+ http://twitter.com/RactiveJS
+
+ Released under the MIT License.
+*/
+
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ global.Ractive = factory()
+}(this, function () { 'use strict';
+
+ var TEMPLATE_VERSION = 3;
+
+ var defaultOptions = {
+
+ // render placement:
+ el: void 0,
+ append: false,
+
+ // template:
+ template: { v: TEMPLATE_VERSION, t: [] },
+
+ // parse: // TODO static delimiters?
+ preserveWhitespace: false,
+ sanitize: false,
+ stripComments: true,
+ delimiters: ["{{", "}}"],
+ tripleDelimiters: ["{{{", "}}}"],
+ interpolate: false,
+
+ // data & binding:
+ data: {},
+ computed: {},
+ magic: false,
+ modifyArrays: true,
+ adapt: [],
+ isolated: false,
+ twoway: true,
+ lazy: false,
+
+ // transitions:
+ noIntro: false,
+ transitionsEnabled: true,
+ complete: void 0,
+
+ // css:
+ css: null,
+ noCssTransform: false
+ };
+
+ var config_defaults = defaultOptions;
+
+ // These are a subset of the easing equations found at
+ // https://raw.github.com/danro/easing-js - license info
+ // follows:
+
+ // --------------------------------------------------
+ // easing.js v0.5.4
+ // Generic set of easing functions with AMD support
+ // https://github.com/danro/easing-js
+ // This code may be freely distributed under the MIT license
+ // http://danro.mit-license.org/
+ // --------------------------------------------------
+ // All functions adapted from Thomas Fuchs & Jeremy Kahn
+ // Easing Equations (c) 2003 Robert Penner, BSD license
+ // https://raw.github.com/danro/easing-js/master/LICENSE
+ // --------------------------------------------------
+
+ // In that library, the functions named easeIn, easeOut, and
+ // easeInOut below are named easeInCubic, easeOutCubic, and
+ // (you guessed it) easeInOutCubic.
+ //
+ // You can add additional easing functions to this list, and they
+ // will be globally available.
+
+ var static_easing = {
+ linear: function (pos) {
+ return pos;
+ },
+ easeIn: function (pos) {
+ return Math.pow(pos, 3);
+ },
+ easeOut: function (pos) {
+ return Math.pow(pos - 1, 3) + 1;
+ },
+ easeInOut: function (pos) {
+ if ((pos /= 0.5) < 1) {
+ return 0.5 * Math.pow(pos, 3);
+ }
+ return 0.5 * (Math.pow(pos - 2, 3) + 2);
+ }
+ };
+
+ /*global console, navigator */
+ var isClient, isJsdom, hasConsole, environment__magic, namespaces, svg, vendors;
+
+ isClient = typeof document === "object";
+
+ isJsdom = typeof navigator !== "undefined" && /jsDom/.test(navigator.appName);
+
+ hasConsole = typeof console !== "undefined" && typeof console.warn === "function" && typeof console.warn.apply === "function";
+
+ try {
+ Object.defineProperty({}, "test", { value: 0 });
+ environment__magic = true;
+ } catch (e) {
+ environment__magic = false;
+ }
+
+ namespaces = {
+ html: "http://www.w3.org/1999/xhtml",
+ mathml: "http://www.w3.org/1998/Math/MathML",
+ svg: "http://www.w3.org/2000/svg",
+ xlink: "http://www.w3.org/1999/xlink",
+ xml: "http://www.w3.org/XML/1998/namespace",
+ xmlns: "http://www.w3.org/2000/xmlns/"
+ };
+
+ if (typeof document === "undefined") {
+ svg = false;
+ } else {
+ svg = document && document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1");
+ }
+
+ vendors = ["o", "ms", "moz", "webkit"];
+
+ var createElement, matches, dom__div, methodNames, unprefixed, prefixed, dom__i, j, makeFunction;
+
+ // Test for SVG support
+ if (!svg) {
+ createElement = function (type, ns) {
+ if (ns && ns !== namespaces.html) {
+ throw "This browser does not support namespaces other than http://www.w3.org/1999/xhtml. The most likely cause of this error is that you're trying to render SVG in an older browser. See http://docs.ractivejs.org/latest/svg-and-older-browsers for more information";
+ }
+
+ return document.createElement(type);
+ };
+ } else {
+ createElement = function (type, ns) {
+ if (!ns || ns === namespaces.html) {
+ return document.createElement(type);
+ }
+
+ return document.createElementNS(ns, type);
+ };
+ }
+
+ function getElement(input) {
+ var output;
+
+ if (!input || typeof input === "boolean") {
+ return;
+ }
+
+ if (typeof window === "undefined" || !document || !input) {
+ return null;
+ }
+
+ // We already have a DOM node - no work to do. (Duck typing alert!)
+ if (input.nodeType) {
+ return input;
+ }
+
+ // Get node from string
+ if (typeof input === "string") {
+ // try ID first
+ output = document.getElementById(input);
+
+ // then as selector, if possible
+ if (!output && document.querySelector) {
+ output = document.querySelector(input);
+ }
+
+ // did it work?
+ if (output && output.nodeType) {
+ return output;
+ }
+ }
+
+ // If we've been given a collection (jQuery, Zepto etc), extract the first item
+ if (input[0] && input[0].nodeType) {
+ return input[0];
+ }
+
+ return null;
+ }
+
+ if (!isClient) {
+ matches = null;
+ } else {
+ dom__div = createElement("div");
+ methodNames = ["matches", "matchesSelector"];
+
+ makeFunction = function (methodName) {
+ return function (node, selector) {
+ return node[methodName](selector);
+ };
+ };
+
+ dom__i = methodNames.length;
+
+ while (dom__i-- && !matches) {
+ unprefixed = methodNames[dom__i];
+
+ if (dom__div[unprefixed]) {
+ matches = makeFunction(unprefixed);
+ } else {
+ j = vendors.length;
+ while (j--) {
+ prefixed = vendors[dom__i] + unprefixed.substr(0, 1).toUpperCase() + unprefixed.substring(1);
+
+ if (dom__div[prefixed]) {
+ matches = makeFunction(prefixed);
+ break;
+ }
+ }
+ }
+ }
+
+ // IE8...
+ if (!matches) {
+ matches = function (node, selector) {
+ var nodes, parentNode, i;
+
+ parentNode = node.parentNode;
+
+ if (!parentNode) {
+ // empty dummy
+ dom__div.innerHTML = "";
+
+ parentNode = dom__div;
+ node = node.cloneNode();
+
+ dom__div.appendChild(node);
+ }
+
+ nodes = parentNode.querySelectorAll(selector);
+
+ i = nodes.length;
+ while (i--) {
+ if (nodes[i] === node) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+ }
+ }
+
+ function detachNode(node) {
+ if (node && typeof node.parentNode !== "unknown" && node.parentNode) {
+ node.parentNode.removeChild(node);
+ }
+
+ return node;
+ }
+
+ function safeToStringValue(value) {
+ return value == null || !value.toString ? "" : value;
+ }
+
+ var noop = function () {};
+
+ var win, doc, exportedShims;
+
+ if (typeof window === "undefined") {
+ exportedShims = null;
+ } else {
+ win = window;
+ doc = win.document;
+ exportedShims = {};
+
+ if (!doc) {
+ exportedShims = null;
+ }
+
+ // Shims for older browsers
+
+ if (!Date.now) {
+ Date.now = function () {
+ return +new Date();
+ };
+ }
+
+ if (!String.prototype.trim) {
+ String.prototype.trim = function () {
+ return this.replace(/^\s+/, "").replace(/\s+$/, "");
+ };
+ }
+
+ // Polyfill for Object.keys
+ // https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys
+ if (!Object.keys) {
+ Object.keys = (function () {
+ var hasOwnProperty = Object.prototype.hasOwnProperty,
+ hasDontEnumBug = !({ toString: null }).propertyIsEnumerable("toString"),
+ dontEnums = ["toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "constructor"],
+ dontEnumsLength = dontEnums.length;
+
+ return function (obj) {
+ if (typeof obj !== "object" && typeof obj !== "function" || obj === null) {
+ throw new TypeError("Object.keys called on non-object");
+ }
+
+ var result = [];
+
+ for (var prop in obj) {
+ if (hasOwnProperty.call(obj, prop)) {
+ result.push(prop);
+ }
+ }
+
+ if (hasDontEnumBug) {
+ for (var i = 0; i < dontEnumsLength; i++) {
+ if (hasOwnProperty.call(obj, dontEnums[i])) {
+ result.push(dontEnums[i]);
+ }
+ }
+ }
+ return result;
+ };
+ })();
+ }
+
+ // TODO: use defineProperty to make these non-enumerable
+
+ // Array extras
+ if (!Array.prototype.indexOf) {
+ Array.prototype.indexOf = function (needle, i) {
+ var len;
+
+ if (i === undefined) {
+ i = 0;
+ }
+
+ if (i < 0) {
+ i += this.length;
+ }
+
+ if (i < 0) {
+ i = 0;
+ }
+
+ for (len = this.length; i < len; i++) {
+ if (this.hasOwnProperty(i) && this[i] === needle) {
+ return i;
+ }
+ }
+
+ return -1;
+ };
+ }
+
+ if (!Array.prototype.forEach) {
+ Array.prototype.forEach = function (callback, context) {
+ var i, len;
+
+ for (i = 0, len = this.length; i < len; i += 1) {
+ if (this.hasOwnProperty(i)) {
+ callback.call(context, this[i], i, this);
+ }
+ }
+ };
+ }
+
+ if (!Array.prototype.map) {
+ Array.prototype.map = function (mapper, context) {
+ var array = this,
+ i,
+ len,
+ mapped = [],
+ isActuallyString;
+
+ // incredibly, if you do something like
+ // Array.prototype.map.call( someString, iterator )
+ // then `this` will become an instance of String in IE8.
+ // And in IE8, you then can't do string[i]. Facepalm.
+ if (array instanceof String) {
+ array = array.toString();
+ isActuallyString = true;
+ }
+
+ for (i = 0, len = array.length; i < len; i += 1) {
+ if (array.hasOwnProperty(i) || isActuallyString) {
+ mapped[i] = mapper.call(context, array[i], i, array);
+ }
+ }
+
+ return mapped;
+ };
+ }
+
+ if (typeof Array.prototype.reduce !== "function") {
+ Array.prototype.reduce = function (callback, opt_initialValue) {
+ var i, value, len, valueIsSet;
+
+ if ("function" !== typeof callback) {
+ throw new TypeError(callback + " is not a function");
+ }
+
+ len = this.length;
+ valueIsSet = false;
+
+ if (arguments.length > 1) {
+ value = opt_initialValue;
+ valueIsSet = true;
+ }
+
+ for (i = 0; i < len; i += 1) {
+ if (this.hasOwnProperty(i)) {
+ if (valueIsSet) {
+ value = callback(value, this[i], i, this);
+ }
+ } else {
+ value = this[i];
+ valueIsSet = true;
+ }
+ }
+
+ if (!valueIsSet) {
+ throw new TypeError("Reduce of empty array with no initial value");
+ }
+
+ return value;
+ };
+ }
+
+ if (!Array.prototype.filter) {
+ Array.prototype.filter = function (filter, context) {
+ var i,
+ len,
+ filtered = [];
+
+ for (i = 0, len = this.length; i < len; i += 1) {
+ if (this.hasOwnProperty(i) && filter.call(context, this[i], i, this)) {
+ filtered[filtered.length] = this[i];
+ }
+ }
+
+ return filtered;
+ };
+ }
+
+ if (!Array.prototype.every) {
+ Array.prototype.every = function (iterator, context) {
+ var t, len, i;
+
+ if (this == null) {
+ throw new TypeError();
+ }
+
+ t = Object(this);
+ len = t.length >>> 0;
+
+ if (typeof iterator !== "function") {
+ throw new TypeError();
+ }
+
+ for (i = 0; i < len; i += 1) {
+ if (i in t && !iterator.call(context, t[i], i, t)) {
+ return false;
+ }
+ }
+
+ return true;
+ };
+ }
+
+ /*
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find
+ if (!Array.prototype.find) {
+ Array.prototype.find = function(predicate) {
+ if (this == null) {
+ throw new TypeError('Array.prototype.find called on null or undefined');
+ }
+ if (typeof predicate !== 'function') {
+ throw new TypeError('predicate must be a function');
+ }
+ var list = Object(this);
+ var length = list.length >>> 0;
+ var thisArg = arguments[1];
+ var value;
+ for (var i = 0; i < length; i++) {
+ if (i in list) {
+ value = list[i];
+ if (predicate.call(thisArg, value, i, list)) {
+ return value;
+ }
+ }
+ }
+ return undefined;
+ }
+ }
+ */
+
+ if (typeof Function.prototype.bind !== "function") {
+ Function.prototype.bind = function (context) {
+ var args,
+ fn,
+ Empty,
+ bound,
+ slice = [].slice;
+
+ if (typeof this !== "function") {
+ throw new TypeError("Function.prototype.bind called on non-function");
+ }
+
+ args = slice.call(arguments, 1);
+ fn = this;
+ Empty = function () {};
+
+ bound = function () {
+ var ctx = this instanceof Empty && context ? this : context;
+ return fn.apply(ctx, args.concat(slice.call(arguments)));
+ };
+
+ Empty.prototype = this.prototype;
+ bound.prototype = new Empty();
+
+ return bound;
+ };
+ }
+
+ // https://gist.github.com/Rich-Harris/6010282 via https://gist.github.com/jonathantneal/2869388
+ // addEventListener polyfill IE6+
+ if (!win.addEventListener) {
+ (function (win, doc) {
+ var Event, addEventListener, removeEventListener, head, style, origCreateElement;
+
+ // because sometimes inquiring minds want to know
+ win.appearsToBeIELessEqual8 = true;
+
+ Event = function (e, element) {
+ var property,
+ instance = this;
+
+ for (property in e) {
+ instance[property] = e[property];
+ }
+
+ instance.currentTarget = element;
+ instance.target = e.srcElement || element;
+ instance.timeStamp = +new Date();
+
+ instance.preventDefault = function () {
+ e.returnValue = false;
+ };
+
+ instance.stopPropagation = function () {
+ e.cancelBubble = true;
+ };
+ };
+
+ addEventListener = function (type, listener) {
+ var element = this,
+ listeners,
+ i;
+
+ listeners = element.listeners || (element.listeners = []);
+ i = listeners.length;
+
+ listeners[i] = [listener, function (e) {
+ listener.call(element, new Event(e, element));
+ }];
+
+ element.attachEvent("on" + type, listeners[i][1]);
+ };
+
+ removeEventListener = function (type, listener) {
+ var element = this,
+ listeners,
+ i;
+
+ if (!element.listeners) {
+ return;
+ }
+
+ listeners = element.listeners;
+ i = listeners.length;
+
+ while (i--) {
+ if (listeners[i][0] === listener) {
+ element.detachEvent("on" + type, listeners[i][1]);
+ }
+ }
+ };
+
+ win.addEventListener = doc.addEventListener = addEventListener;
+ win.removeEventListener = doc.removeEventListener = removeEventListener;
+
+ if ("Element" in win) {
+ win.Element.prototype.addEventListener = addEventListener;
+ win.Element.prototype.removeEventListener = removeEventListener;
+ } else {
+ // First, intercept any calls to document.createElement - this is necessary
+ // because the CSS hack (see below) doesn't come into play until after a
+ // node is added to the DOM, which is too late for a lot of Ractive setup work
+ origCreateElement = doc.createElement;
+
+ doc.createElement = function (tagName) {
+ var el = origCreateElement(tagName);
+ el.addEventListener = addEventListener;
+ el.removeEventListener = removeEventListener;
+ return el;
+ };
+
+ // Then, mop up any additional elements that weren't created via
+ // document.createElement (i.e. with innerHTML).
+ head = doc.getElementsByTagName("head")[0];
+ style = doc.createElement("style");
+
+ head.insertBefore(style, head.firstChild);
+
+ //style.styleSheet.cssText = '*{-ms-event-prototype:expression(!this.addEventListener&&(this.addEventListener=addEventListener)&&(this.removeEventListener=removeEventListener))}';
+ }
+ })(win, doc);
+ }
+
+ // The getComputedStyle polyfill interacts badly with jQuery, so we don't attach
+ // it to window. Instead, we export it for other modules to use as needed
+
+ // https://github.com/jonathantneal/Polyfills-for-IE8/blob/master/getComputedStyle.js
+ if (!win.getComputedStyle) {
+ exportedShims.getComputedStyle = (function () {
+ var borderSizes = {};
+
+ function getPixelSize(element, style, property, fontSize) {
+ var sizeWithSuffix = style[property],
+ size = parseFloat(sizeWithSuffix),
+ suffix = sizeWithSuffix.split(/\d/)[0],
+ rootSize;
+
+ if (isNaN(size)) {
+ if (/^thin|medium|thick$/.test(sizeWithSuffix)) {
+ size = getBorderPixelSize(sizeWithSuffix);
+ suffix = "";
+ } else {}
+ }
+
+ fontSize = fontSize != null ? fontSize : /%|em/.test(suffix) && element.parentElement ? getPixelSize(element.parentElement, element.parentElement.currentStyle, "fontSize", null) : 16;
+ rootSize = property == "fontSize" ? fontSize : /width/i.test(property) ? element.clientWidth : element.clientHeight;
+
+ return suffix == "em" ? size * fontSize : suffix == "in" ? size * 96 : suffix == "pt" ? size * 96 / 72 : suffix == "%" ? size / 100 * rootSize : size;
+ }
+
+ function getBorderPixelSize(size) {
+ var div, bcr;
+
+ // `thin`, `medium` and `thick` vary between browsers. (Don't ever use them.)
+ if (!borderSizes[size]) {
+ div = document.createElement("div");
+ div.style.display = "block";
+ div.style.position = "fixed";
+ div.style.width = div.style.height = "0";
+ div.style.borderRight = size + " solid black";
+
+ document.getElementsByTagName("body")[0].appendChild(div);
+ bcr = div.getBoundingClientRect();
+
+ borderSizes[size] = bcr.right - bcr.left;
+ }
+
+ return borderSizes[size];
+ }
+
+ function setShortStyleProperty(style, property) {
+ var borderSuffix = property == "border" ? "Width" : "",
+ t = property + "Top" + borderSuffix,
+ r = property + "Right" + borderSuffix,
+ b = property + "Bottom" + borderSuffix,
+ l = property + "Left" + borderSuffix;
+
+ style[property] = (style[t] == style[r] == style[b] == style[l] ? [style[t]] : style[t] == style[b] && style[l] == style[r] ? [style[t], style[r]] : style[l] == style[r] ? [style[t], style[r], style[b]] : [style[t], style[r], style[b], style[l]]).join(" ");
+ }
+
+ var normalProps = {
+ fontWeight: 400,
+ lineHeight: 1.2, // actually varies depending on font-family, but is generally close enough...
+ letterSpacing: 0
+ };
+
+ function CSSStyleDeclaration(element) {
+ var currentStyle, style, fontSize, property;
+
+ currentStyle = element.currentStyle;
+ style = this;
+ fontSize = getPixelSize(element, currentStyle, "fontSize", null);
+
+ // TODO tidy this up, test it, send PR to jonathantneal!
+ for (property in currentStyle) {
+ if (currentStyle[property] === "normal" && normalProps.hasOwnProperty(property)) {
+ style[property] = normalProps[property];
+ } else if (/width|height|margin.|padding.|border.+W/.test(property)) {
+ if (currentStyle[property] === "auto") {
+ if (/^width|height/.test(property)) {
+ // just use clientWidth/clientHeight...
+ style[property] = (property === "width" ? element.clientWidth : element.clientHeight) + "px";
+ } else if (/(?:padding)?Top|Bottom$/.test(property)) {
+ style[property] = "0px";
+ }
+ } else {
+ style[property] = getPixelSize(element, currentStyle, property, fontSize) + "px";
+ }
+ } else if (property === "styleFloat") {
+ style.float = currentStyle[property];
+ } else {
+ style[property] = currentStyle[property];
+ }
+ }
+
+ setShortStyleProperty(style, "margin");
+ setShortStyleProperty(style, "padding");
+ setShortStyleProperty(style, "border");
+
+ style.fontSize = fontSize + "px";
+
+ return style;
+ }
+
+ CSSStyleDeclaration.prototype = {
+ constructor: CSSStyleDeclaration,
+ getPropertyPriority: noop,
+ getPropertyValue: function (prop) {
+ return this[prop] || "";
+ },
+ item: noop,
+ removeProperty: noop,
+ setProperty: noop,
+ getPropertyCSSValue: noop
+ };
+
+ function getComputedStyle(element) {
+ return new CSSStyleDeclaration(element);
+ }
+
+ return getComputedStyle;
+ })();
+ }
+ }
+
+ var legacy = exportedShims;
+
+ // TODO...
+
+ var create, defineProperty, defineProperties;
+
+ try {
+ Object.defineProperty({}, "test", { value: 0 });
+
+ if (isClient) {
+ Object.defineProperty(document.createElement("div"), "test", { value: 0 });
+ }
+
+ defineProperty = Object.defineProperty;
+ } catch (err) {
+ // Object.defineProperty doesn't exist, or we're in IE8 where you can
+ // only use it with DOM objects (what were you smoking, MSFT?)
+ defineProperty = function (obj, prop, desc) {
+ obj[prop] = desc.value;
+ };
+ }
+
+ try {
+ try {
+ Object.defineProperties({}, { test: { value: 0 } });
+ } catch (err) {
+ // TODO how do we account for this? noMagic = true;
+ throw err;
+ }
+
+ if (isClient) {
+ Object.defineProperties(createElement("div"), { test: { value: 0 } });
+ }
+
+ defineProperties = Object.defineProperties;
+ } catch (err) {
+ defineProperties = function (obj, props) {
+ var prop;
+
+ for (prop in props) {
+ if (props.hasOwnProperty(prop)) {
+ defineProperty(obj, prop, props[prop]);
+ }
+ }
+ };
+ }
+
+ try {
+ Object.create(null);
+
+ create = Object.create;
+ } catch (err) {
+ // sigh
+ create = (function () {
+ var F = function () {};
+
+ return function (proto, props) {
+ var obj;
+
+ if (proto === null) {
+ return {};
+ }
+
+ F.prototype = proto;
+ obj = new F();
+
+ if (props) {
+ Object.defineProperties(obj, props);
+ }
+
+ return obj;
+ };
+ })();
+ }
+
+ function utils_object__extend(target) {
+ for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ sources[_key - 1] = arguments[_key];
+ }
+
+ var prop, source;
+
+ while (source = sources.shift()) {
+ for (prop in source) {
+ if (hasOwn.call(source, prop)) {
+ target[prop] = source[prop];
+ }
+ }
+ }
+
+ return target;
+ }
+
+ function fillGaps(target) {
+ for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ sources[_key - 1] = arguments[_key];
+ }
+
+ sources.forEach(function (s) {
+ for (var key in s) {
+ if (s.hasOwnProperty(key) && !(key in target)) {
+ target[key] = s[key];
+ }
+ }
+ });
+
+ return target;
+ }
+
+ var hasOwn = Object.prototype.hasOwnProperty;
+
+ // thanks, http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/
+ var is__toString = Object.prototype.toString,
+ arrayLikePattern = /^\[object (?:Array|FileList)\]$/;
+ function isArray(thing) {
+ return is__toString.call(thing) === "[object Array]";
+ }
+
+ function isArrayLike(obj) {
+ return arrayLikePattern.test(is__toString.call(obj));
+ }
+
+ function isEqual(a, b) {
+ if (a === null && b === null) {
+ return true;
+ }
+
+ if (typeof a === "object" || typeof b === "object") {
+ return false;
+ }
+
+ return a === b;
+ }
+
+ function is__isNumeric(thing) {
+ return !isNaN(parseFloat(thing)) && isFinite(thing);
+ }
+
+ function isObject(thing) {
+ return thing && is__toString.call(thing) === "[object Object]";
+ }
+
+ /* global console */
+ var alreadyWarned = {},
+ log,
+ printWarning,
+ welcome;
+
+ if (hasConsole) {
+ (function () {
+ var welcomeIntro = ["%cRactive.js %c0.7.3 %cin debug mode, %cmore...", "color: rgb(114, 157, 52); font-weight: normal;", "color: rgb(85, 85, 85); font-weight: normal;", "color: rgb(85, 85, 85); font-weight: normal;", "color: rgb(82, 140, 224); font-weight: normal; text-decoration: underline;"];
+ var welcomeMessage = "You're running Ractive 0.7.3 in debug mode - messages will be printed to the console to help you fix problems and optimise your application.\n\nTo disable debug mode, add this line at the start of your app:\n Ractive.DEBUG = false;\n\nTo disable debug mode when your app is minified, add this snippet:\n Ractive.DEBUG = /unminified/.test(function(){/*unminified*/});\n\nGet help and support:\n http://docs.ractivejs.org\n http://stackoverflow.com/questions/tagged/ractivejs\n http://groups.google.com/forum/#!forum/ractive-js\n http://twitter.com/ractivejs\n\nFound a bug? Raise an issue:\n https://github.com/ractivejs/ractive/issues\n\n";
+
+ welcome = function () {
+ var hasGroup = !!console.groupCollapsed;
+ console[hasGroup ? "groupCollapsed" : "log"].apply(console, welcomeIntro);
+ console.log(welcomeMessage);
+ if (hasGroup) {
+ console.groupEnd(welcomeIntro);
+ }
+
+ welcome = noop;
+ };
+
+ printWarning = function (message, args) {
+ welcome();
+
+ // extract information about the instance this message pertains to, if applicable
+ if (typeof args[args.length - 1] === "object") {
+ var options = args.pop();
+ var ractive = options ? options.ractive : null;
+
+ if (ractive) {
+ // if this is an instance of a component that we know the name of, add
+ // it to the message
+ var _name = undefined;
+ if (ractive.component && (_name = ractive.component.name)) {
+ message = "<" + _name + "> " + message;
+ }
+
+ var node = undefined;
+ if (node = options.node || ractive.fragment && ractive.fragment.rendered && ractive.find("*")) {
+ args.push(node);
+ }
+ }
+ }
+
+ console.warn.apply(console, ["%cRactive.js: %c" + message, "color: rgb(114, 157, 52);", "color: rgb(85, 85, 85);"].concat(args));
+ };
+
+ log = function () {
+ console.log.apply(console, arguments);
+ };
+ })();
+ } else {
+ printWarning = log = welcome = noop;
+ }
+
+ function format(message, args) {
+ return message.replace(/%s/g, function () {
+ return args.shift();
+ });
+ }
+
+ function fatal(message) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ message = format(message, args);
+ throw new Error(message);
+ }
+
+ function logIfDebug() {
+ if (_Ractive.DEBUG) {
+ log.apply(null, arguments);
+ }
+ }
+
+ function warn(message) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ message = format(message, args);
+ printWarning(message, args);
+ }
+
+ function warnOnce(message) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ message = format(message, args);
+
+ if (alreadyWarned[message]) {
+ return;
+ }
+
+ alreadyWarned[message] = true;
+ printWarning(message, args);
+ }
+
+ function warnIfDebug() {
+ if (_Ractive.DEBUG) {
+ warn.apply(null, arguments);
+ }
+ }
+
+ function warnOnceIfDebug() {
+ if (_Ractive.DEBUG) {
+ warnOnce.apply(null, arguments);
+ }
+ }
+
+ // Error messages that are used (or could be) in multiple places
+ var badArguments = "Bad arguments";
+ var noRegistryFunctionReturn = "A function was specified for \"%s\" %s, but no %s was returned";
+ var missingPlugin = function (name, type) {
+ return "Missing \"" + name + "\" " + type + " plugin. You may need to download a plugin via http://docs.ractivejs.org/latest/plugins#" + type + "s";
+ };
+
+ function findInViewHierarchy(registryName, ractive, name) {
+ var instance = findInstance(registryName, ractive, name);
+ return instance ? instance[registryName][name] : null;
+ }
+
+ function findInstance(registryName, ractive, name) {
+ while (ractive) {
+ if (name in ractive[registryName]) {
+ return ractive;
+ }
+
+ if (ractive.isolated) {
+ return null;
+ }
+
+ ractive = ractive.parent;
+ }
+ }
+
+ var interpolate = function (from, to, ractive, type) {
+ if (from === to) {
+ return snap(to);
+ }
+
+ if (type) {
+
+ var interpol = findInViewHierarchy("interpolators", ractive, type);
+ if (interpol) {
+ return interpol(from, to) || snap(to);
+ }
+
+ fatal(missingPlugin(type, "interpolator"));
+ }
+
+ return static_interpolators.number(from, to) || static_interpolators.array(from, to) || static_interpolators.object(from, to) || snap(to);
+ };
+
+ var shared_interpolate = interpolate;
+
+ function snap(to) {
+ return function () {
+ return to;
+ };
+ }
+
+ var interpolators = {
+ number: function (from, to) {
+ var delta;
+
+ if (!is__isNumeric(from) || !is__isNumeric(to)) {
+ return null;
+ }
+
+ from = +from;
+ to = +to;
+
+ delta = to - from;
+
+ if (!delta) {
+ return function () {
+ return from;
+ };
+ }
+
+ return function (t) {
+ return from + t * delta;
+ };
+ },
+
+ array: function (from, to) {
+ var intermediate, interpolators, len, i;
+
+ if (!isArray(from) || !isArray(to)) {
+ return null;
+ }
+
+ intermediate = [];
+ interpolators = [];
+
+ i = len = Math.min(from.length, to.length);
+ while (i--) {
+ interpolators[i] = shared_interpolate(from[i], to[i]);
+ }
+
+ // surplus values - don't interpolate, but don't exclude them either
+ for (i = len; i < from.length; i += 1) {
+ intermediate[i] = from[i];
+ }
+
+ for (i = len; i < to.length; i += 1) {
+ intermediate[i] = to[i];
+ }
+
+ return function (t) {
+ var i = len;
+
+ while (i--) {
+ intermediate[i] = interpolators[i](t);
+ }
+
+ return intermediate;
+ };
+ },
+
+ object: function (from, to) {
+ var properties, len, interpolators, intermediate, prop;
+
+ if (!isObject(from) || !isObject(to)) {
+ return null;
+ }
+
+ properties = [];
+ intermediate = {};
+ interpolators = {};
+
+ for (prop in from) {
+ if (hasOwn.call(from, prop)) {
+ if (hasOwn.call(to, prop)) {
+ properties.push(prop);
+ interpolators[prop] = shared_interpolate(from[prop], to[prop]);
+ } else {
+ intermediate[prop] = from[prop];
+ }
+ }
+ }
+
+ for (prop in to) {
+ if (hasOwn.call(to, prop) && !hasOwn.call(from, prop)) {
+ intermediate[prop] = to[prop];
+ }
+ }
+
+ len = properties.length;
+
+ return function (t) {
+ var i = len,
+ prop;
+
+ while (i--) {
+ prop = properties[i];
+
+ intermediate[prop] = interpolators[prop](t);
+ }
+
+ return intermediate;
+ };
+ }
+ };
+
+ var static_interpolators = interpolators;
+
+ // This function takes a keypath such as 'foo.bar.baz', and returns
+ // all the variants of that keypath that include a wildcard in place
+ // of a key, such as 'foo.bar.*', 'foo.*.baz', 'foo.*.*' and so on.
+ // These are then checked against the dependants map (ractive.viewmodel.depsMap)
+ // to see if any pattern observers are downstream of one or more of
+ // these wildcard keypaths (e.g. 'foo.bar.*.status')
+ var utils_getPotentialWildcardMatches = getPotentialWildcardMatches;
+
+ var starMaps = {};
+ function getPotentialWildcardMatches(keypath) {
+ var keys, starMap, mapper, i, result, wildcardKeypath;
+
+ keys = keypath.split(".");
+ if (!(starMap = starMaps[keys.length])) {
+ starMap = getStarMap(keys.length);
+ }
+
+ result = [];
+
+ mapper = function (star, i) {
+ return star ? "*" : keys[i];
+ };
+
+ i = starMap.length;
+ while (i--) {
+ wildcardKeypath = starMap[i].map(mapper).join(".");
+
+ if (!result.hasOwnProperty(wildcardKeypath)) {
+ result.push(wildcardKeypath);
+ result[wildcardKeypath] = true;
+ }
+ }
+
+ return result;
+ }
+
+ // This function returns all the possible true/false combinations for
+ // a given number - e.g. for two, the possible combinations are
+ // [ true, true ], [ true, false ], [ false, true ], [ false, false ].
+ // It does so by getting all the binary values between 0 and e.g. 11
+ function getStarMap(num) {
+ var ones = "",
+ max,
+ binary,
+ starMap,
+ mapper,
+ i,
+ j,
+ l,
+ map;
+
+ if (!starMaps[num]) {
+ starMap = [];
+
+ while (ones.length < num) {
+ ones += 1;
+ }
+
+ max = parseInt(ones, 2);
+
+ mapper = function (digit) {
+ return digit === "1";
+ };
+
+ for (i = 0; i <= max; i += 1) {
+ binary = i.toString(2);
+ while (binary.length < num) {
+ binary = "0" + binary;
+ }
+
+ map = [];
+ l = binary.length;
+ for (j = 0; j < l; j++) {
+ map.push(mapper(binary[j]));
+ }
+ starMap[i] = map;
+ }
+
+ starMaps[num] = starMap;
+ }
+
+ return starMaps[num];
+ }
+
+ var refPattern = /\[\s*(\*|[0-9]|[1-9][0-9]+)\s*\]/g;
+ var patternPattern = /\*/;
+ var keypathCache = {};
+
+ var Keypath = function (str) {
+ var keys = str.split(".");
+
+ this.str = str;
+
+ if (str[0] === "@") {
+ this.isSpecial = true;
+ this.value = decodeKeypath(str);
+ }
+
+ this.firstKey = keys[0];
+ this.lastKey = keys.pop();
+
+ this.isPattern = patternPattern.test(str);
+
+ this.parent = str === "" ? null : getKeypath(keys.join("."));
+ this.isRoot = !str;
+ };
+
+ Keypath.prototype = {
+ equalsOrStartsWith: function (keypath) {
+ return keypath === this || this.startsWith(keypath);
+ },
+
+ join: function (str) {
+ return getKeypath(this.isRoot ? String(str) : this.str + "." + str);
+ },
+
+ replace: function (oldKeypath, newKeypath) {
+ if (this === oldKeypath) {
+ return newKeypath;
+ }
+
+ if (this.startsWith(oldKeypath)) {
+ return newKeypath === null ? newKeypath : getKeypath(this.str.replace(oldKeypath.str + ".", newKeypath.str + "."));
+ }
+ },
+
+ startsWith: function (keypath) {
+ if (!keypath) {
+ // TODO under what circumstances does this happen?
+ return false;
+ }
+
+ return keypath && this.str.substr(0, keypath.str.length + 1) === keypath.str + ".";
+ },
+
+ toString: function () {
+ throw new Error("Bad coercion");
+ },
+
+ valueOf: function () {
+ throw new Error("Bad coercion");
+ },
+
+ wildcardMatches: function () {
+ return this._wildcardMatches || (this._wildcardMatches = utils_getPotentialWildcardMatches(this.str));
+ }
+ };
+ function assignNewKeypath(target, property, oldKeypath, newKeypath) {
+ var existingKeypath = target[property];
+
+ if (existingKeypath && (existingKeypath.equalsOrStartsWith(newKeypath) || !existingKeypath.equalsOrStartsWith(oldKeypath))) {
+ return;
+ }
+
+ target[property] = existingKeypath ? existingKeypath.replace(oldKeypath, newKeypath) : newKeypath;
+ return true;
+ }
+
+ function decodeKeypath(keypath) {
+ var value = keypath.slice(2);
+
+ if (keypath[1] === "i") {
+ return is__isNumeric(value) ? +value : value;
+ } else {
+ return value;
+ }
+ }
+
+ function getKeypath(str) {
+ if (str == null) {
+ return str;
+ }
+
+ // TODO it *may* be worth having two versions of this function - one where
+ // keypathCache inherits from null, and one for IE8. Depends on how
+ // much of an overhead hasOwnProperty is - probably negligible
+ if (!keypathCache.hasOwnProperty(str)) {
+ keypathCache[str] = new Keypath(str);
+ }
+
+ return keypathCache[str];
+ }
+
+ function getMatchingKeypaths(ractive, keypath) {
+ var keys, key, matchingKeypaths;
+
+ keys = keypath.str.split(".");
+ matchingKeypaths = [rootKeypath];
+
+ while (key = keys.shift()) {
+ if (key === "*") {
+ // expand to find all valid child keypaths
+ matchingKeypaths = matchingKeypaths.reduce(expand, []);
+ } else {
+ if (matchingKeypaths[0] === rootKeypath) {
+ // first key
+ matchingKeypaths[0] = getKeypath(key);
+ } else {
+ matchingKeypaths = matchingKeypaths.map(concatenate(key));
+ }
+ }
+ }
+
+ return matchingKeypaths;
+
+ function expand(matchingKeypaths, keypath) {
+ var wrapper, value, keys;
+
+ if (keypath.isRoot) {
+ keys = [].concat(Object.keys(ractive.viewmodel.data), Object.keys(ractive.viewmodel.mappings), Object.keys(ractive.viewmodel.computations));
+ } else {
+ wrapper = ractive.viewmodel.wrapped[keypath.str];
+ value = wrapper ? wrapper.get() : ractive.viewmodel.get(keypath);
+
+ keys = value ? Object.keys(value) : null;
+ }
+
+ if (keys) {
+ keys.forEach(function (key) {
+ if (key !== "_ractive" || !isArray(value)) {
+ matchingKeypaths.push(keypath.join(key));
+ }
+ });
+ }
+
+ return matchingKeypaths;
+ }
+ }
+
+ function concatenate(key) {
+ return function (keypath) {
+ return keypath.join(key);
+ };
+ }
+ function normalise(ref) {
+ return ref ? ref.replace(refPattern, ".$1") : "";
+ }
+
+ var rootKeypath = getKeypath("");
+
+ var shared_add = add;
+ var shared_add__errorMessage = "Cannot add to a non-numeric value";
+ function add(root, keypath, d) {
+ if (typeof keypath !== "string" || !is__isNumeric(d)) {
+ throw new Error("Bad arguments");
+ }
+
+ var value = undefined,
+ changes = undefined;
+
+ if (/\*/.test(keypath)) {
+ changes = {};
+
+ getMatchingKeypaths(root, getKeypath(normalise(keypath))).forEach(function (keypath) {
+ var value = root.viewmodel.get(keypath);
+
+ if (!is__isNumeric(value)) {
+ throw new Error(shared_add__errorMessage);
+ }
+
+ changes[keypath.str] = value + d;
+ });
+
+ return root.set(changes);
+ }
+
+ value = root.get(keypath);
+
+ if (!is__isNumeric(value)) {
+ throw new Error(shared_add__errorMessage);
+ }
+
+ return root.set(keypath, +value + d);
+ }
+
+ var prototype_add = Ractive$add;
+ function Ractive$add(keypath, d) {
+ return shared_add(this, keypath, d === undefined ? 1 : +d);
+ }
+
+ var requestAnimationFrame;
+
+ // If window doesn't exist, we don't need requestAnimationFrame
+ if (typeof window === "undefined") {
+ requestAnimationFrame = null;
+ } else {
+ // https://gist.github.com/paulirish/1579671
+ (function (vendors, lastTime, window) {
+
+ var x, setTimeout;
+
+ if (window.requestAnimationFrame) {
+ return;
+ }
+
+ for (x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
+ window.requestAnimationFrame = window[vendors[x] + "RequestAnimationFrame"];
+ }
+
+ if (!window.requestAnimationFrame) {
+ setTimeout = window.setTimeout;
+
+ window.requestAnimationFrame = function (callback) {
+ var currTime, timeToCall, id;
+
+ currTime = Date.now();
+ timeToCall = Math.max(0, 16 - (currTime - lastTime));
+ id = setTimeout(function () {
+ callback(currTime + timeToCall);
+ }, timeToCall);
+
+ lastTime = currTime + timeToCall;
+ return id;
+ };
+ }
+ })(vendors, 0, window);
+
+ requestAnimationFrame = window.requestAnimationFrame;
+ }
+
+ var rAF = requestAnimationFrame;
+
+ var getTime;
+
+ if (typeof window !== "undefined" && window.performance && typeof window.performance.now === "function") {
+ getTime = function () {
+ return window.performance.now();
+ };
+ } else {
+ getTime = function () {
+ return Date.now();
+ };
+ }
+
+ var utils_getTime = getTime;
+
+ var deprecations = {
+ construct: {
+ deprecated: "beforeInit",
+ replacement: "onconstruct"
+ },
+ render: {
+ deprecated: "init",
+ message: "The \"init\" method has been deprecated " + "and will likely be removed in a future release. " + "You can either use the \"oninit\" method which will fire " + "only once prior to, and regardless of, any eventual ractive " + "instance being rendered, or if you need to access the " + "rendered DOM, use \"onrender\" instead. " + "See http://docs.ractivejs.org/latest/migrating for more information."
+ },
+ complete: {
+ deprecated: "complete",
+ replacement: "oncomplete"
+ }
+ };
+
+ function Hook(event) {
+ this.event = event;
+ this.method = "on" + event;
+ this.deprecate = deprecations[event];
+ }
+
+ Hook.prototype.fire = function (ractive, arg) {
+ function call(method) {
+ if (ractive[method]) {
+ arg ? ractive[method](arg) : ractive[method]();
+ return true;
+ }
+ }
+
+ call(this.method);
+
+ if (!ractive[this.method] && this.deprecate && call(this.deprecate.deprecated)) {
+ if (this.deprecate.message) {
+ warnIfDebug(this.deprecate.message);
+ } else {
+ warnIfDebug("The method \"%s\" has been deprecated in favor of \"%s\" and will likely be removed in a future release. See http://docs.ractivejs.org/latest/migrating for more information.", this.deprecate.deprecated, this.deprecate.replacement);
+ }
+ }
+
+ arg ? ractive.fire(this.event, arg) : ractive.fire(this.event);
+ };
+
+ var hooks_Hook = Hook;
+
+ function addToArray(array, value) {
+ var index = array.indexOf(value);
+
+ if (index === -1) {
+ array.push(value);
+ }
+ }
+
+ function arrayContains(array, value) {
+ for (var i = 0, c = array.length; i < c; i++) {
+ if (array[i] == value) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ function arrayContentsMatch(a, b) {
+ var i;
+
+ if (!isArray(a) || !isArray(b)) {
+ return false;
+ }
+
+ if (a.length !== b.length) {
+ return false;
+ }
+
+ i = a.length;
+ while (i--) {
+ if (a[i] !== b[i]) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ function ensureArray(x) {
+ if (typeof x === "string") {
+ return [x];
+ }
+
+ if (x === undefined) {
+ return [];
+ }
+
+ return x;
+ }
+
+ function lastItem(array) {
+ return array[array.length - 1];
+ }
+
+ function removeFromArray(array, member) {
+ var index = array.indexOf(member);
+
+ if (index !== -1) {
+ array.splice(index, 1);
+ }
+ }
+
+ function toArray(arrayLike) {
+ var array = [],
+ i = arrayLike.length;
+ while (i--) {
+ array[i] = arrayLike[i];
+ }
+
+ return array;
+ }
+
+ var _Promise,
+ PENDING = {},
+ FULFILLED = {},
+ REJECTED = {};
+
+ if (typeof Promise === "function") {
+ // use native Promise
+ _Promise = Promise;
+ } else {
+ _Promise = function (callback) {
+ var fulfilledHandlers = [],
+ rejectedHandlers = [],
+ state = PENDING,
+ result,
+ dispatchHandlers,
+ makeResolver,
+ fulfil,
+ reject,
+ promise;
+
+ makeResolver = function (newState) {
+ return function (value) {
+ if (state !== PENDING) {
+ return;
+ }
+
+ result = value;
+ state = newState;
+
+ dispatchHandlers = makeDispatcher(state === FULFILLED ? fulfilledHandlers : rejectedHandlers, result);
+
+ // dispatch onFulfilled and onRejected handlers asynchronously
+ wait(dispatchHandlers);
+ };
+ };
+
+ fulfil = makeResolver(FULFILLED);
+ reject = makeResolver(REJECTED);
+
+ try {
+ callback(fulfil, reject);
+ } catch (err) {
+ reject(err);
+ }
+
+ promise = {
+ // `then()` returns a Promise - 2.2.7
+ then: function (onFulfilled, onRejected) {
+ var promise2 = new _Promise(function (fulfil, reject) {
+
+ var processResolutionHandler = function (handler, handlers, forward) {
+
+ // 2.2.1.1
+ if (typeof handler === "function") {
+ handlers.push(function (p1result) {
+ var x;
+
+ try {
+ x = handler(p1result);
+ utils_Promise__resolve(promise2, x, fulfil, reject);
+ } catch (err) {
+ reject(err);
+ }
+ });
+ } else {
+ // Forward the result of promise1 to promise2, if resolution handlers
+ // are not given
+ handlers.push(forward);
+ }
+ };
+
+ // 2.2
+ processResolutionHandler(onFulfilled, fulfilledHandlers, fulfil);
+ processResolutionHandler(onRejected, rejectedHandlers, reject);
+
+ if (state !== PENDING) {
+ // If the promise has resolved already, dispatch the appropriate handlers asynchronously
+ wait(dispatchHandlers);
+ }
+ });
+
+ return promise2;
+ }
+ };
+
+ promise["catch"] = function (onRejected) {
+ return this.then(null, onRejected);
+ };
+
+ return promise;
+ };
+
+ _Promise.all = function (promises) {
+ return new _Promise(function (fulfil, reject) {
+ var result = [],
+ pending,
+ i,
+ processPromise;
+
+ if (!promises.length) {
+ fulfil(result);
+ return;
+ }
+
+ processPromise = function (promise, i) {
+ if (promise && typeof promise.then === "function") {
+ promise.then(function (value) {
+ result[i] = value;
+ --pending || fulfil(result);
+ }, reject);
+ } else {
+ result[i] = promise;
+ --pending || fulfil(result);
+ }
+ };
+
+ pending = i = promises.length;
+ while (i--) {
+ processPromise(promises[i], i);
+ }
+ });
+ };
+
+ _Promise.resolve = function (value) {
+ return new _Promise(function (fulfil) {
+ fulfil(value);
+ });
+ };
+
+ _Promise.reject = function (reason) {
+ return new _Promise(function (fulfil, reject) {
+ reject(reason);
+ });
+ };
+ }
+
+ var utils_Promise = _Promise;
+
+ // TODO use MutationObservers or something to simulate setImmediate
+ function wait(callback) {
+ setTimeout(callback, 0);
+ }
+
+ function makeDispatcher(handlers, result) {
+ return function () {
+ var handler;
+
+ while (handler = handlers.shift()) {
+ handler(result);
+ }
+ };
+ }
+
+ function utils_Promise__resolve(promise, x, fulfil, reject) {
+ // Promise Resolution Procedure
+ var then;
+
+ // 2.3.1
+ if (x === promise) {
+ throw new TypeError("A promise's fulfillment handler cannot return the same promise");
+ }
+
+ // 2.3.2
+ if (x instanceof _Promise) {
+ x.then(fulfil, reject);
+ }
+
+ // 2.3.3
+ else if (x && (typeof x === "object" || typeof x === "function")) {
+ try {
+ then = x.then; // 2.3.3.1
+ } catch (e) {
+ reject(e); // 2.3.3.2
+ return;
+ }
+
+ // 2.3.3.3
+ if (typeof then === "function") {
+ var called, resolvePromise, rejectPromise;
+
+ resolvePromise = function (y) {
+ if (called) {
+ return;
+ }
+ called = true;
+ utils_Promise__resolve(promise, y, fulfil, reject);
+ };
+
+ rejectPromise = function (r) {
+ if (called) {
+ return;
+ }
+ called = true;
+ reject(r);
+ };
+
+ try {
+ then.call(x, resolvePromise, rejectPromise);
+ } catch (e) {
+ if (!called) {
+ // 2.3.3.3.4.1
+ reject(e); // 2.3.3.3.4.2
+ called = true;
+ return;
+ }
+ }
+ } else {
+ fulfil(x);
+ }
+ } else {
+ fulfil(x);
+ }
+ }
+
+ var getInnerContext = function (fragment) {
+ do {
+ if (fragment.context !== undefined) {
+ return fragment.context;
+ }
+ } while (fragment = fragment.parent);
+
+ return rootKeypath;
+ };
+
+ var shared_resolveRef = resolveRef;
+
+ function resolveRef(ractive, ref, fragment) {
+ var keypath;
+
+ ref = normalise(ref);
+
+ // If a reference begins '~/', it's a top-level reference
+ if (ref.substr(0, 2) === "~/") {
+ keypath = getKeypath(ref.substring(2));
+ createMappingIfNecessary(ractive, keypath.firstKey, fragment);
+ }
+
+ // If a reference begins with '.', it's either a restricted reference or
+ // an ancestor reference...
+ else if (ref[0] === ".") {
+ keypath = resolveAncestorRef(getInnerContext(fragment), ref);
+
+ if (keypath) {
+ createMappingIfNecessary(ractive, keypath.firstKey, fragment);
+ }
+ }
+
+ // ...otherwise we need to figure out the keypath based on context
+ else {
+ keypath = resolveAmbiguousReference(ractive, getKeypath(ref), fragment);
+ }
+
+ return keypath;
+ }
+
+ function resolveAncestorRef(baseContext, ref) {
+ var contextKeys;
+
+ // TODO...
+ if (baseContext != undefined && typeof baseContext !== "string") {
+ baseContext = baseContext.str;
+ }
+
+ // {{.}} means 'current context'
+ if (ref === ".") return getKeypath(baseContext);
+
+ contextKeys = baseContext ? baseContext.split(".") : [];
+
+ // ancestor references (starting "../") go up the tree
+ if (ref.substr(0, 3) === "../") {
+ while (ref.substr(0, 3) === "../") {
+ if (!contextKeys.length) {
+ throw new Error("Could not resolve reference - too many \"../\" prefixes");
+ }
+
+ contextKeys.pop();
+ ref = ref.substring(3);
+ }
+
+ contextKeys.push(ref);
+ return getKeypath(contextKeys.join("."));
+ }
+
+ // not an ancestor reference - must be a restricted reference (prepended with "." or "./")
+ if (!baseContext) {
+ return getKeypath(ref.replace(/^\.\/?/, ""));
+ }
+
+ return getKeypath(baseContext + ref.replace(/^\.\//, "."));
+ }
+
+ function resolveAmbiguousReference(ractive, ref, fragment, isParentLookup) {
+ var context, key, parentValue, hasContextChain, parentKeypath;
+
+ if (ref.isRoot) {
+ return ref;
+ }
+
+ key = ref.firstKey;
+
+ while (fragment) {
+ context = fragment.context;
+ fragment = fragment.parent;
+
+ if (!context) {
+ continue;
+ }
+
+ hasContextChain = true;
+ parentValue = ractive.viewmodel.get(context);
+
+ if (parentValue && (typeof parentValue === "object" || typeof parentValue === "function") && key in parentValue) {
+ return context.join(ref.str);
+ }
+ }
+
+ // Root/computed/mapped property?
+ if (isRootProperty(ractive.viewmodel, key)) {
+ return ref;
+ }
+
+ // If this is an inline component, and it's not isolated, we
+ // can try going up the scope chain
+ if (ractive.parent && !ractive.isolated) {
+ hasContextChain = true;
+ fragment = ractive.component.parentFragment;
+
+ key = getKeypath(key);
+
+ if (parentKeypath = resolveAmbiguousReference(ractive.parent, key, fragment, true)) {
+ // We need to create an inter-component binding
+ ractive.viewmodel.map(key, {
+ origin: ractive.parent.viewmodel,
+ keypath: parentKeypath
+ });
+
+ return ref;
+ }
+ }
+
+ // If there's no context chain, and the instance is either a) isolated or
+ // b) an orphan, then we know that the keypath is identical to the reference
+ if (!isParentLookup && !hasContextChain) {
+ // the data object needs to have a property by this name,
+ // to prevent future failed lookups
+ ractive.viewmodel.set(ref, undefined);
+ return ref;
+ }
+ }
+
+ function createMappingIfNecessary(ractive, key) {
+ var parentKeypath;
+
+ if (!ractive.parent || ractive.isolated || isRootProperty(ractive.viewmodel, key)) {
+ return;
+ }
+
+ key = getKeypath(key);
+
+ if (parentKeypath = resolveAmbiguousReference(ractive.parent, key, ractive.component.parentFragment, true)) {
+ ractive.viewmodel.map(key, {
+ origin: ractive.parent.viewmodel,
+ keypath: parentKeypath
+ });
+ }
+ }
+
+ function isRootProperty(viewmodel, key) {
+ // special case for reference to root
+ return key === "" || key in viewmodel.data || key in viewmodel.computations || key in viewmodel.mappings;
+ }
+
+ function teardown(x) {
+ x.teardown();
+ }
+
+ function methodCallers__unbind(x) {
+ x.unbind();
+ }
+
+ function methodCallers__unrender(x) {
+ x.unrender();
+ }
+
+ function cancel(x) {
+ x.cancel();
+ }
+
+ var TransitionManager = function (callback, parent) {
+ this.callback = callback;
+ this.parent = parent;
+
+ this.intros = [];
+ this.outros = [];
+
+ this.children = [];
+ this.totalChildren = this.outroChildren = 0;
+
+ this.detachQueue = [];
+ this.decoratorQueue = [];
+ this.outrosComplete = false;
+
+ if (parent) {
+ parent.addChild(this);
+ }
+ };
+
+ TransitionManager.prototype = {
+ addChild: function (child) {
+ this.children.push(child);
+
+ this.totalChildren += 1;
+ this.outroChildren += 1;
+ },
+
+ decrementOutros: function () {
+ this.outroChildren -= 1;
+ check(this);
+ },
+
+ decrementTotal: function () {
+ this.totalChildren -= 1;
+ check(this);
+ },
+
+ add: function (transition) {
+ var list = transition.isIntro ? this.intros : this.outros;
+ list.push(transition);
+ },
+
+ addDecorator: function (decorator) {
+ this.decoratorQueue.push(decorator);
+ },
+
+ remove: function (transition) {
+ var list = transition.isIntro ? this.intros : this.outros;
+ removeFromArray(list, transition);
+ check(this);
+ },
+
+ init: function () {
+ this.ready = true;
+ check(this);
+ },
+
+ detachNodes: function () {
+ this.decoratorQueue.forEach(teardown);
+ this.detachQueue.forEach(detach);
+ this.children.forEach(detachNodes);
+ }
+ };
+
+ function detach(element) {
+ element.detach();
+ }
+
+ function detachNodes(tm) {
+ tm.detachNodes();
+ }
+
+ function check(tm) {
+ if (!tm.ready || tm.outros.length || tm.outroChildren) return;
+
+ // If all outros are complete, and we haven't already done this,
+ // we notify the parent if there is one, otherwise
+ // start detaching nodes
+ if (!tm.outrosComplete) {
+ if (tm.parent) {
+ tm.parent.decrementOutros(tm);
+ } else {
+ tm.detachNodes();
+ }
+
+ tm.outrosComplete = true;
+ }
+
+ // Once everything is done, we can notify parent transition
+ // manager and call the callback
+ if (!tm.intros.length && !tm.totalChildren) {
+ if (typeof tm.callback === "function") {
+ tm.callback();
+ }
+
+ if (tm.parent) {
+ tm.parent.decrementTotal();
+ }
+ }
+ }
+
+ var global_TransitionManager = TransitionManager;
+
+ var batch,
+ runloop,
+ unresolved = [],
+ changeHook = new hooks_Hook("change");
+
+ runloop = {
+ start: function (instance, returnPromise) {
+ var promise, fulfilPromise;
+
+ if (returnPromise) {
+ promise = new utils_Promise(function (f) {
+ return fulfilPromise = f;
+ });
+ }
+
+ batch = {
+ previousBatch: batch,
+ transitionManager: new global_TransitionManager(fulfilPromise, batch && batch.transitionManager),
+ views: [],
+ tasks: [],
+ ractives: [],
+ instance: instance
+ };
+
+ if (instance) {
+ batch.ractives.push(instance);
+ }
+
+ return promise;
+ },
+
+ end: function () {
+ flushChanges();
+
+ batch.transitionManager.init();
+ if (!batch.previousBatch && !!batch.instance) batch.instance.viewmodel.changes = [];
+ batch = batch.previousBatch;
+ },
+
+ addRactive: function (ractive) {
+ if (batch) {
+ addToArray(batch.ractives, ractive);
+ }
+ },
+
+ registerTransition: function (transition) {
+ transition._manager = batch.transitionManager;
+ batch.transitionManager.add(transition);
+ },
+
+ registerDecorator: function (decorator) {
+ batch.transitionManager.addDecorator(decorator);
+ },
+
+ addView: function (view) {
+ batch.views.push(view);
+ },
+
+ addUnresolved: function (thing) {
+ unresolved.push(thing);
+ },
+
+ removeUnresolved: function (thing) {
+ removeFromArray(unresolved, thing);
+ },
+
+ // synchronise node detachments with transition ends
+ detachWhenReady: function (thing) {
+ batch.transitionManager.detachQueue.push(thing);
+ },
+
+ scheduleTask: function (task, postRender) {
+ var _batch;
+
+ if (!batch) {
+ task();
+ } else {
+ _batch = batch;
+ while (postRender && _batch.previousBatch) {
+ // this can't happen until the DOM has been fully updated
+ // otherwise in some situations (with components inside elements)
+ // transitions and decorators will initialise prematurely
+ _batch = _batch.previousBatch;
+ }
+
+ _batch.tasks.push(task);
+ }
+ }
+ };
+
+ var global_runloop = runloop;
+
+ function flushChanges() {
+ var i, thing, changeHash;
+
+ while (batch.ractives.length) {
+ thing = batch.ractives.pop();
+ changeHash = thing.viewmodel.applyChanges();
+
+ if (changeHash) {
+ changeHook.fire(thing, changeHash);
+ }
+ }
+
+ attemptKeypathResolution();
+
+ // Now that changes have been fully propagated, we can update the DOM
+ // and complete other tasks
+ for (i = 0; i < batch.views.length; i += 1) {
+ batch.views[i].update();
+ }
+ batch.views.length = 0;
+
+ for (i = 0; i < batch.tasks.length; i += 1) {
+ batch.tasks[i]();
+ }
+ batch.tasks.length = 0;
+
+ // If updating the view caused some model blowback - e.g. a triple
+ // containing