diff --git a/.gitignore b/.gitignore index c824a920cd..c6148fdc97 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ #ignore misc BYOND files Thumbs.db +vchat.db +vchat.db* *.log *.int *.rsc diff --git a/.travis.yml b/.travis.yml index 7cccc5264b..fcf6fa2e39 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,16 +1,12 @@ #pretending we're C because otherwise ruby will initialize, even with "language: dm". language: c -sudo: false env: global: + - BASENAME="polaris" # $BASENAME.dmb, $BASENAME.dme, etc. - BYOND_MAJOR="513" - - BYOND_MINOR="1502" + - BYOND_MINOR="1513" - MACRO_COUNT=4 - matrix: - - TEST_DEFINE="MAP_TEST" TEST_FILE="code/_map_tests.dm" RUN="0" - - TEST_DEFINE="AWAY_MISSION_TEST" TEST_FILE="code/_away_mission_tests.dm" RUN="0" - - TEST_DEFINE="UNIT_TEST" TEST_FILE="code/_unit_tests.dm" RUN="1" cache: directories: @@ -22,30 +18,38 @@ addons: - libc6-i386 - libgcc1:i386 - libstdc++6:i386 + - libssl-dev:i386 -before_script: - - chmod +x ./install-byond.sh - - ./install-byond.sh +before_install: + - chmod -R +x ./tools/travis install: - - pip install --user PyYaml -q - - pip install --user beautifulsoup4 -q + - ./tools/travis/install_byond.sh + +before_script: + - shopt -s globstar script: - - shopt -s globstar - - (! grep 'step_[xy]' maps/**/*.dmm) - - (! grep -Pn '( |\t|;|{)tag( ?)=' maps/**/*.dmm) - - (! find nano/templates/ -type f -exec md5sum {} + | sort | uniq -D -w 32 | grep nano) - - (! grep -En "<\s*span\s+class\s*=\s*('[^'>]+|[^'>]+')\s*>" **/*.dm) - - awk -f tools/indentation.awk **/*.dm - - md5sum -c - <<< "88490b460c26947f5ec1ab1bb9fa9f17 *html/changelogs/example.yml" - - (num=`grep -E '\\\\(red|blue|green|black|b|i[^mc])' **/*.dm | wc -l`; echo "$num escapes (expecting ${MACRO_COUNT} or less)"; [ $num -le ${MACRO_COUNT} ]) - - source $HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR}/byond/bin/byondsetup - - python tools/TagMatcher/tag-matcher.py ../.. - # Run our test - - cp config/example/* config/ - - echo "#define ${TEST_DEFINE} 1" > ${TEST_FILE} - - DreamMaker polaris.dme - - if [ $RUN -eq 1 ]; then DreamDaemon polaris.dmb -invisible -trusted -core 2>&1 | tee log.txt; fi - - if [ $RUN -eq 1 ]; then grep "All Unit Tests Passed" log.txt; fi + - ./tools/travis/compile_and_run.sh +# Build-specific settings +jobs: + include: + - stage: "File Tests" #This is the odd man out, with specific installs and stuff. + name: "Validate Files" + install: #Need python for some of the tag matching stuff + - pip install --user PyYaml -q + - pip install --user beautifulsoup4 -q + script: ./tools/travis/validate_files.sh + addons: + apt: + packages: ~ # Don't need any packages for this + - stage: "Unit Tests" + env: TEST_DEFINE="UNIT_TEST" TEST_FILE="code/_unit_tests.dm" RUN="1" + name: "Compile normally (unit tests)" + - stage: "Isolation Tests" + env: TEST_DEFINE="MAP_TEST" TEST_FILE="code/_map_tests.dm" RUN="0" + name: "Compile POIs (no run)" + - env: TEST_DEFINE="AWAY_MISSION_TEST" TEST_FILE="code/_away_mission_tests.dm" RUN="0" + name: "Compile away missions (no run)" + diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index 4698c613a9..cc280d97cc 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -1,7 +1,7 @@ /obj/machinery/atmospherics/binary dir = SOUTH initialize_directions = SOUTH|NORTH - use_power = 1 + use_power = USE_POWER_IDLE var/datum/gas_mixture/air1 var/datum/gas_mixture/air2 diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index 41ba2cf705..2f276160fe 100644 --- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm @@ -20,7 +20,7 @@ level = 1 - use_power = 0 + use_power = USE_POWER_OFF idle_power_usage = 150 //internal circuitry, friction losses and stuff power_rating = 7500 //7500 W ~ 10 HP @@ -214,10 +214,10 @@ if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) return 0 if(signal.data["power"]) - use_power = text2num(signal.data["power"]) + update_use_power(text2num(signal.data["power"])) if(signal.data["power_toggle"]) - use_power = !use_power + update_use_power(!use_power) if(signal.data["direction"]) pump_direction = text2num(signal.data["direction"]) diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index 92c26fb280..191e6291ea 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -12,7 +12,7 @@ name = "pressure regulator" desc = "A one-way air valve that can be used to regulate input or output pressure, and flow rate. Does not require power." - use_power = 0 + use_power = USE_POWER_OFF var/unlocked = 0 //If 0, then the valve is locked closed, otherwise it is open(-able, it's a one-way valve so it closes if gas would flow backwards). var/target_pressure = ONE_ATMOSPHERE diff --git a/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm b/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm index a7c8fd6d38..7ef1858b2f 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm @@ -237,10 +237,9 @@ var/kin_to_el_ratio = 0.1 //How much kinetic energy will be taken from turbine and converted into electricity var/obj/machinery/atmospherics/pipeturbine/turbine -/obj/machinery/power/turbinemotor/New() - ..() - spawn(1) - updateConnection() +/obj/machinery/power/turbinemotor/Initialize() + . = ..() + updateConnection() /obj/machinery/power/turbinemotor/proc/updateConnection() turbine = null diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index b4b8187f45..e241cc944b 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -26,7 +26,7 @@ Thus, the two variables affect pump operation are set in New(): //var/max_volume_transfer = 10000 - use_power = 0 + use_power = USE_POWER_OFF idle_power_usage = 150 //internal circuitry, friction losses and stuff power_rating = 7500 //7500 W ~ 10 HP @@ -47,7 +47,7 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/binary/pump/on icon_state = "map_on" - use_power = 1 + use_power = USE_POWER_IDLE /obj/machinery/atmospherics/binary/pump/update_icon() @@ -160,12 +160,12 @@ Thus, the two variables affect pump operation are set in New(): if(signal.data["power"]) if(text2num(signal.data["power"])) - use_power = 1 + update_use_power(USE_POWER_IDLE) else - use_power = 0 + update_use_power(USE_POWER_OFF) if("power_toggle" in signal.data) - use_power = !use_power + update_use_power(!use_power) if(signal.data["set_output_pressure"]) target_pressure = between( @@ -199,7 +199,7 @@ Thus, the two variables affect pump operation are set in New(): if(..()) return 1 if(href_list["power"]) - use_power = !use_power + update_use_power(!use_power) switch(href_list["set_press"]) if ("min") diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index fa0aaf4bd0..8e82750588 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -11,7 +11,7 @@ power_rating = 15000 //15000 W ~ 20 HP /obj/machinery/atmospherics/binary/pump/high_power/on - use_power = 1 + use_power = USE_POWER_IDLE icon_state = "map_on" /obj/machinery/atmospherics/binary/pump/high_power/update_icon() diff --git a/code/ATMOSPHERICS/components/omni_devices/filter.dm b/code/ATMOSPHERICS/components/omni_devices/filter.dm index 074c6c528d..9f0862d800 100644 --- a/code/ATMOSPHERICS/components/omni_devices/filter.dm +++ b/code/ATMOSPHERICS/components/omni_devices/filter.dm @@ -11,7 +11,7 @@ var/datum/omni_port/input var/datum/omni_port/output - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 150 //internal circuitry, friction losses and stuff power_rating = 7500 //7500 W ~ 10 HP @@ -161,13 +161,13 @@ switch(href_list["command"]) if("power") if(!configuring) - use_power = !use_power + update_use_power(!use_power) else - use_power = 0 + update_use_power(USE_POWER_OFF) if("configure") configuring = !configuring if(configuring) - use_power = 0 + update_use_power(USE_POWER_OFF) //only allows config changes when in configuring mode ~otherwise you'll get weird pressure stuff going on if(configuring && !use_power) diff --git a/code/ATMOSPHERICS/components/omni_devices/mixer.dm b/code/ATMOSPHERICS/components/omni_devices/mixer.dm index 47c78427f0..0210d09e69 100644 --- a/code/ATMOSPHERICS/components/omni_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/omni_devices/mixer.dm @@ -6,7 +6,7 @@ icon_state = "map_mixer" pipe_state = "omni_mixer" - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 150 //internal circuitry, friction losses and stuff power_rating = 3700 //3700 W ~ 5 HP @@ -178,13 +178,13 @@ switch(href_list["command"]) if("power") if(!configuring) - use_power = !use_power + update_use_power(!use_power) else - use_power = 0 + update_use_power(USE_POWER_OFF) if("configure") configuring = !configuring if(configuring) - use_power = 0 + update_use_power(USE_POWER_OFF) //only allows config changes when in configuring mode ~otherwise you'll get weird pressure stuff going on if(configuring && !use_power) diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index 1a82bab1e2..92075b7440 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -5,7 +5,7 @@ name = "omni device" icon = 'icons/atmos/omni_devices.dmi' icon_state = "base" - use_power = 1 + use_power = USE_POWER_IDLE initialize_directions = 0 construction_type = /obj/item/pipe/quaternary level = 1 @@ -67,7 +67,7 @@ last_flow_rate = 0 if(error_check()) - use_power = 0 + update_use_power(USE_POWER_OFF) if((stat & (NOPOWER|BROKEN)) || !use_power) return 0 diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm index b30bc9b038..fd5033100b 100644 --- a/code/ATMOSPHERICS/components/portables_connector.dm +++ b/code/ATMOSPHERICS/components/portables_connector.dm @@ -18,7 +18,7 @@ var/datum/pipe_network/network var/on = 0 - use_power = 0 + use_power = USE_POWER_OFF level = 1 /obj/machinery/atmospherics/portables_connector/init_dir() diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index e900303e22..21e1a34d33 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -9,7 +9,7 @@ name = "Gas filter" desc = "Filters one type of gas from an input, and pushes it out the side." - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 150 //internal circuitry, friction losses and stuff power_rating = 7500 //This also doubles as a measure of how powerful the filter is, in Watts. 7500 W ~ 10 HP @@ -73,7 +73,7 @@ icon_state += use_power ? "on" : "off" else icon_state += "off" - use_power = 0 + update_use_power(USE_POWER_OFF) /obj/machinery/atmospherics/trinary/atmos_filter/process() ..() diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index 8bf3d3477c..62b4b763b8 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -8,7 +8,7 @@ name = "Gas mixer" - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 150 //internal circuitry, friction losses and stuff power_rating = 3700 //This also doubles as a measure of how powerful the mixer is, in Watts. 3700 W ~ 5 HP @@ -35,7 +35,7 @@ icon_state += use_power ? "on" : "off" else icon_state += "off" - use_power = 0 + update_use_power(USE_POWER_OFF) /obj/machinery/atmospherics/trinary/mixer/New() ..() @@ -114,7 +114,7 @@ /obj/machinery/atmospherics/trinary/mixer/Topic(href,href_list) if(..()) return 1 if(href_list["power"]) - use_power = !use_power + update_use_power(!use_power) if(href_list["set_press"]) var/max_flow_rate = min(air1.volume, air2.volume) var/new_flow_rate = input(usr,"Enter new flow rate limit (0-[max_flow_rate]L/s)","Flow Rate Control",src.set_flow_rate) as num diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index 394dbceeda..10d7403541 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -1,7 +1,7 @@ /obj/machinery/atmospherics/trinary dir = SOUTH initialize_directions = SOUTH|NORTH|WEST - use_power = 0 + use_power = USE_POWER_OFF pipe_flags = PIPING_DEFAULT_LAYER_ONLY|PIPING_ONE_PER_TURF var/mirrored = FALSE diff --git a/code/ATMOSPHERICS/components/unary/cold_sink.dm b/code/ATMOSPHERICS/components/unary/cold_sink.dm index 0fddd6d8e8..ba092489a9 100644 --- a/code/ATMOSPHERICS/components/unary/cold_sink.dm +++ b/code/ATMOSPHERICS/components/unary/cold_sink.dm @@ -8,7 +8,7 @@ icon_state = "freezer_0" density = 1 anchored = 1 - use_power = 0 + use_power = USE_POWER_OFF idle_power_usage = 5 // 5 Watts for thermostat related circuitry circuit = /obj/item/weapon/circuitboard/unary_atmos/cooler @@ -99,7 +99,7 @@ if(..()) return 1 if(href_list["toggleStatus"]) - use_power = !use_power + update_use_power(!use_power) update_icon() if(href_list["temp"]) var/amount = text2num(href_list["temp"]) diff --git a/code/ATMOSPHERICS/components/unary/heat_source.dm b/code/ATMOSPHERICS/components/unary/heat_source.dm index 7a2caa1d9d..8e4d474270 100644 --- a/code/ATMOSPHERICS/components/unary/heat_source.dm +++ b/code/ATMOSPHERICS/components/unary/heat_source.dm @@ -8,7 +8,7 @@ icon_state = "heater_0" density = 1 anchored = 1 - use_power = 0 + use_power = USE_POWER_OFF idle_power_usage = 5 //5 Watts for thermostat related circuitry circuit = /obj/item/weapon/circuitboard/unary_atmos/heater @@ -119,7 +119,7 @@ if(..()) return 1 if(href_list["toggleStatus"]) - use_power = !use_power + update_use_power(!use_power) update_icon() if(href_list["temp"]) var/amount = text2num(href_list["temp"]) diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm index 5e62fe5802..3c342c3cdb 100644 --- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm @@ -10,7 +10,7 @@ name = "air injector" desc = "Passively injects air into its surroundings. Has a valve attached to it that can control flow rate." - use_power = 0 + use_power = USE_POWER_OFF idle_power_usage = 150 //internal circuitry, friction losses and stuff power_rating = 15000 //15000 W ~ 20 HP @@ -132,10 +132,10 @@ return 0 if(signal.data["power"]) - use_power = text2num(signal.data["power"]) + update_use_power(text2num(signal.data["power"])) if(signal.data["power_toggle"]) - use_power = !use_power + update_use_power(!use_power) if(signal.data["inject"]) spawn inject() @@ -160,7 +160,7 @@ /obj/machinery/atmospherics/unary/outlet_injector/attack_hand(mob/user as mob) to_chat(user, "You toggle \the [src].") injecting = !injecting - use_power = injecting + update_use_power(injecting ? USE_POWER_IDLE : USE_POWER_OFF) update_icon() /obj/machinery/atmospherics/unary/outlet_injector/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index f30def6e07..07518019d2 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -14,7 +14,7 @@ name = "Air Vent" desc = "Has a valve and pump attached to it" - use_power = 0 + use_power = USE_POWER_OFF idle_power_usage = 150 //internal circuitry, friction losses and stuff power_rating = 7500 //7500 W ~ 10 HP @@ -50,18 +50,18 @@ var/datum/looping_sound/air_pump/soundloop /obj/machinery/atmospherics/unary/vent_pump/on - use_power = 1 + use_power = USE_POWER_IDLE icon_state = "map_vent_out" /obj/machinery/atmospherics/unary/vent_pump/siphon pump_direction = 0 /obj/machinery/atmospherics/unary/vent_pump/siphon/on - use_power = 1 + use_power = USE_POWER_IDLE icon_state = "map_vent_in" /obj/machinery/atmospherics/unary/vent_pump/siphon/on/atmos - use_power = 1 + use_power = USE_POWER_IDLE icon_state = "map_vent_in" external_pressure_bound = 0 external_pressure_bound_default = 0 @@ -173,7 +173,7 @@ return 1 if (!node) - use_power = 0 + update_use_power(USE_POWER_OFF) if(!can_pump()) return 0 @@ -295,10 +295,10 @@ pump_direction = 1 if(signal.data["power"] != null) - use_power = text2num(signal.data["power"]) + update_use_power(text2num(signal.data["power"])) if(signal.data["power_toggle"] != null) - use_power = !use_power + update_use_power(!use_power) if(signal.data["checks"] != null) if (signal.data["checks"] == "default") diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 34897b66ef..6e3f9ef042 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -5,7 +5,7 @@ name = "Air Scrubber" desc = "Has a valve and pump attached to it" - use_power = 0 + use_power = USE_POWER_OFF idle_power_usage = 150 //internal circuitry, friction losses and stuff power_rating = 7500 //7500 W ~ 10 HP @@ -29,7 +29,7 @@ var/radio_filter_in /obj/machinery/atmospherics/unary/vent_scrubber/on - use_power = 1 + use_power = USE_POWER_IDLE icon_state = "map_scrubber_on" /obj/machinery/atmospherics/unary/vent_scrubber/New() @@ -135,7 +135,7 @@ return 1 if (!node) - use_power = 0 + update_use_power(USE_POWER_OFF) //broadcast_status() if(!use_power || (stat & (NOPOWER|BROKEN))) return 0 @@ -180,21 +180,21 @@ return 0 if(signal.data["power"] != null) - use_power = text2num(signal.data["power"]) + update_use_power(text2num(signal.data["power"])) if(signal.data["power_toggle"] != null) - use_power = !use_power + update_use_power(!use_power) if(signal.data["panic_siphon"]) //must be before if("scrubbing" thing panic = text2num(signal.data["panic_siphon"]) if(panic) - use_power = 1 + update_use_power(USE_POWER_IDLE) scrubbing = 0 else scrubbing = 1 if(signal.data["toggle_panic_siphon"] != null) panic = !panic if(panic) - use_power = 1 + update_use_power(USE_POWER_IDLE) scrubbing = 0 else scrubbing = 1 diff --git a/code/ATMOSPHERICS/pipes/pipe_base.dm b/code/ATMOSPHERICS/pipes/pipe_base.dm index d1bb92fac7..e627fcbb46 100644 --- a/code/ATMOSPHERICS/pipes/pipe_base.dm +++ b/code/ATMOSPHERICS/pipes/pipe_base.dm @@ -9,7 +9,7 @@ var/leaking = FALSE // Do not set directly, use set_leaking(TRUE/FALSE) layer = PIPES_LAYER - use_power = 0 + use_power = USE_POWER_OFF pipe_flags = 0 // Does not have PIPING_DEFAULT_LAYER_ONLY flag. diff --git a/code/__defines/_planes+layers.dm b/code/__defines/_planes+layers.dm index 01d890b152..a8e3951a3e 100644 --- a/code/__defines/_planes+layers.dm +++ b/code/__defines/_planes+layers.dm @@ -22,7 +22,7 @@ What can I do with Planesmasters? Planesmasters can be used as a neater way to deal with client images or potentially to do some neat things How do planes work? - A plane can be any integer from -100 to 100. (If you want more, bug lummox.) + A plane can be any integer from -10000 to 10000. All planes above 0, the 'base plane', are visible even when your character cannot 'see' them, for example, the HUD. All planes below 0, the 'base plane', are only visible when a character can see them. @@ -40,8 +40,14 @@ What is the naming convention for planes or layers? */ + #define SPACE_PLANE -82 // Reserved for use in space/parallax -#define PARALLAX_PLANE -80 // Reserved for use in space/parallax +#define PARALLAX_PLANE -81 // Reserved for use in space/parallax +#define SKYBOX_PLANE -80 // Skybox parallax +#define DUST_PLANE -79 // For dust overlay on space turfs. Should be above skybox for parallax effect. + +#define PLANE_LOOKINGGLASS -78 // For the Looking Glass holodecks +#define PLANE_LOOKINGGLASS_IMG -77 // For the Looking Glass holodecks // OPENSPACE_PLANE reserves all planes between OPENSPACE_PLANE_START and OPENSPACE_PLANE_END inclusive #define OPENSPACE_PLANE -75 // /turf/simulated/open will use OPENSPACE_PLANE + z (Valid z's being 2 thru 17) @@ -50,7 +56,6 @@ What is the naming convention for planes or layers? #define OVER_OPENSPACE_PLANE -57 // Turf Planes -#define SPACE_PLANE -43 // Space turfs themselves #define PLATING_PLANE -44 // Plating #define DISPOSAL_LAYER 2.1 // Under objects, even when planeswapped #define PIPES_LAYER 2.2 // Under objects, even when planeswapped @@ -86,6 +91,9 @@ What is the naming convention for planes or layers? #define BELOW_MOB_LAYER 3.9 // Should be converted to plane swaps #define ABOVE_MOB_LAYER 4.1 // Should be converted to plane swaps +// Invisible things plane +#define CLOAKED_PLANE -15 + // Top plane (in the sense that it's the highest in 'the world' and not a UI element) #define ABOVE_PLANE -10 diff --git a/code/__defines/atmos.dm b/code/__defines/atmos.dm index 66348344f2..56055273e4 100644 --- a/code/__defines/atmos.dm +++ b/code/__defines/atmos.dm @@ -29,6 +29,7 @@ #define MINIMUM_AIR_TO_SUSPEND (MOLES_CELLSTANDARD * MINIMUM_AIR_RATIO_TO_SUSPEND) // Minimum amount of air that has to move before a group processing can be suspended #define MINIMUM_MOLES_DELTA_TO_MOVE (MOLES_CELLSTANDARD * MINIMUM_AIR_RATIO_TO_SUSPEND) // Either this must be active #define MINIMUM_TEMPERATURE_TO_MOVE (T20C + 100) // or this (or both, obviously) +#define MINIMUM_PRESSURE_DIFFERENCE_TO_SUSPEND (MINIMUM_AIR_TO_SUSPEND*R_IDEAL_GAS_EQUATION*T20C)/CELL_VOLUME // Minimum pressure difference between zones to suspend #define MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND 0.012 // Minimum temperature difference before group processing is suspended. #define MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND 4 diff --git a/code/__defines/color.dm b/code/__defines/color.dm index ba9efe20de..d439958d76 100644 --- a/code/__defines/color.dm +++ b/code/__defines/color.dm @@ -14,4 +14,6 @@ #define COLOR_ASSEMBLY_LBLUE "#5D99BE" #define COLOR_ASSEMBLY_BLUE "#38559E" #define COLOR_ASSEMBLY_PURPLE "#6F6192" -#define COLOR_ASSEMBLY_HOT_PINK "#FF69B4" \ No newline at end of file +#define COLOR_ASSEMBLY_HOT_PINK "#FF69B4" + +#define COLOR_ASTEROID_ROCK "#735555" diff --git a/code/__defines/construction.dm b/code/__defines/construction.dm index 2bae550a22..f148803322 100644 --- a/code/__defines/construction.dm +++ b/code/__defines/construction.dm @@ -38,6 +38,7 @@ #define CONNECT_TYPE_SUPPLY 2 #define CONNECT_TYPE_SCRUBBER 4 #define CONNECT_TYPE_HE 8 +#define CONNECT_TYPE_FUEL 16 // TODO - Implement this! Its piping so better ask Leshana // We are based on the three named layers of supply, regular, and scrubber. #define PIPING_LAYER_SUPPLY 1 diff --git a/code/__defines/is_helpers.dm b/code/__defines/is_helpers.dm index d3222965a9..47226383ea 100644 --- a/code/__defines/is_helpers.dm +++ b/code/__defines/is_helpers.dm @@ -6,6 +6,7 @@ //--------------- #define isatom(D) istype(D, /atom) +#define isclient(D) istype(D, /client) //--------------- //#define isobj(D) istype(D, /obj) //Built in diff --git a/code/__defines/machinery.dm b/code/__defines/machinery.dm index 3676071d7c..d01ff407a2 100644 --- a/code/__defines/machinery.dm +++ b/code/__defines/machinery.dm @@ -11,6 +11,11 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called #define DOOR_CRUSH_DAMAGE 20 #define ALIEN_SELECT_AFK_BUFFER 1 // How many minutes that a person can be AFK before not being allowed to be an alien. +// Constants for machine's use_power +#define USE_POWER_OFF 0 // No continuous power use +#define USE_POWER_IDLE 1 // Machine is using power at its idle power level +#define USE_POWER_ACTIVE 2 // Machine is using power at its active power level + // Channel numbers for power. #define EQUIP 1 #define LIGHT 2 @@ -24,6 +29,11 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called #define MAINT 0x8 // Under maintenance. #define EMPED 0x10 // Temporary broken by EMP pulse. +// Remote control states +#define RCON_NO 1 +#define RCON_AUTO 2 +#define RCON_YES 3 + // Used by firelocks #define FIREDOOR_OPEN 1 #define FIREDOOR_CLOSED 2 diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index b96c2cca84..2ca0825c64 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -2,7 +2,7 @@ // Turf-only flags. #define NOJAUNT 1 // This is used in literally one place, turf.dm, to block ethereal jaunt. -#define TRANSITIONEDGE 7 // Distance from edge to move to another z-level. +#define TRANSITIONEDGE 1 // Distance from edge to move to another z-level. // Invisibility constants. These should only be used for TRUE invisibility, AKA nothing living players touch #define INVISIBILITY_LIGHTING 20 @@ -80,7 +80,7 @@ #define COLOR_DARK_GRAY "#404040" - +#define CLIENT_FROM_VAR(I) (ismob(I) ? I:client : (isclient(I) ? I : null)) // Shuttles. @@ -270,6 +270,7 @@ #define WORLD_ICON_SIZE 32 //Needed for the R-UST port #define PIXEL_MULTIPLIER WORLD_ICON_SIZE/32 //Needed for the R-UST port +#define MAX_CLIENT_VIEW 34 // Maximum effective value of client.view (According to DM references) // Maploader bounds indices #define MAP_MINX 1 diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index cfbcfcd1dd..beeda302eb 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -396,7 +396,9 @@ #define VIS_BUILDMODE 22 -#define VIS_COUNT 22 //Must be highest number from above. +#define VIS_CLOAKED 23 + +#define VIS_COUNT 23 //Must be highest number from above. //Some mob icon layering defines #define BODY_LAYER -100 diff --git a/code/__defines/overmap.dm b/code/__defines/overmap.dm new file mode 100644 index 0000000000..503675b44e --- /dev/null +++ b/code/__defines/overmap.dm @@ -0,0 +1,16 @@ + //How far from the edge of overmap zlevel could randomly placed objects spawn +#define OVERMAP_EDGE 2 + +#define SHIP_SIZE_TINY 1 +#define SHIP_SIZE_SMALL 2 +#define SHIP_SIZE_LARGE 3 + +//multipliers for max_speed to find 'slow' and 'fast' speeds for the ship +#define SHIP_SPEED_SLOW 1/(40 SECONDS) +#define SHIP_SPEED_FAST 3/(20 SECONDS)// 15 speed + +#define OVERMAP_WEAKNESS_NONE 0 +#define OVERMAP_WEAKNESS_FIRE 1 +#define OVERMAP_WEAKNESS_EMP 2 +#define OVERMAP_WEAKNESS_MINING 4 +#define OVERMAP_WEAKNESS_EXPLOSIVE 8 diff --git a/code/__defines/preferences.dm b/code/__defines/preferences.dm new file mode 100644 index 0000000000..0bb289d2e1 --- /dev/null +++ b/code/__defines/preferences.dm @@ -0,0 +1,6 @@ +#define EXAMINE_MODE_DEFAULT 0 +#define EXAMINE_MODE_INCLUDE_USAGE 1 +#define EXAMINE_MODE_SWITCH_TO_PANEL 2 + +// Should be one higher than the above +#define EXAMINE_MODE_MAX 3 \ No newline at end of file diff --git a/code/modules/shuttles/_defines.dm b/code/__defines/shuttle.dm similarity index 68% rename from code/modules/shuttles/_defines.dm rename to code/__defines/shuttle.dm index 22d57fe9cb..9bf7dcad6f 100644 --- a/code/modules/shuttles/_defines.dm +++ b/code/__defines/shuttle.dm @@ -9,6 +9,11 @@ #define SLANDMARK_FLAG_AUTOSET 1 // If set, will set base area and turf type to same as where it was spawned at #define SLANDMARK_FLAG_ZERO_G 2 // Zero-G shuttles moved here will lose gravity unless the area has ambient gravity. +// Overmap landable shuttles (/obj/effect/overmap/visitable/ship/landable on a /datum/shuttle/autodock/overmap) +#define SHIP_STATUS_LANDED 1 // Ship is at any other shuttle landmark. +#define SHIP_STATUS_TRANSIT 2 // Ship is at it's shuttle datum's transition shuttle landmark. +#define SHIP_STATUS_OVERMAP 3 // Ship is at its "overmap" shuttle landmark (allowed to move on overmap now) + // Ferry shuttle location constants #define FERRY_LOCATION_STATION 0 #define FERRY_LOCATION_OFFSITE 1 diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm index ae7b77e214..a9f7f02fb8 100644 --- a/code/__defines/subsystems.dm +++ b/code/__defines/subsystems.dm @@ -52,10 +52,12 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G // Subsystem init_order, from highest priority to lowest priority // Subsystems shutdown in the reverse of the order they initialize in // The numbers just define the ordering, they are meaningless otherwise. -#define INIT_ORDER_SQLITE 19 -#define INIT_ORDER_CHEMISTRY 18 -#define INIT_ORDER_MAPPING 17 -#define INIT_ORDER_DECALS 16 +#define INIT_ORDER_SQLITE 40 +#define INIT_ORDER_CHEMISTRY 35 +#define INIT_ORDER_SKYBOX 30 +#define INIT_ORDER_MAPPING 25 +#define INIT_ORDER_DECALS 20 +#define INIT_ORDER_JOB 17 #define INIT_ORDER_ATOMS 15 #define INIT_ORDER_MACHINES 10 #define INIT_ORDER_SHUTTLES 3 @@ -63,22 +65,27 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G #define INIT_ORDER_DEFAULT 0 #define INIT_ORDER_LIGHTING 0 #define INIT_ORDER_AIR -1 +#define INIT_ORDER_ASSETS -3 #define INIT_ORDER_PLANETS -4 #define INIT_ORDER_HOLOMAPS -5 #define INIT_ORDER_OVERLAY -6 +#define INIT_ORDER_ALARM -7 #define INIT_ORDER_XENOARCH -20 #define INIT_ORDER_CIRCUIT -21 #define INIT_ORDER_AI -22 -#define INIT_ORDER_JOB -23 +#define INIT_ORDER_GAME_MASTER -24 +#define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init. // Subsystem fire priority, from lowest to highest priority // If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child) #define FIRE_PRIORITY_SHUTTLES 5 +#define FIRE_PRIORITY_SUPPLY 5 #define FIRE_PRIORITY_ORBIT 8 #define FIRE_PRIORITY_VOTE 9 #define FIRE_PRIORITY_AI 10 #define FIRE_PRIORITY_GARBAGE 15 +#define FIRE_PRIORITY_ALARM 20 #define FIRE_PRIORITY_CHARSETUP 25 #define FIRE_PRIORITY_AIRFLOW 30 #define FIRE_PRIORITY_AIR 35 @@ -88,6 +95,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G #define FIRE_PRIORITY_PLANETS 75 #define FIRE_PRIORITY_MACHINES 100 #define FIRE_PRIORITY_PROJECTILES 150 +#define FIRE_PRIORITY_CHAT 400 #define FIRE_PRIORITY_OVERLAYS 500 // Macro defining the actual code applying our overlays lists to the BYOND overlays list. (I guess a macro for speed) diff --git a/code/__defines/xenoarcheaology.dm b/code/__defines/xenoarcheaology.dm index 8a4988b78c..e4b0a3935a 100644 --- a/code/__defines/xenoarcheaology.dm +++ b/code/__defines/xenoarcheaology.dm @@ -37,7 +37,11 @@ #define ARCHAEO_ALIEN_BOAT 37 #define ARCHAEO_IMPERION_CIRCUIT 38 #define ARCHAEO_TELECUBE 39 -#define MAX_ARCHAEO 39 +#define ARCHAEO_BATTERY 40 +#define ARCHAEO_SYRINGE 41 +#define ARCHAEO_RING 42 +#define ARCHAEO_CLUB 43 +#define MAX_ARCHAEO 43 #define DIGSITE_GARDEN 1 #define DIGSITE_ANIMAL 2 diff --git a/code/_helpers/_lists.dm b/code/_helpers/_lists.dm index 48e9d1ba64..d844d61b5c 100644 --- a/code/_helpers/_lists.dm +++ b/code/_helpers/_lists.dm @@ -6,10 +6,10 @@ */ // Determiner constants -#define DET_NONE 0x00; -#define DET_DEFINITE 0x01; // the -#define DET_INDEFINITE 0x02; // a, an, some -#define DET_AUTO 0x04; +#define DET_NONE 0x00 +#define DET_DEFINITE 0x01 // the +#define DET_INDEFINITE 0x02 // a, an, some +#define DET_AUTO 0x04 /* * Misc @@ -53,7 +53,7 @@ // atoms/items/objects can be pretty and whatnot var/atom/A = item if(output_icons && isicon(A.icon) && !ismob(A)) // mobs tend to have unusable icons - item_str += "\icon[A] " + item_str += "[bicon(A)] " switch(determiners) if(DET_NONE) item_str += A.name if(DET_DEFINITE) item_str += "\the [A]" @@ -206,6 +206,20 @@ proc/listclearnulls(list/list) result = first - second return result +/* +Two lists may be different (A!=B) even if they have the same elements. +This actually tests if they have the same entries and values. +*/ +/proc/same_entries(var/list/first, var/list/second) + if(!islist(first) || !islist(second)) + return 0 + if(length(first) != length(second)) + return 0 + for(var/entry in first) + if(!(entry in second) || (first[entry] != second[entry])) + return 0 + return 1 + /* * Returns list containing entries that are in either list but not both. * If skipref = 1, repeated elements are treated as one. @@ -831,3 +845,18 @@ proc/dd_sortedTextList(list/incoming) if(L.len) . = L[1] L.Cut(1,2) + +//generates a list used to randomize transit animations so they aren't in lockstep +/proc/get_cross_shift_list(var/size) + var/list/result = list() + + result += rand(0, 14) + for(var/i in 2 to size) + var/shifts = list(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) + shifts -= result[i - 1] //consecutive shifts should not be equal + if(i == size) + shifts -= result[1] //because shift list is a ring buffer + result += pick(shifts) + + return result + \ No newline at end of file diff --git a/code/_helpers/events.dm b/code/_helpers/events.dm index e31d24783e..2d15bb3aa9 100644 --- a/code/_helpers/events.dm +++ b/code/_helpers/events.dm @@ -24,4 +24,16 @@ if(A == myarea) //The loc of a turf is the area it is in. return 1 return 0 - \ No newline at end of file + +// Returns a list of area instances, or a subtypes of them, that are mapped in somewhere. +// Avoid feeding it `/area`, as it will likely cause a lot of lag as it evaluates every single area coded in. +/proc/get_all_existing_areas_of_types(list/area_types) + . = list() + for(var/area_type in area_types) + var/list/types = typesof(area_type) + for(var/T in types) + // Test for existance. + var/area/A = locate(T) + if(!istype(A) || !A.contents.len) // Empty contents list means it's not on the map. + continue + . += A \ No newline at end of file diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 50cf502639..58b1707a8c 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -19,8 +19,6 @@ var/global/list/side_effects = list() //list of all medical sideeffects types var/global/list/mechas_list = list() //list of all mechs. Used by hostile mobs target tracking. var/global/list/joblist = list() //list of all jobstypes, minus borg and AI -var/global/list/turfs = list() //list of all turfs - #define all_genders_define_list list(MALE,FEMALE,PLURAL,NEUTER) #define all_genders_text_list list("Male","Female","Plural","Neuter") @@ -30,9 +28,6 @@ var/list/mannequins_ var/global/list/poster_designs = list() var/global/list/NT_poster_designs = list() -// Uplinks -var/list/obj/item/device/uplink/world_uplinks = list() - //Preferences stuff //Hairstyles var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name diff --git a/code/_helpers/icons.dm b/code/_helpers/icons.dm index 9a36f2dfbc..9818dd4258 100644 --- a/code/_helpers/icons.dm +++ b/code/_helpers/icons.dm @@ -167,7 +167,7 @@ mob Output_Icon() set name = "2. Output Icon" - to_chat(src, "Icon is: \icon[getFlatIcon(src)]") + to_chat(src, "Icon is: [bicon(getFlatIcon(src))]") Label_Icon() set name = "3. Label Icon" diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm index 9320c29272..04b8ede203 100644 --- a/code/_helpers/mobs.dm +++ b/code/_helpers/mobs.dm @@ -1,38 +1,3 @@ -/atom/movable/proc/get_mob() - return - -/obj/mecha/get_mob() - return occupant - -/obj/vehicle/train/get_mob() - return buckled_mobs - -/mob/get_mob() - return src - -/mob/living/bot/mulebot/get_mob() - if(load && istype(load, /mob/living)) - return list(src, load) - return src - -/proc/mobs_in_view(var/range, var/source) - var/list/mobs = list() - for(var/atom/movable/AM in view(range, source)) - var/M = AM.get_mob() - if(M) - mobs += M - - return mobs - -/proc/mobs_in_xray_view(var/range, var/source) - var/list/mobs = list() - for(var/atom/movable/AM in orange(range, source)) - var/M = AM.get_mob() - if(M) - mobs += M - - return mobs - proc/random_hair_style(gender, species = SPECIES_HUMAN) var/h_style = "Bald" diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm index 688e1c2a68..67844cf4a2 100644 --- a/code/_helpers/text.dm +++ b/code/_helpers/text.dm @@ -301,11 +301,15 @@ proc/TextPreview(var/string,var/len=40) //For generating neat chat tag-images //The icon var could be local in the proc, but it's a waste of resources // to always create it and then throw it out. -/var/icon/text_tag_icons = new('./icons/chattags.dmi') +/var/icon/text_tag_icons = 'icons/chattags.dmi' +/var/list/text_tag_cache = list() /proc/create_text_tag(var/tagname, var/tagdesc = tagname, var/client/C = null) if(!(C && C.is_preference_enabled(/datum/client_preference/chat_tags))) return tagdesc - return "[tagdesc]" + if(!text_tag_cache[tagname]) + var/icon/tag = icon(text_tag_icons, tagname) + text_tag_cache[tagname] = bicon(tag, TRUE, "text_tag") + return text_tag_cache[tagname] /proc/contains_az09(var/input) for(var/i=1, i<=length(input), i++) diff --git a/code/_helpers/turfs.dm b/code/_helpers/turfs.dm index e8ca671c11..a9cede52de 100644 --- a/code/_helpers/turfs.dm +++ b/code/_helpers/turfs.dm @@ -33,6 +33,20 @@ available_turfs = start_turfs return pick(available_turfs) +// Picks a turf that is clearance tiles away from the map edge given by dir, on z-level Z +/proc/pick_random_edge_turf(var/dir, var/Z, var/clearance = TRANSITIONEDGE + 1) + if(!dir) + return + switch(dir) + if(NORTH) + return locate(rand(clearance, world.maxx - clearance), world.maxy - clearance, Z) + if(SOUTH) + return locate(rand(clearance, world.maxx - clearance), clearance, Z) + if(EAST) + return locate(world.maxx - clearance, rand(clearance, world.maxy - clearance), Z) + if(WEST) + return locate(clearance, rand(clearance, world.maxy - clearance), Z) + /proc/is_below_sound_pressure(var/turf/T) var/datum/gas_mixture/environment = T ? T.return_air() : null var/pressure = environment ? environment.return_pressure() : 0 diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 1ac64fabe1..38fd5c65d8 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -1,1581 +1,1583 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -/* - * A large number of misc global procs. - */ - -//Checks if all high bits in req_mask are set in bitfield -#define BIT_TEST_ALL(bitfield, req_mask) ((~(bitfield) & (req_mask)) == 0) - -//supposedly the fastest way to do this according to https://gist.github.com/Giacom/be635398926bb463b42a -#define RANGE_TURFS(RADIUS, CENTER) \ - block( \ - locate(max(CENTER.x-(RADIUS),1), max(CENTER.y-(RADIUS),1), CENTER.z), \ - locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \ - ) - -//Inverts the colour of an HTML string -/proc/invertHTML(HTMLstring) - - if (!( istext(HTMLstring) )) - CRASH("Given non-text argument!") - return - else - if (length(HTMLstring) != 7) - CRASH("Given non-HTML argument!") - return - var/textr = copytext(HTMLstring, 2, 4) - var/textg = copytext(HTMLstring, 4, 6) - var/textb = copytext(HTMLstring, 6, 8) - var/r = hex2num(textr) - var/g = hex2num(textg) - var/b = hex2num(textb) - textr = num2hex(255 - r) - textg = num2hex(255 - g) - textb = num2hex(255 - b) - if (length(textr) < 2) - textr = text("0[]", textr) - if (length(textg) < 2) - textr = text("0[]", textg) - if (length(textb) < 2) - textr = text("0[]", textb) - return text("#[][][]", textr, textg, textb) - return - -//Returns the middle-most value -/proc/dd_range(var/low, var/high, var/num) - return max(low,min(high,num)) - -//Returns whether or not A is the middle most value -/proc/InRange(var/A, var/lower, var/upper) - if(A < lower) return 0 - if(A > upper) return 0 - return 1 - - -/proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams. - if(!start || !end) return 0 - var/dy - var/dx - dy=(32*end.y+end.pixel_y)-(32*start.y+start.pixel_y) - dx=(32*end.x+end.pixel_x)-(32*start.x+start.pixel_x) - if(!dy) - return (dx>=0)?90:270 - .=arctan(dx/dy) - if(dy<0) - .+=180 - else if(dx<0) - .+=360 - -//Returns location. Returns null if no location was found. -/proc/get_teleport_loc(turf/location,mob/target,distance = 1, density = 0, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0) -/* -Location where the teleport begins, target that will teleport, distance to go, density checking 0/1(yes/no). -Random error in tile placement x, error in tile placement y, and block offset. -Block offset tells the proc how to place the box. Behind teleport location, relative to starting location, forward, etc. -Negative values for offset are accepted, think of it in relation to North, -x is west, -y is south. Error defaults to positive. -Turf and target are seperate in case you want to teleport some distance from a turf the target is not standing on or something. -*/ - - var/dirx = 0//Generic location finding variable. - var/diry = 0 - - var/xoffset = 0//Generic counter for offset location. - var/yoffset = 0 - - var/b1xerror = 0//Generic placing for point A in box. The lower left. - var/b1yerror = 0 - var/b2xerror = 0//Generic placing for point B in box. The upper right. - var/b2yerror = 0 - - errorx = abs(errorx)//Error should never be negative. - errory = abs(errory) - //var/errorxy = round((errorx+errory)/2)//Used for diagonal boxes. - - switch(target.dir)//This can be done through equations but switch is the simpler method. And works fast to boot. - //Directs on what values need modifying. - if(1)//North - diry+=distance - yoffset+=eoffsety - xoffset+=eoffsetx - b1xerror-=errorx - b1yerror-=errory - b2xerror+=errorx - b2yerror+=errory - if(2)//South - diry-=distance - yoffset-=eoffsety - xoffset+=eoffsetx - b1xerror-=errorx - b1yerror-=errory - b2xerror+=errorx - b2yerror+=errory - if(4)//East - dirx+=distance - yoffset+=eoffsetx//Flipped. - xoffset+=eoffsety - b1xerror-=errory//Flipped. - b1yerror-=errorx - b2xerror+=errory - b2yerror+=errorx - if(8)//West - dirx-=distance - yoffset-=eoffsetx//Flipped. - xoffset+=eoffsety - b1xerror-=errory//Flipped. - b1yerror-=errorx - b2xerror+=errory - b2yerror+=errorx - - var/turf/destination=locate(location.x+dirx,location.y+diry,location.z) - - if(destination)//If there is a destination. - if(errorx||errory)//If errorx or y were specified. - var/destination_list[] = list()//To add turfs to list. - //destination_list = new() - /*This will draw a block around the target turf, given what the error is. - Specifying the values above will basically draw a different sort of block. - If the values are the same, it will be a square. If they are different, it will be a rectengle. - In either case, it will center based on offset. Offset is position from center. - Offset always calculates in relation to direction faced. In other words, depending on the direction of the teleport, - the offset should remain positioned in relation to destination.*/ - - var/turf/center = locate((destination.x+xoffset),(destination.y+yoffset),location.z)//So now, find the new center. - - //Now to find a box from center location and make that our destination. - for(var/turf/T in block(locate(center.x+b1xerror,center.y+b1yerror,location.z), locate(center.x+b2xerror,center.y+b2yerror,location.z) )) - if(density&&(T.density||T.contains_dense_objects())) continue//If density was specified. - if(T.x>world.maxx || T.x<1) continue//Don't want them to teleport off the map. - if(T.y>world.maxy || T.y<1) continue - destination_list += T - if(destination_list.len) - destination = pick(destination_list) - else return - - else//Same deal here. - if(density&&(destination.density||destination.contains_dense_objects())) return - if(destination.x>world.maxx || destination.x<1) return - if(destination.y>world.maxy || destination.y<1) return - else return - - return destination - - - -/proc/LinkBlocked(turf/A, turf/B) - if(A == null || B == null) return 1 - var/adir = get_dir(A,B) - var/rdir = get_dir(B,A) - if((adir & (NORTH|SOUTH)) && (adir & (EAST|WEST))) // diagonal - var/iStep = get_step(A,adir&(NORTH|SOUTH)) - if(!LinkBlocked(A,iStep) && !LinkBlocked(iStep,B)) return 0 - - var/pStep = get_step(A,adir&(EAST|WEST)) - if(!LinkBlocked(A,pStep) && !LinkBlocked(pStep,B)) return 0 - return 1 - - if(DirBlocked(A,adir)) return 1 - if(DirBlocked(B,rdir)) return 1 - return 0 - - -/proc/DirBlocked(turf/loc,var/dir) - for(var/obj/structure/window/D in loc) - if(!D.density) continue - if(D.dir == SOUTHWEST) return 1 - if(D.dir == dir) return 1 - - for(var/obj/machinery/door/D in loc) - if(!D.density) continue - if(istype(D, /obj/machinery/door/window)) - if((dir & SOUTH) && (D.dir & (EAST|WEST))) return 1 - if((dir & EAST ) && (D.dir & (NORTH|SOUTH))) return 1 - else return 1 // it's a real, air blocking door - return 0 - -/proc/TurfBlockedNonWindow(turf/loc) - for(var/obj/O in loc) - if(O.density && !istype(O, /obj/structure/window)) - return 1 - return 0 - -/proc/sign(x) - return x!=0?x/abs(x):0 - -/proc/getline(atom/M,atom/N)//Ultra-Fast Bresenham Line-Drawing Algorithm - var/px=M.x //starting x - var/py=M.y - var/line[] = list(locate(px,py,M.z)) - var/dx=N.x-px //x distance - var/dy=N.y-py - var/dxabs=abs(dx)//Absolute value of x distance - var/dyabs=abs(dy) - var/sdx=sign(dx) //Sign of x distance (+ or -) - var/sdy=sign(dy) - var/x=dxabs>>1 //Counters for steps taken, setting to distance/2 - var/y=dyabs>>1 //Bit-shifting makes me l33t. It also makes getline() unnessecarrily fast. - var/j //Generic integer for counting - if(dxabs>=dyabs) //x distance is greater than y - for(j=0;j=dxabs) //Every dyabs steps, step once in y direction - y-=dxabs - py+=sdy - px+=sdx //Step on in x direction - line+=locate(px,py,M.z)//Add the turf to the list - else - for(j=0;j=dyabs) - x-=dyabs - px+=sdx - py+=sdy - line+=locate(px,py,M.z) - return line - -#define LOCATE_COORDS(X, Y, Z) locate(between(1, X, world.maxx), between(1, Y, world.maxy), Z) -/proc/getcircle(turf/center, var/radius) //Uses a fast Bresenham rasterization algorithm to return the turfs in a thin circle. - if(!radius) return list(center) - - var/x = 0 - var/y = radius - var/p = 3 - 2 * radius - - . = list() - while(y >= x) // only formulate 1/8 of circle - - . += LOCATE_COORDS(center.x - x, center.y - y, center.z) //upper left left - . += LOCATE_COORDS(center.x - y, center.y - x, center.z) //upper upper left - . += LOCATE_COORDS(center.x + y, center.y - x, center.z) //upper upper right - . += LOCATE_COORDS(center.x + x, center.y - y, center.z) //upper right right - . += LOCATE_COORDS(center.x - x, center.y + y, center.z) //lower left left - . += LOCATE_COORDS(center.x - y, center.y + x, center.z) //lower lower left - . += LOCATE_COORDS(center.x + y, center.y + x, center.z) //lower lower right - . += LOCATE_COORDS(center.x + x, center.y + y, center.z) //lower right right - - if(p < 0) - p += 4*x++ + 6; - else - p += 4*(x++ - y--) + 10; - -#undef LOCATE_COORDS - -//Returns whether or not a player is a guest using their ckey as an input -/proc/IsGuestKey(key) - if (findtext(key, "Guest-", 1, 7) != 1) //was findtextEx - return 0 - - var/i = 7, ch, len = length(key) - - if(copytext(key, 7, 8) == "W") //webclient - i++ - - for (, i <= len, ++i) - ch = text2ascii(key, i) - if (ch < 48 || ch > 57) - return 0 - return 1 - -//Ensure the frequency is within bounds of what it should be sending/recieving at -/proc/sanitize_frequency(var/f, var/low = PUBLIC_LOW_FREQ, var/high = PUBLIC_HIGH_FREQ) - f = round(f) - f = max(low, f) - f = min(high, f) - if ((f % 2) == 0) //Ensure the last digit is an odd number - f += 1 - return f - -//Turns 1479 into 147.9 -/proc/format_frequency(var/f) - return "[round(f / 10)].[f % 10]" - - - -//This will update a mob's name, real_name, mind.name, data_core records, pda and id -//Calling this proc without an oldname will only update the mob and skip updating the pda, id and records ~Carn -/mob/proc/fully_replace_character_name(var/oldname,var/newname) - if(!newname) return 0 - real_name = newname - name = newname - if(mind) - mind.name = newname - if(dna) - dna.real_name = real_name - - if(oldname) - //update the datacore records! This is goig to be a bit costly. - for(var/list/L in list(data_core.general,data_core.medical,data_core.security,data_core.locked)) - for(var/datum/data/record/R in L) - if(R.fields["name"] == oldname) - R.fields["name"] = newname - break - - //update our pda and id if we have them on our person - var/list/searching = GetAllContents(searchDepth = 3) - var/search_id = 1 - var/search_pda = 1 - - for(var/A in searching) - if( search_id && istype(A,/obj/item/weapon/card/id) ) - var/obj/item/weapon/card/id/ID = A - if(ID.registered_name == oldname) - ID.registered_name = newname - ID.name = "[newname]'s ID Card ([ID.assignment])" - if(!search_pda) break - search_id = 0 - - else if( search_pda && istype(A,/obj/item/device/pda) ) - var/obj/item/device/pda/PDA = A - if(PDA.owner == oldname) - PDA.owner = newname - PDA.name = "PDA-[newname] ([PDA.ownjob])" - if(!search_id) break - search_pda = 0 - return 1 - - - -//Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame() -//Last modified by Carn -/mob/proc/rename_self(var/role, var/allow_numbers=0) - spawn(0) - var/oldname = real_name - - var/time_passed = world.time - var/newname - - for(var/i=1,i<=3,i++) //we get 3 attempts to pick a suitable name. - newname = input(src,"You are \a [role]. Would you like to change your name to something else?", "Name change",oldname) as text - if((world.time-time_passed)>3000) - return //took too long - newname = sanitizeName(newname, ,allow_numbers) //returns null if the name doesn't meet some basic requirements. Tidies up a few other things like bad-characters. - - for(var/mob/living/M in player_list) - if(M == src) - continue - if(!newname || M.real_name == newname) - newname = null - break - if(newname) - break //That's a suitable name! - to_chat(src, "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken.") - - if(!newname) //we'll stick with the oldname then - return - - if(cmptext("ai",role)) - if(isAI(src)) - var/mob/living/silicon/ai/A = src - oldname = null//don't bother with the records update crap - //to_world("[newname] is the AI!") - //world << sound('sound/AI/newAI.ogg') - // Set eyeobj name - A.SetName(newname) - - - fully_replace_character_name(oldname,newname) - - - -//Picks a string of symbols to display as the law number for hacked or ion laws -/proc/ionnum() - return "[pick("1","2","3","4","5","6","7","8","9","0")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")]" - -//When an AI is activated, it can choose from a list of non-slaved borgs to have as a slave. -/proc/freeborg() - var/select = null - var/list/borgs = list() - for (var/mob/living/silicon/robot/A in player_list) - if (A.stat == 2 || A.connected_ai || A.scrambledcodes || istype(A,/mob/living/silicon/robot/drone)) - continue - var/name = "[A.real_name] ([A.modtype] [A.braintype])" - borgs[name] = A - - if (borgs.len) - select = input("Unshackled borg signals detected:", "Borg selection", null, null) as null|anything in borgs - return borgs[select] - -//When a borg is activated, it can choose which AI it wants to be slaved to -/proc/active_ais() - . = list() - for(var/mob/living/silicon/ai/A in living_mob_list) - if(A.stat == DEAD) - continue - if(A.control_disabled == 1) - continue - . += A - return . - -//Find an active ai with the least borgs. VERBOSE PROCNAME HUH! -/proc/select_active_ai_with_fewest_borgs() - var/mob/living/silicon/ai/selected - var/list/active = active_ais() - for(var/mob/living/silicon/ai/A in active) - if(!selected || (selected.connected_robots.len > A.connected_robots.len)) - selected = A - - return selected - -/proc/select_active_ai(var/mob/user) - var/list/ais = active_ais() - if(ais.len) - if(user) . = input(usr,"AI signals detected:", "AI selection") in ais - else . = pick(ais) - return . - -/proc/get_sorted_mobs() - var/list/old_list = getmobs() - var/list/AI_list = list() - var/list/Dead_list = list() - var/list/keyclient_list = list() - var/list/key_list = list() - var/list/logged_list = list() - for(var/named in old_list) - var/mob/M = old_list[named] - if(issilicon(M)) - AI_list |= M - else if(isobserver(M) || M.stat == 2) - Dead_list |= M - else if(M.key && M.client) - keyclient_list |= M - else if(M.key) - key_list |= M - else - logged_list |= M - old_list.Remove(named) - var/list/new_list = list() - new_list += AI_list - new_list += keyclient_list - new_list += key_list - new_list += logged_list - new_list += Dead_list - return new_list - -//Returns a list of all mobs with their name -/proc/getmobs() - - var/list/mobs = sortmobs() - var/list/names = list() - var/list/creatures = list() - var/list/namecounts = list() - for(var/mob/M in mobs) - var/name = M.name - if (name in names) - namecounts[name]++ - name = "[name] ([namecounts[name]])" - else - names.Add(name) - namecounts[name] = 1 - if (M.real_name && M.real_name != M.name) - name += " \[[M.real_name]\]" - if (M.stat == 2) - if(istype(M, /mob/observer/dead/)) - name += " \[ghost\]" - else - name += " \[dead\]" - creatures[name] = M - - return creatures - -//Orders mobs by type then by name -/proc/sortmobs() - var/list/moblist = list() - var/list/sortmob = sortAtom(mob_list) - for(var/mob/observer/eye/M in sortmob) - moblist.Add(M) - for(var/mob/observer/blob/M in sortmob) - moblist.Add(M) - for(var/mob/living/silicon/ai/M in sortmob) - moblist.Add(M) - for(var/mob/living/silicon/pai/M in sortmob) - moblist.Add(M) - for(var/mob/living/silicon/robot/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/human/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/brain/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/alien/M in sortmob) - moblist.Add(M) - for(var/mob/observer/dead/M in sortmob) - moblist.Add(M) - for(var/mob/new_player/M in sortmob) - moblist.Add(M) - for(var/mob/living/simple_mob/M in sortmob) - moblist.Add(M) -// for(var/mob/living/silicon/hivebot/M in sortmob) -// mob_list.Add(M) -// for(var/mob/living/silicon/hive_mainframe/M in sortmob) -// mob_list.Add(M) - return moblist - -// Format a power value in W, kW, MW, or GW. -/proc/DisplayPower(powerused) - if(powerused < 1000) //Less than a kW - return "[powerused] W" - else if(powerused < 1000000) //Less than a MW - return "[round((powerused * 0.001),0.01)] kW" - else if(powerused < 1000000000) //Less than a GW - return "[round((powerused * 0.000001),0.001)] MW" - return "[round((powerused * 0.000000001),0.0001)] GW" - -/proc/get_mob_by_ckey(key) - if(!key) - return - var/list/mobs = sortmobs() - for(var/mob/M in mobs) - if(M.ckey == key) - return M - -//Forces a variable to be posative -/proc/modulus(var/M) - if(M >= 0) - return M - if(M < 0) - return -M - -// returns the turf located at the map edge in the specified direction relative to A -// used for mass driver -/proc/get_edge_target_turf(var/atom/A, var/direction) - - var/turf/target = locate(A.x, A.y, A.z) - if(!A || !target) - return 0 - //since NORTHEAST == NORTH & EAST, etc, doing it this way allows for diagonal mass drivers in the future - //and isn't really any more complicated - - // Note diagonal directions won't usually be accurate - if(direction & NORTH) - target = locate(target.x, world.maxy, target.z) - if(direction & SOUTH) - target = locate(target.x, 1, target.z) - if(direction & EAST) - target = locate(world.maxx, target.y, target.z) - if(direction & WEST) - target = locate(1, target.y, target.z) - - return target - -// returns turf relative to A in given direction at set range -// result is bounded to map size -// note range is non-pythagorean -// used for disposal system -/proc/get_ranged_target_turf(var/atom/A, var/direction, var/range) - - var/x = A.x - var/y = A.y - if(direction & NORTH) - y = min(world.maxy, y + range) - if(direction & SOUTH) - y = max(1, y - range) - if(direction & EAST) - x = min(world.maxx, x + range) - if(direction & WEST) - x = max(1, x - range) - - return locate(x,y,A.z) - - -// returns turf relative to A offset in dx and dy tiles -// bound to map limits -/proc/get_offset_target_turf(var/atom/A, var/dx, var/dy) - var/x = min(world.maxx, max(1, A.x + dx)) - var/y = min(world.maxy, max(1, A.y + dy)) - return locate(x,y,A.z) - -//Makes sure MIDDLE is between LOW and HIGH. If not, it adjusts it. Returns the adjusted value. -/proc/between(var/low, var/middle, var/high) - return max(min(middle, high), low) - -//returns random gauss number -proc/GaussRand(var/sigma) - var/x,y,rsq - do - x=2*rand()-1 - y=2*rand()-1 - rsq=x*x+y*y - while(rsq>1 || !rsq) - return sigma*y*sqrt(-2*log(rsq)/rsq) - -//returns random gauss number, rounded to 'roundto' -proc/GaussRandRound(var/sigma,var/roundto) - return round(GaussRand(sigma),roundto) - -//Will return the contents of an atom recursivly to a depth of 'searchDepth' -/atom/proc/GetAllContents(searchDepth = 5) - var/list/toReturn = list() - - for(var/atom/part in contents) - toReturn += part - if(part.contents.len && searchDepth) - toReturn += part.GetAllContents(searchDepth - 1) - - return toReturn - -//Step-towards method of determining whether one atom can see another. Similar to viewers() -/proc/can_see(var/atom/source, var/atom/target, var/length=5) // I couldn't be arsed to do actual raycasting :I This is horribly inaccurate. - var/turf/current = get_turf(source) - var/turf/target_turf = get_turf(target) - var/steps = 0 - - if(!current || !target_turf) - return 0 - - while(current != target_turf) - if(steps > length) return 0 - if(current.opacity) return 0 - for(var/atom/A in current) - if(A.opacity) return 0 - current = get_step_towards(current, target_turf) - steps++ - - return 1 - -/proc/is_blocked_turf(var/turf/T) - var/cant_pass = 0 - if(T.density) cant_pass = 1 - for(var/atom/A in T) - if(A.density)//&&A.anchored - cant_pass = 1 - return cant_pass - -/proc/get_step_towards2(var/atom/ref , var/atom/trg) - var/base_dir = get_dir(ref, get_step_towards(ref,trg)) - var/turf/temp = get_step_towards(ref,trg) - - if(is_blocked_turf(temp)) - var/dir_alt1 = turn(base_dir, 90) - var/dir_alt2 = turn(base_dir, -90) - var/turf/turf_last1 = temp - var/turf/turf_last2 = temp - var/free_tile = null - var/breakpoint = 0 - - while(!free_tile && breakpoint < 10) - if(!is_blocked_turf(turf_last1)) - free_tile = turf_last1 - break - if(!is_blocked_turf(turf_last2)) - free_tile = turf_last2 - break - turf_last1 = get_step(turf_last1,dir_alt1) - turf_last2 = get_step(turf_last2,dir_alt2) - breakpoint++ - - if(!free_tile) return get_step(ref, base_dir) - else return get_step_towards(ref,free_tile) - - else return get_step(ref, base_dir) - -//Takes: Anything that could possibly have variables and a varname to check. -//Returns: 1 if found, 0 if not. -/proc/hasvar(var/datum/A, var/varname) - if(A.vars.Find(lowertext(varname))) return 1 - else return 0 - -//Returns: all the areas in the world -/proc/return_areas() - var/list/area/areas = list() - for(var/area/A in all_areas) - areas += A - return areas - -//Returns: all the areas in the world, sorted. -/proc/return_sorted_areas() - return sortAtom(return_areas()) - -//Takes: Area type as text string or as typepath OR an instance of the area. -//Returns: A list of all areas of that type in the world. -/proc/get_areas(var/areatype) - if(!areatype) return null - if(istext(areatype)) areatype = text2path(areatype) - if(isarea(areatype)) - var/area/areatemp = areatype - areatype = areatemp.type - - var/list/areas = new/list() - for(var/area/N in all_areas) - if(istype(N, areatype)) areas += N - return areas - -//Takes: Area type as text string or as typepath OR an instance of the area. -//Returns: A list of all turfs in areas of that type of that type in the world. -/proc/get_area_turfs(var/areatype) - if(!areatype) return null - if(istext(areatype)) areatype = text2path(areatype) - if(isarea(areatype)) - var/area/areatemp = areatype - areatype = areatemp.type - - var/list/turfs = new/list() - for(var/area/N in all_areas) - if(istype(N, areatype)) - for(var/turf/T in N) turfs += T - return turfs - -//Takes: Area type as text string or as typepath OR an instance of the area. -//Returns: A list of all atoms (objs, turfs, mobs) in areas of that type of that type in the world. -/proc/get_area_all_atoms(var/areatype) - if(!areatype) return null - if(istext(areatype)) areatype = text2path(areatype) - if(isarea(areatype)) - var/area/areatemp = areatype - areatype = areatemp.type - - var/list/atoms = new/list() - for(var/area/N in all_areas) - if(istype(N, areatype)) - for(var/atom/A in N) - atoms += A - return atoms - -/datum/coords //Simple datum for storing coordinates. - var/x_pos = null - var/y_pos = null - var/z_pos = null - -/area/proc/move_contents_to(var/area/A, var/turftoleave=null, var/direction = null) - //Takes: Area. Optional: turf type to leave behind. - //Returns: Nothing. - //Notes: Attempts to move the contents of one area to another area. - // Movement based on lower left corner. Tiles that do not fit - // into the new area will not be moved. - - if(!A || !src) return 0 - - var/list/turfs_src = get_area_turfs(src.type) - var/list/turfs_trg = get_area_turfs(A.type) - - var/src_min_x = 0 - var/src_min_y = 0 - for (var/turf/T in turfs_src) - if(T.x < src_min_x || !src_min_x) src_min_x = T.x - if(T.y < src_min_y || !src_min_y) src_min_y = T.y - - var/trg_min_x = 0 - var/trg_min_y = 0 - for (var/turf/T in turfs_trg) - if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x - if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y - - var/list/refined_src = new/list() - for(var/turf/T in turfs_src) - refined_src += T - refined_src[T] = new/datum/coords - var/datum/coords/C = refined_src[T] - C.x_pos = (T.x - src_min_x) - C.y_pos = (T.y - src_min_y) - - var/list/refined_trg = new/list() - for(var/turf/T in turfs_trg) - refined_trg += T - refined_trg[T] = new/datum/coords - var/datum/coords/C = refined_trg[T] - C.x_pos = (T.x - trg_min_x) - C.y_pos = (T.y - trg_min_y) - - moving: - for (var/turf/T in refined_src) - var/datum/coords/C_src = refined_src[T] - for (var/turf/B in refined_trg) - var/datum/coords/C_trg = refined_trg[B] - if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) - - //You can stay, though. - if(istype(T,/turf/space)) - refined_src -= T - refined_trg -= B - continue moving - - var/turf/X //New Destination Turf - - //Are we doing shuttlework? Just to save another type check later. - var/shuttlework = 0 - - //Shuttle turfs handle their own fancy moving. - if(istype(T,/turf/simulated/shuttle)) - shuttlework = 1 - var/turf/simulated/shuttle/SS = T - if(!SS.landed_holder) SS.landed_holder = new(turf = SS) - X = SS.landed_holder.land_on(B) - - //Generic non-shuttle turf move. - else - var/old_dir1 = T.dir - var/old_icon_state1 = T.icon_state - var/old_icon1 = T.icon - var/old_underlays = T.underlays.Copy() - var/old_decals = T.decals ? T.decals.Copy() : null - - X = B.ChangeTurf(T.type) - X.set_dir(old_dir1) - X.icon_state = old_icon_state1 - X.icon = old_icon1 - X.copy_overlays(T, TRUE) - X.underlays = old_underlays - X.decals = old_decals - - //Move the air from source to dest - var/turf/simulated/ST = T - if(istype(ST) && ST.zone) - var/turf/simulated/SX = X - if(!SX.air) - SX.make_air() - SX.air.copy_from(ST.zone.air) - ST.zone.remove(ST) - - var/z_level_change = FALSE - if(T.z != X.z) - z_level_change = TRUE - - //Move the objects. Not forceMove because the object isn't "moving" really, it's supposed to be on the "same" turf. - for(var/obj/O in T) - O.loc = X - O.update_light() - if(z_level_change) // The objects still need to know if their z-level changed. - O.onTransitZ(T.z, X.z) - - //Move the mobs unless it's an AI eye or other eye type. - for(var/mob/M in T) - if(istype(M, /mob/observer/eye)) continue // If we need to check for more mobs, I'll add a variable - M.loc = X - - if(z_level_change) // Same goes for mobs. - M.onTransitZ(T.z, X.z) - - if(istype(M, /mob/living)) - var/mob/living/LM = M - LM.check_shadow() // Need to check their Z-shadow, which is normally done in forceMove(). - - if(shuttlework) - var/turf/simulated/shuttle/SS = T - SS.landed_holder.leave_turf() - else if(turftoleave) - T.ChangeTurf(turftoleave) - else - T.ChangeTurf(get_base_turf_by_area(T)) - - refined_src -= T - refined_trg -= B - continue moving - -proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) - if(!original) - return null - - var/obj/O = null - - if(sameloc) - O=new original.type(original.loc) - else - O=new original.type(locate(0,0,0)) - - if(perfectcopy) - if((O) && (original)) - for(var/V in original.vars) - if(!(V in list("type","loc","locs","vars", "parent", "parent_type","verbs","ckey","key"))) - O.vars[V] = original.vars[V] - return O - - -/area/proc/copy_contents_to(var/area/A , var/platingRequired = 0 ) - //Takes: Area. Optional: If it should copy to areas that don't have plating - //Returns: Nothing. - //Notes: Attempts to move the contents of one area to another area. - // Movement based on lower left corner. Tiles that do not fit - // into the new area will not be moved. - - // Does *not* affect gases etc; copied turfs will be changed via ChangeTurf, and the dir, icon, and icon_state copied. All other vars will remain default. - - if(!A || !src) return 0 - - var/list/turfs_src = get_area_turfs(src.type) - var/list/turfs_trg = get_area_turfs(A.type) - - var/src_min_x = 0 - var/src_min_y = 0 - for (var/turf/T in turfs_src) - if(T.x < src_min_x || !src_min_x) src_min_x = T.x - if(T.y < src_min_y || !src_min_y) src_min_y = T.y - - var/trg_min_x = 0 - var/trg_min_y = 0 - for (var/turf/T in turfs_trg) - if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x - if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y - - var/list/refined_src = new/list() - for(var/turf/T in turfs_src) - refined_src += T - refined_src[T] = new/datum/coords - var/datum/coords/C = refined_src[T] - C.x_pos = (T.x - src_min_x) - C.y_pos = (T.y - src_min_y) - - var/list/refined_trg = new/list() - for(var/turf/T in turfs_trg) - refined_trg += T - refined_trg[T] = new/datum/coords - var/datum/coords/C = refined_trg[T] - C.x_pos = (T.x - trg_min_x) - C.y_pos = (T.y - trg_min_y) - - var/list/toupdate = new/list() - - var/copiedobjs = list() - - - moving: - for (var/turf/T in refined_src) - var/datum/coords/C_src = refined_src[T] - for (var/turf/B in refined_trg) - var/datum/coords/C_trg = refined_trg[B] - if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) - - var/old_dir1 = T.dir - var/old_icon_state1 = T.icon_state - var/old_icon1 = T.icon - var/old_overlays = T.overlays.Copy() - var/old_underlays = T.underlays.Copy() - - if(platingRequired) - if(istype(B, get_base_turf_by_area(B))) - continue moving - - var/turf/X = B - X.ChangeTurf(T.type) - X.set_dir(old_dir1) - X.icon_state = old_icon_state1 - X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi - X.overlays = old_overlays - X.underlays = old_underlays - - var/list/objs = new/list() - var/list/newobjs = new/list() - var/list/mobs = new/list() - var/list/newmobs = new/list() - - for(var/obj/O in T) - - if(!istype(O,/obj)) - continue - - objs += O - - - for(var/obj/O in objs) - newobjs += DuplicateObject(O , 1) - - - for(var/obj/O in newobjs) - O.loc = X - - for(var/mob/M in T) - - if(!istype(M,/mob) || istype(M, /mob/observer/eye)) continue // If we need to check for more mobs, I'll add a variable - mobs += M - - for(var/mob/M in mobs) - newmobs += DuplicateObject(M , 1) - - for(var/mob/M in newmobs) - M.loc = X - - copiedobjs += newobjs - copiedobjs += newmobs - -// var/area/AR = X.loc - -// if(AR.dynamic_lighting) -// X.opacity = !X.opacity -// X.sd_SetOpacity(!X.opacity) //TODO: rewrite this code so it's not messed by lighting ~Carn - - toupdate += X - - refined_src -= T - refined_trg -= B - continue moving - - - - - if(toupdate.len) - for(var/turf/simulated/T1 in toupdate) - air_master.mark_for_update(T1) - - return copiedobjs - - - -proc/get_cardinal_dir(atom/A, atom/B) - var/dx = abs(B.x - A.x) - var/dy = abs(B.y - A.y) - return get_dir(A, B) & (rand() * (dx+dy) < dy ? 3 : 12) - -//chances are 1:value. anyprob(1) will always return true -proc/anyprob(value) - return (rand(1,value)==value) - -proc/view_or_range(distance = world.view , center = usr , type) - switch(type) - if("view") - . = view(distance,center) - if("range") - . = range(distance,center) - return - -proc/oview_or_orange(distance = world.view , center = usr , type) - switch(type) - if("view") - . = oview(distance,center) - if("range") - . = orange(distance,center) - return - -proc/get_mob_with_client_list() - var/list/mobs = list() - for(var/mob/M in mob_list) - if (M.client) - mobs += M - return mobs - - -/proc/parse_zone(zone) - if(zone == "r_hand") return "right hand" - else if (zone == "l_hand") return "left hand" - else if (zone == "l_arm") return "left arm" - else if (zone == "r_arm") return "right arm" - else if (zone == "l_leg") return "left leg" - else if (zone == "r_leg") return "right leg" - else if (zone == "l_foot") return "left foot" - else if (zone == "r_foot") return "right foot" - else if (zone == "l_hand") return "left hand" - else if (zone == "r_hand") return "right hand" - else if (zone == "l_foot") return "left foot" - else if (zone == "r_foot") return "right foot" - else return zone - -/proc/get(atom/loc, type) - while(loc) - if(istype(loc, type)) - return loc - loc = loc.loc - return null - -/proc/get_turf_or_move(turf/location) - return get_turf(location) - - -//Quick type checks for some tools -var/global/list/common_tools = list( -/obj/item/stack/cable_coil, -/obj/item/weapon/tool/wrench, -/obj/item/weapon/weldingtool, -/obj/item/weapon/tool/screwdriver, -/obj/item/weapon/tool/wirecutters, -/obj/item/device/multitool, -/obj/item/weapon/tool/crowbar) - -/proc/istool(O) - if(O && is_type_in_list(O, common_tools)) - return 1 - return 0 - - -/proc/is_wire_tool(obj/item/I) - if(istype(I, /obj/item/device/multitool) || I.is_wirecutter()) - return TRUE - if(istype(I, /obj/item/device/assembly/signaler)) - return TRUE - return - -proc/is_hot(obj/item/W as obj) - switch(W.type) - if(/obj/item/weapon/weldingtool) - var/obj/item/weapon/weldingtool/WT = W - if(WT.isOn()) - return 3800 - else - return 0 - if(/obj/item/weapon/flame/lighter) - if(W:lit) - return 1500 - else - return 0 - if(/obj/item/weapon/flame/match) - if(W:lit) - return 1000 - else - return 0 - if(/obj/item/clothing/mask/smokable/cigarette) - if(W:lit) - return 1000 - else - return 0 - if(/obj/item/weapon/pickaxe/plasmacutter) - return 3800 - if(/obj/item/weapon/melee/energy) - return 3500 - else - return 0 - - return 0 - -//Whether or not the given item counts as sharp in terms of dealing damage -/proc/is_sharp(obj/O as obj) - if(!O) - return FALSE - if(O.sharp) - return TRUE - if(O.edge) - return TRUE - return FALSE - -//Whether or not the given item counts as cutting with an edge in terms of removing limbs -/proc/has_edge(obj/O as obj) - if(!O) - return FALSE - if(O.edge) - return TRUE - return FALSE - -//Returns 1 if the given item is capable of popping things like balloons, inflatable barriers, or cutting police tape. -/proc/can_puncture(obj/item/W as obj) // For the record, WHAT THE HELL IS THIS METHOD OF DOING IT? - if(!W) - return FALSE - if(W.sharp) - return TRUE - return ( \ - W.is_screwdriver() || \ - istype(W, /obj/item/weapon/pen) || \ - istype(W, /obj/item/weapon/weldingtool) || \ - istype(W, /obj/item/weapon/flame/lighter/zippo) || \ - istype(W, /obj/item/weapon/flame/match) || \ - istype(W, /obj/item/clothing/mask/smokable/cigarette) || \ - istype(W, /obj/item/weapon/shovel) \ - ) - -/proc/is_surgery_tool(obj/item/W as obj) - return ( \ - istype(W, /obj/item/weapon/surgical/scalpel) || \ - istype(W, /obj/item/weapon/surgical/hemostat) || \ - istype(W, /obj/item/weapon/surgical/retractor) || \ - istype(W, /obj/item/weapon/surgical/cautery) || \ - istype(W, /obj/item/weapon/surgical/bonegel) || \ - istype(W, /obj/item/weapon/surgical/bonesetter) - ) - -// check if mob is lying down on something we can operate him on. -// The RNG with table/rollerbeds comes into play in do_surgery() so that fail_step() can be used instead. -/proc/can_operate(mob/living/carbon/M) - return M.lying - -// Returns an instance of a valid surgery surface. -/mob/living/proc/get_surgery_surface() - if(!lying) - return null // Not lying down means no surface. - var/obj/surface = null - for(var/obj/O in loc) // Looks for the best surface. - if(O.surgery_odds) - if(!surface || surface.surgery_odds < O) - surface = O - if(surface) - return surface - -/proc/reverse_direction(var/dir) - switch(dir) - if(NORTH) - return SOUTH - if(NORTHEAST) - return SOUTHWEST - if(EAST) - return WEST - if(SOUTHEAST) - return NORTHWEST - if(SOUTH) - return NORTH - if(SOUTHWEST) - return NORTHEAST - if(WEST) - return EAST - if(NORTHWEST) - return SOUTHEAST - -/* -Checks if that loc and dir has a item on the wall -TODO - Fix this ancient list of wall items. Preferably make it dynamically populated. ~Leshana -*/ -var/list/WALLITEMS = list( - /obj/machinery/power/apc, /obj/machinery/alarm, /obj/item/device/radio/intercom, /obj/structure/frame, - /obj/structure/extinguisher_cabinet, /obj/structure/reagent_dispensers/peppertank, - /obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/light_switch, /obj/structure/sign, - /obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/button/remote, - /obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio, - /obj/item/weapon/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth, - /obj/structure/mirror, /obj/structure/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment - ) -/proc/gotwallitem(loc, dir) - for(var/obj/O in loc) - for(var/item in WALLITEMS) - if(istype(O, item)) - //Direction works sometimes - if(O.dir == dir) - return 1 - - //Some stuff doesn't use dir properly, so we need to check pixel instead - switch(dir) - if(SOUTH) - if(O.pixel_y > 10) - return 1 - if(NORTH) - if(O.pixel_y < -10) - return 1 - if(WEST) - if(O.pixel_x > 10) - return 1 - if(EAST) - if(O.pixel_x < -10) - return 1 - - - //Some stuff is placed directly on the wallturf (signs) - for(var/obj/O in get_step(loc, dir)) - for(var/item in WALLITEMS) - if(istype(O, item)) - if(O.pixel_x == 0 && O.pixel_y == 0) - return 1 - return 0 - -/proc/format_text(text) - return replacetext(replacetext(text,"\proper ",""),"\improper ","") - -/proc/topic_link(var/datum/D, var/arglist, var/content) - if(istype(arglist,/list)) - arglist = list2params(arglist) - return "[content]" - -/proc/get_random_colour(var/simple, var/lower=0, var/upper=255) - var/colour - if(simple) - colour = pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF")) - else - for(var/i=1;i<=3;i++) - var/temp_col = "[num2hex(rand(lower,upper))]" - if(length(temp_col )<2) - temp_col = "0[temp_col]" - colour += temp_col - return colour - -var/mob/dview/dview_mob = new - -//Version of view() which ignores darkness, because BYOND doesn't have it. -/proc/dview(var/range = world.view, var/center, var/invis_flags = 0) - if(!center) - return - - dview_mob.loc = center - - dview_mob.see_invisible = invis_flags - - . = view(range, dview_mob) - dview_mob.loc = null - -/mob/dview - invisibility = 101 - density = 0 - - anchored = 1 - simulated = 0 - - see_in_dark = 1e6 - -/atom/proc/get_light_and_color(var/atom/origin) - if(origin) - color = origin.color - set_light(origin.light_range, origin.light_power, origin.light_color) - -/mob/dview/New() - ..() - // We don't want to be in any mob lists; we're a dummy not a mob. - mob_list -= src - if(stat == DEAD) - dead_mob_list -= src - else - living_mob_list -= src - -/mob/dview/Destroy(var/force) - crash_with("Attempt to delete the dview_mob: [log_info_line(src)]") - if (!force) - return QDEL_HINT_LETMELIVE - global.dview_mob = new - return ..() - -// call to generate a stack trace and print to runtime logs -/proc/crash_with(msg) - CRASH(msg) - -/proc/screen_loc2turf(scr_loc, turf/origin) - var/tX = splittext(scr_loc, ",") - var/tY = splittext(tX[2], ":") - var/tZ = origin.z - tY = tY[1] - tX = splittext(tX[1], ":") - tX = tX[1] - tX = max(1, min(world.maxx, origin.x + (text2num(tX) - (world.view + 1)))) - tY = max(1, min(world.maxy, origin.y + (text2num(tY) - (world.view + 1)))) - return locate(tX, tY, tZ) - -// Displays something as commonly used (non-submultiples) SI units. -/proc/format_SI(var/number, var/symbol) - switch(round(abs(number))) - if(0 to 1000-1) - return "[number] [symbol]" - if(1e3 to 1e6-1) - return "[round(number / 1000, 0.1)] k[symbol]" // kilo - if(1e6 to 1e9-1) - return "[round(number / 1e6, 0.1)] M[symbol]" // mega - if(1e9 to 1e12-1) // Probably not needed but why not be complete? - return "[round(number / 1e9, 0.1)] G[symbol]" // giga - if(1e12 to 1e15-1) - return "[round(number / 1e12, 0.1)] T[symbol]" // tera - - - -//ultra range (no limitations on distance, faster than range for distances > 8); including areas drastically decreases performance -/proc/urange(dist=0, atom/center=usr, orange=0, areas=0) - if(!dist) - if(!orange) - return list(center) - else - return list() - - var/list/turfs = RANGE_TURFS(dist, center) - if(orange) - turfs -= get_turf(center) - . = list() - for(var/V in turfs) - var/turf/T = V - . += T - . += T.contents - if(areas) - . |= T.loc - -#define NOT_FLAG(flag) (!(flag & use_flags)) -#define HAS_FLAG(flag) (flag & use_flags) - -// Checks if user can use this object. Set use_flags to customize what checks are done. -// Returns 0 if they can use it, a value representing why they can't if not. -// Flags are in `code/__defines/misc.dm` -/atom/proc/use_check(mob/user, use_flags = 0, show_messages = FALSE) - . = 0 - if (NOT_FLAG(USE_ALLOW_NONLIVING) && !isliving(user)) - // No message for ghosts. - return USE_FAIL_NONLIVING - - if (NOT_FLAG(USE_ALLOW_NON_ADJACENT) && !Adjacent(user)) - if (show_messages) - to_chat(user, span("notice","You're too far away from [src] to do that.")) - return USE_FAIL_NON_ADJACENT - - if (NOT_FLAG(USE_ALLOW_DEAD) && user.stat == DEAD) - if (show_messages) - to_chat(user, span("notice","You can't do that when you're dead.")) - return USE_FAIL_DEAD - - if (NOT_FLAG(USE_ALLOW_INCAPACITATED) && (user.incapacitated())) - if (show_messages) - to_chat(user, span("notice","You cannot do that in your current state.")) - return USE_FAIL_INCAPACITATED - - if (NOT_FLAG(USE_ALLOW_NON_ADV_TOOL_USR) && !user.IsAdvancedToolUser()) - if (show_messages) - to_chat(user, span("notice","You don't know how to operate [src].")) - return USE_FAIL_NON_ADV_TOOL_USR - - if (HAS_FLAG(USE_DISALLOW_SILICONS) && issilicon(user)) - if (show_messages) - to_chat(user, span("notice","You need hands for that.")) - return USE_FAIL_IS_SILICON - - if (HAS_FLAG(USE_FORCE_SRC_IN_USER) && !(src in user)) - if (show_messages) - to_chat(user, span("notice","You need to be holding [src] to do that.")) - return USE_FAIL_NOT_IN_USER - -#undef NOT_FLAG -#undef HAS_FLAG - -//datum may be null, but it does need to be a typed var -#define NAMEOF(datum, X) (#X || ##datum.##X) - -#define VARSET_LIST_CALLBACK(target, var_name, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, ##target, ##var_name, ##var_value) -//dupe code because dm can't handle 3 level deep macros -#define VARSET_CALLBACK(datum, var, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, ##datum, NAMEOF(##datum, ##var), ##var_value) - -/proc/___callbackvarset(list_or_datum, var_name, var_value) - if(length(list_or_datum)) - list_or_datum[var_name] = var_value - return - var/datum/D = list_or_datum - D.vars[var_name] = var_value - -// Returns direction-string, rounded to multiples of 22.5, from the first parameter to the second -// N, NNE, NE, ENE, E, ESE, SE, SSE, S, SSW, SW, WSW, W, WNW, NW, NNW -/proc/get_adir(var/turf/A, var/turf/B) - var/degree = Get_Angle(A, B) - switch(round(degree%360, 22.5)) - if(0) - return "North" - if(22.5) - return "North-Northeast" - if(45) - return "Northeast" - if(67.5) - return "East-Northeast" - if(90) - return "East" - if(112.5) - return "East-Southeast" - if(135) - return "Southeast" - if(157.5) - return "South-Southeast" - if(180) - return "South" - if(202.5) - return "South-Southwest" - if(225) - return "Southwest" - if(247.5) - return "West-Southwest" - if(270) - return "West" - if(292.5) - return "West-Northwest" - if(315) - return "Northwest" - if(337.5) - return "North-Northwest" - -/proc/pass() - return - -#define NAMEOF(datum, X) (#X || ##datum.##X) - -/proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) - if (value == FALSE) //nothing should be calling us with a number, so this is safe - value = input("Enter type to find (blank for all, cancel to cancel)", "Search for type") as null|text - if (isnull(value)) - return - value = trim(value) - if(!isnull(value) && value != "") - matches = filter_fancy_list(matches, value) - - if(matches.len==0) - return - - var/chosen - if(matches.len==1) - chosen = matches[1] - else - chosen = input("Select a type", "Pick Type", matches[1]) as null|anything in matches - if(!chosen) - return - chosen = matches[chosen] - return chosen - -/proc/get_fancy_list_of_atom_types() - var/static/list/pre_generated_list - if (!pre_generated_list) //init - pre_generated_list = make_types_fancy(typesof(/atom)) - return pre_generated_list - -/proc/get_fancy_list_of_datum_types() - var/static/list/pre_generated_list - if (!pre_generated_list) //init - pre_generated_list = make_types_fancy(sortList(typesof(/datum) - typesof(/atom))) - return pre_generated_list - -/proc/filter_fancy_list(list/L, filter as text) - var/list/matches = new - for(var/key in L) - var/value = L[key] - if(findtext("[key]", filter) || findtext("[value]", filter)) - matches[key] = value - return matches - -/proc/make_types_fancy(var/list/types) - if (ispath(types)) - types = list(types) - . = list() - for(var/type in types) - var/typename = "[type]" - var/static/list/TYPES_SHORTCUTS = list( - /obj/effect/decal/cleanable = "CLEANABLE", - /obj/item/device/radio/headset = "HEADSET", - /obj/item/clothing/head/helmet/space = "SPESSHELMET", - /obj/item/weapon/book/manual = "MANUAL", - /obj/item/weapon/reagent_containers/food/drinks = "DRINK", - /obj/item/weapon/reagent_containers/food = "FOOD", - /obj/item/weapon/reagent_containers = "REAGENT_CONTAINERS", - /obj/machinery/atmospherics = "ATMOS_MECH", - /obj/machinery/portable_atmospherics = "PORT_ATMOS", - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack = "MECHA_MISSILE_RACK", - /obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP", - /obj/item/organ = "ORGAN", - /obj/item = "ITEM", - /obj/machinery = "MACHINERY", - /obj/effect = "EFFECT", - /obj = "O", - /datum = "D", - /turf/simulated/wall = "S-WALL", - /turf/simulated/floor = "S-FLOOR", - /turf/simulated = "SIMULATED", - /turf/unsimulated/wall = "US-WALL", - /turf/unsimulated/floor = "US-FLOOR", - /turf/unsimulated = "UNSIMULATED", - /turf = "T", - /mob/living/carbon = "CARBON", - /mob/living/simple_mob = "SIMPLE", - /mob/living = "LIVING", - /mob = "M" - ) - for (var/tn in TYPES_SHORTCUTS) - if (copytext(typename,1, length("[tn]/")+1)=="[tn]/" /*findtextEx(typename,"[tn]/",1,2)*/ ) - typename = TYPES_SHORTCUTS[tn]+copytext(typename,length("[tn]/")) - break - .[typename] = type - -/proc/IsValidSrc(datum/D) - if(istype(D)) - return !QDELETED(D) - return FALSE - -//gives us the stack trace from CRASH() without ending the current proc. -/proc/stack_trace(msg) - CRASH(msg) - -/datum/proc/stack_trace(msg) - CRASH(msg) - -// \ref behaviour got changed in 512 so this is necesary to replicate old behaviour. -// If it ever becomes necesary to get a more performant REF(), this lies here in wait -// #define REF(thing) (thing && istype(thing, /datum) && (thing:datum_flags & DF_USE_TAG) && thing:tag ? "[thing:tag]" : "\ref[thing]") -/proc/REF(input) - if(istype(input, /datum)) - var/datum/thing = input - if(thing.datum_flags & DF_USE_TAG) - if(!thing.tag) - thing.datum_flags &= ~DF_USE_TAG - stack_trace("A ref was requested of an object with DF_USE_TAG set but no tag: [thing]") - else - return "\[[url_encode(thing.tag)]\]" - return "\ref[input]" - -// Painlessly creates an element. -// First argument is where to send the Topic call to when clicked. Should be a reference to an object. This is generally src, but not always. -// Second one is for all the params that will be sent. Uses an assoc list (e.g. "value" = "5"). -// Note that object refs will be converted to text, as if \ref[thing] was done. To get the ref back on Topic() side, you will need to use locate(). -// Third one is the text that will be clickable. -/proc/href(href_src, list/href_params, href_text) +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 + +/* + * A large number of misc global procs. + */ + +//Checks if all high bits in req_mask are set in bitfield +#define BIT_TEST_ALL(bitfield, req_mask) ((~(bitfield) & (req_mask)) == 0) + +//supposedly the fastest way to do this according to https://gist.github.com/Giacom/be635398926bb463b42a +#define RANGE_TURFS(RADIUS, CENTER) \ + block( \ + locate(max(CENTER.x-(RADIUS),1), max(CENTER.y-(RADIUS),1), CENTER.z), \ + locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \ + ) + +//Inverts the colour of an HTML string +/proc/invertHTML(HTMLstring) + + if (!( istext(HTMLstring) )) + CRASH("Given non-text argument!") + return + else + if (length(HTMLstring) != 7) + CRASH("Given non-HTML argument!") + return + var/textr = copytext(HTMLstring, 2, 4) + var/textg = copytext(HTMLstring, 4, 6) + var/textb = copytext(HTMLstring, 6, 8) + var/r = hex2num(textr) + var/g = hex2num(textg) + var/b = hex2num(textb) + textr = num2hex(255 - r) + textg = num2hex(255 - g) + textb = num2hex(255 - b) + if (length(textr) < 2) + textr = text("0[]", textr) + if (length(textg) < 2) + textr = text("0[]", textg) + if (length(textb) < 2) + textr = text("0[]", textb) + return text("#[][][]", textr, textg, textb) + return + +//Returns the middle-most value +/proc/dd_range(var/low, var/high, var/num) + return max(low,min(high,num)) + +//Returns whether or not A is the middle most value +/proc/InRange(var/A, var/lower, var/upper) + if(A < lower) return 0 + if(A > upper) return 0 + return 1 + + +/proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams. + if(!start || !end) return 0 + var/dy + var/dx + dy=(32*end.y+end.pixel_y)-(32*start.y+start.pixel_y) + dx=(32*end.x+end.pixel_x)-(32*start.x+start.pixel_x) + if(!dy) + return (dx>=0)?90:270 + .=arctan(dx/dy) + if(dy<0) + .+=180 + else if(dx<0) + .+=360 + +//Returns location. Returns null if no location was found. +/proc/get_teleport_loc(turf/location,mob/target,distance = 1, density = 0, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0) +/* +Location where the teleport begins, target that will teleport, distance to go, density checking 0/1(yes/no). +Random error in tile placement x, error in tile placement y, and block offset. +Block offset tells the proc how to place the box. Behind teleport location, relative to starting location, forward, etc. +Negative values for offset are accepted, think of it in relation to North, -x is west, -y is south. Error defaults to positive. +Turf and target are seperate in case you want to teleport some distance from a turf the target is not standing on or something. +*/ + + var/dirx = 0//Generic location finding variable. + var/diry = 0 + + var/xoffset = 0//Generic counter for offset location. + var/yoffset = 0 + + var/b1xerror = 0//Generic placing for point A in box. The lower left. + var/b1yerror = 0 + var/b2xerror = 0//Generic placing for point B in box. The upper right. + var/b2yerror = 0 + + errorx = abs(errorx)//Error should never be negative. + errory = abs(errory) + //var/errorxy = round((errorx+errory)/2)//Used for diagonal boxes. + + switch(target.dir)//This can be done through equations but switch is the simpler method. And works fast to boot. + //Directs on what values need modifying. + if(1)//North + diry+=distance + yoffset+=eoffsety + xoffset+=eoffsetx + b1xerror-=errorx + b1yerror-=errory + b2xerror+=errorx + b2yerror+=errory + if(2)//South + diry-=distance + yoffset-=eoffsety + xoffset+=eoffsetx + b1xerror-=errorx + b1yerror-=errory + b2xerror+=errorx + b2yerror+=errory + if(4)//East + dirx+=distance + yoffset+=eoffsetx//Flipped. + xoffset+=eoffsety + b1xerror-=errory//Flipped. + b1yerror-=errorx + b2xerror+=errory + b2yerror+=errorx + if(8)//West + dirx-=distance + yoffset-=eoffsetx//Flipped. + xoffset+=eoffsety + b1xerror-=errory//Flipped. + b1yerror-=errorx + b2xerror+=errory + b2yerror+=errorx + + var/turf/destination=locate(location.x+dirx,location.y+diry,location.z) + + if(destination)//If there is a destination. + if(errorx||errory)//If errorx or y were specified. + var/destination_list[] = list()//To add turfs to list. + //destination_list = new() + /*This will draw a block around the target turf, given what the error is. + Specifying the values above will basically draw a different sort of block. + If the values are the same, it will be a square. If they are different, it will be a rectengle. + In either case, it will center based on offset. Offset is position from center. + Offset always calculates in relation to direction faced. In other words, depending on the direction of the teleport, + the offset should remain positioned in relation to destination.*/ + + var/turf/center = locate((destination.x+xoffset),(destination.y+yoffset),location.z)//So now, find the new center. + + //Now to find a box from center location and make that our destination. + for(var/turf/T in block(locate(center.x+b1xerror,center.y+b1yerror,location.z), locate(center.x+b2xerror,center.y+b2yerror,location.z) )) + if(density&&(T.density||T.contains_dense_objects())) continue//If density was specified. + if(T.x>world.maxx || T.x<1) continue//Don't want them to teleport off the map. + if(T.y>world.maxy || T.y<1) continue + destination_list += T + if(destination_list.len) + destination = pick(destination_list) + else return + + else//Same deal here. + if(density&&(destination.density||destination.contains_dense_objects())) return + if(destination.x>world.maxx || destination.x<1) return + if(destination.y>world.maxy || destination.y<1) return + else return + + return destination + + + +/proc/LinkBlocked(turf/A, turf/B) + if(A == null || B == null) return 1 + var/adir = get_dir(A,B) + var/rdir = get_dir(B,A) + if((adir & (NORTH|SOUTH)) && (adir & (EAST|WEST))) // diagonal + var/iStep = get_step(A,adir&(NORTH|SOUTH)) + if(!LinkBlocked(A,iStep) && !LinkBlocked(iStep,B)) return 0 + + var/pStep = get_step(A,adir&(EAST|WEST)) + if(!LinkBlocked(A,pStep) && !LinkBlocked(pStep,B)) return 0 + return 1 + + if(DirBlocked(A,adir)) return 1 + if(DirBlocked(B,rdir)) return 1 + return 0 + + +/proc/DirBlocked(turf/loc,var/dir) + for(var/obj/structure/window/D in loc) + if(!D.density) continue + if(D.dir == SOUTHWEST) return 1 + if(D.dir == dir) return 1 + + for(var/obj/machinery/door/D in loc) + if(!D.density) continue + if(istype(D, /obj/machinery/door/window)) + if((dir & SOUTH) && (D.dir & (EAST|WEST))) return 1 + if((dir & EAST ) && (D.dir & (NORTH|SOUTH))) return 1 + else return 1 // it's a real, air blocking door + return 0 + +/proc/TurfBlockedNonWindow(turf/loc) + for(var/obj/O in loc) + if(O.density && !istype(O, /obj/structure/window)) + return 1 + return 0 + +/proc/sign(x) + return x!=0?x/abs(x):0 + +/proc/getline(atom/M,atom/N)//Ultra-Fast Bresenham Line-Drawing Algorithm + var/px=M.x //starting x + var/py=M.y + var/line[] = list(locate(px,py,M.z)) + var/dx=N.x-px //x distance + var/dy=N.y-py + var/dxabs=abs(dx)//Absolute value of x distance + var/dyabs=abs(dy) + var/sdx=sign(dx) //Sign of x distance (+ or -) + var/sdy=sign(dy) + var/x=dxabs>>1 //Counters for steps taken, setting to distance/2 + var/y=dyabs>>1 //Bit-shifting makes me l33t. It also makes getline() unnessecarrily fast. + var/j //Generic integer for counting + if(dxabs>=dyabs) //x distance is greater than y + for(j=0;j=dxabs) //Every dyabs steps, step once in y direction + y-=dxabs + py+=sdy + px+=sdx //Step on in x direction + line+=locate(px,py,M.z)//Add the turf to the list + else + for(j=0;j=dyabs) + x-=dyabs + px+=sdx + py+=sdy + line+=locate(px,py,M.z) + return line + +#define LOCATE_COORDS(X, Y, Z) locate(between(1, X, world.maxx), between(1, Y, world.maxy), Z) +/proc/getcircle(turf/center, var/radius) //Uses a fast Bresenham rasterization algorithm to return the turfs in a thin circle. + if(!radius) return list(center) + + var/x = 0 + var/y = radius + var/p = 3 - 2 * radius + + . = list() + while(y >= x) // only formulate 1/8 of circle + + . += LOCATE_COORDS(center.x - x, center.y - y, center.z) //upper left left + . += LOCATE_COORDS(center.x - y, center.y - x, center.z) //upper upper left + . += LOCATE_COORDS(center.x + y, center.y - x, center.z) //upper upper right + . += LOCATE_COORDS(center.x + x, center.y - y, center.z) //upper right right + . += LOCATE_COORDS(center.x - x, center.y + y, center.z) //lower left left + . += LOCATE_COORDS(center.x - y, center.y + x, center.z) //lower lower left + . += LOCATE_COORDS(center.x + y, center.y + x, center.z) //lower lower right + . += LOCATE_COORDS(center.x + x, center.y + y, center.z) //lower right right + + if(p < 0) + p += 4*x++ + 6; + else + p += 4*(x++ - y--) + 10; + +#undef LOCATE_COORDS + +//Returns whether or not a player is a guest using their ckey as an input +/proc/IsGuestKey(key) + if (findtext(key, "Guest-", 1, 7) != 1) //was findtextEx + return 0 + + var/i = 7, ch, len = length(key) + + if(copytext(key, 7, 8) == "W") //webclient + i++ + + for (, i <= len, ++i) + ch = text2ascii(key, i) + if (ch < 48 || ch > 57) + return 0 + return 1 + +//Ensure the frequency is within bounds of what it should be sending/recieving at +/proc/sanitize_frequency(var/f, var/low = PUBLIC_LOW_FREQ, var/high = PUBLIC_HIGH_FREQ) + f = round(f) + f = max(low, f) + f = min(high, f) + if ((f % 2) == 0) //Ensure the last digit is an odd number + f += 1 + return f + +//Turns 1479 into 147.9 +/proc/format_frequency(var/f) + return "[round(f / 10)].[f % 10]" + + + +//This will update a mob's name, real_name, mind.name, data_core records, pda and id +//Calling this proc without an oldname will only update the mob and skip updating the pda, id and records ~Carn +/mob/proc/fully_replace_character_name(var/oldname,var/newname) + if(!newname) return 0 + real_name = newname + name = newname + if(mind) + mind.name = newname + if(dna) + dna.real_name = real_name + + if(oldname) + //update the datacore records! This is goig to be a bit costly. + for(var/list/L in list(data_core.general,data_core.medical,data_core.security,data_core.locked)) + for(var/datum/data/record/R in L) + if(R.fields["name"] == oldname) + R.fields["name"] = newname + break + + //update our pda and id if we have them on our person + var/list/searching = GetAllContents(searchDepth = 3) + var/search_id = 1 + var/search_pda = 1 + + for(var/A in searching) + if( search_id && istype(A,/obj/item/weapon/card/id) ) + var/obj/item/weapon/card/id/ID = A + if(ID.registered_name == oldname) + ID.registered_name = newname + ID.name = "[newname]'s ID Card ([ID.assignment])" + if(!search_pda) break + search_id = 0 + + else if( search_pda && istype(A,/obj/item/device/pda) ) + var/obj/item/device/pda/PDA = A + if(PDA.owner == oldname) + PDA.owner = newname + PDA.name = "PDA-[newname] ([PDA.ownjob])" + if(!search_id) break + search_pda = 0 + return 1 + + + +//Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame() +//Last modified by Carn +/mob/proc/rename_self(var/role, var/allow_numbers=0) + spawn(0) + var/oldname = real_name + + var/time_passed = world.time + var/newname + + for(var/i=1,i<=3,i++) //we get 3 attempts to pick a suitable name. + newname = input(src,"You are \a [role]. Would you like to change your name to something else?", "Name change",oldname) as text + if((world.time-time_passed)>3000) + return //took too long + newname = sanitizeName(newname, ,allow_numbers) //returns null if the name doesn't meet some basic requirements. Tidies up a few other things like bad-characters. + + for(var/mob/living/M in player_list) + if(M == src) + continue + if(!newname || M.real_name == newname) + newname = null + break + if(newname) + break //That's a suitable name! + to_chat(src, "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken.") + + if(!newname) //we'll stick with the oldname then + return + + if(cmptext("ai",role)) + if(isAI(src)) + var/mob/living/silicon/ai/A = src + oldname = null//don't bother with the records update crap + //to_world("[newname] is the AI!") + //world << sound('sound/AI/newAI.ogg') + // Set eyeobj name + A.SetName(newname) + + + fully_replace_character_name(oldname,newname) + + + +//Picks a string of symbols to display as the law number for hacked or ion laws +/proc/ionnum() + return "[pick("1","2","3","4","5","6","7","8","9","0")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")]" + +//When an AI is activated, it can choose from a list of non-slaved borgs to have as a slave. +/proc/freeborg() + var/select = null + var/list/borgs = list() + for (var/mob/living/silicon/robot/A in player_list) + if (A.stat == 2 || A.connected_ai || A.scrambledcodes || istype(A,/mob/living/silicon/robot/drone)) + continue + var/name = "[A.real_name] ([A.modtype] [A.braintype])" + borgs[name] = A + + if (borgs.len) + select = input("Unshackled borg signals detected:", "Borg selection", null, null) as null|anything in borgs + return borgs[select] + +//When a borg is activated, it can choose which AI it wants to be slaved to +/proc/active_ais() + . = list() + for(var/mob/living/silicon/ai/A in living_mob_list) + if(A.stat == DEAD) + continue + if(A.control_disabled == 1) + continue + . += A + return . + +//Find an active ai with the least borgs. VERBOSE PROCNAME HUH! +/proc/select_active_ai_with_fewest_borgs() + var/mob/living/silicon/ai/selected + var/list/active = active_ais() + for(var/mob/living/silicon/ai/A in active) + if(!selected || (selected.connected_robots.len > A.connected_robots.len)) + selected = A + + return selected + +/proc/select_active_ai(var/mob/user) + var/list/ais = active_ais() + if(ais.len) + if(user) . = input(usr,"AI signals detected:", "AI selection") in ais + else . = pick(ais) + return . + +/proc/get_sorted_mobs() + var/list/old_list = getmobs() + var/list/AI_list = list() + var/list/Dead_list = list() + var/list/keyclient_list = list() + var/list/key_list = list() + var/list/logged_list = list() + for(var/named in old_list) + var/mob/M = old_list[named] + if(issilicon(M)) + AI_list |= M + else if(isobserver(M) || M.stat == 2) + Dead_list |= M + else if(M.key && M.client) + keyclient_list |= M + else if(M.key) + key_list |= M + else + logged_list |= M + old_list.Remove(named) + var/list/new_list = list() + new_list += AI_list + new_list += keyclient_list + new_list += key_list + new_list += logged_list + new_list += Dead_list + return new_list + +//Returns a list of all mobs with their name +/proc/getmobs() + + var/list/mobs = sortmobs() + var/list/names = list() + var/list/creatures = list() + var/list/namecounts = list() + for(var/mob/M in mobs) + var/name = M.name + if (name in names) + namecounts[name]++ + name = "[name] ([namecounts[name]])" + else + names.Add(name) + namecounts[name] = 1 + if (M.real_name && M.real_name != M.name) + name += " \[[M.real_name]\]" + if (M.stat == 2) + if(istype(M, /mob/observer/dead/)) + name += " \[ghost\]" + else + name += " \[dead\]" + creatures[name] = M + + return creatures + +//Orders mobs by type then by name +/proc/sortmobs() + var/list/moblist = list() + var/list/sortmob = sortAtom(mob_list) + for(var/mob/observer/eye/M in sortmob) + moblist.Add(M) + for(var/mob/observer/blob/M in sortmob) + moblist.Add(M) + for(var/mob/living/silicon/ai/M in sortmob) + moblist.Add(M) + for(var/mob/living/silicon/pai/M in sortmob) + moblist.Add(M) + for(var/mob/living/silicon/robot/M in sortmob) + moblist.Add(M) + for(var/mob/living/carbon/human/M in sortmob) + moblist.Add(M) + for(var/mob/living/carbon/brain/M in sortmob) + moblist.Add(M) + for(var/mob/living/carbon/alien/M in sortmob) + moblist.Add(M) + for(var/mob/observer/dead/M in sortmob) + moblist.Add(M) + for(var/mob/new_player/M in sortmob) + moblist.Add(M) + for(var/mob/living/simple_mob/M in sortmob) + moblist.Add(M) +// for(var/mob/living/silicon/hivebot/M in sortmob) +// mob_list.Add(M) +// for(var/mob/living/silicon/hive_mainframe/M in sortmob) +// mob_list.Add(M) + return moblist + +// Format a power value in W, kW, MW, or GW. +/proc/DisplayPower(powerused) + if(powerused < 1000) //Less than a kW + return "[powerused] W" + else if(powerused < 1000000) //Less than a MW + return "[round((powerused * 0.001),0.01)] kW" + else if(powerused < 1000000000) //Less than a GW + return "[round((powerused * 0.000001),0.001)] MW" + return "[round((powerused * 0.000000001),0.0001)] GW" + +/proc/get_mob_by_ckey(key) + if(!key) + return + var/list/mobs = sortmobs() + for(var/mob/M in mobs) + if(M.ckey == key) + return M + +//Forces a variable to be posative +/proc/modulus(var/M) + if(M >= 0) + return M + if(M < 0) + return -M + +// returns the turf located at the map edge in the specified direction relative to A +// used for mass driver +/proc/get_edge_target_turf(var/atom/A, var/direction) + + var/turf/target = locate(A.x, A.y, A.z) + if(!A || !target) + return 0 + //since NORTHEAST == NORTH & EAST, etc, doing it this way allows for diagonal mass drivers in the future + //and isn't really any more complicated + + // Note diagonal directions won't usually be accurate + if(direction & NORTH) + target = locate(target.x, world.maxy, target.z) + if(direction & SOUTH) + target = locate(target.x, 1, target.z) + if(direction & EAST) + target = locate(world.maxx, target.y, target.z) + if(direction & WEST) + target = locate(1, target.y, target.z) + + return target + +// returns turf relative to A in given direction at set range +// result is bounded to map size +// note range is non-pythagorean +// used for disposal system +/proc/get_ranged_target_turf(var/atom/A, var/direction, var/range) + + var/x = A.x + var/y = A.y + if(direction & NORTH) + y = min(world.maxy, y + range) + if(direction & SOUTH) + y = max(1, y - range) + if(direction & EAST) + x = min(world.maxx, x + range) + if(direction & WEST) + x = max(1, x - range) + + return locate(x,y,A.z) + + +// returns turf relative to A offset in dx and dy tiles +// bound to map limits +/proc/get_offset_target_turf(var/atom/A, var/dx, var/dy) + var/x = min(world.maxx, max(1, A.x + dx)) + var/y = min(world.maxy, max(1, A.y + dy)) + return locate(x,y,A.z) + +//Makes sure MIDDLE is between LOW and HIGH. If not, it adjusts it. Returns the adjusted value. +/proc/between(var/low, var/middle, var/high) + return max(min(middle, high), low) + +//returns random gauss number +proc/GaussRand(var/sigma) + var/x,y,rsq + do + x=2*rand()-1 + y=2*rand()-1 + rsq=x*x+y*y + while(rsq>1 || !rsq) + return sigma*y*sqrt(-2*log(rsq)/rsq) + +//returns random gauss number, rounded to 'roundto' +proc/GaussRandRound(var/sigma,var/roundto) + return round(GaussRand(sigma),roundto) + +//Will return the contents of an atom recursivly to a depth of 'searchDepth' +/atom/proc/GetAllContents(searchDepth = 5) + var/list/toReturn = list() + + for(var/atom/part in contents) + toReturn += part + if(part.contents.len && searchDepth) + toReturn += part.GetAllContents(searchDepth - 1) + + return toReturn + +//Step-towards method of determining whether one atom can see another. Similar to viewers() +/proc/can_see(var/atom/source, var/atom/target, var/length=5) // I couldn't be arsed to do actual raycasting :I This is horribly inaccurate. + var/turf/current = get_turf(source) + var/turf/target_turf = get_turf(target) + var/steps = 0 + + if(!current || !target_turf) + return 0 + + while(current != target_turf) + if(steps > length) return 0 + if(current.opacity) return 0 + for(var/atom/A in current) + if(A.opacity) return 0 + current = get_step_towards(current, target_turf) + steps++ + + return 1 + +/proc/is_blocked_turf(var/turf/T) + var/cant_pass = 0 + if(T.density) cant_pass = 1 + for(var/atom/A in T) + if(A.density)//&&A.anchored + cant_pass = 1 + return cant_pass + +/proc/get_step_towards2(var/atom/ref , var/atom/trg) + var/base_dir = get_dir(ref, get_step_towards(ref,trg)) + var/turf/temp = get_step_towards(ref,trg) + + if(is_blocked_turf(temp)) + var/dir_alt1 = turn(base_dir, 90) + var/dir_alt2 = turn(base_dir, -90) + var/turf/turf_last1 = temp + var/turf/turf_last2 = temp + var/free_tile = null + var/breakpoint = 0 + + while(!free_tile && breakpoint < 10) + if(!is_blocked_turf(turf_last1)) + free_tile = turf_last1 + break + if(!is_blocked_turf(turf_last2)) + free_tile = turf_last2 + break + turf_last1 = get_step(turf_last1,dir_alt1) + turf_last2 = get_step(turf_last2,dir_alt2) + breakpoint++ + + if(!free_tile) return get_step(ref, base_dir) + else return get_step_towards(ref,free_tile) + + else return get_step(ref, base_dir) + +//Takes: Anything that could possibly have variables and a varname to check. +//Returns: 1 if found, 0 if not. +/proc/hasvar(var/datum/A, var/varname) + if(A.vars.Find(lowertext(varname))) return 1 + else return 0 + +//Returns: all the areas in the world +/proc/return_areas() + var/list/area/areas = list() + for(var/area/A in all_areas) + areas += A + return areas + +//Returns: all the areas in the world, sorted. +/proc/return_sorted_areas() + return sortAtom(return_areas()) + +//Takes: Area type as text string or as typepath OR an instance of the area. +//Returns: A list of all areas of that type in the world. +/proc/get_areas(var/areatype) + if(!areatype) return null + if(istext(areatype)) areatype = text2path(areatype) + if(isarea(areatype)) + var/area/areatemp = areatype + areatype = areatemp.type + + var/list/areas = new/list() + for(var/area/N in all_areas) + if(istype(N, areatype)) areas += N + return areas + +//Takes: Area type as text string or as typepath OR an instance of the area. +//Returns: A list of all turfs in areas of that type of that type in the world. +/proc/get_area_turfs(var/areatype) + if(!areatype) return null + if(istext(areatype)) areatype = text2path(areatype) + if(isarea(areatype)) + var/area/areatemp = areatype + areatype = areatemp.type + + var/list/turfs = new/list() + for(var/area/N in all_areas) + if(istype(N, areatype)) + for(var/turf/T in N) turfs += T + return turfs + +//Takes: Area type as text string or as typepath OR an instance of the area. +//Returns: A list of all atoms (objs, turfs, mobs) in areas of that type of that type in the world. +/proc/get_area_all_atoms(var/areatype) + if(!areatype) return null + if(istext(areatype)) areatype = text2path(areatype) + if(isarea(areatype)) + var/area/areatemp = areatype + areatype = areatemp.type + + var/list/atoms = new/list() + for(var/area/N in all_areas) + if(istype(N, areatype)) + for(var/atom/A in N) + atoms += A + return atoms + +/datum/coords //Simple datum for storing coordinates. + var/x_pos = null + var/y_pos = null + var/z_pos = null + +/area/proc/move_contents_to(var/area/A, var/turftoleave=null, var/direction = null) + //Takes: Area. Optional: turf type to leave behind. + //Returns: Nothing. + //Notes: Attempts to move the contents of one area to another area. + // Movement based on lower left corner. Tiles that do not fit + // into the new area will not be moved. + + if(!A || !src) return 0 + + var/list/turfs_src = get_area_turfs(src.type) + var/list/turfs_trg = get_area_turfs(A.type) + + var/src_min_x = 0 + var/src_min_y = 0 + for (var/turf/T in turfs_src) + if(T.x < src_min_x || !src_min_x) src_min_x = T.x + if(T.y < src_min_y || !src_min_y) src_min_y = T.y + + var/trg_min_x = 0 + var/trg_min_y = 0 + for (var/turf/T in turfs_trg) + if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x + if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y + + var/list/refined_src = new/list() + for(var/turf/T in turfs_src) + refined_src += T + refined_src[T] = new/datum/coords + var/datum/coords/C = refined_src[T] + C.x_pos = (T.x - src_min_x) + C.y_pos = (T.y - src_min_y) + + var/list/refined_trg = new/list() + for(var/turf/T in turfs_trg) + refined_trg += T + refined_trg[T] = new/datum/coords + var/datum/coords/C = refined_trg[T] + C.x_pos = (T.x - trg_min_x) + C.y_pos = (T.y - trg_min_y) + + moving: + for (var/turf/T in refined_src) + var/datum/coords/C_src = refined_src[T] + for (var/turf/B in refined_trg) + var/datum/coords/C_trg = refined_trg[B] + if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) + + //You can stay, though. + if(istype(T,/turf/space)) + refined_src -= T + refined_trg -= B + continue moving + + var/turf/X //New Destination Turf + + //Are we doing shuttlework? Just to save another type check later. + var/shuttlework = 0 + + //Shuttle turfs handle their own fancy moving. + if(istype(T,/turf/simulated/shuttle)) + shuttlework = 1 + var/turf/simulated/shuttle/SS = T + if(!SS.landed_holder) SS.landed_holder = new(turf = SS) + X = SS.landed_holder.land_on(B) + + //Generic non-shuttle turf move. + else + var/old_dir1 = T.dir + var/old_icon_state1 = T.icon_state + var/old_icon1 = T.icon + var/old_underlays = T.underlays.Copy() + var/old_decals = T.decals ? T.decals.Copy() : null + + X = B.ChangeTurf(T.type) + X.set_dir(old_dir1) + X.icon_state = old_icon_state1 + X.icon = old_icon1 + X.copy_overlays(T, TRUE) + X.underlays = old_underlays + X.decals = old_decals + + //Move the air from source to dest + var/turf/simulated/ST = T + if(istype(ST) && ST.zone) + var/turf/simulated/SX = X + if(!SX.air) + SX.make_air() + SX.air.copy_from(ST.zone.air) + ST.zone.remove(ST) + + var/z_level_change = FALSE + if(T.z != X.z) + z_level_change = TRUE + + //Move the objects. Not forceMove because the object isn't "moving" really, it's supposed to be on the "same" turf. + for(var/obj/O in T) + O.loc = X + O.update_light() + if(z_level_change) // The objects still need to know if their z-level changed. + O.onTransitZ(T.z, X.z) + + //Move the mobs unless it's an AI eye or other eye type. + for(var/mob/M in T) + if(istype(M, /mob/observer/eye)) continue // If we need to check for more mobs, I'll add a variable + M.loc = X + + if(z_level_change) // Same goes for mobs. + M.onTransitZ(T.z, X.z) + + if(istype(M, /mob/living)) + var/mob/living/LM = M + LM.check_shadow() // Need to check their Z-shadow, which is normally done in forceMove(). + + if(shuttlework) + var/turf/simulated/shuttle/SS = T + SS.landed_holder.leave_turf() + else if(turftoleave) + T.ChangeTurf(turftoleave) + else + T.ChangeTurf(get_base_turf_by_area(T)) + + refined_src -= T + refined_trg -= B + continue moving + +proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) + if(!original) + return null + + var/obj/O = null + + if(sameloc) + O=new original.type(original.loc) + else + O=new original.type(locate(0,0,0)) + + if(perfectcopy) + if((O) && (original)) + for(var/V in original.vars) + if(!(V in list("type","loc","locs","vars", "parent", "parent_type","verbs","ckey","key"))) + O.vars[V] = original.vars[V] + return O + + +/area/proc/copy_contents_to(var/area/A , var/platingRequired = 0 ) + //Takes: Area. Optional: If it should copy to areas that don't have plating + //Returns: Nothing. + //Notes: Attempts to move the contents of one area to another area. + // Movement based on lower left corner. Tiles that do not fit + // into the new area will not be moved. + + // Does *not* affect gases etc; copied turfs will be changed via ChangeTurf, and the dir, icon, and icon_state copied. All other vars will remain default. + + if(!A || !src) return 0 + + var/list/turfs_src = get_area_turfs(src.type) + var/list/turfs_trg = get_area_turfs(A.type) + + var/src_min_x = 0 + var/src_min_y = 0 + for (var/turf/T in turfs_src) + if(T.x < src_min_x || !src_min_x) src_min_x = T.x + if(T.y < src_min_y || !src_min_y) src_min_y = T.y + + var/trg_min_x = 0 + var/trg_min_y = 0 + for (var/turf/T in turfs_trg) + if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x + if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y + + var/list/refined_src = new/list() + for(var/turf/T in turfs_src) + refined_src += T + refined_src[T] = new/datum/coords + var/datum/coords/C = refined_src[T] + C.x_pos = (T.x - src_min_x) + C.y_pos = (T.y - src_min_y) + + var/list/refined_trg = new/list() + for(var/turf/T in turfs_trg) + refined_trg += T + refined_trg[T] = new/datum/coords + var/datum/coords/C = refined_trg[T] + C.x_pos = (T.x - trg_min_x) + C.y_pos = (T.y - trg_min_y) + + var/list/toupdate = new/list() + + var/copiedobjs = list() + + + moving: + for (var/turf/T in refined_src) + var/datum/coords/C_src = refined_src[T] + for (var/turf/B in refined_trg) + var/datum/coords/C_trg = refined_trg[B] + if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) + + var/old_dir1 = T.dir + var/old_icon_state1 = T.icon_state + var/old_icon1 = T.icon + var/old_overlays = T.overlays.Copy() + var/old_underlays = T.underlays.Copy() + + if(platingRequired) + if(istype(B, get_base_turf_by_area(B))) + continue moving + + var/turf/X = B + X.ChangeTurf(T.type) + X.set_dir(old_dir1) + X.icon_state = old_icon_state1 + X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi + X.overlays = old_overlays + X.underlays = old_underlays + + var/list/objs = new/list() + var/list/newobjs = new/list() + var/list/mobs = new/list() + var/list/newmobs = new/list() + + for(var/obj/O in T) + + if(!istype(O,/obj)) + continue + + objs += O + + + for(var/obj/O in objs) + newobjs += DuplicateObject(O , 1) + + + for(var/obj/O in newobjs) + O.loc = X + + for(var/mob/M in T) + + if(!istype(M,/mob) || istype(M, /mob/observer/eye)) continue // If we need to check for more mobs, I'll add a variable + mobs += M + + for(var/mob/M in mobs) + newmobs += DuplicateObject(M , 1) + + for(var/mob/M in newmobs) + M.loc = X + + copiedobjs += newobjs + copiedobjs += newmobs + +// var/area/AR = X.loc + +// if(AR.dynamic_lighting) +// X.opacity = !X.opacity +// X.sd_SetOpacity(!X.opacity) //TODO: rewrite this code so it's not messed by lighting ~Carn + + toupdate += X + + refined_src -= T + refined_trg -= B + continue moving + + + + + if(toupdate.len) + for(var/turf/simulated/T1 in toupdate) + air_master.mark_for_update(T1) + + return copiedobjs + + + +proc/get_cardinal_dir(atom/A, atom/B) + var/dx = abs(B.x - A.x) + var/dy = abs(B.y - A.y) + return get_dir(A, B) & (rand() * (dx+dy) < dy ? 3 : 12) + +//chances are 1:value. anyprob(1) will always return true +proc/anyprob(value) + return (rand(1,value)==value) + +proc/view_or_range(distance = world.view , center = usr , type) + switch(type) + if("view") + . = view(distance,center) + if("range") + . = range(distance,center) + return + +proc/oview_or_orange(distance = world.view , center = usr , type) + switch(type) + if("view") + . = oview(distance,center) + if("range") + . = orange(distance,center) + return + +proc/get_mob_with_client_list() + var/list/mobs = list() + for(var/mob/M in mob_list) + if (M.client) + mobs += M + return mobs + + +/proc/parse_zone(zone) + if(zone == "r_hand") return "right hand" + else if (zone == "l_hand") return "left hand" + else if (zone == "l_arm") return "left arm" + else if (zone == "r_arm") return "right arm" + else if (zone == "l_leg") return "left leg" + else if (zone == "r_leg") return "right leg" + else if (zone == "l_foot") return "left foot" + else if (zone == "r_foot") return "right foot" + else if (zone == "l_hand") return "left hand" + else if (zone == "r_hand") return "right hand" + else if (zone == "l_foot") return "left foot" + else if (zone == "r_foot") return "right foot" + else return zone + +/proc/get(atom/loc, type) + while(loc) + if(istype(loc, type)) + return loc + loc = loc.loc + return null + +/proc/get_turf_or_move(turf/location) + return get_turf(location) + + +//Quick type checks for some tools +var/global/list/common_tools = list( +/obj/item/stack/cable_coil, +/obj/item/weapon/tool/wrench, +/obj/item/weapon/weldingtool, +/obj/item/weapon/tool/screwdriver, +/obj/item/weapon/tool/wirecutters, +/obj/item/device/multitool, +/obj/item/weapon/tool/crowbar) + +/proc/istool(O) + if(O && is_type_in_list(O, common_tools)) + return 1 + return 0 + + +/proc/is_wire_tool(obj/item/I) + if(istype(I, /obj/item/device/multitool) || I.is_wirecutter()) + return TRUE + if(istype(I, /obj/item/device/assembly/signaler)) + return TRUE + return + +proc/is_hot(obj/item/W as obj) + switch(W.type) + if(/obj/item/weapon/weldingtool) + var/obj/item/weapon/weldingtool/WT = W + if(WT.isOn()) + return 3800 + else + return 0 + if(/obj/item/weapon/flame/lighter) + if(W:lit) + return 1500 + else + return 0 + if(/obj/item/weapon/flame/match) + if(W:lit) + return 1000 + else + return 0 + if(/obj/item/clothing/mask/smokable/cigarette) + if(W:lit) + return 1000 + else + return 0 + if(/obj/item/weapon/pickaxe/plasmacutter) + return 3800 + if(/obj/item/weapon/melee/energy) + return 3500 + else + return 0 + + return 0 + +//Whether or not the given item counts as sharp in terms of dealing damage +/proc/is_sharp(obj/O as obj) + if(!O) + return FALSE + if(O.sharp) + return TRUE + if(O.edge) + return TRUE + return FALSE + +//Whether or not the given item counts as cutting with an edge in terms of removing limbs +/proc/has_edge(obj/O as obj) + if(!O) + return FALSE + if(O.edge) + return TRUE + return FALSE + +//Returns 1 if the given item is capable of popping things like balloons, inflatable barriers, or cutting police tape. +/proc/can_puncture(obj/item/W as obj) // For the record, WHAT THE HELL IS THIS METHOD OF DOING IT? + if(!W) + return FALSE + if(W.sharp) + return TRUE + return ( \ + W.is_screwdriver() || \ + istype(W, /obj/item/weapon/pen) || \ + istype(W, /obj/item/weapon/weldingtool) || \ + istype(W, /obj/item/weapon/flame/lighter/zippo) || \ + istype(W, /obj/item/weapon/flame/match) || \ + istype(W, /obj/item/clothing/mask/smokable/cigarette) || \ + istype(W, /obj/item/weapon/shovel) \ + ) + +/proc/is_surgery_tool(obj/item/W as obj) + return ( \ + istype(W, /obj/item/weapon/surgical/scalpel) || \ + istype(W, /obj/item/weapon/surgical/hemostat) || \ + istype(W, /obj/item/weapon/surgical/retractor) || \ + istype(W, /obj/item/weapon/surgical/cautery) || \ + istype(W, /obj/item/weapon/surgical/bonegel) || \ + istype(W, /obj/item/weapon/surgical/bonesetter) + ) + +// check if mob is lying down on something we can operate him on. +// The RNG with table/rollerbeds comes into play in do_surgery() so that fail_step() can be used instead. +/proc/can_operate(mob/living/carbon/M) + return M.lying + +// Returns an instance of a valid surgery surface. +/mob/living/proc/get_surgery_surface() + if(!lying) + return null // Not lying down means no surface. + var/obj/surface = null + for(var/obj/O in loc) // Looks for the best surface. + if(O.surgery_odds) + if(!surface || surface.surgery_odds < O) + surface = O + if(surface) + return surface + +/proc/reverse_direction(var/dir) + switch(dir) + if(NORTH) + return SOUTH + if(NORTHEAST) + return SOUTHWEST + if(EAST) + return WEST + if(SOUTHEAST) + return NORTHWEST + if(SOUTH) + return NORTH + if(SOUTHWEST) + return NORTHEAST + if(WEST) + return EAST + if(NORTHWEST) + return SOUTHEAST + +/* +Checks if that loc and dir has a item on the wall +TODO - Fix this ancient list of wall items. Preferably make it dynamically populated. ~Leshana +*/ +var/list/WALLITEMS = list( + /obj/machinery/power/apc, /obj/machinery/alarm, /obj/item/device/radio/intercom, /obj/structure/frame, + /obj/structure/extinguisher_cabinet, /obj/structure/reagent_dispensers/peppertank, + /obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/light_switch, /obj/structure/sign, + /obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/button/remote, + /obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio, + /obj/item/weapon/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth, + /obj/structure/mirror, /obj/structure/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment + ) +/proc/gotwallitem(loc, dir) + for(var/obj/O in loc) + for(var/item in WALLITEMS) + if(istype(O, item)) + //Direction works sometimes + if(O.dir == dir) + return 1 + + //Some stuff doesn't use dir properly, so we need to check pixel instead + switch(dir) + if(SOUTH) + if(O.pixel_y > 10) + return 1 + if(NORTH) + if(O.pixel_y < -10) + return 1 + if(WEST) + if(O.pixel_x > 10) + return 1 + if(EAST) + if(O.pixel_x < -10) + return 1 + + + //Some stuff is placed directly on the wallturf (signs) + for(var/obj/O in get_step(loc, dir)) + for(var/item in WALLITEMS) + if(istype(O, item)) + if(O.pixel_x == 0 && O.pixel_y == 0) + return 1 + return 0 + +/proc/format_text(text) + return replacetext(replacetext(text,"\proper ",""),"\improper ","") + +/proc/topic_link(var/datum/D, var/arglist, var/content) + if(istype(arglist,/list)) + arglist = list2params(arglist) + return "[content]" + +/proc/get_random_colour(var/simple, var/lower=0, var/upper=255) + var/colour + if(simple) + colour = pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF")) + else + for(var/i=1;i<=3;i++) + var/temp_col = "[num2hex(rand(lower,upper))]" + if(length(temp_col )<2) + temp_col = "0[temp_col]" + colour += temp_col + return colour + +var/mob/dview/dview_mob = new + +//Version of view() which ignores darkness, because BYOND doesn't have it. +/proc/dview(var/range = world.view, var/center, var/invis_flags = 0) + if(!center) + return + + dview_mob.loc = center + + dview_mob.see_invisible = invis_flags + + . = view(range, dview_mob) + dview_mob.loc = null + +/mob/dview + invisibility = 101 + density = 0 + + anchored = 1 + simulated = 0 + + see_in_dark = 1e6 + +/atom/proc/get_light_and_color(var/atom/origin) + if(origin) + color = origin.color + set_light(origin.light_range, origin.light_power, origin.light_color) + +/mob/dview/New() + ..() + // We don't want to be in any mob lists; we're a dummy not a mob. + mob_list -= src + if(stat == DEAD) + dead_mob_list -= src + else + living_mob_list -= src + +/mob/dview/Destroy(var/force) + crash_with("Attempt to delete the dview_mob: [log_info_line(src)]") + if (!force) + return QDEL_HINT_LETMELIVE + global.dview_mob = new + return ..() + +// call to generate a stack trace and print to runtime logs +/proc/crash_with(msg) + CRASH(msg) + +/proc/screen_loc2turf(scr_loc, turf/origin) + var/tX = splittext(scr_loc, ",") + var/tY = splittext(tX[2], ":") + var/tZ = origin.z + tY = tY[1] + tX = splittext(tX[1], ":") + tX = tX[1] + tX = max(1, min(world.maxx, origin.x + (text2num(tX) - (world.view + 1)))) + tY = max(1, min(world.maxy, origin.y + (text2num(tY) - (world.view + 1)))) + return locate(tX, tY, tZ) + +// Displays something as commonly used (non-submultiples) SI units. +/proc/format_SI(var/number, var/symbol) + switch(round(abs(number))) + if(0 to 1000-1) + return "[number] [symbol]" + if(1e3 to 1e6-1) + return "[round(number / 1000, 0.1)] k[symbol]" // kilo + if(1e6 to 1e9-1) + return "[round(number / 1e6, 0.1)] M[symbol]" // mega + if(1e9 to 1e12-1) // Probably not needed but why not be complete? + return "[round(number / 1e9, 0.1)] G[symbol]" // giga + if(1e12 to 1e15-1) + return "[round(number / 1e12, 0.1)] T[symbol]" // tera + + + +//ultra range (no limitations on distance, faster than range for distances > 8); including areas drastically decreases performance +/proc/urange(dist=0, atom/center=usr, orange=0, areas=0) + if(!dist) + if(!orange) + return list(center) + else + return list() + + var/list/turfs = RANGE_TURFS(dist, center) + if(orange) + turfs -= get_turf(center) + . = list() + for(var/V in turfs) + var/turf/T = V + . += T + . += T.contents + if(areas) + . |= T.loc + +#define NOT_FLAG(flag) (!(flag & use_flags)) +#define HAS_FLAG(flag) (flag & use_flags) + +// Checks if user can use this object. Set use_flags to customize what checks are done. +// Returns 0 if they can use it, a value representing why they can't if not. +// Flags are in `code/__defines/misc.dm` +/atom/proc/use_check(mob/user, use_flags = 0, show_messages = FALSE) + . = 0 + if (NOT_FLAG(USE_ALLOW_NONLIVING) && !isliving(user)) + // No message for ghosts. + return USE_FAIL_NONLIVING + + if (NOT_FLAG(USE_ALLOW_NON_ADJACENT) && !Adjacent(user)) + if (show_messages) + to_chat(user, span("notice","You're too far away from [src] to do that.")) + return USE_FAIL_NON_ADJACENT + + if (NOT_FLAG(USE_ALLOW_DEAD) && user.stat == DEAD) + if (show_messages) + to_chat(user, span("notice","You can't do that when you're dead.")) + return USE_FAIL_DEAD + + if (NOT_FLAG(USE_ALLOW_INCAPACITATED) && (user.incapacitated())) + if (show_messages) + to_chat(user, span("notice","You cannot do that in your current state.")) + return USE_FAIL_INCAPACITATED + + if (NOT_FLAG(USE_ALLOW_NON_ADV_TOOL_USR) && !user.IsAdvancedToolUser()) + if (show_messages) + to_chat(user, span("notice","You don't know how to operate [src].")) + return USE_FAIL_NON_ADV_TOOL_USR + + if (HAS_FLAG(USE_DISALLOW_SILICONS) && issilicon(user)) + if (show_messages) + to_chat(user, span("notice","You need hands for that.")) + return USE_FAIL_IS_SILICON + + if (HAS_FLAG(USE_FORCE_SRC_IN_USER) && !(src in user)) + if (show_messages) + to_chat(user, span("notice","You need to be holding [src] to do that.")) + return USE_FAIL_NOT_IN_USER + +#undef NOT_FLAG +#undef HAS_FLAG + +//datum may be null, but it does need to be a typed var +#define NAMEOF(datum, X) (#X || ##datum.##X) + +#define VARSET_LIST_CALLBACK(target, var_name, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, ##target, ##var_name, ##var_value) +//dupe code because dm can't handle 3 level deep macros +#define VARSET_CALLBACK(datum, var, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, ##datum, NAMEOF(##datum, ##var), ##var_value) +//we'll see about those 3-level deep macros +#define VARSET_IN(datum, var, var_value, time) addtimer(VARSET_CALLBACK(datum, var, var_value), time) + +/proc/___callbackvarset(list_or_datum, var_name, var_value) + if(length(list_or_datum)) + list_or_datum[var_name] = var_value + return + var/datum/D = list_or_datum + D.vars[var_name] = var_value + +// Returns direction-string, rounded to multiples of 22.5, from the first parameter to the second +// N, NNE, NE, ENE, E, ESE, SE, SSE, S, SSW, SW, WSW, W, WNW, NW, NNW +/proc/get_adir(var/turf/A, var/turf/B) + var/degree = Get_Angle(A, B) + switch(round(degree%360, 22.5)) + if(0) + return "North" + if(22.5) + return "North-Northeast" + if(45) + return "Northeast" + if(67.5) + return "East-Northeast" + if(90) + return "East" + if(112.5) + return "East-Southeast" + if(135) + return "Southeast" + if(157.5) + return "South-Southeast" + if(180) + return "South" + if(202.5) + return "South-Southwest" + if(225) + return "Southwest" + if(247.5) + return "West-Southwest" + if(270) + return "West" + if(292.5) + return "West-Northwest" + if(315) + return "Northwest" + if(337.5) + return "North-Northwest" + +/proc/pass() + return + +#define NAMEOF(datum, X) (#X || ##datum.##X) + +/proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) + if (value == FALSE) //nothing should be calling us with a number, so this is safe + value = input("Enter type to find (blank for all, cancel to cancel)", "Search for type") as null|text + if (isnull(value)) + return + value = trim(value) + if(!isnull(value) && value != "") + matches = filter_fancy_list(matches, value) + + if(matches.len==0) + return + + var/chosen + if(matches.len==1) + chosen = matches[1] + else + chosen = input("Select a type", "Pick Type", matches[1]) as null|anything in matches + if(!chosen) + return + chosen = matches[chosen] + return chosen + +/proc/get_fancy_list_of_atom_types() + var/static/list/pre_generated_list + if (!pre_generated_list) //init + pre_generated_list = make_types_fancy(typesof(/atom)) + return pre_generated_list + +/proc/get_fancy_list_of_datum_types() + var/static/list/pre_generated_list + if (!pre_generated_list) //init + pre_generated_list = make_types_fancy(sortList(typesof(/datum) - typesof(/atom))) + return pre_generated_list + +/proc/filter_fancy_list(list/L, filter as text) + var/list/matches = new + for(var/key in L) + var/value = L[key] + if(findtext("[key]", filter) || findtext("[value]", filter)) + matches[key] = value + return matches + +/proc/make_types_fancy(var/list/types) + if (ispath(types)) + types = list(types) + . = list() + for(var/type in types) + var/typename = "[type]" + var/static/list/TYPES_SHORTCUTS = list( + /obj/effect/decal/cleanable = "CLEANABLE", + /obj/item/device/radio/headset = "HEADSET", + /obj/item/clothing/head/helmet/space = "SPESSHELMET", + /obj/item/weapon/book/manual = "MANUAL", + /obj/item/weapon/reagent_containers/food/drinks = "DRINK", + /obj/item/weapon/reagent_containers/food = "FOOD", + /obj/item/weapon/reagent_containers = "REAGENT_CONTAINERS", + /obj/machinery/atmospherics = "ATMOS_MECH", + /obj/machinery/portable_atmospherics = "PORT_ATMOS", + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack = "MECHA_MISSILE_RACK", + /obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP", + /obj/item/organ = "ORGAN", + /obj/item = "ITEM", + /obj/machinery = "MACHINERY", + /obj/effect = "EFFECT", + /obj = "O", + /datum = "D", + /turf/simulated/wall = "S-WALL", + /turf/simulated/floor = "S-FLOOR", + /turf/simulated = "SIMULATED", + /turf/unsimulated/wall = "US-WALL", + /turf/unsimulated/floor = "US-FLOOR", + /turf/unsimulated = "UNSIMULATED", + /turf = "T", + /mob/living/carbon = "CARBON", + /mob/living/simple_mob = "SIMPLE", + /mob/living = "LIVING", + /mob = "M" + ) + for (var/tn in TYPES_SHORTCUTS) + if (copytext(typename,1, length("[tn]/")+1)=="[tn]/" /*findtextEx(typename,"[tn]/",1,2)*/ ) + typename = TYPES_SHORTCUTS[tn]+copytext(typename,length("[tn]/")) + break + .[typename] = type + +/proc/IsValidSrc(datum/D) + if(istype(D)) + return !QDELETED(D) + return FALSE + +//gives us the stack trace from CRASH() without ending the current proc. +/proc/stack_trace(msg) + CRASH(msg) + +/datum/proc/stack_trace(msg) + CRASH(msg) + +// \ref behaviour got changed in 512 so this is necesary to replicate old behaviour. +// If it ever becomes necesary to get a more performant REF(), this lies here in wait +// #define REF(thing) (thing && istype(thing, /datum) && (thing:datum_flags & DF_USE_TAG) && thing:tag ? "[thing:tag]" : "\ref[thing]") +/proc/REF(input) + if(istype(input, /datum)) + var/datum/thing = input + if(thing.datum_flags & DF_USE_TAG) + if(!thing.tag) + thing.datum_flags &= ~DF_USE_TAG + stack_trace("A ref was requested of an object with DF_USE_TAG set but no tag: [thing]") + else + return "\[[url_encode(thing.tag)]\]" + return "\ref[input]" + +// Painlessly creates an element. +// First argument is where to send the Topic call to when clicked. Should be a reference to an object. This is generally src, but not always. +// Second one is for all the params that will be sent. Uses an assoc list (e.g. "value" = "5"). +// Note that object refs will be converted to text, as if \ref[thing] was done. To get the ref back on Topic() side, you will need to use locate(). +// Third one is the text that will be clickable. +/proc/href(href_src, list/href_params, href_text) return "[href_text]" \ No newline at end of file diff --git a/code/_macros.dm b/code/_macros.dm index d5878c6259..5b7fb379d3 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -2,9 +2,16 @@ #define get_turf(A) get_step(A,0) +#define get_x(A) (get_step(A, 0)?.x || 0) + +#define get_y(A) (get_step(A, 0)?.y || 0) + +#define get_z(A) (get_step(A, 0)?.z || 0) + #define RANDOM_BLOOD_TYPE pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") -#define to_chat(target, message) target << message +// #define to_chat(target, message) target << message Not anymore! +#define to_chat to_chat_filename=__FILE__;to_chat_line=__LINE__;to_chat_src=src;__to_chat #define to_world(message) to_chat(world, message) #define to_world_log(message) world.log << message // TODO - Baystation has this log to crazy places. For now lets just world.log, but maybe look into it later. diff --git a/code/_onclick/hud/skybox.dm b/code/_onclick/hud/skybox.dm new file mode 100644 index 0000000000..492a11e588 --- /dev/null +++ b/code/_onclick/hud/skybox.dm @@ -0,0 +1,67 @@ +#define SKYBOX_PADDING 4 // How much larger we want the skybox image to be than client's screen (in turfs) +#define SKYBOX_PIXELS 736 // Size of skybox image in pixels +#define SKYBOX_TURFS (SKYBOX_PIXELS/WORLD_ICON_SIZE) + +// Skybox screen object. +/obj/skybox + name = "skybox" + mouse_opacity = 0 + anchored = TRUE + simulated = FALSE + screen_loc = "CENTER,CENTER" + plane = SKYBOX_PLANE + blend_mode = BLEND_MULTIPLY // You actually need to do it this way or you see it in occlusion. + +// Adjust transform property to scale for client's view var. We assume the skybox is 736x736 px +/obj/skybox/proc/scale_to_view(var/view) + var/matrix/M = matrix() + // Translate to center the icon over us! + M.Translate(-(SKYBOX_PIXELS - WORLD_ICON_SIZE) / 2) + // Scale appropriately based on view size. (7 results in scale of 1) + view = text2num(view) || 7 // Sanitize + M.Scale(((min(MAX_CLIENT_VIEW, view) + SKYBOX_PADDING) * 2 + 1) / SKYBOX_TURFS) + src.transform = M + +/client + var/obj/skybox/skybox + +/client/proc/update_skybox(rebuild) + if(!skybox) + skybox = new() + skybox.scale_to_view(src.view) + screen += skybox + rebuild = 1 + + var/turf/T = get_turf(eye) + if(T) + if(rebuild) + skybox.cut_overlays() + skybox.add_overlay(SSskybox.get_skybox(T.z)) + screen |= skybox + skybox.screen_loc = "CENTER:[(world.maxx>>1) - T.x],CENTER:[(world.maxy>>1) - T.y]" + +/mob/Login() + . = ..() + client.update_skybox(TRUE) + +/mob/Move() + var/old_z = get_z(src) + . = ..() + if(. && client) + client.update_skybox(old_z != get_z(src)) + +/mob/forceMove() + var/old_z = get_z(src) + . = ..() + if(. && client) + client.update_skybox(old_z != get_z(src)) + +/mob/set_viewsize() + . = ..() + if (. && client) + client.update_skybox() + client.skybox?.scale_to_view(client.view) + +#undef SKYBOX_BORDER +#undef SKYBOX_PIXELS +#undef SKYBOX_TURFS diff --git a/code/controllers/Processes/alarm.dm b/code/controllers/Processes/alarm.dm deleted file mode 100644 index 3590149811..0000000000 --- a/code/controllers/Processes/alarm.dm +++ /dev/null @@ -1,42 +0,0 @@ - -// We manually initialize the alarm handlers instead of looping over all existing types -// to make it possible to write: camera.triggerAlarm() rather than alarm_manager.managers[datum/alarm_handler/camera].triggerAlarm() or a variant thereof. -/var/global/datum/alarm_handler/atmosphere/atmosphere_alarm = new() -/var/global/datum/alarm_handler/camera/camera_alarm = new() -/var/global/datum/alarm_handler/fire/fire_alarm = new() -/var/global/datum/alarm_handler/motion/motion_alarm = new() -/var/global/datum/alarm_handler/power/power_alarm = new() - -// Alarm Manager, the manager for alarms. -var/datum/controller/process/alarm/alarm_manager - -/datum/controller/process/alarm - var/list/datum/alarm/all_handlers = list() - -/datum/controller/process/alarm/setup() - name = "alarm" - schedule_interval = 20 // every 2 seconds - all_handlers = list(atmosphere_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) - alarm_manager = src - -/datum/controller/process/alarm/doWork() - for(last_object in all_handlers) - var/datum/alarm_handler/AH = last_object - AH.process() - SCHECK - -/datum/controller/process/alarm/proc/active_alarms() - var/list/all_alarms = new - for(var/datum/alarm_handler/AH in all_handlers) - var/list/alarms = AH.alarms - all_alarms += alarms - - return all_alarms - -/datum/controller/process/alarm/proc/number_of_active_alarms() - var/list/alarms = active_alarms() - return alarms.len - -/datum/controller/process/alarm/statProcess() - ..() - stat(null, "[number_of_active_alarms()] alarm\s") diff --git a/code/controllers/Processes/emergencyShuttle.dm b/code/controllers/Processes/emergencyShuttle.dm deleted file mode 100644 index e7289311b9..0000000000 --- a/code/controllers/Processes/emergencyShuttle.dm +++ /dev/null @@ -1,9 +0,0 @@ -/datum/controller/process/emergencyShuttle/setup() - name = "emergency shuttle" - schedule_interval = 20 // every 2 seconds - - if(!emergency_shuttle) - emergency_shuttle = new - -/datum/controller/process/emergencyShuttle/doWork() - emergency_shuttle.process() diff --git a/code/controllers/Processes/game_master.dm b/code/controllers/Processes/game_master.dm deleted file mode 100644 index 7f89f3ab13..0000000000 --- a/code/controllers/Processes/game_master.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/controller/process/game_master/setup() - name = "\improper GM controller" - schedule_interval = 600 // every 60 seconds - -/datum/controller/process/game_master/doWork() - game_master.process() \ No newline at end of file diff --git a/code/controllers/Processes/mob.dm b/code/controllers/Processes/mob.dm deleted file mode 100644 index 6b623e7730..0000000000 --- a/code/controllers/Processes/mob.dm +++ /dev/null @@ -1,29 +0,0 @@ -/datum/controller/process/mob - var/tmp/datum/updateQueue/updateQueueInstance - -/datum/controller/process/mob/setup() - name = "mob" - schedule_interval = 20 // every 2 seconds - start_delay = 16 - -/datum/controller/process/mob/started() - ..() - if(!mob_list) - mob_list = list() - -/datum/controller/process/mob/doWork() - for(last_object in mob_list) - var/mob/M = last_object - if(M && !QDELETED(M)) - try - M.Life() - catch(var/exception/e) - catchException(e, M) - SCHECK - else - catchBadType(M) - mob_list -= M - -/datum/controller/process/mob/statProcess() - ..() - stat(null, "[mob_list.len] mobs") \ No newline at end of file diff --git a/code/controllers/autotransfer.dm b/code/controllers/autotransfer.dm index 6f68a8d9dc..fb8cc8286a 100644 --- a/code/controllers/autotransfer.dm +++ b/code/controllers/autotransfer.dm @@ -5,10 +5,10 @@ datum/controller/transfer_controller var/currenttick = 0 datum/controller/transfer_controller/New() timerbuffer = config.vote_autotransfer_initial - START_PROCESSING(SSobj, src) + START_PROCESSING(SSprocessing, src) datum/controller/transfer_controller/Destroy() - STOP_PROCESSING(SSobj, src) + STOP_PROCESSING(SSprocessing, src) datum/controller/transfer_controller/process() currenttick = currenttick + 1 diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index e3f8b5f052..450811a5fb 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -264,6 +264,12 @@ var/list/gamemode_cache = list() var/sqlite_feedback_cooldown = 0 // How long one must wait, in days, to submit another feedback form. Used to help prevent spam, especially with privacy active. 0 = No limit. var/sqlite_feedback_min_age = 0 // Used to block new people from giving feedback. This metric is very bad but it can help slow down spammers. + var/defib_timer = 10 // How long until someone can't be defibbed anymore, in minutes. + var/defib_braindamage_timer = 2 // How long until someone will get brain damage when defibbed, in minutes. The closer to the end of the above timer, the more brain damage they get. + + // disables the annoying "You have already logged in this round, disconnect or be banned" popup for multikeying, because it annoys the shit out of me when testing. + var/disable_cid_warn_popup = FALSE + /datum/configuration/New() var/list/L = typesof(/datum/game_mode) - /datum/game_mode for (var/T in L) @@ -873,7 +879,14 @@ var/list/gamemode_cache = list() if("sqlite_feedback_cooldown") config.sqlite_feedback_cooldown = text2num(value) + if("defib_timer") + config.defib_timer = text2num(value) + if("defib_braindamage_timer") + config.defib_braindamage_timer = text2num(value) + + if("disable_cid_warn_popup") + config.disable_cid_warn_popup = TRUE else log_misc("Unknown setting in configuration: '[name]'") diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm index 54f97e2060..05f6fe0c6d 100644 --- a/code/controllers/emergency_shuttle_controller.dm +++ b/code/controllers/emergency_shuttle_controller.dm @@ -2,7 +2,7 @@ // Controls the emergency shuttle -var/global/datum/emergency_shuttle_controller/emergency_shuttle +var/global/datum/emergency_shuttle_controller/emergency_shuttle = new /datum/emergency_shuttle_controller var/datum/shuttle/autodock/ferry/emergency/shuttle // Set in shuttle_emergency.dm TODO - is it really? @@ -75,8 +75,10 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle /datum/emergency_shuttle_controller/proc/set_launch_countdown(var/seconds) wait_for_launch = 1 launch_time = world.time + seconds*10 + START_PROCESSING(SSprocessing, src) /datum/emergency_shuttle_controller/proc/stop_launch_countdown() + STOP_PROCESSING(SSprocessing, src) wait_for_launch = 0 //calls the shuttle for an emergency evacuation @@ -120,7 +122,7 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle /datum/emergency_shuttle_controller/proc/recall() if (!can_recall()) return - wait_for_launch = 0 + stop_launch_countdown() shuttle.cancel_launch(src) if (evac) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 0b292e45c4..644ab8d2f0 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -196,7 +196,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new #else world.sleep_offline = 1 #endif - world.fps = config.fps + world.change_fps(config.fps) var/initialized_tod = REALTIMEOFDAY sleep(1) initializations_finished_with_no_players_logged_in = initialized_tod < REALTIMEOFDAY - 10 diff --git a/code/controllers/subsystems/air.dm b/code/controllers/subsystems/air.dm index 0b8b8ec94e..49303e7fa2 100644 --- a/code/controllers/subsystems/air.dm +++ b/code/controllers/subsystems/air.dm @@ -38,7 +38,7 @@ SUBSYSTEM_DEF(air) current_cycle = 0 var/simulated_turf_count = 0 - for(var/turf/simulated/S in turfs) + for(var/turf/simulated/S in world) simulated_turf_count++ S.update_air_properties() CHECK_TICK diff --git a/code/controllers/subsystems/alarm.dm b/code/controllers/subsystems/alarm.dm new file mode 100644 index 0000000000..4b6140e507 --- /dev/null +++ b/code/controllers/subsystems/alarm.dm @@ -0,0 +1,45 @@ + +// We manually initialize the alarm handlers instead of looping over all existing types +// to make it possible to write: camera_alarm.triggerAlarm() rather than SSalarm.managers[datum/alarm_handler/camera].triggerAlarm() or a variant thereof. +/var/global/datum/alarm_handler/atmosphere/atmosphere_alarm = new() +/var/global/datum/alarm_handler/camera/camera_alarm = new() +/var/global/datum/alarm_handler/fire/fire_alarm = new() +/var/global/datum/alarm_handler/motion/motion_alarm = new() +/var/global/datum/alarm_handler/power/power_alarm = new() + +SUBSYSTEM_DEF(alarm) + name = "Alarm" + wait = 2 SECONDS + priority = FIRE_PRIORITY_ALARM + init_order = INIT_ORDER_ALARM + var/list/datum/alarm/all_handlers + var/tmp/list/currentrun = null + var/static/list/active_alarm_cache = list() + +/datum/controller/subsystem/alarm/Initialize() + all_handlers = list(atmosphere_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) + . = ..() + +/datum/controller/subsystem/alarm/fire(resumed = FALSE) + if(!resumed) + src.currentrun = all_handlers.Copy() + active_alarm_cache.Cut() + + var/list/currentrun = src.currentrun // Cache for sanic speed + while (currentrun.len) + var/datum/alarm_handler/AH = currentrun[currentrun.len] + currentrun.len-- + AH.process() + active_alarm_cache += AH.alarms + + if (MC_TICK_CHECK) + return + +/datum/controller/subsystem/alarm/proc/active_alarms() + return active_alarm_cache.Copy() + +/datum/controller/subsystem/alarm/proc/number_of_active_alarms() + return active_alarm_cache.len + +/datum/controller/subsystem/alarm/stat_entry() + ..("[number_of_active_alarms()] alarm\s") diff --git a/code/controllers/subsystems/assets.dm b/code/controllers/subsystems/assets.dm new file mode 100644 index 0000000000..cd531db614 --- /dev/null +++ b/code/controllers/subsystems/assets.dm @@ -0,0 +1,17 @@ +SUBSYSTEM_DEF(assets) + name = "Assets" + init_order = INIT_ORDER_ASSETS + flags = SS_NO_FIRE + var/list/cache = list() + var/list/preload = list() + +/datum/controller/subsystem/assets/Initialize(timeofday) + for(var/type in typesof(/datum/asset) - list(/datum/asset, /datum/asset/simple)) + var/datum/asset/A = new type() + A.register() + + preload = cache.Copy() //don't preload assets generated during the round + + for(var/client/C in GLOB.clients) + addtimer(CALLBACK(GLOBAL_PROC, .proc/getFilesSlow, C, preload, FALSE), 10) + return ..() \ No newline at end of file diff --git a/code/controllers/subsystems/atoms.dm b/code/controllers/subsystems/atoms.dm index 60fccf6dd3..4db490914a 100644 --- a/code/controllers/subsystems/atoms.dm +++ b/code/controllers/subsystems/atoms.dm @@ -8,9 +8,9 @@ SUBSYSTEM_DEF(atoms) init_order = INIT_ORDER_ATOMS flags = SS_NO_FIRE - var/initialized = INITIALIZATION_INSSATOMS + var/static/initialized = INITIALIZATION_INSSATOMS // var/list/created_atoms // This is never used, so don't bother. ~Leshana - var/old_initialized + var/static/old_initialized var/list/late_loaders var/list/created_atoms diff --git a/code/controllers/subsystems/chat.dm b/code/controllers/subsystems/chat.dm new file mode 100644 index 0000000000..3afbcae374 --- /dev/null +++ b/code/controllers/subsystems/chat.dm @@ -0,0 +1,87 @@ +SUBSYSTEM_DEF(chat) + name = "Chat" + flags = SS_TICKER + wait = 1 // SS_TICKER means this runs every tick + priority = FIRE_PRIORITY_CHAT + init_order = INIT_ORDER_CHAT + + var/list/msg_queue = list() + +/datum/controller/subsystem/chat/Initialize(timeofday) + init_vchat() + ..() + +/datum/controller/subsystem/chat/fire() + var/list/msg_queue = src.msg_queue // Local variable for sanic speed. + for(var/i in msg_queue) + var/client/C = i + var/list/messages = msg_queue[C] + msg_queue -= C + if (C) + C << output(jsEncode(messages), "htmloutput:putmessage") + + if(MC_TICK_CHECK) + return + +/datum/controller/subsystem/chat/stat_entry() + ..("C:[msg_queue.len]") + +/datum/controller/subsystem/chat/proc/queue(target, time, message, handle_whitespace = TRUE) + if(!target || !message) + return + + if(!istext(message)) + stack_trace("to_chat called with invalid input type") + return + + // Currently to_chat(world, ...) gets sent individually to each client. Consider. + if(target == world) + target = GLOB.clients + + //Some macros remain in the string even after parsing and fuck up the eventual output + var/original_message = message + message = replacetext(message, "\n", "
") + message = replacetext(message, "\improper", "") + message = replacetext(message, "\proper", "") + + if(isnull(time)) + time = world.time + + var/list/messageStruct = list("time" = time, "message" = message); + + if(islist(target)) + for(var/I in target) + var/client/C = CLIENT_FROM_VAR(I) //Grab us a client if possible + + if(!C) + return + + if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file. + //Send it to the old style output window. + DIRECT_OUTPUT(C, original_message) + continue + + // // Client still loading, put their messages in a queue - Actually don't, logged already in database. + // if(!C.chatOutput.loaded && C.chatOutput.message_queue && islist(C.chatOutput.message_queue)) + // C.chatOutput.message_queue[++C.chatOutput.message_queue.len] = messageStruct + // continue + + LAZYINITLIST(msg_queue[C]) + msg_queue[C][++msg_queue[C].len] = messageStruct + else + var/client/C = CLIENT_FROM_VAR(target) //Grab us a client if possible + + if(!C) + return + + if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file. + DIRECT_OUTPUT(C, original_message) + return + + // // Client still loading, put their messages in a queue - Actually don't, logged already in database. + // if(!C.chatOutput.loaded && C.chatOutput.message_queue && islist(C.chatOutput.message_queue)) + // C.chatOutput.message_queue[++C.chatOutput.message_queue.len] = messageStruct + // return + + LAZYINITLIST(msg_queue[C]) + msg_queue[C][++msg_queue[C].len] = messageStruct diff --git a/code/controllers/subsystems/events.dm b/code/controllers/subsystems/events.dm index 8b8bc1d8b0..289e04411e 100644 --- a/code/controllers/subsystems/events.dm +++ b/code/controllers/subsystems/events.dm @@ -1,6 +1,8 @@ SUBSYSTEM_DEF(events) - name = "Events" - wait = 20 + name = "Events (Legacy)" + wait = 2 SECONDS + + var/tmp/list/currentrun = null var/list/datum/event/active_events = list() var/list/datum/event/finished_events = list() @@ -11,23 +13,37 @@ SUBSYSTEM_DEF(events) var/datum/event_meta/new_event = new /datum/controller/subsystem/events/Initialize() + allEvents = typesof(/datum/event) - /datum/event event_containers = list( EVENT_LEVEL_MUNDANE = new/datum/event_container/mundane, EVENT_LEVEL_MODERATE = new/datum/event_container/moderate, EVENT_LEVEL_MAJOR = new/datum/event_container/major ) - allEvents = typesof(/datum/event) - /datum/event + if(global.using_map.use_overmap) + GLOB.overmap_event_handler.create_events(global.using_map.overmap_z, global.using_map.overmap_size, global.using_map.overmap_event_areas) return ..() /datum/controller/subsystem/events/fire(resumed) - for(var/datum/event/E in active_events) + if (!resumed) + src.currentrun = active_events.Copy() + + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + while (currentrun.len) + var/datum/event/E = currentrun[currentrun.len] + currentrun.len-- if(E.processing_active) E.process() + if (MC_TICK_CHECK) + return for(var/i = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR) var/list/datum/event_container/EC = event_containers[i] EC.process() +/datum/controller/subsystem/events/stat_entry() + ..("E:[active_events.len]") + /datum/controller/subsystem/events/Recover() if(SSevents.active_events) active_events |= SSevents.active_events @@ -35,6 +51,8 @@ SUBSYSTEM_DEF(events) finished_events |= SSevents.finished_events /datum/controller/subsystem/events/proc/event_complete(var/datum/event/E) + active_events -= E + if(!E.event_meta || !E.severity) // datum/event is used here and there for random reasons, maintaining "backwards compatibility" log_debug("Event of '[E.type]' with missing meta-data has completed.") return @@ -50,7 +68,7 @@ SUBSYSTEM_DEF(events) log_debug("Event '[EM.name]' has completed at [stationtime2text()].") /datum/controller/subsystem/events/proc/delay_events(var/severity, var/delay) - var/list/datum/event_container/EC = event_containers[severity] + var/datum/event_container/EC = event_containers[severity] EC.next_event_time += delay /datum/controller/subsystem/events/proc/RoundEnd() diff --git a/code/controllers/subsystems/events2.dm b/code/controllers/subsystems/events2.dm new file mode 100644 index 0000000000..c7b5faabfb --- /dev/null +++ b/code/controllers/subsystems/events2.dm @@ -0,0 +1,37 @@ +// This is a simple ticker for the new event system. +// The logic that determines what events get chosen is held inside a seperate subsystem. + +SUBSYSTEM_DEF(event_ticker) + name = "Events (Ticker)" + wait = 2 SECONDS + runlevels = RUNLEVEL_GAME + + // List of `/datum/event2/event`s that are currently active, and receiving process() ticks. + var/list/active_events = list() + + // List of `/datum/event2/event`s that finished, and are here for showing at roundend, if that's desired. + var/list/finished_events = list() + +// Process active events. +/datum/controller/subsystem/event_ticker/fire(resumed) + for(var/E in active_events) + var/datum/event2/event/event = E + event.process() + if(event.finished) + event_finished(event) + +// Starts an event, independent of the GM system. +// This means it will always run, and won't affect the GM system in any way, e.g. not putting the event off limits after one use. +/datum/controller/subsystem/event_ticker/proc/start_event(event_type) + var/datum/event2/event/E = new event_type(src) + E.execute() + event_started(E) + +/datum/controller/subsystem/event_ticker/proc/event_started(datum/event2/event/E) + log_debug("Event [E.type] is now being ran.") + active_events += E + +/datum/controller/subsystem/event_ticker/proc/event_finished(datum/event2/event/E) + log_debug("Event [E.type] has finished.") + active_events -= E + finished_events += E \ No newline at end of file diff --git a/code/controllers/subsystems/game_master.dm b/code/controllers/subsystems/game_master.dm new file mode 100644 index 0000000000..df00799805 --- /dev/null +++ b/code/controllers/subsystems/game_master.dm @@ -0,0 +1,373 @@ +// This is a sort of successor to the various event systems created over the years. It is designed to be just a tad smarter than the +// previous ones, checking various things like player count, department size and composition, individual player activity, +// individual player (IC) skill, and such, in order to try to choose the best events to take in order to add spice or variety to +// the round. + +// This subsystem holds the logic that chooses events. Actual event processing is handled in a seperate subsystem. +SUBSYSTEM_DEF(game_master) + name = "Events (Game Master)" + wait = 1 MINUTE + runlevels = RUNLEVEL_GAME + + // The GM object is what actually chooses events. + // It's held in a seperate object for better encapsulation, and allows for different 'flavors' of GMs to be made, that choose events differently. + var/datum/game_master/GM = null + var/game_master_type = /datum/game_master/default + + var/list/available_events = list() // A list of meta event objects. + + var/danger = 0 // The GM's best guess at how chaotic the round is. High danger makes it hold back. + var/staleness = -20 // Determines liklihood of the GM doing something, increases over time. + + var/next_event = 0 // Minimum amount of time of nothingness until the GM can pick something again. + + var/debug_messages = FALSE // If true, debug information is written to `log_debug()`. + +/datum/controller/subsystem/game_master/Initialize() + var/list/subtypes = subtypesof(/datum/event2/meta) + for(var/T in subtypes) + var/datum/event2/meta/M = new T(src) + if(!M.name) + continue + available_events += M + + GM = new game_master_type(src) + + if(config && !config.enable_game_master) + can_fire = FALSE + + return ..() + +/datum/controller/subsystem/game_master/fire(resumed) + adjust_staleness(1) + adjust_danger(-1) + + var/global_afk = metric.assess_all_living_mobs() + global_afk = abs(global_afk - 100) + global_afk = round(global_afk / 100, 0.1) + adjust_staleness(global_afk) // Staleness increases faster if more people are less active. + + if(GM.ignore_time_restrictions || next_event < world.time) + if(prob(staleness) && pre_event_checks()) + do_event_decision() + + +/datum/controller/subsystem/game_master/proc/do_event_decision() + log_game_master("Going to choose an event.") + var/datum/event2/meta/event_picked = GM.choose_event() + if(event_picked) + run_event(event_picked) + next_event = world.time + rand(GM.decision_cooldown_lower_bound, GM.decision_cooldown_upper_bound) + +/datum/controller/subsystem/game_master/proc/debug_gm() + can_fire = TRUE + staleness = 100 + debug_messages = TRUE + +/datum/controller/subsystem/game_master/proc/run_event(datum/event2/meta/chosen_event) + var/datum/event2/event/E = chosen_event.make_event() + + chosen_event.times_ran++ + + if(!chosen_event.reusable) + // Disable this event, so it only gets picked once. + chosen_event.enabled = FALSE + if(chosen_event.event_class) + // Disable similar events, too. + for(var/M in available_events) + var/datum/event2/meta/meta = M + if(meta.event_class == chosen_event.event_class) + meta.enabled = FALSE + + SSevent_ticker.event_started(E) + adjust_danger(chosen_event.chaos) + adjust_staleness(-(10 + chosen_event.chaos)) // More chaotic events reduce staleness more, e.g. a 25 chaos event will reduce it by 35. + + +// Tell the game master that something dangerous happened, e.g. someone dying, station explosions. +/datum/controller/subsystem/game_master/proc/adjust_danger(amount) + amount *= GM.danger_modifier + danger = round(between(0, danger + amount, 1000), 0.1) + +// Tell the game master that things are getting boring if positive, or something interesting if negative.. +/datum/controller/subsystem/game_master/proc/adjust_staleness(amount) + amount *= GM.staleness_modifier + staleness = round( between(-20, staleness + amount, 100), 0.1) + +// These are ran before committing to an event. +// Returns TRUE if the system is allowed to procede, otherwise returns FALSE. +/datum/controller/subsystem/game_master/proc/pre_event_checks(quiet = FALSE) + if(!ticker || ticker.current_state != GAME_STATE_PLAYING) + if(!quiet) + log_game_master("Unable to start event: Ticker is nonexistant, or the game is not ongoing.") + return FALSE + if(GM.ignore_time_restrictions) + return TRUE + if(next_event > world.time) // Sanity. + if(!quiet) + log_game_master("Unable to start event: Time until next event is approximately [round((next_event - world.time) / (1 MINUTE))] minute(s)") + return FALSE + + // Last minute antagging is bad for humans to do, so the GM will respect the start and end of the round. + var/mills = round_duration_in_ticks + var/mins = round((mills % 36000) / 600) + var/hours = round(mills / 36000) + +// if(hours < 1 && mins <= 20) // Don't do anything for the first twenty minutes of the round. +// if(!quiet) +// log_debug("Game Master unable to start event: It is too early.") +// return FALSE + if(hours >= 2 && mins >= 40) // Don't do anything in the last twenty minutes of the round, as well. + if(!quiet) + log_game_master("Unable to start event: It is too late.") + return FALSE + return TRUE + +/datum/controller/subsystem/game_master/proc/choose_game_master(mob/user) + var/list/subtypes = subtypesof(/datum/game_master) + var/new_gm_path = input(user, "What kind of Game Master do you want?", "New Game Master", /datum/game_master/default) as null|anything in subtypes + if(new_gm_path) + log_and_message_admins("has swapped the current GM ([GM.type]) for a new GM ([new_gm_path]).") + GM = new new_gm_path(src) + +/datum/controller/subsystem/game_master/proc/log_game_master(message) + if(debug_messages) + log_debug("GAME MASTER: [message]") + + +// This object makes the actual decisions. +/datum/game_master + var/datum/controller/subsystem/game_master/ticker = null + // Multiplier for how much 'danger' is accumulated. Higer generally makes it possible for more dangerous events to be picked. + var/danger_modifier = 1.0 + + // Ditto. Higher numbers generally result in more events occuring in a round. + var/staleness_modifier = 1.0 + + var/decision_cooldown_lower_bound = 5 MINUTES // Lower bound for how long to wait until -the potential- for another event being decided. + var/decision_cooldown_upper_bound = 20 MINUTES // Same, but upper bound. + + var/ignore_time_restrictions = FALSE // Useful for debugging without needing to wait 20 minutes each time. + var/ignore_round_chaos = FALSE // If true, the system will happily choose back to back intense events like meteors and blobs, Dwarf Fortress style. + +/datum/game_master/New(datum/controller/subsystem/game_master/new_ticker) + ticker = new_ticker + +/client/proc/show_gm_status() + set category = "Debug" + set name = "Show GM Status" + set desc = "Shows you what the GM is thinking. If only that existed in real life..." + + if(check_rights(R_ADMIN|R_EVENT|R_DEBUG)) + SSgame_master.interact(usr) + else + to_chat(usr, span("warning", "You do not have sufficent rights to view the GM panel, sorry.")) + +/datum/controller/subsystem/game_master/proc/interact(var/client/user) + if(!user) + return + + // Using lists for string tree conservation. + var/list/dat = list("Automated Game Master Event System") + + // Makes the system turn on or off. + dat += href(src, list("toggle" = 1), "\[Toggle GM\]") + dat += " | " + + // Makes the system not care about staleness or being near round-end. + dat += href(src, list("toggle_time_restrictions" = 1), "\[Toggle Time Restrictions\]") + dat += " | " + + // Makes the system not care about how chaotic the round might be. + dat += href(src, list("toggle_chaos_throttle" = 1), "\[Toggle Chaos Throttling\]") + dat += " | " + + // Makes the system immediately choose an event, while still bound to factors like danger, weights, and department staffing. + dat += href(src, list("force_choose_event" = 1), "\[Force Event Decision\]") + dat += "
" + + // Swaps out the current GM for a new one with different ideas on what a good event might be. + dat += href(src, list("change_gm" = 1), "\[Change GM\]") + dat += "
" + + dat += "Current GM Type: [GM.type]
" + dat += "State: [can_fire ? "Active": "Inactive"]
" + dat += "Status: [pre_event_checks(TRUE) ? "Ready" : "Suppressed"]

" + + dat += "Staleness: [staleness] " + dat += href(src, list("set_staleness" = 1), "\[Set\]") + dat += "
" + dat += "Staleness is an estimate of how boring the round might be, and if an event should be done. It is increased passively over time, \ + and increases faster if people are AFK. It deceases when events and certain 'interesting' things happen in the round.
" + + dat += "Danger: [danger] " + dat += href(src, list("set_danger" = 1), "\[Set\]") + dat += "
" + dat += "Danger is an estimate of how chaotic the round has been so far. It is decreased passively over time, and is increased by having \ + certain chaotic events be selected, or chaotic things happen in the round. A sufficently high amount of danger will make the system \ + avoid using destructive events, to avoid pushing the station over the edge.
" + + dat += "

Player Activity:

" + + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + + dat += "" + dat += "" + dat += "" + dat += "" + + dat += "" + dat += "" + dat += "" + dat += "" + + dat += "" + dat += "" + + for(var/D in metric.departments) + dat += "" + dat += "" + dat += "" + dat += "" + + dat += "" + dat += "" + + for(var/P in player_list) + var/mob/M = P + dat += "" + dat += "" + dat += "" + dat += "" + dat += "
CategoryActivity Percentage
All Living Mobs[metric.assess_all_living_mobs()]%
All Ghosts[metric.assess_all_dead_mobs()]%
Departments" + dat += "
[D][metric.assess_department(D)]%
Players" + dat += "
[M] ([M.ckey])[metric.assess_player_activity(M)]%
" + + dat += "

Events available:

" + + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + + for(var/E in available_events) + var/datum/event2/meta/event = E + dat += "" + if(!event.enabled) + dat += "" + else + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "
Event NameInvolved DepartmentsChaosChaotic ThresholdWeightButtons
[event.name][event.name][english_list(event.departments)][event.chaos][event.chaotic_threshold][event.get_weight()][href(event, list("force" = 1), "\[Force\]")] [href(event, list("toggle" = 1), "\[Toggle\]")]
" + + dat += "

Events active:

" + + dat += "Current time: [world.time]" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + + for(var/E in SSevent_ticker.active_events) + var/datum/event2/event/event = E + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "
Event TypeTime StartedTime to AnnounceTime to EndAnnouncedStartedEndedButtons
[event.type][event.time_started][event.time_to_announce ? event.time_to_announce : "NULL"][event.time_to_end ? event.time_to_end : "NULL"][event.announced ? "Yes" : "No"][event.started ? "Yes" : "No"][event.ended ? "Yes" : "No"][href(event, list("abort" = 1), "\[Abort\]")]
" + dat += "" + + dat += "

Events completed:

" + + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + + for(var/E in SSevent_ticker.finished_events) + var/datum/event2/event/event = E + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + + dat += "" + + var/datum/browser/popup = new(user, "game_master_debug", "Automated Game Master Event System", 800, 500, src) + popup.set_content(dat.Join()) + popup.open() + + +/datum/controller/subsystem/game_master/Topic(href, href_list) + if(..()) + return + + if(href_list["close"]) // Needed or the window re-opens after closing, making it last forever. + return + + if(!check_rights(R_ADMIN|R_EVENT|R_DEBUG)) + message_admins("[usr] has attempted to modify the Game Master values without sufficent privilages.") + return + + if(href_list["toggle"]) + can_fire = !can_fire + message_admins("GM was [!can_fire ? "dis" : "en"]abled by [usr.key].") + + if(href_list["toggle_time_restrictions"]) + GM.ignore_time_restrictions = !GM.ignore_time_restrictions + message_admins("GM event time restrictions was [GM.ignore_time_restrictions ? "dis" : "en"]abled by [usr.key].") + + if(href_list["toggle_chaos_throttle"]) + GM.ignore_round_chaos = !GM.ignore_round_chaos + message_admins("GM event chaos restrictions was [GM.ignore_round_chaos ? "dis" : "en"]abled by [usr.key].") + + if(href_list["force_choose_event"]) + do_event_decision() + message_admins("[usr.key] forced the Game Master to choose an event immediately.") + + if(href_list["change_gm"]) + choose_game_master(usr) + + if(href_list["set_staleness"]) + var/amount = input(usr, "How much staleness should there be?", "Game Master") as null|num + if(!isnull(amount)) + staleness = amount + message_admins("GM staleness was set to [amount] by [usr.key].") + + if(href_list["set_danger"]) + var/amount = input(usr, "How much danger should there be?", "Game Master") as null|num + if(!isnull(amount)) + danger = amount + message_admins("GM danger was set to [amount] by [usr.key].") + + interact(usr) // To refresh the UI. \ No newline at end of file diff --git a/code/controllers/subsystems/inactivity.dm b/code/controllers/subsystems/inactivity.dm index 6b74a6b553..2dbc642720 100644 --- a/code/controllers/subsystems/inactivity.dm +++ b/code/controllers/subsystems/inactivity.dm @@ -15,8 +15,7 @@ SUBSYSTEM_DEF(inactivity) while(client_list.len) var/client/C = client_list[client_list.len] client_list.len-- - if(!C.holder && C.is_afk(config.kick_inactive MINUTES) && !isobserver(C.mob)) - + if(C.is_afk(config.kick_inactive MINUTES) && can_kick(C)) to_chat(C, "You have been inactive for more than [config.kick_inactive] minute\s and have been disconnected.") var/information @@ -34,6 +33,9 @@ SUBSYSTEM_DEF(inactivity) if(job) information = " while [job]." + else if(isobserver(C.mob)) + information = " while a ghost." + else if(issilicon(C.mob)) information = " while a silicon." if(isAI(C.mob)) @@ -55,4 +57,7 @@ SUBSYSTEM_DEF(inactivity) return /datum/controller/subsystem/inactivity/stat_entry() - ..("Kicked: [number_kicked]") \ No newline at end of file + ..("Kicked: [number_kicked]") + +/datum/controller/subsystem/inactivity/proc/can_kick(var/client/C) + return TRUE diff --git a/code/controllers/subsystems/mapping.dm b/code/controllers/subsystems/mapping.dm index 7435aac505..e48b9f557f 100644 --- a/code/controllers/subsystems/mapping.dm +++ b/code/controllers/subsystems/mapping.dm @@ -16,8 +16,7 @@ SUBSYSTEM_DEF(mapping) if(config.generate_map) // Map-gen is still very specific to the map, however putting it here should ensure it loads in the correct order. - if(using_map.perform_map_generation()) - using_map.refresh_mining_turfs() + using_map.perform_map_generation() /datum/controller/subsystem/mapping/proc/load_map_templates() diff --git a/code/controllers/subsystems/mobs.dm b/code/controllers/subsystems/mobs.dm new file mode 100644 index 0000000000..1d7c263fb4 --- /dev/null +++ b/code/controllers/subsystems/mobs.dm @@ -0,0 +1,55 @@ +// +// Mobs Subsystem - Process mob.Life() +// + +SUBSYSTEM_DEF(mobs) + name = "Mobs" + priority = 100 + wait = 2 SECONDS + flags = SS_KEEP_TIMING|SS_NO_INIT + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + + var/list/currentrun = list() + var/log_extensively = FALSE + var/list/timelog = list() + var/list/busy_z_levels = list() + var/slept_mobs = 0 + +/datum/controller/subsystem/mobs/stat_entry() + ..("P: [global.mob_list.len] | S: [slept_mobs]") + +/datum/controller/subsystem/mobs/fire(resumed = 0) + var/list/busy_z_levels = src.busy_z_levels + + if (!resumed) + slept_mobs = 0 + src.currentrun = mob_list.Copy() + busy_z_levels.Cut() + for(var/played_mob in player_list) + if(!played_mob || isobserver(played_mob)) + continue + var/mob/pm = played_mob + busy_z_levels |= pm.z + + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + var/times_fired = src.times_fired + while(currentrun.len) + var/mob/M = currentrun[currentrun.len] + currentrun.len-- + + if(QDELETED(M)) + mob_list -= M + else + // Right now mob.Life() is unstable enough I think we need to use a try catch. + // Obviously we should try and get rid of this for performance reasons when we can. + try + if(M.low_priority && !(M.z in busy_z_levels)) + slept_mobs++ + continue + M.Life(times_fired) + catch(var/exception/e) + log_runtime(e, M, "Caught by [name] subsystem") + + if (MC_TICK_CHECK) + return diff --git a/code/controllers/subsystems/nanoui.dm b/code/controllers/subsystems/nanoui.dm index e622fce8f2..c916eb2739 100644 --- a/code/controllers/subsystems/nanoui.dm +++ b/code/controllers/subsystems/nanoui.dm @@ -1,41 +1,17 @@ SUBSYSTEM_DEF(nanoui) name = "NanoUI" wait = 5 + flags = SS_NO_INIT // a list of current open /nanoui UIs, grouped by src_object and ui_key var/list/open_uis = list() // a list of current open /nanoui UIs, not grouped, for use in processing var/list/processing_uis = list() - // a list of asset filenames which are to be sent to the client on user logon - var/list/asset_files = list() - -/datum/controller/subsystem/nanoui/Initialize() - var/list/nano_asset_dirs = list(\ - "nano/css/",\ - "nano/images/",\ - "nano/images/status_icons/",\ - "nano/images/modular_computers/",\ - "nano/js/",\ - "nano/templates/"\ - ) - - var/list/filenames = null - for (var/path in nano_asset_dirs) - filenames = flist(path) - for(var/filename in filenames) - if(copytext(filename, length(filename)) != "/") // filenames which end in "/" are actually directories, which we want to ignore - if(fexists(path + filename)) - asset_files.Add(fcopy_rsc(path + filename)) // add this file to asset_files for sending to clients when they connect - .=..() - for(var/i in GLOB.clients) - send_resources(i) /datum/controller/subsystem/nanoui/Recover() if(SSnanoui.open_uis) open_uis |= SSnanoui.open_uis if(SSnanoui.processing_uis) processing_uis |= SSnanoui.processing_uis - if(SSnanoui.asset_files) - asset_files |= SSnanoui.asset_files /datum/controller/subsystem/nanoui/stat_entry() return ..("[processing_uis.len] UIs") @@ -44,10 +20,3 @@ SUBSYSTEM_DEF(nanoui) for(var/thing in processing_uis) var/datum/nanoui/UI = thing UI.process() - -//Sends asset files to a client, called on client/New() -/datum/controller/subsystem/nanoui/proc/send_resources(client) - if(!subsystem_initialized) - return - for(var/file in asset_files) - client << browse_rsc(file) // send the file to the client \ No newline at end of file diff --git a/code/controllers/subsystems/processing/chemistry.dm b/code/controllers/subsystems/processing/chemistry.dm index 34094f9fe3..7f4fd9c42b 100644 --- a/code/controllers/subsystems/processing/chemistry.dm +++ b/code/controllers/subsystems/processing/chemistry.dm @@ -8,6 +8,14 @@ PROCESSING_SUBSYSTEM_DEF(chemistry) var/list/chemical_reagents = list() /datum/controller/subsystem/processing/chemistry/Recover() + log_debug("[name] subsystem Recover().") + if(SSchemistry.current_thing) + log_debug("current_thing was: (\ref[SSchemistry.current_thing])[SSchemistry.current_thing]([SSchemistry.current_thing.type]) - currentrun: [SSchemistry.currentrun.len] vs total: [SSchemistry.processing.len]") + var/list/old_processing = SSchemistry.processing.Copy() + for(var/datum/D in old_processing) + if(CHECK_BITFIELD(D.datum_flags, DF_ISPROCESSING)) + processing |= D + chemical_reactions = SSchemistry.chemical_reactions chemical_reagents = SSchemistry.chemical_reagents diff --git a/code/controllers/subsystems/processing/fastprocess.dm b/code/controllers/subsystems/processing/fastprocess.dm index 9622e02146..bda0bb6fb6 100644 --- a/code/controllers/subsystems/processing/fastprocess.dm +++ b/code/controllers/subsystems/processing/fastprocess.dm @@ -4,3 +4,12 @@ PROCESSING_SUBSYSTEM_DEF(fastprocess) name = "Fast Processing" wait = 2 stat_tag = "FP" + +/datum/controller/subsystem/processing/fastprocess/Recover() + log_debug("[name] subsystem Recover().") + if(SSfastprocess.current_thing) + log_debug("current_thing was: (\ref[SSfastprocess.current_thing])[SSfastprocess.current_thing]([SSfastprocess.current_thing.type]) - currentrun: [SSfastprocess.currentrun.len] vs total: [SSfastprocess.processing.len]") + var/list/old_processing = SSfastprocess.processing.Copy() + for(var/datum/D in old_processing) + if(CHECK_BITFIELD(D.datum_flags, DF_ISPROCESSING)) + processing |= D \ No newline at end of file diff --git a/code/controllers/subsystems/processing/obj.dm b/code/controllers/subsystems/processing/obj.dm index 26021fb267..37f3acc7c6 100644 --- a/code/controllers/subsystems/processing/obj.dm +++ b/code/controllers/subsystems/processing/obj.dm @@ -3,3 +3,14 @@ PROCESSING_SUBSYSTEM_DEF(obj) priority = FIRE_PRIORITY_OBJ flags = SS_NO_INIT wait = 20 + +/datum/controller/subsystem/processing/obj/Recover() + log_debug("[name] subsystem Recover().") + if(SSobj.current_thing) + log_debug("current_thing was: (\ref[SSobj.current_thing])[SSobj.current_thing]([SSobj.current_thing.type]) - currentrun: [SSobj.currentrun.len] vs total: [SSobj.processing.len]") + var/list/old_processing = SSobj.processing.Copy() + for(var/datum/D in old_processing) + if(!isobj(D)) + log_debug("[name] subsystem Recover() found inappropriate item in list: [D.type]") + if(CHECK_BITFIELD(D.datum_flags, DF_ISPROCESSING)) + processing |= D \ No newline at end of file diff --git a/code/controllers/subsystems/processing/processing.dm b/code/controllers/subsystems/processing/processing.dm index ef54b8a4ab..3eeff489aa 100644 --- a/code/controllers/subsystems/processing/processing.dm +++ b/code/controllers/subsystems/processing/processing.dm @@ -13,6 +13,16 @@ SUBSYSTEM_DEF(processing) var/debug_last_thing var/debug_original_process_proc // initial() does not work with procs + var/datum/current_thing + +/datum/controller/subsystem/processing/Recover() + log_debug("[name] subsystem Recover().") + if(SSprocessing.current_thing) + log_debug("current_thing was: (\ref[SSprocessing.current_thing])[SSprocessing.current_thing]([SSprocessing.current_thing.type]) - currentrun: [SSprocessing.currentrun.len] vs total: [SSprocessing.processing.len]") + var/list/old_processing = SSprocessing.processing.Copy() + for(var/datum/D in old_processing) + if(CHECK_BITFIELD(D.datum_flags, DF_ISPROCESSING)) + processing |= D /datum/controller/subsystem/processing/stat_entry() ..("[stat_tag]:[processing.len]") @@ -24,16 +34,19 @@ SUBSYSTEM_DEF(processing) var/list/current_run = currentrun while(current_run.len) - var/datum/thing = current_run[current_run.len] + current_thing = current_run[current_run.len] current_run.len-- - if(QDELETED(thing)) - processing -= thing - else if(thing.process(wait) == PROCESS_KILL) + if(QDELETED(current_thing)) + processing -= current_thing + else if(current_thing.process(wait) == PROCESS_KILL) // fully stop so that a future START_PROCESSING will work - STOP_PROCESSING(src, thing) + STOP_PROCESSING(src, current_thing) if (MC_TICK_CHECK) + current_thing = null return + current_thing = null + /datum/controller/subsystem/processing/proc/toggle_debug() if(!check_rights(R_DEBUG)) return diff --git a/code/controllers/subsystems/processing/projectiles.dm b/code/controllers/subsystems/processing/projectiles.dm index 87c9f097de..e4316304ce 100644 --- a/code/controllers/subsystems/processing/projectiles.dm +++ b/code/controllers/subsystems/processing/projectiles.dm @@ -8,6 +8,15 @@ PROCESSING_SUBSYSTEM_DEF(projectiles) var/global_pixel_speed = 2 var/global_iterations_per_move = 16 +/datum/controller/subsystem/processing/projectiles/Recover() + log_debug("[name] subsystem Recover().") + if(SSprojectiles.current_thing) + log_debug("current_thing was: (\ref[SSprojectiles.current_thing])[SSprojectiles.current_thing]([SSprojectiles.current_thing.type]) - currentrun: [SSprojectiles.currentrun.len] vs total: [SSprojectiles.processing.len]") + var/list/old_processing = SSprojectiles.processing.Copy() + for(var/datum/D in old_processing) + if(CHECK_BITFIELD(D.datum_flags, DF_ISPROCESSING)) + processing |= D + /datum/controller/subsystem/processing/projectiles/proc/set_pixel_speed(new_speed) global_pixel_speed = new_speed for(var/i in processing) diff --git a/code/controllers/subsystems/processing/turfs.dm b/code/controllers/subsystems/processing/turfs.dm index 941513527e..d28f4b4809 100644 --- a/code/controllers/subsystems/processing/turfs.dm +++ b/code/controllers/subsystems/processing/turfs.dm @@ -1,3 +1,14 @@ PROCESSING_SUBSYSTEM_DEF(turfs) name = "Turf Processing" wait = 20 + +/datum/controller/subsystem/processing/turfs/Recover() + log_debug("[name] subsystem Recover().") + if(SSturfs.current_thing) + log_debug("current_thing was: (\ref[SSturfs.current_thing])[SSturfs.current_thing]([SSturfs.current_thing.type]) - currentrun: [SSturfs.currentrun.len] vs total: [SSturfs.processing.len]") + var/list/old_processing = SSturfs.processing.Copy() + for(var/datum/D in old_processing) + if(!isturf(D)) + log_debug("[name] subsystem Recover() found inappropriate item in list: [D.type]") + if(CHECK_BITFIELD(D.datum_flags, DF_ISPROCESSING)) + processing |= D \ No newline at end of file diff --git a/code/controllers/subsystems/shuttles.dm b/code/controllers/subsystems/shuttles.dm index 35a93a5eac..27bbbae027 100644 --- a/code/controllers/subsystems/shuttles.dm +++ b/code/controllers/subsystems/shuttles.dm @@ -15,7 +15,6 @@ SUBSYSTEM_DEF(shuttles) flags = SS_KEEP_TIMING|SS_NO_TICK_CHECK runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME - // TODO OVERMAP - These two are unused for now var/overmap_halted = FALSE // Whether ships can move on the overmap; used for adminbus. var/list/ships = list() // List of all ships. @@ -99,14 +98,13 @@ SUBSYSTEM_DEF(shuttles) registered_shuttle_landmarks[shuttle_landmark_tag] = shuttle_landmark last_landmark_registration_time = world.time - // TODO - Uncomment once overmap sectors are ported - //var/obj/effect/overmap/visitable/O = landmarks_still_needed[shuttle_landmark_tag] - //if(O) //These need to be added to sectors, which we handle. - // try_add_landmark_tag(shuttle_landmark_tag, O) - // landmarks_still_needed -= shuttle_landmark_tag - //else if(istype(shuttle_landmark, /obj/effect/shuttle_landmark/automatic)) //These find their sector automatically - // O = map_sectors["[shuttle_landmark.z]"] - // O ? O.add_landmark(shuttle_landmark, shuttle_landmark.shuttle_restricted) : (landmarks_awaiting_sector += shuttle_landmark) + var/obj/effect/overmap/visitable/O = landmarks_still_needed[shuttle_landmark_tag] + if(O) //These need to be added to sectors, which we handle. + try_add_landmark_tag(shuttle_landmark_tag, O) + landmarks_still_needed -= shuttle_landmark_tag + else if(istype(shuttle_landmark, /obj/effect/shuttle_landmark/automatic)) //These find their sector automatically + O = map_sectors["[shuttle_landmark.z]"] + O ? O.add_landmark(shuttle_landmark, shuttle_landmark.shuttle_restricted) : (landmarks_awaiting_sector += shuttle_landmark) /datum/controller/subsystem/shuttles/proc/get_landmark(var/shuttle_landmark_tag) return registered_shuttle_landmarks[shuttle_landmark_tag] @@ -114,39 +112,37 @@ SUBSYSTEM_DEF(shuttles) //Checks if the given sector's landmarks have initialized; if so, registers them with the sector, if not, marks them for assignment after they come in. //Also adds automatic landmarks that were waiting on their sector to spawn. /datum/controller/subsystem/shuttles/proc/initialize_sector(obj/effect/overmap/visitable/given_sector) - return // TODO - Uncomment once overmap sectors are ported -// given_sector.populate_sector_objects() // This is a late init operation that sets up the sector's map_z and does non-overmap-related init tasks. + given_sector.populate_sector_objects() // This is a late init operation that sets up the sector's map_z and does non-overmap-related init tasks. -// for(var/landmark_tag in given_sector.initial_generic_waypoints) -// if(!try_add_landmark_tag(landmark_tag, given_sector)) -// landmarks_still_needed[landmark_tag] = given_sector // Landmark isn't registered yet, queue it to be added once it is. + for(var/landmark_tag in given_sector.initial_generic_waypoints) + if(!try_add_landmark_tag(landmark_tag, given_sector)) + landmarks_still_needed[landmark_tag] = given_sector // Landmark isn't registered yet, queue it to be added once it is. -// for(var/shuttle_name in given_sector.initial_restricted_waypoints) -// for(var/landmark_tag in given_sector.initial_restricted_waypoints[shuttle_name]) -// if(!try_add_landmark_tag(landmark_tag, given_sector)) -// landmarks_still_needed[landmark_tag] = given_sector // Landmark isn't registered yet, queue it to be added once it is. + for(var/shuttle_name in given_sector.initial_restricted_waypoints) + for(var/landmark_tag in given_sector.initial_restricted_waypoints[shuttle_name]) + if(!try_add_landmark_tag(landmark_tag, given_sector)) + landmarks_still_needed[landmark_tag] = given_sector // Landmark isn't registered yet, queue it to be added once it is. -// var/landmarks_to_check = landmarks_awaiting_sector.Copy() -// for(var/thing in landmarks_to_check) -// var/obj/effect/shuttle_landmark/automatic/landmark = thing -// if(landmark.z in given_sector.map_z) -// given_sector.add_landmark(landmark, landmark.shuttle_restricted) -// landmarks_awaiting_sector -= landmark + var/landmarks_to_check = landmarks_awaiting_sector.Copy() + for(var/thing in landmarks_to_check) + var/obj/effect/shuttle_landmark/automatic/landmark = thing + if(landmark.z in given_sector.map_z) + given_sector.add_landmark(landmark, landmark.shuttle_restricted) + landmarks_awaiting_sector -= landmark -// TODO - Uncomment once overmap sectors are ported -//// Attempts to add a landmark instance with a sector (returns false if landmark isn't registered yet) -///datum/controller/subsystem/shuttles/proc/try_add_landmark_tag(landmark_tag, obj/effect/overmap/visitable/given_sector) -// var/obj/effect/shuttle_landmark/landmark = get_landmark(landmark_tag) -// if(!landmark) -// return +// Attempts to add a landmark instance with a sector (returns false if landmark isn't registered yet) +/datum/controller/subsystem/shuttles/proc/try_add_landmark_tag(landmark_tag, obj/effect/overmap/visitable/given_sector) + var/obj/effect/shuttle_landmark/landmark = get_landmark(landmark_tag) + if(!landmark) + return -// if(landmark.landmark_tag in given_sector.initial_generic_waypoints) -// given_sector.add_landmark(landmark) -// . = 1 -// for(var/shuttle_name in given_sector.initial_restricted_waypoints) -// if(landmark.landmark_tag in given_sector.initial_restricted_waypoints[shuttle_name]) -// given_sector.add_landmark(landmark, shuttle_name) -// . = 1 + if(landmark.landmark_tag in given_sector.initial_generic_waypoints) + given_sector.add_landmark(landmark) + . = 1 + for(var/shuttle_name in given_sector.initial_restricted_waypoints) + if(landmark.landmark_tag in given_sector.initial_restricted_waypoints[shuttle_name]) + given_sector.add_landmark(landmark, shuttle_name) + . = 1 /datum/controller/subsystem/shuttles/proc/initialize_shuttle(var/shuttle_type) var/datum/shuttle/shuttle = shuttle_type @@ -170,13 +166,13 @@ SUBSYSTEM_DEF(shuttles) error("Shuttle [S] was unable to find mothership [mothership]!") // Admin command to halt/resume overmap -// /datum/controller/subsystem/shuttles/proc/toggle_overmap(new_setting) -// if(overmap_halted == new_setting) -// return -// overmap_halted = !overmap_halted -// for(var/ship in ships) -// var/obj/effect/overmap/visitable/ship/ship_effect = ship -// overmap_halted ? ship_effect.halt() : ship_effect.unhalt() +/datum/controller/subsystem/shuttles/proc/toggle_overmap(new_setting) + if(overmap_halted == new_setting) + return + overmap_halted = !overmap_halted + for(var/ship in ships) + var/obj/effect/overmap/visitable/ship/ship_effect = ship + overmap_halted ? ship_effect.halt() : ship_effect.unhalt() /datum/controller/subsystem/shuttles/stat_entry() ..("Shuttles:[process_shuttles.len]/[shuttles.len], Ships:[ships.len], L:[registered_shuttle_landmarks.len][overmap_halted ? ", HALT" : ""]") diff --git a/code/controllers/subsystems/skybox.dm b/code/controllers/subsystems/skybox.dm new file mode 100644 index 0000000000..6f96830c56 --- /dev/null +++ b/code/controllers/subsystems/skybox.dm @@ -0,0 +1,135 @@ + +//Exists to handle a few global variables that change enough to justify this. Technically a parallax, but it exhibits a skybox effect. +SUBSYSTEM_DEF(skybox) + name = "Space skybox" + init_order = INIT_ORDER_SKYBOX + flags = SS_NO_FIRE + var/static/list/skybox_cache = list() + + var/static/list/dust_cache = list() + var/static/list/speedspace_cache = list() + var/static/list/mapedge_cache = list() + var/static/list/phase_shift_by_x = list() + var/static/list/phase_shift_by_y = list() + +/datum/controller/subsystem/skybox/PreInit() + //Static + for (var/i in 0 to 25) + var/image/im = image('icons/turf/space_dust.dmi', "[i]") + im.plane = DUST_PLANE + im.alpha = 128 //80 + im.blend_mode = BLEND_ADD + dust_cache["[i]"] = im + //Moving + for (var/i in 0 to 14) + // NORTH/SOUTH + var/image/im = image('icons/turf/space_dust_transit.dmi', "speedspace_ns_[i]") + im.plane = DUST_PLANE + im.blend_mode = BLEND_ADD + speedspace_cache["NS_[i]"] = im + // EAST/WEST + im = image('icons/turf/space_dust_transit.dmi', "speedspace_ew_[i]") + im.plane = DUST_PLANE + im.blend_mode = BLEND_ADD + speedspace_cache["EW_[i]"] = im + //Over-the-edge images + for (var/dir in alldirs) + var/image/I = image('icons/turf/space.dmi', "white") + var/matrix/M = matrix() + var/horizontal = (dir & (WEST|EAST)) + var/vertical = (dir & (NORTH|SOUTH)) + M.Scale(horizontal ? 8 : 1, vertical ? 8 : 1) + I.transform = M + I.appearance_flags = KEEP_APART | TILE_BOUND + I.plane = SPACE_PLANE + I.layer = 0 + + if(dir & NORTH) + I.pixel_y = 112 + else if(dir & SOUTH) + I.pixel_y = -112 + + if(dir & EAST) + I.pixel_x = 112 + else if(dir & WEST) + I.pixel_x = -112 + + mapedge_cache["[dir]"] = I + + //Shuffle some lists + phase_shift_by_x = get_cross_shift_list(15) + phase_shift_by_y = get_cross_shift_list(15) + + . = ..() + +/datum/controller/subsystem/skybox/Initialize() + . = ..() + +/datum/controller/subsystem/skybox/proc/get_skybox(z) + if(!skybox_cache["[z]"]) + skybox_cache["[z]"] = generate_skybox(z) + if(global.using_map.use_overmap) + var/obj/effect/overmap/visitable/O = map_sectors["[z]"] + if(istype(O)) + for(var/zlevel in O.map_z) + skybox_cache["[zlevel]"] = skybox_cache["[z]"] + return skybox_cache["[z]"] + +/datum/controller/subsystem/skybox/proc/generate_skybox(z) + var/datum/skybox_settings/settings = global.using_map.get_skybox_datum(z) + + var/image/res = image(settings.icon) + res.appearance_flags = KEEP_TOGETHER + + var/image/base = image(settings.icon, settings.icon_state) + base.color = settings.color + + if(settings.use_stars) + var/image/stars = image(settings.icon, settings.star_state) + stars.appearance_flags = RESET_COLOR + base.overlays += stars + + res.overlays += base + + if(global.using_map.use_overmap && settings.use_overmap_details) + var/obj/effect/overmap/visitable/O = map_sectors["[z]"] + if(istype(O)) + var/image/overmap = image(settings.icon) + overmap.overlays += O.generate_skybox() + for(var/obj/effect/overmap/visitable/other in O.loc) + if(other != O) + overmap.overlays += other.get_skybox_representation() + overmap.appearance_flags = RESET_COLOR + res.overlays += overmap + + // Allow events to apply custom overlays to skybox! (Awesome!) + for(var/datum/event/E in SSevents.active_events) + if(E.has_skybox_image && E.isRunning && (z in E.affecting_z)) + res.overlays += E.get_skybox_image() + + return res + +/datum/controller/subsystem/skybox/proc/rebuild_skyboxes(var/list/zlevels) + for(var/z in zlevels) + skybox_cache["[z]"] = generate_skybox(z) + + for(var/client/C) + C.update_skybox(1) + +// Settings datum that maps can override to play with their skyboxes +/datum/skybox_settings + var/icon = 'icons/skybox/skybox.dmi' //Path to our background. Lets us use anything we damn well please. Skyboxes need to be 736x736 + var/icon_state = "dyable" + var/color + var/random_color = FALSE + + var/use_stars = TRUE + var/star_icon = 'icons/skybox/skybox.dmi' + var/star_state = "stars" + + var/use_overmap_details = TRUE //Do we try to draw overmap visitables in our sector on the map? + +/datum/skybox_settings/New() + ..() + if(random_color) + color = rgb(rand(0,255), rand(0,255), rand(0,255)) diff --git a/code/controllers/Processes/supply.dm b/code/controllers/subsystems/supply.dm similarity index 88% rename from code/controllers/Processes/supply.dm rename to code/controllers/subsystems/supply.dm index 6aa5c45f84..1c848cff96 100644 --- a/code/controllers/Processes/supply.dm +++ b/code/controllers/subsystems/supply.dm @@ -1,33 +1,15 @@ - -// TODO - Refactor to use the Supply Subsystem (SSsupply) - //Supply packs are in /code/datums/supplypacks //Computers are in /code/game/machinery/computer/supply.dm +SUBSYSTEM_DEF(supply) + name = "Supply" + wait = 20 SECONDS + priority = FIRE_PRIORITY_SUPPLY + //Initializes at default time + flags = SS_NO_TICK_CHECK -/datum/supply_order - var/ordernum // Unfabricatable index - var/index // Fabricatable index - var/datum/supply_pack/object = null - var/cost // Cost of the supply pack (Fabricatable) (Changes not reflected when purchasing supply packs, this is cosmetic only) - var/name // Name of the supply pack datum (Fabricatable) - var/ordered_by = null // Who requested the order - var/comment = null // What reason was given for the order - var/approved_by = null // Who approved the order - var/ordered_at // Date and time the order was requested at - var/approved_at // Date and time the order was approved at - var/status // [Requested, Accepted, Denied, Shipped] - -/datum/exported_crate - var/name - var/value - var/list/contents - -var/datum/controller/supply/supply_controller = new() - -/datum/controller/supply //supply points var/points = 50 - var/points_per_process = 1.5 + var/points_per_process = 1.0 // Processes every 20 seconds, so this is 3 per minute var/points_per_slip = 2 var/points_per_money = 0.02 // 1 point for $50 //control @@ -46,9 +28,10 @@ var/datum/controller/supply/supply_controller = new() "platinum" = 5 ) -/datum/controller/supply/New() +/datum/controller/subsystem/supply/Initialize() ordernum = rand(1,9000) + // build master supply list for(var/typepath in subtypesof(/datum/supply_pack)) var/datum/supply_pack/P = new typepath() if(P.name) @@ -56,20 +39,18 @@ var/datum/controller/supply/supply_controller = new() else qdel(P) -/datum/controller/process/supply/setup() - name = "supply controller" - schedule_interval = 300 // every 30 seconds + // TODO - Auto-build material_points_conversion from material datums + . = ..() -/datum/controller/process/supply/doWork() - supply_controller.process() - -// Supply shuttle ticker - handles supply point regeneration -// This is called by the process scheduler every thirty seconds -/datum/controller/supply/process() +// Supply shuttle ticker - handles supply point regeneration. Just add points over time. +/datum/controller/subsystem/supply/fire() points += points_per_process +/datum/controller/subsystem/supply/stat_entry() + ..("Points: [points]") + //To stop things being sent to CentCom which should not be sent to centcomm. Recursively checks for these types. -/datum/controller/supply/proc/forbidden_atoms_check(atom/A) +/datum/controller/subsystem/supply/proc/forbidden_atoms_check(atom/A) if(isliving(A)) return 1 if(istype(A,/obj/item/weapon/disk/nuclear)) @@ -84,7 +65,7 @@ var/datum/controller/supply/supply_controller = new() return 1 //Selling -/datum/controller/supply/proc/sell() +/datum/controller/subsystem/supply/proc/sell() // Loop over each area in the supply shuttle for(var/area/subarea in shuttle.shuttle_area) callHook("sell_shuttle", list(subarea)); @@ -160,7 +141,7 @@ var/datum/controller/supply/supply_controller = new() qdel(MA) -/datum/controller/supply/proc/get_clear_turfs() +/datum/controller/subsystem/supply/proc/get_clear_turfs() var/list/clear_turfs = list() for(var/area/subarea in shuttle.shuttle_area) @@ -179,7 +160,7 @@ var/datum/controller/supply/supply_controller = new() return clear_turfs //Buying -/datum/controller/supply/proc/buy() +/datum/controller/subsystem/supply/proc/buy() var/list/shoppinglist = list() for(var/datum/supply_order/SO in order_history) if(SO.status == SUP_ORDER_APPROVED) @@ -258,9 +239,9 @@ var/datum/controller/supply/supply_controller = new() return // Will attempt to purchase the specified order, returning TRUE on success, FALSE on failure -/datum/controller/supply/proc/approve_order(var/datum/supply_order/O, var/mob/user) +/datum/controller/subsystem/supply/proc/approve_order(var/datum/supply_order/O, var/mob/user) // Not enough points to purchase the crate - if(supply_controller.points <= O.object.cost) + if(points <= O.object.cost) return FALSE // Based on the current model, there shouldn't be any entries in order_history, requestlist, or shoppinglist, that aren't matched in adm_order_history @@ -287,11 +268,11 @@ var/datum/controller/supply/supply_controller = new() adm_order.approved_at = stationdate2text() + " - " + stationtime2text() // Deduct cost - supply_controller.points -= O.object.cost + points -= O.object.cost return TRUE // Will deny the specified order. Only useful if the order is currently requested, but available at any status -/datum/controller/supply/proc/deny_order(var/datum/supply_order/O, var/mob/user) +/datum/controller/subsystem/supply/proc/deny_order(var/datum/supply_order/O, var/mob/user) // Based on the current model, there shouldn't be any entries in order_history, requestlist, or shoppinglist, that aren't matched in adm_order_history var/datum/supply_order/adm_order for(var/datum/supply_order/temp in adm_order_history) @@ -317,22 +298,22 @@ var/datum/controller/supply/supply_controller = new() return // Will deny all requested orders -/datum/controller/supply/proc/deny_all_pending(var/mob/user) +/datum/controller/subsystem/supply/proc/deny_all_pending(var/mob/user) for(var/datum/supply_order/O in order_history) if(O.status == SUP_ORDER_REQUESTED) deny_order(O, user) // Will delete the specified order from the user-side list -/datum/controller/supply/proc/delete_order(var/datum/supply_order/O, var/mob/user) +/datum/controller/subsystem/supply/proc/delete_order(var/datum/supply_order/O, var/mob/user) // Making sure they know what they're doing if(alert(user, "Are you sure you want to delete this record? If it has been approved, cargo points will NOT be refunded!", "Delete Record","No","Yes") == "Yes") if(alert(user, "Are you really sure? There is no way to recover the order once deleted.", "Delete Record", "No", "Yes") == "Yes") log_admin("[key_name(user)] has deleted supply order \ref[O] [O] from the user-side order history.") - supply_controller.order_history -= O + order_history -= O return // Will generate a new, requested order, for the given supply pack type -/datum/controller/supply/proc/create_order(var/datum/supply_pack/S, var/mob/user, var/reason) +/datum/controller/subsystem/supply/proc/create_order(var/datum/supply_pack/S, var/mob/user, var/reason) var/datum/supply_order/new_order = new() var/datum/supply_order/adm_order = new() // Admin-recorded order must be a separate copy in memory, or user-made edits will corrupt it @@ -367,16 +348,16 @@ var/datum/controller/supply/supply_controller = new() adm_order_history += adm_order // Will delete the specified export receipt from the user-side list -/datum/controller/supply/proc/delete_export(var/datum/exported_crate/E, var/mob/user) +/datum/controller/subsystem/supply/proc/delete_export(var/datum/exported_crate/E, var/mob/user) // Making sure they know what they're doing if(alert(user, "Are you sure you want to delete this record?", "Delete Record","No","Yes") == "Yes") if(alert(user, "Are you really sure? There is no way to recover the receipt once deleted.", "Delete Record", "No", "Yes") == "Yes") log_admin("[key_name(user)] has deleted export receipt \ref[E] [E] from the user-side export history.") - supply_controller.exported_crates -= E + exported_crates -= E return // Will add an item entry to the specified export receipt on the user-side list -/datum/controller/supply/proc/add_export_item(var/datum/exported_crate/E, var/mob/user) +/datum/controller/subsystem/supply/proc/add_export_item(var/datum/exported_crate/E, var/mob/user) var/new_name = input(user, "Name", "Please enter the name of the item.") as null|text if(!new_name) return @@ -394,3 +375,21 @@ var/datum/controller/supply/supply_controller = new() "quantity" = new_quantity, "value" = new_value ) + +/datum/exported_crate + var/name + var/value + var/list/contents + +/datum/supply_order + var/ordernum // Unfabricatable index + var/index // Fabricatable index + var/datum/supply_pack/object = null + var/cost // Cost of the supply pack (Fabricatable) (Changes not reflected when purchasing supply packs, this is cosmetic only) + var/name // Name of the supply pack datum (Fabricatable) + var/ordered_by = null // Who requested the order + var/comment = null // What reason was given for the order + var/approved_by = null // Who approved the order + var/ordered_at // Date and time the order was requested at + var/approved_at // Date and time the order was approved at + var/status // [Requested, Accepted, Denied, Shipped] diff --git a/code/controllers/subsystems/vote.dm b/code/controllers/subsystems/vote.dm index e9891d25fc..73dfbe4366 100644 --- a/code/controllers/subsystems/vote.dm +++ b/code/controllers/subsystems/vote.dm @@ -350,7 +350,8 @@ SUBSYSTEM_DEF(vote) if("cancel") if(usr.client.holder) - reset() + if("Yes" == alert(usr, "You are about to cancel this vote. Are you sure?", "Cancel Vote", "No", "Yes")) + reset() if("toggle_restart") if(usr.client.holder) config.allow_vote_restart = !config.allow_vote_restart diff --git a/code/controllers/subsystems/xenoarch.dm b/code/controllers/subsystems/xenoarch.dm index d863ad8269..c8184d783e 100644 --- a/code/controllers/subsystems/xenoarch.dm +++ b/code/controllers/subsystems/xenoarch.dm @@ -30,7 +30,7 @@ SUBSYSTEM_DEF(xenoarch) . = ..() /datum/controller/subsystem/xenoarch/proc/SetupXenoarch() - for(var/turf/simulated/mineral/M in turfs) + for(var/turf/simulated/mineral/M in world) if(!M.density || M.z in using_map.xenoarch_exempt_levels) continue diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 4f0650e897..2dc3b1626b 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -94,14 +94,12 @@ options["LEGACY: air_master"] = air_master options["LEGACY: job_master"] = job_master options["LEGACY: radio_controller"] = radio_controller - options["LEGACY: supply_controller"] = supply_controller options["LEGACY: emergency_shuttle"] = emergency_shuttle options["LEGACY: paiController"] = paiController options["LEGACY: cameranet"] = cameranet options["LEGACY: transfer_controller"] = transfer_controller options["LEGACY: gas_data"] = gas_data options["LEGACY: plant_controller"] = plant_controller - options["LEGACY: alarm_manager"] = alarm_manager var/pick = input(mob, "Choose a controller to debug/view variables of.", "VV controller:") as null|anything in options if(!pick) diff --git a/code/datums/game_masters/_common.dm b/code/datums/game_masters/_common.dm new file mode 100644 index 0000000000..1d1fd24e0a --- /dev/null +++ b/code/datums/game_masters/_common.dm @@ -0,0 +1,6 @@ +// Push button, receive event. +// Returns a selected event datum. +/datum/game_master/proc/choose_event() + +/datum/game_master/proc/log_game_master(message) + SSgame_master.log_game_master(message) \ No newline at end of file diff --git a/code/datums/game_masters/default.dm b/code/datums/game_masters/default.dm new file mode 100644 index 0000000000..d846d9c7c1 --- /dev/null +++ b/code/datums/game_masters/default.dm @@ -0,0 +1,89 @@ +// The default game master tries to choose events with these goals in mind. +// * Don't choose an event if the crew can't take it. E.g. no meteors after half of the crew died. +// * Try to involve lots of people, particuarly in active departments. +// * Avoid giving events to the same department multiple times in a row. +/datum/game_master/default + // If an event was done for a specific department, it is written here, so it doesn't do it again. + var/last_department_used = null + + +/datum/game_master/default/choose_event() + log_game_master("Now starting event decision.") + + var/list/most_active_departments = metric.assess_all_departments(3, list(last_department_used)) + var/list/best_events = decide_best_events(most_active_departments) + + if(LAZYLEN(best_events)) + log_game_master("Got [best_events.len] choice\s for the next event.") + var/list/weighted_events = list() + + for(var/E in best_events) + var/datum/event2/meta/event = E + var/weight = event.get_weight() + if(weight <= 0) + continue + weighted_events[event] = weight + log_game_master("Filtered down to [weighted_events.len] choice\s.") + + var/datum/event2/meta/choice = pickweight(weighted_events) + + if(choice) + log_game_master("[choice.name] was chosen, and is now being ran.") + last_department_used = LAZYACCESS(choice.departments, 1) + return choice + +/datum/game_master/default/proc/decide_best_events(list/most_active_departments) + if(!LAZYLEN(most_active_departments)) // Server's empty? + log_game_master("Game Master failed to find any active departments.") + return list() + + var/list/best_events = list() + if(most_active_departments.len >= 2) + var/list/top_two = list(most_active_departments[1], most_active_departments[2]) + best_events = filter_events_by_departments(top_two) + + if(LAZYLEN(best_events)) // We found something for those two, let's do it. + return best_events + + // Otherwise we probably couldn't find something for the second highest group, so let's ignore them. + best_events = filter_events_by_departments(most_active_departments[1]) + + if(LAZYLEN(best_events)) + return best_events + + // At this point we should expand our horizons. + best_events = filter_events_by_departments(list(DEPARTMENT_EVERYONE)) + + if(LAZYLEN(best_events)) + return best_events + + // Just give a random event if for some reason it still can't make up its mind. + best_events = filter_events_by_departments() + + if(LAZYLEN(best_events)) + return best_events + + log_game_master("Game Master failed to find a suitable event, something very wrong is going on.") + return list() + +// Filters the available events down to events for specific departments. +// Pass DEPARTMENT_EVERYONE if you want events that target the general population, like gravity failure. +// If no list is passed, all the events will be returned. +/datum/game_master/default/proc/filter_events_by_departments(list/departments) + . = list() + for(var/E in ticker.available_events) + var/datum/event2/meta/event = E + if(!event.enabled) + continue + if(event.chaotic_threshold && !ignore_round_chaos) + if(ticker.danger > event.chaotic_threshold) + continue + // An event has to involve all of these departments to pass. + var/viable = TRUE + if(LAZYLEN(departments)) + for(var/department in departments) + if(!LAZYFIND(departments, department)) + viable = FALSE + break + if(viable) + . += event diff --git a/code/datums/game_masters/other_game_masters.dm b/code/datums/game_masters/other_game_masters.dm new file mode 100644 index 0000000000..489c359ace --- /dev/null +++ b/code/datums/game_masters/other_game_masters.dm @@ -0,0 +1,44 @@ +// The `classic` game master tries to act like the old system, choosing events without any specific goals. +// * Has no goals, and instead operates purely off of the weights of the events it has. +// * Does not react to danger at all. +/datum/game_master/classic/choose_event() + var/list/weighted_events = list() + for(var/E in ticker.available_events) + var/datum/event2/meta/event = E + if(!event.enabled) + continue + weighted_events[event] = event.get_weight() + + var/datum/event2/meta/choice = pickweight(weighted_events) + + if(choice) + log_game_master("[choice.name] was chosen, and is now being ran.") + return choice + + +// The `super_random` game master chooses events purely at random, ignoring weights entirely. +// * Has no goals, and instead chooses randomly, ignoring weights. +// * Does not react to danger at all. +/datum/game_master/super_random/choose_event() + return pick(ticker.available_events) + + +// The `brutal` game master tries to run dangerous events frequently. +// * Chaotic events have their weights artifically boosted. +// * Ignores accumulated danger. +/datum/game_master/brutal + ignore_round_chaos = TRUE + +/datum/game_master/brutal/choose_event() + var/list/weighted_events = list() + for(var/E in ticker.available_events) + var/datum/event2/meta/event = E + if(!event.enabled) + continue + weighted_events[event] = event.get_weight() + (event.chaos * 2) + + var/datum/event2/meta/choice = pickweight(weighted_events) + + if(choice) + log_game_master("[choice.name] was chosen, and is now being ran.") + return choice diff --git a/code/datums/observation/helpers.dm b/code/datums/observation/helpers.dm index 9116026700..12feeba16d 100644 --- a/code/datums/observation/helpers.dm +++ b/code/datums/observation/helpers.dm @@ -9,6 +9,9 @@ /atom/proc/recursive_dir_set(var/atom/a, var/old_dir, var/new_dir) set_dir(new_dir) +/datum/proc/qdel_self() + qdel(src) + /proc/register_all_movement(var/event_source, var/listener) GLOB.moved_event.register(event_source, listener, /atom/movable/proc/recursive_move) GLOB.dir_set_event.register(event_source, listener, /atom/proc/recursive_dir_set) diff --git a/code/datums/observation/stat_set.dm b/code/datums/observation/stat_set.dm new file mode 100644 index 0000000000..b980d06ecc --- /dev/null +++ b/code/datums/observation/stat_set.dm @@ -0,0 +1,24 @@ +// Observer Pattern Implementation: Stat Set +// Registration type: /mob/living +// +// Raised when: A /mob/living changes stat, using the set_stat() proc +// +// Arguments that the called proc should expect: +// /mob/living/stat_mob: The mob whose stat changed +// /old_stat: Status before the change. +// /new_stat: Status after the change. + +GLOBAL_DATUM_INIT(stat_set_event, /decl/observ/stat_set, new) + +/decl/observ/stat_set + name = "Stat Set" + expected_type = /mob/living + +/**************** +* Stat Handling * +****************/ +/mob/living/set_stat(var/new_stat) + var/old_stat = stat + . = ..() + if(stat != old_stat) + GLOB.stat_set_event.raise_event(src, old_stat, new_stat) diff --git a/code/datums/repositories/crew.dm b/code/datums/repositories/crew.dm index 88ea491e51..f67a17ca75 100644 --- a/code/datums/repositories/crew.dm +++ b/code/datums/repositories/crew.dm @@ -48,10 +48,10 @@ var/global/datum/repository/crew/crew_repository = new() if(C.sensor_mode >= SUIT_SENSOR_TRACKING) var/area/A = get_area(H) - crewmemberData["area"] = sanitize(A.name) + crewmemberData["area"] = sanitize(A.get_name()) crewmemberData["x"] = pos.x crewmemberData["y"] = pos.y - crewmemberData["z"] = pos.z + crewmemberData["z"] = using_map.get_zlevel_name(pos.z) crewmembers[++crewmembers.len] = crewmemberData diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm index 554a826f20..1b164a2cdf 100644 --- a/code/datums/supplypacks/medical.dm +++ b/code/datums/supplypacks/medical.dm @@ -339,14 +339,14 @@ /datum/supply_pack/med/distillery name = "Chemical distiller crate" contains = list(/obj/machinery/portable_atmospherics/powered/reagent_distillery = 1) - cost = 175 + cost = 50 containertype = /obj/structure/largecrate containername = "Chemical distiller crate" /datum/supply_pack/med/advdistillery name = "Industrial Chemical distiller crate" contains = list(/obj/machinery/portable_atmospherics/powered/reagent_distillery/industrial = 1) - cost = 250 + cost = 150 containertype = /obj/structure/largecrate containername = "Industrial Chemical distiller crate" diff --git a/code/datums/supplypacks/robotics.dm b/code/datums/supplypacks/robotics.dm index 1c1eb7f2bb..757d38b953 100644 --- a/code/datums/supplypacks/robotics.dm +++ b/code/datums/supplypacks/robotics.dm @@ -116,6 +116,15 @@ containername = "Robolimb blueprints (Bishop)" access = access_robotics +/datum/supply_pack/robotics/robolimbs/cenilimicybernetics + name = "Cenilimi Cybernetics robolimb blueprints" + contains = list(/obj/item/weapon/disk/limb/cenilimicybernetics) + cost = 45 + containertype = /obj/structure/closet/crate/secure/science + containername = "Robolimb blueprints (Cenilimi Cybernetics)" + access = access_robotics + + /datum/supply_pack/robotics/mecha_ripley name = "Circuit Crate (\"Ripley\" APLU)" contains = list( diff --git a/code/datums/uplink/badassery.dm b/code/datums/uplink/badassery.dm index 463c55dcc1..65f71f2584 100644 --- a/code/datums/uplink/badassery.dm +++ b/code/datums/uplink/badassery.dm @@ -91,4 +91,4 @@ var/obj/structure/largecrate/C = /obj/structure/largecrate icon = image(initial(C.icon), initial(C.icon_state)) - return "\icon[icon]" \ No newline at end of file + return "[bicon(icon)]" \ No newline at end of file diff --git a/code/datums/uplink/uplink_items.dm b/code/datums/uplink/uplink_items.dm index b6c8cf9952..cca1933c9c 100644 --- a/code/datums/uplink/uplink_items.dm +++ b/code/datums/uplink/uplink_items.dm @@ -146,7 +146,7 @@ datum/uplink_item/dd_SortValue() /datum/uplink_item/item/log_icon() var/obj/I = path - return "\icon[I]" + return "[bicon(I)]" /******************************** * * @@ -160,7 +160,7 @@ datum/uplink_item/dd_SortValue() if(!default_abstract_uplink_icon) default_abstract_uplink_icon = image('icons/obj/pda.dmi', "pda-syn") - return "\icon[default_abstract_uplink_icon]" + return "[bicon(default_abstract_uplink_icon)]" /* * Crated goods. diff --git a/code/datums/wires/camera.dm b/code/datums/wires/camera.dm index 69f1810331..67210e2179 100644 --- a/code/datums/wires/camera.dm +++ b/code/datums/wires/camera.dm @@ -60,7 +60,7 @@ var/const/CAMERA_WIRE_NOTHING2 = 32 C.light_disabled = !C.light_disabled if(CAMERA_WIRE_ALARM) - C.visible_message("\icon[C] *beep*", "\icon[C] *beep*") + C.visible_message("[bicon(C)] *beep*", "[bicon(C)] *beep*") return /datum/wires/camera/proc/CanDeconstruct() diff --git a/code/datums/wires/jukebox.dm b/code/datums/wires/jukebox.dm index 9bc0f2ca61..e207334ffd 100644 --- a/code/datums/wires/jukebox.dm +++ b/code/datums/wires/jukebox.dm @@ -34,16 +34,16 @@ var/const/WIRE_NEXT = 1024 var/obj/machinery/media/jukebox/A = holder switch(index) if(WIRE_POWER) - holder.visible_message("\icon[holder] The power light flickers.") + holder.visible_message("[bicon(holder)] The power light flickers.") A.shock(usr, 90) if(WIRE_HACK) - holder.visible_message("\icon[holder] The parental guidance light flickers.") + holder.visible_message("[bicon(holder)] The parental guidance light flickers.") if(WIRE_REVERSE) - holder.visible_message("\icon[holder] The data light blinks ominously.") + holder.visible_message("[bicon(holder)] The data light blinks ominously.") if(WIRE_SPEEDUP) - holder.visible_message("\icon[holder] The speakers squeaks.") + holder.visible_message("[bicon(holder)] The speakers squeaks.") if(WIRE_SPEEDDOWN) - holder.visible_message("\icon[holder] The speakers rumble.") + holder.visible_message("[bicon(holder)] The speakers rumble.") if(WIRE_START) A.StartPlaying() if(WIRE_STOP) diff --git a/code/datums/wires/mines.dm b/code/datums/wires/mines.dm index 2d0aecaaf0..372810988c 100644 --- a/code/datums/wires/mines.dm +++ b/code/datums/wires/mines.dm @@ -23,15 +23,15 @@ switch(index) if(WIRE_DETONATE) - C.visible_message("\icon[C] *BEEE-*", "\icon[C] *BEEE-*") + C.visible_message("[bicon(C)] *BEEE-*", "[bicon(C)] *BEEE-*") C.explode() if(WIRE_TIMED_DET) - C.visible_message("\icon[C] *BEEE-*", "\icon[C] *BEEE-*") + C.visible_message("[bicon(C)] *BEEE-*", "[bicon(C)] *BEEE-*") C.explode() if(WIRE_DISARM) - C.visible_message("\icon[C] *click!*", "\icon[C] *click!*") + C.visible_message("[bicon(C)] *click!*", "[bicon(C)] *click!*") new C.mineitemtype(get_turf(C)) spawn(0) qdel(C) @@ -45,7 +45,7 @@ return if(WIRE_BADDISARM) - C.visible_message("\icon[C] *BEEPBEEPBEEP*", "\icon[C] *BEEPBEEPBEEP*") + C.visible_message("[bicon(C)] *BEEPBEEPBEEP*", "[bicon(C)] *BEEPBEEPBEEP*") spawn(20) C.explode() return @@ -56,24 +56,24 @@ return switch(index) if(WIRE_DETONATE) - C.visible_message("\icon[C] *beep*", "\icon[C] *beep*") + C.visible_message("[bicon(C)] *beep*", "[bicon(C)] *beep*") if(WIRE_TIMED_DET) - C.visible_message("\icon[C] *BEEPBEEPBEEP*", "\icon[C] *BEEPBEEPBEEP*") + C.visible_message("[bicon(C)] *BEEPBEEPBEEP*", "[bicon(C)] *BEEPBEEPBEEP*") spawn(20) C.explode() if(WIRE_DISARM) - C.visible_message("\icon[C] *ping*", "\icon[C] *ping*") + C.visible_message("[bicon(C)] *ping*", "[bicon(C)] *ping*") if(WIRE_DUMMY_1) - C.visible_message("\icon[C] *ping*", "\icon[C] *ping*") + C.visible_message("[bicon(C)] *ping*", "[bicon(C)] *ping*") if(WIRE_DUMMY_2) - C.visible_message("\icon[C] *beep*", "\icon[C] *beep*") + C.visible_message("[bicon(C)] *beep*", "[bicon(C)] *beep*") if(WIRE_BADDISARM) - C.visible_message("\icon[C] *ping*", "\icon[C] *ping*") + C.visible_message("[bicon(C)] *ping*", "[bicon(C)] *ping*") return /datum/wires/mines/CanUse(var/mob/living/L) diff --git a/code/datums/wires/particle_accelerator.dm b/code/datums/wires/particle_accelerator.dm index 8356238692..3d90236b46 100644 --- a/code/datums/wires/particle_accelerator.dm +++ b/code/datums/wires/particle_accelerator.dm @@ -28,7 +28,7 @@ var/const/PARTICLE_LIMIT_POWER_WIRE = 8 // Determines how strong the PA can be. C.interface_control = !C.interface_control if(PARTICLE_LIMIT_POWER_WIRE) - C.visible_message("\icon[C][C] makes a large whirring noise.") + C.visible_message("[bicon(C)][C] makes a large whirring noise.") /datum/wires/particle_acc/control_box/UpdateCut(var/index, var/mended) var/obj/machinery/particle_accelerator/control_box/C = holder diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 76ac3a2b1f..d4a4be4553 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -124,7 +124,7 @@ var/global/list/PDA_Manifest = list() if(depthead && car.len != 1) car.Swap(1,car.len) - if(SSjob.is_job_in_department(real_rank, DEPARTMENT_CARGO)) + if(SSjob.is_job_in_department(real_rank, DEPARTMENT_CIVILIAN)) civ[++civ.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 if(depthead && civ.len != 1) diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 98873ac0c3..b21e3c0025 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -66,7 +66,6 @@ attack_verb = list("HONKED") var/spam_flag = 0 - /obj/item/weapon/c_tube name = "cardboard tube" desc = "A tube... of cardboard." @@ -77,141 +76,6 @@ throw_speed = 4 throw_range = 5 -/obj/item/weapon/cane - name = "cane" - desc = "A cane used by a true gentleman." - icon = 'icons/obj/weapons.dmi' - icon_state = "cane" - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi', - ) - force = 5.0 - throwforce = 7.0 - w_class = ITEMSIZE_NORMAL - matter = list(DEFAULT_WALL_MATERIAL = 50) - attack_verb = list("bludgeoned", "whacked", "disciplined", "thrashed") - -/obj/item/weapon/cane/concealed - var/concealed_blade - -/obj/item/weapon/cane/concealed/New() - ..() - var/obj/item/weapon/material/butterfly/switchblade/temp_blade = new(src) - concealed_blade = temp_blade - temp_blade.attack_self() - -/obj/item/weapon/cane/concealed/attack_self(var/mob/user) - var/datum/gender/T = gender_datums[user.get_visible_gender()] - if(concealed_blade) - user.visible_message("[user] has unsheathed \a [concealed_blade] from [T.his] [src]!", "You unsheathe \the [concealed_blade] from \the [src].") - // Calling drop/put in hands to properly call item drop/pickup procs - playsound(user.loc, 'sound/weapons/holster/sheathout.ogg', 50, 1) - user.drop_from_inventory(src) - user.put_in_hands(concealed_blade) - user.put_in_hands(src) - user.update_inv_l_hand(0) - user.update_inv_r_hand() - concealed_blade = null - else - ..() - -/obj/item/weapon/cane/concealed/attackby(var/obj/item/weapon/material/butterfly/W, var/mob/user) - if(!src.concealed_blade && istype(W)) - var/datum/gender/T = gender_datums[user.get_visible_gender()] - user.visible_message("[user] has sheathed \a [W] into [T.his] [src]!", "You sheathe \the [W] into \the [src].") - playsound(user.loc, 'sound/weapons/holster/sheathin.ogg', 50, 1) - user.drop_from_inventory(W) - W.loc = src - src.concealed_blade = W - update_icon() - else - ..() - -/obj/item/weapon/cane/concealed/update_icon() - if(concealed_blade) - name = initial(name) - icon_state = initial(icon_state) - item_state = initial(icon_state) - else - name = "cane shaft" - icon_state = "nullrod" - item_state = "foldcane" - -/obj/item/weapon/cane/whitecane - name = "white cane" - desc = "A white cane. They are commonly used by the blind or visually impaired as a mobility tool or as a courtesy to others." - icon = 'icons/obj/weapons.dmi' - icon_state = "whitecane" - -/obj/item/weapon/cane/whitecane/attack(mob/M as mob, mob/user as mob) - if(user.a_intent == I_HELP) - user.visible_message("\The [user] has lightly tapped [M] on the ankle with their white cane!") - return - else - ..() - -/obj/item/weapon/cane/crutch - name ="crutch" - desc = "A long stick with a crosspiece at the top, used to help with walking." - icon_state = "crutch" - item_state = "crutch" - -//Code for Telescopic White Cane writen by Gozulio - -/obj/item/weapon/melee/collapsable_whitecane - name = "telescopic white cane" - desc = "A telescoping white cane. They are commonly used by the blind or visually impaired as a mobility tool or as a courtesy to others." - icon = 'icons/obj/weapons.dmi' - icon_state = "whitecane1in" - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi', - ) - slot_flags = SLOT_BELT - w_class = ITEMSIZE_SMALL - force = 3 - var/on = 0 - -/obj/item/weapon/melee/collapsable_whitecane/attack_self(mob/user as mob) - on = !on - if(on) - user.visible_message("\The [user] extends the white cane.",\ - "You extend the white cane.",\ - "You hear an ominous click.") - icon_state = "whitecane1out" - item_state_slots = list(slot_r_hand_str = "whitecane", slot_l_hand_str = "whitecane") - w_class = ITEMSIZE_NORMAL - force = 5 - attack_verb = list("smacked", "struck", "cracked", "beaten") - else - user.visible_message("\The [user] collapses the white cane.",\ - "You collapse the white cane.",\ - "You hear a click.") - icon_state = "whitecane1in" - item_state_slots = list(slot_r_hand_str = null, slot_l_hand_str = null) - w_class = ITEMSIZE_SMALL - force = 3 - attack_verb = list("hit", "poked") - - if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - H.update_inv_l_hand() - H.update_inv_r_hand() - - playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) - add_fingerprint(user) - - return - -/obj/item/weapon/melee/collapsable_whitecane/attack(mob/M as mob, mob/user as mob) - if(user.a_intent == I_HELP) - user.visible_message("\The [user] has lightly tapped [M] on the ankle with their white cane!") - return - else - ..() - - /obj/item/weapon/disk name = "disk" icon = 'icons/obj/items.dmi' diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm index 125601af4a..0b4aafda94 100644 --- a/code/defines/procs/announce.dm +++ b/code/defines/procs/announce.dm @@ -49,20 +49,20 @@ datum/announcement/proc/Message(message as text, message_title as text) for(var/mob/M in player_list) if(!istype(M,/mob/new_player) && !isdeaf(M)) - M << "

[title]

" - M << "[message]" + to_chat(M, "

[title]

") + to_chat(M, "[message]") if (announcer) - M << " -[html_encode(announcer)]" + to_chat(M, " -[html_encode(announcer)]") datum/announcement/minor/Message(message as text, message_title as text) - world << "[message]" + to_world("[message]") datum/announcement/priority/Message(message as text, message_title as text) - world << "

[message_title]

" - world << "[message]" + to_world("

[message_title]

") + to_world("[message]") if(announcer) - world << " -[html_encode(announcer)]" - world << "
" + to_world(" -[html_encode(announcer)]") + to_world("
") datum/announcement/priority/command/Message(message as text, message_title as text) var/command @@ -74,11 +74,11 @@ datum/announcement/priority/command/Message(message as text, message_title as te command += "
" for(var/mob/M in player_list) if(!istype(M,/mob/new_player) && !isdeaf(M)) - M << command + to_chat(M, command) datum/announcement/priority/security/Message(message as text, message_title as text) - world << "[message_title]" - world << "[message]" + to_world("[message_title]") + to_world("[message]") datum/announcement/proc/NewsCast(message as text, message_title as text) if(!newscast) diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index a491f7fff0..963530d671 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -70,6 +70,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station flags = RAD_SHIELDED sound_env = SMALL_ENCLOSED base_turf = /turf/space + forbid_events = TRUE /area/shuttle/arrival name = "\improper Arrival Shuttle" @@ -807,6 +808,9 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "\improper Construction Area" icon_state = "construction" +/area/hallway/secondary/entry + forbid_events = TRUE + /area/hallway/secondary/entry/fore name = "\improper Shuttle Dock Hallway - Mid" icon_state = "entry_1" @@ -981,6 +985,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "Sleep" flags = RAD_SHIELDED ambience = AMBIENCE_GENERIC + forbid_events = TRUE /area/crew_quarters/toilet name = "\improper Dormitory Toilets" @@ -1280,6 +1285,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "Holodeck" dynamic_lighting = 0 sound_env = LARGE_ENCLOSED + forbid_events = TRUE /area/holodeck/alphadeck name = "\improper Holodeck Alpha" @@ -1379,6 +1385,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "\improper Engine Room" icon_state = "engine" sound_env = LARGE_ENCLOSED + forbid_events = TRUE /area/engineering/engine_airlock name = "\improper Engine Room Airlock" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index e0f0f85049..9df861d50e 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -30,6 +30,7 @@ var/used_environ = 0 var/has_gravity = 1 + var/secret_name = FALSE // This tells certain things that display areas' names that they shouldn't display this area's name. var/obj/machinery/power/apc/apc = null var/no_air = null // var/list/lights // list of all lights on this area @@ -41,26 +42,20 @@ var/turf/base_turf //The base turf type of the area, which can be used to override the z-level's base turf var/global/global_uid = 0 var/uid + var/forbid_events = FALSE // If true, random events will not start inside this area. /area/New() - icon_state = "" uid = ++global_uid - all_areas += src - - if(!requires_power) - power_light = 0 - power_equip = 0 - power_environ = 0 - - if(dynamic_lighting) - luminosity = 0 - else - luminosity = 1 - + all_areas += src //Replace with /area in world? Byond optimizes X in world loops. + ..() /area/Initialize() . = ..() + + luminosity = !(dynamic_lighting) + icon_state = "" + return INITIALIZE_HINT_LATELOAD // Areas tradiationally are initialized AFTER other atoms. /area/LateInitialize() @@ -83,7 +78,7 @@ // NOTE: There probably won't be any atoms in these turfs, but just in case we should call these procs. A.contents.Add(T) if(old_area) - // Handle dynamic lighting update if + // Handle dynamic lighting update if if(T.dynamic_lighting && old_area.dynamic_lighting != A.dynamic_lighting) if(A.dynamic_lighting) T.lighting_build_overlay() @@ -360,6 +355,8 @@ var/list/mob/living/forced_ambiance_list = new temp_airlock.prison_open() for(var/obj/machinery/door/window/temp_windoor in src) temp_windoor.open() + for(var/obj/machinery/door/blast/temp_blast in src) + temp_blast.open() /area/has_gravity() return has_gravity @@ -420,3 +417,8 @@ var/list/ghostteleportlocs = list() ghostteleportlocs = sortAssoc(ghostteleportlocs) return 1 + +/area/proc/get_name() + if(secret_name) + return "Unknown Area" + return name \ No newline at end of file diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 91dbbbb78a..0b22f5a81c 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -41,8 +41,7 @@ _preloader.load(src) // Pass our arguments to InitAtom so they can be passed to initialize(), but replace 1st with if-we're-during-mapload. - var/do_initialize = SSatoms && SSatoms.initialized // Workaround our non-ideal initialization order: SSatoms may not exist yet. - //var/do_initialize = SSatoms.initialized + var/do_initialize = SSatoms.initialized if(do_initialize > INITIALIZATION_INSSATOMS) args[1] = (do_initialize == INITIALIZATION_INNEW_MAPLOAD) if(SSatoms.InitAtom(src, args)) @@ -183,9 +182,15 @@ else f_name += "oil-stained [name][infix]." - to_chat(user, "\icon[src] That's [f_name] [suffix]") + to_chat(user, "[bicon(src)] That's [f_name] [suffix]") to_chat(user,desc) + if(user.client?.examine_text_mode == EXAMINE_MODE_INCLUDE_USAGE) + to_chat(user, description_info) + + if(user.client?.examine_text_mode == EXAMINE_MODE_SWITCH_TO_PANEL) + user.client.statpanel = "Examine" // Switch to stat panel + return distance == -1 || (get_dist(src, user) <= distance) // called by mobs when e.g. having the atom as their machine, pulledby, loc (AKA mob being inside the atom) or buckled var set. diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 770d65b583..83166f8c0d 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -23,6 +23,9 @@ var/old_y = 0 var/does_spin = TRUE // Does the atom spin when thrown (of course it does :P) var/movement_type = NONE + + var/cloaked = FALSE //If we're cloaked or not + var/image/cloaked_selfimage //The image we use for our client to let them see where we are /atom/movable/Destroy() . = ..() @@ -44,7 +47,7 @@ pulledby = null /atom/movable/vv_edit_var(var_name, var_value) - if(GLOB.VVpixelmovement[var_name]) //Pixel movement is not yet implemented, changing this will break everything irreversibly. + if(var_name in GLOB.VVpixelmovement) //Pixel movement is not yet implemented, changing this will break everything irreversibly. return FALSE return ..() @@ -452,30 +455,33 @@ var/move_to_z = src.get_transit_zlevel() if(move_to_z) - z = move_to_z + var/new_z = move_to_z + var/new_x + var/new_y if(x <= TRANSITIONEDGE) - x = world.maxx - TRANSITIONEDGE - 2 - y = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2) + new_x = world.maxx - TRANSITIONEDGE - 2 + new_y = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2) else if (x >= (world.maxx - TRANSITIONEDGE + 1)) - x = TRANSITIONEDGE + 1 - y = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2) + new_x = TRANSITIONEDGE + 1 + new_y = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2) else if (y <= TRANSITIONEDGE) - y = world.maxy - TRANSITIONEDGE -2 - x = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2) + new_y = world.maxy - TRANSITIONEDGE -2 + new_x = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2) else if (y >= (world.maxy - TRANSITIONEDGE + 1)) - y = TRANSITIONEDGE + 1 - x = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2) + new_y = TRANSITIONEDGE + 1 + new_x = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2) if(ticker && istype(ticker.mode, /datum/game_mode/nuclear)) //only really care if the game mode is nuclear var/datum/game_mode/nuclear/G = ticker.mode G.check_nuke_disks() - spawn(0) - if(loc) loc.Entered(src) + var/turf/T = locate(new_x, new_y, new_z) + if(istype(T)) + forceMove(T) //by default, transition randomly to another zlevel /atom/movable/proc/get_transit_zlevel() @@ -509,3 +515,93 @@ // Called when touching a lava tile. /atom/movable/proc/lava_act() fire_act(null, 10000, 1000) + + +// Procs to cloak/uncloak +/atom/movable/proc/cloak() + if(cloaked) + return FALSE + cloaked = TRUE + . = TRUE // We did work + + var/static/animation_time = 1 SECOND + cloaked_selfimage = get_cloaked_selfimage() + + //Wheeee + cloak_animation(animation_time) + + //Needs to be last so people can actually see the effect before we become invisible + plane = CLOAKED_PLANE + +/atom/movable/proc/uncloak() + if(!cloaked) + return FALSE + cloaked = FALSE + . = TRUE // We did work + + var/static/animation_time = 1 SECOND + QDEL_NULL(cloaked_selfimage) + + //Needs to be first so people can actually see the effect, so become uninvisible first + plane = initial(plane) + + //Oooooo + uncloak_animation(animation_time) + + +// Animations for cloaking/uncloaking +/atom/movable/proc/cloak_animation(var/length = 1 SECOND) + //Save these + var/initial_alpha = alpha + + //Animate alpha fade + animate(src, alpha = 0, time = length) + + //Animate a cloaking effect + var/our_filter = filters.len+1 //Filters don't appear to have a type that can be stored in a var and accessed. This is how the DM reference does it. + filters += filter(type="wave", x = 0, y = 16, size = 0, offset = 0, flags = WAVE_SIDEWAYS) + animate(filters[our_filter], offset = 1, size = 8, time = length, flags = ANIMATION_PARALLEL) + + //Wait for animations to finish + sleep(length+5) + + //Remove those + filters -= filters[our_filter] + + //Back to original alpha + alpha = initial_alpha + +/atom/movable/proc/uncloak_animation(var/length = 1 SECOND) + //Save these + var/initial_alpha = alpha + + //Put us back to normal, but no alpha + alpha = 0 + + //Animate alpha fade up + animate(src, alpha = initial_alpha, time = length) + + //Animate a cloaking effect + var/our_filter = filters.len+1 //Filters don't appear to have a type that can be stored in a var and accessed. This is how the DM reference does it. + filters += filter(type="wave", x=0, y = 16, size = 8, offset = 1, flags = WAVE_SIDEWAYS) + animate(filters[our_filter], offset = 0, size = 0, time = length, flags = ANIMATION_PARALLEL) + + //Wait for animations to finish + sleep(length+5) + + //Remove those + filters -= filters[our_filter] + + +// So cloaked things can see themselves, if necessary +/atom/movable/proc/get_cloaked_selfimage() + var/icon/selficon = icon(icon, icon_state) + selficon.MapColors(0,0,0, 0,0,0, 0,0,0, 1,1,1) //White + var/image/selfimage = image(selficon) + selfimage.color = "#0000FF" + selfimage.alpha = 100 + selfimage.layer = initial(layer) + selfimage.plane = initial(plane) + selfimage.loc = src + + return selfimage diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index e4744693ab..c79a0e94be 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -46,7 +46,7 @@ icon_state = "scanner_0" density = 1 anchored = 1.0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 50 active_power_usage = 300 interact_offline = 1 @@ -260,7 +260,7 @@ var/obj/item/weapon/disk/data/disk = null var/selected_menu_key = null anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 10 active_power_usage = 400 var/waiting_for_user_input=0 // Fix for #274 (Mash create block injector without answering dialog to make unlimited injectors) - N3X @@ -293,19 +293,15 @@ else return -/obj/machinery/computer/scan_consolenew/New() - ..() +/obj/machinery/computer/scan_consolenew/Initialize() + . = ..() for(var/i=0;i<3;i++) buffers[i+1]=new /datum/dna2/record - spawn(5) - for(dir in list(NORTH,EAST,SOUTH,WEST)) - connected = locate(/obj/machinery/dna_scannernew, get_step(src, dir)) - if(!isnull(connected)) - break - spawn(250) - src.injector_ready = 1 - return - return + for(dir in list(NORTH,EAST,SOUTH,WEST)) + connected = locate(/obj/machinery/dna_scannernew, get_step(src, dir)) + if(connected) + break + VARSET_IN(src, injector_ready, TRUE, 25 SECONDS) /obj/machinery/computer/scan_consolenew/proc/all_dna_blocks(var/list/buffer) var/list/arr = list() diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm index 45e852551d..0089355ed3 100644 --- a/code/game/dna/genes/monkey.dm +++ b/code/game/dna/genes/monkey.dm @@ -69,7 +69,7 @@ O.take_overall_damage(M.getBruteLoss() + 40, M.getFireLoss()) O.adjustToxLoss(M.getToxLoss() + 20) O.adjustOxyLoss(M.getOxyLoss()) - O.stat = M.stat + O.set_stat(M.stat) O.a_intent = I_HURT for (var/obj/item/weapon/implant/I in implants) I.loc = O @@ -154,7 +154,7 @@ O.take_overall_damage(M.getBruteLoss(), M.getFireLoss()) O.adjustToxLoss(M.getToxLoss()) O.adjustOxyLoss(M.getOxyLoss()) - O.stat = M.stat + O.set_stat(M.stat) for (var/obj/item/weapon/implant/I in implants) I.loc = O I.implanted = O diff --git a/code/game/gamemodes/changeling/powers/epinephrine_overdose.dm b/code/game/gamemodes/changeling/powers/epinephrine_overdose.dm index d5be03c6b1..5d3c1a3be9 100644 --- a/code/game/gamemodes/changeling/powers/epinephrine_overdose.dm +++ b/code/game/gamemodes/changeling/powers/epinephrine_overdose.dm @@ -29,7 +29,7 @@ var/mob/living/carbon/human/C = src to_chat(C, "Energy rushes through us. [C.lying ? "We arise." : ""]") - C.stat = 0 + C.set_stat(CONSCIOUS) C.SetParalysis(0) C.SetStunned(0) C.SetWeakened(0) diff --git a/code/game/gamemodes/changeling/powers/lesser_form.dm b/code/game/gamemodes/changeling/powers/lesser_form.dm index 9d7c4de3d1..d7b9cb0489 100644 --- a/code/game/gamemodes/changeling/powers/lesser_form.dm +++ b/code/game/gamemodes/changeling/powers/lesser_form.dm @@ -100,7 +100,7 @@ O.adjustBruteLoss(C.getBruteLoss()) O.setOxyLoss(C.getOxyLoss()) O.adjustFireLoss(C.getFireLoss()) - O.stat = C.stat + O.set_stat(C.stat) for (var/obj/item/weapon/implant/I in implants) I.loc = O I.implanted = O diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 2439fbe38a..61a061170e 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -79,7 +79,7 @@ C.update_canmove() C.mind.changeling.purchased_powers -= C feedback_add_details("changeling_powers","CR") - C.stat = CONSCIOUS + C.set_stat(CONSCIOUS) C.forbid_seeing_deadchat = FALSE C.timeofdeath = null src.verbs -= /mob/proc/changeling_revive diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index 7ce4b2e86d..b9d434902e 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -153,11 +153,14 @@ /obj/effect/gateway/active/cult/cultify() return -/obj/effect/gateway/active/New() - spawn(rand(30,60) SECONDS) +/obj/effect/gateway/active/Initialize() + addtimer(CALLBACK(src, .proc/spawn_and_qdel), rand(30, 60) SECONDS) + +/obj/effect/gateway/active/proc/spawn_and_qdel() + if(LAZYLEN(spawnable)) var/t = pick(spawnable) - new t(src.loc) - qdel(src) + new t(get_turf(src)) + qdel(src) /obj/effect/gateway/active/Crossed(var/atom/A) if(A.is_incorporeal()) diff --git a/code/game/gamemodes/cult/hell_universe.dm b/code/game/gamemodes/cult/hell_universe.dm index ee79453933..27dd86df13 100644 --- a/code/game/gamemodes/cult/hell_universe.dm +++ b/code/game/gamemodes/cult/hell_universe.dm @@ -65,11 +65,11 @@ In short: for(var/datum/lighting_corner/L in world) L.update_lumcount(1, 0, 0) - for(var/turf/space/T in turfs) + for(var/turf/space/T in world) OnTurfChange(T) /datum/universal_state/hell/proc/MiscSet() - for(var/turf/simulated/floor/T in turfs) + for(var/turf/simulated/floor/T in world) if(!T.holy && prob(1)) new /obj/effect/gateway/active/cult(T) diff --git a/code/game/gamemodes/endgame/supermatter_cascade/blob.dm b/code/game/gamemodes/endgame/supermatter_cascade/blob.dm index be85616143..88da43257d 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/blob.dm +++ b/code/game/gamemodes/endgame/supermatter_cascade/blob.dm @@ -14,8 +14,8 @@ var/next_check=0 var/list/avail_dirs = list(NORTH,SOUTH,EAST,WEST) -/turf/unsimulated/wall/supermatter/New() - ..() +/turf/unsimulated/wall/supermatter/Initialize(mapload) + . = ..() START_PROCESSING(SSturfs, src) next_check = world.time+5 SECONDS diff --git a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm index 0c0d4c1a40..8f4f861b42 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm +++ b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm @@ -98,7 +98,7 @@ The access requirements on the Asteroid Shuttles' consoles have now been revoked else L.update_lumcount(0.0, 0.4, 1) - for(var/turf/space/T in turfs) + for(var/turf/space/T in world) OnTurfChange(T) /datum/universal_state/supermatter_cascade/proc/MiscSet() diff --git a/code/game/gamemodes/events/dust.dm b/code/game/gamemodes/events/dust.dm index d7d551396e..400ae1058d 100644 --- a/code/game/gamemodes/events/dust.dm +++ b/code/game/gamemodes/events/dust.dm @@ -7,27 +7,57 @@ No command report on the common version of this event. The "dust" will damage the hull of the station causin minor hull breaches. */ -/proc/dust_swarm(var/strength = "weak") +/proc/dust_swarm(var/strength = "weak", var/list/affecting_z) var/numbers = 1 + var/dust_type = /obj/effect/space_dust switch(strength) if("weak") - numbers = rand(2,4) - for(var/i = 0 to numbers) - new/obj/effect/space_dust/weak() + numbers = rand(2,4) + dust_type = /obj/effect/space_dust/weak if("norm") - numbers = rand(5,10) - for(var/i = 0 to numbers) - new/obj/effect/space_dust() + numbers = rand(5,10) + dust_type = /obj/effect/space_dust if("strong") - numbers = rand(10,15) - for(var/i = 0 to numbers) - new/obj/effect/space_dust/strong() + numbers = rand(10,15) + dust_type = /obj/effect/space_dust/strong if("super") - numbers = rand(15,25) - for(var/i = 0 to numbers) - new/obj/effect/space_dust/super() - return + numbers = rand(15,25) + dust_type = /obj/effect/space_dust/super + var/startside = pick(cardinal) + for(var/i = 0 to numbers) + var/startx = 0 + var/starty = 0 + var/endy = 0 + var/endx = 0 + switch(startside) + if(NORTH) + starty = world.maxy-TRANSITIONEDGE-1 + startx = rand(TRANSITIONEDGE+1, world.maxx-TRANSITIONEDGE-1) + endy = TRANSITIONEDGE + endx = rand(TRANSITIONEDGE+1, world.maxx-TRANSITIONEDGE-1) + if(EAST) + starty = rand(TRANSITIONEDGE+1, world.maxy-TRANSITIONEDGE-1) + startx = world.maxx-TRANSITIONEDGE-1 + endy = rand(TRANSITIONEDGE, world.maxy-TRANSITIONEDGE) + endx = TRANSITIONEDGE + if(SOUTH) + starty = TRANSITIONEDGE+1 + startx = rand(TRANSITIONEDGE+1, world.maxx-TRANSITIONEDGE-1) + endy = world.maxy-TRANSITIONEDGE + endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE) + if(WEST) + starty = rand(TRANSITIONEDGE+1, world.maxy-TRANSITIONEDGE-1) + startx = TRANSITIONEDGE+1 + endy = rand(TRANSITIONEDGE, world.maxy-TRANSITIONEDGE) + endx = world.maxx-TRANSITIONEDGE + + var/randomz = pick(affecting_z) + var/turf/startloc = locate(startx, starty, randomz) + var/turf/endloc = locate(endx, endy, randomz) + var/obj/effect/space_dust/D = new dust_type(startloc) + D.set_dir(GLOB.reverse_dir[startside]) + walk_towards(D, endloc, 1) /obj/effect/space_dust name = "Space Dust" @@ -39,91 +69,51 @@ The "dust" will damage the hull of the station causin minor hull breaches. var/strength = 2 //ex_act severity number var/life = 2 //how many things we hit before qdel(src) - weak - strength = 3 - life = 1 +/obj/effect/space_dust/weak + strength = 3 + life = 1 - strong - strength = 1 - life = 6 +/obj/effect/space_dust/strong + strength = 1 + life = 6 - super - strength = 1 - life = 40 +/obj/effect/space_dust/super + strength = 1 + life = 40 + +/obj/effect/space_dust/Destroy() + walk(src, 0) // Because we might have called walk_towards, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() + +/obj/effect/space_dust/touch_map_edge() + qdel(src) + +/obj/effect/space_dust/Bump(atom/A) + spawn(0) + if(prob(50)) + for(var/mob/M in range(10, src)) + if(!M.stat && !istype(M, /mob/living/silicon/ai)) + shake_camera(M, 3, 1) + if (A) + playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) + + if(ismob(A)) + A.ex_act(strength)//This should work for now I guess + else if(!istype(A,/obj/machinery/power/emitter) && !istype(A,/obj/machinery/field_generator)) //Protect the singularity from getting released every round! + A.ex_act(strength) //Changing emitter/field gen ex_act would make it immune to bombs and C4 + + life-- + if(life <= 0) + walk(src,0) + qdel(src) + return 0 + return - New() - ..() - var/startx = 0 - var/starty = 0 - var/endy = 0 - var/endx = 0 - var/startside = pick(cardinal) +/obj/effect/space_dust/Bumped(atom/A) + Bump(A) + return - switch(startside) - if(NORTH) - starty = world.maxy-(TRANSITIONEDGE+1) - startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) - endy = TRANSITIONEDGE - endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE) - if(EAST) - starty = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1)) - startx = world.maxx-(TRANSITIONEDGE+1) - endy = rand(TRANSITIONEDGE, world.maxy-TRANSITIONEDGE) - endx = TRANSITIONEDGE - if(SOUTH) - starty = (TRANSITIONEDGE+1) - startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) - endy = world.maxy-TRANSITIONEDGE - endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE) - if(WEST) - starty = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1)) - startx = (TRANSITIONEDGE+1) - endy = rand(TRANSITIONEDGE,world.maxy-TRANSITIONEDGE) - endx = world.maxx-TRANSITIONEDGE - var/z_level = pick(using_map.station_levels) - var/goal = locate(endx, endy, z_level) - src.x = startx - src.y = starty - src.z = z_level - spawn(0) - walk_towards(src, goal, 1) - return - - Destroy() - walk(src, 0) // Because we might have called walk_towards, we must stop the walk loop or BYOND keeps an internal reference to us forever. - return ..() - - touch_map_edge() - qdel(src) - - Bump(atom/A) - spawn(0) - if(prob(50)) - for(var/mob/M in range(10, src)) - if(!M.stat && !istype(M, /mob/living/silicon/ai)) - shake_camera(M, 3, 1) - if (A) - playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) - - if(ismob(A)) - A.ex_act(strength)//This should work for now I guess - else if(!istype(A,/obj/machinery/power/emitter) && !istype(A,/obj/machinery/field_generator)) //Protect the singularity from getting released every round! - A.ex_act(strength) //Changing emitter/field gen ex_act would make it immune to bombs and C4 - - life-- - if(life <= 0) - walk(src,0) - qdel(src) - return 0 - return - - - Bumped(atom/A) - Bump(A) - return - - - ex_act(severity) - qdel(src) - return +/obj/effect/space_dust/ex_act(severity) + qdel(src) + return diff --git a/code/game/gamemodes/events/wormholes.dm b/code/game/gamemodes/events/wormholes.dm index 83f4246696..20f7da63f3 100644 --- a/code/game/gamemodes/events/wormholes.dm +++ b/code/game/gamemodes/events/wormholes.dm @@ -3,7 +3,7 @@ var/list/pick_turfs = list() var/list/Z_choices = list() Z_choices |= using_map.get_map_levels(1, FALSE) - for(var/turf/simulated/floor/T in turfs) + for(var/turf/simulated/floor/T in world) if(T.z in Z_choices) if(!T.block_tele) pick_turfs += T diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 05757c9b7d..d08c49d6a8 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -538,15 +538,15 @@ proc/get_nt_opposed() set category = "OOC" if(!ticker || !ticker.mode) - to_chat(usr, "Something is terribly wrong; there is no gametype.") + to_chat(usr, "Something is terribly wrong; there is no gametype.") return if(master_mode != "secret") - to_chat(usr, "The roundtype is [capitalize(ticker.mode.name)]") + to_chat(usr, "The roundtype is [capitalize(ticker.mode.name)]") if(ticker.mode.round_description) - to_chat(usr, "[ticker.mode.round_description]") + to_chat(usr, "[ticker.mode.round_description]") if(ticker.mode.extended_round_description) - to_chat(usr, "[ticker.mode.extended_round_description]") + to_chat(usr, "[ticker.mode.extended_round_description]") else - to_chat(usr, "Shhhh. It's a secret.") + to_chat(usr, "Shhhh. It's a secret.") return diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 92ec9cf0c5..12f39fd59d 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -201,10 +201,10 @@ var/global/datum/controller/gameticker/ticker var/turf/T = get_turf(M) if(T && T.z in using_map.station_levels) //we don't use M.death(0) because it calls a for(/mob) loop and M.health = 0 - M.stat = DEAD + M.set_stat(DEAD) if(1) //on a z-level 1 turf. M.health = 0 - M.stat = DEAD + M.set_stat(DEAD) //Now animate the cinematic switch(station_missed) diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index dd430a8989..81b8a4e6b9 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -2,37 +2,53 @@ //set to at least 100 unless you want evarr ruining every round //Meteors probability of spawning during a given wave -/var/list/meteors_normal = list(/obj/effect/meteor/dust=3, /obj/effect/meteor/medium=8, /obj/effect/meteor/big=3, \ - /obj/effect/meteor/flaming=1, /obj/effect/meteor/irradiated=3) //for normal meteor event -/var/list/meteors_threatening = list(/obj/effect/meteor/medium=5, /obj/effect/meteor/big=10, \ - /obj/effect/meteor/flaming=3, /obj/effect/meteor/irradiated=3, /obj/effect/meteor/emp=3) //for threatening meteor event +//for space dust event +/var/list/meteors_dust = list(/obj/effect/meteor/dust) -/var/list/meteors_catastrophic = list(/obj/effect/meteor/medium=5, /obj/effect/meteor/big=75, \ - /obj/effect/meteor/flaming=10, /obj/effect/meteor/irradiated=10, /obj/effect/meteor/emp=10) //, /obj/effect/meteor/tunguska = 1) //for catastrophic meteor event +//for normal meteor event +/var/list/meteors_normal = list( + /obj/effect/meteor/dust=3, + /obj/effect/meteor/medium=8, + /obj/effect/meteor/big=3, + /obj/effect/meteor/flaming=1, + /obj/effect/meteor/irradiated=3 + ) + +//for threatening meteor event +/var/list/meteors_threatening = list( + /obj/effect/meteor/medium=5, + /obj/effect/meteor/big=10, + /obj/effect/meteor/flaming=3, + /obj/effect/meteor/irradiated=3, + /obj/effect/meteor/emp=3) + +//for catastrophic meteor event +/var/list/meteors_catastrophic = list( + /obj/effect/meteor/medium=5, + /obj/effect/meteor/big=75, + /obj/effect/meteor/flaming=10, + /obj/effect/meteor/irradiated=10, + /obj/effect/meteor/emp=10) -/var/list/meteors_dust = list(/obj/effect/meteor/dust) //for space dust event /////////////////////////////// //Meteor spawning global procs /////////////////////////////// -/proc/pick_meteor_start(var/startSide = pick(cardinal)) - var/startLevel = pick(using_map.station_levels - using_map.sealed_levels) - var/pickedstart = spaceDebrisStartLoc(startSide, startLevel) - - return list(startLevel, pickedstart) - -/proc/spawn_meteors(var/number = 10, var/list/meteortypes, var/startSide) +/proc/spawn_meteors(var/number = 10, var/list/meteortypes, var/startSide, var/zlevel) + log_debug("Spawning [number] meteors on the [dir2text(startSide)] of [zlevel]") for(var/i = 0; i < number; i++) - spawn_meteor(meteortypes, startSide) + spawn_meteor(meteortypes, startSide, zlevel) -/proc/spawn_meteor(var/list/meteortypes, var/startSide) - var/start = pick_meteor_start(startSide) +/proc/spawn_meteor(var/list/meteortypes, var/startSide, var/startLevel) + if(isnull(startSide)) + startSide = pick(cardinal) + if(isnull(startLevel)) + startLevel = pick(using_map.station_levels - using_map.sealed_levels) - var/startLevel = start[1] - var/turf/pickedstart = start[2] + var/turf/pickedstart = spaceDebrisStartLoc(startSide, startLevel) var/turf/pickedgoal = spaceDebrisFinishLoc(startSide, startLevel) var/Me = pickweight(meteortypes) @@ -242,7 +258,7 @@ /obj/effect/meteor/big/meteor_effect(var/explode) ..() if(explode) - explosion(src.loc, devastation_range = 2, heavy_impact_range = 4, light_impact_range = 6, flash_range = 12, adminlog = 0) + explosion(src.loc, 1, 2, 3, 4, 0) // 'Flaming' meteors do less overall damage but are spread out more due to a larger but weaker explosion at the end. /obj/effect/meteor/flaming @@ -256,7 +272,7 @@ /obj/effect/meteor/flaming/meteor_effect(var/explode) ..() if(explode) - explosion(src.loc, devastation_range = 1, heavy_impact_range = 2, light_impact_range = 8, flash_range = 16, adminlog = 0) + explosion(src.loc, 1, 2, 3, 4, 0, 0, 5) // Irradiated meteors do less physical damage but project a ten-tile ranged pulse of radiation upon exploding. /obj/effect/meteor/irradiated @@ -270,7 +286,7 @@ /obj/effect/meteor/irradiated/meteor_effect(var/explode) ..() if(explode) - explosion(src.loc, devastation_range = 0, heavy_impact_range = 0, light_impact_range = 4, flash_range = 6, adminlog = 0) + explosion(src.loc, 0, 0, 4, 3, 0) new /obj/effect/decal/cleanable/greenglow(get_turf(src)) SSradiation.radiate(src, 50) @@ -303,7 +319,7 @@ /obj/effect/meteor/tunguska/meteor_effect(var/explode) ..() if(explode) - explosion(src.loc, 5, 10, 15, 20, 0) + explosion(src.loc, 3, 6, 9, 20, 0) /obj/effect/meteor/tunguska/Bump() ..() diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index a38ccf59ca..b2bd6b80e4 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -12,45 +12,51 @@ var/obj/item/weapon/disk/nuclear/the_disk = null var/active = 0 - - attack_self() - if(!active) - active = 1 - workdisk() - to_chat(usr, "You activate the pinpointer") - else - active = 0 - icon_state = "pinoff" - to_chat(usr, "You deactivate the pinpointer") - - proc/workdisk() - if(!active) return - if(!the_disk) - the_disk = locate() - if(!the_disk) - icon_state = "pinonnull" - return - set_dir(get_dir(src,the_disk)) - switch(get_dist(src,the_disk)) - if(0) - icon_state = "pinondirect" - if(1 to 8) - icon_state = "pinonclose" - if(9 to 16) - icon_state = "pinonmedium" - if(16 to INFINITY) - icon_state = "pinonfar" - spawn(5) .() - - examine(mob/user) - ..(user) - for(var/obj/machinery/nuclearbomb/bomb in machines) - if(bomb.timing) - to_chat(user, "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]") - /obj/item/weapon/pinpointer/Destroy() active = 0 - ..() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/weapon/pinpointer/attack_self() + if(!active) + active = 1 + START_PROCESSING(SSobj, src) + to_chat(usr, "You activate the pinpointer") + else + active = 0 + STOP_PROCESSING(SSobj, src) + icon_state = "pinoff" + to_chat(usr, "You deactivate the pinpointer") + +/obj/item/weapon/pinpointer/process() + if(!active) + return PROCESS_KILL + + if(!the_disk) + the_disk = locate() + if(!the_disk) + icon_state = "pinonnull" + return + + set_dir(get_dir(src,the_disk)) + + switch(get_dist(src,the_disk)) + if(0) + icon_state = "pinondirect" + if(1 to 8) + icon_state = "pinonclose" + if(9 to 16) + icon_state = "pinonmedium" + if(16 to INFINITY) + icon_state = "pinonfar" + +/obj/item/weapon/pinpointer/examine(mob/user) + ..(user) + for(var/obj/machinery/nuclearbomb/bomb in machines) + if(bomb.timing) + to_chat(user, "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]") + + /obj/item/weapon/pinpointer/advpinpointer name = "Advanced Pinpointer" @@ -60,58 +66,49 @@ var/turf/location = null var/obj/target = null - attack_self() - if(!active) - active = 1 - if(mode == 0) - workdisk() - if(mode == 1) - worklocation() - if(mode == 2) - workobj() - to_chat(usr, "You activate the pinpointer") - else - active = 0 - icon_state = "pinoff" - to_chat(usr, "You deactivate the pinpointer") +/obj/item/weapon/pinpointer/advpinpointer/process() + if(!active) + return PROCESS_KILL + if(mode == 0) + ..() + if(mode == 1) + worklocation() + if(mode == 2) + workobj() +/obj/item/weapon/pinpointer/advpinpointer/proc/worklocation() + if(!location) + icon_state = "pinonnull" + return - proc/worklocation() - if(!active) - return - if(!location) - icon_state = "pinonnull" - return - set_dir(get_dir(src,location)) - switch(get_dist(src,location)) - if(0) - icon_state = "pinondirect" - if(1 to 8) - icon_state = "pinonclose" - if(9 to 16) - icon_state = "pinonmedium" - if(16 to INFINITY) - icon_state = "pinonfar" - spawn(5) .() + set_dir(get_dir(src,location)) + switch(get_dist(src,location)) + if(0) + icon_state = "pinondirect" + if(1 to 8) + icon_state = "pinonclose" + if(9 to 16) + icon_state = "pinonmedium" + if(16 to INFINITY) + icon_state = "pinonfar" - proc/workobj() - if(!active) - return - if(!target) - icon_state = "pinonnull" - return - set_dir(get_dir(src,target)) - switch(get_dist(src,target)) - if(0) - icon_state = "pinondirect" - if(1 to 8) - icon_state = "pinonclose" - if(9 to 16) - icon_state = "pinonmedium" - if(16 to INFINITY) - icon_state = "pinonfar" - spawn(5) .() +/obj/item/weapon/pinpointer/advpinpointer/proc/workobj() + if(!target) + icon_state = "pinonnull" + return + + set_dir(get_dir(src,target)) + + switch(get_dist(src,target)) + if(0) + icon_state = "pinondirect" + if(1 to 8) + icon_state = "pinonclose" + if(9 to 16) + icon_state = "pinonmedium" + if(16 to INFINITY) + icon_state = "pinonfar" /obj/item/weapon/pinpointer/advpinpointer/verb/toggle_mode() set category = "Object" @@ -140,7 +137,6 @@ to_chat(usr, "You set the pinpointer to locate [locationx],[locationy]") - return attack_self() if("Disk Recovery") @@ -150,9 +146,10 @@ if("Other Signature") mode = 2 switch(alert("Search for item signature or DNA fragment?" , "Signature Mode Select" , "" , "Item" , "DNA")) + if("Item") var/datum/objective/steal/itemlist - itemlist = itemlist // To supress a 'variable defined but not used' error. + itemlist = itemlist var/targetitem = input("Select item to search for.", "Item Mode Select","") as null|anything in itemlist.possible_items if(!targetitem) return @@ -161,6 +158,7 @@ to_chat(usr, "Failed to locate [targetitem]!") return to_chat(usr, "You set the pinpointer to locate [targetitem]") + if("DNA") var/DNAstring = input("Input DNA string to search for." , "Please Enter String." , "") if(!DNAstring) @@ -187,6 +185,7 @@ /obj/item/weapon/pinpointer/nukeop/attack_self(mob/user as mob) if(!active) active = 1 + START_PROCESSING(SSobj, src) if(!mode) workdisk() to_chat(user, "Authentication Disk Locator active.") @@ -195,30 +194,35 @@ to_chat(user, "Shuttle Locator active.") else active = 0 + STOP_PROCESSING(SSobj, src) icon_state = "pinoff" to_chat(user, "You deactivate the pinpointer.") +/obj/item/weapon/pinpointer/nukeop/process() + if(!active) + return PROCESS_KILL -/obj/item/weapon/pinpointer/nukeop/workdisk() - if(!active) return - if(mode) //Check in case the mode changes while operating - worklocation() - return + switch(mode) + if(0) + workdisk() + if(1) + worklocation() + +/obj/item/weapon/pinpointer/nukeop/proc/workdisk() if(bomb_set) //If the bomb is set, lead to the shuttle mode = 1 //Ensures worklocation() continues to work - worklocation() playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) //Plays a beep - visible_message("Shuttle Locator active.") //Lets the mob holding it know that the mode has changed + visible_message("Shuttle Locator active.") //Lets the mob holding it know that the mode has changed return //Get outta here + if(!the_disk) the_disk = locate() if(!the_disk) icon_state = "pinonnull" return -// if(loc.z != the_disk.z) //If you are on a different z-level from the disk -// icon_state = "pinonnull" -// else + set_dir(get_dir(src, the_disk)) + switch(get_dist(src, the_disk)) if(0) icon_state = "pinondirect" @@ -229,29 +233,25 @@ if(16 to INFINITY) icon_state = "pinonfar" - spawn(5) .() - - /obj/item/weapon/pinpointer/nukeop/proc/worklocation() - if(!active) return - if(!mode) - workdisk() - return if(!bomb_set) mode = 0 - workdisk() playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) visible_message("Authentication Disk Locator active.") return + if(!home) home = locate() if(!home) icon_state = "pinonnull" return + if(loc.z != home.z) //If you are on a different z-level from the shuttle icon_state = "pinonnull" + else set_dir(get_dir(src, home)) + switch(get_dist(src, home)) if(0) icon_state = "pinondirect" @@ -262,8 +262,6 @@ if(16 to INFINITY) icon_state = "pinonfar" - spawn(5) .() - // This one only points to the ship. Useful if there is no nuking to occur today. /obj/item/weapon/pinpointer/shuttle @@ -273,16 +271,17 @@ /obj/item/weapon/pinpointer/shuttle/attack_self(mob/user as mob) if(!active) active = TRUE - find_shuttle() + START_PROCESSING(SSobj, src) to_chat(user, "Shuttle Locator active.") else active = FALSE + STOP_PROCESSING(SSobj, src) icon_state = "pinoff" to_chat(user, "You deactivate the pinpointer.") -/obj/item/weapon/pinpointer/shuttle/proc/find_shuttle() +/obj/item/weapon/pinpointer/shuttle/process() if(!active) - return + return PROCESS_KILL if(!our_shuttle) for(var/obj/machinery/computer/shuttle_control/S in machines) @@ -296,8 +295,10 @@ if(loc.z != our_shuttle.z) //If you are on a different z-level from the shuttle icon_state = "pinonnull" + else set_dir(get_dir(src, our_shuttle)) + switch(get_dist(src, our_shuttle)) if(0) icon_state = "pinondirect" @@ -308,9 +309,6 @@ if(16 to INFINITY) icon_state = "pinonfar" - spawn(5) - .() - /obj/item/weapon/pinpointer/shuttle/merc shuttle_comp_id = "Mercenary" diff --git a/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm b/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm index 4135269219..b9bc8bc2c4 100644 --- a/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm @@ -40,5 +40,4 @@ else L.electrocute_act(power, src, 0.75, BP_TORSO) - - adjust_instability(3) \ No newline at end of file + adjust_instability(3) diff --git a/code/game/gamemodes/technomancer/spells/chroma.dm b/code/game/gamemodes/technomancer/spells/chroma.dm index 6033d69466..b87a82a0ae 100644 --- a/code/game/gamemodes/technomancer/spells/chroma.dm +++ b/code/game/gamemodes/technomancer/spells/chroma.dm @@ -18,23 +18,20 @@ ..() set_light(6, 5, l_color = color_to_use) -/obj/effect/chroma +/obj/effect/temporary_effect/chroma name = "chroma" desc = "How are you examining what which cannot be seen?" invisibility = 101 - var/time_to_die = 2 MINUTES //Despawn after this time, if set. + time_to_die = 2 MINUTES //Despawn after this time, if set. -/obj/effect/chroma/New(var/newloc, var/new_color = "#FFFFFF") - ..() +/obj/effect/temporary_effect/chroma/Initialize(var/mapload, var/new_color = "#FFFFFF") + . = ..() set_light(6, 5, l_color = new_color) - if(time_to_die) - spawn(time_to_die) - qdel(src) /obj/item/weapon/spell/chroma/on_ranged_cast(atom/hit_atom, mob/user) var/turf/T = get_turf(hit_atom) if(T) - new /obj/effect/chroma(T, color_to_use) + new /obj/effect/temporary_effect/chroma(T, color_to_use) to_chat(user, "You shift the light onto \the [T].") qdel(src) diff --git a/code/game/gamemodes/technomancer/spells/reflect.dm b/code/game/gamemodes/technomancer/spells/reflect.dm index 8d54ebafc8..47ed0663f2 100644 --- a/code/game/gamemodes/technomancer/spells/reflect.dm +++ b/code/game/gamemodes/technomancer/spells/reflect.dm @@ -21,13 +21,12 @@ set_light(3, 2, l_color = "#006AFF") spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src) - to_chat(owner, "Your shield will expire in 3 seconds!") - spawn(5 SECONDS) - if(src) - to_chat(owner, "Your shield expires!") - qdel(src) + to_chat(owner, "Your shield will expire in 5 seconds!") + QDEL_IN(src, 5 SECONDS) /obj/item/weapon/spell/reflect/Destroy() + if(owner) + to_chat(owner, "Your shield expires!") spark_system = null return ..() diff --git a/code/game/gamemodes/technomancer/spells/resurrect.dm b/code/game/gamemodes/technomancer/spells/resurrect.dm index cc0374b4d6..02c072b90d 100644 --- a/code/game/gamemodes/technomancer/spells/resurrect.dm +++ b/code/game/gamemodes/technomancer/spells/resurrect.dm @@ -32,7 +32,7 @@ if(istype(L, /mob/living/simple_mob)) var/mob/living/simple_mob/SM = L SM.health = SM.getMaxHealth() / 3 - SM.stat = CONSCIOUS + SM.set_stat(CONSCIOUS) dead_mob_list -= SM living_mob_list += SM SM.update_icon() @@ -52,7 +52,7 @@ sleep(10 SECONDS) if(H.client) - L.stat = CONSCIOUS //Note that if whatever killed them in the first place wasn't fixed, they're likely to die again. + L.set_stat(CONSCIOUS) //Note that if whatever killed them in the first place wasn't fixed, they're likely to die again. dead_mob_list -= H living_mob_list += H H.timeofdeath = null diff --git a/code/game/gamemodes/technomancer/spells/spawner/destablize.dm b/code/game/gamemodes/technomancer/spells/spawner/destablize.dm index 29381701ca..aee8d2557b 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/destablize.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/destablize.dm @@ -35,12 +35,13 @@ var/instability_power = 5 var/instability_range = 6 -/obj/effect/temporary_effect/destablize/New() - ..() - spawn(0) - radiate_loop() +/obj/effect/temporary_effect/destablize/Initialize() + . = ..() + radiate_loop() /obj/effect/temporary_effect/destablize/proc/radiate_loop() + set waitfor = FALSE + while(pulses_remaining) sleep(5) for(var/mob/living/L in range(src, instability_range) ) diff --git a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm index 6dcd2cf4b2..b56ea64e9c 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm @@ -31,11 +31,15 @@ var/pulse_delay = 2 SECONDS /obj/effect/temporary_effect/pulse/Initialize() - spawn(0) - pulse_loop() - return ..() + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/effect/temporary_effect/pulse/LateInitialize() + pulse_loop() /obj/effect/temporary_effect/pulse/proc/pulse_loop() + set waitfor = FALSE + while(pulses_remaining) sleep(pulse_delay) on_pulse() diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index b34d1565a0..b6f6cb25ac 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -6,7 +6,7 @@ level = 1 // underfloor layer = UNDER_JUNK_LAYER anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 0 var/obj/item/device/radio/beacon/Beacon diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 8eae094aeb..5de1543426 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -5,7 +5,7 @@ icon_state = "table2-idle" density = 1 anchored = 1.0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 1 active_power_usage = 5 surgery_odds = 100 diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index f6750215bc..79f127d69d 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -7,16 +7,16 @@ anchored = 1 //About time someone fixed this. density = 0 dir = 8 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 40 interact_offline = 1 circuit = /obj/item/weapon/circuitboard/sleeper_console clicksound = 'sound/machines/buttonbeep.ogg' clickvol = 30 -/obj/machinery/sleep_console/New() - ..() +/obj/machinery/sleep_console/Initialize() findsleeper() + return ..() /obj/machinery/sleep_console/Destroy() if(sleeper) @@ -24,14 +24,13 @@ return ..() /obj/machinery/sleep_console/proc/findsleeper() - spawn(5) - var/obj/machinery/sleeper/sleepernew = null - for(dir in list(NORTH, EAST, SOUTH, WEST)) // Loop through every direction - sleepernew = locate(/obj/machinery/sleeper, get_step(src, dir)) // Try to find a scanner in that direction - if(sleepernew) - sleeper = sleepernew - sleepernew.console = src - set_dir(get_dir(src, sleepernew)) + var/obj/machinery/sleeper/sleepernew = null + for(var/direction in GLOB.cardinal) // Loop through every direction + sleepernew = locate(/obj/machinery/sleeper, get_step(src, direction)) // Try to find a scanner in that direction + if(sleepernew) + sleeper = sleepernew + sleepernew.console = src + set_dir(get_dir(src, sleepernew)) /obj/machinery/sleep_console/attack_ai(var/mob/user) @@ -177,7 +176,7 @@ var/stasis_level = 0 //Every 'this' life ticks are applied to the mob (when life_ticks%stasis_level == 1) var/stasis_choices = list("Complete (1%)" = 100, "Deep (10%)" = 10, "Moderate (20%)" = 5, "Light (50%)" = 2, "None (100%)" = 0) - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 15 active_power_usage = 200 //builtin health analyzer, dialysis machine, injectors. @@ -255,8 +254,6 @@ return if(occupant) occupant.Stasis(stasis_level) - if(stasis_level >= 100 && occupant.timeofdeath) - occupant.timeofdeath += 1 SECOND if(filtering > 0) if(beaker) @@ -386,7 +383,7 @@ M.client.perspective = EYE_PERSPECTIVE M.client.eye = src M.loc = src - update_use_power(2) + update_use_power(USE_POWER_ACTIVE) occupant = M update_icon() @@ -406,7 +403,7 @@ if(A in component_parts) continue A.loc = src.loc - update_use_power(1) + update_use_power(USE_POWER_IDLE) update_icon() toggle_filter() toggle_pump() diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 5ab9828417..a8f9297d6f 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -9,7 +9,7 @@ density = 1 anchored = 1 circuit = /obj/item/weapon/circuitboard/body_scanner - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 60 active_power_usage = 10000 //10 kW. It's a big all-body scanner. light_color = "#00FF00" diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 2e4ec6956d..aead0c79f1 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/device.dmi' icon_state = "liquid_dispenser" anchored = 1.0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 10 var/uses = 20 var/disabled = 1 diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/air_alarm.dm similarity index 69% rename from code/game/machinery/alarm.dm rename to code/game/machinery/air_alarm.dm index 5b061b4fb9..f422441050 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/air_alarm.dm @@ -1,7 +1,3 @@ -//////////////////////////////////////// -//CONTAINS: Air Alarms and Fire Alarms// -//////////////////////////////////////// - #define AALARM_MODE_SCRUBBING 1 #define AALARM_MODE_REPLACEMENT 2 //like scrubbing, but faster. #define AALARM_MODE_PANIC 3 //constantly sucks all air @@ -17,10 +13,6 @@ #define AALARM_REPORT_TIMEOUT 100 -#define RCON_NO 1 -#define RCON_AUTO 2 -#define RCON_YES 3 - #define MAX_TEMPERATURE 90 #define MIN_TEMPERATURE -40 @@ -40,7 +32,7 @@ plane = TURF_PLANE layer = ABOVE_TURF_LAYER anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 80 active_power_usage = 1000 //For heating/cooling rooms. 1000 joules equates to about 1 degree every 2 seconds for a single tile of air. power_channel = ENVIRON @@ -98,8 +90,8 @@ /obj/machinery/alarm/alarms_hidden alarms_hidden = TRUE -/obj/machinery/alarm/server/New() - ..() +/obj/machinery/alarm/server/Initialize(mapload) + . = ..() req_access = list(access_rd, access_atmospherics, access_engine_equip) TLV["oxygen"] = list(-1.0, -1.0,-1.0,-1.0) // Partial pressure, kpa TLV["carbon dioxide"] = list(-1.0, -1.0, 5, 10) // Partial pressure, kpa @@ -109,6 +101,10 @@ TLV["temperature"] = list(20, 40, 140, 160) // K target_temperature = 90 +/obj/machinery/alarm/Initialize(mapload) + . = ..() + first_run() + /obj/machinery/alarm/Destroy() unregister_radio(src, frequency) qdel(wires) @@ -118,10 +114,6 @@ elect_master(exclude_self = TRUE) return ..() -/obj/machinery/alarm/New() - ..() - first_run() - /obj/machinery/alarm/proc/first_run() alarm_area = get_area(src) area_uid = alarm_area.uid @@ -192,7 +184,7 @@ if(!regulating_temperature) //check for when we should start adjusting temperature if(!get_danger_level(target_temperature, TLV["temperature"]) && abs(environment.temperature - target_temperature) > 2.0) - update_use_power(2) + update_use_power(USE_POWER_ACTIVE) regulating_temperature = 1 audible_message("\The [src] clicks as it starts [environment.temperature > target_temperature ? "cooling" : "heating"] the room.",\ "You hear a click and a faint electronic hum.") @@ -200,7 +192,7 @@ else //check for when we should stop adjusting temperature if(get_danger_level(target_temperature, TLV["temperature"]) || abs(environment.temperature - target_temperature) <= 0.5) - update_use_power(1) + update_use_power(USE_POWER_IDLE) regulating_temperature = 0 audible_message("\The [src] clicks quietly as it stops [environment.temperature > target_temperature ? "cooling" : "heating"] the room.",\ "You hear a click as a faint electronic humming stops.") @@ -312,7 +304,7 @@ return var/icon_level = danger_level - if(alarm_area.atmosalm) + if(alarm_area?.atmosalm) icon_level = max(icon_level, 1) //if there's an atmos alarm but everything is okay locally, no need to go past yellow var/new_color = null @@ -792,342 +784,3 @@ ..() spawn(rand(0,15)) update_icon() - -/obj/machinery/alarm/examine(mob/user) - ..(user) -/* -AIR ALARM CIRCUIT -Just a object used in constructing air alarms - -/obj/item/weapon/airalarm_electronics - name = "air alarm electronics" - icon = 'icons/obj/doors/door_assembly.dmi' - icon_state = "door_electronics" - desc = "Looks like a circuit. Probably is." - w_class = ITEMSIZE_SMALL - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) -*/ -/* -FIRE ALARM -*/ -/obj/machinery/firealarm - name = "fire alarm" - desc = "\"Pull this in case of emergency\". Thus, keep pulling it forever." - icon = 'icons/obj/monitors.dmi' - icon_state = "fire0" - plane = TURF_PLANE - layer = ABOVE_TURF_LAYER - var/detecting = 1.0 - var/working = 1.0 - var/time = 10.0 - var/timing = 0.0 - var/lockdownbyai = 0 - anchored = 1.0 - use_power = 1 - idle_power_usage = 2 - active_power_usage = 6 - power_channel = ENVIRON - var/last_process = 0 - panel_open = 0 - var/seclevel - circuit = /obj/item/weapon/circuitboard/firealarm - var/alarms_hidden = FALSE //If the alarms from this machine are visible on consoles - -/obj/machinery/firealarm/alarms_hidden - alarms_hidden = TRUE - -/obj/machinery/firealarm/update_icon() - cut_overlays() - - if(panel_open) - set_light(0) - return - - if(stat & BROKEN) - icon_state = "firex" - set_light(0) - else if(stat & NOPOWER) - icon_state = "firep" - set_light(0) - else - if(!detecting) - icon_state = "fire1" - set_light(l_range = 4, l_power = 0.9, l_color = "#ff0000") - else - icon_state = "fire0" - switch(seclevel) - if("green") set_light(l_range = 2, l_power = 0.25, l_color = "#00ff00") - if("yellow") set_light(l_range = 2, l_power = 0.25, l_color = "#ffff00") - if("violet") set_light(l_range = 2, l_power = 0.25, l_color = "#9933ff") - if("orange") set_light(l_range = 2, l_power = 0.25, l_color = "#ff9900") - if("blue") set_light(l_range = 2, l_power = 0.25, l_color = "#1024A9") - if("red") set_light(l_range = 4, l_power = 0.9, l_color = "#ff0000") - if("delta") set_light(l_range = 4, l_power = 0.9, l_color = "#FF6633") - add_overlay("overlay_[seclevel]") - -/obj/machinery/firealarm/fire_act(datum/gas_mixture/air, temperature, volume) - if(detecting) - if(temperature > T0C + 200) - alarm() // added check of detector status here - return - -/obj/machinery/firealarm/attack_ai(mob/user as mob) - return attack_hand(user) - -/obj/machinery/firealarm/bullet_act() - return alarm() - -/obj/machinery/firealarm/emp_act(severity) - if(prob(50 / severity)) - alarm(rand(30 / severity, 60 / severity)) - ..() - -/obj/machinery/firealarm/attackby(obj/item/W as obj, mob/user as mob) - add_fingerprint(user) - - if(alarm_deconstruction_screwdriver(user, W)) - return - if(alarm_deconstruction_wirecutters(user, W)) - return - - if(panel_open) - if(istype(W, /obj/item/device/multitool)) - detecting = !(detecting) - if(detecting) - user.visible_message("\The [user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.") - else - user.visible_message("\The [user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.") - return - - alarm() - return - -/obj/machinery/firealarm/process()//Note: this processing was mostly phased out due to other code, and only runs when needed - if(stat & (NOPOWER|BROKEN)) - return - - if(timing) - if(time > 0) - time = time - ((world.timeofday - last_process) / 10) - else - alarm() - time = 0 - timing = 0 - STOP_PROCESSING(SSobj, src) - updateDialog() - last_process = world.timeofday - - if(locate(/obj/fire) in src.loc) - alarm() - - return - -/obj/machinery/firealarm/power_change() - ..() - spawn(rand(0,15)) - update_icon() - -/obj/machinery/firealarm/attack_hand(mob/user as mob) - if(user.stat || stat & (NOPOWER | BROKEN)) - return - - user.set_machine(src) - var/area/A = src.loc - var/d1 - var/d2 - if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon)) - A = A.loc - - if(A.fire) - d1 = text("Reset - Lockdown", src) - else - d1 = text("Alarm - Lockdown", src) - if(timing) - d2 = text("Stop Time Lock", src) - else - d2 = text("Initiate Time Lock", src) - var/second = round(time) % 60 - var/minute = (round(time) - second) / 60 - var/dat = "Fire alarm [d1]\n
The current alert level is: [get_security_level()]

\nTimer System: [d2]
\nTime Left: [(minute ? "[minute]:" : null)][second] - - + +\n
" - user << browse(dat, "window=firealarm") - onclose(user, "firealarm") - else - A = A.loc - if(A.fire) - d1 = text("[]", src, stars("Reset - Lockdown")) - else - d1 = text("[]", src, stars("Alarm - Lockdown")) - if(timing) - d2 = text("[]", src, stars("Stop Time Lock")) - else - d2 = text("[]", src, stars("Initiate Time Lock")) - var/second = round(time) % 60 - var/minute = (round(time) - second) / 60 - var/dat = "[stars("Fire alarm")] [d1]\n
The current alert level is: [stars(get_security_level())]

\nTimer System: [d2]
\nTime Left: [(minute ? text("[]:", minute) : null)][second] - - + +\n
" - user << browse(dat, "window=firealarm") - onclose(user, "firealarm") - return - -/obj/machinery/firealarm/Topic(href, href_list) - ..() - if(usr.stat || stat & (BROKEN | NOPOWER)) - return - - if((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.set_machine(src) - if(href_list["reset"]) - reset() - else if(href_list["alarm"]) - alarm() - else if(href_list["time"]) - timing = text2num(href_list["time"]) - last_process = world.timeofday - START_PROCESSING(SSobj, src) - else if(href_list["tp"]) - var/tp = text2num(href_list["tp"]) - time += tp - time = min(max(round(time), 0), 120) - - updateUsrDialog() - - add_fingerprint(usr) - else - usr << browse(null, "window=firealarm") - return - return - -/obj/machinery/firealarm/proc/reset() - if(!(working)) - return - var/area/area = get_area(src) - for(var/obj/machinery/firealarm/FA in area) - fire_alarm.clearAlarm(src.loc, FA) - update_icon() - return - -/obj/machinery/firealarm/proc/alarm(var/duration = 0) - if(!(working)) - return - var/area/area = get_area(src) - for(var/obj/machinery/firealarm/FA in area) - fire_alarm.triggerAlarm(loc, FA, duration, hidden = alarms_hidden) - update_icon() - //playsound(src.loc, 'sound/ambience/signal.ogg', 75, 0) - return - -/obj/machinery/firealarm/proc/set_security_level(var/newlevel) - if(seclevel != newlevel) - seclevel = newlevel - update_icon() - -/obj/machinery/firealarm/Initialize() - . = ..() - if(z in using_map.contact_levels) - set_security_level(security_level? get_security_level() : "green") - -/* -FIRE ALARM CIRCUIT -Just a object used in constructing fire alarms - -/obj/item/weapon/firealarm_electronics - name = "fire alarm electronics" - icon = 'icons/obj/doors/door_assembly.dmi' - icon_state = "door_electronics" - desc = "A circuit. It has a label on it, it says \"Can handle heat levels up to 40 degrees celsius!\"" - w_class = ITEMSIZE_SMALL - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) -*/ -/obj/machinery/partyalarm - name = "\improper PARTY BUTTON" - desc = "Cuban Pete is in the house!" - icon = 'icons/obj/monitors.dmi' - icon_state = "fire0" - var/detecting = 1.0 - var/working = 1.0 - var/time = 10.0 - var/timing = 0.0 - var/lockdownbyai = 0 - anchored = 1.0 - use_power = 1 - idle_power_usage = 2 - active_power_usage = 6 - -/obj/machinery/partyalarm/attack_hand(mob/user as mob) - if(user.stat || stat & (NOPOWER|BROKEN)) - return - - user.machine = src - var/area/A = get_area(src) - ASSERT(isarea(A)) - var/d1 - var/d2 - if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) - - if(A.party) - d1 = text("No Party :(", src) - else - d1 = text("PARTY!!!", src) - if(timing) - d2 = text("Stop Time Lock", src) - else - d2 = text("Initiate Time Lock", src) - var/second = time % 60 - var/minute = (time - second) / 60 - var/dat = text("Party Button []\n
\nTimer System: []
\nTime Left: [][] - - + +\n
", d1, d2, (minute ? text("[]:", minute) : null), second, src, src, src, src) - user << browse(dat, "window=partyalarm") - onclose(user, "partyalarm") - else - if(A.fire) - d1 = text("[]", src, stars("No Party :(")) - else - d1 = text("[]", src, stars("PARTY!!!")) - if(timing) - d2 = text("[]", src, stars("Stop Time Lock")) - else - d2 = text("[]", src, stars("Initiate Time Lock")) - var/second = time % 60 - var/minute = (time - second) / 60 - var/dat = text("[] []\n
\nTimer System: []
\nTime Left: [][] - - + +\n
", stars("Party Button"), d1, d2, (minute ? text("[]:", minute) : null), second, src, src, src, src) - user << browse(dat, "window=partyalarm") - onclose(user, "partyalarm") - return - -/obj/machinery/partyalarm/proc/reset() - if(!(working)) - return - var/area/A = get_area(src) - ASSERT(isarea(A)) - A.partyreset() - return - -/obj/machinery/partyalarm/proc/alarm() - if(!(working)) - return - var/area/A = get_area(src) - ASSERT(isarea(A)) - A.partyalert() - return - -/obj/machinery/partyalarm/Topic(href, href_list) - ..() - if(usr.stat || stat & (BROKEN|NOPOWER)) - return - if((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) - usr.machine = src - if(href_list["reset"]) - reset() - else if(href_list["alarm"]) - alarm() - else if(href_list["time"]) - timing = text2num(href_list["time"]) - else if(href_list["tp"]) - var/tp = text2num(href_list["tp"]) - time += tp - time = min(max(round(time), 0), 120) - updateUsrDialog() - - add_fingerprint(usr) - else - usr << browse(null, "window=partyalarm") - return - return diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index e462e0eed6..3833c72ee4 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -18,7 +18,7 @@ pressure_resistance = 7 * ONE_ATMOSPHERE var/temperature_resistance = 1000 + T0C volume = 1000 - use_power = 0 + use_power = USE_POWER_OFF interact_offline = 1 // Allows this to be used when not in powered area. var/release_log = "" var/update_flag = 0 @@ -395,16 +395,13 @@ update_flag return 1 //Dirty way to fill room with gas. However it is a bit easier to do than creating some floor/engine/n2o -rastaf0 -/obj/machinery/portable_atmospherics/canister/sleeping_agent/roomfiller/New() - ..() +/obj/machinery/portable_atmospherics/canister/sleeping_agent/roomfiller/Initialize() + . = ..() air_contents.gas["sleeping_agent"] = 9*4000 - spawn(10) - var/turf/simulated/location = src.loc - if (istype(src.loc)) - while (!location.air) - sleep(10) - location.assume_air(air_contents) - air_contents = new + var/turf/simulated/location = src.loc + if (istype(src.loc)) + location.assume_air(air_contents) + air_contents = new return 1 /obj/machinery/portable_atmospherics/canister/nitrogen/New() diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index a2281c7069..84b18c31ea 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -9,7 +9,7 @@ power_channel = ENVIRON var/frequency = 0 var/id - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 15 /obj/machinery/meter/Initialize() diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 085c070f7d..915fb8fac1 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -1,6 +1,6 @@ /obj/machinery/portable_atmospherics name = "atmoalter" - use_power = 0 + use_power = USE_POWER_OFF layer = OBJ_LAYER // These are mobile, best not be under everything. var/datum/gas_mixture/air_contents = new @@ -21,18 +21,20 @@ return 1 +/obj/machinery/portable_atmospherics/Initialize() + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/portable_atmospherics/LateInitialize() + var/obj/machinery/atmospherics/portables_connector/port = locate() in loc + if(port) + connect(port) + update_icon() + /obj/machinery/portable_atmospherics/Destroy() QDEL_NULL(air_contents) QDEL_NULL(holding) - . = ..() - -/obj/machinery/portable_atmospherics/Initialize() - . = ..() - spawn() - var/obj/machinery/atmospherics/portables_connector/port = locate() in loc - if(port) - connect(port) - update_icon() + return ..() /obj/machinery/portable_atmospherics/process() if(!connected_port) //only react when pipe_network will ont it do it for you diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index de3ef0587e..3b6df894b5 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -151,7 +151,7 @@ volume = 50000 volume_rate = 5000 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 500 //internal circuitry, friction losses and stuff active_power_usage = 100000 //100 kW ~ 135 HP diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index ff26049fa6..7622ef1289 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -4,7 +4,7 @@ icon_state = "autolathe" density = 1 anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 10 active_power_usage = 2000 clicksound = "keyboard" @@ -246,7 +246,7 @@ return busy = 1 - update_use_power(2) + update_use_power(USE_POWER_ACTIVE) //Check if we still have the materials. var/coeff = (making.no_scale ? 1 : mat_efficiency) //stacks are unaffected by production coefficient @@ -265,7 +265,7 @@ sleep(build_time) busy = 0 - update_use_power(1) + update_use_power(USE_POWER_IDLE) update_icon() // So lid opens //Sanity check. diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index 8c278c63fa..503d4ebfc2 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -6,7 +6,7 @@ density = 1 anchored = 1 circuit = /obj/item/weapon/circuitboard/biogenerator - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 40 var/processing = 0 var/obj/item/weapon/reagent_containers/glass/beaker = null @@ -107,7 +107,7 @@ dat += "Food:
" dat += "10 milk([round(20/build_eff)]) | x5
" dat += "10 cream([round(20/build_eff)]) | x5
" - dat += "Slab of meat([round(50/build_eff)]) | x5
" + dat += "Slab of meat([round(50/build_eff)]) | x5
" dat += "Nutrient:
" dat += "E-Z-Nutrient([round(60/build_eff)]) | x5
" dat += "Left 4 Zed([round(120/build_eff)]) | x5
" diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm index 60143fadd3..f7e4749fe3 100644 --- a/code/game/machinery/bioprinter.dm +++ b/code/game/machinery/bioprinter.dm @@ -9,7 +9,7 @@ anchored = 1 density = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 40 active_power_usage = 300 @@ -161,7 +161,7 @@ container.reagents.remove_reagent("biomass", possible_list[choice][2]) - use_power = 2 + use_power = USE_POWER_ACTIVE printing = 1 update_icon() @@ -169,7 +169,7 @@ sleep(print_delay) - use_power = 1 + use_power = USE_POWER_IDLE printing = 0 update_icon() diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index b072a7e488..2415673f80 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -6,7 +6,7 @@ var/id = null var/active = 0 anchored = 1.0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 2 active_power_usage = 4 diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 80bb492707..9fc72b0a17 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -3,7 +3,7 @@ desc = "It's used to monitor rooms." icon = 'icons/obj/monitors.dmi' icon_state = "camera" - use_power = 2 + use_power = USE_POWER_ACTIVE idle_power_usage = 5 active_power_usage = 10 plane = MOB_PLANE diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index f35fc538da..0358523bbb 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -156,24 +156,31 @@ var/global/list/engineering_networks = list( // AUTONAME /obj/machinery/camera/autoname - var/number = 0 //camera number in area - -//This camera type automatically sets it's name to whatever the area that it's in is called. -/obj/machinery/camera/autoname/New() - ..() - spawn(10) - number = 1 - var/area/A = get_area(src) - if(A) - for(var/obj/machinery/camera/autoname/C in machines) - if(C == src) continue - var/area/CA = get_area(C) - if(CA.type == A.type) - if(C.number) - number = max(number, C.number+1) - c_tag = "[A.name] #[number]" - invalidateCameraCache() + var/static/list/by_area +/obj/machinery/camera/autoname/Initialize() + . = ..() + var/area/A = get_area(src) + if(!A) + return . + if(!by_area) + by_area = list() + if(!by_area[A.name]) + by_area[A.name] = list() + var/list/my_area = by_area[A.name] + my_area += src + var/number = my_area.len + + c_tag = "[A.name] #[number]" + invalidateCameraCache() + +/obj/machinery/camera/autoname/Destroy() + var/area/A = get_area(src) + if(!A || !by_area || !by_area[A.name]) + return ..() + var/list/my_area = by_area[A.name] + my_area -= src + return ..() // CHECKS diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 0ceae52046..636bcca6c0 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/power.dmi' icon_state = "ccharger0" anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 5 active_power_usage = 60000 //60 kW. (this the power drawn when charging) var/efficiency = 60000 //will provide the modified power rate when upgraded @@ -118,16 +118,16 @@ /obj/machinery/cell_charger/process() //to_world("ccpt [charging] [stat]") if((stat & (BROKEN|NOPOWER)) || !anchored) - update_use_power(0) + update_use_power(USE_POWER_OFF) return if(charging && !charging.fully_charged()) charging.give(efficiency*CELLRATE) - update_use_power(2) + update_use_power(USE_POWER_ACTIVE) update_icon() else - update_use_power(1) + update_use_power(USE_POWER_IDLE) /obj/machinery/cell_charger/RefreshParts() var/E = 0 diff --git a/code/game/machinery/computer/RCON_Console.dm b/code/game/machinery/computer/RCON_Console.dm index ca45c47acb..07992aea78 100644 --- a/code/game/machinery/computer/RCON_Console.dm +++ b/code/game/machinery/computer/RCON_Console.dm @@ -8,7 +8,7 @@ name = "\improper RCON console" desc = "Console used to remotely control electrical machinery on the station." icon_keyboard = "power_key" - icon_screen = "power:0" + icon_screen = "ai-fixer" light_color = "#a97faa" circuit = /obj/item/weapon/circuitboard/rcon_console req_one_access = list(access_engine) @@ -40,4 +40,6 @@ /obj/machinery/computer/rcon/update_icon() ..() if(!(stat & (NOPOWER|BROKEN))) - overlays += image('icons/obj/computer.dmi', "ai-fixer-empty", overlay_layer) + add_overlay("ai-fixer-empty") + else + cut_overlay("ai-fixer-empty") \ No newline at end of file diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 5af8e2320c..daca64cc42 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -110,7 +110,7 @@ src.occupant.adjustBruteLoss(-1) src.occupant.updatehealth() if (src.occupant.health >= 0 && src.occupant.stat == DEAD) - src.occupant.stat = CONSCIOUS + src.occupant.set_stat(CONSCIOUS) src.occupant.lying = 0 dead_mob_list -= src.occupant living_mob_list += src.occupant @@ -135,8 +135,8 @@ if(occupant) if(occupant.stat) - overlays += image(icon, "ai-fixer-404", overlay_layer) + add_overlay("ai-fixer-404") else - overlays += image(icon, "ai-fixer-full", overlay_layer) + add_overlay("ai-fixer-full") else - overlays += image(icon, "ai-fixer-empty", overlay_layer) + add_overlay("ai-fixer-empty") diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 2968ae8aaf..c50aa8da24 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -170,7 +170,7 @@ src.current_camera = C if(current_camera) current_camera.camera_computers_using_this.Add(src) - use_power = 2 + update_use_power(USE_POWER_ACTIVE) var/mob/living/L = current_camera.loc if(istype(L)) L.tracking_initiated() @@ -182,7 +182,7 @@ if(istype(L)) L.tracking_cancelled() current_camera = null - use_power = 1 + use_power = USE_POWER_IDLE //Camera control: mouse. /atom/DblClick() diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 309a066404..0117a73ce4 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -4,7 +4,7 @@ icon_state = "computer" density = 1 anchored = 1.0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 300 active_power_usage = 300 var/processing = 0 @@ -13,12 +13,10 @@ var/icon_screen = "generic" var/light_range_on = 2 var/light_power_on = 1 - var/overlay_layer clicksound = "keyboard" /obj/machinery/computer/New() - overlay_layer = layer ..() /obj/machinery/computer/Initialize() @@ -66,31 +64,28 @@ ex_act(2) /obj/machinery/computer/update_icon() - overlays.Cut() + cut_overlays() + // No power if(stat & NOPOWER) set_light(0) if(icon_keyboard) - overlays += image(icon,"[icon_keyboard]_off", overlay_layer) - return + add_overlay("[icon_keyboard]_off") + // Yes power else + if(icon_keyboard) + add_overlay(icon_keyboard) set_light(light_range_on, light_power_on) - if(stat & BROKEN) - overlays += image(icon,"[icon_state]_broken", overlay_layer) - else - overlays += image(icon,icon_screen, overlay_layer) - - if(icon_keyboard) - overlays += image(icon, icon_keyboard, overlay_layer) + // Broken + if(stat & BROKEN) + add_overlay("[icon_state]_broken") + // Not broken + else + add_overlay(icon_screen) /obj/machinery/computer/power_change() ..() update_icon() - if(stat & NOPOWER) - set_light(0) - else - set_light(light_range_on, light_power_on) - /obj/machinery/computer/proc/set_broken() stat |= BROKEN diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 0c6c33928a..9342e0b5e9 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -4,7 +4,7 @@ icon_keyboard = "med_key" icon_screen = "crew" light_color = "#315ab4" - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 250 active_power_usage = 500 circuit = /obj/item/weapon/circuitboard/crew diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 3aa01abcf3..2416a0cd35 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -503,20 +503,18 @@ return src.attack_hand(usr) - /obj/item/weapon/paper/monitorkey - //..() name = "Monitor Decryption Key" - var/obj/machinery/message_server/server = null -/obj/item/weapon/paper/monitorkey/New() - ..() - spawn(10) - if(message_servers) - for(var/obj/machinery/message_server/server in message_servers) - if(!isnull(server)) - if(!isnull(server.decryptkey)) - info = "

Daily Key Reset


The new message monitor key is '[server.decryptkey]'.
Please keep this a secret and away from the clown.
If necessary, change the password to a more secure one." - info_links = info - icon_state = "paper_words" - break +/obj/item/weapon/paper/monitorkey/Initialize() + ..() //Late init + return INITIALIZE_HINT_LATELOAD + +/obj/item/weapon/paper/monitorkey/LateInitialize() + if(message_servers) + for(var/obj/machinery/message_server/server in message_servers) + if(!isnull(server.decryptkey)) + info = "

Daily Key Reset


The new message monitor key is '[server.decryptkey]'.
Please keep this a secret and away from the clown.
If necessary, change the password to a more secure one." + info_links = info + icon_state = "paper_words" + break diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index f40fb734dc..441970a8cb 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -12,17 +12,15 @@ var/time = 30.0 var/title = "Mass Driver Controls" +/obj/machinery/computer/pod/Initialize() + ..() //Not returning parent because lateload + return INITIALIZE_HINT_LATELOAD -/obj/machinery/computer/pod/New() - ..() - spawn( 5 ) - for(var/obj/machinery/mass_driver/M in machines) - if(M.id == id) - connected = M - else - return - return - +/obj/machinery/computer/pod/LateInitialize() + for(var/obj/machinery/mass_driver/M in machines) + if(M.id == id) + connected = M + break /obj/machinery/computer/pod/proc/alarm() if(stat & (NOPOWER|BROKEN)) diff --git a/code/game/machinery/computer/shutoff_monitor.dm b/code/game/machinery/computer/shutoff_monitor.dm index 9bb2146116..aed7bd25b9 100644 --- a/code/game/machinery/computer/shutoff_monitor.dm +++ b/code/game/machinery/computer/shutoff_monitor.dm @@ -67,4 +67,4 @@ /obj/machinery/computer/shutoff_monitor/update_icon() ..() if(!(stat & (NOPOWER|BROKEN))) - overlays += image('icons/obj/computer.dmi', "ai-fixer-empty", overlay_layer) + add_overlay("ai-fixer-empty") diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 50ccdb47d8..1a64db7389 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -91,19 +91,28 @@ var/icon/side = active1.fields["photo_side"] user << browse_rsc(front, "front.png") user << browse_rsc(side, "side.png") - dat += text("
Event TypeStart TimeFinish Time
[event.type][event.time_started][event.time_finished]
\ -
\ - Name: [active1.fields["name"]]
\ - ID: [active1.fields["id"]]
\n \ - Entity Classification: [active1.fields["brain_type"]]
\n \ - Sex: [active1.fields["sex"]]
\n \ - Age: [active1.fields["age"]]
\n \ - Rank: [active1.fields["rank"]]
\n \ - Fingerprint: [active1.fields["fingerprint"]]
\n \ - Physical Status: [active1.fields["p_stat"]]
\n \ - Mental Status: [active1.fields["m_stat"]]

\n \ - Employment/skills summary:
[decode(active1.fields["notes"])]
Photo:
\ -
") + dat += "" + + dat += "
" + dat += "Name: [active1.fields["name"]]
" + dat += "ID: [active1.fields["id"]]
\n" + dat += "Entity Classification: [active1.fields["brain_type"]]
\n" + dat += "Sex: [active1.fields["sex"]]
\n" + dat += "Age: [active1.fields["age"]]
\n" + dat += "Rank: [active1.fields["rank"]]
\n" + dat += "Fingerprint: [active1.fields["fingerprint"]]
\n" + dat += "Physical Status: [active1.fields["p_stat"]]
\n" + dat += "Mental Status: [active1.fields["m_stat"]]

\n" + + dat += "Employment/skills summary:
" + dat += decode(active1.fields["notes"]) + dat += "


" + var/counter = 1 + while(src.active1.fields[text("com_[]", counter)]) + dat += text("[]
Delete Entry

", src.active1.fields[text("com_[]", counter)], src, counter) + counter++ + dat += "Add Entry

Photo:
" + dat += "
" else dat += "General Record Lost!
" dat += text("\nDelete Record (ALL)

\nPrint Record
\nBack
", src, src, src) @@ -285,6 +294,25 @@ What a mess.*/ P.name = "Employment Record (Unknown/Invald Entry)" log_debug("[usr] ([usr.ckey]) attempted to print a null employee record, this should be investigated.") printing = null +// Add comment + if ("add_c") + if (!( istype(src.active1, /datum/data/record) )) + return + var/a1 = src.active1 + var/t1 = sanitize(input("Add Comment:", "Emp. records", null, null) as message) + if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) + return + var/counter = 1 + while(src.active1.fields[text("com_[]", counter)]) + counter++ + src.active1.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [stationtime2text()], [game_year]
[t1]") +// Delete comment + if ("del_c") + var/target = href_list["del_c"] + if (istype(src.active1, /datum/data/record) && src.active1.fields["com_[target]"]) + src.active1.fields["com_[target]"] = "Deleted" + + //RECORD DELETE if ("Delete All Records") temp = "" diff --git a/code/game/machinery/computer/supply.dm b/code/game/machinery/computer/supply.dm index e1dddbbeda..05b4e65292 100644 --- a/code/game/machinery/computer/supply.dm +++ b/code/game/machinery/computer/supply.dm @@ -56,7 +56,7 @@ var/orders[0] var/receipts[0] - var/datum/shuttle/autodock/ferry/supply/shuttle = supply_controller.shuttle + var/datum/shuttle/autodock/ferry/supply/shuttle = SSsupply.shuttle if(shuttle) if(shuttle.has_arrive_time()) shuttle_status["location"] = "In transit" @@ -109,8 +109,8 @@ else shuttle["mode"] = SUP_SHUTTLE_ERROR - for(var/pack_name in supply_controller.supply_pack) - var/datum/supply_pack/P = supply_controller.supply_pack[pack_name] + for(var/pack_name in SSsupply.supply_pack) + var/datum/supply_pack/P = SSsupply.supply_pack[pack_name] if(P.group == active_category) var/list/pack = list( "name" = P.name, @@ -131,7 +131,7 @@ // Status determines which menus the entry will display in // Organized in field-entry list for iterative display // List is nested so both the list of orders, and the list of elements in each order, can be iterated over - for(var/datum/supply_order/S in supply_controller.order_history) + for(var/datum/supply_order/S in SSsupply.order_history) orders[++orders.len] = list( "ref" = "\ref[S]", "status" = S.status, @@ -148,7 +148,7 @@ ) // Compile exported crates - for(var/datum/exported_crate/E in supply_controller.exported_crates) + for(var/datum/exported_crate/E in SSsupply.exported_crates) receipts[++receipts.len] = list( "ref" = "\ref[E]", "contents" = E.contents, @@ -164,7 +164,7 @@ data["shuttle_auth"] = (authorization & SUP_SEND_SHUTTLE) // Whether this ui is permitted to control the supply shuttle data["order_auth"] = (authorization & SUP_ACCEPT_ORDERS) // Whether this ui is permitted to accept/deny requested orders data["shuttle"] = shuttle_status - data["supply_points"] = supply_controller.points + data["supply_points"] = SSsupply.points data["categories"] = all_supply_groups data["active_category"] = active_category data["supply_packs"] = pack_list @@ -189,10 +189,10 @@ /obj/machinery/computer/supplycomp/Topic(href, href_list) - if(!supply_controller) - to_world_log("## ERROR: The supply_controller datum is missing.") + if(!SSsupply) + to_world_log("## ERROR: The SSsupply datum is missing.") return - var/datum/shuttle/autodock/ferry/supply/shuttle = supply_controller.shuttle + var/datum/shuttle/autodock/ferry/supply/shuttle = SSsupply.shuttle if (!shuttle) to_world_log("## ERROR: The supply shuttle datum is missing.") return @@ -240,7 +240,7 @@ if(!reason) return - supply_controller.create_order(S, user, reason) + SSsupply.create_order(S, user, reason) var/idname = "*None Provided*" var/idrank = "*None Provided*" @@ -255,7 +255,7 @@ var/obj/item/weapon/paper/reqform = new /obj/item/weapon/paper(loc) reqform.name = "Requisition Form - [S.name]" reqform.info += "

[station_name()] Supply Requisition Form


" - reqform.info += "INDEX: #[supply_controller.ordernum]
" + reqform.info += "INDEX: #[SSsupply.ordernum]
" reqform.info += "REQUESTED BY: [idname]
" reqform.info += "RANK: [idrank]
" reqform.info += "REASON: [reason]
" @@ -315,20 +315,20 @@ O.approved_at = new_val if(href_list["approve"]) - supply_controller.approve_order(O, user) + SSsupply.approve_order(O, user) if(href_list["deny"]) - supply_controller.deny_order(O, user) + SSsupply.deny_order(O, user) if(href_list["delete"]) - supply_controller.delete_order(O, user) + SSsupply.delete_order(O, user) if(href_list["clear_all_requests"]) var/mob/user = locate(href_list["user"]) if(!istype(user)) // Invalid ref return - supply_controller.deny_all_pending(user) + SSsupply.deny_all_pending(user) if(href_list["export_ref"]) var/datum/exported_crate/E = locate(href_list["export_ref"]) @@ -384,10 +384,10 @@ E.value = num else if(href_list["delete"]) - supply_controller.delete_export(E, user) + SSsupply.delete_export(E, user) else if(href_list["add_item"]) - supply_controller.add_export_item(E, user) + SSsupply.add_export_item(E, user) @@ -401,7 +401,7 @@ if("send_to_station") shuttle.launch(src) - to_chat(usr, "The supply shuttle has been called and will arrive in approximately [round(supply_controller.movetime/600,1)] minutes.") + to_chat(usr, "The supply shuttle has been called and will arrive in approximately [round(SSsupply.movetime/600,1)] minutes.") if("cancel_shuttle") shuttle.cancel_launch(src) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index e74ffb7cf9..aa9c230e22 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -7,7 +7,7 @@ icon_state = "box_0" density = 1 anchored = 1 - use_power = 0 + use_power = USE_POWER_OFF var/obj/item/weapon/circuitboard/circuit = null var/list/components = null var/list/req_components = null diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 9f10ff4c90..946470ca95 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -11,7 +11,7 @@ interact_offline = 1 var/on = 0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 20 active_power_usage = 200 buckle_lying = FALSE @@ -232,7 +232,7 @@ return occupant.bodytemperature += 2*(air_contents.temperature - occupant.bodytemperature)*current_heat_capacity/(current_heat_capacity + air_contents.heat_capacity()) occupant.bodytemperature = max(occupant.bodytemperature, air_contents.temperature) // this is so ugly i'm sorry for doing it i'll fix it later i promise - occupant.stat = UNCONSCIOUS + occupant.set_stat(UNCONSCIOUS) occupant.dir = SOUTH if(occupant.bodytemperature < T0C) occupant.sleeping = max(5, (1/occupant.bodytemperature)*2000) @@ -291,7 +291,7 @@ unbuckle_mob(occupant, force = TRUE) occupant = null current_heat_capacity = initial(current_heat_capacity) - update_use_power(1) + update_use_power(USE_POWER_IDLE) return /obj/machinery/atmospherics/unary/cryo_cell/proc/put_mob(mob/living/carbon/M as mob) if(stat & (NOPOWER|BROKEN)) @@ -322,7 +322,7 @@ vis_contents |= occupant occupant.pixel_y += 19 current_heat_capacity = HEAT_CAPACITY_HUMAN - update_use_power(2) + update_use_power(USE_POWER_ACTIVE) // M.metabslow = 1 add_fingerprint(usr) update_icon() diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 7b7b75d956..cad7e07c24 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -95,7 +95,7 @@ dat += "Recover object.
" dat += "Recover all objects.
" - to_chat(user, browse(dat, "window=cryopod_console")) + user << browse(dat, "window=cryopod_console") onclose(user, "cryopod_console") /obj/machinery/computer/cryopod/Topic(href, href_list) @@ -114,7 +114,7 @@ dat += "[person]
" dat += "
" - to_chat(user, browse(dat, "window=cryolog")) + user << browse(dat, "window=cryolog") if(href_list["view"]) if(!allow_items) return @@ -124,7 +124,7 @@ dat += "[I.name]
" dat += "
" - to_chat(user, browse(dat, "window=cryoitems")) + user << browse(dat, "window=cryoitems") else if(href_list["item"]) if(!allow_items) return diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 86b0bfa622..e4a81d675c 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -14,7 +14,7 @@ */ anchored = 1.0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 2 active_power_usage = 4 @@ -203,4 +203,18 @@ if(!active || (stat & NOPOWER)) icon_state = "launcherbtt" else - icon_state = "launcheract" \ No newline at end of file + icon_state = "launcheract" + +/* + Shieldgen remote control +*/ +/obj/machinery/button/remote/shields + name = "remote shield control" + desc = "It controls shields, remotely." + +/obj/machinery/button/remote/shields/trigger(var/mob/user) + for(var/obj/machinery/shield_gen/SG in machines) + if(SG.id == id) + spawn(0) + if(SG?.anchored) + SG.toggle() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 70949341ba..40cf9febd0 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -42,7 +42,7 @@ if(isanimal(user)) var/mob/living/simple_mob/S = user if(damage >= STRUCTURE_MIN_DAMAGE_THRESHOLD) - visible_message("\The [user] smashes into the [src]!") + visible_message("\The [user] smashes into [src]!") playsound(src, S.attack_sound, 75, 1) take_damage(damage) else diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index d5043af6ef..22debea238 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -38,7 +38,7 @@ var/hatch_open = 0 power_channel = ENVIRON - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 5 var/list/tile_info[4] @@ -50,13 +50,14 @@ "cold" ) -/obj/machinery/door/firedoor/New() +/obj/machinery/door/firedoor/Initialize() . = ..() + //Delete ourselves if we find extra mapped in firedoors for(var/obj/machinery/door/firedoor/F in loc) if(F != src) - spawn(1) - qdel(src) - return . + log_debug("Duplicate firedoors at [x],[y],[z]") + return INITIALIZE_HINT_QDEL + var/area/A = get_area(src) ASSERT(istype(A)) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index a1e05d5e1e..1396b5f554 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -9,7 +9,7 @@ maxhealth = 150 //If you change this, consiter changing ../door/window/brigdoor/ health at the bottom of this .dm file health = 150 visible = 0.0 - use_power = 0 + use_power = USE_POWER_OFF flags = ON_BORDER opacity = 0 var/obj/item/weapon/airlock_electronics/electronics = null diff --git a/code/game/machinery/embedded_controller/docking_program.dm b/code/game/machinery/embedded_controller/docking_program.dm index 44a34fddec..86876abe28 100644 --- a/code/game/machinery/embedded_controller/docking_program.dm +++ b/code/game/machinery/embedded_controller/docking_program.dm @@ -117,7 +117,7 @@ if(docking_codes) var/code = signal.data["code"] if(code != docking_codes) - testing("Controller [id_tag] got request_dock but code:[code] != docking_codes:[docking_codes]") + log_debug("Controller [id_tag] got request_dock but code:[code] != docking_codes:[docking_codes]") return control_mode = MODE_SERVER diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 67d8dc4a7f..714d27d560 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -1,7 +1,7 @@ /obj/machinery/embedded_controller name = "Embedded Controller" anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 10 var/datum/computer/file/embedded_program/program //the currently executing program var/on = 1 diff --git a/code/game/machinery/fire_alarm.dm b/code/game/machinery/fire_alarm.dm new file mode 100644 index 0000000000..a9b4a0705e --- /dev/null +++ b/code/game/machinery/fire_alarm.dm @@ -0,0 +1,324 @@ +/* +FIRE ALARM +*/ +/obj/machinery/firealarm + name = "fire alarm" + desc = "\"Pull this in case of emergency\". Thus, keep pulling it forever." + icon = 'icons/obj/monitors.dmi' + icon_state = "fire0" + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER + var/detecting = 1.0 + var/working = 1.0 + var/time = 10.0 + var/timing = 0.0 + var/lockdownbyai = 0 + anchored = 1.0 + use_power = 1 + idle_power_usage = 2 + active_power_usage = 6 + power_channel = ENVIRON + var/last_process = 0 + panel_open = 0 + var/seclevel + circuit = /obj/item/weapon/circuitboard/firealarm + var/alarms_hidden = FALSE //If the alarms from this machine are visible on consoles + +/obj/machinery/firealarm/alarms_hidden + alarms_hidden = TRUE + +/obj/machinery/firealarm/Initialize() + . = ..() + if(z in using_map.contact_levels) + set_security_level(security_level ? get_security_level() : "green") + +/obj/machinery/firealarm/update_icon() + cut_overlays() + + if(panel_open) + set_light(0) + return + + if(stat & BROKEN) + icon_state = "firex" + set_light(0) + else if(stat & NOPOWER) + icon_state = "firep" + set_light(0) + else + if(!detecting) + icon_state = "fire1" + set_light(l_range = 4, l_power = 0.9, l_color = "#ff0000") + else + icon_state = "fire0" + switch(seclevel) + if("green") set_light(l_range = 2, l_power = 0.25, l_color = "#00ff00") + if("yellow") set_light(l_range = 2, l_power = 0.25, l_color = "#ffff00") + if("violet") set_light(l_range = 2, l_power = 0.25, l_color = "#9933ff") + if("orange") set_light(l_range = 2, l_power = 0.25, l_color = "#ff9900") + if("blue") set_light(l_range = 2, l_power = 0.25, l_color = "#1024A9") + if("red") set_light(l_range = 4, l_power = 0.9, l_color = "#ff0000") + if("delta") set_light(l_range = 4, l_power = 0.9, l_color = "#FF6633") + add_overlay("overlay_[seclevel]") + +/obj/machinery/firealarm/fire_act(datum/gas_mixture/air, temperature, volume) + if(detecting) + if(temperature > T0C + 200) + alarm() // added check of detector status here + return + +/obj/machinery/firealarm/attack_ai(mob/user as mob) + return attack_hand(user) + +/obj/machinery/firealarm/bullet_act() + return alarm() + +/obj/machinery/firealarm/emp_act(severity) + if(prob(50 / severity)) + alarm(rand(30 / severity, 60 / severity)) + ..() + +/obj/machinery/firealarm/attackby(obj/item/W as obj, mob/user as mob) + add_fingerprint(user) + + if(alarm_deconstruction_screwdriver(user, W)) + return + if(alarm_deconstruction_wirecutters(user, W)) + return + + if(panel_open) + if(istype(W, /obj/item/device/multitool)) + detecting = !(detecting) + if(detecting) + user.visible_message("\The [user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.") + else + user.visible_message("\The [user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.") + return + + alarm() + return + +/obj/machinery/firealarm/process()//Note: this processing was mostly phased out due to other code, and only runs when needed + if(stat & (NOPOWER|BROKEN)) + return + + if(timing) + if(time > 0) + time = time - ((world.timeofday - last_process) / 10) + else + alarm() + time = 0 + timing = 0 + STOP_PROCESSING(SSobj, src) + updateDialog() + last_process = world.timeofday + + if(locate(/obj/fire) in src.loc) + alarm() + + return + +/obj/machinery/firealarm/power_change() + ..() + spawn(rand(0,15)) + update_icon() + +/obj/machinery/firealarm/attack_hand(mob/user as mob) + if(user.stat || stat & (NOPOWER | BROKEN)) + return + + user.set_machine(src) + var/area/A = src.loc + var/d1 + var/d2 + if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon)) + A = A.loc + + if(A.fire) + d1 = text("Reset - Lockdown", src) + else + d1 = text("Alarm - Lockdown", src) + if(timing) + d2 = text("Stop Time Lock", src) + else + d2 = text("Initiate Time Lock", src) + var/second = round(time) % 60 + var/minute = (round(time) - second) / 60 + var/dat = "Fire alarm [d1]\n
The current alert level is: [get_security_level()]

\nTimer System: [d2]
\nTime Left: [(minute ? "[minute]:" : null)][second] - - + +\n
" + user << browse(dat, "window=firealarm") + onclose(user, "firealarm") + else + A = A.loc + if(A.fire) + d1 = text("[]", src, stars("Reset - Lockdown")) + else + d1 = text("[]", src, stars("Alarm - Lockdown")) + if(timing) + d2 = text("[]", src, stars("Stop Time Lock")) + else + d2 = text("[]", src, stars("Initiate Time Lock")) + var/second = round(time) % 60 + var/minute = (round(time) - second) / 60 + var/dat = "[stars("Fire alarm")] [d1]\n
The current alert level is: [stars(get_security_level())]

\nTimer System: [d2]
\nTime Left: [(minute ? text("[]:", minute) : null)][second] - - + +\n
" + user << browse(dat, "window=firealarm") + onclose(user, "firealarm") + return + +/obj/machinery/firealarm/Topic(href, href_list) + ..() + if(usr.stat || stat & (BROKEN | NOPOWER)) + return + + if((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) + usr.set_machine(src) + if(href_list["reset"]) + reset() + else if(href_list["alarm"]) + alarm() + else if(href_list["time"]) + timing = text2num(href_list["time"]) + last_process = world.timeofday + START_PROCESSING(SSobj, src) + else if(href_list["tp"]) + var/tp = text2num(href_list["tp"]) + time += tp + time = min(max(round(time), 0), 120) + + updateUsrDialog() + + add_fingerprint(usr) + else + usr << browse(null, "window=firealarm") + return + return + +/obj/machinery/firealarm/proc/reset() + if(!(working)) + return + var/area/area = get_area(src) + for(var/obj/machinery/firealarm/FA in area) + fire_alarm.clearAlarm(src.loc, FA) + update_icon() + return + +/obj/machinery/firealarm/proc/alarm(var/duration = 0) + if(!(working)) + return + var/area/area = get_area(src) + for(var/obj/machinery/firealarm/FA in area) + fire_alarm.triggerAlarm(loc, FA, duration, hidden = alarms_hidden) + update_icon() + playsound(src.loc, 'sound/machines/airalarm.ogg', 25, 0, 4) + return + +/obj/machinery/firealarm/proc/set_security_level(var/newlevel) + if(seclevel != newlevel) + seclevel = newlevel + update_icon() + +/* +FIRE ALARM CIRCUIT +Just a object used in constructing fire alarms + +/obj/item/weapon/firealarm_electronics + name = "fire alarm electronics" + icon = 'icons/obj/doors/door_assembly.dmi' + icon_state = "door_electronics" + desc = "A circuit. It has a label on it, it says \"Can handle heat levels up to 40 degrees celsius!\"" + w_class = ITEMSIZE_SMALL + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) +*/ +/obj/machinery/partyalarm + name = "\improper PARTY BUTTON" + desc = "Cuban Pete is in the house!" + icon = 'icons/obj/monitors.dmi' + icon_state = "fire0" + var/detecting = 1.0 + var/working = 1.0 + var/time = 10.0 + var/timing = 0.0 + var/lockdownbyai = 0 + anchored = 1.0 + use_power = 1 + idle_power_usage = 2 + active_power_usage = 6 + +/obj/machinery/partyalarm/attack_hand(mob/user as mob) + if(user.stat || stat & (NOPOWER|BROKEN)) + return + + user.machine = src + var/area/A = get_area(src) + ASSERT(isarea(A)) + var/d1 + var/d2 + if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) + + if(A.party) + d1 = text("No Party :(", src) + else + d1 = text("PARTY!!!", src) + if(timing) + d2 = text("Stop Time Lock", src) + else + d2 = text("Initiate Time Lock", src) + var/second = time % 60 + var/minute = (time - second) / 60 + var/dat = text("Party Button []\n
\nTimer System: []
\nTime Left: [][] - - + +\n
", d1, d2, (minute ? text("[]:", minute) : null), second, src, src, src, src) + user << browse(dat, "window=partyalarm") + onclose(user, "partyalarm") + else + if(A.fire) + d1 = text("[]", src, stars("No Party :(")) + else + d1 = text("[]", src, stars("PARTY!!!")) + if(timing) + d2 = text("[]", src, stars("Stop Time Lock")) + else + d2 = text("[]", src, stars("Initiate Time Lock")) + var/second = time % 60 + var/minute = (time - second) / 60 + var/dat = text("[] []\n
\nTimer System: []
\nTime Left: [][] - - + +\n
", stars("Party Button"), d1, d2, (minute ? text("[]:", minute) : null), second, src, src, src, src) + user << browse(dat, "window=partyalarm") + onclose(user, "partyalarm") + return + +/obj/machinery/partyalarm/proc/reset() + if(!(working)) + return + var/area/A = get_area(src) + ASSERT(isarea(A)) + A.partyreset() + return + +/obj/machinery/partyalarm/proc/alarm() + if(!(working)) + return + var/area/A = get_area(src) + ASSERT(isarea(A)) + A.partyalert() + return + +/obj/machinery/partyalarm/Topic(href, href_list) + ..() + if(usr.stat || stat & (BROKEN|NOPOWER)) + return + if((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) + usr.machine = src + if(href_list["reset"]) + reset() + else if(href_list["alarm"]) + alarm() + else if(href_list["time"]) + timing = text2num(href_list["time"]) + else if(href_list["tp"]) + var/tp = text2num(href_list["tp"]) + time += tp + time = min(max(round(time), 0), 120) + updateUsrDialog() + + add_fingerprint(usr) + else + usr << browse(null, "window=partyalarm") + return + return diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 169bc8c6d7..572977ceb4 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -11,7 +11,7 @@ var/strength = 10 //How weakened targets are when flashed. var/base_state = "mflash" anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 2 flags = PROXMOVE diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm index f02d3c2855..1af8382f98 100644 --- a/code/game/machinery/floor_light.dm +++ b/code/game/machinery/floor_light.dm @@ -7,7 +7,7 @@ var/list/floor_light_cache = list() desc = "A backlit floor panel." layer = TURF_LAYER+0.001 anchored = 0 - use_power = 2 + use_power = USE_POWER_ACTIVE idle_power_usage = 2 active_power_usage = 20 power_channel = LIGHT @@ -72,7 +72,7 @@ var/list/floor_light_cache = list() return on = !on - if(on) use_power = 2 + if(on) update_use_power(USE_POWER_ACTIVE) visible_message("\The [user] turns \the [src] [on ? "on" : "off"].") update_brightness() return @@ -81,21 +81,21 @@ var/list/floor_light_cache = list() ..() var/need_update if((!anchored || broken()) && on) - use_power = 0 + update_use_power(USE_POWER_OFF) on = 0 need_update = 1 else if(use_power && !on) - use_power = 0 + update_use_power(USE_POWER_OFF) need_update = 1 if(need_update) update_brightness() /obj/machinery/floor_light/proc/update_brightness() - if(on && use_power == 2) + if(on && use_power == USE_POWER_ACTIVE) if(light_range != default_light_range || light_power != default_light_power || light_color != default_light_colour) set_light(default_light_range, default_light_power, default_light_colour) else - use_power = 0 + update_use_power(USE_POWER_OFF) if(light_range || light_power) set_light(0) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index e17ed67bc2..efdf18695c 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -39,7 +39,7 @@ var/const/HOLOPAD_MODE = RANGE_BASED layer = ABOVE_TURF_LAYER var/power_per_hologram = 500 //per usage per hologram idle_power_usage = 5 - use_power = 1 + use_power = USE_POWER_IDLE var/list/mob/living/silicon/ai/masters = new() //List of AIs that use the holopad var/last_request = 0 //to prevent request spam. ~Carn var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating. @@ -183,7 +183,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/machinery/hologram anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 5 active_power_usage = 100 diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm index 9a656ac3be..7a3cd8c861 100644 --- a/code/game/machinery/holosign.dm +++ b/code/game/machinery/holosign.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/holosign.dmi' icon_state = "sign_off" plane = MOB_PLANE - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 2 active_power_usage = 4 anchored = 1 @@ -19,7 +19,7 @@ if(stat & (BROKEN|NOPOWER)) return lit = !lit - use_power = lit ? 2 : 1 + update_use_power(lit ? USE_POWER_ACTIVE : USE_POWER_IDLE) update_icon() /obj/machinery/holosign/update_icon() @@ -34,7 +34,7 @@ ..() if(stat & NOPOWER) lit = 0 - use_power = 0 + update_use_power(USE_POWER_OFF) update_icon() diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 5cb521d423..ee887db2f5 100755 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -6,7 +6,7 @@ var/id = null var/on = 1.0 anchored = 1.0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 2 active_power_usage = 4 @@ -53,7 +53,7 @@ var/last_spark = 0 var/base_state = "migniter" anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 2 active_power_usage = 4 diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index f2808dbc18..3a8554dae2 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -15,7 +15,7 @@ datum/track/New(var/title_name, var/audio) anchored = 1 density = 1 power_channel = EQUIP - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 10 active_power_usage = 100 circuit = /obj/item/weapon/circuitboard/jukebox @@ -249,7 +249,7 @@ datum/track/New(var/title_name, var/audio) main_area.forced_ambience = null playing = 0 - update_use_power(1) + update_use_power(USE_POWER_IDLE) update_icon() @@ -271,7 +271,7 @@ datum/track/New(var/title_name, var/audio) main_area.play_ambience(M) playing = 1 - update_use_power(2) + update_use_power(USE_POWER_ACTIVE) update_icon() // Advance to the next track - Don't start playing it unless we were already playing diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index f4b3d6f8f0..99d6d4c9e6 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -7,7 +7,7 @@ icon = 'icons/obj/power.dmi' icon_state = "light1" anchored = 1.0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 10 power_channel = LIGHT var/on = 1 @@ -15,19 +15,24 @@ var/otherarea = null var/image/overlay -/obj/machinery/light_switch/New() - ..() - spawn(5) - area = get_area(src) +/obj/machinery/light_switch/Initialize() + . = ..() - if(otherarea) - area = locate(text2path("/area/[otherarea]")) + area = get_area(src) - if(!name) - name = "light switch ([area.name])" + if(otherarea) + area = locate(text2path("/area/[otherarea]")) - on = area.lightswitch - updateicon() + if(!name) + name = "light switch ([area.name])" + + on = area.lightswitch + updateicon() + +/obj/machinery/light_switch/Destroy() + area = null + overlay = null + return ..() /obj/machinery/light_switch/proc/updateicon() if(!overlay) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 58d62b4cf9..a237ded44e 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -101,7 +101,7 @@ Class Procs: var/stat = 0 var/emagged = 0 - var/use_power = 1 + var/use_power = USE_POWER_IDLE //0 = dont run the auto //1 = run auto, use idle //2 = run auto, use active @@ -199,9 +199,9 @@ Class Procs: /obj/machinery/proc/auto_use_power() if(!powered(power_channel)) return 0 - if(use_power == 1) + if(use_power == USE_POWER_IDLE) use_power(idle_power_usage, power_channel, 1) - else if(use_power >= 2) + else if(use_power >= USE_POWER_ACTIVE) use_power(active_power_usage, power_channel, 1) return 1 @@ -268,7 +268,7 @@ Class Procs: /obj/machinery/proc/state(var/msg) for(var/mob/O in hearers(src, null)) - O.show_message("\icon[src] [msg]", 2) + O.show_message("[bicon(src)] [msg]", 2) /obj/machinery/proc/ping(text=null) if(!text) diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 9f97ab0360..9d36b08202 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -11,7 +11,7 @@ desc = "A device that uses station power to create points of magnetic energy." plane = PLATING_PLANE anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 50 var/freq = 1449 // radio frequency @@ -142,10 +142,10 @@ // Update power usage: if(on) - use_power = 2 + update_use_power(USE_POWER_ACTIVE) active_power_usage = electricity_level*15 else - use_power = 0 + update_use_power(USE_POWER_OFF) // Overload conditions: /* // Eeeehhh kinda stupid @@ -190,7 +190,7 @@ icon_state = "airlock_control_standby" density = 1 anchored = 1.0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 45 var/frequency = 1449 var/code = 0 diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index 1d13a36c3a..7c184c27de 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/stationobjs.dmi' icon_state = "mass_driver" anchored = 1.0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 2 active_power_usage = 50 circuit = /obj/item/weapon/circuitboard/mass_driver diff --git a/code/game/machinery/neonsign.dm b/code/game/machinery/neonsign.dm index fe5d5370a8..bdaa3b62fd 100644 --- a/code/game/machinery/neonsign.dm +++ b/code/game/machinery/neonsign.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/neonsigns.dmi' icon_state = "sign_off" plane = MOB_PLANE - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 2 active_power_usage = 4 anchored = 1 @@ -19,7 +19,7 @@ if(stat & (BROKEN|NOPOWER)) return lit = !lit - use_power = lit ? 2 : 1 + update_use_power(lit ? USE_POWER_ACTIVE : USE_POWER_IDLE) update_icon() /obj/machinery/neonsign/update_icon() @@ -34,7 +34,7 @@ ..() if(stat & NOPOWER) lit = 0 - use_power = 0 + update_use_power(USE_POWER_OFF) update_icon() diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index b8dcc43065..6d7b24e5cf 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -120,8 +120,7 @@ var/datum/feed_network/news_network = new /datum/feed_network //The global news-network, which is coincidentally a global list. -var/list/obj/machinery/newscaster/allCasters = list() //Global list that will contain reference to all newscasters in existence. - +GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) /obj/machinery/newscaster name = "newscaster" desc = "A standard newsfeed handler for use on commercial space stations. All the news you absolutely have no use for, in one place!" @@ -151,7 +150,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co var/securityCaster = 0 // 0 = Caster cannot be used to issue wanted posters // 1 = the opposite - var/unit_no = 0 //Each newscaster has a unit number + var/static/unit_no_cur = 0 //Each newscaster has a unit number + var/unit_no //var/datum/feed_message/wanted //We're gonna use a feed_message to store data of the wanted person because fields are similar //var/wanted_issue = 0 //OBSOLETE // 0 = there's no WANTED issued, we don't need a special icon_state @@ -176,19 +176,21 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co name = "Security Newscaster" securityCaster = 1 -/obj/machinery/newscaster/New() //Constructor, ho~ +/obj/machinery/newscaster/Initialize() + ..() //Not returning . because lateload below allCasters += src - paper_remaining = 15 // Will probably change this to something better - for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) // Let's give it an appropriate unit number - unit_no++ - update_icon() //for any custom ones on the map... - spawn(10) //Should be enough time for the node to spawn at tcomms. - node = get_exonet_node() - ..() //I just realised the newscasters weren't in the global machines list. The superconstructor call will tend to that + unit_no = ++unit_no_cur + paper_remaining = 15 + update_icon() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/newscaster/LateInitialize() + node = get_exonet_node() /obj/machinery/newscaster/Destroy() allCasters -= src - ..() + node = null + return ..() /obj/machinery/newscaster/update_icon() if(!ispowered || isbroken) @@ -325,11 +327,11 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(6) dat+="ERROR: Could not submit Feed story to Network.

" if(channel_name=="") - dat+="•Invalid receiving channel name.
" + dat+="•Invalid receiving channel name.
" if(scanned_user=="Unknown") - dat+="•Channel author unverified.
" + dat+="•Channel author unverified.
" if(msg == "" || msg == "\[REDACTED\]") - dat+="•Invalid message body.
" + dat+="•Invalid message body.
" dat+="
Return
" if(7) @@ -341,18 +343,18 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co else existing_authors += FC.author if(scanned_user in existing_authors) - dat+="•There already exists a Feed channel under your name.
" + dat+="•There already exists a Feed channel under your name.
" if(channel_name=="" || channel_name == "\[REDACTED\]") - dat+="•Invalid channel name.
" + dat+="•Invalid channel name.
" var/check = 0 for(var/datum/feed_channel/FC in news_network.network_channels) if(FC.channel_name == channel_name) check = 1 break if(check) - dat+="•Channel name already in use.
" + dat+="•Channel name already in use.
" if(scanned_user=="Unknown") - dat+="•Channel author unverified.
" + dat+="•Channel author unverified.
" dat+="
Return
" if(8) var/total_num=length(news_network.network_channels) @@ -466,11 +468,11 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(16) dat+="ERROR: Wanted Issue rejected by Network.

" if(channel_name=="" || channel_name == "\[REDACTED\]") - dat+="•Invalid name for person wanted.
" + dat+="•Invalid name for person wanted.
" if(scanned_user=="Unknown") - dat+="•Issue author unverified.
" + dat+="•Issue author unverified.
" if(msg == "" || msg == "\[REDACTED\]") - dat+="•Invalid description.
" + dat+="•Invalid description.
" dat+="
Return
" if(17) dat+="Wanted Issue successfully deleted from Circulation
" @@ -817,7 +819,7 @@ obj/item/weapon/newspaper/attack_self(mob/user as mob) switch(screen) if(0) //Cover dat+="
The Griffon
" - dat+="
[using_map.company_name]-standard newspaper, for use on [using_map.company_name]© Space Facilities

" + dat+="
[using_map.company_name]-standard newspaper, for use on [using_map.company_name]© Space Facilities

" if(isemptylist(news_content)) if(important_message) dat+="Contents:
" diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm index f32e57b9b1..8d6a55b3fd 100644 --- a/code/game/machinery/nuclear_bomb.dm +++ b/code/game/machinery/nuclear_bomb.dm @@ -23,7 +23,7 @@ var/bomb_set var/timing_wire var/removal_stage = 0 // 0 is no removal, 1 is covers removed, 2 is covers open, // 3 is sealant open, 4 is unwrenched, 5 is removed from bolts. - use_power = 0 + use_power = USE_POWER_OFF /obj/machinery/nuclearbomb/New() ..() diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index 4c67aa09a9..557f9169dd 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -138,7 +138,7 @@ var/icon/I = imap[1+(ix + icx*iy)*2] var/icon/I2 = imap[2+(ix + icx*iy)*2] - //to_world("icon: \icon[I]") + //to_world("icon: [bicon(I)]") I.DrawBox(colour, rx, ry, rx+1, ry+1) @@ -153,7 +153,7 @@ H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]" - //to_world("\icon[I] at [H.screen_loc]") + //to_world("[bicon(I)] at [H.screen_loc]") H.name = (i==0)?"maprefresh":"map" @@ -266,7 +266,7 @@ //to_world("trying [ix],[iy] : [ix+icx*iy]") var/icon/I = imap[1+(ix + icx*iy)] - //to_world("icon: \icon[I]") + //to_world("icon: [bicon(I)]") I.DrawBox(colour, rx, ry, rx, ry) @@ -279,7 +279,7 @@ H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]" - //to_world("\icon[I] at [H.screen_loc]") + //to_world("[bicon(I)] at [H.screen_loc]") H.name = (i==0)?"maprefresh":"map" diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index 7f2b310ed6..10c96a6b6a 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -73,7 +73,7 @@ if(breather.internals) breather.internals.icon_state = "internal0" breather = null - use_power = 1 + update_use_power(USE_POWER_IDLE) /obj/machinery/oxygen_pump/attack_ai(mob/user as mob) ui_interact(user) @@ -90,7 +90,7 @@ breather.internal = tank if(breather.internals) breather.internals.icon_state = "internal1" - use_power = 2 + update_use_power(USE_POWER_ACTIVE) /obj/machinery/oxygen_pump/proc/can_apply_to_target(var/mob/living/carbon/human/target, mob/user as mob) if(!user) @@ -162,7 +162,7 @@ contained.forceMove(src) src.visible_message("\The [contained] rapidly retracts back into \the [src]!") breather = null - use_power = 1 + update_use_power(USE_POWER_IDLE) else if(!breather.internal && tank) breather.internal = tank if(breather.internals) @@ -287,7 +287,7 @@ contained.forceMove(src) src.visible_message("\The [contained] rapidly retracts back into \the [src]!") breather = null - use_power = 1 + update_use_power(USE_POWER_IDLE) else if(!breather.internal && tank) breather.internal = tank if(breather.internals) diff --git a/code/game/machinery/pda_multicaster.dm b/code/game/machinery/pda_multicaster.dm index 3388de0c31..aab6a31ded 100644 --- a/code/game/machinery/pda_multicaster.dm +++ b/code/game/machinery/pda_multicaster.dm @@ -6,7 +6,7 @@ density = 1 anchored = 1 circuit = /obj/item/weapon/circuitboard/telecomms/pda_multicaster - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 750 var/on = 1 // If we're currently active, var/toggle = 1 // If we /should/ be active or not, diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 56fa5c75a0..b67f3738bd 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -701,8 +701,21 @@ var/list/targets = list() //list of primary targets var/list/secondarytargets = list() //targets that are least important + var/list/seenturfs = list() + for(var/turf/T in oview(world.view, src)) + seenturfs += T + + for(var/mob in living_mob_list) + var/mob/M = mob + if(M.z != z) //Skip + continue + if(get_turf(M) in seenturfs) + assess_and_assign(mob, targets, secondarytargets) + + /* This was dumb. Why do this and then check line of sight later? for(var/mob/M in mobs_in_xray_view(world.view, src)) assess_and_assign(M, targets, secondarytargets) + */ if(!tryToShootAt(targets)) if(!tryToShootAt(secondarytargets)) // if no valid targets, go for secondary targets @@ -1138,4 +1151,4 @@ #undef TURRET_PRIORITY_TARGET #undef TURRET_SECONDARY_TARGET -#undef TURRET_NOT_TARGET \ No newline at end of file +#undef TURRET_NOT_TARGET diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 92c28366fa..5349fc44b0 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/stationobjs.dmi' icon_state = "recharger0" anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 4 active_power_usage = 40000 //40 kW var/efficiency = 40000 //will provide the modified power rate when upgraded @@ -117,12 +117,12 @@ /obj/machinery/recharger/process() if(stat & (NOPOWER|BROKEN) || !anchored) - update_use_power(0) + update_use_power(USE_POWER_OFF) icon_state = icon_state_idle return if(!charging) - update_use_power(1) + update_use_power(USE_POWER_IDLE) icon_state = icon_state_idle else var/obj/item/weapon/cell/C = charging.get_cell() @@ -130,10 +130,10 @@ if(!C.fully_charged()) icon_state = icon_state_charging C.give(CELLRATE*efficiency) - update_use_power(2) + update_use_power(USE_POWER_ACTIVE) else icon_state = icon_state_charged - update_use_power(1) + update_use_power(USE_POWER_IDLE) /obj/machinery/recharger/emp_act(severity) if(stat & (NOPOWER|BROKEN) || !anchored) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index f702f3cf25..3f60e0ae07 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -6,7 +6,7 @@ density = 1 anchored = 1 circuit = /obj/item/weapon/circuitboard/recharge_station - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 50 var/mob/occupant = null var/obj/item/weapon/cell/cell = null @@ -78,9 +78,9 @@ if(!has_cell_power()) return 0 - if(use_power == 1) + if(use_power == USE_POWER_IDLE) cell.use(idle_power_usage * CELLRATE) - else if(use_power >= 2) + else if(use_power >= USE_POWER_ACTIVE) cell.use(active_power_usage * CELLRATE) return 1 diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index de4e8a4685..8ef925ed0f 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -176,7 +176,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() screen = RCS_SENTPASS message_log += "Message sent to [recipient]
[message]" else - audible_message(text("\icon[src] *The Requests Console beeps: 'NOTICE: No server detected!'"),,4) + audible_message(text("[bicon(src)] *The Requests Console beeps: 'NOTICE: No server detected!'"),,4) //Handle screen switching if(href_list["setScreen"]) diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm index 7c5f8cafa0..5bbb4ac6be 100644 --- a/code/game/machinery/robot_fabricator.dm +++ b/code/game/machinery/robot_fabricator.dm @@ -7,7 +7,7 @@ var/metal_amount = 0 var/operating = 0 var/obj/item/robot_parts/being_built = null - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 40 active_power_usage = 10000 @@ -115,7 +115,7 @@ Please wait until completion...
if(!isnull(building)) if(metal_amount >= build_cost) operating = 1 - update_use_power(2) + update_use_power(USE_POWER_ACTIVE) metal_amount = max(0, metal_amount - build_cost) @@ -128,7 +128,7 @@ Please wait until completion...
if(!isnull(being_built)) being_built.loc = get_turf(src) being_built = null - update_use_power(1) + update_use_power(USE_POWER_IDLE) operating = 0 overlays -= "fab-active" return diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index f5aa186190..2deb56b9a7 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -15,7 +15,7 @@ name = "status display" anchored = 1 density = 0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 10 circuit = /obj/item/weapon/circuitboard/status_display var/mode = 1 // 0 = Blank @@ -220,7 +220,7 @@ return "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]" /obj/machinery/status_display/proc/get_supply_shuttle_timer() - var/datum/shuttle/autodock/ferry/supply/shuttle = supply_controller.shuttle + var/datum/shuttle/autodock/ferry/supply/shuttle = SSsupply.shuttle if(!shuttle) return "Error" diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 13635326b0..d308565532 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -931,7 +931,7 @@ /obj/machinery/suit_cycler/proc/finished_job() var/turf/T = get_turf(src) - T.visible_message("\icon[src]The [src] beeps several times.") + T.visible_message("[bicon(src)]The [src] beeps several times.") icon_state = initial(icon_state) active = 0 playsound(src, 'sound/machines/boobeebeep.ogg', 50) diff --git a/code/game/machinery/supply_display.dm b/code/game/machinery/supply_display.dm index d0590cfa4e..28bed763f6 100644 --- a/code/game/machinery/supply_display.dm +++ b/code/game/machinery/supply_display.dm @@ -1,16 +1,23 @@ /obj/machinery/status_display/supply_display ignore_friendc = 1 + mode = STATUS_DISPLAY_CUSTOM /obj/machinery/status_display/supply_display/update() if(!..() && mode == STATUS_DISPLAY_CUSTOM) message1 = "CARGO" message2 = "" - var/datum/shuttle/autodock/ferry/supply/shuttle = supply_controller.shuttle + var/datum/shuttle/autodock/ferry/supply/shuttle = SSsupply.shuttle if(!shuttle) message2 = "Error" else if(shuttle.has_arrive_time()) - message2 = get_supply_shuttle_timer() + message2 = "[round(shuttle.eta_seconds() / 60)]:" + if((shuttle.eta_seconds() % 60) < 10) + message2 += "0" // Pad to two characters + message2 += "[shuttle.eta_seconds() % 60]" + + if(shuttle.eta_seconds() < 0) + message2 = "Late" if(length(message2) > CHARS_PER_LINE) message2 = "Error" else if(shuttle.is_launching()) @@ -22,7 +29,7 @@ if(shuttle.at_station()) message2 = "Docked" else - message1 = "" + message2 = "Away" update_display(message1, message2) return 1 return 0 diff --git a/code/game/machinery/supplybeacon.dm b/code/game/machinery/supplybeacon.dm index 9f228be5d4..df40ba1a7d 100644 --- a/code/game/machinery/supplybeacon.dm +++ b/code/game/machinery/supplybeacon.dm @@ -58,7 +58,7 @@ /obj/machinery/power/supply_beacon/attack_hand(var/mob/user) if(expended) - use_power = 0 + update_use_power(USE_POWER_OFF) to_chat (user, "\The [src] has used up its charge.") return @@ -80,7 +80,7 @@ return set_light(3, 3, "#00CCAA") icon_state = "beacon_active" - use_power = 1 + use_power = USE_POWER_IDLE if(user) to_chat(user, "You activate the beacon. The supply drop will be dispatched soon.") /obj/machinery/power/supply_beacon/proc/deactivate(var/mob/user, var/permanent) @@ -90,7 +90,7 @@ else icon_state = "beacon" set_light(0) - use_power = 0 + use_power = USE_POWER_OFF target_drop_time = null if(user) to_chat(user, "You deactivate the beacon.") diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 5eb18d6d2f..057a8fd5c1 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -17,7 +17,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept desc = "A dish-shaped machine used to broadcast processed subspace signals." density = 1 anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 25 machinetype = 5 produces_heat = 0 @@ -127,7 +127,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept desc = "A compact machine used for portable subspace telecommuniations processing." density = 1 anchored = 1 - use_power = 0 + use_power = USE_POWER_OFF idle_power_usage = 0 machinetype = 6 produces_heat = 0 @@ -348,7 +348,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept var/part_b_extra = "" if(data == 3) // intercepted radio message part_b_extra = " (Intercepted)" - var/part_a = "\icon[radio]\[[freq_text]\][part_b_extra] " // goes in the actual output + var/part_a = "[bicon(radio)]\[[freq_text]\][part_b_extra] " // goes in the actual output // --- Some more pre-message formatting --- var/part_b = " " // Tweaked for security headsets -- TLE @@ -547,7 +547,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept // Create a radio headset for the sole purpose of using its icon var/obj/item/device/radio/headset/radio = new - var/part_b = " \icon[radio]\[[freq_text]\][part_b_extra] " // Tweaked for security headsets -- TLE + var/part_b = " [bicon(radio)]\[[freq_text]\][part_b_extra] " // Tweaked for security headsets -- TLE var/part_blackbox_b = " \[[freq_text]\] " // Tweaked for security headsets -- TLE var/part_c = "" diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index d41104df25..3e3d89643a 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -105,7 +105,7 @@ dat += "" temp = "" - to_chat(user, browse(dat, "window=tcommachine;size=520x500;can_resize=0")) + user << browse(dat, "window=tcommachine;size=520x500;can_resize=0") onclose(user, "dormitory") diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 4ba184a102..c2e9126fc1 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -251,7 +251,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() desc = "This machine has a dish-like shape and green lights. It is designed to detect and process subspace radio activity." density = 1 anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 600 machinetype = 1 produces_heat = 0 @@ -318,7 +318,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() desc = "A mighty piece of hardware used to send/receive massive amounts of data." density = 1 anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 1600 machinetype = 7 circuit = /obj/item/weapon/circuitboard/telecomms/hub @@ -377,7 +377,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() desc = "A mighty piece of hardware used to send massive amounts of data far away." density = 1 anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 600 machinetype = 8 produces_heat = 0 @@ -443,7 +443,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() desc = "A mighty piece of hardware used to send massive amounts of data quickly." density = 1 anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 1000 machinetype = 2 circuit = /obj/item/weapon/circuitboard/telecomms/bus @@ -504,7 +504,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() desc = "This machine is used to process large quantities of information." density = 1 anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 600 machinetype = 3 delay = 5 @@ -556,7 +556,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() desc = "A machine used to store data and network statistics." density = 1 anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 300 machinetype = 4 circuit = /obj/item/weapon/circuitboard/telecomms/server diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index a0bdb5cd43..a58279098d 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -171,7 +171,7 @@ icon_state = "tele0" dir = 4 var/accurate = 0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 10 active_power_usage = 2000 circuit = /obj/item/weapon/circuitboard/teleporter_hub @@ -319,7 +319,7 @@ dir = 4 var/active = 0 var/engaged = 0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 10 active_power_usage = 2000 circuit = /obj/item/weapon/circuitboard/teleporter_station @@ -356,8 +356,8 @@ if(com) com.icon_state = "tele1" use_power(5000) - update_use_power(2) - com.update_use_power(2) + update_use_power(USE_POWER_ACTIVE) + com.update_use_power(USE_POWER_ACTIVE) for(var/mob/O in hearers(src, null)) O.show_message("Teleporter engaged!", 2) add_fingerprint(usr) @@ -371,8 +371,8 @@ if(com) com.icon_state = "tele0" com.accurate = 0 - com.update_use_power(1) - update_use_power(1) + com.update_use_power(USE_POWER_IDLE) + update_use_power(USE_POWER_IDLE) for(var/mob/O in hearers(src, null)) O.show_message("Teleporter disengaged!", 2) add_fingerprint(usr) diff --git a/code/game/machinery/transportpod.dm b/code/game/machinery/transportpod.dm index 96401c0908..0b499096fe 100644 --- a/code/game/machinery/transportpod.dm +++ b/code/game/machinery/transportpod.dm @@ -6,7 +6,7 @@ density = 1 //thicc anchored = 1 - use_power = 0 + use_power = USE_POWER_OFF var/in_transit = 0 var/mob/occupant = null diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 979c633ee9..c088b6e96a 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -10,11 +10,8 @@ density = 1 clicksound = "button" - var/icon_vend //Icon_state when vending - var/icon_deny //Icon_state when denying access - // Power - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 10 var/vend_power_usage = 150 //actuators and stuff @@ -73,20 +70,19 @@ /obj/machinery/vending/Initialize() . = ..() wires = new(src) - spawn(4) - if(product_slogans) - slogan_list += splittext(product_slogans, ";") + if(product_slogans) + slogan_list += splittext(product_slogans, ";") - // So not all machines speak at the exact same time. - // The first time this machine says something will be at slogantime + this random value, - // so if slogantime is 10 minutes, it will say it at somewhere between 10 and 20 minutes after the machine is crated. - last_slogan = world.time + rand(0, slogan_delay) + // So not all machines speak at the exact same time. + // The first time this machine says something will be at slogantime + this random value, + // so if slogantime is 10 minutes, it will say it at somewhere between 10 and 20 minutes after the machine is crated. + last_slogan = world.time + rand(0, slogan_delay) - if(product_ads) - ads_list += splittext(product_ads, ";") + if(product_ads) + ads_list += splittext(product_ads, ";") - build_inventory() - power_change() + build_inventory() + power_change() /** * Build produdct_records from the products lists @@ -181,9 +177,10 @@ panel_open = !panel_open to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") playsound(src, W.usesound, 50, 1) - overlays.Cut() if(panel_open) - overlays += image(icon, "[initial(icon_state)]-panel") + add_overlay("[initial(icon_state)]-panel") + else + cut_overlay("[initial(icon_state)]-panel") SSnanoui.update_uis(src) // Speaker switch is on the main UI, not wires UI return @@ -229,7 +226,7 @@ // This is not a status display message, since it's something the character // themselves is meant to see BEFORE putting the money in - to_chat(usr, "\icon[cashmoney] That is not enough money.") + to_chat(usr, "[bicon(cashmoney)] That is not enough money.") return 0 if(istype(cashmoney, /obj/item/weapon/spacecash)) @@ -431,7 +428,7 @@ if((href_list["vend"]) && (vend_ready) && (!currently_vending)) if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH to_chat(usr, "Access denied.") //Unless emagged of course - flick(icon_deny,src) + flick("[icon_state]-deny",src) playsound(src.loc, 'sound/machines/deniedbeep.ogg', 50, 0) return @@ -468,7 +465,7 @@ /obj/machinery/vending/proc/vend(datum/stored_item/vending_product/R, mob/user) if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH to_chat(usr, "Access denied.") //Unless emagged of course - flick(icon_deny,src) + flick("[icon_state]-deny",src) playsound(src.loc, 'sound/machines/deniedbeep.ogg', 50, 0) return vend_ready = 0 //One thing at a time!! @@ -499,8 +496,7 @@ last_reply = world.time use_power(vend_power_usage) //actuators and stuff - if(icon_vend) //Show the vending animation if needed - flick(icon_vend,src) + flick("[icon_state]-vend",src) spawn(vend_delay) R.get_product(get_turf(src)) if(has_logs) @@ -678,8 +674,7 @@ /obj/machinery/vending/boozeomat name = "Booze-O-Mat" desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one." - icon_state = "boozeomat" - icon_deny = "boozeomat-deny" + icon_state = "fridge_dark" products = list(/obj/item/weapon/reagent_containers/food/drinks/glass2/square = 10, /obj/item/weapon/reagent_containers/food/drinks/glass2/rocks = 10, /obj/item/weapon/reagent_containers/food/drinks/glass2/shake = 10, @@ -752,7 +747,6 @@ desc = "A vending machine which dispenses hot drinks." product_ads = "Have a drink!;Drink up!;It's good for you!;Would you like a hot joe?;I'd kill for some coffee!;The best beans in the galaxy.;Only the finest brew for you.;Mmmm. Nothing like a coffee.;I like coffee, don't you?;Coffee helps you work!;Try some tea.;We hope you like the best!;Try our new chocolate!;Admin conspiracies" icon_state = "coffee" - icon_vend = "coffee-vend" vend_delay = 34 idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. vend_power_usage = 85000 //85 kJ to heat a 250 mL cup of coffee @@ -778,7 +772,7 @@ /obj/machinery/vending/cola name = "Robust Softdrinks" desc = "A softdrink vendor provided by Robust Industries, LLC." - icon_state = "soda-blu" + icon_state = "Cola_Machine" product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!" product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space." products = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind = 10, @@ -826,7 +820,6 @@ desc = "Cartridges for PDAs." product_slogans = "Carts to go!" icon_state = "cart" - icon_deny = "cart-deny" req_access = list(access_hop) products = list(/obj/item/weapon/cartridge/medical = 10,/obj/item/weapon/cartridge/engineering = 10,/obj/item/weapon/cartridge/security = 10, /obj/item/weapon/cartridge/janitor = 10,/obj/item/weapon/cartridge/signal/science = 10,/obj/item/device/pda/heads = 10, @@ -893,7 +886,6 @@ name = "NanoMed Plus" desc = "Medical drug dispenser." icon_state = "med" - icon_deny = "med-deny" product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!" req_access = list(access_medical) products = list(/obj/item/weapon/reagent_containers/glass/bottle/antitoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline = 4, @@ -921,7 +913,6 @@ desc = "A wall-mounted version of the NanoMed." product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?" icon_state = "wallmed" - icon_deny = "wallmed-deny" density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude products = list(/obj/item/stack/medical/bruise_pack = 2,/obj/item/stack/medical/ointment = 2,/obj/item/weapon/reagent_containers/hypospray/autoinjector = 4,/obj/item/device/healthanalyzer = 1) contraband = list(/obj/item/weapon/reagent_containers/syringe/antitoxin = 4,/obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/pill/tox = 1) @@ -932,7 +923,6 @@ name = "NanoMed" desc = "A wall-mounted version of the NanoMed, containing only vital first aid equipment." icon_state = "wallmed" - icon_deny = "wallmed-deny" density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude products = list(/obj/item/weapon/reagent_containers/hypospray/autoinjector = 5,/obj/item/weapon/reagent_containers/syringe/antitoxin = 3,/obj/item/stack/medical/bruise_pack = 3, /obj/item/stack/medical/ointment =3,/obj/item/device/healthanalyzer = 3) @@ -945,7 +935,6 @@ desc = "A security equipment vendor." product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?" icon_state = "sec" - icon_deny = "sec-deny" req_access = list(access_security) products = list(/obj/item/weapon/handcuffs = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/flash = 5, /obj/item/weapon/reagent_containers/food/snacks/donut/normal = 12,/obj/item/weapon/storage/box/evidence = 6) @@ -958,8 +947,7 @@ desc = "A plant nutrients vendor." product_slogans = "Aren't you glad you don't have to fertilize the natural way?;Now with 50% less stink!;Plants are people too!" product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..." - icon_state = "nutri" - icon_deny = "nutri-deny" + icon_state = "nutri_generic" products = list(/obj/item/weapon/reagent_containers/glass/bottle/eznutrient = 6,/obj/item/weapon/reagent_containers/glass/bottle/left4zed = 4,/obj/item/weapon/reagent_containers/glass/bottle/robustharvest = 3,/obj/item/weapon/plantspray/pests = 20, /obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4,/obj/item/weapon/storage/bag/plants = 5) premium = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5) @@ -970,7 +958,7 @@ desc = "When you need seeds fast!" product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!" product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!" - icon_state = "seeds" + icon_state = "seeds_generic" products = list(/obj/item/seeds/bananaseed = 3,/obj/item/seeds/berryseed = 3,/obj/item/seeds/carrotseed = 3,/obj/item/seeds/chantermycelium = 3,/obj/item/seeds/chiliseed = 3, /obj/item/seeds/cornseed = 3, /obj/item/seeds/eggplantseed = 3, /obj/item/seeds/potatoseed = 3, /obj/item/seeds/replicapod = 3,/obj/item/seeds/soyaseed = 3, @@ -1062,7 +1050,6 @@ name = "YouTool" desc = "Tools for tools." icon_state = "tool" - icon_deny = "tool-deny" //req_access = list(access_maint_tunnels) //Maintenance access products = list(/obj/item/stack/cable_coil/random = 10,/obj/item/weapon/tool/crowbar = 5,/obj/item/weapon/weldingtool = 3,/obj/item/weapon/tool/wirecutters = 5, /obj/item/weapon/tool/wrench = 5,/obj/item/device/analyzer = 5,/obj/item/device/t_scanner = 5,/obj/item/weapon/tool/screwdriver = 5, @@ -1077,7 +1064,6 @@ name = "Engi-Vend" desc = "Spare tool vending. What? Did you expect some witty description?" icon_state = "engivend" - icon_deny = "engivend-deny" req_access = list(access_engine_equip) products = list(/obj/item/device/geiger = 4,/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/cell/high = 10, /obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/module/power_control = 10, @@ -1100,7 +1086,6 @@ name = "Robco Tool Maker" desc = "Everything you need for do-it-yourself station repair." icon_state = "engi" - icon_deny = "engi-deny" req_access = list(access_engine_equip) products = list(/obj/item/clothing/under/rank/chief_engineer = 4,/obj/item/clothing/under/rank/engineer = 4,/obj/item/clothing/shoes/orange = 4,/obj/item/clothing/head/hardhat = 4, /obj/item/weapon/storage/belt/utility = 4,/obj/item/clothing/glasses/meson = 4,/obj/item/clothing/gloves/yellow = 4, /obj/item/weapon/tool/screwdriver = 12, @@ -1118,7 +1103,6 @@ name = "Robotech Deluxe" desc = "All the tools you need to create your own robot army." icon_state = "robotics" - icon_deny = "robotics-deny" req_access = list(access_robotics) products = list(/obj/item/clothing/suit/storage/toggle/labcoat = 4,/obj/item/clothing/under/rank/roboticist = 4,/obj/item/stack/cable_coil = 4,/obj/item/device/flash = 4, /obj/item/weapon/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3,/obj/item/device/assembly/signaler = 3,/obj/item/device/healthanalyzer = 3, diff --git a/code/game/machinery/virtual_reality/ar_console.dm b/code/game/machinery/virtual_reality/ar_console.dm index 1f4c8c16fe..f4c6049487 100644 --- a/code/game/machinery/virtual_reality/ar_console.dm +++ b/code/game/machinery/virtual_reality/ar_console.dm @@ -73,7 +73,7 @@ if(A in component_parts) continue A.loc = src.loc - update_use_power(1) + update_use_power(USE_POWER_IDLE) update_icon() /obj/machinery/vr_sleeper/alien/enter_vr() diff --git a/code/game/machinery/virtual_reality/vr_console.dm b/code/game/machinery/virtual_reality/vr_console.dm index dcd6e555b9..8a417a98bc 100644 --- a/code/game/machinery/virtual_reality/vr_console.dm +++ b/code/game/machinery/virtual_reality/vr_console.dm @@ -18,7 +18,7 @@ var/mirror_first_occupant = TRUE // Do we force the newly produced body to look like the occupant? - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 15 active_power_usage = 200 light_color = "#FF0000" @@ -174,7 +174,7 @@ M.client.perspective = EYE_PERSPECTIVE M.client.eye = src M.loc = src - update_use_power(2) + update_use_power(USE_POWER_ACTIVE) occupant = M update_icon() @@ -203,7 +203,7 @@ if(A in component_parts) continue A.loc = src.loc - update_use_power(1) + update_use_power(USE_POWER_IDLE) update_icon() /obj/machinery/vr_sleeper/proc/enter_vr() diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index a3911a2efa..81c720bacd 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -3,7 +3,7 @@ desc = "You're not so sure about this, anymore..." icon = 'icons/obj/device.dmi' icon_state = "syndbeacon" - use_power = 0 + use_power = USE_POWER_OFF anchored = 1 density = 1 var/charges = 1 diff --git a/code/game/mecha/combat/fighter.dm b/code/game/mecha/combat/fighter.dm new file mode 100644 index 0000000000..abada3f283 --- /dev/null +++ b/code/game/mecha/combat/fighter.dm @@ -0,0 +1,381 @@ +#define NOGRAV_FIGHTER_DAMAGE 20 + +/obj/mecha/combat/fighter + name = "Delete me, nerd!!" + desc = "The base type of fightercraft. Don't spawn this one!" + + var/datum/effect/effect/system/ion_trail_follow/ion_trail + var/stabilization_enabled = TRUE //If our anti-space-drift is on + var/ground_capable = FALSE //If we can fly over normal turfs and not just space + + icon = 'icons/mecha/fighters64x64.dmi' + + icon_state = "" + initial_icon = "" + + step_in = 2 //Fast + + health = 400 + maxhealth = 400 + + infra_luminosity = 6 + + opacity = FALSE + + wreckage = /obj/effect/decal/mecha_wreckage/gunpod + + stomp_sound = 'sound/machines/generator/generator_end.ogg' + swivel_sound = 'sound/machines/hiss.ogg' + + bound_height = 64 + bound_width = 64 + + max_hull_equip = 2 + max_weapon_equip = 2 + max_utility_equip = 1 + max_universal_equip = 1 + max_special_equip = 1 + +/obj/mecha/combat/fighter/Initialize() + . = ..() + ion_trail = new /datum/effect/effect/system/ion_trail_follow() + ion_trail.set_up(src) + ion_trail.stop() + +/obj/mecha/combat/fighter/moved_inside(var/mob/living/carbon/human/H) + . = ..() + consider_gravity() + +/obj/mecha/combat/fighter/go_out() + . = ..() + consider_gravity() + +//Modified phazon code +/obj/mecha/combat/fighter/Topic(href, href_list) + ..() + if (href_list["toggle_stabilization"]) + stabilization_enabled = !stabilization_enabled + send_byjax(src.occupant,"exosuit.browser","stabilization_command","[stabilization_enabled?"Dis":"En"]able thruster stabilization") + src.occupant_message("Thruster stabilization [stabilization_enabled? "enabled" : "disabled"].") + return + +/obj/mecha/combat/fighter/get_commands() + var/output = {" + "} + output += ..() + return output + +/obj/mecha/combat/fighter/can_ztravel() + return (stabilization_enabled && has_charge(step_energy_drain)) + +// No space drifting +/obj/mecha/combat/fighter/check_for_support() + if (stabilization_enabled) + return 1 + + return ..() + +// No falling if we've got our boosters on +/obj/mecha/combat/fighter/can_fall() + return (stabilization_enabled && has_charge(step_energy_drain)) + +/obj/mecha/combat/fighter/proc/consider_gravity(var/moved = FALSE) + var/gravity = has_gravity() + if(gravity && ground_capable && occupant) + start_hover() + else if((!gravity && ground_capable) || !occupant) + stop_hover() + else if(moved && gravity && !ground_capable) + occupant_message("Collision alert! Vehicle not rated for use in gravity!") + take_damage(NOGRAV_FIGHTER_DAMAGE, "brute") + playsound(loc, 'sound/effects/grillehit.ogg', 50, 1) + +/obj/mecha/combat/fighter/handle_equipment_movement() + . = ..() + consider_gravity(TRUE) + +/obj/mecha/combat/fighter/proc/start_hover() + if(!ion_trail.on) //We'll just use this to store if we're floating or not + ion_trail.start() + var/amplitude = 2 //maximum displacement from original position + var/period = 36 //time taken for the mob to go up >> down >> original position, in deciseconds. Should be multiple of 4 + + var/top = old_y + amplitude + var/bottom = old_y - amplitude + var/half_period = period / 2 + var/quarter_period = period / 4 + + animate(src, pixel_y = top, time = quarter_period, easing = SINE_EASING | EASE_OUT, loop = -1) //up + animate(pixel_y = bottom, time = half_period, easing = SINE_EASING, loop = -1) //down + animate(pixel_y = old_y, time = quarter_period, easing = SINE_EASING | EASE_IN, loop = -1) //back + +/obj/mecha/combat/fighter/proc/stop_hover() + if(ion_trail.on) + ion_trail.stop() + animate(src, pixel_y = old_y, time = 5, easing = SINE_EASING | EASE_IN) //halt animation + +/obj/mecha/combat/fighter/check_for_support() + if (has_charge(step_energy_drain) && stabilization_enabled) + return 1 + + var/list/things = orange(1, src) + + if(locate(/obj/structure/grille) in things || locate(/obj/structure/lattice) in things || locate(/turf/simulated) in things || locate(/turf/unsimulated) in things) + return 1 + else + return 0 + + +/obj/mecha/combat/fighter/play_entered_noise(var/mob/who) + if(hasInternalDamage()) + who << sound('sound/mecha/fighter_entered_bad.ogg',volume=50) + else + who << sound('sound/mecha/fighter_entered.ogg',volume=50) + +////////////// Equipment ////////////// + +// For 64x64 fighters +/obj/item/mecha_parts/mecha_equipment/omni_shield/fighter64 + shield_type = /obj/item/shield_projector/rectangle/mecha/fighter64 +/obj/item/shield_projector/rectangle/mecha/fighter64 + shift_x = 16 + shift_y = 16 + + +////////////// Gunpod ////////////// + +/obj/mecha/combat/fighter/gunpod + name = "Gunpod" + desc = "Small mounted weapons platform capable of space and surface combat. More like a flying tank than a dedicated fightercraft." + icon = 'icons/mecha/fighters64x64.dmi' + icon_state = "gunpod" + initial_icon = "gunpod" + + catalogue_data = list(/datum/category_item/catalogue/technology/gunpod) + wreckage = /obj/effect/decal/mecha_wreckage/gunpod + + step_in = 3 //Slightly slower than others + + ground_capable = TRUE + + // Paint colors! Null if not set. + var/stripe1_color + var/stripe2_color + var/image/stripe1_overlay + var/image/stripe2_overlay + +/obj/mecha/combat/fighter/gunpod/loaded/Initialize() //Loaded version with gans + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive + ME.attach(src) + +/obj/mecha/combat/fighter/gunpod/recon/Initialize() //Blinky + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/teleporter(src) + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) + ME.attach(src) + +/obj/mecha/combat/fighter/gunpod/update_icon() + cut_overlays() + ..() + + if(stripe1_color) + stripe1_overlay = image("gunpod_stripes1") + stripe1_overlay.color = stripe1_color + add_overlay(stripe1_overlay) + if(stripe2_color) + stripe2_overlay = image("gunpod_stripes2") + stripe2_overlay.color = stripe2_color + add_overlay(stripe2_overlay) + +/obj/mecha/combat/fighter/gunpod/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W,/obj/item/device/multitool) && state == 1) + var/new_paint_location = input("Please select a target zone.", "Paint Zone", null) as null|anything in list("Fore Stripe", "Aft Stripe", "CANCEL") + if(new_paint_location && new_paint_location != "CANCEL") + var/new_paint_color = input("Please select a paint color.", "Paint Color", null) as color|null + if(new_paint_color) + switch(new_paint_location) + if("Fore Stripe") + stripe1_color = new_paint_color + if("Aft Stripe") + stripe2_color = new_paint_color + + update_icon() + else ..() + +/obj/effect/decal/mecha_wreckage/gunpod + name = "Gunpod wreckage" + desc = "Remains of some unfortunate gunpod. Completely unrepairable." + icon = 'icons/mecha/fighters64x64.dmi' + icon_state = "gunpod-broken" + bound_width = 64 + bound_height = 64 + +/datum/category_item/catalogue/technology/gunpod + name = "Voidcraft - Gunpod" + desc = "This is a small space-capable fightercraft that has an arrowhead design. Can hold up to one pilot, \ + and sometimes one or two passengers, with the right modifications made. \ + Typically used as small fighter craft, the gunpod can't carry much of a payload, though it's still capable of holding it's own." + value = CATALOGUER_REWARD_MEDIUM + + +////////////// Baron ////////////// + +/obj/mecha/combat/fighter/baron + name = "Baron" + desc = "A conventional space superiority fighter, one-seater. Not capable of ground operations." + icon = 'icons/mecha/fighters64x64.dmi' + icon_state = "baron" + initial_icon = "baron" + + catalogue_data = list(/datum/category_item/catalogue/technology/baron) + wreckage = /obj/effect/decal/mecha_wreckage/baron + + ground_capable = FALSE + +/obj/mecha/combat/fighter/baron/loaded/Initialize() //Loaded version with gans + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/omni_shield/fighter64 + ME.attach(src) + +/obj/effect/decal/mecha_wreckage/baron + name = "Baron wreckage" + desc = "Remains of some unfortunate fighter. Completely unrepairable." + icon = 'icons/mecha/fighters64x64.dmi' + icon_state = "baron-broken" + bound_width = 64 + bound_height = 64 + +/datum/category_item/catalogue/technology/baron + name = "Voidcraft - Baron" + desc = "This is a small space fightercraft that has an arrowhead design. Can hold up to one pilot. \ + Unlike some fighters, this one is not designed for atmospheric operation, and is only capable of performing \ + maneuvers in the vacuum of space. Attempting to operate it in an atmosphere is not recommended." + value = CATALOGUER_REWARD_MEDIUM + + +////////////// Scoralis ////////////// + +/obj/mecha/combat/fighter/scoralis + name = "scoralis" + desc = "An imported space fighter with integral cloaking device. Beware the power consumption, though. Not capable of ground operations." + icon = 'icons/mecha/fighters64x64.dmi' + icon_state = "scoralis" + initial_icon = "scoralis" + + catalogue_data = list(/datum/category_item/catalogue/technology/scoralis) + wreckage = /obj/effect/decal/mecha_wreckage/scoralis + + ground_capable = FALSE + +/obj/mecha/combat/fighter/scoralis/loaded/Initialize() //Loaded version with gans + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/cloak + ME.attach(src) + +/obj/effect/decal/mecha_wreckage/scoralis + name = "scoralis wreckage" + desc = "Remains of some unfortunate fighter. Completely unrepairable." + icon = 'icons/mecha/fighters64x64.dmi' + icon_state = "scoralis-broken" + bound_width = 64 + bound_height = 64 + +/datum/category_item/catalogue/technology/scoralis + name = "Voidcraft - Scoralis" + desc = "An import model fightercraft, this one contains an integral cloaking device that renders the fighter invisible \ + to the naked eye. Still detectable on thermal sensors, the craft can maneuver in close to ill-equipped foes and strike unseen. \ + Not rated for atmospheric travel, this craft excels at hit and run tactics, as it will likely need to recharge batteries between each 'hit'." + value = CATALOGUER_REWARD_MEDIUM + +////////////// Allure ////////////// + +/obj/mecha/combat/fighter/allure + name = "allure" + desc = "A fighter of Zorren design, it's blocky appearance is made up for by it's stout armor and finely decorated hull paint." + icon = 'icons/mecha/fighters64x64.dmi' + icon_state = "allure" + initial_icon = "allure" + + catalogue_data = list(/datum/category_item/catalogue/technology/allure) + wreckage = /obj/effect/decal/mecha_wreckage/allure + + ground_capable = FALSE + + health = 500 + maxhealth = 500 + +/obj/mecha/combat/fighter/allure/loaded/Initialize() //Loaded version with gans + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/cloak + ME.attach(src) + +/obj/effect/decal/mecha_wreckage/allure + name = "allure wreckage" + desc = "Remains of some unfortunate fighter. Completely unrepairable." + icon = 'icons/mecha/fighters64x64.dmi' + icon_state = "allure-broken" + bound_width = 64 + bound_height = 64 + +/datum/category_item/catalogue/technology/allure + name = "Voidcraft - Allure" + desc = "A space superiority fighter of zorren design, many would comment that the blocky shape hinders aesthetic appeal. However, Zorren are \ + often found painting their hulls in intricate designs of purple and gold, and this craft is no exception to the rule. Some individual seems to have \ + decorated it finely. Import craft like this one often ship with no weapons, though the Zorren saw fit to integrate a cloaking device." + value = CATALOGUER_REWARD_MEDIUM + +////////////// Pinnace ////////////// + +/obj/mecha/combat/fighter/pinnace + name = "pinnace" + desc = "A cramped ship's boat, capable of atmospheric and space flight. Not capable of mounting weapons. Capable of fitting one pilot and one passenger." + icon = 'icons/mecha/fighters64x64.dmi' + icon_state = "pinnace" + initial_icon = "pinnace" + + max_hull_equip = 1 + max_weapon_equip = 0 + max_utility_equip = 0 + max_universal_equip = 0 + max_special_equip = 1 + + catalogue_data = list(/datum/category_item/catalogue/technology/pinnace) + wreckage = /obj/effect/decal/mecha_wreckage/pinnace + + ground_capable = TRUE + +/obj/mecha/combat/fighter/pinnace/loaded/Initialize() //Loaded version with gans + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/passenger + ME.attach(src) + +/obj/effect/decal/mecha_wreckage/pinnace + name = "pinnace wreckage" + desc = "Remains of some unfortunate ship's boat. Completely unrepairable." + icon = 'icons/mecha/fighters64x64.dmi' + icon_state = "pinnace-broken" + bound_width = 64 + bound_height = 64 + +/datum/category_item/catalogue/technology/pinnace + name = "Voidcraft - Pinnace" + desc = "A very small boat, usually used as a tender at very close ranges. The lack of a bluespace \ + drive means that it can't get too far from it's parent ship. Though the pinnace is typically unarmed, \ + it is capable of atmospheric flight and escaping most pursuing fighters by diving into the atmosphere of \ + nearby planets to seek cover." + value = CATALOGUER_REWARD_MEDIUM + +#undef NOGRAV_FIGHTER_DAMAGE \ No newline at end of file diff --git a/code/game/mecha/combat/gorilla.dm b/code/game/mecha/combat/gorilla.dm index a33cd963e2..e413fc892a 100644 --- a/code/game/mecha/combat/gorilla.dm +++ b/code/game/mecha/combat/gorilla.dm @@ -178,10 +178,10 @@ src.log_message("Toggled zoom mode.") src.occupant_message("Zoom mode [zoom?"en":"dis"]abled.") if(zoom) - src.occupant.client.view = 12 + src.occupant.set_viewsize(12) playsound(src.occupant, 'sound/mecha/imag_enh.ogg',50) else - src.occupant.client.view = world.view//world.view - default mob view size + src.occupant.set_viewsize() // Reset to default return diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 8b2471d953..2b383379ad 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -180,10 +180,10 @@ src.log_message("Toggled zoom mode.") src.occupant_message("Zoom mode [zoom?"en":"dis"]abled.") if(zoom) - src.occupant.client.view = 12 + src.occupant.set_viewsize(12) src.occupant << sound('sound/mecha/imag_enh.ogg',volume=50) else - src.occupant.client.view = world.view//world.view - default mob view size + src.occupant.set_viewsize() // Reset to default return diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index abf0a15446..d5d1d9d7de 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -231,7 +231,7 @@ /obj/item/mecha_parts/mecha_equipment/proc/occupant_message(message) if(chassis) - chassis.occupant_message("\icon[src] [message]") + chassis.occupant_message("[bicon(src)] [message]") return /obj/item/mecha_parts/mecha_equipment/proc/log_message(message) diff --git a/code/game/mecha/equipment/tools/cloak.dm b/code/game/mecha/equipment/tools/cloak.dm new file mode 100644 index 0000000000..6f6ddd1c8f --- /dev/null +++ b/code/game/mecha/equipment/tools/cloak.dm @@ -0,0 +1,70 @@ +/obj/item/mecha_parts/mecha_equipment/cloak + name = "cloaking device" + desc = "Integrated cloaking system. High power usage, but does render you invisible to the naked eye. Doesn't prevent noise, however." + icon_state = "tesla" + origin_tech = list(TECH_MAGNET = 5, TECH_DATA = 5) + equip_cooldown = 2 SECONDS + energy_drain = 300 + range = 0 + + equip_type = EQUIP_SPECIAL + + var/datum/global_iterator/mecha_cloak/cloak_iterator + +/obj/item/mecha_parts/mecha_equipment/cloak/Initialize() + . = ..() + cloak_iterator = new /datum/global_iterator/mecha_cloak(list(src),0) + cloak_iterator.set_delay(equip_cooldown) + +/obj/item/mecha_parts/mecha_equipment/cloak/Destroy() + qdel_null(cloak_iterator) + return ..() + +/obj/item/mecha_parts/mecha_equipment/cloak/detach() + qdel_null(cloak_iterator) + if(!equip_ready) //We were running + stop_cloak() + return ..() + +/obj/item/mecha_parts/mecha_equipment/cloak/get_equip_info() + if(!chassis) + return + return "* [src.name] - [equip_ready ? "A" : "Dea"]ctivate" + +/obj/item/mecha_parts/mecha_equipment/cloak/Topic(href, href_list) + ..() + if(href_list["toggle_cloak"]) + if(equip_ready) + start_cloak() + else + stop_cloak() + return + +/obj/item/mecha_parts/mecha_equipment/cloak/proc/start_cloak() + if(chassis) + chassis.cloak() + log_message("Activated.") + cloak_iterator.start() + set_ready_state(0) + playsound(get_turf(src), 'sound/effects/EMPulse.ogg', 100, 1) + +/obj/item/mecha_parts/mecha_equipment/cloak/proc/stop_cloak() + if(chassis) + chassis.uncloak() + log_message("Deactivated.") + cloak_iterator.stop() + set_ready_state(1) + playsound(get_turf(src), 'sound/effects/EMPulse.ogg', 100, 1) + +// These things are so silly +/datum/global_iterator/mecha_cloak/process(var/obj/item/mecha_parts/mecha_equipment/cloak/cloak) + //Removed from chassis + if(!cloak.chassis) + stop() + cloak.stop_cloak() + return + //Ran out of power + if(!cloak.chassis.use_power(cloak.energy_drain)) + stop() + cloak.stop_cloak() + return diff --git a/code/game/mecha/equipment/tools/repair_droid.dm b/code/game/mecha/equipment/tools/repair_droid.dm index f76eeed6f0..f4f9696aa5 100644 --- a/code/game/mecha/equipment/tools/repair_droid.dm +++ b/code/game/mecha/equipment/tools/repair_droid.dm @@ -27,16 +27,16 @@ /obj/item/mecha_parts/mecha_equipment/repair_droid/attach(obj/mecha/M as obj) ..() droid_overlay = new(src.icon, icon_state = "repair_droid") - M.overlays += droid_overlay + M.add_overlay(droid_overlay) return /obj/item/mecha_parts/mecha_equipment/repair_droid/destroy() - chassis.overlays -= droid_overlay + chassis.cut_overlay(droid_overlay) ..() return /obj/item/mecha_parts/mecha_equipment/repair_droid/detach() - chassis.overlays -= droid_overlay + chassis.cut_overlay(droid_overlay) pr_repair_droid.stop() ..() return @@ -49,7 +49,7 @@ /obj/item/mecha_parts/mecha_equipment/repair_droid/Topic(href, href_list) ..() if(href_list["toggle_repairs"]) - chassis.overlays -= droid_overlay + chassis.cut_overlay(droid_overlay) if(pr_repair_droid.toggle()) droid_overlay = new(src.icon, icon_state = "repair_droid_a") log_message("Activated.") @@ -57,7 +57,7 @@ droid_overlay = new(src.icon, icon_state = "repair_droid") log_message("Deactivated.") set_ready_state(1) - chassis.overlays += droid_overlay + chassis.add_overlay(droid_overlay) send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info()) return diff --git a/code/game/mecha/equipment/tools/shield_omni.dm b/code/game/mecha/equipment/tools/shield_omni.dm new file mode 100644 index 0000000000..8088cf296a --- /dev/null +++ b/code/game/mecha/equipment/tools/shield_omni.dm @@ -0,0 +1,97 @@ +#define OMNI_SHIELD_DRAIN 30 + +/obj/item/mecha_parts/mecha_equipment/omni_shield + name = "omni shield" + desc = "A shield generator that forms an ennlosing, omnidirectional shield around the exosuit." + icon_state = "shield" + origin_tech = list(TECH_PHORON = 3, TECH_MAGNET = 6, TECH_ILLEGAL = 4) + equip_cooldown = 5 + energy_drain = OMNI_SHIELD_DRAIN + range = 0 + + var/obj/item/shield_projector/shields = null + var/shield_type = /obj/item/shield_projector/rectangle/mecha + + equip_type = EQUIP_HULL + +/obj/item/mecha_parts/mecha_equipment/omni_shield/critfail() + ..() + shields.adjust_health(-200) + +/obj/item/mecha_parts/mecha_equipment/omni_shield/Destroy() + QDEL_NULL(shields) + ..() + +/obj/item/mecha_parts/mecha_equipment/omni_shield/attach(obj/mecha/M as obj) + . = ..() + if(chassis) + shields = new shield_type(chassis) + +/obj/item/mecha_parts/mecha_equipment/omni_shield/detach() + if(chassis) + QDEL_NULL(shields) + . = ..() + +/obj/item/mecha_parts/mecha_equipment/omni_shield/handle_movement_action() + if(chassis && shields) + shields.update_shield_positions() + +/obj/item/mecha_parts/mecha_equipment/omni_shield/proc/toggle_shield() + ..() + if(shields) + shields.set_on(!shields.active) + if(shields.active) + set_ready_state(0) + log_message("Activated.") + else + set_ready_state(1) + log_message("Deactivated.") + +/obj/item/mecha_parts/mecha_equipment/omni_shield/Topic(href, href_list) + ..() + if(href_list["toggle_omnishield"]) + toggle_shield() + +/obj/item/mecha_parts/mecha_equipment/omni_shield/get_equip_info() + if(!chassis) return + return "* [src.name] - [shields?.active?"Dea":"A"]ctivate" + + +////// The shield projector object +/obj/item/shield_projector/rectangle/mecha + shield_health = 200 + max_shield_health = 200 + shield_regen_delay = 10 SECONDS + shield_regen_amount = 10 + size_x = 1 + size_y = 1 + + var/shift_x = 0 + var/shift_y = 0 + + var/obj/mecha/my_mech = null + +/obj/item/shield_projector/rectangle/mecha/Initialize() + . = ..() + my_mech = loc + GLOB.moved_event.register(my_mech, src, /obj/item/shield_projector/proc/update_shield_positions) + +/obj/item/shield_projector/rectangle/mecha/Destroy() + GLOB.moved_event.unregister(my_mech, src, /obj/item/shield_projector/proc/update_shield_positions) + my_mech = null + ..() + +/obj/item/shield_projector/rectangle/mecha/create_shield() + . = ..() + if(shift_x || shift_y) + var/obj/effect/directional_shield/newshield = active_shields[active_shields.len] + newshield.pixel_x = shift_x + newshield.pixel_y = shift_y + +/obj/item/shield_projector/rectangle/mecha/adjust_health(amount) + . = ..() + my_mech.use_power(OMNI_SHIELD_DRAIN) + if(!active && shield_health < shield_regen_amount) + my_mech.use_power(OMNI_SHIELD_DRAIN * 4) + +#undef OMNI_SHIELD_DRAIN diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 24176ef0f8..9f4b633468 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -5,7 +5,7 @@ desc = "A machine used for construction of mechas." density = 1 anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 20 active_power_usage = 5000 req_access = list(access_robotics) @@ -48,11 +48,11 @@ if(stat) return if(busy) - use_power = 2 + update_use_power(USE_POWER_ACTIVE) progress += speed check_build() else - use_power = 1 + update_use_power(USE_POWER_IDLE) update_icon() /obj/machinery/mecha_part_fabricator/update_icon() @@ -177,20 +177,20 @@ switch(emagged) if(0) emagged = 0.5 - visible_message("\icon[src] [src] beeps: \"DB error \[Code 0x00F1\]\"") + visible_message("[bicon(src)] [src] beeps: \"DB error \[Code 0x00F1\]\"") sleep(10) - visible_message("\icon[src] [src] beeps: \"Attempting auto-repair\"") + visible_message("[bicon(src)] [src] beeps: \"Attempting auto-repair\"") sleep(15) - visible_message("\icon[src] [src] beeps: \"User DB corrupted \[Code 0x00FA\]. Truncating data structure...\"") + visible_message("[bicon(src)] [src] beeps: \"User DB corrupted \[Code 0x00FA\]. Truncating data structure...\"") sleep(30) - visible_message("\icon[src] [src] beeps: \"User DB truncated. Please contact your [using_map.company_name] system operator for future assistance.\"") + visible_message("[bicon(src)] [src] beeps: \"User DB truncated. Please contact your [using_map.company_name] system operator for future assistance.\"") req_access = null emagged = 1 return 1 if(0.5) - visible_message("\icon[src] [src] beeps: \"DB not responding \[Code 0x0003\]...\"") + visible_message("[bicon(src)] [src] beeps: \"DB not responding \[Code 0x0003\]...\"") if(1) - visible_message("\icon[src] [src] beeps: \"No records in User DB\"") + visible_message("[bicon(src)] [src] beeps: \"No records in User DB\"") /obj/machinery/mecha_part_fabricator/proc/update_busy() if(queue.len) diff --git a/code/game/mecha/mech_prosthetics.dm b/code/game/mecha/mech_prosthetics.dm index f554c936c6..076eeed9dc 100644 --- a/code/game/mecha/mech_prosthetics.dm +++ b/code/game/mecha/mech_prosthetics.dm @@ -5,7 +5,7 @@ desc = "A machine used for construction of prosthetics." density = 1 anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 20 active_power_usage = 5000 req_access = list(access_robotics) @@ -52,11 +52,11 @@ if(stat) return if(busy) - use_power = 2 + update_use_power(USE_POWER_ACTIVE) progress += speed check_build() else - use_power = 1 + update_use_power(USE_POWER_IDLE) update_icon() /obj/machinery/pros_fabricator/update_icon() @@ -225,20 +225,20 @@ switch(emagged) if(0) emagged = 0.5 - visible_message("\icon[src] [src] beeps: \"DB error \[Code 0x00F1\]\"") + visible_message("[bicon(src)] [src] beeps: \"DB error \[Code 0x00F1\]\"") sleep(10) - visible_message("\icon[src] [src] beeps: \"Attempting auto-repair\"") + visible_message("[bicon(src)] [src] beeps: \"Attempting auto-repair\"") sleep(15) - visible_message("\icon[src] [src] beeps: \"User DB corrupted \[Code 0x00FA\]. Truncating data structure...\"") + visible_message("[bicon(src)] [src] beeps: \"User DB corrupted \[Code 0x00FA\]. Truncating data structure...\"") sleep(30) - visible_message("\icon[src] [src] beeps: \"User DB truncated. Please contact your [using_map.company_name] system operator for future assistance.\"") + visible_message("[bicon(src)] [src] beeps: \"User DB truncated. Please contact your [using_map.company_name] system operator for future assistance.\"") req_access = null emagged = 1 return 1 if(0.5) - visible_message("\icon[src] [src] beeps: \"DB not responding \[Code 0x0003\]...\"") + visible_message("[bicon(src)] [src] beeps: \"DB not responding \[Code 0x0003\]...\"") if(1) - visible_message("\icon[src] [src] beeps: \"No records in User DB\"") + visible_message("[bicon(src)] [src] beeps: \"No records in User DB\"") /obj/machinery/pros_fabricator/proc/update_busy() if(queue.len) diff --git a/code/game/mecha/mech_sensor.dm b/code/game/mecha/mech_sensor.dm index 72202788b9..33147e0ab1 100644 --- a/code/game/mecha/mech_sensor.dm +++ b/code/game/mecha/mech_sensor.dm @@ -6,7 +6,7 @@ anchored = 1 density = 1 throwpass = 1 - use_power = 1 + use_power = USE_POWER_IDLE layer = ON_WINDOW_LAYER power_channel = EQUIP var/on = 0 diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index d78053d6b2..ee43f81573 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -259,7 +259,9 @@ /obj/mecha/proc/check_for_support() - if(locate(/obj/structure/grille, orange(1, src)) || locate(/obj/structure/lattice, orange(1, src)) || locate(/turf/simulated, orange(1, src)) || locate(/turf/unsimulated, orange(1, src))) + var/list/things = orange(1, src) + + if(locate(/obj/structure/grille) in things || locate(/obj/structure/lattice) in things || locate(/turf/simulated) in things || locate(/turf/unsimulated) in things) return 1 else return 0 @@ -281,7 +283,7 @@ if(equipment && equipment.len) to_chat(user, "It's equipped with:") for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment) - to_chat(user, "\icon[ME] [ME]") + to_chat(user, "[bicon(ME)] [ME]") return @@ -397,21 +399,26 @@ /obj/mecha/relaymove(mob/user,direction) if(user != src.occupant) //While not "realistic", this piece is player friendly. if(istype(user,/mob/living/carbon/brain)) - to_chat(user, "You try to move, but you are not the pilot! The exosuit doesn't respond.") + to_chat(user, "You try to move, but you are not the pilot! The exosuit doesn't respond.") return 0 user.forceMove(get_turf(src)) to_chat(user, "You climb out from [src]") return 0 if(connected_port) if(world.time - last_message > 20) - src.occupant_message("Unable to move while connected to the air system port") + src.occupant_message("Unable to move while connected to the air system port") last_message = world.time return 0 if(state) - occupant_message("Maintenance protocols in effect") + occupant_message("Maintenance protocols in effect") return return domove(direction) +/obj/mecha/proc/can_ztravel() + for(var/obj/item/mecha_parts/mecha_equipment/tool/jetpack/jp in equipment) + return jp.equip_ready + return FALSE + /obj/mecha/proc/domove(direction) return call((proc_res["dyndomove"]||src), "dyndomove")(direction) @@ -423,20 +430,51 @@ return 0 if(!has_charge(step_energy_drain)) return 0 + var/move_result = 0 + if(hasInternalDamage(MECHA_INT_CONTROL_LOST)) move_result = mechsteprand() - else if(src.dir!=direction) + //Up/down zmove + else if(direction & UP || direction & DOWN) + if(!can_ztravel()) + occupant_message("Your vehicle lacks the capacity to move in that direction!") + return FALSE + + //We're using locs because some mecha are 2x2 turfs. So thicc! + var/result = TRUE + + for(var/turf/T in locs) + if(!T.CanZPass(src,direction)) + occupant_message("You can't move that direction from here!") + result = FALSE + break + var/turf/dest = direction & UP ? GetAbove(T) : GetBelow(T) + if(!dest) + occupant_message("There is nothing of interest in this direction.") + result = FALSE + break + if(!dest.CanZPass(src,direction)) + occupant_message("There's something blocking your movement in that direction!") + result = FALSE + break + if(result) + move_result = mechstep(direction) + //Turning + else if(src.dir != direction) move_result = mechturn(direction) + //Stepping else move_result = mechstep(direction) + + if(move_result) can_move = 0 use_power(step_energy_drain) if(istype(src.loc, /turf/space)) if(!src.check_for_support()) src.pr_inertial_movement.start(list(src,direction)) - src.log_message("Movement control lost. Inertial movement started.") + src.log_message("Movement control lost. Inertial movement started.") if(do_after(step_in)) can_move = 1 return 1 @@ -1222,26 +1260,32 @@ src.icon_state = src.reset_icon() set_dir(dir_in) playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) - if(!hasInternalDamage()) //Otherwise it's not nominal! - switch(mech_faction) - if(MECH_FACTION_NT)//The good guys category - if(firstactivation)//First time = long activation sound - firstactivation = 1 - src.occupant << sound('sound/mecha/LongNanoActivation.ogg',volume=50) - else - src.occupant << sound('sound/mecha/nominalnano.ogg',volume=50) - if(MECH_FACTION_SYNDI)//Bad guys - if(firstactivation) - firstactivation = 1 - src.occupant << sound('sound/mecha/LongSyndiActivation.ogg',volume=50) - else - src.occupant << sound('sound/mecha/nominalsyndi.ogg',volume=50) - else//Everyone else gets the normal noise - src.occupant << sound('sound/mecha/nominal.ogg',volume=50) + if(occupant.client && cloaked_selfimage) + occupant.client.images += cloaked_selfimage + play_entered_noise(occupant) return 1 else return 0 +/obj/mecha/proc/play_entered_noise(var/mob/who) + if(!hasInternalDamage()) //Otherwise it's not nominal! + switch(mech_faction) + if(MECH_FACTION_NT)//The good guys category + if(firstactivation)//First time = long activation sound + firstactivation = 1 + who << sound('sound/mecha/LongNanoActivation.ogg',volume=50) + else + who << sound('sound/mecha/nominalnano.ogg',volume=50) + if(MECH_FACTION_SYNDI)//Bad guys + if(firstactivation) + firstactivation = 1 + who << sound('sound/mecha/LongSyndiActivation.ogg',volume=50) + else + who << sound('sound/mecha/nominalsyndi.ogg',volume=50) + else//Everyone else gets the normal noise + who << sound('sound/mecha/nominal.ogg',volume=50) + + /obj/mecha/verb/view_stats() set name = "View Stats" set category = "Exosuit Interface" @@ -1285,45 +1329,21 @@ else return if(mob_container.forceMove(src.loc))//ejecting mob container - /* - if(ishuman(occupant) && (return_pressure() > HAZARD_HIGH_PRESSURE)) - use_internal_tank = 0 - var/datum/gas_mixture/environment = get_turf_air() - if(environment) - var/env_pressure = environment.return_pressure() - var/pressure_delta = (cabin.return_pressure() - env_pressure) - //Can not have a pressure delta that would cause environment pressure > tank pressure - - var/transfer_moles = 0 - if(pressure_delta > 0) - transfer_moles = pressure_delta*environment.volume/(cabin.return_temperature() * R_IDEAL_GAS_EQUATION) - - //Actually transfer the gas - var/datum/gas_mixture/removed = cabin.air_contents.remove(transfer_moles) - loc.assume_air(removed) - - occupant.SetStunned(5) - occupant.SetWeakened(5) - to_chat(occupant, "You were blown out of the mech!") - */ - src.log_message("[mob_container] moved out.") + log_message("[mob_container] moved out.") occupant.reset_view() - /* - if(src.occupant.client) - src.occupant.client.eye = src.occupant.client.mob - src.occupant.client.perspective = MOB_PERSPECTIVE - */ - src.occupant << browse(null, "window=exosuit") + occupant << browse(null, "window=exosuit") + if(occupant.client && cloaked_selfimage) + occupant.client.images -= cloaked_selfimage if(istype(mob_container, /obj/item/device/mmi)) var/obj/item/device/mmi/mmi = mob_container if(mmi.brainmob) occupant.loc = mmi mmi.mecha = null - src.occupant.canmove = 0 - src.occupant = null - src.icon_state = src.reset_icon()+"-open" - src.set_dir(dir_in) - src.verbs -= /obj/mecha/verb/eject + occupant.canmove = 0 + occupant = null + icon_state = src.reset_icon()+"-open" + set_dir(dir_in) + verbs -= /obj/mecha/verb/eject return ///////////////////////// @@ -1604,7 +1624,7 @@ /obj/mecha/proc/occupant_message(message as text) if(message) if(src.occupant && src.occupant.client) - to_chat(src.occupant, "\icon[src] [message]") + to_chat(src.occupant, "[bicon(src)] [message]") return /obj/mecha/proc/log_message(message as text,red=null) @@ -1837,7 +1857,7 @@ O.aiRestorePowerRoutine = 0 O.control_disabled = 1 // Can't control things remotely if you're stuck in a card! O.laws = AI.laws - O.stat = AI.stat + O.set_stat(AI.stat) O.oxyloss = AI.getOxyLoss() O.fireloss = AI.getFireLoss() O.bruteloss = AI.getBruteLoss() @@ -2026,6 +2046,17 @@ ///////////// +/obj/mecha/cloak() + . = ..() + if(occupant && occupant.client && cloaked_selfimage) + occupant.client.images += cloaked_selfimage + +/obj/mecha/uncloak() + if(occupant && occupant.client && cloaked_selfimage) + occupant.client.images -= cloaked_selfimage + return ..() + + //debug /* /obj/mecha/verb/test_int_damage() diff --git a/code/game/mecha/space/hoverpod.dm b/code/game/mecha/space/hoverpod.dm index 31558458d9..fc5fc1e739 100644 --- a/code/game/mecha/space/hoverpod.dm +++ b/code/game/mecha/space/hoverpod.dm @@ -26,11 +26,20 @@ max_universal_equip = 1 max_special_equip = 1 -/obj/mecha/working/hoverpod/New() - ..() +/obj/mecha/working/hoverpod/Initialize() + . = ..() ion_trail = new /datum/effect/effect/system/ion_trail_follow() ion_trail.set_up(src) - ion_trail.start() + +/obj/mecha/working/hoverpod/moved_inside(var/mob/living/carbon/human/H as mob) + . = ..(H) + if(.) + ion_trail.start() + +/obj/mecha/working/hoverpod/go_out() + . = ..() + if(!occupant) + ion_trail.stop() //Modified phazon code /obj/mecha/working/hoverpod/Topic(href, href_list) @@ -52,6 +61,9 @@ output += ..() return output +/obj/mecha/working/hoverpod/can_ztravel() + return (stabilization_enabled && has_charge(step_energy_drain)) + // No space drifting /obj/mecha/working/hoverpod/check_for_support() //does the hoverpod have enough charge left to stabilize itself? @@ -106,7 +118,7 @@ max_special_equip = 1 /obj/mecha/working/hoverpod/combatpod/Initialize() - ..() + . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive @@ -117,7 +129,7 @@ desc = "Who knew a tiny ball could fit three people?" /obj/mecha/working/hoverpod/shuttlepod/Initialize() - ..() + . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/passenger ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tool/passenger diff --git a/code/game/mecha/space/shuttle.dm b/code/game/mecha/space/shuttle.dm index 7e361ece0c..bf9aec3476 100644 --- a/code/game/mecha/space/shuttle.dm +++ b/code/game/mecha/space/shuttle.dm @@ -41,44 +41,30 @@ max_universal_equip = 1 max_special_equip = 1 -/obj/mecha/working/hoverpod/Initialize() - ..() - ion_trail.stop() - -/obj/mecha/working/hoverpod/shuttlecraft/moved_inside(var/mob/living/carbon/human/H as mob) - . = ..(H) - if(.) - ion_trail.start() - -/obj/mecha/working/hoverpod/shuttlecraft/go_out() - . = ..() - if(!occupant) - ion_trail.stop() - /obj/mecha/working/hoverpod/shuttlecraft/update_icon() - overlays.Cut() + cut_overlays() ..() if(base_paint) if(!base_paint_mask) base_paint_mask = image(icon, "[initial_icon]-mask+base", src.layer + 1) base_paint_mask.color = base_paint - overlays |= base_paint_mask + add_overlay(base_paint_mask) if(front_paint) if(!front_paint_mask) front_paint_mask = image(icon, "[initial_icon]-mask+front", src.layer + 1) front_paint_mask.color = front_paint - overlays |= front_paint_mask + add_overlay(front_paint_mask) if(engine_paint) if(!engine_paint_mask) engine_paint_mask = image(icon, "[initial_icon]-mask+engine", src.layer + 1) engine_paint_mask.color = engine_paint - overlays |= engine_paint_mask + add_overlay(engine_paint_mask) if(central_paint) if(!engine_paint_mask) central_paint_mask = image(icon, "[initial_icon]-mask+central", src.layer + 2) central_paint_mask.color = central_paint - overlays |= central_paint_mask + add_overlay(central_paint_mask) /obj/mecha/working/hoverpod/shuttlecraft/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/device/multitool) && state == 1) diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index 7790bbcddb..f23eca0149 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -32,11 +32,10 @@ show_log = 0 var/datum/seed/seed -/datum/effect/effect/system/smoke_spread/chem/spores/New(seed_name) - if(seed_name && plant_controller) - seed = plant_controller.seeds[seed_name] - if(!seed) - qdel(src) +/datum/effect/effect/system/smoke_spread/chem/spores/New(_seed) + seed = _seed + if(!istype(seed)) + CRASH("Invalid seed datum passed! [seed] ([seed?.type])") ..() /datum/effect/effect/system/smoke_spread/chem/blob diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm index f51dc9e4b1..5a461e1525 100644 --- a/code/game/objects/effects/chem/foam.dm +++ b/code/game/objects/effects/chem/foam.dm @@ -15,25 +15,30 @@ var/expand = 1 var/metal = 0 -/obj/effect/effect/foam/New(var/loc, var/ismetal = 0) - ..(loc) +/obj/effect/effect/foam/Initialize(var/mapload, var/ismetal = 0) + . = ..() icon_state = "[ismetal? "m" : ""]foam" metal = ismetal playsound(src, 'sound/effects/bubbles2.ogg', 80, 1, -3) - spawn(3 + metal * 3) - process() - checkReagents() - spawn(120) - STOP_PROCESSING(SSobj, src) - sleep(30) - if(metal) - var/obj/structure/foamedmetal/M = new(src.loc) - M.metal = metal - M.updateicon() - flick("[icon_state]-disolve", src) - sleep(5) - qdel(src) - return + + addtimer(CALLBACK(src, .proc/post_spread), 3 + metal * 3) + addtimer(CALLBACK(src, .proc/pre_harden), 12 SECONDS) + addtimer(CALLBACK(src, .proc/harden), 15 SECONDS) + +/obj/effect/effect/foam/proc/post_spread() + process() + checkReagents() + +/obj/effect/effect/foam/proc/pre_harden() + STOP_PROCESSING(SSobj, src) + +/obj/effect/effect/foam/proc/harden() + if(metal) + var/obj/structure/foamedmetal/M = new(src.loc) + M.metal = metal + M.updateicon() + flick("[icon_state]-disolve", src) + QDEL_IN(src, 5) /obj/effect/effect/foam/proc/checkReagents() // transfer any reagents to the floor if(!metal && reagents) diff --git a/code/game/objects/effects/chem/water.dm b/code/game/objects/effects/chem/water.dm index ee1c75980c..7de9b9f8ff 100644 --- a/code/game/objects/effects/chem/water.dm +++ b/code/game/objects/effects/chem/water.dm @@ -5,11 +5,9 @@ mouse_opacity = 0 pass_flags = PASSTABLE | PASSGRILLE | PASSBLOB -/obj/effect/effect/water/New(loc) - ..() - spawn(150) // In case whatever made it forgets to delete it - if(src) - qdel(src) +/obj/effect/effect/water/Initialize() + . = ..() + QDEL_IN(src, 15 SECONDS) /obj/effect/effect/water/proc/set_color() // Call it after you move reagents to it icon += reagents.get_color() diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 1d740abb68..fba219e924 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -20,7 +20,6 @@ var/global/list/image/splatter_cache=list() var/synthblood = 0 var/list/datum/disease2/disease/virus2 = list() var/amount = 5 - var/drytime /obj/effect/decal/cleanable/blood/reveal_blood() if(!fluorescent) @@ -33,13 +32,8 @@ var/global/list/image/splatter_cache=list() if(invisibility != 100) invisibility = 100 amount = 0 - STOP_PROCESSING(SSobj, src) ..(ignore=1) -/obj/effect/decal/cleanable/blood/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - /obj/effect/decal/cleanable/blood/New() ..() update_icon() @@ -52,12 +46,7 @@ var/global/list/image/splatter_cache=list() if (B.blood_DNA) blood_DNA |= B.blood_DNA.Copy() qdel(B) - drytime = world.time + DRYING_TIME * (amount+1) - START_PROCESSING(SSobj, src) - -/obj/effect/decal/cleanable/blood/process() - if(world.time > drytime) - dry() + addtimer(CALLBACK(src, .proc/dry), DRYING_TIME * (amount+1)) /obj/effect/decal/cleanable/blood/update_icon() if(basecolor == "rainbow") basecolor = "#[get_random_colour(1)]" @@ -116,7 +105,6 @@ var/global/list/image/splatter_cache=list() desc = drydesc color = adjust_brightness(color, -50) amount = 0 - STOP_PROCESSING(SSobj, src) /obj/effect/decal/cleanable/blood/attack_hand(mob/living/carbon/human/user) ..() @@ -241,14 +229,18 @@ var/global/list/image/splatter_cache=list() random_icon_states = list("mucus") var/list/datum/disease2/disease/virus2 = list() - var/dry=0 // Keeps the lag down + var/dry = 0 // Keeps the lag down -/obj/effect/decal/cleanable/mucus/New() - spawn(DRYING_TIME * 2) - dry=1 +/obj/effect/decal/cleanable/mucus/Initialize() + . = ..() + VARSET_IN(src, dry, TRUE, DRYING_TIME * 2) //This version should be used for admin spawns and pre-mapped virus vectors (e.g. in PoIs), this version does not dry -/obj/effect/decal/cleanable/mucus/mapped/New() - ..() +/obj/effect/decal/cleanable/mucus/mapped/Initialize() + . = ..() virus2 |= new /datum/disease2/disease virus2[1].makerandom() + +/obj/effect/decal/cleanable/mucus/mapped/Destroy() + virus2.Cut() + return ..() diff --git a/code/game/objects/effects/map_effects/beam_point.dm b/code/game/objects/effects/map_effects/beam_point.dm index 524686874c..c10e8b0315 100644 --- a/code/game/objects/effects/map_effects/beam_point.dm +++ b/code/game/objects/effects/map_effects/beam_point.dm @@ -36,8 +36,7 @@ GLOBAL_LIST_EMPTY(all_beam_points) if(make_beams_on_init) create_beams() if(use_timer) - spawn(initial_delay) - handle_beam_timer() + addtimer(CALLBACK(src, .proc/handle_beam_timer), initial_delay) return ..() /obj/effect/map_effect/beam_point/Destroy() diff --git a/code/game/objects/effects/map_effects/map_effects.dm b/code/game/objects/effects/map_effects/map_effects.dm index 60a1d042fb..03a07a56ce 100644 --- a/code/game/objects/effects/map_effects/map_effects.dm +++ b/code/game/objects/effects/map_effects/map_effects.dm @@ -10,7 +10,7 @@ var/proximity_needed = 12 // How many tiles a mob with a client must be for this to run. var/ignore_ghosts = FALSE // If true, ghosts won't satisfy the above requirement. var/ignore_afk = TRUE // If true, AFK people (5 minutes) won't satisfy it as well. - var/retry_delay = 3 SECONDS // How long until we check for players again. + var/retry_delay = 5 SECONDS // How long until we check for players again. /obj/effect/map_effect/ex_act() return @@ -46,15 +46,11 @@ return // Do not pass .(), do not recursively collect 200 thaler. if(!always_run && !check_for_player_proximity(src, proximity_needed, ignore_ghosts, ignore_afk)) - spawn(retry_delay) // Maybe someday we'll have fancy TG timers/schedulers. - if(!QDELETED(src)) - .() - return - - var/next_interval = rand(interval_lower_bound, interval_upper_bound) - spawn(next_interval) - if(!QDELETED(src)) - trigger() + //Nobody home, try again after retry_delay + addtimer(CALLBACK(src, .proc/handle_interval_delay), retry_delay) + else + //Someone was here! + addtimer(CALLBACK(src, .proc/trigger), rand(interval_lower_bound, interval_upper_bound)) // Helper proc to optimize the use of effects by making sure they do not run if nobody is around to perceive it. /proc/check_for_player_proximity(var/atom/proximity_to, var/radius = 12, var/ignore_ghosts = FALSE, var/ignore_afk = TRUE) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 2cca71b9de..fb82e6515a 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -16,6 +16,10 @@ icon_state = "uglyminearmed" wires = new(src) +/obj/effect/mine/Destroy() + qdel_null(wires) + return ..() + /obj/effect/mine/proc/explode(var/mob/living/M) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() triggered = 1 diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index 5fca6fbecf..98f10d6040 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -14,11 +14,10 @@ invisibility = 0 var/time_to_die = 10 SECONDS // Afer which, it will delete itself. -/obj/effect/temporary_effect/New() - ..() +/obj/effect/temporary_effect/Initialize() + . = ..() if(time_to_die) - spawn(time_to_die) - qdel(src) + QDEL_IN(src, time_to_die) // Shown really briefly when attacking with axes. /obj/effect/temporary_effect/cleave_attack diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index d6d81251b8..ec1b61c1de 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -38,12 +38,9 @@ GLOBAL_LIST_BOILERPLATE(all_portals, /obj/effect/portal) return return -/obj/effect/portal/New() - ..() // Necessary for the list boilerplate to work - spawn(300) - qdel(src) - return - return +/obj/effect/portal/Initialize() + . = ..() + QDEL_IN(src, 30 SECONDS) /obj/effect/portal/proc/teleport(atom/movable/M as mob|obj) if(istype(M, /obj/effect)) //sparks don't teleport diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 3bf7284214..8b74a26246 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -278,6 +278,9 @@ grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/hunter) +/obj/effect/spider/spiderling/non_growing + amount_grown = -1 + /obj/effect/decal/cleanable/spiderling_remains name = "spiderling remains" desc = "Green squishy mess." diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 02161a4db6..26a0a6478e 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -663,7 +663,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. if(!zoom && !cannotzoom) if(H.hud_used.hud_shown) H.toggle_zoom_hud() // If the user has already limited their HUD this avoids them having a HUD when they zoom in - H.client.view = viewsize + H.set_viewsize(viewsize) zoom = 1 var/tilesize = 32 @@ -689,7 +689,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. H.handle_vision() else - H.client.view = world.view + H.set_viewsize() // Reset to default if(!H.hud_used.hud_shown) H.toggle_zoom_hud() zoom = 0 diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 1a8b10a26a..8241cfd85d 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -154,6 +154,15 @@ QDEL_NULL(tank) return ..() +/obj/structure/closet/body_bag/cryobag/attack_hand(mob/living/user) + if(used) + var/confirm = alert(user, "Are you sure you want to open \the [src]? \ + \The [src] will expire upon opening it.", "Confirm Opening", "No", "Yes") + if(confirm == "Yes") + ..() // Will call `toggle()` and open the bag. + else + ..() + /obj/structure/closet/body_bag/cryobag/open() . = ..() if(used) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index e5acb5c4e7..e0fe443c04 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -65,6 +65,8 @@ var/global/list/obj/item/device/pda/PDAs = list() var/obj/item/device/paicard/pai = null // A slot for a personal AI device + var/spam_proof = FALSE // If true, it can't be spammed by random events. + /obj/item/device/pda/examine(mob/user) if(..(user, 1)) to_chat(user, "The time [stationtime2text()] is displayed in the corner of the screen.") @@ -334,6 +336,8 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/ai/pai ttone = "assist" +/obj/item/device/pda/ai/shell + spam_proof = TRUE // Since empty shells get a functional PDA. // Used for the PDA multicaster, which mirrors messages sent to it to a specific department, /obj/item/device/pda/multicaster @@ -342,6 +346,7 @@ var/global/list/obj/item/device/pda/PDAs = list() ttone = "data" detonate = 0 news_silent = 1 + spam_proof = TRUE // Spam messages don't actually work and its difficult to disable these. var/list/cartridges_to_send_to = list() // This is what actually mirrors the message, @@ -655,8 +660,9 @@ var/global/list/obj/item/device/pda/PDAs = list() // auto update every Master Controller tick ui.set_auto_update(auto_update) -//NOTE: graphic resources are loaded on client login /obj/item/device/pda/attack_self(mob/user as mob) + var/datum/asset/assets = get_asset_datum(/datum/asset/simple/pda) + assets.send(user) user.set_machine(src) @@ -1146,7 +1152,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if (!beep_silent) playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) for (var/mob/O in hearers(2, loc)) - O.show_message(text("\icon[src] *[message_tone]*")) + O.show_message(text("[bicon(src)] *[message_tone]*")) //Search for holder of the PDA. var/mob/living/L = null if(loc && isliving(loc)) @@ -1161,7 +1167,7 @@ var/global/list/obj/item/device/pda/PDAs = list() SSnanoui.update_user_uis(L, src) // Update the receiving user's PDA UI so that they can see the new message /obj/item/device/pda/proc/new_news(var/message) - new_info(news_silent, newstone, news_silent ? "" : "\icon[src] [message]") + new_info(news_silent, newstone, news_silent ? "" : "[bicon(src)] [message]") if(!news_silent) new_news = 1 @@ -1176,7 +1182,7 @@ var/global/list/obj/item/device/pda/PDAs = list() new_message(sending_device, sending_device.owner, sending_device.ownjob, message) /obj/item/device/pda/proc/new_message(var/sending_unit, var/sender, var/sender_job, var/message, var/reply = 1) - var/reception_message = "\icon[src] Message from [sender] ([sender_job]), \"[message]\" ([reply ? "Reply" : "Unable to Reply"])" + var/reception_message = "[bicon(src)] Message from [sender] ([sender_job]), \"[message]\" ([reply ? "Reply" : "Unable to Reply"])" new_info(message_silent, ttone, reception_message) log_pda("(PDA: [sending_unit]) sent \"[message]\" to [name]", usr) @@ -1188,12 +1194,21 @@ var/global/list/obj/item/device/pda/PDAs = list() if(ismob(sending_unit.loc) && isAI(loc)) track = "(Follow)" - var/reception_message = "\icon[src] Message from [sender] ([sender_job]), \"[message]\" (Reply) [track]" + var/reception_message = "[bicon(src)] Message from [sender] ([sender_job]), \"[message]\" (Reply) [track]" new_info(message_silent, newstone, reception_message) log_pda("(PDA: [sending_unit]) sent \"[message]\" to [name]",usr) new_message = 1 +/obj/item/device/pda/proc/spam_message(sender, message) + var/reception_message = "\icon[src] Message from [sender] (Unknown / spam?), \"[message]\" (Unable to Reply)" + new_info(message_silent, ttone, reception_message) + + if(prob(50)) // Give the AI an increased chance to intercept the message + for(var/mob/living/silicon/ai/ai in mob_list) + if(ai.aiPDA != src) + ai.show_message("Intercepted message from [sender] (Unknown / spam?) to [owner]: [message]") + /obj/item/device/pda/verb/verb_reset_pda() set category = "Object" set name = "Reset PDA" diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 3d2a6cbc6e..2a662ea5ff 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -425,14 +425,14 @@ var/list/civilian_cartridges = list( if(mode==47) var/supplyData[0] - var/datum/shuttle/autodock/ferry/supply/shuttle = supply_controller.shuttle + var/datum/shuttle/autodock/ferry/supply/shuttle = SSsupply.shuttle if (shuttle) supplyData["shuttle_moving"] = shuttle.has_arrive_time() supplyData["shuttle_eta"] = shuttle.eta_minutes() supplyData["shuttle_loc"] = shuttle.at_station() ? "Station" : "Dock" var/supplyOrderCount = 0 var/supplyOrderData[0] - for(var/S in supply_controller.shoppinglist) + for(var/S in SSsupply.shoppinglist) var/datum/supply_order/SO = S supplyOrderData[++supplyOrderData.len] = list("Number" = SO.ordernum, "Name" = html_encode(SO.object.name), "ApprovedBy" = SO.ordered_by, "Comment" = html_encode(SO.comment)) @@ -444,7 +444,7 @@ var/list/civilian_cartridges = list( var/requestCount = 0 var/requestData[0] - for(var/S in supply_controller.order_history) + for(var/S in SSsupply.order_history) var/datum/supply_order/SO = S if(SO.status != SUP_ORDER_REQUESTED) continue diff --git a/code/game/objects/items/devices/ai_detector.dm b/code/game/objects/items/devices/ai_detector.dm index fde112706f..94d3a35912 100644 --- a/code/game/objects/items/devices/ai_detector.dm +++ b/code/game/objects/items/devices/ai_detector.dm @@ -94,22 +94,22 @@ if(new_state != old_state) switch(new_state) if(PROXIMITY_OFF_CAMERANET) - to_chat(carrier, "\icon[src] Now outside of camera network.") + to_chat(carrier, "[bicon(src)] Now outside of camera network.") carrier << 'sound/machines/defib_failed.ogg' if(PROXIMITY_NONE) - to_chat(carrier, "\icon[src] Now within camera network, AI and cameras unfocused.") + to_chat(carrier, "[bicon(src)] Now within camera network, AI and cameras unfocused.") carrier << 'sound/machines/defib_safetyOff.ogg' if(PROXIMITY_NEAR) - to_chat(carrier, "\icon[src] Warning: AI focus at nearby location.") + to_chat(carrier, "[bicon(src)] Warning: AI focus at nearby location.") carrier << 'sound/machines/defib_SafetyOn.ogg' if(PROXIMITY_ON_SCREEN) - to_chat(carrier, "\icon[src] Alert: AI or camera focused at current location!") + to_chat(carrier, "[bicon(src)] Alert: AI or camera focused at current location!") carrier <<'sound/machines/defib_ready.ogg' if(PROXIMITY_TRACKING) - to_chat(carrier, "\icon[src] Danger: AI is actively tracking you!") + to_chat(carrier, "[bicon(src)] Danger: AI is actively tracking you!") carrier << 'sound/machines/defib_success.ogg' if(PROXIMITY_TRACKING_FAIL) - to_chat(carrier, "\icon[src] Danger: AI is attempting to actively track you, but you are outside of the camera network!") + to_chat(carrier, "[bicon(src)] Danger: AI is attempting to actively track you, but you are outside of the camera network!") carrier <<'sound/machines/defib_ready.ogg' diff --git a/code/game/objects/items/devices/communicator/cartridge.dm b/code/game/objects/items/devices/communicator/cartridge.dm index b5a46b4ebe..b1c3bd41f2 100644 --- a/code/game/objects/items/devices/communicator/cartridge.dm +++ b/code/game/objects/items/devices/communicator/cartridge.dm @@ -140,7 +140,7 @@ if(!reason) return - supply_controller.create_order(S, user, reason) + SSsupply.create_order(S, user, reason) internal_data["supply_reqtime"] = (world.time + 5) % 1e5 if(href_list["order_ref"]) @@ -189,20 +189,20 @@ O.approved_at = new_val if(href_list["approve"]) - supply_controller.approve_order(O, user) + SSsupply.approve_order(O, user) if(href_list["deny"]) - supply_controller.deny_order(O, user) + SSsupply.deny_order(O, user) if(href_list["delete"]) - supply_controller.delete_order(O, user) + SSsupply.delete_order(O, user) if(href_list["clear_all_requests"]) var/mob/user = locate(href_list["user"]) if(!istype(user)) // Invalid ref return - supply_controller.deny_all_pending(user) + SSsupply.deny_all_pending(user) if(href_list["export_ref"]) var/datum/exported_crate/E = locate(href_list["export_ref"]) @@ -258,29 +258,29 @@ E.value = num else if(href_list["delete"]) - supply_controller.delete_export(E, user) + SSsupply.delete_export(E, user) else if(href_list["add_item"]) - supply_controller.add_export_item(E, user) + SSsupply.add_export_item(E, user) - if(supply_controller && supply_controller.shuttle) + if(SSsupply && SSsupply.shuttle) switch(href_list["send_shuttle"]) if("send_away") - if(supply_controller.shuttle.forbidden_atoms_check()) + if(SSsupply.shuttle.forbidden_atoms_check()) to_chat(usr, "For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.") else - supply_controller.shuttle.launch(src) + SSsupply.shuttle.launch(src) to_chat(usr, "Initiating launch sequence.") if("send_to_station") - supply_controller.shuttle.launch(src) - to_chat(usr, "The supply shuttle has been called and will arrive in approximately [round(supply_controller.movetime/600,1)] minutes.") + SSsupply.shuttle.launch(src) + to_chat(usr, "The supply shuttle has been called and will arrive in approximately [round(SSsupply.movetime/600,1)] minutes.") if("cancel_shuttle") - supply_controller.shuttle.cancel_launch(src) + SSsupply.shuttle.cancel_launch(src) if("force_shuttle") - supply_controller.shuttle.force_launch(src) + SSsupply.shuttle.force_launch(src) // Status display switch(href_list["stat_display"]) diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index af3ae77ef5..fae2d4586f 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -78,8 +78,8 @@ var/global/list/obj/item/device/communicator/all_communicators = list() // Parameters: None // Description: Adds the new communicator to the global list of all communicators, sorts the list, obtains a reference to the Exonet node, then tries to // assign the device to the holder's name automatically in a spectacularly shitty way. -/obj/item/device/communicator/New() - ..() +/obj/item/device/communicator/Initialize() + . = ..() all_communicators += src all_communicators = sortAtom(all_communicators) node = get_exonet_node() @@ -87,16 +87,22 @@ var/global/list/obj/item/device/communicator/all_communicators = list() camera = new(src) camera.name = "[src] #[rand(100,999)]" camera.c_tag = camera.name + //This is a pretty terrible way of doing this. - spawn(5 SECONDS) //Wait for our mob to finish spawning. - if(ismob(loc)) - register_device(loc.name) - initialize_exonet(loc) - else if(istype(loc, /obj/item/weapon/storage)) - var/obj/item/weapon/storage/S = loc - if(ismob(S.loc)) - register_device(S.loc.name) - initialize_exonet(S.loc) + addtimer(CALLBACK(src, .proc/register_to_holder), 5 SECONDS) + +// Proc: register_to_holder() +// Parameters: None +// Description: Tries to register ourselves to the mob that we've presumably spawned in. Not the most amazing way of doing this. +/obj/item/device/communicator/proc/register_to_holder() + if(ismob(loc)) + register_device(loc.name) + initialize_exonet(loc) + else if(istype(loc, /obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = loc + if(ismob(S.loc)) + register_device(S.loc.name) + initialize_exonet(S.loc) // Proc: examine() // Parameters: user - the user doing the examining @@ -275,14 +281,13 @@ var/global/list/obj/item/device/communicator/all_communicators = list() // Proc: New() // Parameters: None // Description: Gives ghosts an exonet address based on their key and ghost name. -/mob/observer/dead/New() +/mob/observer/dead/Initialize() . = ..() - spawn(20) - exonet = new(src) - if(client) - exonet.make_address("communicator-[src.client]-[src.client.prefs.real_name]") - else - exonet.make_address("communicator-[key]-[src.real_name]") + exonet = new(src) + if(client) + exonet.make_address("communicator-[src.client]-[src.client.prefs.real_name]") + else + exonet.make_address("communicator-[key]-[src.real_name]") // Proc: Destroy() // Parameters: None @@ -313,7 +318,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list() /obj/item/device/communicator/Destroy() for(var/mob/living/voice/voice in contents) voice_mobs.Remove(voice) - to_chat(voice, "\icon[src] Connection timed out with remote host.") + to_chat(voice, "[bicon(src)] Connection timed out with remote host.") qdel(voice) close_connection(reason = "Connection timed out") diff --git a/code/game/objects/items/devices/communicator/helper.dm b/code/game/objects/items/devices/communicator/helper.dm index ce5eef016c..ec67686668 100644 --- a/code/game/objects/items/devices/communicator/helper.dm +++ b/code/game/objects/items/devices/communicator/helper.dm @@ -394,7 +394,7 @@ // code\game\machinery\computer\supply.dm, starting at line 55 /obj/item/weapon/commcard/proc/get_supply_shuttle_status() var/shuttle_status[0] - var/datum/shuttle/autodock/ferry/supply/shuttle = supply_controller.shuttle + var/datum/shuttle/autodock/ferry/supply/shuttle = SSsupply.shuttle if(shuttle) if(shuttle.has_arrive_time()) shuttle_status["location"] = "In transit" @@ -454,7 +454,7 @@ // code\game\machinery\computer\supply.dm, starting at line 130 /obj/item/weapon/commcard/proc/get_supply_orders() var/orders[0] - for(var/datum/supply_order/S in supply_controller.order_history) + for(var/datum/supply_order/S in SSsupply.order_history) orders[++orders.len] = list( "ref" = "\ref[S]", "status" = S.status, @@ -477,7 +477,7 @@ // code\game\machinery\computer\supply.dm, starting at line 147 /obj/item/weapon/commcard/proc/get_supply_receipts() var/receipts[0] - for(var/datum/exported_crate/E in supply_controller.exported_crates) + for(var/datum/exported_crate/E in SSsupply.exported_crates) receipts[++receipts.len] = list( "ref" = "\ref[E]", "contents" = E.contents, @@ -495,8 +495,8 @@ // code\game\machinery\computer\supply.dm, starting at line 147 /obj/item/weapon/commcard/proc/get_supply_pack_list() var/supply_packs[0] - for(var/pack_name in supply_controller.supply_pack) - var/datum/supply_pack/P = supply_controller.supply_pack[pack_name] + for(var/pack_name in SSsupply.supply_pack) + var/datum/supply_pack/P = SSsupply.supply_pack[pack_name] if(P.group == internal_data["supply_category"]) var/list/pack = list( "name" = P.name, @@ -521,7 +521,7 @@ return list( "shuttle_auth" = (internal_data["supply_controls"] & SUP_SEND_SHUTTLE), "order_auth" = (internal_data["supply_controls"] & SUP_ACCEPT_ORDERS), - "supply_points" = supply_controller.points, + "supply_points" = SSsupply.points, "supply_categories" = all_supply_groups ) diff --git a/code/game/objects/items/devices/communicator/messaging.dm b/code/game/objects/items/devices/communicator/messaging.dm index 62e585c982..c6191ab21e 100644 --- a/code/game/objects/items/devices/communicator/messaging.dm +++ b/code/game/objects/items/devices/communicator/messaging.dm @@ -34,7 +34,7 @@ if(src in comm.voice_invites) comm.open_connection(src) return - to_chat(src, "\icon[origin_atom] Receiving communicator request from [origin_atom]. To answer, use the Call Communicator \ + to_chat(src, "[bicon(origin_atom)] Receiving communicator request from [origin_atom]. To answer, use the Call Communicator \ verb, and select that name to answer the call.") src << 'sound/machines/defib_SafetyOn.ogg' comm.voice_invites |= src @@ -44,7 +44,7 @@ random = random / 10 exonet.send_message(origin_address, "64 bytes received from [exonet.address] ecmp_seq=1 ttl=51 time=[random] ms") if(message == "text") - to_chat(src, "\icon[origin_atom] Received text message from [origin_atom]: \"[text]\"") + to_chat(src, "[bicon(origin_atom)] Received text message from [origin_atom]: \"[text]\"") src << 'sound/machines/defib_safetyOff.ogg' exonet_messages.Add("From [origin_atom]:
[text]") return @@ -78,7 +78,7 @@ if(ringer) playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) for (var/mob/O in hearers(2, loc)) - O.show_message(text("\icon[src] *beep*")) + O.show_message(text("[bicon(src)] *beep*")) alert_called = 1 update_icon() @@ -89,7 +89,7 @@ L = loc if(L) - to_chat(L, "\icon[src] Message from [who].") + to_chat(L, "[bicon(src)] Message from [who].") // Verb: text_communicator() // Parameters: None diff --git a/code/game/objects/items/devices/communicator/phone.dm b/code/game/objects/items/devices/communicator/phone.dm index 098fecf628..e06b17a244 100644 --- a/code/game/objects/items/devices/communicator/phone.dm +++ b/code/game/objects/items/devices/communicator/phone.dm @@ -39,15 +39,15 @@ comm.voice_requests.Remove(src) if(user) - comm.visible_message("\icon[src] Connecting to [src].") - to_chat(user, "\icon[src] Attempting to call [comm].") + comm.visible_message("[bicon(src)] Connecting to [src].") + to_chat(user, "[bicon(src)] Attempting to call [comm].") sleep(10) - to_chat(user, "\icon[src] Dialing internally from [station_name()], [system_name()].") + to_chat(user, "[bicon(src)] Dialing internally from [station_name()], [system_name()].") sleep(20) //If they don't have an exonet something is very wrong and we want a runtime. - to_chat(user, "\icon[src] Connection re-routed to [comm] at [comm.exonet.address].") + to_chat(user, "[bicon(src)] Connection re-routed to [comm] at [comm.exonet.address].") sleep(40) - to_chat(user, "\icon[src] Connection to [comm] at [comm.exonet.address] established.") - comm.visible_message("\icon[src] Connection to [src] at [exonet.address] established.") + to_chat(user, "[bicon(src)] Connection to [comm] at [comm.exonet.address] established.") + comm.visible_message("[bicon(src)] Connection to [src] at [exonet.address] established.") sleep(20) src.add_communicating(comm) @@ -86,28 +86,28 @@ //Now for some connection fluff. if(user) - to_chat(user, "\icon[src] Connecting to [candidate].") - to_chat(new_voice, "\icon[src] Attempting to call [src].") + to_chat(user, "[bicon(src)] Connecting to [candidate].") + to_chat(new_voice, "[bicon(src)] Attempting to call [src].") sleep(10) - to_chat(new_voice, "\icon[src] Dialing to [station_name()], Kara Subsystem, [system_name()].") + to_chat(new_voice, "[bicon(src)] Dialing to [station_name()], Kara Subsystem, [system_name()].") sleep(20) - to_chat(new_voice, "\icon[src] Connecting to [station_name()] telecommunications array.") + to_chat(new_voice, "[bicon(src)] Connecting to [station_name()] telecommunications array.") sleep(40) - to_chat(new_voice, "\icon[src] Connection to [station_name()] telecommunications array established. Redirecting signal to [src].") + to_chat(new_voice, "[bicon(src)] Connection to [station_name()] telecommunications array established. Redirecting signal to [src].") sleep(20) //We're connected, no need to hide everything. new_voice.client.screen.Remove(blackness) qdel(blackness) - to_chat(new_voice, "\icon[src] Connection to [src] established.") + to_chat(new_voice, "[bicon(src)] Connection to [src] established.") to_chat(new_voice, "To talk to the person on the other end of the call, just talk normally.") to_chat(new_voice, "If you want to end the call, use the 'Hang Up' verb. The other person can also hang up at any time.") to_chat(new_voice, "Remember, your character does not know anything you've learned from observing!") if(new_voice.mind) new_voice.mind.assigned_role = "Disembodied Voice" if(user) - to_chat(user, "\icon[src] Your communicator is now connected to [candidate]'s communicator.") + to_chat(user, "[bicon(src)] Your communicator is now connected to [candidate]'s communicator.") // Proc: close_connection() // Parameters: 3 (user - the user who initiated the disconnect, target - the mob or device being disconnected, reason - string shown when disconnected) @@ -120,8 +120,8 @@ for(var/mob/living/voice/voice in voice_mobs) //Handle ghost-callers if(target && voice != target) //If no target is inputted, it deletes all of them. continue - to_chat(voice, "\icon[src] [reason].") - visible_message("\icon[src] [reason].") + to_chat(voice, "[bicon(src)] [reason].") + visible_message("[bicon(src)] [reason].") voice_mobs.Remove(voice) qdel(voice) update_icon() @@ -131,8 +131,8 @@ continue src.del_communicating(comm) comm.del_communicating(src) - comm.visible_message("\icon[src] [reason].") - visible_message("\icon[src] [reason].") + comm.visible_message("[bicon(src)] [reason].") + visible_message("[bicon(src)] [reason].") if(comm.camera && video_source == comm.camera) //We hung up on the person on video end_video() if(camera && comm.video_source == camera) //We hung up on them while they were watching us @@ -163,7 +163,7 @@ if(ringer) playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) for (var/mob/O in hearers(2, loc)) - O.show_message(text("\icon[src] *beep*")) + O.show_message(text("[bicon(src)] *beep*")) alert_called = 1 update_icon() @@ -174,7 +174,7 @@ L = loc if(L) - to_chat(L, "\icon[src] Communications request from [who].") + to_chat(L, "[bicon(src)] Communications request from [who].") // Proc: del_request() // Parameters: 1 (candidate - the ghost or communicator to be declined) @@ -197,13 +197,13 @@ us = loc if(us) - to_chat(us, "\icon[src] Declined request.") + to_chat(us, "[bicon(src)] Declined request.") // Proc: see_emote() // Parameters: 2 (M - the mob the emote originated from, text - the emote's contents) // Description: Relays the emote to all linked communicators. /obj/item/device/communicator/see_emote(mob/living/M, text) - var/rendered = "\icon[src] [text]" + var/rendered = "[bicon(src)] [text]" for(var/obj/item/device/communicator/comm in communicating) var/turf/T = get_turf(comm) if(!T) return @@ -241,16 +241,16 @@ var/name_used = M.GetVoice() var/rendered = null if(speaking) //Language being used - rendered = "\icon[src] [name_used] [speaking.format_message(text, verb)]" + rendered = "[bicon(src)] [name_used] [speaking.format_message(text, verb)]" else - rendered = "\icon[src] [name_used] [verb], \"[text]\"" + rendered = "[bicon(src)] [name_used] [verb], \"[text]\"" mob.show_message(rendered, 2) // Proc: show_message() // Parameters: 4 (msg - the message, type - number to determine if message is visible or audible, alt - unknown, alt_type - unknown) // Description: Relays the message to all linked communicators. /obj/item/device/communicator/show_message(msg, type, alt, alt_type) - var/rendered = "\icon[src] [msg]" + var/rendered = "[bicon(src)] [msg]" for(var/obj/item/device/communicator/comm in communicating) var/turf/T = get_turf(comm) if(!T) return @@ -331,14 +331,14 @@ to_chat(user, "You cannot see well enough to do that!") if(!(src in comm.communicating) || !comm.camera) //You called someone with a broken communicator or one that's fake or yourself or something - to_chat(user, "\icon[src]ERROR: Video failed. Either bandwidth is too low, or the other communicator is malfunctioning.") + to_chat(user, "[bicon(src)]ERROR: Video failed. Either bandwidth is too low, or the other communicator is malfunctioning.") - to_chat(user, "\icon[src] Attempting to start video over existing call.") + to_chat(user, "[bicon(src)] Attempting to start video over existing call.") sleep(30) - to_chat(user, "\icon[src] Please wait...") + to_chat(user, "[bicon(src)] Please wait...") video_source = comm.camera - comm.visible_message("\icon[src] New video connection from [comm].") + comm.visible_message("[bicon(src)] New video connection from [comm].") watch_video(user) update_icon() @@ -377,7 +377,7 @@ /obj/item/device/communicator/proc/end_video(var/reason) video_source = null - . = "\icon[src] [reason ? reason : "Video session ended"]." + . = "[bicon(src)] [reason ? reason : "Video session ended"]." visible_message(.) update_icon() diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm index 7a3ea3240e..dbb1410ef9 100644 --- a/code/game/objects/items/devices/defib.dm +++ b/code/game/objects/items/devices/defib.dm @@ -281,9 +281,8 @@ return null /obj/item/weapon/shockpaddles/proc/can_revive(mob/living/carbon/human/H) //This is checked right before attempting to revive - - var/deadtime = world.time - H.timeofdeath - if (deadtime > DEFIB_TIME_LIMIT && !H.isSynthetic()) + var/obj/item/organ/internal/brain/brain = H.internal_organs_by_name[O_BRAIN] + if(H.should_have_organ(O_BRAIN) && (!brain || brain.defib_timer <= 0 ) ) return "buzzes, \"Resuscitation failed - Excessive neural degeneration. Further attempts futile.\"" H.updatehealth() @@ -481,32 +480,46 @@ add_attack_logs(user,H,"Shocked using [name]") /obj/item/weapon/shockpaddles/proc/make_alive(mob/living/carbon/human/M) //This revives the mob - var/deadtime = world.time - M.timeofdeath - dead_mob_list.Remove(M) if((M in living_mob_list) || (M in dead_mob_list)) WARNING("Mob [M] was defibbed but already in the living or dead list still!") living_mob_list += M M.timeofdeath = 0 - M.stat = UNCONSCIOUS //Life() can bring them back to consciousness if it needs to. + M.set_stat(UNCONSCIOUS) //Life() can bring them back to consciousness if it needs to. M.failed_last_breath = 0 //So mobs that died of oxyloss don't revive and have perpetual out of breath. M.reload_fullscreen() M.emote("gasp") M.Weaken(rand(10,25)) M.updatehealth() - apply_brain_damage(M, deadtime) + apply_brain_damage(M) + SSgame_master.adjust_danger(-20) -/obj/item/weapon/shockpaddles/proc/apply_brain_damage(mob/living/carbon/human/H, var/deadtime) - if(deadtime < DEFIB_TIME_LOSS) return - - if(!H.should_have_organ(O_BRAIN)) return //no brain +/obj/item/weapon/shockpaddles/proc/apply_brain_damage(mob/living/carbon/human/H) + if(!H.should_have_organ(O_BRAIN)) + return // No brain. var/obj/item/organ/internal/brain/brain = H.internal_organs_by_name[O_BRAIN] - if(!brain) return //no brain + if(!brain) + return // Still no brain. + + // If the brain'd `defib_timer` var gets below this number, brain damage will happen at a linear rate. + // This is measures in `Life()` ticks. E.g. 10 minute defib timer = 6000 world.time units = 3000 `Life()` ticks. + var/brain_damage_timer = ((config.defib_timer MINUTES) / 2) - ((config.defib_braindamage_timer MINUTES) / 2) + + if(brain.defib_timer > brain_damage_timer) + return // They got revived before brain damage got a chance to set in. + + // As the brain decays, this will be between 0 and 1, with 1 being the most fresh. + var/brain_death_scale = brain.defib_timer / brain_damage_timer + + // This is backwards from what you might expect, since 1 = fresh and 0 = rip. + var/damage_calc = LERP(brain.max_damage, H.getBrainLoss(), brain_death_scale) + + // A bit of sanity. + var/brain_damage = between(H.getBrainLoss(), damage_calc, brain.max_damage) - var/brain_damage = CLAMP((deadtime - DEFIB_TIME_LOSS)/(DEFIB_TIME_LIMIT - DEFIB_TIME_LOSS)*brain.max_damage, H.getBrainLoss(), brain.max_damage) H.setBrainLoss(brain_damage) /obj/item/weapon/shockpaddles/proc/make_announcement(var/message, var/msg_class) diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm index 92ff449855..c6f7c3f9f1 100644 --- a/code/game/objects/items/devices/geiger.dm +++ b/code/game/objects/items/devices/geiger.dm @@ -62,7 +62,7 @@ scanning = !scanning update_icon() update_sound() - to_chat(user, "\icon[src] You switch [scanning ? "on" : "off"] \the [src].") + to_chat(user, "[bicon(src)] You switch [scanning ? "on" : "off"] \the [src].") /obj/item/device/geiger/update_icon() if(!scanning) diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 830fa803e4..0cac902796 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -99,9 +99,7 @@ var/list/GPS_list = list() gps_data["gps_tag"] = G.gps_tag var/area/A = get_area(G) - gps_data["area_name"] = A.name - if(istype(A, /area/submap)) - gps_data["area_name"] = "Unknown Area" // Avoid spoilers. + gps_data["area_name"] = A.get_name() gps_data["z_name"] = using_map.get_zlevel_name(T.z) gps_data["direction"] = get_adir(curr, T) diff --git a/code/game/objects/items/devices/hacktool.dm b/code/game/objects/items/devices/hacktool.dm index f6fad2efb5..0b6d25f0c9 100644 --- a/code/game/objects/items/devices/hacktool.dm +++ b/code/game/objects/items/devices/hacktool.dm @@ -47,7 +47,7 @@ to_chat(user, "You are already hacking!") return 0 if(!is_type_in_list(target, supported_types)) - to_chat(user, "\icon[src] Unable to hack this target!") + to_chat(user, "[bicon(src)] Unable to hack this target!") return 0 var/found = known_targets.Find(target) if(found) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 4bc24cf1c5..a39e1d8a17 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -364,7 +364,7 @@ var/global/list/default_medbay_channels = list( var/list/jamming = is_jammed(src) if(jamming) var/distance = jamming["distance"] - to_chat(M, "\icon[src] You hear the [distance <= 2 ? "loud hiss" : "soft hiss"] of static.") + to_chat(M, "[bicon(src)] You hear the [distance <= 2 ? "loud hiss" : "soft hiss"] of static.") return FALSE // First, we want to generate a new radio signal diff --git a/code/game/objects/items/devices/text_to_speech.dm b/code/game/objects/items/devices/text_to_speech.dm index 47dfc256fc..f3feacd86e 100644 --- a/code/game/objects/items/devices/text_to_speech.dm +++ b/code/game/objects/items/devices/text_to_speech.dm @@ -25,4 +25,4 @@ var/message = sanitize(input(user,"Choose a message to relay to those around you.") as text|null) if(message) var/obj/item/device/text_to_speech/O = src - audible_message("\icon[O] \The [O.name] states, \"[message]\"") + audible_message("[bicon(O)] \The [O.name] states, \"[message]\"") diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index b4400ab5d5..4169dfc947 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -11,11 +11,6 @@ var/toggle = 1 flags = PROXMOVE -/obj/item/device/transfer_valve/proc/process_activation(var/obj/item/device/D) - -/obj/item/device/transfer_valve/IsAssemblyHolder() - return 1 - /obj/item/device/transfer_valve/attackby(obj/item/item, mob/user) var/turf/location = get_turf(src) // For admin logs if(istype(item, /obj/item/weapon/tank)) @@ -116,12 +111,11 @@ src.add_fingerprint(usr) return 1 // Returning 1 sends an update to attached UIs -/obj/item/device/transfer_valve/process_activation(var/obj/item/device/D) +/obj/item/device/transfer_valve/proc/process_activation(var/obj/item/device/D) if(toggle) - toggle = 0 + toggle = FALSE toggle_valve() - spawn(50) // To stop a signal being spammed from a proxy sensor constantly going off or whatever - toggle = 1 + VARSET_IN(src, toggle, TRUE, 5 SECONDS) /obj/item/device/transfer_valve/update_icon() overlays.Cut() diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm index ea7006a73b..5a19c72742 100644 --- a/code/game/objects/items/devices/uplink.dm +++ b/code/game/objects/items/devices/uplink.dm @@ -1,3 +1,5 @@ +GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink) + /obj/item/device/uplink var/welcome = "Welcome, Operative" // Welcoming menu message var/uses // Numbers of crystals @@ -12,32 +14,29 @@ var/datum/mind/uplink_owner = null var/used_TC = 0 var/offer_time = 10 MINUTES //The time increment per discount offered - var/next_offer_time //The time a discount will next be offered + var/next_offer_time var/datum/uplink_item/discount_item //The item to be discounted var/discount_amount //The amount as a percent the item will be discounted by /obj/item/device/uplink/nano_host() return loc -/obj/item/device/uplink/New(var/location, var/datum/mind/owner = null, var/telecrystals = DEFAULT_TELECRYSTAL_AMOUNT) - ..() - src.uplink_owner = owner +/obj/item/device/uplink/Initialize(var/mapload, var/datum/mind/owner = null, var/telecrystals = DEFAULT_TELECRYSTAL_AMOUNT) + . = ..() + uplink_owner = owner purchase_log = list() - world_uplinks += src if(owner) uses = owner.tcrystals else uses = telecrystals - START_PROCESSING(SSobj, src) - -/obj/item/device/uplink/Destroy() - world_uplinks -= src - STOP_PROCESSING(SSobj, src) - return ..() + addtimer(CALLBACK(src, .proc/next_offer), offer_time) //It seems like only the /hidden type actually makes use of this... /obj/item/device/uplink/get_item_cost(var/item_type, var/item_cost) return (discount_item && (item_type == discount_item)) ? max(1, round(item_cost*discount_amount)) : item_cost +/obj/item/device/uplink/proc/next_offer() + return //Stub, used on children. + // HIDDEN UPLINK - Can be stored in anything but the host item has to have a trigger for it. /* How to create an uplink in 3 easy steps! @@ -58,21 +57,20 @@ var/exploit_id // Id of the current exploit record we are viewing // The hidden uplink MUST be inside an obj/item's contents. -/obj/item/device/uplink/hidden/New() - spawn(2) - if(!istype(src.loc, /obj/item)) - qdel(src) - ..() +/obj/item/device/uplink/hidden/Initialize() + . = ..() + if(!isitem(loc)) + return INITIALIZE_HINT_QDEL nanoui_data = list() update_nano_data() -/obj/item/device/uplink/hidden/process() - if(world.time > next_offer_time) - discount_item = default_uplink_selection.get_random_item(INFINITY) - discount_amount = pick(90;0.9, 80;0.8, 70;0.7, 60;0.6, 50;0.5, 40;0.4, 30;0.3, 20;0.2, 10;0.1) - next_offer_time = world.time + offer_time - update_nano_data() - SSnanoui.update_uis(src) +/obj/item/device/uplink/hidden/next_offer() + discount_item = default_uplink_selection.get_random_item(INFINITY) + discount_amount = pick(90;0.9, 80;0.8, 70;0.7, 60;0.6, 50;0.5, 40;0.4, 30;0.3, 20;0.2, 10;0.1) + update_nano_data() + SSnanoui.update_uis(src) + next_offer_time = world.time + offer_time + addtimer(CALLBACK(src, .proc/next_offer), offer_time) // Toggles the uplink on and off. Normally this will bypass the item's normal functions and go to the uplink menu, if activated. /obj/item/device/uplink/hidden/proc/toggle() @@ -112,7 +110,7 @@ // update the ui if it exists, returns null if no ui is passed/found ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) // No auto-refresh - ui = new(user, src, ui_key, "uplink.tmpl", title, 450, 600, state = inventory_state) + ui = new(user, src, ui_key, "uplink.tmpl", title, 630, 700, state = inventory_state) data["menu"] = 0 ui.set_initial_data(data) ui.open() @@ -146,8 +144,8 @@ nanoui_menu = text2num(href_list["menu"]) if(href_list["id"]) exploit_id = href_list["id"] - if(href_list["category"]) - category = locate(href_list["category"]) in uplink.categories + else if(href_list["category"]) + category = locate(href_list["category"]) in uplink.categories update_nano_data() return 1 @@ -162,14 +160,17 @@ nanoui_data["discount_name"] = discount_item ? discount_item.name : "" nanoui_data["discount_amount"] = (1-discount_amount)*100 nanoui_data["offer_expiry"] = worldtime2stationtime(next_offer_time) - else if(nanoui_menu == 1) - var/items[0] - for(var/datum/uplink_item/item in category.items) - if(item.can_view(src)) - var/cost = item.cost(uses, src) - if(!cost) cost = "???" - items[++items.len] = list("name" = item.name, "description" = replacetext(item.description(), "\n", "
"), "can_buy" = item.can_buy(src), "cost" = cost, "ref" = "\ref[item]") - nanoui_data["items"] = items + + if(category) + nanoui_data["current_category"] = category.name + var/items[0] + for(var/datum/uplink_item/item in category.items) + if(item.can_view(src)) + var/cost = item.cost(uses, src) + if(!cost) cost = "???" + items[++items.len] = list("name" = item.name, "description" = replacetext(item.description(), "\n", "
"), "can_buy" = item.can_buy(src), "cost" = cost, "ref" = "\ref[item]") + nanoui_data["items"] = items + else if(nanoui_menu == 2) var/permanentData[0] for(var/datum/data/record/L in sortRecord(data_core.locked)) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index fe1685ec70..602f6e3a66 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -66,7 +66,7 @@ if(ghost.mind && ghost.mind.current == R) R.key = ghost.key - R.stat = CONSCIOUS + R.set_stat(CONSCIOUS) dead_mob_list -= R living_mob_list |= R R.notify_ai(ROBOT_NOTIFICATION_NEW_UNIT) diff --git a/code/game/objects/items/stacks/fifty_spawner.dm b/code/game/objects/items/stacks/fifty_spawner.dm index 0be33e5829..6cd9051c6f 100644 --- a/code/game/objects/items/stacks/fifty_spawner.dm +++ b/code/game/objects/items/stacks/fifty_spawner.dm @@ -4,21 +4,15 @@ desc = "This item spawns stack of 50 of a given material." icon = 'icons/misc/mark.dmi' icon_state = "x4" -// var/material = "" var/obj/item/stack/type_to_spawn = null -/obj/fiftyspawner/New() - spawn() - //spawns the 50-stack and qdels self - ..() - if(istype(src.loc, /obj/structure/loot_pile)) //Spawning from a lootpile is weird, need to wait until we're out of it to do our work. - while(istype(src.loc, /obj/structure/loot_pile)) - sleep(1) - // var/obj_path = text2path("/obj/item/stack/[material]") - var/obj/item/stack/M = new type_to_spawn(src.loc) - M.amount = M.max_amount //some stuff spawns with 60, we're still calling it fifty - M.update_icon() // Some stacks have different sprites depending on how full they are. - qdel(src) +/obj/fiftyspawner/Initialize() + ..() //We're not returning . because we're going to ask to be deleted. + + var/obj/item/stack/M = new type_to_spawn(get_turf(src)) + M.amount = M.max_amount //some stuff spawns with 60, we're still calling it fifty + M.update_icon() // Some stacks have different sprites depending on how full they are. + return INITIALIZE_HINT_QDEL //Bye! /obj/fiftyspawner/rods name = "stack of rods" //this needs to be defined for cargo diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index fa84ea780f..9760e2da8a 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -446,7 +446,7 @@ /obj/item/toy/waterflower/examine(mob/user) if(..(user, 0)) - to_chat(user, "\icon[src] [src.reagents.total_volume] units of water left!") + to_chat(user, "[bicon(src)] [src.reagents.total_volume] units of water left!") /* * Bosun's whistle @@ -902,7 +902,7 @@ /obj/structure/plushie/attack_hand(mob/user) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - if(stored_item && !searching) + if(stored_item && opened && !searching) searching = TRUE if(do_after(user, 10)) to_chat(user, "You find \icon[stored_item] [stored_item] in [src]!") @@ -999,7 +999,7 @@ to_chat(user, "You can see something in there...") /obj/item/toy/plushie/attack_self(mob/user as mob) - if(stored_item && !searching) + if(stored_item && opened && !searching) searching = TRUE if(do_after(user, 10)) to_chat(user, "You find \icon[stored_item] [stored_item] in [src]!") diff --git a/code/game/objects/items/weapons/canes.dm b/code/game/objects/items/weapons/canes.dm new file mode 100644 index 0000000000..f7688fb2d1 --- /dev/null +++ b/code/game/objects/items/weapons/canes.dm @@ -0,0 +1,124 @@ +/obj/item/weapon/cane + name = "cane" + desc = "A cane used by a true gentleman." + icon = 'icons/obj/weapons.dmi' + icon_state = "cane" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi', + ) + force = 5.0 + throwforce = 7.0 + w_class = ITEMSIZE_NORMAL + matter = list(DEFAULT_WALL_MATERIAL = 50) + attack_verb = list("bludgeoned", "whacked", "disciplined", "thrashed") + +/obj/item/weapon/cane/crutch + name ="crutch" + desc = "A long stick with a crosspiece at the top, used to help with walking." + icon_state = "crutch" + item_state = "crutch" + +/obj/item/weapon/cane/concealed + var/concealed_blade + +/obj/item/weapon/cane/concealed/New() + ..() + var/obj/item/weapon/material/butterfly/switchblade/temp_blade = new(src) + concealed_blade = temp_blade + temp_blade.attack_self() + +/obj/item/weapon/cane/concealed/attack_self(var/mob/user) + var/datum/gender/T = gender_datums[user.get_visible_gender()] + if(concealed_blade) + user.visible_message("[user] has unsheathed \a [concealed_blade] from [T.his] [src]!", "You unsheathe \the [concealed_blade] from \the [src].") + // Calling drop/put in hands to properly call item drop/pickup procs + playsound(user.loc, 'sound/weapons/holster/sheathout.ogg', 50, 1) + user.drop_from_inventory(src) + user.put_in_hands(concealed_blade) + user.put_in_hands(src) + user.update_inv_l_hand(0) + user.update_inv_r_hand() + concealed_blade = null + else + ..() + +/obj/item/weapon/cane/concealed/attackby(var/obj/item/weapon/material/butterfly/W, var/mob/user) + if(!src.concealed_blade && istype(W)) + var/datum/gender/T = gender_datums[user.get_visible_gender()] + user.visible_message("[user] has sheathed \a [W] into [T.his] [src]!", "You sheathe \the [W] into \the [src].") + playsound(user.loc, 'sound/weapons/holster/sheathin.ogg', 50, 1) + user.drop_from_inventory(W) + W.loc = src + src.concealed_blade = W + update_icon() + else + ..() + +/obj/item/weapon/cane/concealed/update_icon() + if(concealed_blade) + name = initial(name) + icon_state = initial(icon_state) + item_state = initial(icon_state) + else + name = "cane shaft" + icon_state = "nullrod" + item_state = "foldcane" + +/obj/item/weapon/cane/white + name = "white cane" + desc = "A white cane. They are commonly used by the blind or visually impaired as a mobility tool or as a courtesy to others." + icon_state = "whitecane" + +/obj/item/weapon/cane/white/attack(mob/M as mob, mob/user as mob) + if(user.a_intent == I_HELP) + user.visible_message("\The [user] has lightly tapped [M] on the ankle with their white cane!") + return TRUE + else + . = ..() + + +//Code for Telescopic White Cane writen by Gozulio + +/obj/item/weapon/cane/white/collapsible + name = "telescopic white cane" + desc = "A telescopic white cane. They are commonly used by the blind or visually impaired as a mobility tool or as a courtesy to others." + icon_state = "whitecane1in" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi', + ) + slot_flags = SLOT_BELT + w_class = ITEMSIZE_SMALL + force = 3 + var/on = 0 + +/obj/item/weapon/cane/white/collapsible/attack_self(mob/user as mob) + on = !on + if(on) + user.visible_message("\The [user] extends the white cane.",\ + "You extend the white cane.",\ + "You hear an ominous click.") + icon_state = "whitecane1out" + item_state_slots = list(slot_r_hand_str = "whitecane", slot_l_hand_str = "whitecane") + w_class = ITEMSIZE_NORMAL + force = 5 + attack_verb = list("smacked", "struck", "cracked", "beaten") + else + user.visible_message("\The [user] collapses the white cane.",\ + "You collapse the white cane.",\ + "You hear a click.") + icon_state = "whitecane1in" + item_state_slots = list(slot_r_hand_str = null, slot_l_hand_str = null) + w_class = ITEMSIZE_SMALL + force = 3 + attack_verb = list("hit", "poked", "prodded") + + if(istype(user,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + H.update_inv_l_hand() + H.update_inv_r_hand() + + playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + add_fingerprint(user) + return TRUE \ No newline at end of file diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 6b2e8fbc46..0435e7f0a6 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -60,6 +60,15 @@ CIGARETTE PACKETS ARE IN FANCY.DM burn_out() return ..() +/obj/item/weapon/flame/match/proc/light(var/mob/user) + playsound(src, 'sound/items/cigs_lighters/matchstick_lit.ogg', 25, 0, -1) + lit = 1 + damtype = "burn" + icon_state = "match_lit" + name = "burning match" + desc = "A match. This one is presently on fire." + START_PROCESSING(SSobj, src) + /obj/item/weapon/flame/match/proc/burn_out() lit = 0 burnt = 1 diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 624dbae6a1..f44abcb96b 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -41,7 +41,7 @@ /obj/item/weapon/extinguisher/examine(mob/user) if(..(user, 0)) - to_chat(user, text("\icon[] [] contains [] units of water left!", src, src.name, src.reagents.total_volume)) + to_chat(user, "[bicon(src)] [src.name] contains [src.reagents.total_volume] units of water left!") /obj/item/weapon/extinguisher/attack_self(mob/user as mob) safety = !safety diff --git a/code/game/objects/items/weapons/id cards/station_ids.dm b/code/game/objects/items/weapons/id cards/station_ids.dm index 36725e6b15..c5f1fbc25e 100644 --- a/code/game/objects/items/weapons/id cards/station_ids.dm +++ b/code/game/objects/items/weapons/id cards/station_ids.dm @@ -91,8 +91,8 @@ return dat /obj/item/weapon/card/id/attack_self(mob/user as mob) - user.visible_message("\The [user] shows you: \icon[src] [src.name]. The assignment on the card: [src.assignment]",\ - "You flash your ID card: \icon[src] [src.name]. The assignment on the card: [src.assignment]") + user.visible_message("\The [user] shows you: [bicon(src)] [src.name]. The assignment on the card: [src.assignment]",\ + "You flash your ID card: [bicon(src)] [src.name]. The assignment on the card: [src.assignment]") src.add_fingerprint(user) return @@ -108,7 +108,7 @@ set category = "Object" set src in usr - to_chat(usr, "\icon[src] [src.name]: The current assignment on the card is [src.assignment].") + to_chat(usr, "[bicon(src)] [src.name]: The current assignment on the card is [src.assignment].") to_chat(usr, "The blood type on the card is [blood_type].") to_chat(usr, "The DNA hash on the card is [dna_hash].") to_chat(usr, "The fingerprint hash on the card is [fingerprint_hash].") diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm index 2db6fea0e6..29193b1c08 100644 --- a/code/game/objects/items/weapons/material/misc.dm +++ b/code/game/objects/items/weapons/material/misc.dm @@ -73,12 +73,14 @@ /obj/item/weapon/material/snow/snowball/attack_self(mob/user as mob) if(user.a_intent == I_HURT) - visible_message("[user] has smashed the snowball in their hand!", "You smash the snowball in your hand.") + //visible_message("[user] has smashed the snowball in their hand!", "You smash the snowball in your hand.") + to_chat(user, "You smash the snowball in your hand.") var/atom/S = new /obj/item/stack/material/snow(user.loc) del(src) user.put_in_hands(S) else - visible_message("[user] starts compacting the snowball.", "You start compacting the snowball.") + //visible_message("[user] starts compacting the snowball.", "You start compacting the snowball.") + to_chat(user, "You start compacting the snowball.") if(do_after(user, 2 SECONDS)) var/atom/S = new /obj/item/weapon/material/snow/snowball/reinforced(user.loc) del(src) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index bdbdef2eb1..fb6ae8f86f 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -407,17 +407,13 @@ can_hold = list(/obj/item/weapon/flame/match) starts_with = list(/obj/item/weapon/flame/match = 10) -/obj/item/weapon/storage/box/matches/attackby(obj/item/weapon/flame/match/W as obj, mob/user as mob) +/obj/item/weapon/storage/box/matches/attackby(var/obj/item/weapon/flame/match/W, var/mob/user) if(istype(W) && !W.lit && !W.burnt) if(prob(25)) - playsound(src.loc, 'sound/items/cigs_lighters/matchstick_lit.ogg', 25, 0, -1) + W.light(user) user.visible_message("[user] manages to light the match on the matchbox.") - W.lit = 1 - W.damtype = "burn" - W.icon_state = "match_lit" - START_PROCESSING(SSprocessing, W) else - playsound(src.loc, 'sound/items/cigs_lighters/matchstick_hit.ogg', 25, 0, -1) + playsound(src, 'sound/items/cigs_lighters/matchstick_hit.ogg', 25, 0, -1) W.update_icon() return diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index e000496f28..ec9e62c86b 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -46,12 +46,12 @@ desc = "A compact yet rebalanced personal defense weapon. Can be concealed when folded." icon = 'icons/obj/weapons.dmi' icon_state = "telebaton0" + item_state = "telebaton0" slot_flags = SLOT_BELT w_class = ITEMSIZE_SMALL force = 3 var/on = 0 - /obj/item/weapon/melee/telebaton/attack_self(mob/user as mob) on = !on if(on) @@ -59,6 +59,7 @@ "You extend the baton.",\ "You hear an ominous click.") icon_state = "telebaton1" + item_state = icon_state w_class = ITEMSIZE_NORMAL force = 15//quite robust attack_verb = list("smacked", "struck", "slapped") @@ -67,6 +68,7 @@ "You collapse the baton.",\ "You hear a click.") icon_state = "telebaton0" + item_state = icon_state w_class = ITEMSIZE_SMALL force = 3//not so robust now attack_verb = list("hit", "punched") diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm index ee528cb6f8..c4e273deea 100644 --- a/code/game/objects/items/weapons/syndie.dm +++ b/code/game/objects/items/weapons/syndie.dm @@ -50,7 +50,7 @@ icon_state = "c-4[size]_1" playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1) for(var/mob/O in hearers(src, null)) - O.show_message("\icon[src] The [src.name] beeps! ") + O.show_message("[bicon(src)] The [src.name] beeps! ") sleep(50) explosion(get_turf(src), devastate, heavy_impact, light_impact, flash_range) for(var/dirn in cardinal) //This is to guarantee that C4 at least breaks down all immediately adjacent walls and doors. diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 6230350851..f9697d15aa 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -78,7 +78,6 @@ var/list/global/tank_gauge_cache = list() if(istype(loc, /obj/item/device/transfer_valve)) var/obj/item/device/transfer_valve/TTV = loc TTV.remove_tank(src) - qdel(TTV) . = ..() @@ -329,6 +328,9 @@ var/list/global/tank_gauge_cache = list() /obj/item/weapon/tank/remove_air(amount) return air_contents.remove(amount) +/obj/item/weapon/tank/proc/remove_air_by_flag(flag, amount) + return air_contents.remove_by_flag(flag, amount) + /obj/item/weapon/tank/return_air() return air_contents @@ -465,7 +467,7 @@ var/list/global/tank_gauge_cache = list() return T.assume_air(air_contents) playsound(get_turf(src), 'sound/weapons/Gunshot_shotgun.ogg', 20, 1) - visible_message("\icon[src] \The [src] flies apart!", "You hear a bang!") + visible_message("[bicon(src)] \The [src] flies apart!", "You hear a bang!") T.hotspot_expose(air_contents.temperature, 70, 1) @@ -510,7 +512,7 @@ var/list/global/tank_gauge_cache = list() T.assume_air(leaked_gas) if(!leaking) - visible_message("\icon[src] \The [src] relief valve flips open with a hiss!", "You hear hissing.") + visible_message("[bicon(src)] \The [src] relief valve flips open with a hiss!", "You hear hissing.") playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3) leaking = 1 #ifdef FIREDBG diff --git a/code/game/objects/items/weapons/tools/combitool.dm b/code/game/objects/items/weapons/tools/combitool.dm index 96b64d18f7..b154f059af 100644 --- a/code/game/objects/items/weapons/tools/combitool.dm +++ b/code/game/objects/items/weapons/tools/combitool.dm @@ -27,7 +27,7 @@ if(loc == usr && tools.len) to_chat(usr, "It has the following fittings:") for(var/obj/item/tool in tools) - to_chat(usr, "\icon[tool] - [tool.name][tools[current_tool]==tool?" (selected)":""]") + to_chat(usr, "[bicon(tool)] - [tool.name][tools[current_tool]==tool?" (selected)":""]") /obj/item/weapon/combitool/New() ..() diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 14bdfa3778..c4a4c59f6e 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -58,7 +58,7 @@ /obj/item/weapon/weldingtool/examine(mob/user) if(..(user, 0)) if(max_fuel) - to_chat(user, text("\icon[] The [] contains []/[] units of fuel!", src, src.name, get_fuel(),src.max_fuel )) + to_chat(user, "[bicon(src)] The [src.name] contains [get_fuel()]/[src.max_fuel] units of fuel!") /obj/item/weapon/weldingtool/attack(atom/A, mob/living/user, def_zone) if(ishuman(A) && user.a_intent == I_HELP) @@ -560,9 +560,9 @@ to_chat(user, desc) else if(power_supply) - to_chat(user, "\icon[src] The [src.name] has [get_fuel()] charge left.") + to_chat(user, "[bicon(src)] The [src.name] has [get_fuel()] charge left.") else - to_chat(user, "\icon[src] The [src.name] has no power cell!") + to_chat(user, "[bicon(src)] The [src.name] has no power cell!") /obj/item/weapon/weldingtool/electric/get_fuel() if(use_external_power) diff --git a/code/game/objects/items/weapons/weldbackpack.dm b/code/game/objects/items/weapons/weldbackpack.dm index 856020e52a..2f946a5942 100644 --- a/code/game/objects/items/weapons/weldbackpack.dm +++ b/code/game/objects/items/weapons/weldbackpack.dm @@ -145,7 +145,7 @@ /obj/item/weapon/weldpack/examine(mob/user) ..(user) - to_chat(user, "\icon[src] [src.reagents.total_volume] units of fuel left!") + to_chat(user, "[bicon(src)] [src.reagents.total_volume] units of fuel left!") return /obj/item/weapon/weldpack/survival diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index c7b8c07f8d..faafdb62f3 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -58,7 +58,7 @@ /obj/CanUseTopic(var/mob/user, var/datum/topic_state/state = default_state) if(user.CanUseObjTopic(src)) return ..() - to_chat(user, "\icon[src]Access Denied!") + to_chat(user, "[bicon(src)]Access Denied!") return STATUS_CLOSE /mob/living/silicon/CanUseObjTopic(var/obj/O) diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index a7a4b77823..e9af3ce4b2 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -64,10 +64,9 @@ icon_state = "vehiclecrate" /obj/structure/largecrate/vehicle/Initialize() - ..() - spawn(1) - for(var/obj/O in contents) - O.update_icon() + . = ..() + for(var/obj/O in contents) + O.update_icon() /obj/structure/largecrate/vehicle/bike name = "spacebike crate" diff --git a/code/game/objects/structures/ghost_pods/ghost_pods.dm b/code/game/objects/structures/ghost_pods/ghost_pods.dm index 970b1d2fff..cc0cba34b5 100644 --- a/code/game/objects/structures/ghost_pods/ghost_pods.dm +++ b/code/game/objects/structures/ghost_pods/ghost_pods.dm @@ -61,18 +61,13 @@ /obj/structure/ghost_pod/automatic/Initialize() . = ..() - spawn(delay_to_self_open) - if(src) - trigger() + addtimer(CALLBACK(src, .proc/trigger), delay_to_self_open) /obj/structure/ghost_pod/automatic/trigger() . = ..() if(. == FALSE) // If we failed to get a volunteer, try again later if allowed to. if(delay_to_try_again) - spawn(delay_to_try_again) - if(src) - trigger() - + addtimer(CALLBACK(src, .proc/trigger), delay_to_try_again) // This type is triggered by a ghost clicking on it, as opposed to a living player. A ghost query type isn't needed. /obj/structure/ghost_pod/ghost_activated diff --git a/code/game/objects/structures/holoplant.dm b/code/game/objects/structures/holoplant.dm index bbd92b81ee..9a46b8ca15 100644 --- a/code/game/objects/structures/holoplant.dm +++ b/code/game/objects/structures/holoplant.dm @@ -48,13 +48,13 @@ plant = prepare_icon(emagged ? "emagged" : null) overlays += plant set_light(2) - use_power = 2 + use_power = USE_POWER_ACTIVE /obj/machinery/holoplant/proc/deactivate() overlays -= plant QDEL_NULL(plant) set_light(0) - use_power = 0 + use_power = USE_POWER_OFF /obj/machinery/holoplant/power_change() ..() diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 6e01e0035e..93c48fe8a9 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -25,7 +25,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) /obj/structure/janitorialcart/examine(mob/user) if(..(user, 1)) - to_chat(user, "[src] \icon[src] contains [reagents.total_volume] unit\s of liquid!") + to_chat(user, "[src] [bicon(src)] contains [reagents.total_volume] unit\s of liquid!") //everything else is visible, so doesn't need to be mentioned @@ -189,7 +189,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) if(!..(user, 1)) return - to_chat(user, "\icon[src] This [callme] contains [reagents.total_volume] unit\s of water!") + to_chat(user, "[bicon(src)] This [callme] contains [reagents.total_volume] unit\s of water!") if(mybag) to_chat(user, "\A [mybag] is hanging on the [callme].") diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index 714f2cbfc9..0fff00df19 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -18,7 +18,7 @@ GLOBAL_LIST_BOILERPLATE(all_mopbuckets, /obj/structure/mopbucket) /obj/structure/mopbucket/examine(mob/user) if(..(user, 1)) - to_chat(user, "[src] \icon[src] contains [reagents.total_volume] unit\s of water!") + to_chat(user, "[src] [bicon(src)] contains [reagents.total_volume] unit\s of water!") /obj/structure/mopbucket/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/weapon/mop)) diff --git a/code/game/objects/structures/props/beam_prism.dm b/code/game/objects/structures/props/beam_prism.dm index f5c4c3d3c0..b0122ace47 100644 --- a/code/game/objects/structures/props/beam_prism.dm +++ b/code/game/objects/structures/props/beam_prism.dm @@ -197,16 +197,18 @@ P.rotate_auto(new_bearing) /obj/structure/prop/prismcontrol/Initialize() - ..() + . = ..() if(my_turrets.len) //Preset controls. for(var/obj/structure/prop/prism/P in my_turrets) P.remote_dial = src - return - spawn() - for(var/obj/structure/prop/prism/P in orange(src, world.view)) //Don't search a huge area. - if(P.dialID == dialID && !P.remote_dial && P.external_control_lock) - my_turrets |= P - P.remote_dial = src + else + . = INITIALIZE_HINT_LATELOAD + +/obj/structure/prop/prismcontrol/LateInitialize() + for(var/obj/structure/prop/prism/P in orange(src, world.view)) //Don't search a huge area. + if(P.dialID == dialID && !P.remote_dial && P.external_control_lock) + my_turrets |= P + P.remote_dial = src /obj/structure/prop/prismcontrol/Destroy() for(var/obj/structure/prop/prism/P in my_turrets) diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 58b5d622fd..5f136bbe5d 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -8,11 +8,9 @@ buckle_lying = 0 //force people to sit up in chairs when buckled var/propelled = 0 // Check for fire-extinguisher-driven chairs -/obj/structure/bed/chair/New() - ..() //Todo make metal/stone chairs display as thrones - spawn(3) //sorry. i don't think there's a better way to do this. - update_layer() - return +/obj/structure/bed/chair/Initialize() + . = ..() + update_layer() /obj/structure/bed/chair/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 4b4d0e90cc..467579a225 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -124,7 +124,7 @@ icon_state = "shower" density = 0 anchored = 1 - use_power = 0 + use_power = USE_POWER_OFF var/on = 0 var/obj/effect/mist/mymist = null var/ismist = 0 //needs a var so we can make it linger~ diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index c4facdaa20..353df5ecb8 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -192,7 +192,7 @@ obj/structure/windoor_assembly/Destroy() if(src.electronics && istype(src.electronics, /obj/item/weapon/circuitboard/broken)) to_chat(usr,"The assembly has broken airlock electronics.") return - to_chat(usr,browse(null, "window=windoor_access")) //Not sure what this actually does... -Ner + usr << browse(null, "window=windoor_access") //Not sure what this actually does... -Ner playsound(src, W.usesound, 100, 1) user.visible_message("[user] pries the windoor into the frame.", "You start prying the windoor into the frame.") diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 344428c1f2..208c8473ab 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -441,6 +441,13 @@ //this way it will only update full-tile ones overlays.Cut() if(!is_fulltile()) + // Rotate the sprite somewhat so non-fulltiled windows can be seen as needing repair. + var/full_tilt_degrees = 15 + var/tilt_to_apply = abs((health / maxhealth) - 1) + if(tilt_to_apply && prob(50)) + tilt_to_apply = -tilt_to_apply + adjust_rotation(LERP(0, full_tilt_degrees, tilt_to_apply)) + icon_state = "[basestate]" return var/list/dirs = list() diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 21488e5f26..9e48b3777c 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -55,8 +55,8 @@ B.clean_blood() ..() -/turf/simulated/New() - ..() +/turf/simulated/Initialize(mapload) + . = ..() if(istype(loc, /area/chapel)) holy = 1 levelupdate() diff --git a/code/game/turfs/simulated/dungeon/wall.dm b/code/game/turfs/simulated/dungeon/wall.dm index 3bae19db69..2bfc23145e 100644 --- a/code/game/turfs/simulated/dungeon/wall.dm +++ b/code/game/turfs/simulated/dungeon/wall.dm @@ -3,8 +3,8 @@ /turf/simulated/wall/dungeon block_tele = TRUE // Anti-cheese. -/turf/simulated/wall/dungeon/New(var/newloc) - ..(newloc,"dungeonium") +/turf/simulated/wall/dungeon/Initialize(mapload) + . = ..(mapload, "dungeonium") /turf/simulated/wall/dungeon/attackby() return @@ -20,8 +20,8 @@ var/rock_side = "rock_side" block_tele = TRUE -/turf/simulated/wall/solidrock/New(var/newloc) - ..(newloc,"bedrock") +/turf/simulated/wall/solidrock/Initialize(mapload) + . = ..(mapload, "bedrock") /turf/simulated/wall/solidrock/Initialize() . = ..() @@ -81,8 +81,8 @@ desc = "An old, yet impressively durably rock wall." var/mossyrock_side = "mossyrock_side" -/turf/simulated/wall/solidrock/New(var/newloc) - ..(newloc,"mossyrock") +/turf/simulated/wall/solidrock/Initialize(mapload) + . = ..(mapload, "mossyrock") /turf/simulated/wall/solidrock/mossyrockpoi/update_icon(var/update_neighbors) if(density) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 2c7f8ff12e..866103376a 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -20,6 +20,8 @@ 'sound/effects/footstep/plating4.ogg', 'sound/effects/footstep/plating5.ogg')) + var/list/old_decals = null + // Flooring data. var/flooring_override var/initial_flooring @@ -33,12 +35,12 @@ /turf/simulated/floor/is_plating() return !flooring -/turf/simulated/floor/New(var/newloc, var/floortype) - ..(newloc) +/turf/simulated/floor/Initialize(mapload, floortype) + . = ..() if(!floortype && initial_flooring) floortype = initial_flooring if(floortype) - set_flooring(get_flooring_data(floortype)) + set_flooring(get_flooring_data(floortype), TRUE) else footstep_sounds = base_footstep_sounds if(can_dirty && can_start_dirty) @@ -46,8 +48,15 @@ dirt += rand(50,100) update_dirt() //5% chance to start with dirt on a floor tile- give the janitor something to do -/turf/simulated/floor/proc/set_flooring(var/decl/flooring/newflooring) +/turf/simulated/floor/proc/swap_decals() + var/current_decals = decals + decals = old_decals + old_decals = current_decals + +/turf/simulated/floor/proc/set_flooring(var/decl/flooring/newflooring, var/initializing) make_plating(defer_icon_update = 1) + if(!flooring && !initializing) // Plating -> Flooring + swap_decals() flooring = newflooring footstep_sounds = newflooring.footstep_sounds update_icon(1) @@ -56,11 +65,7 @@ //This proc will set floor_type to null and the update_icon() proc will then change the icon_state of the turf //This proc auto corrects the grass tiles' siding. /turf/simulated/floor/proc/make_plating(var/place_product, var/defer_icon_update) - cut_overlays() - if(islist(decals)) - decals.Cut() - decals = null name = base_name desc = base_desc @@ -68,7 +73,8 @@ icon_state = base_icon_state footstep_sounds = base_footstep_sounds - if(flooring) + if(flooring) // Flooring -> Plating + swap_decals() if(flooring.build_type && place_product) new flooring.build_type(src) flooring = null diff --git a/code/game/turfs/simulated/floor_types.dm b/code/game/turfs/simulated/floor_types.dm index bf93dcb8a2..151efd819c 100644 --- a/code/game/turfs/simulated/floor_types.dm +++ b/code/game/turfs/simulated/floor_types.dm @@ -83,11 +83,31 @@ var/turf/under_turf //Underlay override turf path. var/join_flags = 0 //Bitstring to represent adjacency of joining walls var/join_group = "shuttle" //A tag for what other walls to join with. Null if you don't want them to. + var/static/list/antilight_cache + +/turf/simulated/shuttle/Initialize(mapload) + ..() + if(!antilight_cache) + antilight_cache = list() + for(var/diag in cornerdirs) + var/image/I = image(LIGHTING_ICON, null, icon_state = "diagonals", layer = 10, dir = diag) + I.plane = PLANE_LIGHTING + antilight_cache["[diag]"] = I /turf/simulated/shuttle/Destroy() landed_holder = null ..() +// For joined corners touching static lighting turfs, add an overlay to cancel out that part of our lighting overlay. +/turf/simulated/shuttle/proc/update_breaklights() + if(join_flags in cornerdirs) //We're joined at an angle + //Dynamic lighting dissolver + var/turf/T = get_step(src, turn(join_flags,180)) + if(!T || !T.dynamic_lighting || !get_area(T).dynamic_lighting) + add_overlay(antilight_cache["[join_flags]"], TRUE) + return + cut_overlay(antilight_cache["[join_flags]"], TRUE) + /turf/simulated/shuttle/proc/underlay_update() if(!takes_underlays) //Basically, if it's not forced, and we don't care, don't do it. @@ -103,11 +123,19 @@ //Well if this isn't our first rodeo, we know EXACTLY what we landed on, and it looks like this. if(landed_holder && !interior_corner) - var/mutable_appearance/landed_on = new(landed_holder) - landed_on.layer = FLOAT_LAYER //Not turf - landed_on.plane = FLOAT_PLANE //Not turf - us.underlays = list(landed_on) - appearance = us + //Space gets special treatment + if(ispath(landed_holder.turf_type, /turf/space)) + var/image/spaceimage = image(landed_holder.icon, landed_holder.icon_state) + spaceimage.plane = SPACE_PLANE + underlays = list(spaceimage) + else + var/mutable_appearance/landed_on = new(landed_holder) + landed_on.layer = FLOAT_LAYER //Not turf + landed_on.plane = FLOAT_PLANE //Not turf + us.underlays = list(landed_on) + appearance = us + + spawn update_breaklights() //So that we update the breaklight overlays only after turfs are connected return if(!under) @@ -143,12 +171,15 @@ under_ma = new(under) if(under_ma) - if(ispath(under,/turf/space)) //Scramble space turfs - under_ma.icon_state = "[rand(1,25)]" + if(ispath(under,/turf/space) || istype(under,/turf/space)) //Space gets weird treatment + under_ma.icon_state = "white" + under_ma.plane = SPACE_PLANE us.underlays = list(under_ma) appearance = us + spawn update_breaklights() //So that we update the breaklight overlays only after turfs are connected + return under /turf/simulated/shuttle/floor diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm index acf0c17317..01ad912b70 100644 --- a/code/game/turfs/simulated/lava.dm +++ b/code/game/turfs/simulated/lava.dm @@ -39,15 +39,15 @@ /turf/simulated/floor/lava/Entered(atom/movable/AM) if(burn_stuff(AM)) - START_PROCESSING(SSobj, src) + START_PROCESSING(SSturfs, src) /turf/simulated/floor/lava/hitby(atom/movable/AM) if(burn_stuff(AM)) - START_PROCESSING(SSobj, src) + START_PROCESSING(SSturfs, src) /turf/simulated/floor/lava/process() if(!burn_stuff()) - STOP_PROCESSING(SSobj, src) + return PROCESS_KILL /turf/simulated/floor/lava/proc/is_safe() //if anything matching this typecache is found in the lava, we don't burn things diff --git a/code/game/turfs/simulated/outdoors/outdoors.dm b/code/game/turfs/simulated/outdoors/outdoors.dm index 9e9929305e..42016e8081 100644 --- a/code/game/turfs/simulated/outdoors/outdoors.dm +++ b/code/game/turfs/simulated/outdoors/outdoors.dm @@ -24,10 +24,10 @@ var/list/turf_edge_cache = list() update_icon() . = ..() -/turf/simulated/floor/New() +/turf/simulated/floor/Initialize(mapload) if(outdoors) SSplanets.addTurf(src) - ..() + . = ..() /turf/simulated/floor/Destroy() if(outdoors) diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index f9ae1e7bc3..1ef11c40de 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -232,7 +232,7 @@ if(WT.remove_fuel(0,user)) to_chat(user, "You start repairing the damage to [src].") - playsound(src.loc, WT.usesound, 100, 1) + playsound(src, WT.usesound, 100, 1) if(do_after(user, max(5, damage / 5) * WT.toolspeed) && WT && WT.isOn()) to_chat(user, "You finish repairing the damage to [src].") take_damage(-damage) diff --git a/code/game/turfs/simulated/wall_types.dm b/code/game/turfs/simulated/wall_types.dm index bff82d6e0e..96979c8452 100644 --- a/code/game/turfs/simulated/wall_types.dm +++ b/code/game/turfs/simulated/wall_types.dm @@ -1,89 +1,89 @@ /turf/simulated/wall/r_wall icon_state = "rgeneric" -/turf/simulated/wall/r_wall/New(var/newloc) - ..(newloc, "plasteel","plasteel") //3strong +/turf/simulated/wall/r_wall/Initialize(mapload) + . = ..(mapload, "plasteel","plasteel") //3strong -/turf/simulated/wall/shull/New(var/newloc) //Spaaaace ship. - ..(newloc, MAT_STEELHULL, null, MAT_STEELHULL) -/turf/simulated/wall/rshull/New(var/newloc) - ..(newloc, MAT_STEELHULL, MAT_STEELHULL, MAT_STEELHULL) -/turf/simulated/wall/pshull/New(var/newloc) //Spaaaace-er ship. - ..(newloc, MAT_PLASTEELHULL, null, MAT_PLASTEELHULL) -/turf/simulated/wall/rpshull/New(var/newloc) - ..(newloc, MAT_PLASTEELHULL, MAT_PLASTEELHULL, MAT_PLASTEELHULL) -/turf/simulated/wall/dshull/New(var/newloc) //Spaaaace-est ship. - ..(newloc, MAT_DURASTEELHULL, null, MAT_DURASTEELHULL) -/turf/simulated/wall/rdshull/New(var/newloc) - ..(newloc, MAT_DURASTEELHULL, MAT_DURASTEELHULL, MAT_DURASTEELHULL) -/turf/simulated/wall/thull/New(var/newloc) - ..(newloc, MAT_TITANIUMHULL, null, MAT_TITANIUMHULL) -/turf/simulated/wall/rthull/New(var/newloc) - ..(newloc, MAT_TITANIUMHULL, MAT_TITANIUMHULL, MAT_TITANIUMHULL) +/turf/simulated/wall/shull/Initialize(mapload) //Spaaaace ship. + . = ..(mapload, MAT_STEELHULL, null, MAT_STEELHULL) +/turf/simulated/wall/rshull/Initialize(mapload) + . = ..(mapload, MAT_STEELHULL, MAT_STEELHULL, MAT_STEELHULL) +/turf/simulated/wall/pshull/Initialize(mapload) //Spaaaace-er ship. + . = ..(mapload, MAT_PLASTEELHULL, null, MAT_PLASTEELHULL) +/turf/simulated/wall/rpshull/Initialize(mapload) + . = ..(mapload, MAT_PLASTEELHULL, MAT_PLASTEELHULL, MAT_PLASTEELHULL) +/turf/simulated/wall/dshull/Initialize(mapload) //Spaaaace-est ship. + . = ..(mapload, MAT_DURASTEELHULL, null, MAT_DURASTEELHULL) +/turf/simulated/wall/rdshull/Initialize(mapload) + . = ..(mapload, MAT_DURASTEELHULL, MAT_DURASTEELHULL, MAT_DURASTEELHULL) +/turf/simulated/wall/thull/Initialize(mapload) + . = ..(mapload, MAT_TITANIUMHULL, null, MAT_TITANIUMHULL) +/turf/simulated/wall/rthull/Initialize(mapload) + . = ..(mapload, MAT_TITANIUMHULL, MAT_TITANIUMHULL, MAT_TITANIUMHULL) /turf/simulated/wall/cult icon_state = "cult" -/turf/simulated/wall/cult/New(var/newloc) - ..(newloc,"cult","cult2","cult") +/turf/simulated/wall/cult/Initialize(mapload) + . = ..(mapload, "cult","cult2","cult") /turf/unsimulated/wall/cult name = "cult wall" desc = "Hideous images dance beneath the surface." icon = 'icons/turf/wall_masks.dmi' icon_state = "cult" -/turf/simulated/wall/iron/New(var/newloc) - ..(newloc,"iron") -/turf/simulated/wall/uranium/New(var/newloc) - ..(newloc,"uranium") -/turf/simulated/wall/diamond/New(var/newloc) - ..(newloc,"diamond") -/turf/simulated/wall/gold/New(var/newloc) - ..(newloc,"gold") -/turf/simulated/wall/silver/New(var/newloc) - ..(newloc,"silver") -/turf/simulated/wall/lead/New(var/newloc) - ..(newloc,"lead") -/turf/simulated/wall/r_lead/New(var/newloc) - ..(newloc,"lead", "lead") -/turf/simulated/wall/phoron/New(var/newloc) - ..(newloc,"phoron") -/turf/simulated/wall/sandstone/New(var/newloc) - ..(newloc,"sandstone") -/turf/simulated/wall/ironphoron/New(var/newloc) - ..(newloc,"iron","phoron") -/turf/simulated/wall/golddiamond/New(var/newloc) - ..(newloc,"gold","diamond") -/turf/simulated/wall/silvergold/New(var/newloc) - ..(newloc,"silver","gold") -/turf/simulated/wall/sandstonediamond/New(var/newloc) - ..(newloc,"sandstone","diamond") -/turf/simulated/wall/snowbrick/New(var/newloc) - ..(newloc,"packed snow") +/turf/simulated/wall/iron/Initialize(mapload) + . = ..(mapload, "iron") +/turf/simulated/wall/uranium/Initialize(mapload) + . = ..(mapload, "uranium") +/turf/simulated/wall/diamond/Initialize(mapload) + . = ..(mapload, "diamond") +/turf/simulated/wall/gold/Initialize(mapload) + . = ..(mapload, "gold") +/turf/simulated/wall/silver/Initialize(mapload) + . = ..(mapload, "silver") +/turf/simulated/wall/lead/Initialize(mapload) + . = ..(mapload, "lead") +/turf/simulated/wall/r_lead/Initialize(mapload) + . = ..(mapload, "lead", "lead") +/turf/simulated/wall/phoron/Initialize(mapload) + . = ..(mapload, "phoron") +/turf/simulated/wall/sandstone/Initialize(mapload) + . = ..(mapload, "sandstone") +/turf/simulated/wall/ironphoron/Initialize(mapload) + . = ..(mapload, "iron","phoron") +/turf/simulated/wall/golddiamond/Initialize(mapload) + . = ..(mapload, "gold","diamond") +/turf/simulated/wall/silvergold/Initialize(mapload) + . = ..(mapload, "silver","gold") +/turf/simulated/wall/sandstonediamond/Initialize(mapload) + . = ..(mapload, "sandstone","diamond") +/turf/simulated/wall/snowbrick/Initialize(mapload) + . = ..(mapload, "packed snow") -/turf/simulated/wall/resin/New(var/newloc) - ..(newloc,"resin",null,"resin") +/turf/simulated/wall/resin/Initialize(mapload) + . = ..(mapload, "resin",null,"resin") // Kind of wondering if this is going to bite me in the butt. -/turf/simulated/wall/skipjack/New(var/newloc) - ..(newloc,"alienalloy") +/turf/simulated/wall/skipjack/Initialize(mapload) + . = ..(mapload, "alienalloy") /turf/simulated/wall/skipjack/attackby() return -/turf/simulated/wall/titanium/New(var/newloc) - ..(newloc,"titanium") +/turf/simulated/wall/titanium/Initialize(mapload) + . = ..(mapload, "titanium") -/turf/simulated/wall/durasteel/New(var/newloc) - ..(newloc,"durasteel", "durasteel") +/turf/simulated/wall/durasteel/Initialize(mapload) + . = ..(mapload, "durasteel", "durasteel") -/turf/simulated/wall/wood/New(var/newloc) - ..(newloc, MAT_WOOD) +/turf/simulated/wall/wood/Initialize(mapload) + . = ..(mapload, MAT_WOOD) -/turf/simulated/wall/sifwood/New(var/newloc) - ..(newloc, MAT_SIFWOOD) +/turf/simulated/wall/sifwood/Initialize(mapload) + . = ..(mapload, MAT_SIFWOOD) -/turf/simulated/wall/log/New(var/newloc) - ..(newloc, MAT_LOG) +/turf/simulated/wall/log/Initialize(mapload) + . = ..(mapload, MAT_LOG) -/turf/simulated/wall/log_sif/New(var/newloc) - ..(newloc, MAT_SIFLOG) +/turf/simulated/wall/log_sif/Initialize(mapload) + . = ..(mapload, MAT_SIFLOG) // Shuttle Walls /turf/simulated/shuttle/wall @@ -152,16 +152,14 @@ icon_state = "alien-nj" join_group = null -/turf/simulated/shuttle/wall/New() - ..() - //To allow mappers to rename shuttle walls to like "redfloor interior" or whatever for ease of use. - name = true_name - /turf/simulated/shuttle/wall/Initialize() . = ..() + //To allow mappers to rename shuttle walls to like "redfloor interior" or whatever for ease of use. + name = true_name + if(join_group) - src.auto_join() + auto_join() else icon_state = base_state diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index bf5f711b20..cbb9c6dbb7 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -27,8 +27,8 @@ for(var/obj/O in src) O.hide(1) -/turf/simulated/wall/New(var/newloc, var/materialtype, var/rmaterialtype, var/girdertype) - ..(newloc) +/turf/simulated/wall/Initialize(mapload, materialtype, rmaterialtype, girdertype) + . = ..() icon_state = "blank" if(!materialtype) materialtype = DEFAULT_WALL_MATERIAL @@ -231,10 +231,25 @@ // Wall-rot effect, a nasty fungus that destroys walls. /turf/simulated/wall/proc/rot() if(locate(/obj/effect/overlay/wallrot) in src) - return + return FALSE + + // Wall-rot can't go onto walls that are surrounded in all four cardinal directions. + // Because of spores, or something. It's actually to avoid the pain that is removing wallrot surrounded by + // four r-walls. + var/at_least_one_open_turf = FALSE + for(var/direction in GLOB.cardinal) + var/turf/T = get_step(src, direction) + if(!T.check_density()) + at_least_one_open_turf = TRUE + break + + if(!at_least_one_open_turf) + return FALSE + var/number_rots = rand(2,3) for(var/i=0, iMovement is admin-disabled.
") //This is to identify lag problems - return +/turf/space/Entered(var/atom/movable/A) ..() - if ((!(A) || src != A.loc)) return + + if (!A || src != A.loc) + return inertial_drift(A) - if(ticker && ticker.mode) - - // Okay, so let's make it so that people can travel z levels but not nuke disks! - // if(ticker.mode.name == "mercenary") return - if (A.x <= TRANSITIONEDGE || A.x >= (world.maxx - TRANSITIONEDGE + 1) || A.y <= TRANSITIONEDGE || A.y >= (world.maxy - TRANSITIONEDGE + 1)) - A.touch_map_edge() + if(edge && ticker?.mode) + A.touch_map_edge() /turf/space/proc/Sandbox_Spacemove(atom/movable/A as mob|obj) var/cur_x diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index 0bfcb4e0f6..02c589e966 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -1,5 +1,4 @@ /turf/space/transit - keep_sprite = TRUE can_build_into_floor = FALSE var/pushdirection // push things that get caught in the transit tile this direction @@ -7,87 +6,26 @@ /turf/space/transit/attackby(obj/O as obj, mob/user as mob) return -//generates a list used to randomize transit animations so they aren't in lockstep -/turf/space/transit/proc/get_cross_shift_list(var/size) - var/list/result = list() - - result += rand(0, 14) - for(var/i in 2 to size) - var/shifts = list(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) - shifts -= result[i - 1] //consecutive shifts should not be equal - if(i == size) - shifts -= result[1] //because shift list is a ring buffer - result += pick(shifts) - - return result +/turf/space/transit/Initialize() + . = ..() + toggle_transit(reverse_dir[pushdirection]) //------------------------ /turf/space/transit/north // moving to the north icon_state = "arrow-north" pushdirection = SOUTH // south because the space tile is scrolling south - var/static/list/phase_shift_by_x - -/turf/space/transit/north/New() - ..() - if(!phase_shift_by_x) - phase_shift_by_x = get_cross_shift_list(15) - - var/x_shift = phase_shift_by_x[src.x % (phase_shift_by_x.len - 1) + 1] - var/transit_state = (world.maxy - src.y + x_shift)%15 + 1 - - icon_state = "speedspace_ns_[transit_state]" -//------------------------ /turf/space/transit/south // moving to the south icon_state = "arrow-south" pushdirection = SOUTH // south because the space tile is scrolling south - var/static/list/phase_shift_by_x - -/turf/space/transit/south/New() - ..() - if(!phase_shift_by_x) - phase_shift_by_x = get_cross_shift_list(15) - - var/x_shift = phase_shift_by_x[src.x % (phase_shift_by_x.len - 1) + 1] - var/transit_state = (world.maxy - src.y + x_shift)%15 + 1 - - var/icon/I = new(icon, "speedspace_ns_[transit_state]") - I.Flip(SOUTH) - icon = I -//------------------------ /turf/space/transit/east // moving to the east icon_state = "arrow-east" pushdirection = WEST - var/static/list/phase_shift_by_y - -/turf/space/transit/east/New() - ..() - if(!phase_shift_by_y) - phase_shift_by_y = get_cross_shift_list(15) - - var/y_shift = phase_shift_by_y[src.y % (phase_shift_by_y.len - 1) + 1] - var/transit_state = (world.maxx - src.x + y_shift)%15 + 1 - - icon_state = "speedspace_ew_[transit_state]" -//------------------------ /turf/space/transit/west // moving to the west icon_state = "arrow-west" pushdirection = WEST - var/static/list/phase_shift_by_y - -/turf/space/transit/west/New() - ..() - if(!phase_shift_by_y) - phase_shift_by_y = get_cross_shift_list(15) - - var/y_shift = phase_shift_by_y[src.y % (phase_shift_by_y.len - 1) + 1] - var/transit_state = (world.maxx - src.x + y_shift)%15 + 1 - - var/icon/I = new(icon, "speedspace_ew_[transit_state]") - I.Flip(WEST) - icon = I //------------------------ \ No newline at end of file diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 8abd2f44fa..75ba6dae11 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -34,26 +34,22 @@ var/can_build_into_floor = FALSE // Used for things like RCDs (and maybe lattices/floor tiles in the future), to see if a floor should replace it. var/list/dangerous_objects // List of 'dangerous' objs that the turf holds that can cause something bad to happen when stepped on, used for AI mobs. -/turf/New() - ..() - for(var/atom/movable/AM as mob|obj in src) - spawn( 0 ) - src.Entered(AM) - return - turfs |= src - - if(dynamic_lighting) - luminosity = 0 - else - luminosity = 1 +/turf/Initialize(mapload) + . = ..() + for(var/atom/movable/AM in src) + Entered(AM) + //Lighting related + luminosity = !(dynamic_lighting) + has_opaque_atom |= (opacity) + + //Pathfinding related if(movement_cost && pathweight == 1) // This updates pathweight automatically. pathweight = movement_cost /turf/Destroy() - turfs -= src + . = QDEL_HINT_IWILLGC ..() - return QDEL_HINT_IWILLGC /turf/ex_act(severity) return 0 @@ -270,20 +266,23 @@ var/const/enterloopsanity = 100 for(var/obj/O in src) O.hide(O.hides_under_flooring() && !is_plating()) -/turf/proc/AdjacentTurfs() - var/L[] = new() - for(var/turf/simulated/t in oview(src,1)) - if(!t.density) - if(!LinkBlocked(src, t) && !TurfBlockedNonWindow(t)) - L.Add(t) - return L +/turf/proc/AdjacentTurfs(var/check_blockage = TRUE) + . = list() + for(var/t in (trange(1,src) - src)) + var/turf/T = t + if(check_blockage) + if(!T.density) + if(!LinkBlocked(src, T) && !TurfBlockedNonWindow(T)) + . += t + else + . += t -/turf/proc/CardinalTurfs() - var/L[] = new() - for(var/turf/simulated/T in AdjacentTurfs()) +/turf/proc/CardinalTurfs(var/check_blockage = TRUE) + . = list() + for(var/ad in AdjacentTurfs(check_blockage)) + var/turf/T = ad if(T.x == src.x || T.y == src.y) - L.Add(T) - return L + . += T /turf/proc/Distance(turf/t) if(get_dist(src,t) == 1) diff --git a/code/game/turfs/unsimulated/beach.dm b/code/game/turfs/unsimulated/beach.dm index 82206926cf..52c2618a79 100644 --- a/code/game/turfs/unsimulated/beach.dm +++ b/code/game/turfs/unsimulated/beach.dm @@ -14,9 +14,10 @@ /turf/unsimulated/beach/water name = "Water" icon_state = "water" + initialized = FALSE -/turf/unsimulated/beach/water/New() - ..() +/turf/unsimulated/beach/water/Initialize() + . = ..() add_overlay(image("icon"='icons/misc/beach.dmi',"icon_state"="water2","layer"=MOB_LAYER+0.1)) /turf/simulated/floor/beach @@ -42,6 +43,6 @@ /turf/simulated/floor/beach/water/ocean icon_state = "seadeep" -/turf/simulated/floor/beach/water/New() - ..() +/turf/simulated/floor/beach/water/Initialize() + . = ..() add_overlay(image("icon"='icons/misc/beach.dmi',"icon_state"="water5","layer"=MOB_LAYER+0.1)) diff --git a/code/game/turfs/unsimulated/planetary.dm b/code/game/turfs/unsimulated/planetary.dm index 35cd7aa4a8..4fb26f16b6 100644 --- a/code/game/turfs/unsimulated/planetary.dm +++ b/code/game/turfs/unsimulated/planetary.dm @@ -9,6 +9,7 @@ density = 1 alpha = 0 blocks_air = 0 + initialized = FALSE // Set these to get your desired planetary atmosphere. oxygen = 0 @@ -17,8 +18,8 @@ phoron = 0 temperature = T20C -/turf/unsimulated/wall/planetary/New() - ..() +/turf/unsimulated/wall/planetary/Initialize() + . = ..() SSplanets.addTurf(src) /turf/unsimulated/wall/planetary/Destroy() diff --git a/code/game/verbs/advanced_who.dm b/code/game/verbs/advanced_who.dm index bbde65fd07..9f067054f2 100644 --- a/code/game/verbs/advanced_who.dm +++ b/code/game/verbs/advanced_who.dm @@ -71,4 +71,5 @@ msg += "[line]\n" msg += "Total Players: [length(Lines)]" + msg = "" + msg + "" to_chat(src, msg) \ No newline at end of file diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 978b1dddc1..5df51c1dd0 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -149,12 +149,12 @@ if(target in admins) admin_stuff += "/([key])" - to_chat(target, "" + create_text_tag("looc", "LOOC:", target) + " [display_name][admin_stuff]: [msg]") + to_chat(target, "" + create_text_tag("looc", "LOOC:", target) + " [display_name][admin_stuff]: [msg]") for(var/client/target in r_receivers) var/admin_stuff = "/([key])([admin_jump_link(mob, target.holder)])" - to_chat(target, "" + create_text_tag("looc", "LOOC:", target) + " (R)[display_name][admin_stuff]: [msg]") + to_chat(target, "" + create_text_tag("looc", "LOOC:", target) + " (R)[display_name][admin_stuff]: [msg]") /mob/proc/get_looc_source() return src diff --git a/code/game/world.dm b/code/game/world.dm index 06379a4922..1accb20916 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -19,6 +19,7 @@ GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000 callHook("startup") + init_vchat() //Emergency Fix load_mods() //end-emergency fix @@ -631,4 +632,18 @@ proc/establish_old_db_connection() maxz++ max_z_changed() +// Call this to change world.fps, don't modify it directly. +/world/proc/change_fps(new_value = 20) + if(new_value <= 0) + CRASH("change_fps() called with [new_value] new_value.") + if(fps == new_value) + return //No change required. + + fps = new_value + on_tickrate_change() + +// Called whenver world.tick_lag or world.fps are changed. +/world/proc/on_tickrate_change() + SStimer?.reset_buckets() + #undef FAILED_DB_CONNECTION_CUTOFF diff --git a/code/global.dm b/code/global.dm index 084ec5905a..dc0ef10cc2 100644 --- a/code/global.dm +++ b/code/global.dm @@ -107,7 +107,6 @@ var/gravity_is_on = 1 var/join_motd = null -var/datum/game_master/game_master = new() // Game Master, an AI for choosing events. var/datum/metric/metric = new() // Metric datum, used to keep track of the round. var/list/awaydestinations = list() // Away missions. A list of landmarks that the warpgate can take you to. diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 0a35eaae56..e2cab42b42 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -75,6 +75,7 @@ proc/admin_notice(var/message, var/rights) if(M.client) body += "| Prison | " + body += "\ Send back to Lobby | " var/muted = M.client.prefs.muted body += {"
Mute: \[IC | @@ -128,6 +129,8 @@ proc/admin_notice(var/message, var/rights) else body += "Animalize | " + body += "Respawn | " + // DNA2 - Admin Hax if(M.dna && iscarbon(M)) body += "

" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 6e81c6ae9d..d96b32e2df 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1035,6 +1035,29 @@ log_admin("[key_name(usr)] sent [key_name(M)] to the prison station.") message_admins("[key_name_admin(usr)] sent [key_name_admin(M)] to the prison station.", 1) + else if(href_list["sendbacktolobby"]) + if(!check_rights(R_ADMIN)) + return + + var/mob/M = locate(href_list["sendbacktolobby"]) + if(!isobserver(M)) + to_chat(usr, "You can only send ghost players back to the Lobby.") + return + + if(!M.client) + to_chat(usr, "[M] doesn't seem to have an active client.") + return + + if(alert(usr, "Send [key_name(M)] back to Lobby?", "Message", "Yes", "No") != "Yes") + return + + log_admin("[key_name(usr)] has sent [key_name(M)] back to the Lobby.") + message_admins("[key_name(usr)] has sent [key_name(M)] back to the Lobby.") + + var/mob/new_player/NP = new() + NP.ckey = M.ckey + qdel(M) + else if(href_list["tdome1"]) if(!check_rights(R_FUN)) return @@ -1193,6 +1216,15 @@ usr.client.cmd_admin_animalize(M) + else if(href_list["respawn"]) + if(!check_rights(R_SPAWN)) + return + + var/client/C = locate(href_list["respawn"]) + if(!istype(C)) + return + usr.client.respawn_character_proper(C) + else if(href_list["togmutate"]) if(!check_rights(R_SPAWN)) return diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 90964820d9..9fd596acea 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -21,7 +21,7 @@ else alert("Admin jumping disabled") -/client/proc/jumptoturf(var/turf/T in turfs) +/client/proc/jumptoturf(var/turf/T in world) set name = "Jump to Turf" set category = "Admin" if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT)) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 2bf3a1f5cc..2bd7326b3b 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -6,7 +6,7 @@ set category = null set name = "Admin PM Mob" if(!holder) - to_chat(src, "Error: Admin-PM-Context: Only administrators may use this command.") + to_chat(src, "Error: Admin-PM-Context: Only administrators may use this command.") return if( !ismob(M) || !M.client ) return @@ -18,7 +18,7 @@ set category = "Admin" set name = "Admin PM" if(!holder) - to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.") + to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.") return var/list/client/targets[0] for(var/client/T) @@ -37,7 +37,7 @@ /client/proc/cmd_ahelp_reply(whom) if(prefs.muted & MUTE_ADMINHELP) - to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).") + to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).") return var/client/C if(istext(whom)) @@ -48,16 +48,16 @@ C = whom if(!C) if(holder) - to_chat(src, "Error: Admin-PM: Client not found.") + to_chat(src, "Error: Admin-PM: Client not found.") return var/datum/admin_help/AH = C.current_ticket if(AH) - message_admins("[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help.") + message_admins("[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help.") var/msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as text|null if (!msg) - message_admins("[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help.") + message_admins("[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help.") return cmd_admin_pm(whom, msg, AH) @@ -65,12 +65,12 @@ //Fetching a message if needed. src is the sender and C is the target client /client/proc/cmd_admin_pm(whom, msg, datum/admin_help/AH) if(prefs.muted & MUTE_ADMINHELP) - to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).") + to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).") return if(!holder && !current_ticket) //no ticket? https://www.youtube.com/watch?v=iHSPf6x1Fdo - to_chat(src, "You can no longer reply to this ticket, please open another one by using the Adminhelp verb if need be.") - to_chat(src, "Message: [msg]") + to_chat(src, "You can no longer reply to this ticket, please open another one by using the Adminhelp verb if need be.") + to_chat(src, "Message: [msg]") return var/client/recipient @@ -95,14 +95,14 @@ if(!msg) return if(holder) - to_chat(src, "Error: Use the admin IRC channel, nerd.") + to_chat(src, "Error: Use the admin IRC channel, nerd.") return else if(!recipient) if(holder) - to_chat(src, "Error: Admin-PM: Client not found.") + to_chat(src, "Error: Admin-PM: Client not found.") to_chat(src, msg) else current_ticket.MessageNoRecipient(msg) @@ -116,12 +116,12 @@ return if(prefs.muted & MUTE_ADMINHELP) - to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).") + to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).") return if(!recipient) if(holder) - to_chat(src, "Error: Admin-PM: Client not found.") + to_chat(src, "Error: Admin-PM: Client not found.") else current_ticket.MessageNoRecipient(msg) return @@ -140,27 +140,27 @@ var/keywordparsedmsg = keywords_lookup(msg) if(irc) - to_chat(src, "PM to-Admins: [rawmsg]") - admin_ticket_log(src, "Reply PM from-[key_name(src, TRUE, TRUE)] to IRC: [keywordparsedmsg]") + to_chat(src, "PM to-Admins: [rawmsg]") + admin_ticket_log(src, "Reply PM from-[key_name(src, TRUE, TRUE)] to IRC: [keywordparsedmsg]") ircreplyamount-- send2irc("Reply: [ckey]",rawmsg) else if(recipient.holder) if(holder) //both are admins - to_chat(recipient, "Admin PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]") - to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [keywordparsedmsg]") + to_chat(recipient, "Admin PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]") + to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [keywordparsedmsg]") //omg this is dumb, just fill in both their tickets - var/interaction_message = "PM from-[key_name(src, recipient, 1)] to-[key_name(recipient, src, 1)]: [keywordparsedmsg]" + var/interaction_message = "PM from-[key_name(src, recipient, 1)] to-[key_name(recipient, src, 1)]: [keywordparsedmsg]" admin_ticket_log(src, interaction_message) if(recipient != src) //reeee admin_ticket_log(recipient, interaction_message) else //recipient is an admin but sender is not - var/replymsg = "Reply PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]" + var/replymsg = "Reply PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]" admin_ticket_log(src, replymsg) to_chat(recipient, replymsg) - to_chat(src, "PM to-Admins: [msg]") + to_chat(src, "PM to-Admins: [msg]") //play the recieving admin the adminhelp sound (if they have them enabled) if(recipient.is_preference_enabled(/datum/client_preference/holder/play_adminhelp_ping)) @@ -171,12 +171,12 @@ if(!recipient.current_ticket) new /datum/admin_help(msg, recipient, TRUE) - to_chat(recipient, "-- Administrator private message --") - to_chat(recipient, "Admin PM from-[key_name(src, recipient, 0)]: [msg]") - to_chat(recipient, "Click on the administrator's name to reply.") - to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [msg]") + to_chat(recipient, "-- Administrator private message --") + to_chat(recipient, "Admin PM from-[key_name(src, recipient, 0)]: [msg]") + to_chat(recipient, "Click on the administrator's name to reply.") + to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [msg]") - admin_ticket_log(recipient, "PM From [key_name_admin(src)]: [keywordparsedmsg]") + admin_ticket_log(recipient, "PM From [key_name_admin(src)]: [keywordparsedmsg]") //always play non-admin recipients the adminhelp sound recipient << 'sound/effects/adminhelp.ogg' @@ -195,19 +195,19 @@ return else //neither are admins - to_chat(src, "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.") + to_chat(src, "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.") return if(irc) log_admin("PM: [key_name(src)]->IRC: [rawmsg]") for(var/client/X in admins) - to_chat(X, "PM: [key_name(src, X, 0)]->IRC: [keywordparsedmsg]") + to_chat(X, "PM: [key_name(src, X, 0)]->IRC: [keywordparsedmsg]") else log_admin("PM: [key_name(src)]->[key_name(recipient)]: [rawmsg]") //we don't use message_admins here because the sender/receiver might get it too for(var/client/X in admins) if(X.key!=key && X.key!=recipient.key) //check client/X is an admin and isn't the sender or recipient - to_chat(X, "PM: [key_name(src, X, 0)]->[key_name(recipient, X, 0)]: [keywordparsedmsg]" ) + to_chat(X, "PM: [key_name(src, X, 0)]->[key_name(recipient, X, 0)]: [keywordparsedmsg]" ) /proc/IrcPm(target,msg,sender) var/client/C = GLOB.directory[target] @@ -256,11 +256,11 @@ message_admins("IRC message from [sender] to [key_name_admin(C)] : [msg]") log_admin("IRC PM: [sender] -> [key_name(C)] : [msg]") - to_chat(C, "-- Administrator private message --") - to_chat(C, "Admin PM from-[adminname]: [msg]") - to_chat(C, "Click on the administrator's name to reply.") + to_chat(C, "-- Administrator private message --") + to_chat(C, "Admin PM from-[adminname]: [msg]") + to_chat(C, "Click on the administrator's name to reply.") - admin_ticket_log(C, "PM From [irc_tagged]: [msg]") + admin_ticket_log(C, "PM From [irc_tagged]: [msg]") window_flash(C, ignorepref = TRUE) //always play non-admin recipients the adminhelp sound diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index 653b62ddee..2f7d65db05 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -28,7 +28,7 @@ to_chat(usr, "Checking for overlapping pipes...") next_turf: - for(var/turf/T in turfs) + for(var/turf/T in world) for(var/dir in cardinal) var/list/connect_types = list(1 = 0, 2 = 0, 3 = 0) for(var/obj/machinery/atmospherics/pipe in T) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index d14c37d97e..feebada82a 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -539,7 +539,7 @@ Pump.air2.gas["nitrogen"] = 3750 //The contents of 2 canisters. Pump.air2.temperature = 50 Pump.air2.update_values() - Pump.use_power=1 + Pump.update_use_power(USE_POWER_IDLE) Pump.target_pressure = 4500 Pump.update_icon() diff --git a/code/modules/admin/verbs/fps.dm b/code/modules/admin/verbs/fps.dm new file mode 100644 index 0000000000..fbafc004db --- /dev/null +++ b/code/modules/admin/verbs/fps.dm @@ -0,0 +1,23 @@ +//Merged Doohl's and the existing ticklag as they both had good elements about them ~ +//Replaces the old Ticklag verb, fps is easier to understand +/client/proc/set_server_fps() + set category = "Debug" + set name = "Set Server FPS" + set desc = "Sets game speed in frames-per-second. Can potentially break the game" + + if(!check_rights(R_DEBUG)) + return + + var/new_fps = round(input("Sets game frames-per-second. Can potentially break the game (default: [config.fps])", "FPS", world.fps) as num|null) + if(new_fps <= 0) + to_chat(src, "Error: set_server_fps(): Invalid world.fps value. No changes made.") + return + if(new_fps > config.fps * 1.5) + if(alert(src, "You are setting fps to a high value:\n\t[new_fps] frames-per-second\n\tconfig.fps = [config.fps]", "Warning!", "Confirm", "ABORT-ABORT-ABORT") != "Confirm") + return + + var/msg = "[key_name(src)] has modified world.fps to [new_fps]" + log_admin(msg, 0) + message_admins(msg, 0) + world.change_fps(new_fps) + feedback_add_details("admin_verb", "SETFPS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/grief_fixers.dm b/code/modules/admin/verbs/grief_fixers.dm index 00e5ee1e05..b8815876b2 100644 --- a/code/modules/admin/verbs/grief_fixers.dm +++ b/code/modules/admin/verbs/grief_fixers.dm @@ -38,7 +38,7 @@ unsorted_overlays |= gas_data.tile_overlay[id] - for(var/turf/simulated/T in turfs) + for(var/turf/simulated/T in world) T.air = null T.overlays.Remove(unsorted_overlays) T.zone = null diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 26eeb37929..312aa20a6f 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -139,7 +139,7 @@ var/list/debug_verbs = list ( ,/client/proc/cmd_assume_direct_control ,/client/proc/jump_to_dead_group ,/client/proc/startSinglo - ,/client/proc/ticklag + ,/client/proc/set_server_fps ,/client/proc/cmd_admin_grantfullaccess ,/client/proc/kaboom ,/client/proc/cmd_admin_areatest diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index efd7f4a0b4..aec9db7e81 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -17,7 +17,7 @@ return var/image/cross = image('icons/obj/storage.dmi',"bible") - msg = "\icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src, src)]) (CA) (SC) (SMITE): [msg]" + msg = "[bicon(cross)] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src, src)]) (CA) (SC) (SMITE): [msg]" for(var/client/C in admins) if(R_ADMIN|R_EVENT & C.holder.rights) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 1eb22f1201..4c129fbf73 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -106,7 +106,9 @@ if (!holder) return - var/msg = sanitize(input("Message:", text("Enter the text you wish to appear to everyone:")) as text) + var/msg = input("Message:", text("Enter the text you wish to appear to everyone:")) as text + if(!(msg[1] == "<" && msg[length(msg)] == ">")) //You can use HTML but only if the whole thing is HTML. Tries to prevent admin 'accidents'. + msg = sanitize(msg) if (!msg) return @@ -128,7 +130,9 @@ if(!M) return - var/msg = sanitize(input("Message:", text("Enter the text you wish to appear to your target:")) as text) + var/msg = input("Message:", text("Enter the text you wish to appear to your target:")) as text + if(msg && !(msg[1] == "<" && msg[length(msg)] == ">")) //You can use HTML but only if the whole thing is HTML. Tries to prevent admin 'accidents'. + msg = sanitize(msg) if( !msg ) return @@ -365,12 +369,18 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!holder) return - //I frontload all the questions so we don't have a half-done process while you're reading. var/client/picked_client = input(src, "Please specify which client's character to spawn.", "Client", "") as null|anything in GLOB.clients if(!picked_client) return - var/location = alert(src,"Please specify where to spawn them.", "Location", "Right Here", "Arrivals", "Cancel") + respawn_character_proper(picked_client) + +/client/proc/respawn_character_proper(client/picked_client) + if(!istype(picked_client)) + return + + //I frontload all the questions so we don't have a half-done process while you're reading. + var/location = alert(src, "Please specify where to spawn them.", "Location", "Right Here", "Arrivals", "Cancel") if(location == "Cancel" || !location) return @@ -812,10 +822,12 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!holder) return + var/view = src.view if(view == world.view) view = input("Select view range:", "FUCK YE", 7) in list(1,2,3,4,5,6,7,8,9,10,11,12,13,14,128) else view = world.view + mob.set_viewsize(view) log_admin("[key_name(usr)] changed their view range to [view].") //message_admins("[key_name_admin(usr)] changed their view range to [view].", 1) //why? removed by order of XSI diff --git a/code/modules/admin/verbs/ticklag.dm b/code/modules/admin/verbs/ticklag.dm deleted file mode 100644 index 3c34f0f35a..0000000000 --- a/code/modules/admin/verbs/ticklag.dm +++ /dev/null @@ -1,24 +0,0 @@ -//Merged Doohl's and the existing ticklag as they both had good elements about them ~Carn - -/client/proc/ticklag() - set category = "Debug" - set name = "Set Ticklag" - set desc = "Sets a new tick lag. Recommend you don't mess with this too much! Stable, time-tested ticklag value is 0.9" - - if(!check_rights(R_DEBUG)) return - - var/newtick = input("Sets a new tick lag. Please don't mess with this too much! The stable, time-tested ticklag value is 0.9","Lag of Tick", world.tick_lag) as num|null - //I've used ticks of 2 before to help with serious singulo lags - if(newtick && newtick <= 2 && newtick > 0) - log_admin("[key_name(src)] has modified world.tick_lag to [newtick]", 0) - message_admins("[key_name(src)] has modified world.tick_lag to [newtick]", 0) - world.tick_lag = newtick - feedback_add_details("admin_verb","TICKLAG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - switch(alert("Enable Tick Compensation?","Tick Comp is currently: [config.Tickcomp]","Yes","No")) - if("Yes") config.Tickcomp = 1 - else config.Tickcomp = 0 - else - to_chat(src, "Error: ticklag(): Invalid world.ticklag value. No changes made.") - - diff --git a/code/modules/admin/view_variables/modify_variables.dm b/code/modules/admin/view_variables/modify_variables.dm index 8878318fd6..1e3aef04bd 100644 --- a/code/modules/admin/view_variables/modify_variables.dm +++ b/code/modules/admin/view_variables/modify_variables.dm @@ -310,6 +310,13 @@ GLOBAL_PROTECT(VVpixelmovement) if(!variable) return + if(variable in GLOB.VVpixelmovement) + if(!check_rights(R_DEBUG)) + return + var/prompt = alert(src, "Editing this var may irreparably break tile gliding for the rest of the round. THIS CAN'T BE UNDONE", "DANGER", "ABORT ", "Continue", " ABORT") + if (prompt != "Continue") + return + if(!O.can_vv_get(variable)) return diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index cb510836ce..b524ade4b2 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -449,7 +449,7 @@ to_chat(usr, "This can only be done on mobs with clients") return - SSnanoui.send_resources(H.client) + H.client.send_resources() to_chat(usr, "Resource files sent") to_chat(H, "Your NanoUI Resource files have been refreshed") diff --git a/code/modules/ai/_defines.dm b/code/modules/ai/_defines.dm index e94d26b3c3..7b49f18ddb 100644 --- a/code/modules/ai/_defines.dm +++ b/code/modules/ai/_defines.dm @@ -20,6 +20,11 @@ #define MOVEMENT_FAILED 0 // Move() returned false for whatever reason and the mob didn't move. #define MOVEMENT_SUCCESSFUL 1 // Move() returned true and the mob hopefully moved. +// Results of pre-attack checks +#define ATTACK_ON_COOLDOWN -1 // Recently attacked and needs to try again soon. +#define ATTACK_FAILED 0 // Something else went wrong! Maybe they moved away! +#define ATTACK_SUCCESSFUL 1 // We attacked (or tried to, misses count too) + // Reasons for targets to not be valid. Based on why, the AI responds differently. #define AI_TARGET_VALID 0 // We can fight them. #define AI_TARGET_INVIS 1 // They were in field of view but became invisible. Switch to STANCE_BLINDFIGHT if no other viable targets exist. diff --git a/code/modules/ai/aI_holder_subtypes/slime_xenobio_ai.dm b/code/modules/ai/aI_holder_subtypes/slime_xenobio_ai.dm index 0d432e55b1..cdbd665047 100644 --- a/code/modules/ai/aI_holder_subtypes/slime_xenobio_ai.dm +++ b/code/modules/ai/aI_holder_subtypes/slime_xenobio_ai.dm @@ -133,7 +133,7 @@ return rabid = TRUE my_slime.update_mood() - my_slime.visible_message(span("danger", "\The [src] enrages!")) + my_slime.visible_message(span("danger", "\The [my_slime] enrages!")) // Called when using a pacification agent (or it's Kendrick being initalized). /datum/ai_holder/simple_mob/xenobio_slime/proc/pacify() diff --git a/code/modules/ai/ai_holder_combat.dm b/code/modules/ai/ai_holder_combat.dm index 65fd1785b1..64dfa7d17e 100644 --- a/code/modules/ai/ai_holder_combat.dm +++ b/code/modules/ai/ai_holder_combat.dm @@ -70,21 +70,21 @@ /datum/ai_holder/proc/melee_attack(atom/A) pre_melee_attack(A) . = holder.IAttack(A) - if(.) + if(. == ATTACK_SUCCESSFUL) post_melee_attack(A) // Ditto. /datum/ai_holder/proc/ranged_attack(atom/A) pre_ranged_attack(A) . = holder.IRangedAttack(A) - if(.) + if(. == ATTACK_SUCCESSFUL) post_ranged_attack(A) // Most mobs probably won't have this defined but we don't care. /datum/ai_holder/proc/special_attack(atom/movable/AM) pre_special_attack(AM) . = holder.ISpecialAttack(AM) - if(.) + if(. == ATTACK_SUCCESSFUL) post_special_attack(AM) // Called when within striking/shooting distance, however cooldown is not considered. @@ -218,7 +218,6 @@ var/dir_to_target = get_dir(holder, target_atom) holder.face_atom(target_atom) - ai_log("breakthrough() : Exiting", AI_LOG_DEBUG) // Sometimes the mob will try to hit something diagonally, and generally this fails. // So instead we will try two more times with some adjustments if the attack fails. @@ -274,32 +273,32 @@ for(var/obj/structure/window/W in problem_turf) if(W.dir == reverse_dir[holder.dir]) // So that windows get smashed in the right order ai_log("destroy_surroundings() : Attacking side window.", AI_LOG_INFO) - return holder.IAttack(W) + return melee_attack(W) else if(W.is_fulltile()) ai_log("destroy_surroundings() : Attacking full tile window.", AI_LOG_INFO) - return holder.IAttack(W) + return melee_attack(W) // Kill hull shields in the way. for(var/obj/effect/energy_field/shield in problem_turf) if(shield.density) // Don't attack shields that are already down. ai_log("destroy_surroundings() : Attacking hull shield.", AI_LOG_INFO) - return holder.IAttack(shield) + return melee_attack(shield) // Kill common obstacle in the way like tables. var/obj/structure/obstacle = locate(/obj/structure, problem_turf) if(istype(obstacle, /obj/structure/window) || istype(obstacle, /obj/structure/closet) || istype(obstacle, /obj/structure/table) || istype(obstacle, /obj/structure/grille)) ai_log("destroy_surroundings() : Attacking generic structure.", AI_LOG_INFO) - return holder.IAttack(obstacle) + return melee_attack(obstacle) for(var/obj/machinery/door/D in problem_turf) // Required since firelocks take up the same turf. if(D.density) ai_log("destroy_surroundings() : Attacking closed door.", AI_LOG_INFO) - return holder.IAttack(D) + return melee_attack(D) ai_log("destroy_surroundings() : Exiting due to nothing to attack.", AI_LOG_INFO) - return FALSE // Nothing to attack. + return ATTACK_FAILED // Nothing to attack. // Override for special behaviour. /datum/ai_holder/proc/can_violently_breakthrough() - return violent_breakthrough \ No newline at end of file + return violent_breakthrough diff --git a/code/modules/ai/ai_holder_movement.dm b/code/modules/ai/ai_holder_movement.dm index 58b8c9d5ee..eb465dec5d 100644 --- a/code/modules/ai/ai_holder_movement.dm +++ b/code/modules/ai/ai_holder_movement.dm @@ -9,13 +9,14 @@ var/home_low_priority = FALSE // If true, the mob will not go home unless it has nothing better to do, e.g. its following someone. var/max_home_distance = 3 // How far the mob can go away from its home before being told to go_home(). // Note that there is a 'BYOND cap' of 14 due to limitations of get_/step_to(). - // Wandering. var/wander = FALSE // If true, the mob will randomly move in the four cardinal directions when idle. var/wander_delay = 0 // How many ticks until the mob can move a tile in handle_wander_movement(). var/base_wander_delay = 2 // What the above var gets set to when it wanders. Note that a tick happens every half a second. var/wander_when_pulled = FALSE // If the mob will refrain from wandering if someone is pulling it. + // Breakthrough + var/failed_breakthroughs = 0 // How many times we've failed to breakthrough something lately /datum/ai_holder/proc/walk_to_destination() ai_log("walk_to_destination() : Entering.",AI_LOG_TRACE) @@ -90,7 +91,9 @@ // step_to(holder, A) if(holder.IMove(get_step_to(holder, A)) == MOVEMENT_FAILED) ai_log("walk_path() : Failed to move, attempting breakthrough.", AI_LOG_INFO) - breakthrough(A) // We failed to move, time to smash things. + if(!breakthrough(A) && failed_breakthroughs++ >= 5) // We failed to move, time to smash things. + give_up_movement() + failed_breakthroughs = 0 return if(move_once() == FALSE) // Start walking the path. @@ -106,7 +109,9 @@ ai_log("walk_path() : Going to IMove().", AI_LOG_TRACE) if(holder.IMove(get_step_to(holder, A)) == MOVEMENT_FAILED ) ai_log("walk_path() : Failed to move, attempting breakthrough.", AI_LOG_INFO) - breakthrough(A) // We failed to move, time to smash things. + if(!breakthrough(A) && failed_breakthroughs++ >= 5) // We failed to move, time to smash things. + give_up_movement() + failed_breakthroughs = 0 ai_log("walk_path() : Exited.", AI_LOG_TRACE) diff --git a/code/modules/ai/interfaces.dm b/code/modules/ai/interfaces.dm index d1f7e91c53..6cf085c52e 100644 --- a/code/modules/ai/interfaces.dm +++ b/code/modules/ai/interfaces.dm @@ -8,7 +8,7 @@ /mob/living/simple_mob/IAttack(atom/A) if(!canClick()) // Still on cooldown from a "click". - return FALSE + return ATTACK_ON_COOLDOWN return attack_target(A) // This will set click cooldown. /mob/living/carbon/human/IAttack(atom/A) @@ -21,7 +21,7 @@ /mob/living/simple_mob/IRangedAttack(atom/A) if(!canClick()) // Still on cooldown from a "click". - return FALSE + return ATTACK_ON_COOLDOWN return shoot_target(A) // Test if the AI is allowed to attempt a ranged attack. diff --git a/code/modules/artifice/deadringer.dm b/code/modules/artifice/deadringer.dm index bdac793daf..3e95152528 100644 --- a/code/modules/artifice/deadringer.dm +++ b/code/modules/artifice/deadringer.dm @@ -67,7 +67,7 @@ if(timer > 0) timer-- if(timer == 20) - uncloak() + reveal() if(corpse) new /obj/effect/effect/smoke/chem(corpse.loc) qdel(corpse) @@ -86,7 +86,7 @@ makeacorpse(watchowner) return -/obj/item/weapon/deadringer/proc/uncloak() +/obj/item/weapon/deadringer/proc/reveal() if(watchowner) watchowner.alpha = 255 playsound(get_turf(src), 'sound/effects/uncloak.ogg', 35, 1, -1) diff --git a/code/modules/artifice/telecube.dm b/code/modules/artifice/telecube.dm index bb2af4b83d..581b1791f8 100644 --- a/code/modules/artifice/telecube.dm +++ b/code/modules/artifice/telecube.dm @@ -43,11 +43,8 @@ var/image/glow = null var/image/charge = null - var/shell_color = "#FFFFFF" - var/image/shell = null - var/cooldown_time = 30 SECONDS - var/last_teleport = 0 + var/ready = TRUE // How far the cube will search for things to teleport. 0 = only contacting objects / mobs. var/teleport_range = 0 // For all that is holy, do not change this unless you know what you're doing. @@ -56,14 +53,11 @@ /obj/item/weapon/telecube/Initialize() . = ..() - START_PROCESSING(SSobj, src) - last_teleport = world.time - glow = image(icon = icon, icon_state = "[icon_state]-ready") - glow.plane = PLANE_LIGHTING_ABOVE - charge = image(icon = icon, icon_state = "[icon_state]-charging") - charge.plane = PLANE_LIGHTING_ABOVE - shell = image(icon = icon, icon_state = "[icon_state]") + glow = image("[icon_state]-ready") + glow.appearance_flags = KEEP_APART + charge = image("[icon_state]-charging") + charge.appearance_flags = KEEP_APART if(teleport_range) description_info += "
" @@ -71,49 +65,42 @@ if(randomize_colors) glow_color = rgb(rand(0, 255),rand(0, 255),rand(0, 255)) - shell_color = rgb(rand(0, 255),rand(0, 255),rand(0, 255)) + color = rgb(rand(30, 255),rand(30, 255),rand(30, 255)) if(start_paired) mate = new(src.loc) if(mirror_colors) - mate.glow_color = shell_color - mate.shell_color = glow_color + mate.glow_color = color + mate.color = glow_color else mate.glow_color = glow_color - mate.shell_color = shell_color + mate.color = color mate.pair_cube(src) - glow.color = glow_color - charge.color = glow_color - shell.color = shell_color - - return - -/obj/item/weapon/telecube/process() - ..() update_icon() /obj/item/weapon/telecube/update_icon() . = ..() - glow.color = glow_color - charge.color = glow_color - shell.color = shell_color - if(shell.color != initial(shell.color)) - cut_overlay(shell) - add_overlay(shell) + if(isturf(loc)) + glow.plane = PLANE_LIGHTING_ABOVE + charge.plane = PLANE_LIGHTING_ABOVE + else //So it shows up in inventory looking ok + glow.plane = initial(glow.plane) + charge.plane = initial(glow.plane) - if(world.time < (last_teleport + cooldown_time)) - cut_overlay(charge) - cut_overlay(glow) + if(glow_color != glow.color) + glow.color = glow_color + charge.color = glow_color + + if(!ready) + cut_overlays() add_overlay(charge) else - cut_overlay(glow) - cut_overlay(charge) + cut_overlays() add_overlay(glow) /obj/item/weapon/telecube/Destroy() - STOP_PROCESSING(SSobj, src) if(mate) var/turf/T = get_turf(mate) mate.visible_message("\The [mate] collapses into itself!") @@ -121,7 +108,15 @@ mate = null explosion(T,1,3,7) - ..() + return ..() + +/obj/item/weapon/telecube/equipped() + . = ..() + update_icon() + +/obj/item/weapon/telecube/dropped() + . = ..() + update_icon() /obj/item/weapon/telecube/proc/pair_cube(var/obj/item/weapon/telecube/M) if(mate) @@ -139,19 +134,24 @@ if(A == src || A == mate) A.visible_message("\The [A] distorts and fades, before popping back into existence.") + animate_out(A) + animate_in(A) return . var/mob/living/L = src.loc if(istype(L)) + L << 'sound/effects/singlebeat.ogg' L.drop_from_inventory(src) forceMove(get_turf(src)) - if(world.time < (last_teleport + cooldown_time)) + if(!ready) return . if((A.anchored && !omniteleport) || !mate) A.visible_message("\The [A] distorts for a moment, before reforming in the same position.") + animate_out(A) + animate_in(A) return . var/turf/TLocate = get_turf(mate) @@ -160,7 +160,9 @@ if(T1) A.visible_message("\The [A] fades out of existence.") + animate_out(A) A.forceMove(T1) + animate_in(A) . = TRUE A.visible_message("\The [A] fades into existence.") else @@ -188,27 +190,58 @@ . = TRUE return . +/obj/item/weapon/telecube/proc/cooldown(var/mate_too = FALSE) + if(!ready) + return + + ready = FALSE + update_icon() + addtimer(CALLBACK(src, .proc/ready), cooldown_time) + if(mate_too && mate) + mate.cooldown(mate_too = FALSE) //No infinite recursion pls + +/obj/item/weapon/telecube/proc/ready() + ready = TRUE + update_icon() + +/obj/item/weapon/telecube/proc/animate_out(var/atom/movable/AM) + //See atom cloak/uncloak animations for comments + var/atom/movable/target = AM + var/our_filter_index = target.filters.len+1 + AM.filters += filter(type="blur", size = 0) + + animate(target, alpha = 0, time = 5) //Out + animate(target.filters[our_filter_index], size = 2, time = 5, flags = ANIMATION_PARALLEL) + sleep(5) + target.filters -= filter(type="blur", size = 2) + +/obj/item/weapon/telecube/proc/animate_in(var/atom/movable/AM) + //See atom cloak/uncloak animations for comments + var/atom/movable/target = AM + var/our_filter_index = target.filters.len+1 + AM.filters += filter(type="blur", size = 2) + + animate(target, alpha = 255, time = 5) //In + animate(target.filters[our_filter_index], size = 0, time = 5, flags = ANIMATION_PARALLEL) + sleep(5) + target.filters -= filter(type="blur", size = 0) + /obj/item/weapon/telecube/CtrlClick(mob/user) - if(Adjacent(user)) - if(teleport_to_mate(user)) - last_teleport = world.time - return + if(Adjacent(user) && teleport_to_mate(user)) + cooldown(mate_too = FALSE) /obj/item/weapon/telecube/AltClick(mob/user) - if(Adjacent(user)) - if(swap_with_mate()) - last_teleport = world.time - mate.last_teleport = world.time - return + if(Adjacent(user) && swap_with_mate()) + cooldown(mate_too = TRUE) -/obj/item/weapon/telecube/Bump(atom/movable/AM) +/obj/item/weapon/telecube/Bump(var/atom/movable/AM) if(teleport_to_mate(AM)) - last_teleport = world.time + cooldown(mate_too = FALSE) . = ..() -/obj/item/weapon/telecube/Bumped(atom/movable/M as mob|obj) +/obj/item/weapon/telecube/Bumped(var/atom/movable/M) if(teleport_to_mate(M)) - last_teleport = world.time + cooldown(mate_too = FALSE) . = ..() // Subtypes @@ -224,7 +257,7 @@ /obj/item/weapon/telecube/precursor glow_color = "#FF1D8E" - shell_color = "#2F1B26" + color = "#2F1B26" /obj/item/weapon/telecube/precursor/mated start_paired = TRUE diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 04dadddc04..b5851ab4c6 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -13,7 +13,7 @@ var/secured = 1 var/list/attached_overlays = null var/obj/item/device/assembly_holder/holder = null - var/cooldown = 0//To prevent spam + var/cooldown = FALSE //To prevent spam var/wires = WIRE_RECEIVE | WIRE_PULSE var/const/WIRE_RECEIVE = 1 //Allows Pulsed(0) to call Activate() @@ -22,78 +22,45 @@ var/const/WIRE_RADIO_RECEIVE = 8 //Allows Pulsed(1) to call Activate() var/const/WIRE_RADIO_PULSE = 16 //Allows Pulse(1) to send a radio message -/obj/item/device/assembly/proc/activate() //What the device does when turned on +/obj/item/device/assembly/proc/holder_movement() return -/obj/item/device/assembly/proc/pulsed(var/radio = 0) //Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs - return +/obj/item/device/assembly/proc/process_cooldown() + if(cooldown) + return FALSE + cooldown = TRUE + VARSET_IN(src, cooldown, FALSE, 2 SECONDS) + return TRUE -/obj/item/device/assembly/proc/pulse(var/radio = 0) //Called when this device attempts to act on another device, var/radio determines if it was sent via radio or direct - return - -/obj/item/device/assembly/proc/toggle_secure() //Code that has to happen when the assembly is un\secured goes here - return - -/obj/item/device/assembly/proc/attach_assembly(var/obj/A, var/mob/user) //Called when an assembly is attacked by another - return - -/obj/item/device/assembly/proc/process_cooldown() //Called via spawn(10) to have it count down the cooldown var - return - -/obj/item/device/assembly/proc/holder_movement() //Called when the holder is moved - return - -/obj/item/device/assembly/interact(mob/user as mob) //Called when attack_self is called - return - - -/obj/item/device/assembly/process_cooldown() - cooldown-- - if(cooldown <= 0) return 0 - spawn(10) - process_cooldown() - return 1 - - -/obj/item/device/assembly/pulsed(var/radio = 0) +/obj/item/device/assembly/proc/pulsed(var/radio = 0) if(holder && (wires & WIRE_RECEIVE)) activate() if(radio && (wires & WIRE_RADIO_RECEIVE)) activate() return 1 - -/obj/item/device/assembly/pulse(var/radio = 0) +/obj/item/device/assembly/proc/pulse(var/radio = 0) if(holder && (wires & WIRE_PULSE)) holder.process_activation(src, 1, 0) if(holder && (wires & WIRE_PULSE_SPECIAL)) holder.process_activation(src, 0, 1) -// if(radio && (wires & WIRE_RADIO_PULSE)) - //Not sure what goes here quite yet send signal? return 1 +/obj/item/device/assembly/proc/activate() + if(!secured || !process_cooldown()) + return FALSE + return TRUE -/obj/item/device/assembly/activate() - if(!secured || (cooldown > 0)) return 0 - cooldown = 2 - spawn(10) - process_cooldown() - return 1 - - -/obj/item/device/assembly/toggle_secure() +/obj/item/device/assembly/proc/toggle_secure() secured = !secured update_icon() return secured - -/obj/item/device/assembly/attach_assembly(var/obj/item/device/assembly/A, var/mob/user) +/obj/item/device/assembly/proc/attach_assembly(var/obj/item/device/assembly/A, var/mob/user) holder = new/obj/item/device/assembly_holder(get_turf(src)) if(holder.attach(A,src,user)) to_chat(user, "You attach \the [A] to \the [src]!") - return 1 - return 0 - + return TRUE /obj/item/device/assembly/attackby(obj/item/weapon/W as obj, mob/user as mob) if(isassembly(W)) @@ -107,14 +74,10 @@ else to_chat(user, "\The [src] can now be attached!") return - ..() - return - + return ..() /obj/item/device/assembly/process() - STOP_PROCESSING(SSobj, src) - return - + return PROCESS_KILL /obj/item/device/assembly/examine(mob/user) ..(user) @@ -132,7 +95,6 @@ interact(user) return 1 - /obj/item/device/assembly/interact(mob/user as mob) return //HTML MENU FOR WIRES GOES HERE @@ -140,41 +102,3 @@ if(istype(loc, /obj/item/device/assembly_holder)) return loc.nano_host() return ..() - -/* - var/small_icon_state = null//If this obj will go inside the assembly use this for icons - var/list/small_icon_state_overlays = null//Same here - var/obj/holder = null - var/cooldown = 0//To prevent spam - - proc - Activate()//Called when this assembly is pulsed by another one - Process_cooldown()//Call this via spawn(10) to have it count down the cooldown var - Attach_Holder(var/obj/H, var/mob/user)//Called when an assembly holder attempts to attach, sets src's loc in here - - - Activate() - if(cooldown > 0) - return 0 - cooldown = 2 - spawn(10) - Process_cooldown() - //Rest of code here - return 0 - - - Process_cooldown() - cooldown-- - if(cooldown <= 0) return 0 - spawn(10) - Process_cooldown() - return 1 - - - Attach_Holder(var/obj/H, var/mob/user) - if(!H) return 0 - if(!H.IsAssemblyHolder()) return 0 - //Remember to have it set its loc somewhere in here - - -*/ diff --git a/code/modules/assembly/helpers.dm b/code/modules/assembly/helpers.dm index bfecbd8a41..cc3100f772 100644 --- a/code/modules/assembly/helpers.dm +++ b/code/modules/assembly/helpers.dm @@ -27,18 +27,3 @@ if(istype(O, /obj/item/device/assembly/timer)) return 1 return 0 - -/* -Name: IsSpecialAssembly -Desc: If true is an object that can be attached to an assembly holder but is a special thing like a phoron can or door -*/ - -/obj/proc/IsSpecialAssembly() - return 0 - -/* -Name: IsAssemblyHolder -Desc: If true is an object that can hold an assemblyholder object -*/ -/obj/proc/IsAssemblyHolder() - return 0 \ No newline at end of file diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 0636c9e5e9..c95d2869e9 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -14,76 +14,48 @@ var/obj/item/device/assembly/a_right = null var/obj/special_assembly = null -/obj/item/device/assembly_holder/proc/attach(var/obj/item/device/D, var/obj/item/device/D2, var/mob/user) - return +/obj/item/device/assembly_holder/proc/attach(var/obj/item/device/assembly/D, var/obj/item/device/assembly/D2, var/mob/user) + if(!D || !D2) + return FALSE + + if(!istype(D) || !istype(D2)) + return FALSE -/obj/item/device/assembly_holder/proc/attach_special(var/obj/O, var/mob/user) - return - -/obj/item/device/assembly_holder/proc/process_activation(var/obj/item/device/D) - return - -/obj/item/device/assembly_holder/proc/detached() - return - - -/obj/item/device/assembly_holder/IsAssemblyHolder() - return 1 - - -/obj/item/device/assembly_holder/attach(var/obj/item/device/D, var/obj/item/device/D2, var/mob/user) - if((!D)||(!D2)) return 0 - if((!isassembly(D))||(!isassembly(D2))) return 0 - if((D:secured)||(D2:secured)) return 0 + if(D.secured || D2.secured) + return FALSE + if(user) user.remove_from_mob(D) user.remove_from_mob(D2) - D:holder = src - D2:holder = src - D.loc = src - D2.loc = src + + D.holder = src + D2.holder = src + D.forceMove(src) + D2.forceMove(src) a_left = D a_right = D2 name = "[D.name]-[D2.name] assembly" update_icon() - usr.put_in_hands(src) + user.put_in_hands(src) - return 1 + return TRUE - -/obj/item/device/assembly_holder/attach_special(var/obj/O, var/mob/user) - if(!O) return - if(!O.IsSpecialAssembly()) return 0 - -/* if(O:Attach_Holder()) - special_assembly = O - update_icon() - src.name = "[a_left.name] [a_right.name] [special_assembly.name] assembly" -*/ +/obj/item/device/assembly_holder/proc/detached() return - /obj/item/device/assembly_holder/update_icon() - overlays.Cut() + cut_overlays() if(a_left) - overlays += "[a_left.icon_state]_left" + add_overlay("[a_left.icon_state]_left") for(var/O in a_left.attached_overlays) - overlays += "[O]_l" + add_overlay("[O]_l") if(a_right) - src.overlays += "[a_right.icon_state]_right" + add_overlay("[a_right.icon_state]_right") for(var/O in a_right.attached_overlays) - overlays += "[O]_r" + add_overlay("[O]_r") if(master) master.update_icon() -/* if(special_assembly) - special_assembly.update_icon() - if(special_assembly:small_icon_state) - src.overlays += special_assembly:small_icon_state - for(var/O in special_assembly:small_icon_state_overlays) - src.overlays += O -*/ - /obj/item/device/assembly_holder/examine(mob/user) ..(user) if ((in_range(src, user) || src.loc == user)) @@ -91,17 +63,12 @@ to_chat(user, "\The [src] is ready!") else to_chat(user, "\The [src] can be attached!") - return - /obj/item/device/assembly_holder/HasProximity(atom/movable/AM as mob|obj) if(a_left) a_left.HasProximity(AM) if(a_right) a_right.HasProximity(AM) - if(special_assembly) - special_assembly.HasProximity(AM) - /obj/item/device/assembly_holder/Crossed(atom/movable/AM as mob|obj) if(AM.is_incorporeal()) @@ -110,42 +77,26 @@ a_left.Crossed(AM) if(a_right) a_right.Crossed(AM) - if(special_assembly) - special_assembly.Crossed(AM) - /obj/item/device/assembly_holder/on_found(mob/finder as mob) if(a_left) a_left.on_found(finder) if(a_right) a_right.on_found(finder) - if(special_assembly) - if(istype(special_assembly, /obj/item)) - var/obj/item/S = special_assembly - S.on_found(finder) - /obj/item/device/assembly_holder/Move() ..() if(a_left && a_right) a_left.holder_movement() a_right.holder_movement() -// if(special_assembly) -// special_assembly:holder_movement() - return - /obj/item/device/assembly_holder/attack_hand()//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess if(a_left && a_right) a_left.holder_movement() a_right.holder_movement() -// if(special_assembly) -// special_assembly:Holder_Movement() ..() - return - -/obj/item/device/assembly_holder/attackby(obj/item/weapon/W as obj, mob/user as mob) +/obj/item/device/assembly_holder/attackby(var/obj/item/weapon/W, var/mob/user) if(W.is_screwdriver()) if(!a_left || !a_right) to_chat(user, " BUG:Assembly part missing, please report this!") @@ -159,14 +110,10 @@ to_chat(user, "\The [src] can now be taken apart!") update_icon() return - else if(W.IsSpecialAssembly()) - attach_special(W, user) else ..() - return - -/obj/item/device/assembly_holder/attack_self(mob/user as mob) +/obj/item/device/assembly_holder/attack_self(var/mob/user) src.add_fingerprint(user) if(src.secured) if(!a_left || !a_right) @@ -184,22 +131,21 @@ a_right.attack_self(user) else var/turf/T = get_turf(src) - if(!T) return 0 + if(!T) + return 0 if(a_left) - a_left:holder = null - a_left.loc = T + a_left.holder = null + a_left.forceMove(T) if(a_right) - a_right:holder = null - a_right.loc = T - spawn(0) - qdel(src) - return + a_right.holder = null + a_right.forceMove(T) + qdel(src) - -/obj/item/device/assembly_holder/process_activation(var/obj/D, var/normal = 1, var/special = 1) - if(!D) return 0 +/obj/item/device/assembly_holder/proc/process_activation(var/obj/D, var/normal = 1) + if(!D) + return 0 if(!secured) - visible_message("\icon[src] *beep* *beep*", "*beep* *beep*") + visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*") if((normal) && (a_right) && (a_left)) if(a_right != D) a_right.pulsed(0) @@ -207,42 +153,36 @@ a_left.pulsed(0) if(master) master.receive_signal() -// if(special && special_assembly) -// if(!special_assembly == D) -// special_assembly.dothings() return 1 - /obj/item/device/assembly_holder/hear_talk(mob/living/M as mob, msg, verb, datum/language/speaking) if(a_right) a_right.hear_talk(M,msg,verb,speaking) if(a_left) a_left.hear_talk(M,msg,verb,speaking) - - - /obj/item/device/assembly_holder/timer_igniter name = "timer-igniter assembly" - New() - ..() +/obj/item/device/assembly_holder/timer_igniter/New() + ..() - var/obj/item/device/assembly/igniter/ign = new(src) - ign.secured = 1 - ign.holder = src - var/obj/item/device/assembly/timer/tmr = new(src) - tmr.time=5 - tmr.secured = 1 - tmr.holder = src - START_PROCESSING(SSobj, tmr) - a_left = tmr - a_right = ign - secured = 1 - update_icon() - name = initial(name) + " ([tmr.time] secs)" + var/obj/item/device/assembly/igniter/ign = new(src) + ign.secured = 1 + ign.holder = src - loc.verbs += /obj/item/device/assembly_holder/timer_igniter/verb/configure + var/obj/item/device/assembly/timer/tmr = new(src) + tmr.time = 5 + tmr.secured = 1 + tmr.holder = src + + a_left = tmr + a_right = ign + secured = 1 + update_icon() + name = initial(name) + " ([tmr.time] secs)" + + loc.verbs += /obj/item/device/assembly_holder/timer_igniter/verb/configure /obj/item/device/assembly_holder/timer_igniter/detached() loc.verbs -= /obj/item/device/assembly_holder/timer_igniter/verb/configure diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index 88845d0651..5344d4b15b 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -9,7 +9,8 @@ wires = WIRE_RECEIVE /obj/item/device/assembly/igniter/activate() - if(!..()) return 0//Cooldown check + if(!..()) + return FALSE if(holder && istype(holder.loc,/obj/item/weapon/grenade/chem_grenade)) var/obj/item/weapon/grenade/chem_grenade/grenade = holder.loc @@ -28,13 +29,12 @@ s.set_up(3, 1, src) s.start() - return 1 + return TRUE -/obj/item/device/assembly/igniter/attack_self(mob/user as mob) +/obj/item/device/assembly/igniter/attack_self(var/mob/user) activate() add_fingerprint(user) - return /obj/item/device/assembly/igniter/is_hot() return TRUE \ No newline at end of file diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 436f2741fd..2f10a91fda 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -13,124 +13,118 @@ var/on = 0 var/visible = 0 - var/obj/effect/beam/i_beam/first = null + var/list/i_beams = null /obj/item/device/assembly/infra/activate() - if(!..()) return 0//Cooldown check - on = !on - update_icon() - return 1 - + if(!..()) + return FALSE + on = !on + update_icon() + return TRUE /obj/item/device/assembly/infra/toggle_secure() secured = !secured - if(secured) - START_PROCESSING(SSobj, src) - else - on = 0 - if(first) qdel(first) - STOP_PROCESSING(SSobj, src) + if(!secured) + toggle_state(FALSE) update_icon() return secured +/obj/item/device/assembly/infra/proc/toggle_state(var/picked) + if(!isnull(picked)) + on = picked + else + on = !on + + if(secured && on) + START_PROCESSING(SSobj, src) + else + STOP_PROCESSING(SSobj, src) + QDEL_LIST_NULL(i_beams) + return on /obj/item/device/assembly/infra/update_icon() - overlays.Cut() - attached_overlays = list() + cut_overlays() + LAZYCLEARLIST(attached_overlays) if(on) - overlays += "infrared_on" - attached_overlays += "infrared_on" + add_overlay("infrared_on") + LAZYADD(attached_overlays, "infrared_on") if(holder) - holder.update_icon() - return + holder.update_icon(2) +/obj/item/device/assembly/infra/process() + if(!on && i_beams) + QDEL_LIST_NULL(i_beams) + return -/obj/item/device/assembly/infra/process()//Old code - if(!on) - if(first) - qdel(first) - return + if(!i_beams && secured && (istype(loc, /turf) || (holder && istype(holder.loc, /turf)))) + create_beams() - if((!(first) && (secured && (istype(loc, /turf) || (holder && istype(holder.loc, /turf)))))) - var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam((holder ? holder.loc : loc) ) +/obj/item/device/assembly/infra/proc/create_beams(var/limit = 8) + var/current_spot = get_turf(src) + for(var/i = 1 to limit) + var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(current_spot) I.master = src I.density = 1 I.set_dir(dir) - step(I, I.dir) - if(I) - I.density = 0 - first = I - I.vis_spread(visible) - spawn(0) - if(I) - //to_world("infra: setting limit") - I.limit = 8 - //to_world("infra: processing beam \ref[I]") - I.process() - return - return - + if(!step(I, I.dir)) //Try to take a step in that direction + return //Couldn't, oh well, we hit a wall or something. Beam should qdel itself in it's Bump(). + I.density = 0 + i_beams |= I + I.visible = visible /obj/item/device/assembly/infra/attack_hand() - qdel(first) + QDEL_LIST_NULL(i_beams) ..() - return - /obj/item/device/assembly/infra/Move() var/t = dir ..() set_dir(t) - qdel(first) - return - + QDEL_LIST_NULL(i_beams) /obj/item/device/assembly/infra/holder_movement() - if(!holder) return 0 -// set_dir(holder.dir) - qdel(first) - return 1 - + if(!holder) + return FALSE + QDEL_LIST_NULL(i_beams) + return TRUE /obj/item/device/assembly/infra/proc/trigger_beam() - if((!secured)||(!on)||(cooldown > 0)) return 0 + if(!process_cooldown()) + return FALSE pulse(0) + QDEL_LIST_NULL(i_beams) //They will get recreated next process() if the situation is still appropriate if(!holder) - visible_message("\icon[src] *beep* *beep*") - cooldown = 2 - spawn(10) - process_cooldown() - return - + visible_message("[bicon(src)] *beep* *beep*") /obj/item/device/assembly/infra/interact(mob/user as mob)//TODO: change this this to the wire control panel - if(!secured) return + if(!secured) + return user.set_machine(src) var/dat = text("Infrared Laser\nStatus: []
\nVisibility: []
\n
", (on ? text("On", src) : text("Off", src)), (src.visible ? text("Visible", src) : text("Invisible", src))) dat += "

Refresh" dat += "

Close" user << browse(dat, "window=infra") onclose(user, "infra") - return - /obj/item/device/assembly/infra/Topic(href, href_list, state = deep_inventory_state) - if(..()) return 1 + if(..()) + return 1 + if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) usr << browse(null, "window=infra") onclose(usr, "infra") return if(href_list["state"]) - on = !(on) - update_icon() + toggle_state() if(href_list["visible"]) visible = !(visible) - spawn(0) - if(first) - first.vis_spread(visible) + for(var/ibeam in i_beams) + var/obj/effect/beam/i_beam/I = ibeam + I.visible = visible + CHECK_TICK if(href_list["close"]) usr << browse(null, "window=infra") @@ -139,18 +133,12 @@ if(usr) attack_self(usr) - return - - /obj/item/device/assembly/infra/verb/rotate_clockwise() set name = "Rotate Infrared Laser Clockwise" set category = "Object" set src in usr - src.set_dir(turn(src.dir, 270)) - return - - + set_dir(turn(dir, 270)) /***************************IBeam*********************************/ @@ -158,102 +146,37 @@ name = "i beam" icon = 'icons/obj/projectiles.dmi' icon_state = "ibeam" - var/obj/effect/beam/i_beam/next = null var/obj/item/device/assembly/infra/master = null - var/limit = null - var/visible = 0.0 - var/left = null - anchored = 1.0 + var/visible = 0 + anchored = 1 +/obj/effect/beam/i_beam/Initialize() + . = ..() + START_PROCESSING(SSobj, src) + +/obj/effect/beam/i_beam/Destroy() + STOP_PROCESSING(SSobj, src) + master = null + return ..() /obj/effect/beam/i_beam/proc/hit() - if(master) - master.trigger_beam() + master?.trigger_beam() qdel(src) - return - -/obj/effect/beam/i_beam/proc/vis_spread(v) - //to_world("i_beam \ref[src] : vis_spread") - visible = v - spawn(0) - if(next) - //to_world("i_beam \ref[src] : is next [next.type] \ref[next], calling spread") - next.vis_spread(v) - return - return /obj/effect/beam/i_beam/process() - - if((loc && loc.density) || !master) + if(loc?.density || !master) qdel(src) return - if(left > 0) - left-- - if(left < 1) - if(!(visible)) - invisibility = 101 - else - invisibility = 0 - else - invisibility = 0 - - - //to_world("now [src.left] left") - var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(loc) - I.master = master - I.density = 1 - I.set_dir(dir) - //to_world("created new beam \ref[I] at [I.x] [I.y] [I.z]") - step(I, I.dir) - - if(I) - //to_world("step worked, now at [I.x] [I.y] [I.z]") - if(!(next)) - //to_world("no next") - I.density = 0 - //to_world("spreading") - I.vis_spread(visible) - next = I - spawn(0) - //to_world("limit = [limit] ") - if((I && limit > 0)) - I.limit = limit - 1 - //to_world("calling next process") - I.process() - return - else - //to_world("is a next: \ref[next], deleting beam \ref[I]") - qdel(I) - else - //to_world("step failed, deleting \ref[next]") - qdel(next) - spawn(10) - process() - return - return - /obj/effect/beam/i_beam/Bump() qdel(src) - return /obj/effect/beam/i_beam/Bumped() hit() - return -/obj/effect/beam/i_beam/Crossed(atom/movable/AM as mob|obj) +/obj/effect/beam/i_beam/Crossed(var/atom/movable/AM) if(AM.is_incorporeal()) return if(istype(AM, /obj/effect/beam)) return - spawn(0) - hit() - return - return - -/obj/effect/beam/i_beam/Destroy() - . = ..() - if(master.first == src) - master.first = null - if(next && !next.gc_destroyed) - QDEL_NULL(next) + hit() \ No newline at end of file diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index be78782b29..c2fb202984 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -7,7 +7,7 @@ var/armed = 0 -/obj/item/device/assembly/mousetrap/examine(mob/user) +/obj/item/device/assembly/mousetrap/examine(var/mob/user) ..(user) if(armed) to_chat(user, "It looks like it's armed.") @@ -20,7 +20,7 @@ if(holder) holder.update_icon() -/obj/item/device/assembly/mousetrap/proc/triggered(mob/target as mob, var/type = "feet") +/obj/item/device/assembly/mousetrap/proc/triggered(var/mob/target, var/type = "feet") if(!armed) return var/obj/item/organ/external/affecting = null @@ -49,8 +49,7 @@ update_icon() pulse(0) - -/obj/item/device/assembly/mousetrap/attack_self(mob/living/user as mob) +/obj/item/device/assembly/mousetrap/attack_self(var/mob/living/user) if(!armed) to_chat(user, "You arm [src].") else @@ -68,8 +67,7 @@ update_icon() playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) - -/obj/item/device/assembly/mousetrap/attack_hand(mob/living/user as mob) +/obj/item/device/assembly/mousetrap/attack_hand(var/mob/living/user) if(armed) if((CLUMSY in user.mutations) && prob(50)) var/which_hand = "l_hand" @@ -81,8 +79,7 @@ return ..() - -/obj/item/device/assembly/mousetrap/Crossed(atom/movable/AM as mob|obj) +/obj/item/device/assembly/mousetrap/Crossed(var/atom/movable/AM) if(AM.is_incorporeal()) return if(armed) @@ -96,8 +93,7 @@ triggered(AM) ..() - -/obj/item/device/assembly/mousetrap/on_found(mob/living/finder as mob) +/obj/item/device/assembly/mousetrap/on_found(var/mob/living/finder) if(armed) finder.visible_message("[finder] accidentally sets off [src], breaking their fingers.", \ "You accidentally trigger [src]!") @@ -105,19 +101,16 @@ return 1 //end the search! return 0 - -/obj/item/device/assembly/mousetrap/hitby(A as mob|obj) +/obj/item/device/assembly/mousetrap/hitby(var/atom/movable/A) if(!armed) return ..() visible_message("[src] is triggered by [A].") triggered(null) - /obj/item/device/assembly/mousetrap/armed icon_state = "mousetraparmed" armed = 1 - /obj/item/device/assembly/mousetrap/verb/hide_under() set src in oview(1) set name = "Hide" @@ -126,5 +119,5 @@ if(usr.stat) return - layer = TURF_LAYER+0.2 + layer = HIDING_LAYER to_chat(usr, "You hide [src].") \ No newline at end of file diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index a03130ea92..a93bda4809 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -16,16 +16,16 @@ var/range = 2 /obj/item/device/assembly/prox_sensor/activate() - if(!..()) return 0//Cooldown check + if(!..()) + return FALSE timing = !timing update_icon() - return 0 - + return FALSE /obj/item/device/assembly/prox_sensor/toggle_secure() secured = !secured if(secured) - START_PROCESSING(SSobj, src) + START_PROCESSING(SSobj, src) else scanning = 0 timing = 0 @@ -33,29 +33,22 @@ update_icon() return secured - /obj/item/device/assembly/prox_sensor/HasProximity(atom/movable/AM as mob|obj) if(!istype(AM)) log_debug("DEBUG: HasProximity called with [AM] on [src] ([usr]).") return - if (istype(AM, /obj/effect/beam)) return - if (!isobserver(AM) && AM.move_speed < 12) sense() - return - + if (istype(AM, /obj/effect/beam)) + return + if (!isobserver(AM) && AM.move_speed < 12) + sense() /obj/item/device/assembly/prox_sensor/proc/sense() + if((!holder && !secured) || !scanning || !process_cooldown()) + return FALSE var/turf/mainloc = get_turf(src) -// if(scanning && cooldown <= 0) -// mainloc.visible_message("\icon[src] *boop* *boop*", "*boop* *boop*") - if((!holder && !secured)||(!scanning)||(cooldown > 0)) return 0 pulse(0) if(!holder) - mainloc.visible_message("\icon[src] *beep* *beep*", "*beep* *beep*") - cooldown = 2 - spawn(10) - process_cooldown() - return - + mainloc.visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*") /obj/item/device/assembly/prox_sensor/process() if(scanning) @@ -69,46 +62,35 @@ if(timing && time <= 0) timing = 0 toggle_scan() - time = 10 - return - + time = initial(time) /obj/item/device/assembly/prox_sensor/dropped() - spawn(0) - sense() - return - return - + sense() /obj/item/device/assembly/prox_sensor/proc/toggle_scan() - if(!secured) return 0 + if(!secured) + return FALSE scanning = !scanning update_icon() - return - /obj/item/device/assembly/prox_sensor/update_icon() - overlays.Cut() - attached_overlays = list() + cut_overlays() + LAZYCLEARLIST(attached_overlays) if(timing) - overlays += "prox_timing" - attached_overlays += "prox_timing" + add_overlay("prox_timing") + LAZYADD(attached_overlays, "prox_timing") if(scanning) - overlays += "prox_scanning" - attached_overlays += "prox_scanning" + add_overlay("prox_scanning") + LAZYADD(attached_overlays, "prox_scanning") if(holder) holder.update_icon() if(holder && istype(holder.loc,/obj/item/weapon/grenade/chem_grenade)) var/obj/item/weapon/grenade/chem_grenade/grenade = holder.loc grenade.primed(scanning) - return - /obj/item/device/assembly/prox_sensor/Move() ..() sense() - return - /obj/item/device/assembly/prox_sensor/interact(mob/user as mob)//TODO: Change this to the wires thingy if(!secured) @@ -123,11 +105,11 @@ dat += "

Close" user << browse(dat, "window=prox") onclose(user, "prox") - return - /obj/item/device/assembly/prox_sensor/Topic(href, href_list, state = deep_inventory_state) - if(..()) return 1 + if(..()) + return TRUE + if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) usr << browse(null, "window=prox") onclose(usr, "prox") @@ -156,6 +138,3 @@ if(usr) attack_self(usr) - - - return diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm index 55616a2b91..d3f518bbc8 100644 --- a/code/modules/assembly/shock_kit.dm +++ b/code/modules/assembly/shock_kit.dm @@ -13,7 +13,7 @@ ..() return -/obj/item/assembly/shock_kit/attackby(obj/item/weapon/W as obj, mob/user as mob) +/obj/item/assembly/shock_kit/attackby(var/obj/item/weapon/W, var/mob/user) if(W.is_wrench() && !status) var/turf/T = loc if(ismob(T)) diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index a8859e7c1c..3d45fb4e62 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -17,33 +17,22 @@ var/datum/radio_frequency/radio_connection var/deadman = FALSE -/obj/item/device/assembly/signaler/New() - ..() - spawn(40) - set_frequency(frequency) - return - +/obj/item/device/assembly/signaler/Initialize() + . = ..() + set_frequency(frequency) /obj/item/device/assembly/signaler/activate() - if(cooldown > 0) return FALSE - cooldown = 2 - spawn(10) - process_cooldown() - + if(!process_cooldown()) + return FALSE signal() return TRUE /obj/item/device/assembly/signaler/update_icon() if(holder) holder.update_icon() - return -/obj/item/device/assembly/signaler/interact(mob/user as mob, flag1) +/obj/item/device/assembly/signaler/interact(var/mob/user) var/t1 = "-------" -// if ((src.b_stat && !( flag1 ))) -// t1 = text("-------
\nGreen Wire: []
\nRed Wire: []
\nBlue Wire: []
\n", (src.wires & 4 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 2 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 1 ? text("Cut Wire", src) : text("Mend Wire", src))) -// else -// t1 = "-------" Speaker: [src.listening ? "Engaged" : "Disengaged"]
var/dat = {" @@ -66,8 +55,6 @@ Code: "} user << browse(dat, "window=radio") onclose(user, "radio") - return - /obj/item/device/assembly/signaler/Topic(href, href_list, state = deep_inventory_state) if(..()) @@ -97,9 +84,7 @@ Code: if(usr) attack_self(usr) - return - -/obj/item/device/assembly/signaler/attackby(obj/item/weapon/W, mob/user, params) +/obj/item/device/assembly/signaler/attackby(var/obj/item/weapon/W, mob/user, params) if(issignaler(W)) var/obj/item/device/assembly/signaler/signaler2 = W if(secured && signaler2.secured) @@ -120,8 +105,6 @@ Code: signal.encryption = code signal.data["message"] = "ACTIVATE" radio_connection.post_signal(src, signal) - return - /obj/item/device/assembly/signaler/pulse(var/radio = 0) if(is_jammed(src)) @@ -134,7 +117,6 @@ Code: ..(radio) return TRUE - /obj/item/device/assembly/signaler/receive_signal(datum/signal/signal) if(!signal) return FALSE @@ -148,9 +130,7 @@ Code: if(!holder) for(var/mob/O in hearers(1, src.loc)) - O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2) - return - + O.show_message("[bicon(src)] *beep* *beep*", 3, "*beep* *beep*", 2) /obj/item/device/assembly/signaler/proc/set_frequency(new_frequency) if(!frequency) @@ -163,7 +143,6 @@ Code: radio_controller.remove_object(src, frequency) frequency = new_frequency radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT) - return /obj/item/device/assembly/signaler/process() if(!deadman) @@ -176,7 +155,6 @@ Code: STOP_PROCESSING(SSobj, src) else if(prob(5)) M.visible_message("[M]'s finger twitches a bit over [src]'s signal button!") - return /obj/item/device/assembly/signaler/verb/deadman_it() set src in usr diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index 488083d11a..1bc653662b 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -14,45 +14,43 @@ /obj/item/device/assembly/timer/activate() - if(!..()) return 0//Cooldown check + if(!..()) + return FALSE - timing = !timing + set_state(!timing) update_icon() return 0 - /obj/item/device/assembly/timer/toggle_secure() secured = !secured if(secured) - START_PROCESSING(SSobj, src) + START_PROCESSING(SSobj, src) else timing = 0 STOP_PROCESSING(SSobj, src) update_icon() return secured +/obj/item/device/assembly/timer/proc/set_state(var/state) + if(state && !timing) //Not running, starting though + START_PROCESSING(SSobj, src) + else if(timing && !state) //Running, stopping though + STOP_PROCESSING(SSobj, src) + timing = state /obj/item/device/assembly/timer/proc/timer_end() - if(!secured) return 0 + if(!secured) + return 0 pulse(0) if(!holder) - visible_message("\icon[src] *beep* *beep*", "*beep* *beep*") - cooldown = 2 - spawn(10) - process_cooldown() - return - + visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*") /obj/item/device/assembly/timer/process() - if(timing && (time > 0)) - time-- - if(timing && time <= 0) - timing = 0 + if(timing && time-- <= 0) + set_state(0) timer_end() time = 10 - return - /obj/item/device/assembly/timer/update_icon() overlays.Cut() @@ -87,7 +85,8 @@ return if(href_list["time"]) - timing = text2num(href_list["time"]) + var/new_timing = text2num(href_list["time"]) + set_state(new_timing) update_icon() if(href_list["tp"]) diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index 7e8c89cc79..8ebf8278a8 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -12,7 +12,7 @@ recorded = msg listening = 0 var/turf/T = get_turf(src) //otherwise it won't work in hand - T.visible_message("\icon[src] beeps, \"Activation message is '[recorded]'.\"") + T.visible_message("[bicon(src)] beeps, \"Activation message is '[recorded]'.\"") else if(findtext(msg, recorded)) pulse(0) @@ -22,14 +22,14 @@ if(!holder) listening = !listening var/turf/T = get_turf(src) - T.visible_message("\icon[src] beeps, \"[listening ? "Now" : "No longer"] recording input.\"") + T.visible_message("[bicon(src)] beeps, \"[listening ? "Now" : "No longer"] recording input.\"") /obj/item/device/assembly/voice/attack_self(mob/user) - if(!user) return 0 + if(!user) + return FALSE activate() - return 1 - + return TRUE /obj/item/device/assembly/voice/toggle_secure() . = ..() diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 123b653052..bd88744d70 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -26,7 +26,7 @@ /obj/machinery/gateway/centerstation density = 1 icon_state = "offcenter" - use_power = 1 + use_power = USE_POWER_IDLE //warping vars var/list/linked = list() @@ -142,7 +142,7 @@ obj/machinery/gateway/centerstation/process() /obj/machinery/gateway/centeraway density = 1 icon_state = "offcenter" - use_power = 0 + use_power = USE_POWER_OFF var/calibrated = 1 var/list/linked = list() //a list of the connected gateway chunks var/ready = 0 diff --git a/code/modules/blob2/announcement.dm b/code/modules/blob2/announcement.dm deleted file mode 100644 index 6eceeec569..0000000000 --- a/code/modules/blob2/announcement.dm +++ /dev/null @@ -1,18 +0,0 @@ -/proc/level_seven_blob_announcement(var/obj/structure/blob/core/B) - if(!B || !B.overmind) - return - var/datum/blob_type/blob = B.overmind.blob_type // Shortcut so we don't need to delve into three variables every time. - var/list/lines = list() - - lines += "Confirmed outbreak of level [7 + blob.difficulty] biohazard aboard [station_name()]. All personnel must contain the outbreak." - - if(blob.difficulty >= BLOB_DIFFICULTY_MEDIUM) // Tell them what kind of blob it is if it's tough. - lines += "The biohazard has been identified as a '[blob.name]'." - - if(blob.difficulty >= BLOB_DIFFICULTY_HARD) // If it's really hard then tell them where it is so the response occurs faster. - lines += "It is suspected to have originated from \the [get_area(B)]." - - if(blob.difficulty >= BLOB_DIFFICULTY_SUPERHARD) - lines += "Extreme caution is advised." - - command_announcement.Announce(lines.Join("\n"), "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg') \ No newline at end of file diff --git a/code/modules/blob2/blobs/base_blob.dm b/code/modules/blob2/blobs/base_blob.dm index 527184ebb2..2e04c36b95 100644 --- a/code/modules/blob2/blobs/base_blob.dm +++ b/code/modules/blob2/blobs/base_blob.dm @@ -1,4 +1,4 @@ -var/list/blobs = list() +GLOBAL_LIST_EMPTY(all_blobs) /obj/structure/blob name = "blob" @@ -19,21 +19,21 @@ var/list/blobs = list() var/base_name = "blob" // The name that gets appended along with the blob_type's name. var/faction = "blob" -/obj/structure/blob/New(var/newloc, var/new_overmind) - ..(newloc) +/obj/structure/blob/Initialize(newloc, new_overmind) if(new_overmind) overmind = new_overmind update_icon() if(!integrity) integrity = max_integrity set_dir(pick(cardinal)) - blobs += src + GLOB.all_blobs += src consume_tile() + return ..() /obj/structure/blob/Destroy() playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) //Expand() is no longer broken, no check necessary. - blobs -= src + GLOB.all_blobs -= src overmind = null return ..() @@ -115,7 +115,7 @@ var/list/blobs = list() if(overmind) expand_probablity *= overmind.blob_type.spread_modifier if(overmind.blob_type.slow_spread_with_size) - expand_probablity /= (blobs.len / 10) + expand_probablity /= (GLOB.all_blobs.len / 10) if(distance <= expand_range) var/can_expand = TRUE diff --git a/code/modules/blob2/blobs/core.dm b/code/modules/blob2/blobs/core.dm index d9bd056d7f..b3633b406e 100644 --- a/code/modules/blob2/blobs/core.dm +++ b/code/modules/blob2/blobs/core.dm @@ -12,6 +12,7 @@ var/list/blob_cores = list() health_regen = 0 //we regen in Life() instead of when pulsed var/datum/blob_type/desired_blob_type = null // If this is set, the core always creates an overmind possessing this blob type. var/difficulty_threshold = null // Otherwise if this is set, it picks a random blob_type that is equal or lower in difficulty. + var/difficulty_floor = null // Related to the above var, acts as a floor value to the above, inclusive. var/core_regen = 2 var/overmind_get_delay = 0 //we don't want to constantly try to find an overmind, this var tracks when we'll try to get an overmind again var/resource_delay = 0 @@ -23,14 +24,18 @@ var/list/blob_cores = list() ai_controlled = FALSE // Spawn these if you want a semi-random blob. +// Can give a random easy blob. /obj/structure/blob/core/random_easy difficulty_threshold = BLOB_DIFFICULTY_EASY +// Can give a random easy or medium blob. /obj/structure/blob/core/random_medium difficulty_threshold = BLOB_DIFFICULTY_MEDIUM +// Can give a random medium or hard blob. /obj/structure/blob/core/random_hard difficulty_threshold = BLOB_DIFFICULTY_HARD + difficulty_floor = BLOB_DIFFICULTY_MEDIUM // Spawn these if you want a specific blob. /obj/structure/blob/core/blazing_oil @@ -90,8 +95,8 @@ var/list/blob_cores = list() /obj/structure/blob/core/classic desired_blob_type = /datum/blob_type/classic -/obj/structure/blob/core/New(var/newloc, var/client/new_overmind = null, new_rate = 2, placed = 0) - ..(newloc) +/obj/structure/blob/core/Initialize(newloc, client/new_overmind = null, new_rate = 2, placed = 0) + . = ..(newloc) blob_cores += src START_PROCESSING(SSobj, src) update_icon() //so it atleast appears @@ -194,7 +199,9 @@ var/list/blob_cores = list() var/list/valid_types = list() for(var/thing in subtypesof(/datum/blob_type)) var/datum/blob_type/BT = thing - if(initial(BT.difficulty) > difficulty_threshold) + if(initial(BT.difficulty) > difficulty_threshold) // Too hard. + continue + if(initial(BT.difficulty) < difficulty_floor) // Too easy. continue valid_types += BT return pick(valid_types) diff --git a/code/modules/blob2/blobs/resource.dm b/code/modules/blob2/blobs/resource.dm index 189abfd520..0cd3f06f10 100644 --- a/code/modules/blob2/blobs/resource.dm +++ b/code/modules/blob2/blobs/resource.dm @@ -9,10 +9,10 @@ var/resource_delay = 0 var/resource_cooldown = 4 SECONDS -/obj/structure/blob/resource/New(var/newloc, var/new_overmind) - ..(newloc, new_overmind) +/obj/structure/blob/resource/Initialize(newloc, new_overmind) if(overmind) overmind.resource_blobs += src + return ..() /obj/structure/blob/resource/Destroy() if(overmind) diff --git a/code/modules/blob2/overmind/overmind.dm b/code/modules/blob2/overmind/overmind.dm index 223cb41e60..ffcd347dd8 100644 --- a/code/modules/blob2/overmind/overmind.dm +++ b/code/modules/blob2/overmind/overmind.dm @@ -23,7 +23,7 @@ var/list/overminds = list() var/ai_controlled = TRUE var/auto_pilot = FALSE // If true, and if a client is attached, the AI routine will continue running. -/mob/observer/blob/New(var/newloc, pre_placed = 0, starting_points = 60, desired_blob_type = null) +/mob/observer/blob/Initialize(newloc, pre_placed = 0, starting_points = 60, desired_blob_type = null) blob_points = starting_points if(pre_placed) //we already have a core! placed = 1 @@ -40,12 +40,11 @@ var/list/overminds = list() color = blob_type.complementary_color if(blob_core) blob_core.update_icon() - level_seven_blob_announcement(blob_core) - ..(newloc) + return ..(newloc) /mob/observer/blob/Destroy() - for(var/BL in blobs) + for(var/BL in GLOB.all_blobs) var/obj/structure/blob/B = BL if(B && B.overmind == src) B.overmind = null @@ -66,7 +65,7 @@ var/list/overminds = list() if(blob_core) stat(null, "Core Health: [blob_core.integrity]") stat(null, "Power Stored: [blob_points]/[max_blob_points]") - stat(null, "Total Blobs: [blobs.len]") + stat(null, "Total Blobs: [GLOB.all_blobs.len]") /mob/observer/blob/Move(NewLoc, Dir = 0) if(placed) diff --git a/code/modules/blob2/overmind/powers.dm b/code/modules/blob2/overmind/powers.dm index 360bfbb10b..f5727e94bf 100644 --- a/code/modules/blob2/overmind/powers.dm +++ b/code/modules/blob2/overmind/powers.dm @@ -22,6 +22,9 @@ to_chat(src, "There is no blob here!") return + if(B.overmind != src) + to_chat(src, span("warning", "This blob isn't controlled by you.")) + if(!istype(B, /obj/structure/blob/normal)) to_chat(src, "Unable to use this blob, find a normal one.") return @@ -66,7 +69,7 @@ return FALSE var/obj/structure/blob/B = null - var/list/potential_blobs = blobs.Copy() + var/list/potential_blobs = GLOB.all_blobs.Copy() while(potential_blobs.len) var/obj/structure/blob/temp = pick(potential_blobs) if(!(locate(/obj/structure/blob/node) in range(temp, BLOB_NODE_PULSE_RANGE) ) && !(locate(/obj/structure/blob/core) in range(temp, BLOB_CORE_PULSE_RANGE) )) @@ -77,6 +80,8 @@ potential_blobs -= temp // Don't take up the core's shield spot. else if(!istype(temp, /obj/structure/blob/normal)) potential_blobs -= temp // Not a normal blob. + else if(temp.overmind != src) + potential_blobs -= temp // Not our blob. else B = temp break @@ -107,7 +112,7 @@ return FALSE var/obj/structure/blob/B = null - var/list/potential_blobs = blobs.Copy() + var/list/potential_blobs = GLOB.all_blobs.Copy() while(potential_blobs.len) var/obj/structure/blob/temp = pick(potential_blobs) if(!(locate(/obj/structure/blob/node) in range(temp, BLOB_NODE_PULSE_RANGE) ) && !(locate(/obj/structure/blob/core) in range(temp, BLOB_CORE_PULSE_RANGE) )) @@ -118,6 +123,8 @@ potential_blobs -= temp // Don't take up the core's shield spot. else if(!istype(temp, /obj/structure/blob/normal)) potential_blobs -= temp // Not a normal blob. + else if(temp.overmind != src) + potential_blobs -= temp // Not our blob. else B = temp break @@ -149,7 +156,7 @@ return FALSE var/obj/structure/blob/B = null - var/list/potential_blobs = blobs.Copy() + var/list/potential_blobs = GLOB.all_blobs.Copy() while(potential_blobs.len) var/obj/structure/blob/temp = pick(potential_blobs) if(locate(/obj/structure/blob/node) in range(temp, 5) ) @@ -158,6 +165,8 @@ potential_blobs -= temp else if(!istype(temp, /obj/structure/blob/normal)) potential_blobs -= temp + else if(temp.overmind != src) + potential_blobs -= temp // Not our blob. else B = temp break @@ -184,7 +193,7 @@ other_T = get_step(T, direction) if(other_T) B = locate(/obj/structure/blob) in other_T - if(B) + if(B && B.overmind == src) break if(!B) @@ -216,7 +225,7 @@ for(var/direction in cardinal) var/turf/T = get_step(L, direction) B = locate(/obj/structure/blob) in T - if(B) + if(B && B.overmind == src) break if(!B) continue diff --git a/code/modules/catalogue/cataloguer.dm b/code/modules/catalogue/cataloguer.dm index f1c5756443..e4e148c230 100644 --- a/code/modules/catalogue/cataloguer.dm +++ b/code/modules/catalogue/cataloguer.dm @@ -25,6 +25,7 @@ GLOBAL_LIST_EMPTY(all_cataloguers) w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_MATERIAL = 2, TECH_DATA = 3, TECH_MAGNET = 3) force = 0 + slot_flags = SLOT_BELT var/points_stored = 0 // Amount of 'exploration points' this device holds. var/scan_range = 3 // How many tiles away it can scan. Changing this also changes the box size. var/credit_sharing_range = 14 // If another person is within this radius, they will also be credited with a successful scan. diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm new file mode 100644 index 0000000000..ef64cd4acd --- /dev/null +++ b/code/modules/client/asset_cache.dm @@ -0,0 +1,272 @@ +/* +Asset cache quick users guide: + +Make a datum at the bottom of this file with your assets for your thing. +The simple subsystem will most like be of use for most cases. +Then call get_asset_datum() with the type of the datum you created and store the return +Then call .send(client) on that stored return value. + +You can set verify to TRUE if you want send() to sleep until the client has the assets. +*/ + + +// Amount of time(ds) MAX to send per asset, if this get exceeded we cancel the sleeping. +// This is doubled for the first asset, then added per asset after +#define ASSET_CACHE_SEND_TIMEOUT 7 + +//When sending mutiple assets, how many before we give the client a quaint little sending resources message +#define ASSET_CACHE_TELL_CLIENT_AMOUNT 8 + +//When passively preloading assets, how many to send at once? Too high creates noticable lag where as too low can flood the client's cache with "verify" files +#define ASSET_CACHE_PRELOAD_CONCURRENT 3 + +/client + var/list/cache = list() // List of all assets sent to this client by the asset cache. + var/list/completed_asset_jobs = list() // List of all completed jobs, awaiting acknowledgement. + var/list/sending = list() + var/last_asset_job = 0 // Last job done. + +//This proc sends the asset to the client, but only if it needs it. +//This proc blocks(sleeps) unless verify is set to false +/proc/send_asset(var/client/client, var/asset_name, var/verify = TRUE) + client = CLIENT_FROM_VAR(client) // Will get client from a mob, or accept a client, or return null + if(!istype(client)) + return 0 + + if(client.cache.Find(asset_name) || client.sending.Find(asset_name)) + return 0 + + client << browse_rsc(SSassets.cache[asset_name], asset_name) + if(!verify) // Can't access the asset cache browser, rip. + client.cache += asset_name + return 1 + + client.sending |= asset_name + var/job = ++client.last_asset_job + + client << browse({" + + "}, "window=asset_cache_browser") + + var/t = 0 + var/timeout_time = (ASSET_CACHE_SEND_TIMEOUT * client.sending.len) + ASSET_CACHE_SEND_TIMEOUT + while(client && !client.completed_asset_jobs.Find(job) && t < timeout_time) // Reception is handled in Topic() + sleep(1) // Lock up the caller until this is received. + t++ + + if(client) + client.sending -= asset_name + client.cache |= asset_name + client.completed_asset_jobs -= job + + return 1 + +//This proc blocks(sleeps) unless verify is set to false +/proc/send_asset_list(var/client/client, var/list/asset_list, var/verify = TRUE) + client = CLIENT_FROM_VAR(client) // Will get client from a mob, or accept a client, or return null + if(!istype(client)) + return 0 + + var/list/unreceived = asset_list - (client.cache + client.sending) + if(!unreceived || !unreceived.len) + return 0 + if(unreceived.len >= ASSET_CACHE_TELL_CLIENT_AMOUNT) + to_chat(client, "Sending Resources...") + for(var/asset in unreceived) + if(asset in SSassets.cache) + client << browse_rsc(SSassets.cache[asset], asset) + + if(!verify) // Can't access the asset cache browser, rip. + client.cache += unreceived + return 1 + + client.sending |= unreceived + var/job = ++client.last_asset_job + + client << browse({" + + "}, "window=asset_cache_browser") + + var/t = 0 + var/timeout_time = ASSET_CACHE_SEND_TIMEOUT * client.sending.len + while(client && !client.completed_asset_jobs.Find(job) && t < timeout_time) // Reception is handled in Topic() + sleep(1) // Lock up the caller until this is received. + t++ + + if(client) + client.sending -= unreceived + client.cache |= unreceived + client.completed_asset_jobs -= job + + return 1 + +//This proc will download the files without clogging up the browse() queue, used for passively sending files on connection start. +//The proc calls procs that sleep for long times. +/proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE) + var/concurrent_tracker = 1 + for(var/file in files) + if(!client) + break + if(register_asset) + register_asset(file, files[file]) + if(concurrent_tracker >= ASSET_CACHE_PRELOAD_CONCURRENT) + concurrent_tracker = 1 + send_asset(client, file) + else + concurrent_tracker++ + send_asset(client, file, verify = FALSE) + sleep(0) //queuing calls like this too quickly can cause issues in some client versions + +//This proc "registers" an asset, it adds it to the cache for further use, you cannot touch it from this point on or you'll fuck things up. +//if it's an icon or something be careful, you'll have to copy it before further use. +/proc/register_asset(var/asset_name, var/asset) + SSassets.cache[asset_name] = asset + +//These datums are used to populate the asset cache, the proc "register()" does this. + +//all of our asset datums, used for referring to these later +/var/global/list/asset_datums = list() + +//get a assetdatum or make a new one +/proc/get_asset_datum(var/type) + if(!(type in asset_datums)) + return new type() + return asset_datums[type] + +/datum/asset/New() + asset_datums[type] = src + +/datum/asset/proc/register() + return + +/datum/asset/proc/send(client) + return + +//If you don't need anything complicated. +/datum/asset/simple + var/assets = list() + var/verify = FALSE + +/datum/asset/simple/register() + for(var/asset_name in assets) + register_asset(asset_name, assets[asset_name]) +/datum/asset/simple/send(client) + send_asset_list(client,assets,verify) + + +//DEFINITIONS FOR ASSET DATUMS START HERE. +/datum/asset/simple/pda + assets = list( + "pda_atmos.png" = 'icons/pda_icons/pda_atmos.png', + "pda_back.png" = 'icons/pda_icons/pda_back.png', + "pda_bell.png" = 'icons/pda_icons/pda_bell.png', + "pda_blank.png" = 'icons/pda_icons/pda_blank.png', + "pda_boom.png" = 'icons/pda_icons/pda_boom.png', + "pda_bucket.png" = 'icons/pda_icons/pda_bucket.png', + "pda_crate.png" = 'icons/pda_icons/pda_crate.png', + "pda_cuffs.png" = 'icons/pda_icons/pda_cuffs.png', + "pda_eject.png" = 'icons/pda_icons/pda_eject.png', + "pda_exit.png" = 'icons/pda_icons/pda_exit.png', + "pda_flashlight.png" = 'icons/pda_icons/pda_flashlight.png', + "pda_honk.png" = 'icons/pda_icons/pda_honk.png', + "pda_mail.png" = 'icons/pda_icons/pda_mail.png', + "pda_medical.png" = 'icons/pda_icons/pda_medical.png', + "pda_menu.png" = 'icons/pda_icons/pda_menu.png', + "pda_mule.png" = 'icons/pda_icons/pda_mule.png', + "pda_notes.png" = 'icons/pda_icons/pda_notes.png', + "pda_power.png" = 'icons/pda_icons/pda_power.png', + "pda_rdoor.png" = 'icons/pda_icons/pda_rdoor.png', + "pda_reagent.png" = 'icons/pda_icons/pda_reagent.png', + "pda_refresh.png" = 'icons/pda_icons/pda_refresh.png', + "pda_scanner.png" = 'icons/pda_icons/pda_scanner.png', + "pda_signaler.png" = 'icons/pda_icons/pda_signaler.png', + "pda_status.png" = 'icons/pda_icons/pda_status.png' + ) + +/datum/asset/simple/generic + assets = list( + "search.js" = 'html/search.js', + "panels.css" = 'html/panels.css', + "loading.gif" = 'html/images/loading.gif', + "ntlogo.png" = 'html/images/ntlogo.png', + "sglogo.png" = 'html/images/sglogo.png', + "talisman.png" = 'html/images/talisman.png', + "paper_bg.png" = 'html/images/paper_bg.png', + "no_image32.png" = 'html/images/no_image32.png', + "sos_1.png" = 'icons/spideros_icons/sos_1.png', + "sos_2.png" = 'icons/spideros_icons/sos_2.png', + "sos_3.png" = 'icons/spideros_icons/sos_3.png', + "sos_4.png" = 'icons/spideros_icons/sos_4.png', + "sos_5.png" = 'icons/spideros_icons/sos_5.png', + "sos_6.png" = 'icons/spideros_icons/sos_6.png', + "sos_7.png" = 'icons/spideros_icons/sos_7.png', + "sos_8.png" = 'icons/spideros_icons/sos_8.png', + "sos_9.png" = 'icons/spideros_icons/sos_9.png', + "sos_10.png" = 'icons/spideros_icons/sos_10.png', + "sos_11.png" = 'icons/spideros_icons/sos_11.png', + "sos_12.png" = 'icons/spideros_icons/sos_12.png', + "sos_13.png" = 'icons/spideros_icons/sos_13.png', + "sos_14.png" = 'icons/spideros_icons/sos_14.png' + ) + +/datum/asset/simple/changelog + assets = list( + "88x31.png" = 'html/88x31.png', + "bug-minus.png" = 'html/bug-minus.png', + "cross-circle.png" = 'html/cross-circle.png', + "hard-hat-exclamation.png" = 'html/hard-hat-exclamation.png', + "image-minus.png" = 'html/image-minus.png', + "image-plus.png" = 'html/image-plus.png', + "map-pencil.png" = 'html/map-pencil.png', + "music-minus.png" = 'html/music-minus.png', + "music-plus.png" = 'html/music-plus.png', + "tick-circle.png" = 'html/tick-circle.png', + "wrench-screwdriver.png" = 'html/wrench-screwdriver.png', + "spell-check.png" = 'html/spell-check.png', + "burn-exclamation.png" = 'html/burn-exclamation.png', + "chevron.png" = 'html/chevron.png', + "chevron-expand.png" = 'html/chevron-expand.png', + "changelog.css" = 'html/changelog.css', + "changelog.js" = 'html/changelog.js', + "changelog.html" = 'html/changelog.html' + ) + +/datum/asset/nanoui + var/list/common = list() + + var/list/common_dirs = list( + "nano/css/", + "nano/images/", + "nano/images/modular_computers/", + "nano/js/" + ) + var/list/uncommon_dirs = list( + "nano/templates/" + ) + +/datum/asset/nanoui/register() + // Crawl the directories to find files. + for(var/path in common_dirs) + var/list/filenames = flist(path) + for(var/filename in filenames) + if(copytext(filename, length(filename)) != "/") // Ignore directories. + if(fexists(path + filename)) + common[filename] = fcopy_rsc(path + filename) + register_asset(filename, common[filename]) + for(var/path in uncommon_dirs) + var/list/filenames = flist(path) + for(var/filename in filenames) + if(copytext(filename, length(filename)) != "/") // Ignore directories. + if(fexists(path + filename)) + register_asset(filename, fcopy_rsc(path + filename)) + +/datum/asset/nanoui/send(client, uncommon) + if(!islist(uncommon)) + uncommon = list(uncommon) + + send_asset_list(client, uncommon) + send_asset_list(client, common) diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index d95f1b0cea..acdb61950c 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -24,8 +24,12 @@ var/area = null var/time_died_as_mouse = null //when the client last died as a mouse var/datum/tooltip/tooltips = null + var/datum/chatOutput/chatOutput + var/chatOutputLoadedAt var/adminhelped = 0 + var/examine_text_mode = 0 // Just examine text, include usage (description_info), switch to examine panel. + /////////////// //SOUND STUFF// diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index d997733d8e..933729fa13 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -34,6 +34,11 @@ #endif + if(href_list["asset_cache_confirm_arrival"]) + var/job = text2num(href_list["asset_cache_confirm_arrival"]) + completed_asset_jobs += job + return + //search the href for script injection if( findtext(href,"[time2text(world.timeofday,"hh:mm")] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
" @@ -71,6 +74,11 @@ if("usr") hsrc = mob if("prefs") return prefs.process_link(usr,href_list) if("vars") return view_var_Topic(href,href_list,hsrc) + if("chat") return chatOutput.Topic(href, href_list) + + switch(href_list["action"]) + if("openLink") + src << link(href_list["link"]) ..() //redirect to hsrc.Topic() @@ -105,8 +113,14 @@ del(src) return - to_chat(src, "If the title screen is black, resources are still downloading. Please be patient until the title screen appears.") + chatOutput = new /datum/chatOutput(src) //veechat + chatOutput.send_resources() + spawn() + chatOutput.start() + //Only show this if they are put into a new_player mob. Otherwise, "what title screen?" + if(isnewplayer(src.mob)) + to_chat(src, "If the title screen is black, resources are still downloading. Please be patient until the title screen appears.") GLOB.clients += src GLOB.directory[ckey] = src @@ -136,6 +150,8 @@ to_chat(src, "[custom_event_msg]") to_chat(src, "
") + if(!winexists(src, "asset_cache_browser")) // The client is using a custom skin, tell them. + to_chat(src, "Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you.") if(holder) add_admin_verbs() @@ -152,14 +168,13 @@ log_client_to_db() send_resources() - SSnanoui.send_resources(src) if(!void) void = new() void.MakeGreed() screen += void - if(prefs.lastchangelog != changelog_hash) //bolds the changelog button on the interface so we know there are updates. + if((prefs.lastchangelog != changelog_hash) && isnewplayer(src.mob)) //bolds the changelog button on the interface so we know there are updates. to_chat(src, "You have unread updates in the changelog.") winset(src, "rpane.changelog", "background-color=#eaeaea;font-style=bold") if(config.aggressive_changelog) @@ -344,56 +359,9 @@ //send resources to the client. It's here in its own proc so we can move it around easiliy if need be /client/proc/send_resources() - - getFiles( - 'html/search.js', - 'html/panels.css', - 'html/images/loading.gif', - 'html/images/ntlogo.png', - 'html/images/sglogo.png', - 'html/images/talisman.png', - 'html/images/paper_bg.png', - 'html/images/no_image32.png', - 'icons/pda_icons/pda_atmos.png', - 'icons/pda_icons/pda_back.png', - 'icons/pda_icons/pda_bell.png', - 'icons/pda_icons/pda_blank.png', - 'icons/pda_icons/pda_boom.png', - 'icons/pda_icons/pda_bucket.png', - 'icons/pda_icons/pda_crate.png', - 'icons/pda_icons/pda_cuffs.png', - 'icons/pda_icons/pda_eject.png', - 'icons/pda_icons/pda_exit.png', - 'icons/pda_icons/pda_flashlight.png', - 'icons/pda_icons/pda_honk.png', - 'icons/pda_icons/pda_mail.png', - 'icons/pda_icons/pda_medical.png', - 'icons/pda_icons/pda_menu.png', - 'icons/pda_icons/pda_mule.png', - 'icons/pda_icons/pda_notes.png', - 'icons/pda_icons/pda_power.png', - 'icons/pda_icons/pda_rdoor.png', - 'icons/pda_icons/pda_reagent.png', - 'icons/pda_icons/pda_refresh.png', - 'icons/pda_icons/pda_scanner.png', - 'icons/pda_icons/pda_signaler.png', - 'icons/pda_icons/pda_status.png', - 'icons/spideros_icons/sos_1.png', - 'icons/spideros_icons/sos_2.png', - 'icons/spideros_icons/sos_3.png', - 'icons/spideros_icons/sos_4.png', - 'icons/spideros_icons/sos_5.png', - 'icons/spideros_icons/sos_6.png', - 'icons/spideros_icons/sos_7.png', - 'icons/spideros_icons/sos_8.png', - 'icons/spideros_icons/sos_9.png', - 'icons/spideros_icons/sos_10.png', - 'icons/spideros_icons/sos_11.png', - 'icons/spideros_icons/sos_12.png', - 'icons/spideros_icons/sos_13.png', - 'icons/spideros_icons/sos_14.png' - ) - + spawn (10) //removing this spawn causes all clients to not get verbs. + //Precache the client with all other assets slowly, so as to not block other browse() calls + getFilesSlow(src, SSassets.preload, register_asset = FALSE) mob/proc/MayRespawn() return 0 @@ -429,6 +397,27 @@ client/verb/character_setup() return FALSE return ..() +/client/verb/reload_vchat() + set name = "Reload VChat" + set category = "OOC" + + //Timing + if(src.chatOutputLoadedAt > (world.time - 10 SECONDS)) + alert(src, "You can only try to reload VChat every 10 seconds at most.") + return + + //Log, disable + log_debug("[key_name(src)] reloaded VChat.") + winset(src, null, "outputwindow.htmloutput.is-visible=false;outputwindow.oldoutput.is-visible=false;outputwindow.chatloadlabel.is-visible=true") + + //The hard way + qdel_null(src.chatOutput) + chatOutput = new /datum/chatOutput(src) //veechat + chatOutput.send_resources() + spawn() + chatOutput.start() + + //This is for getipintel.net. //You're welcome to replace this proc with your own that does your own cool stuff. //Just set the client's ip_reputation var and make sure it makes sense with your config settings (higher numbers are worse results) diff --git a/code/modules/client/preference_setup/loadout/loadout_general.dm b/code/modules/client/preference_setup/loadout/loadout_general.dm index 5fd43d268a..121378723f 100644 --- a/code/modules/client/preference_setup/loadout/loadout_general.dm +++ b/code/modules/client/preference_setup/loadout/loadout_general.dm @@ -4,11 +4,11 @@ /datum/gear/cane/white display_name = "white cane" - path = /obj/item/weapon/cane/whitecane + path = /obj/item/weapon/cane/white /datum/gear/cane/white2 display_name = "telescopic white cane" - path = /obj/item/weapon/melee/collapsable_whitecane + path = /obj/item/weapon/cane/white/collapsible /datum/gear/crutch display_name = "crutch" diff --git a/code/modules/client/preferences_toggle_procs.dm b/code/modules/client/preferences_toggle_procs.dm index 4c2c1177b0..cb1880383b 100644 --- a/code/modules/client/preferences_toggle_procs.dm +++ b/code/modules/client/preferences_toggle_procs.dm @@ -293,6 +293,26 @@ feedback_add_details("admin_verb","THInstm") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +// Not attached to a pref datum because those are strict binary toggles +/client/verb/toggle_examine_mode() + set name = "Toggle Examine Mode" + set category = "Preferences" + set desc = "Control the additional behaviour of examining things" + + examine_text_mode++ + examine_text_mode %= EXAMINE_MODE_MAX // This cycles through them because if you're already specifically being routed to the examine panel, you probably don't need to have the extra text printed to chat + switch(examine_text_mode) // ... And I only wanted to add one verb + if(EXAMINE_MODE_DEFAULT) + to_chat(src, "Examining things will only output the base examine text, and you will not be redirected to the examine panel automatically.") + + if(EXAMINE_MODE_INCLUDE_USAGE) + to_chat(src, "Examining things will also print any extra usage information normally included in the examine panel to the chat.") + + if(EXAMINE_MODE_SWITCH_TO_PANEL) + to_chat(src, "Examining things will direct you to the examine panel, where you can view extended information about the thing.") + + //Toggles for Staff //Developers diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index e8d12fb489..f69d9cb50a 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -172,7 +172,7 @@ else O = src - user.u_equip(src) + user.unEquip(src) if (O) user.put_in_hands(O) @@ -186,6 +186,24 @@ var/mob/M = src.loc M.update_inv_ears() +/obj/item/clothing/ears/MouseDrop(var/obj/over_object) + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + // If this covers both ears, we want to return the result of unequipping the primary object, and kill the off-ear one + if(slot_flags & SLOT_TWOEARS) + var/obj/item/clothing/ears/O = (H.l_ear == src ? H.r_ear : H.l_ear) + if(istype(src, /obj/item/clothing/ears/offear)) + . = O.MouseDrop(over_object) + H.drop_from_inventory(src) + qdel(src) + else + . = ..() + H.drop_from_inventory(O) + qdel(O) + else + . = ..() + + /obj/item/clothing/ears/offear name = "Other ear" w_class = ITEMSIZE_HUGE @@ -193,7 +211,7 @@ icon_state = "block" slot_flags = SLOT_EARS | SLOT_TWOEARS - New(var/obj/O) +/obj/item/clothing/ears/offear/New(var/obj/O) name = O.name desc = O.desc icon = O.icon diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index d93c866bd3..4b82cbbe25 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -437,7 +437,7 @@ BLIND // can't see anything toggleable = 1 action_button_name = "Toggle Goggles" vision_flags = SEE_MOBS - enables_planes = list(VIS_FULLBRIGHT) + enables_planes = list(VIS_FULLBRIGHT, VIS_CLOAKED) flash_protection = FLASH_PROTECTION_REDUCED emp_act(severity) diff --git a/code/modules/clothing/gloves/antagonist.dm b/code/modules/clothing/gloves/antagonist.dm index b11a29313d..d1a01d0e68 100644 --- a/code/modules/clothing/gloves/antagonist.dm +++ b/code/modules/clothing/gloves/antagonist.dm @@ -146,7 +146,7 @@ living_mob_list += H H.timeofdeath = 0 - H.stat = UNCONSCIOUS + H.set_stat(UNCONSCIOUS) H.failed_last_breath = 0 H.reload_fullscreen() diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index d1cd58f556..acd713199f 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -94,18 +94,18 @@ var/datum/effect/effect/system/spark_spread/spark_system /obj/item/weapon/rig/examine() - to_chat(usr, "This is \icon[src][src.name].") + to_chat(usr, "This is [bicon(src)][src.name].") to_chat(usr, "[src.desc]") if(wearer) for(var/obj/item/piece in list(helmet,gloves,chest,boots)) if(!piece || piece.loc != wearer) continue - to_chat(usr, "\icon[piece] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed.") + to_chat(usr, "[bicon(piece)] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed.") if(src.loc == usr) to_chat(usr, "The access panel is [locked? "locked" : "unlocked"].") to_chat(usr, "The maintenance panel is [open ? "open" : "closed"].") - to_chat(usr, "Hardsuit systems are [offline ? "offline" : "online"].") + to_chat(usr, "Hardsuit systems are [offline ? "offline" : "online"].") to_chat(usr, "The cooling stystem is [cooling_on ? "active" : "inactive"].") if(open) @@ -273,7 +273,7 @@ if(!failed_to_seal) if(!instant) - M.visible_message("[M]'s suit emits a quiet hum as it begins to adjust its seals.","With a quiet hum, the suit begins running checks and adjusting components.") + M.visible_message("[M]'s suit emits a quiet hum as it begins to adjust its seals.","With a quiet hum, the suit begins running checks and adjusting components.") if(seal_delay && !do_after(M,seal_delay)) if(M) to_chat(M, "You must remain still while the suit is adjusting the components.") @@ -305,16 +305,16 @@ piece.icon_state = "[suit_state][!seal_target ? "_sealed" : ""]" switch(msg_type) if("boots") - to_chat(M, "\The [piece] [!seal_target ? "seal around your feet" : "relax their grip on your legs"].") + to_chat(M, "\The [piece] [!seal_target ? "seal around your feet" : "relax their grip on your legs"].") M.update_inv_shoes() if("gloves") - to_chat(M, "\The [piece] [!seal_target ? "tighten around your fingers and wrists" : "become loose around your fingers"].") + to_chat(M, "\The [piece] [!seal_target ? "tighten around your fingers and wrists" : "become loose around your fingers"].") M.update_inv_gloves() if("chest") - to_chat(M, "\The [piece] [!seal_target ? "cinches tight again your chest" : "releases your chest"].") + to_chat(M, "\The [piece] [!seal_target ? "cinches tight again your chest" : "releases your chest"].") M.update_inv_wear_suit() if("helmet") - to_chat(M, "\The [piece] hisses [!seal_target ? "closed" : "open"].") + to_chat(M, "\The [piece] hisses [!seal_target ? "closed" : "open"].") M.update_inv_head() if(helmet) helmet.update_light(wearer) @@ -349,7 +349,7 @@ // Success! canremove = seal_target - to_chat(M, "Your entire suit [canremove ? "loosens as the components relax" : "tightens around you as the components lock into place"].") + to_chat(M, "Your entire suit [canremove ? "loosens as the components relax" : "tightens around you as the components lock into place"].") M.client.screen -= booting_L qdel(booting_L) booting_R.icon_state = "boot_done" @@ -734,7 +734,7 @@ return if(seal_delay > 0 && istype(M) && (M.back == src || M.belt == src)) - M.visible_message("[M] starts putting on \the [src]...", "You start putting on \the [src]...") + M.visible_message("[M] starts putting on \the [src]...", "You start putting on \the [src]...") if(!do_after(M,seal_delay)) if(M && (M.back == src || M.belt == src)) if(!M.unEquip(src)) @@ -743,7 +743,7 @@ return if(istype(M) && (M.back == src || M.belt == src)) - M.visible_message("[M] struggles into \the [src].", "You struggle into \the [src].") + M.visible_message("[M] struggles into \the [src].", "You struggle into \the [src].") wearer = M wearer.wearing_rig = src update_icon() @@ -793,7 +793,7 @@ holder = use_obj.loc if(istype(holder)) if(use_obj && check_slot == use_obj) - to_chat(H, "Your [use_obj.name] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly.") + to_chat(H, "Your [use_obj.name] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly.") use_obj.canremove = 1 holder.drop_from_inventory(use_obj) use_obj.forceMove(get_turf(src)) diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 441302654f..f3fd40fa00 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -11,7 +11,7 @@ on_rolled = list("down" = "none") var/hide_on_roll = FALSE -/obj/item/clothing/accessory/storage/New() +/obj/item/clothing/accessory/storage/Initialize() ..() hold = new/obj/item/weapon/storage/internal(src) hold.max_storage_space = slots * 2 @@ -94,7 +94,7 @@ icon_state = "unathiharness2" slots = 2 -/obj/item/clothing/accessory/storage/knifeharness/New() +/obj/item/clothing/accessory/storage/knifeharness/Initialize() ..() hold.max_storage_space = ITEMSIZE_COST_SMALL * 2 hold.can_hold = list(/obj/item/weapon/material/knife/machete/hatchet/unathiknife,\ diff --git a/code/modules/clothing/under/xenos/vox.dm b/code/modules/clothing/under/xenos/vox.dm index ecbc618061..7e90ad4665 100644 --- a/code/modules/clothing/under/xenos/vox.dm +++ b/code/modules/clothing/under/xenos/vox.dm @@ -27,7 +27,7 @@ slots = 3 -/obj/item/clothing/accessory/storage/vox/New() +/obj/item/clothing/accessory/storage/vox/Initialize() ..() hold.max_storage_space = slots * ITEMSIZE_COST_NORMAL hold.max_w_class = ITEMSIZE_NORMAL \ No newline at end of file diff --git a/code/modules/detectivework/microscope/dnascanner.dm b/code/modules/detectivework/microscope/dnascanner.dm index 5d6140db61..94d4acd5cd 100644 --- a/code/modules/detectivework/microscope/dnascanner.dm +++ b/code/modules/detectivework/microscope/dnascanner.dm @@ -115,7 +115,7 @@ last_process_worldtime = world.time /obj/machinery/dnaforensics/proc/complete_scan() - src.visible_message("\icon[src] makes an insistent chime.", 2) + src.visible_message("[bicon(src)] makes an insistent chime.", 2) update_icon() if(bloodsamp) var/obj/item/weapon/paper/P = new(src) diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 0643f6992b..2b0fae4923 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -20,7 +20,7 @@ log transactions icon = 'icons/obj/terminals.dmi' icon_state = "atm" anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 10 circuit = /obj/item/weapon/circuitboard/atm var/datum/money_account/authenticated_account @@ -76,7 +76,7 @@ log transactions //display a message to the user var/response = pick("Initiating withdraw. Have a nice day!", "CRITICAL ERROR: Activating cash chamber panic siphon.","PIN Code accepted! Emptying account balance.", "Jackpot!") - to_chat(user, "\icon[src] The [src] beeps: \"[response]\"") + to_chat(user, "[bicon(src)] The [src] beeps: \"[response]\"") return 1 /obj/machinery/atm/attackby(obj/item/I as obj, mob/user as mob) @@ -85,7 +85,7 @@ log transactions if(istype(I, /obj/item/weapon/card)) if(emagged > 0) //prevent inserting id into an emagged ATM - to_chat(user, "\icon[src] CARD READER ERROR. This system has been compromised!") + to_chat(user, "[bicon(src)] CARD READER ERROR. This system has been compromised!") return else if(istype(I,/obj/item/weapon/card/emag)) I.resolve_attackby(src, user) @@ -234,7 +234,7 @@ log transactions var/target_account_number = text2num(href_list["target_acc_number"]) var/transfer_purpose = href_list["purpose"] if(charge_to_account(target_account_number, authenticated_account.owner_name, transfer_purpose, machine_id, transfer_amount)) - to_chat(usr, "\icon[src]Funds transfer successful.") + to_chat(usr, "[bicon(src)]Funds transfer successful.") authenticated_account.money -= transfer_amount //create an entry in the account transaction log @@ -247,10 +247,10 @@ log transactions T.amount = "([transfer_amount])" authenticated_account.transaction_log.Add(T) else - to_chat(usr, "\icon[src]Funds transfer failed.") + to_chat(usr, "[bicon(src)]Funds transfer failed.") else - to_chat(usr, "\icon[src]You don't have enough funds to do that!") + to_chat(usr, "[bicon(src)]You don't have enough funds to do that!") if("view_screen") view_screen = text2num(href_list["view_screen"]) if("change_security_level") @@ -288,11 +288,11 @@ log transactions T.time = stationtime2text() failed_account.transaction_log.Add(T) else - to_chat(usr, "\icon[src] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.") + to_chat(usr, "[bicon(src)] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.") previous_account_number = tried_account_num playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) else - to_chat(usr, "\icon[src] incorrect pin/account combination entered.") + to_chat(usr, "[bicon(src)] incorrect pin/account combination entered.") number_incorrect_tries = 0 else playsound(src, 'sound/machines/twobeep.ogg', 50, 1) @@ -308,7 +308,7 @@ log transactions T.time = stationtime2text() authenticated_account.transaction_log.Add(T) - to_chat(usr, "\icon[src] Access granted. Welcome user '[authenticated_account.owner_name].'") + to_chat(usr, "[bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'") previous_account_number = tried_account_num if("e_withdrawal") @@ -336,7 +336,7 @@ log transactions T.time = stationtime2text() authenticated_account.transaction_log.Add(T) else - to_chat(usr, "\icon[src]You don't have enough funds to do that!") + to_chat(usr, "[bicon(src)]You don't have enough funds to do that!") if("withdrawal") var/amount = max(text2num(href_list["funds_amount"]),0) amount = round(amount, 0.01) @@ -361,7 +361,7 @@ log transactions T.time = stationtime2text() authenticated_account.transaction_log.Add(T) else - to_chat(usr, "\icon[src]You don't have enough funds to do that!") + to_chat(usr, "[bicon(src)]You don't have enough funds to do that!") if("balance_statement") if(authenticated_account) var/obj/item/weapon/paper/R = new(src.loc) @@ -433,7 +433,7 @@ log transactions if(!held_card) //this might happen if the user had the browser window open when somebody emagged it if(emagged > 0) - to_chat(usr, "\icon[src] The ATM card reader rejected your ID because this machine has been sabotaged!") + to_chat(usr, "[bicon(src)] The ATM card reader rejected your ID because this machine has been sabotaged!") else var/obj/item/I = usr.get_active_hand() if (istype(I, /obj/item/weapon/card/id)) @@ -461,7 +461,7 @@ log transactions if(I) authenticated_account = attempt_account_access(I.associated_account_number) if(authenticated_account) - to_chat(human_user, "\icon[src] Access granted. Welcome user '[authenticated_account.owner_name].'") + to_chat(human_user, "[bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'") //create a transaction log entry var/datum/transaction/T = new() diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm index a293226d48..251ba09e36 100644 --- a/code/modules/economy/Accounts_DB.dm +++ b/code/modules/economy/Accounts_DB.dm @@ -3,7 +3,7 @@ name = "Accounts uplink terminal" desc = "Access transaction logs, account data and all kinds of other financial records." icon = 'icons/obj/computer.dmi' - icon_state = "aiupload" + icon_state = "account_computer" density = 1 req_one_access = list(access_hop, access_captain, access_cent_captain) anchored = 1 diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm index 41c3aed03f..986ec2766e 100644 --- a/code/modules/economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -12,56 +12,45 @@ var/access_code = 0 var/datum/money_account/linked_account -/obj/item/device/eftpos/New() - ..() - machine_id = "[station_name()] EFTPOS #[num_financial_terminals++]" - access_code = rand(1111,111111) - spawn(0) - print_reference() - - //create a short manual as well - var/obj/item/weapon/paper/R = new(src.loc) - R.name = "Steps to success: Correct EFTPOS Usage" - /* - R.info += "When first setting up your EFTPOS device:" - R.info += "1. Memorise your EFTPOS command code (provided with all EFTPOS devices).
" - R.info += "2. Confirm that your EFTPOS device is connected to your local accounts database. For additional assistance with this step, contact NanoTrasen IT Support
" - R.info += "3. Confirm that your EFTPOS device has been linked to the account that you wish to recieve funds for all transactions processed on this device.
" - R.info += "When starting a new transaction with your EFTPOS device:" - R.info += "1. Ensure the device is UNLOCKED so that new data may be entered.
" - R.info += "2. Enter a sum of money and reference message for the new transaction.
" - R.info += "3. Lock the transaction, it is now ready for your customer.
" - R.info += "4. If at this stage you wish to modify or cancel your transaction, you may simply reset (unlock) your EFTPOS device.
" - R.info += "5. Give your EFTPOS device to the customer, they must authenticate the transaction by swiping their ID card and entering their PIN number.
" - R.info += "6. If done correctly, the transaction will be logged to both accounts with the reference you have entered, the terminal ID of your EFTPOS device and the money transferred across accounts.
" - */ - //Temptative new manual: - R.info += "First EFTPOS setup:
" - R.info += "1. Memorise your EFTPOS command code (provided with all EFTPOS devices).
" - R.info += "2. Connect the EFTPOS to the account in which you want to receive the funds.

" - R.info += "When starting a new transaction:
" - R.info += "1. Enter the amount of money you want to charge and a purpose message for the new transaction.
" - R.info += "2. Lock the new transaction. If you want to modify or cancel the transaction, you simply have to reset your EFTPOS device.
" - R.info += "3. Give the EFTPOS device to your customer, he/she must finish the transaction by swiping their ID card or a charge card with enough funds.
" - R.info += "4. If everything is done correctly, the money will be transferred. To unlock the device you will have to reset the EFTPOS device.
" - - - //stamp the paper - var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') - stampoverlay.icon_state = "paper_stamp-cent" - if(!R.stamped) - R.stamped = new - R.offset_x += 0 - R.offset_y += 0 - R.ico += "paper_stamp-cent" - R.stamped += /obj/item/weapon/stamp - R.overlays += stampoverlay - R.stamps += "
This paper has been stamped by the EFTPOS device." - +/obj/item/device/eftpos/Initialize() + . = ..() //by default, connect to the station account //the user of the EFTPOS device can change the target account though, and no-one will be the wiser (except whoever's being charged) linked_account = station_account + machine_id = "[station_name()] EFTPOS #[num_financial_terminals++]" + access_code = rand(1111,111111) + print_reference() + + //create a short manual as well + var/obj/item/weapon/paper/R = new(src.loc) + R.name = "Steps to success: Correct EFTPOS Usage" + //Temptative new manual: + R.info += "First EFTPOS setup:
" + R.info += "1. Memorise your EFTPOS command code (provided with all EFTPOS devices).
" + R.info += "2. Connect the EFTPOS to the account in which you want to receive the funds.

" + R.info += "When starting a new transaction:
" + R.info += "1. Enter the amount of money you want to charge and a purpose message for the new transaction.
" + R.info += "2. Lock the new transaction. If you want to modify or cancel the transaction, you simply have to reset your EFTPOS device.
" + R.info += "3. Give the EFTPOS device to your customer, he/she must finish the transaction by swiping their ID card or a charge card with enough funds.
" + R.info += "4. If everything is done correctly, the money will be transferred. To unlock the device you will have to reset the EFTPOS device.
" + + //stamp the paper + var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') + stampoverlay.icon_state = "paper_stamp-cent" + if(!R.stamped) + R.stamped = new + R.offset_x += 0 + R.offset_y += 0 + R.ico += "paper_stamp-cent" + R.stamped += /obj/item/weapon/stamp + R.overlays += stampoverlay + R.stamps += "
This paper has been stamped by the EFTPOS device." + +/obj/item/device/eftpos/Destroy() + linked_account = null + return ..() + /obj/item/device/eftpos/proc/print_reference() var/obj/item/weapon/paper/R = new(src.loc) R.name = "Reference: [eftpos_name]" @@ -118,7 +107,7 @@ if(linked_account) scan_card(I, O) else - to_chat(usr, "\icon[src]Unable to connect to linked account.") + to_chat(usr, "[bicon(src)]Unable to connect to linked account.") else if (istype(O, /obj/item/weapon/spacecash/ewallet)) var/obj/item/weapon/spacecash/ewallet/E = O if (linked_account) @@ -126,7 +115,7 @@ if(transaction_locked && !transaction_paid) if(transaction_amount <= E.worth) playsound(src, 'sound/machines/chime.ogg', 50, 1) - src.visible_message("\icon[src] \The [src] chimes.") + src.visible_message("[bicon(src)] \The [src] chimes.") transaction_paid = 1 //transfer the money @@ -143,11 +132,11 @@ T.time = stationtime2text() linked_account.transaction_log.Add(T) else - to_chat(usr, "\icon[src]\The [O] doesn't have that much money!") + to_chat(usr, "[bicon(src)]\The [O] doesn't have that much money!") else - to_chat(usr, "\icon[src]Connected account has been suspended.") + to_chat(usr, "[bicon(src)]Connected account has been suspended.") else - to_chat(usr, "\icon[src]EFTPOS is not connected to an account.") + to_chat(usr, "[bicon(src)]EFTPOS is not connected to an account.") else ..() @@ -165,14 +154,14 @@ alert("That is not a valid code!") print_reference() else - to_chat(usr, "\icon[src]Incorrect code entered.") + to_chat(usr, "[bicon(src)]Incorrect code entered.") if("change_id") var/attempt_code = text2num(input("Re-enter the current EFTPOS access code", "Confirm EFTPOS code")) if(attempt_code == access_code) eftpos_name = sanitize(input("Enter a new terminal ID for this device", "Enter new EFTPOS ID"), MAX_NAME_LEN) + " EFTPOS scanner" print_reference() else - to_chat(usr, "\icon[src]Incorrect code entered.") + to_chat(usr, "[bicon(src)]Incorrect code entered.") if("link_account") var/attempt_account_num = input("Enter account number to pay EFTPOS charges into", "New account number") as num var/attempt_pin = input("Enter pin code", "Account pin") as num @@ -180,9 +169,9 @@ if(linked_account) if(linked_account.suspended) linked_account = null - to_chat(usr, "\icon[src]Account has been suspended.") + to_chat(usr, "[bicon(src)]Account has been suspended.") else - to_chat(usr, "\icon[src]Account not found.") + to_chat(usr, "[bicon(src)]Account not found.") if("trans_purpose") var/choice = sanitize(input("Enter reason for EFTPOS transaction", "Transaction purpose")) if(choice) transaction_purpose = choice @@ -205,14 +194,14 @@ else if(linked_account) transaction_locked = 1 else - to_chat(usr, "\icon[src]No account connected to send transactions to.") + to_chat(usr, "[bicon(src)]No account connected to send transactions to.") if("scan_card") if(linked_account) var/obj/item/I = usr.get_active_hand() if (istype(I, /obj/item/weapon/card)) scan_card(I) else - to_chat(usr, "\icon[src]Unable to link accounts.") + to_chat(usr, "[bicon(src)]Unable to link accounts.") if("reset") //reset the access code - requires HoP/captain access var/obj/item/I = usr.get_active_hand() @@ -220,10 +209,10 @@ var/obj/item/weapon/card/id/C = I if(access_cent_captain in C.access || access_hop in C.access || access_captain in C.access) access_code = 0 - to_chat(usr, "\icon[src]Access code reset to 0.") + to_chat(usr, "[bicon(src)]Access code reset to 0.") else if (istype(I, /obj/item/weapon/card/emag)) access_code = 0 - to_chat(usr, "\icon[src]Access code reset to 0.") + to_chat(usr, "[bicon(src)]Access code reset to 0.") src.attack_self(usr) @@ -247,7 +236,7 @@ if(!D.suspended) if(transaction_amount <= D.money) playsound(src, 'sound/machines/chime.ogg', 50, 1) - src.visible_message("\icon[src] \The [src] chimes.") + src.visible_message("[bicon(src)] \The [src] chimes.") transaction_paid = 1 //transfer the money @@ -276,25 +265,25 @@ T.time = stationtime2text() linked_account.transaction_log.Add(T) else - to_chat(usr, "\icon[src]You don't have that much money!") + to_chat(usr, "[bicon(src)]You don't have that much money!") else - to_chat(usr, "\icon[src]Your account has been suspended.") + to_chat(usr, "[bicon(src)]Your account has been suspended.") else - to_chat(usr, "\icon[src]Unable to access account. Check security settings and try again.") + to_chat(usr, "[bicon(src)]Unable to access account. Check security settings and try again.") else - to_chat(usr, "\icon[src]Connected account has been suspended.") + to_chat(usr, "[bicon(src)]Connected account has been suspended.") else - to_chat(usr, "\icon[src]EFTPOS is not connected to an account.") + to_chat(usr, "[bicon(src)]EFTPOS is not connected to an account.") else if (istype(I, /obj/item/weapon/card/emag)) if(transaction_locked) if(transaction_paid) - to_chat(usr, "\icon[src]You stealthily swipe \the [I] through \the [src].") + to_chat(usr, "[bicon(src)]You stealthily swipe \the [I] through \the [src].") transaction_locked = 0 transaction_paid = 0 else usr.visible_message("\The [usr] swipes a card through \the [src].") playsound(src, 'sound/machines/chime.ogg', 50, 1) - src.visible_message("\icon[src] \The [src] chimes.") + src.visible_message("[bicon(src)] \The [src] chimes.") transaction_paid = 1 else ..() diff --git a/code/modules/economy/cash_register.dm b/code/modules/economy/cash_register.dm index 3d47a895d4..1c7759a155 100644 --- a/code/modules/economy/cash_register.dm +++ b/code/modules/economy/cash_register.dm @@ -103,7 +103,7 @@ if(allowed(usr)) locked = !locked else - to_chat(usr, "\icon[src]Insufficient access.") + to_chat(usr, "[bicon(src)]Insufficient access.") if("toggle_cash_lock") cash_locked = !cash_locked if("link_account") @@ -113,9 +113,9 @@ if(linked_account) if(linked_account.suspended) linked_account = null - src.visible_message("\icon[src]Account has been suspended.") + src.visible_message("[bicon(src)]Account has been suspended.") else - to_chat(usr, "\icon[src]Account not found.") + to_chat(usr, "[bicon(src)]Account not found.") if("custom_order") var/t_purpose = sanitize(input("Enter purpose", "New purpose") as text) if (!t_purpose || !Adjacent(usr)) return @@ -126,7 +126,7 @@ transaction_amount += t_amount price_list += t_amount playsound(src, 'sound/machines/twobeep.ogg', 25) - src.visible_message("\icon[src][transaction_purpose]: [t_amount] Thaler\s.") + src.visible_message("[bicon(src)][transaction_purpose]: [t_amount] Thaler\s.") if("set_amount") var/item_name = locate(href_list["item"]) var/n_amount = round(input("Enter amount", "New amount") as num) @@ -163,7 +163,7 @@ price_list.Cut() if("reset_log") transaction_logs.Cut() - to_chat(usr, "\icon[src]Transaction log reset.") + to_chat(usr, "[bicon(src)]Transaction log reset.") updateDialog() @@ -208,7 +208,7 @@ return 1 else confirm_item = I - src.visible_message("\icon[src]Total price: [transaction_amount] Thaler\s. Swipe again to confirm.") + src.visible_message("[bicon(src)]Total price: [transaction_amount] Thaler\s. Swipe again to confirm.") playsound(src, 'sound/machines/twobeep.ogg', 25) return 0 @@ -219,14 +219,14 @@ if (cash_open) playsound(src, 'sound/machines/buzz-sigh.ogg', 25) - to_chat(usr, "\icon[src]The cash box is open.") + to_chat(usr, "[bicon(src)]The cash box is open.") return if((item_list.len > 1 || item_list[item_list[1]] > 1) && !confirm(I)) return if (!linked_account) - usr.visible_message("\icon[src]Unable to connect to linked account.") + usr.visible_message("[bicon(src)]Unable to connect to linked account.") return // Access account for transaction @@ -239,13 +239,13 @@ D = attempt_account_access(I.associated_account_number, attempt_pin, 2) if(!D) - src.visible_message("\icon[src]Unable to access account. Check security settings and try again.") + src.visible_message("[bicon(src)]Unable to access account. Check security settings and try again.") else if(D.suspended) - src.visible_message("\icon[src]Your account has been suspended.") + src.visible_message("[bicon(src)]Your account has been suspended.") else if(transaction_amount > D.money) - src.visible_message("\icon[src]Not enough funds.") + src.visible_message("[bicon(src)]Not enough funds.") else // Transfer the money D.money -= transaction_amount @@ -284,7 +284,7 @@ if (cash_open) playsound(src, 'sound/machines/buzz-sigh.ogg', 25) - to_chat(usr, "\icon[src]The cash box is open.") + to_chat(usr, "[bicon(src)]The cash box is open.") return if((item_list.len > 1 || item_list[item_list[1]] > 1) && !confirm(E)) @@ -293,7 +293,7 @@ // Access account for transaction if(check_account()) if(transaction_amount > E.worth) - src.visible_message("\icon[src]Not enough funds.") + src.visible_message("[bicon(src)]Not enough funds.") else // Transfer the money E.worth -= transaction_amount @@ -322,14 +322,14 @@ if (cash_open) playsound(src, 'sound/machines/buzz-sigh.ogg', 25) - to_chat(usr, "\icon[src]The cash box is open.") + to_chat(usr, "[bicon(src)]The cash box is open.") return if((item_list.len > 1 || item_list[item_list[1]] > 1) && !confirm(SC)) return if(transaction_amount > SC.worth) - src.visible_message("\icon[src]Not enough money.") + src.visible_message("[bicon(src)]Not enough money.") else // Insert cash into magical slot SC.worth -= transaction_amount @@ -351,20 +351,20 @@ /obj/machinery/cash_register/proc/scan_item_price(obj/O) if(!istype(O)) return if(item_list.len > 10) - src.visible_message("\icon[src]Only up to ten different items allowed per purchase.") + src.visible_message("[bicon(src)]Only up to ten different items allowed per purchase.") return if (cash_open) playsound(src, 'sound/machines/buzz-sigh.ogg', 25) - to_chat(usr, "\icon[src]The cash box is open.") + to_chat(usr, "[bicon(src)]The cash box is open.") return // First check if item has a valid price var/price = O.get_item_cost() if(isnull(price)) - src.visible_message("\icon[src]Unable to find item in database.") + src.visible_message("[bicon(src)]Unable to find item in database.") return // Call out item cost - src.visible_message("\icon[src]\A [O]: [price ? "[price] Thaler\s" : "free of charge"].") + src.visible_message("[bicon(src)]\A [O]: [price ? "[price] Thaler\s" : "free of charge"].") // Note the transaction purpose for later use if(transaction_purpose) transaction_purpose += "
" @@ -432,11 +432,11 @@ /obj/machinery/cash_register/proc/check_account() if (!linked_account) - usr.visible_message("\icon[src]Unable to connect to linked account.") + usr.visible_message("[bicon(src)]Unable to connect to linked account.") return 0 if(linked_account.suspended) - src.visible_message("\icon[src]Connected account has been suspended.") + src.visible_message("[bicon(src)]Connected account has been suspended.") return 0 return 1 @@ -444,7 +444,7 @@ /obj/machinery/cash_register/proc/transaction_complete() /// Visible confirmation playsound(src, 'sound/machines/chime.ogg', 25) - src.visible_message("\icon[src]Transaction complete.") + src.visible_message("[bicon(src)]Transaction complete.") flick("register_approve", src) reset_memory() updateDialog() diff --git a/code/modules/economy/retail_scanner.dm b/code/modules/economy/retail_scanner.dm index 4e8255acc6..15abcccd02 100644 --- a/code/modules/economy/retail_scanner.dm +++ b/code/modules/economy/retail_scanner.dm @@ -100,7 +100,7 @@ if(allowed(usr)) locked = !locked else - to_chat(usr, "\icon[src]Insufficient access.") + to_chat(usr, "[bicon(src)]Insufficient access.") if("link_account") var/attempt_account_num = input("Enter account number", "New account number") as num var/attempt_pin = input("Enter PIN", "Account PIN") as num @@ -108,9 +108,9 @@ if(linked_account) if(linked_account.suspended) linked_account = null - src.visible_message("\icon[src]Account has been suspended.") + src.visible_message("[bicon(src)]Account has been suspended.") else - to_chat(usr, "\icon[src]Account not found.") + to_chat(usr, "[bicon(src)]Account not found.") if("custom_order") var/t_purpose = sanitize(input("Enter purpose", "New purpose") as text) if (!t_purpose || !Adjacent(usr)) return @@ -121,7 +121,7 @@ transaction_amount += t_amount price_list += t_amount playsound(src, 'sound/machines/twobeep.ogg', 25) - src.visible_message("\icon[src][transaction_purpose]: [t_amount] Thaler\s.") + src.visible_message("[bicon(src)][transaction_purpose]: [t_amount] Thaler\s.") if("set_amount") var/item_name = locate(href_list["item"]) var/n_amount = round(input("Enter amount", "New amount") as num) @@ -158,7 +158,7 @@ price_list.Cut() if("reset_log") transaction_logs.Cut() - to_chat(usr, "\icon[src]Transaction log reset.") + to_chat(usr, "[bicon(src)]Transaction log reset.") updateDialog() @@ -191,7 +191,7 @@ return 1 else confirm_item = I - src.visible_message("\icon[src]Total price: [transaction_amount] Thaler\s. Swipe again to confirm.") + src.visible_message("[bicon(src)]Total price: [transaction_amount] Thaler\s. Swipe again to confirm.") playsound(src, 'sound/machines/twobeep.ogg', 25) return 0 @@ -204,7 +204,7 @@ return if (!linked_account) - usr.visible_message("\icon[src]Unable to connect to linked account.") + usr.visible_message("[bicon(src)]Unable to connect to linked account.") return // Access account for transaction @@ -217,13 +217,13 @@ D = attempt_account_access(I.associated_account_number, attempt_pin, 2) if(!D) - src.visible_message("\icon[src]Unable to access account. Check security settings and try again.") + src.visible_message("[bicon(src)]Unable to access account. Check security settings and try again.") else if(D.suspended) - src.visible_message("\icon[src]Your account has been suspended.") + src.visible_message("[bicon(src)]Your account has been suspended.") else if(transaction_amount > D.money) - src.visible_message("\icon[src]Not enough funds.") + src.visible_message("[bicon(src)]Not enough funds.") else // Transfer the money D.money -= transaction_amount @@ -266,7 +266,7 @@ // Access account for transaction if(check_account()) if(transaction_amount > E.worth) - src.visible_message("\icon[src]Not enough funds.") + src.visible_message("[bicon(src)]Not enough funds.") else // Transfer the money E.worth -= transaction_amount @@ -292,16 +292,16 @@ /obj/item/device/retail_scanner/proc/scan_item_price(var/obj/O) if(!istype(O)) return if(item_list.len > 10) - src.visible_message("\icon[src]Only up to ten different items allowed per purchase.") + src.visible_message("[bicon(src)]Only up to ten different items allowed per purchase.") return // First check if item has a valid price var/price = O.get_item_cost() if(isnull(price)) - src.visible_message("\icon[src]Unable to find item in database.") + src.visible_message("[bicon(src)]Unable to find item in database.") return // Call out item cost - src.visible_message("\icon[src]\A [O]: [price ? "[price] Thaler\s" : "free of charge"].") + src.visible_message("[bicon(src)]\A [O]: [price ? "[price] Thaler\s" : "free of charge"].") // Note the transaction purpose for later use if(transaction_purpose) transaction_purpose += "
" @@ -369,11 +369,11 @@ /obj/item/device/retail_scanner/proc/check_account() if (!linked_account) - usr.visible_message("\icon[src]Unable to connect to linked account.") + usr.visible_message("[bicon(src)]Unable to connect to linked account.") return 0 if(linked_account.suspended) - src.visible_message("\icon[src]Connected account has been suspended.") + src.visible_message("[bicon(src)]Connected account has been suspended.") return 0 return 1 @@ -381,7 +381,7 @@ /obj/item/device/retail_scanner/proc/transaction_complete() /// Visible confirmation playsound(src, 'sound/machines/chime.ogg', 25) - src.visible_message("\icon[src]Transaction complete.") + src.visible_message("[bicon(src)]Transaction complete.") flick("retail_approve", src) reset_memory() updateDialog() diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index 6aa9070c82..5e9e356b78 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -1,7 +1,9 @@ // error_cooldown items will either be positive (cooldown time) or negative (silenced error) // If negative, starts at -1, and goes down by 1 each time that error gets skipped -var/total_runtimes = 0 -var/total_runtimes_skipped = 0 +GLOBAL_VAR_INIT(total_runtimes, 0) +GLOBAL_VAR_INIT(total_runtimes_skipped, 0) + + // The ifdef needs to be down here, since the error viewer references total_runtimes #ifdef DEBUG /world/Error(var/exception/e, var/datum/e_src) @@ -10,7 +12,7 @@ var/total_runtimes_skipped = 0 return ..() if(!GLOB.error_last_seen) // A runtime is occurring too early in start-up initialization return ..() - total_runtimes++ + GLOB.total_runtimes++ var/erroruid = "[e.file][e.line]" var/last_seen = GLOB.error_last_seen[erroruid] @@ -20,7 +22,7 @@ var/total_runtimes_skipped = 0 last_seen = world.time if(cooldown < 0) GLOB.error_cooldown[erroruid]-- // Used to keep track of skip count for this error - total_runtimes_skipped++ + GLOB.total_runtimes_skipped++ return // Error is currently silenced, skip handling it // Handle cooldowns and silencing spammy errors diff --git a/code/modules/error_handler/error_viewer.dm b/code/modules/error_handler/error_viewer.dm index 0f1fd0ba96..c342a408f0 100644 --- a/code/modules/error_handler/error_viewer.dm +++ b/code/modules/error_handler/error_viewer.dm @@ -88,7 +88,7 @@ var/global/datum/ErrorViewer/ErrorCache/error_cache = null /datum/ErrorViewer/ErrorCache/showTo(var/user, var/datum/ErrorViewer/back_to, var/linear) var/html = buildHeader(null, linear, refreshable=1) - html += "[total_runtimes] runtimes, [total_runtimes_skipped] skipped

" + html += "[GLOB.total_runtimes] runtimes, [GLOB.total_runtimes_skipped] skipped

" if(!linear) html += "organized | [makeLink("linear", null, 1)]
" var/datum/ErrorViewer/ErrorSource/error_source diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index b30a5d4898..e0b5fa8d6b 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -1,51 +1,105 @@ /datum/event/carp_migration - announceWhen = 50 - endWhen = 900 - + startWhen = 0 // Start immediately + announceWhen = 45 // Adjusted by setup + endWhen = 75 // Adjusted by setup + var/carp_cap = 10 var/list/spawned_carp = list() /datum/event/carp_migration/setup() - announceWhen = rand(40, 60) - endWhen = rand(600,1200) + announceWhen = rand(30, 60) // 1 to 2 minutes + endWhen += severity * 25 + carp_cap = 2 + 3 ** severity // No more than this many at once regardless of waves. (5, 11, 29) + +/datum/event/carp_migration/start() + affecting_z -= global.using_map.sealed_levels // Space levels only please! + ..() /datum/event/carp_migration/announce() var/announcement = "" if(severity == EVENT_LEVEL_MAJOR) - announcement = "Massive migration of unknown biological entities has been detected near [station_name()], please stand-by." + announcement = "Massive migration of unknown biological entities has been detected near [location_name()], please stand-by." else - announcement = "Unknown biological [spawned_carp.len == 1 ? "entity has" : "entities have"] been detected near [station_name()], please stand-by." + announcement = "Unknown biological [spawned_carp.len == 1 ? "entity has" : "entities have"] been detected near [location_name()], please stand-by." command_announcement.Announce(announcement, "Lifesign Alert") -/datum/event/carp_migration/start() - if(severity == EVENT_LEVEL_MAJOR) - spawn_fish(landmarks_list.len) - else if(severity == EVENT_LEVEL_MODERATE) - spawn_fish(rand(4, 6)) //12 to 30 carp, in small groups - else - spawn_fish(rand(1, 3), 1, 2) //1 to 6 carp, alone or in pairs +/datum/event/carp_migration/tick() + if(activeFor % 5 != 0) + return // Only process every 10 seconds. + if(count_spawned_carps() < carp_cap) + spawn_fish(rand(1, severity * 2) - 1, severity, severity * 2) -/datum/event/carp_migration/proc/spawn_fish(var/num_groups, var/group_size_min=3, var/group_size_max=5) +/datum/event/carp_migration/proc/spawn_fish(var/num_groups, var/group_size_min, var/group_size_max, var/dir) + if(isnull(dir)) + dir = (victim && prob(80)) ? victim.fore_dir : pick(GLOB.cardinal) + + // Check if any landmarks exist! var/list/spawn_locations = list() - for(var/obj/effect/landmark/C in landmarks_list) - if(C.name == "carpspawn") + if(C.name == "carpspawn" && (C.z in affecting_z)) spawn_locations.Add(C.loc) - spawn_locations = shuffle(spawn_locations) - num_groups = min(num_groups, spawn_locations.len) + if(spawn_locations.len) // Okay we've got landmarks, lets use those! + shuffle_inplace(spawn_locations) + num_groups = min(num_groups, spawn_locations.len) + var/i = 1 + while (i <= num_groups) + var/group_size = rand(group_size_min, group_size_max) + for (var/j = 0, j < group_size, j++) + spawn_one_carp(spawn_locations[i]) + i++ + return + // Okay we did *not* have any landmarks, so lets do our best! var/i = 1 while (i <= num_groups) + var/Z = pick(affecting_z) var/group_size = rand(group_size_min, group_size_max) - for (var/j = 1, j <= group_size, j++) - spawned_carp.Add(new /mob/living/simple_mob/animal/space/carp/event(spawn_locations[i])) + var/turf/map_center = locate(round(world.maxx/2), round(world.maxy/2), Z) + var/turf/group_center = pick_random_edge_turf(dir, Z, TRANSITIONEDGE + 2) + var/list/turfs = getcircle(group_center, 2) + for (var/j = 0, j < group_size, j++) + var/mob/living/simple_mob/animal/M = spawn_one_carp(turfs[(i % turfs.len) + 1]) + // Ray trace towards middle of the map to find where they can stop just outside of structure/ship. + var/turf/target + for(var/turf/T in getline(get_turf(M), map_center)) + if(!T.is_space()) + break; + target = T + if(target) + M.ai_holder?.give_destination(target) // Ask carp to swim towards the middle of the map i++ +// Spawn a single carp at given location. +/datum/event/carp_migration/proc/spawn_one_carp(var/loc) + var/mob/living/simple_mob/animal/M = new /mob/living/simple_mob/animal/space/carp/event(loc) + GLOB.destroyed_event.register(M, src, .proc/on_carp_destruction) + spawned_carp.Add(M) + return M + +// Counts living carp spawned by this event. +/datum/event/carp_migration/proc/count_spawned_carps() + . = 0 + for(var/I in spawned_carp) + var/mob/living/simple_mob/animal/M = I + if(!QDELETED(M) && M.stat != DEAD) + . += 1 + +// If carp is bomphed, remove it from the list. +/datum/event/carp_migration/proc/on_carp_destruction(var/mob/M) + spawned_carp -= M + GLOB.destroyed_event.unregister(M, src, .proc/on_carp_destruction) + /datum/event/carp_migration/end() + . = ..() + // Clean up carp that died in space for some reason. spawn(0) for(var/mob/living/simple_mob/SM in spawned_carp) - if(!SM.stat) + if(SM.stat == DEAD) var/turf/T = get_turf(SM) if(istype(T, /turf/space)) if(prob(75)) qdel(SM) - sleep(1) \ No newline at end of file + CHECK_TICK + +// Overmap version +/datum/event/carp_migration/overmap/announce() + return diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm index 3c7a116827..31ae5dee32 100644 --- a/code/modules/events/dust.dm +++ b/code/modules/events/dust.dm @@ -2,14 +2,22 @@ startWhen = 10 endWhen = 30 -/datum/event/dust/announce() - command_announcement.Announce("Debris resulting from activity on another nearby asteroid is approaching \the [station_name()]", "Dust Alert") - /datum/event/dust/start() - dust_swarm(get_severity()) + affecting_z -= global.using_map.sealed_levels // Space levels only please! + ..() + +/datum/event/dust/announce() + if(!victim) + command_announcement.Announce("Debris resulting from activity on another nearby asteroid is approaching \the [location_name()]", "Dust Alert") + +/datum/event/dust/tick() + if(prob(10)) + dust_swarm(severity, affecting_z) /datum/event/dust/end() - command_announcement.Announce("\The [station_name()] is no longer in danger of impact from space debris.", "Dust Notice") + ..() + if(!victim) + command_announcement.Announce("\The [location_name()] is no longer in danger of impact from space debris.", "Dust Notice") /datum/event/dust/proc/get_severity() switch(severity) @@ -20,3 +28,7 @@ if(EVENT_LEVEL_MAJOR) return "super" return "weak" + +// Overmap version +/datum/event/dust/overmap/announce() + return \ No newline at end of file diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index 73198dec9b..b7040258de 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -1,28 +1,65 @@ /datum/event/electrical_storm - var/lightsoutAmount = 1 - var/lightsoutRange = 25 + announceWhen = 0 // Warn them shortly before it begins. + startWhen = 30 // 1 minute + endWhen = 60 // Set in setup() + has_skybox_image = TRUE + var/tmp/lightning_color + var/tmp/list/valid_apcs // List of valid APCs. +/datum/event/electrical_storm/get_skybox_image() + if(!lightning_color) + lightning_color = pick("#ffd98c", "#ebc7ff", "#bdfcff", "#bdd2ff", "#b0ffca", "#ff8178", "#ad74cc") + var/image/res = image('icons/skybox/electrobox.dmi', "lightning") + res.color = lightning_color + res.appearance_flags = RESET_COLOR + res.blend_mode = BLEND_ADD + return res /datum/event/electrical_storm/announce() - command_announcement.Announce("An electrical issue has been detected in your area, please repair potential electronic overloads.", "Electrical Alert") - + ..() + switch(severity) + if(EVENT_LEVEL_MUNDANE) + command_announcement.Announce("A minor electrical storm has been detected near the [location_name()]. Please watch out for possible electrical discharges.", "[location_name()] Sensor Array") + if(EVENT_LEVEL_MODERATE) + command_announcement.Announce("The [location_name()] is about to pass through an electrical storm. Please secure sensitive electrical equipment until the storm passes.", "[location_name()] Sensor Array") + if(EVENT_LEVEL_MAJOR) + command_announcement.Announce("Alert. A strong electrical storm has been detected in proximity of the [location_name()]. It is recommended to immediately secure sensitive electrical equipment until the storm passes.", "[location_name()] Sensor Array") /datum/event/electrical_storm/start() - var/list/epicentreList = list() + ..() + valid_apcs = list() + for(var/obj/machinery/power/apc/A in global.machines) + if(A.z in affecting_z) + valid_apcs.Add(A) + endWhen = (severity * 60) + startWhen - for(var/i=1, i <= lightsoutAmount, i++) - var/list/possibleEpicentres = list() - for(var/obj/effect/landmark/newEpicentre in landmarks_list) - if(newEpicentre.name == "lightsout" && !(newEpicentre in epicentreList)) - possibleEpicentres += newEpicentre - if(possibleEpicentres.len) - epicentreList += pick(possibleEpicentres) - else - break +/datum/event/electrical_storm/tick() + ..() + // See if shields can stop it first (It would be nice to port baystation's cooler shield gens perhaps) + // TODO - We need a better shield generator system to handle this properly. + if(!valid_apcs.len) + log_debug("No valid APCs found for electrical storm event ship=[victim]!") + return + var/list/picked_apcs = list() + for(var/i=0, i< severity * 2, i++) // up to 2/4/6 APCs per tick depending on severity + picked_apcs |= pick(valid_apcs) + for(var/obj/machinery/power/apc/T in picked_apcs) + affect_apc(T) - if(!epicentreList.len) +/datum/event/electrical_storm/proc/affect_apc(var/obj/machinery/power/apc/T) + // Main breaker is turned off. Consider this APC protected. + if(!T.operating) return - for(var/obj/effect/landmark/epicentre in epicentreList) - for(var/obj/machinery/power/apc/apc in range(epicentre,lightsoutRange)) - apc.overload_lighting() + // Decent chance to overload lighting circuit. + if(prob(3 * severity)) + T.overload_lighting() + + // Relatively small chance to emag the apc as apc_damage event does. + if(prob(0.2 * severity)) + T.emagged = 1 + T.update_icon() + +// Overmap version +/datum/event/electrical_storm/overmap/announce() + return \ No newline at end of file diff --git a/code/modules/events/event.dm b/code/modules/events/event.dm index e44e161a1a..d9db7f608c 100644 --- a/code/modules/events/event.dm +++ b/code/modules/events/event.dm @@ -1,3 +1,4 @@ +// Event Meta instances represent choices for the event manager to choose for random events. /datum/event_meta var/name = "" var/enabled = 1 // Whether or not the event is available for random selection at all @@ -39,6 +40,10 @@ return total_weight +/datum/event_meta/no_overmap/get_weight() //these events have overmap equivalents, and shouldn't fire randomly if overmap is used + return global.using_map.use_overmap ? 0 : ..() + +// Event datums define and execute the actual events themselves. /datum/event //NOTE: Times are measured in master controller ticks! var/startWhen = 0 //When in the lifetime to call start(). var/announceWhen = 0 //When in the lifetime to call announce(). @@ -51,6 +56,9 @@ var/endedAt = 0 //When this event ended. var/processing_active = TRUE var/datum/event_meta/event_meta = null + var/list/affecting_z = null // List of z-levels to affect, null lets the event choose (usally station_levels) + var/has_skybox_image = FALSE // True if SSskybox should query this event for an image to put in the skybox. + var/obj/effect/overmap/visitable/ship/victim = null // Ship this event is acting upon (If this is event is due to overmap travel).nt etc. /datum/event/nothing @@ -65,6 +73,8 @@ //Allows you to start before announcing or vice versa. //Only called once. /datum/event/proc/start() + if(has_skybox_image) + SSskybox.rebuild_skyboxes(affecting_z) return //Called when the tick is equal to the announceWhen variable. @@ -87,6 +97,8 @@ //For example: if(activeFor == myOwnVariable + 30) doStuff() //Only called once. /datum/event/proc/end() + if(has_skybox_image) + SSskybox.rebuild_skyboxes(affecting_z) return //Returns the latest point of event processing. @@ -125,26 +137,44 @@ activeFor++ //Called when start(), announce() and end() has all been called. -/datum/event/proc/kill() +/datum/event/proc/kill(external_use = FALSE) // If this event was forcefully killed run end() for individual cleanup if(isRunning) isRunning = 0 end() endedAt = world.time - SSevents.active_events -= src - SSevents.event_complete(src) + if(!external_use) + SSevents.event_complete(src) -/datum/event/New(var/datum/event_meta/EM) + +//Called during building of skybox to get overlays +/datum/event/proc/get_skybox_image() + return + +/datum/event/New(var/datum/event_meta/EM, external_use = FALSE) // event needs to be responsible for this, as stuff like APLUs currently make their own events for curious reasons - SSevents.active_events += src + if(!external_use) + SSevents.active_events += src - event_meta = EM - severity = event_meta.severity - if(severity < EVENT_LEVEL_MUNDANE) severity = EVENT_LEVEL_MUNDANE - if(severity > EVENT_LEVEL_MAJOR) severity = EVENT_LEVEL_MAJOR + event_meta = EM + severity = event_meta.severity + if(severity < EVENT_LEVEL_MUNDANE) severity = EVENT_LEVEL_MUNDANE + if(severity > EVENT_LEVEL_MAJOR) severity = EVENT_LEVEL_MAJOR startedAt = world.time + if(!affecting_z) + affecting_z = using_map.station_levels.Copy() + setup() ..() + +/datum/event/Destroy() + victim = null + . = ..() + +/datum/event/proc/location_name() + if(victim) + return victim.name + return station_name() diff --git a/code/modules/events/event_dynamic.dm b/code/modules/events/event_dynamic.dm index c1b4472021..e391637f4f 100644 --- a/code/modules/events/event_dynamic.dm +++ b/code/modules/events/event_dynamic.dm @@ -52,7 +52,7 @@ var/list/event_last_fired = list() possibleEvents[/datum/event/pda_spam] = max(min(25, player_list.len) * 4, 200) possibleEvents[/datum/event/money_lotto] = max(min(5, player_list.len), 50) - if(account_hack_attempted) + if(GLOB.account_hack_attempted) possibleEvents[/datum/event/money_hacker] = max(min(25, player_list.len) * 4, 200) diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index f3a8a6a21a..88b81f28d5 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -1,20 +1,55 @@ //This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:04 /datum/event/ionstorm + has_skybox_image = TRUE + announceWhen = -1 // Never (setup may override) var/botEmagChance = 0.05 + var/cloud_hueshift var/list/players = list() -/datum/event/ionstorm/announce() +/datum/event/ionstorm/get_skybox_image() + if(!cloud_hueshift) + cloud_hueshift = color_rotation(rand(-3, 3) * 15) + var/image/res = image('icons/skybox/ionbox.dmi', "ions") + res.color = cloud_hueshift + res.appearance_flags = RESET_COLOR + res.blend_mode = BLEND_ADD + return res + +/datum/event/ionstorm/setup() endWhen = rand(500, 1500) -// command_alert("The station has entered an ion storm. Monitor all electronic equipment for malfunctions", "Anomaly Alert") + if(prob(50)) + announceWhen = endWhen + rand(250, 400) + +/datum/event/ionstorm/announce() + command_announcement.Announce("It has come to our attention that \the [location_name()] passed through an ion storm. Please monitor all electronic equipment for malfunctions.", "Anomaly Alert") + +/datum/event/ionstorm/start() for (var/mob/living/carbon/human/player in player_list) if( !player.mind || player_is_antag(player.mind, only_offstation_roles = 1) || player.client.inactivity > MinutesToTicks(10)) continue players += player.real_name + // Flomph synthetics + for(var/mob/living/carbon/S in living_mob_list) + if (!S.isSynthetic()) + continue + if(!(S.z in affecting_z)) + continue + var/area/A = get_area(S) + if(!A || A.flags & RAD_SHIELDED) // Rad shielding will protect from ions too + continue + to_chat(S, "Your integrated sensors detect an ionospheric anomaly. Your systems will be impacted as you begin a partial restart.") + var/ionbug = rand(3, 9) + S.confused += ionbug + S.eye_blurry += (ionbug - 1) + + // Ionize silicon mobs for (var/mob/living/silicon/ai/target in silicon_mob_list) + if(!(target.z in affecting_z)) + continue var/law = target.generate_ion_law() - to_chat(target, "You have detected a change in your laws information:") + to_chat(target, "You have detected a change in your laws information:") to_chat(target, law) target.add_ion_law(law) target.show_laws() @@ -31,13 +66,15 @@ /datum/event/ionstorm/tick() if(botEmagChance) for(var/mob/living/bot/bot in mob_list) + if(!(bot.z in affecting_z)) + continue if(prob(botEmagChance)) bot.emag_act(1) -/datum/event/ionstorm/end() - spawn(rand(5000,8000)) - if(prob(50)) - ion_storm_announcement() + +// Overmap version +/datum/event/ionstorm/overmap/announce() + return /* /proc/IonStorm(botEmagChance = 10) diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm index b4f202722c..c2cc9a0067 100644 --- a/code/modules/events/meteors.dm +++ b/code/modules/events/meteors.dm @@ -1,46 +1,139 @@ /datum/event/meteor_wave - startWhen = 5 - endWhen = 7 + startWhen = 30 // About one minute early warning + endWhen = 60 // Adjusted automatically in tick() + has_skybox_image = TRUE var/next_meteor = 6 var/waves = 1 var/start_side + var/next_meteor_lower = 10 + var/next_meteor_upper = 20 + +/datum/event/meteor_wave/get_skybox_image() + var/image/res = image('icons/skybox/rockbox.dmi', "rockbox") + res.color = COLOR_ASTEROID_ROCK + res.appearance_flags = RESET_COLOR + return res /datum/event/meteor_wave/setup() - waves = 2 + rand(1, severity) //EVENT_LEVEL_MAJOR is 3-5 waves + waves = (2 + rand(1, severity)) * severity start_side = pick(cardinal) endWhen = worst_case_end() +/datum/event/meteor_wave/start() + affecting_z -= global.using_map.sealed_levels // Space levels only please! + ..() + /datum/event/meteor_wave/announce() - switch(severity) - if(EVENT_LEVEL_MAJOR) - command_announcement.Announce("Meteors have been detected on collision course with \the [station_name()].", "Meteor Alert", new_sound = 'sound/AI/meteors.ogg') - else - command_announcement.Announce("\The [station_name()] is now in a meteor shower.", "Meteor Alert") + if(!victim) + switch(severity) + if(EVENT_LEVEL_MAJOR) + command_announcement.Announce("Meteors have been detected on collision course with \the [location_name()].", "Meteor Alert", new_sound = 'sound/AI/meteors.ogg') + else + command_announcement.Announce("\The [location_name()] is now in a meteor shower.", "Meteor Alert") /datum/event/meteor_wave/tick() if(waves && activeFor >= next_meteor) - var/pick_side = prob(80) ? start_side : (prob(50) ? turn(start_side, 90) : turn(start_side, -90)) + send_wave() - spawn() spawn_meteors(severity * rand(1,2), get_meteors(), pick_side) - next_meteor += rand(15, 30) / severity - waves-- - endWhen = worst_case_end() +/datum/event/meteor_wave/proc/send_wave() + var/pick_side = prob(80) ? start_side : (prob(50) ? turn(start_side, 90) : turn(start_side, -90)) + + spawn() spawn_meteors(get_wave_size(), get_meteors(), pick_side, pick(affecting_z)) + next_meteor += rand(next_meteor_lower, next_meteor_upper) / severity + waves-- + endWhen = worst_case_end() + +/datum/event/meteor_wave/proc/get_wave_size() + return severity * rand(2, 3) /datum/event/meteor_wave/proc/worst_case_end() return activeFor + ((30 / severity) * waves) + 10 /datum/event/meteor_wave/end() - switch(severity) - if(EVENT_LEVEL_MAJOR) - command_announcement.Announce("\The [station_name()] has cleared the meteor storm.", "Meteor Alert") - else - command_announcement.Announce("\The [station_name()] has cleared the meteor shower", "Meteor Alert") + ..() + if(!victim) + switch(severity) + if(EVENT_LEVEL_MAJOR) + command_announcement.Announce("\The [location_name()] has cleared the meteor storm.", "Meteor Alert") + else + command_announcement.Announce("\The [location_name()] has cleared the meteor shower", "Meteor Alert") /datum/event/meteor_wave/proc/get_meteors() - if(EVENT_LEVEL_MAJOR) - if(prob(10)) - return meteors_catastrophic + switch(severity) + if(EVENT_LEVEL_MAJOR) + return meteors_major + if(EVENT_LEVEL_MODERATE) + return meteors_moderate else - return meteors_threatening - else - return meteors_normal + return meteors_minor + +/var/list/meteors_minor = list( + /obj/effect/meteor/medium = 80, + /obj/effect/meteor/dust = 30, + /obj/effect/meteor/irradiated = 30, + /obj/effect/meteor/big = 30, + /obj/effect/meteor/flaming = 10, + ///obj/effect/meteor/golden = 10, + ///obj/effect/meteor/silver = 10, +) + +/var/list/meteors_moderate = list( + /obj/effect/meteor/medium = 80, + /obj/effect/meteor/big = 30, + /obj/effect/meteor/dust = 30, + /obj/effect/meteor/irradiated = 30, + /obj/effect/meteor/flaming = 10, + ///obj/effect/meteor/golden = 10, + ///obj/effect/meteor/silver = 10, + /obj/effect/meteor/emp = 10, +) + +/var/list/meteors_major = list( + /obj/effect/meteor/medium = 80, + /obj/effect/meteor/big = 30, + /obj/effect/meteor/dust = 30, + /obj/effect/meteor/irradiated = 30, + /obj/effect/meteor/emp = 30, + /obj/effect/meteor/flaming = 10, + ///obj/effect/meteor/golden = 10, + ///obj/effect/meteor/silver = 10, + /obj/effect/meteor/tunguska = 1, +) + +// Overmap version +/datum/event/meteor_wave/overmap + next_meteor_lower = 5 + next_meteor_upper = 10 + next_meteor = 0 + +/datum/event/meteor_wave/overmap/tick() + if(victim && !victim.is_still() && prob(90)) // Meteors mostly fly in your face + start_side = victim.fore_dir + else //Unless you're standing still + start_side = pick(GLOB.cardinal) + ..() + +/datum/event/meteor_wave/overmap/get_wave_size() + . = ..() + if(!victim) + return + var/skill = victim.get_helm_skill() + var/speed = victim.get_speed() + if(skill >= SKILL_PROF) + . = round(. * 0.5) + if(victim.is_still()) //Standing still means less shit flies your way + . = round(. * 0.1) + if(speed < SHIP_SPEED_SLOW) //Slow and steady + . = round(. * 0.5) + if(speed > SHIP_SPEED_FAST) //Sanic stahp + . *= 2 + + //Smol ship evasion + if(victim.vessel_size < SHIP_SIZE_LARGE && speed < SHIP_SPEED_FAST) + var/skill_needed = SKILL_PROF + if(speed < SHIP_SPEED_SLOW) + skill_needed = SKILL_ADEPT + if(victim.vessel_size < SHIP_SIZE_SMALL) + skill_needed = skill_needed - 1 + if(skill >= max(skill_needed, victim.skill_needed)) + . = round(. * 0.5) diff --git a/code/modules/events/money_hacker.dm b/code/modules/events/money_hacker.dm index 0e604b9956..025bcc6901 100644 --- a/code/modules/events/money_hacker.dm +++ b/code/modules/events/money_hacker.dm @@ -1,5 +1,7 @@ //var/global/account_hack_attempted = 0 +GLOBAL_VAR_INIT(account_hack_attempted, 0) + /datum/event/money_hacker var/datum/money_account/affected_account endWhen = 100 @@ -10,7 +12,7 @@ if(all_money_accounts.len) affected_account = pick(all_money_accounts) - account_hack_attempted = 1 + GLOB.account_hack_attempted = 1 else kill() diff --git a/code/modules/events/money_spam.dm b/code/modules/events/money_spam.dm index 2bf807da47..c6ac3e3c41 100644 --- a/code/modules/events/money_spam.dm +++ b/code/modules/events/money_spam.dm @@ -113,7 +113,7 @@ if (!P.message_silent) playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1) for (var/mob/O in hearers(3, P.loc)) - if(!P.message_silent) O.show_message(text("\icon[P] *[P.ttone]*")) + if(!P.message_silent) O.show_message(text("[bicon(P)] *[P.ttone]*")) //Search for holder of the PDA. var/mob/living/L = null if(P.loc && isliving(P.loc)) @@ -123,4 +123,4 @@ L = get(P, /mob/living/silicon) if(L) - to_chat(L, "\icon[P] Message from [sender] (Unknown / spam?), \"[message]\" (Unable to Reply)") + to_chat(L, "[bicon(P)] Message from [sender] (Unknown / spam?), \"[message]\" (Unable to Reply)") diff --git a/code/modules/events/shipping_error.dm b/code/modules/events/shipping_error.dm index 6b0924b6f7..659f2f7de8 100644 --- a/code/modules/events/shipping_error.dm +++ b/code/modules/events/shipping_error.dm @@ -1,6 +1,6 @@ /datum/event/shipping_error/start() var/datum/supply_order/O = new /datum/supply_order() - O.ordernum = supply_controller.ordernum - O.object = supply_controller.supply_pack[pick(supply_controller.supply_pack)] + O.ordernum = SSsupply.ordernum + O.object = SSsupply.supply_pack[pick(SSsupply.supply_pack)] O.ordered_by = random_name(pick(MALE,FEMALE), species = SPECIES_HUMAN) - supply_controller.shoppinglist += O \ No newline at end of file + SSsupply.shoppinglist += O \ No newline at end of file diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index f6ad7f7429..0cd3b3d78e 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -4322,11 +4322,10 @@ icon_state = "bagelplain" /obj/item/weapon/reagent_containers/food/snacks/bageltwo/Initialize() - . = ..() + ..() //Not returning . because asking to be qdel'd below. spawn_bagels() spawn_bagels() - sleep(30) - qdel(src) + return INITIALIZE_HINT_QDEL /obj/item/weapon/reagent_containers/food/snacks/bageltwo/proc/spawn_bagels() var/build_path = /obj/item/weapon/reagent_containers/food/snacks/bagelplain diff --git a/code/modules/food/kitchen/cooking_machines/_cooker.dm b/code/modules/food/kitchen/cooking_machines/_cooker.dm index 0f39b1f0e6..008910c253 100644 --- a/code/modules/food/kitchen/cooking_machines/_cooker.dm +++ b/code/modules/food/kitchen/cooking_machines/_cooker.dm @@ -10,7 +10,7 @@ icon = 'icons/obj/cooking_machines.dmi' density = 1 anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 5 var/on_icon // Icon state used when cooking. diff --git a/code/modules/food/kitchen/gibber.dm b/code/modules/food/kitchen/gibber.dm index 062fa42fc0..e44c484c54 100644 --- a/code/modules/food/kitchen/gibber.dm +++ b/code/modules/food/kitchen/gibber.dm @@ -14,7 +14,7 @@ var/gib_time = 40 // Time from starting until meat appears var/gib_throw_dir = WEST // Direction to spit meat and gibs in. - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 2 active_power_usage = 500 @@ -22,21 +22,27 @@ /obj/machinery/gibber/autogibber var/turf/input_plate -/obj/machinery/gibber/autogibber/New() - ..() - spawn(5) - for(var/i in cardinal) - var/obj/machinery/mineral/input/input_obj = locate( /obj/machinery/mineral/input, get_step(src.loc, i) ) - if(input_obj) - if(isturf(input_obj.loc)) - input_plate = input_obj.loc - gib_throw_dir = i - qdel(input_obj) - break +/obj/machinery/gibber/autogibber/Initialize() + . = ..() + for(var/i in cardinal) + var/obj/machinery/mineral/input/input_obj = locate( /obj/machinery/mineral/input, get_step(src.loc, i) ) + if(input_obj) + if(isturf(input_obj.loc)) + input_plate = input_obj.loc + gib_throw_dir = i + qdel(input_obj) + break - if(!input_plate) - log_misc("a [src] didn't find an input plate.") - return + if(!input_plate) + log_misc("a [src] didn't find an input plate.") + +/obj/machinery/gibber/Destroy() + occupant = null + return ..() + +/obj/machinery/gibber/autogibber/Destroy() + input_plate = null + return ..() /obj/machinery/gibber/autogibber/Bumped(var/atom/A) if(!input_plate) return diff --git a/code/modules/food/kitchen/icecream.dm b/code/modules/food/kitchen/icecream.dm index 50709b872b..2b53b657ce 100644 --- a/code/modules/food/kitchen/icecream.dm +++ b/code/modules/food/kitchen/icecream.dm @@ -14,7 +14,7 @@ icon_state = "icecream_vat" density = 1 anchored = 0 - use_power = 0 + use_power = USE_POWER_OFF flags = OPENCONTAINER | NOREACT var/list/product_types = list() @@ -92,7 +92,7 @@ var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = O if(!I.ice_creamed) if(product_types[dispense_flavour] > 0) - src.visible_message("\icon[src] [user] scoops delicious [flavour_name] icecream into [I].") + src.visible_message("[bicon(src)] [user] scoops delicious [flavour_name] icecream into [I].") product_types[dispense_flavour] -= 1 I.add_ice_cream(flavour_name) // if(beaker) diff --git a/code/modules/food/kitchen/microwave.dm b/code/modules/food/kitchen/microwave.dm index 0cc14a6a43..1152e4a8b8 100644 --- a/code/modules/food/kitchen/microwave.dm +++ b/code/modules/food/kitchen/microwave.dm @@ -5,7 +5,7 @@ icon_state = "mw" density = 1 anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 5 active_power_usage = 100 clicksound = "button" @@ -238,7 +238,7 @@ Eject ingredients!
\ "} - to_chat(user, browse("Microwave Controls[dat]", "window=microwave")) + user << browse("Microwave Controls[dat]", "window=microwave") onclose(user, "microwave") return @@ -424,4 +424,4 @@ /obj/machinery/microwave/advanced/Initialize() ..() - reagents.maximum_volume = 1000 \ No newline at end of file + reagents.maximum_volume = 1000 diff --git a/code/modules/food/kitchen/smartfridge.dm b/code/modules/food/kitchen/smartfridge.dm index f3c966c331..d76cb754ff 100644 --- a/code/modules/food/kitchen/smartfridge.dm +++ b/code/modules/food/kitchen/smartfridge.dm @@ -2,18 +2,18 @@ */ /obj/machinery/smartfridge name = "\improper SmartFridge" + desc = "For storing all sorts of perishable foods!" icon = 'icons/obj/vending.dmi' - icon_state = "smartfridge" + icon_state = "fridge_food" + var/icon_base = "fridge_food" //Iconstate to base all the broken/deny/etc on + var/icon_contents = "food" //Overlay to put on glass to show contents density = 1 anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 5 active_power_usage = 100 flags = NOREACT var/global/max_n_of_items = 999 // Sorry but the BYOND infinite loop detector doesn't look things over 1000. - var/icon_on = "smartfridge" - var/icon_off = "smartfridge-off" - var/icon_panel = "smartfridge-panel" var/list/item_records = list() var/datum/stored_item/currently_vending = null //What we're putting out of the machine. var/seconds_electrified = 0; @@ -26,6 +26,9 @@ /obj/machinery/smartfridge/secure is_secure = 1 + icon_state = "fridge_sci" + icon_base = "fridge_sci" + icon_contents = "chem" /obj/machinery/smartfridge/New() ..() @@ -49,10 +52,7 @@ /obj/machinery/smartfridge/seeds name = "\improper MegaSeed Servitor" desc = "When you need seeds fast!" - icon = 'icons/obj/vending.dmi' - icon_state = "seeds" - icon_on = "seeds" - icon_off = "seeds-off" + icon_contents = "chem" /obj/machinery/smartfridge/seeds/accept_check(var/obj/item/O as obj) if(istype(O,/obj/item/seeds/)) @@ -62,6 +62,7 @@ /obj/machinery/smartfridge/secure/extract name = "\improper Biological Sample Storage" desc = "A refrigerated storage unit for xenobiological samples." + icon_contents = "slime" req_access = list(access_research) /obj/machinery/smartfridge/secure/extract/accept_check(var/obj/item/O as obj) @@ -71,12 +72,9 @@ return TRUE return FALSE - /obj/machinery/smartfridge/secure/medbay name = "\improper Refrigerated Medicine Storage" desc = "A refrigerated storage unit for storing medicine and chemicals." - icon_state = "smartfridge" //To fix the icon in the map editor. - icon_on = "smartfridge_chem" req_one_access = list(access_medical,access_chemistry) /obj/machinery/smartfridge/secure/medbay/accept_check(var/obj/item/O as obj) @@ -91,10 +89,8 @@ /obj/machinery/smartfridge/secure/virology name = "\improper Refrigerated Virus Storage" desc = "A refrigerated storage unit for storing viral material." + icon_contents = "drink" req_access = list(access_virology) - icon_state = "smartfridge_virology" - icon_on = "smartfridge_virology" - icon_off = "smartfridge_virology-off" /obj/machinery/smartfridge/secure/virology/accept_check(var/obj/item/O as obj) if(istype(O,/obj/item/weapon/reagent_containers/glass/beaker/vial/)) @@ -103,23 +99,26 @@ return 1 return 0 -/obj/machinery/smartfridge/chemistry +/obj/machinery/smartfridge/chemistry //Is this used anywhere? It's not secure. name = "\improper Smart Chemical Storage" desc = "A refrigerated storage unit for medicine and chemical storage." + icon_contents = "chem" /obj/machinery/smartfridge/chemistry/accept_check(var/obj/item/O as obj) if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers)) return 1 return 0 -/obj/machinery/smartfridge/chemistry/virology +/obj/machinery/smartfridge/chemistry/virology //Same name = "\improper Smart Virus Storage" desc = "A refrigerated storage unit for volatile sample storage." - /obj/machinery/smartfridge/drinks name = "\improper Drink Showcase" desc = "A refrigerated storage unit for tasty tasty alcohol." + icon_state = "fridge_drinks" + icon_base = "fridge_drinks" + icon_contents = "drink" /obj/machinery/smartfridge/drinks/accept_check(var/obj/item/O as obj) if(istype(O,/obj/item/weapon/reagent_containers/glass) || istype(O,/obj/item/weapon/reagent_containers/food/drinks) || istype(O,/obj/item/weapon/reagent_containers/food/condiment)) @@ -130,9 +129,7 @@ desc = "A machine for drying plants." wrenchable = 1 icon_state = "drying_rack" - icon_on = "drying_rack_on" - icon_off = "drying_rack" - icon_panel = "drying_rack-panel" + icon_base = "drying_rack" /obj/machinery/smartfridge/drying_rack/accept_check(var/obj/item/O as obj) if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/)) @@ -150,21 +147,22 @@ update_icon() /obj/machinery/smartfridge/drying_rack/update_icon() - overlays.Cut() var/not_working = stat & (BROKEN|NOPOWER) - if(not_working) - icon_state = icon_off - else - icon_state = icon_on var/hasItems for(var/datum/stored_item/I in item_records) if(I.get_amount()) hasItems = 1 break if(hasItems) - overlays += "drying_rack_filled" - if(!not_working) - overlays += "drying_rack_drying" + if(not_working) + icon_state = "[icon_base]-plant-off" + else + icon_state = "[icon_base]-plant" + else + if(not_working) + icon_state = "[icon_base]-off" + else + icon_state = "[icon_base]" /obj/machinery/smartfridge/drying_rack/proc/dry() for(var/datum/stored_item/I in item_records) @@ -198,10 +196,40 @@ update_icon() /obj/machinery/smartfridge/update_icon() + cut_overlays() if(stat & (BROKEN|NOPOWER)) - icon_state = icon_off + icon_state = "[icon_base]-off" else - icon_state = icon_on + icon_state = icon_base + + if(is_secure) + add_overlay("[icon_base]-sidepanel") + + if(panel_open) + add_overlay("[icon_base]-panel") + + var/is_off = "" + if(inoperable()) + is_off = "-off" + + // Fridge contents + switch(contents.len) + if(0) + add_overlay("empty[is_off]") + if(1 to 2) + add_overlay("[icon_contents]-1[is_off]") + if(3 to 5) + add_overlay("[icon_contents]-2[is_off]") + if(6 to 8) + add_overlay("[icon_contents]-3[is_off]") + else + add_overlay("[icon_contents]-4[is_off]") + + // Fridge top + var/image/top = image(icon, "[icon_base]-top") + top.pixel_z = 32 + top.layer = ABOVE_WINDOW_LAYER + add_overlay(top) /******************* * Item Adding @@ -212,9 +240,7 @@ panel_open = !panel_open user.visible_message("[user] [panel_open ? "opens" : "closes"] the maintenance panel of \the [src].", "You [panel_open ? "open" : "close"] the maintenance panel of \the [src].") playsound(src, O.usesound, 50, 1) - overlays.Cut() - if(panel_open) - overlays += image(icon, icon_panel) + update_icon() SSnanoui.update_uis(src) return diff --git a/code/modules/gamemaster/actions/action.dm b/code/modules/gamemaster/actions/action.dm deleted file mode 100644 index f8ea16994e..0000000000 --- a/code/modules/gamemaster/actions/action.dm +++ /dev/null @@ -1,27 +0,0 @@ -/datum/gm_action - var/name = "no name" // Simple name, for organization. - var/enabled = TRUE // If not enabled, this action is never taken. - var/departments = list() // What kinds of departments are affected by this action. Multiple departments can be listed. - var/chaotic = 0 // A number showing how chaotic the action may be. If danger is high, the GM will avoid it. - var/reusable = FALSE // If true, the event does not become disabled upon being used. Should be used sparingly. - var/observers_used = FALSE // Determines if the GM should check if ghosts are available before using this. - var/length = 0 // Determines how long the event lasts, until end() is called. - var/datum/game_master/gm = null - var/severity = 1 // The severity of the action. This is here to prevent continued future defining of this var on actions, un-used. - -/datum/gm_action/proc/set_up() - return - -/datum/gm_action/proc/get_weight() - return - -/datum/gm_action/proc/start() - if(!reusable) - enabled = FALSE - return - -/datum/gm_action/proc/end() - return - -/datum/gm_action/proc/announce() - return \ No newline at end of file diff --git a/code/modules/gamemaster/actions/atmos_leak.dm b/code/modules/gamemaster/actions/atmos_leak.dm deleted file mode 100644 index e40ed48c37..0000000000 --- a/code/modules/gamemaster/actions/atmos_leak.dm +++ /dev/null @@ -1,77 +0,0 @@ -/datum/gm_action/atmos_leak - name = "atmospherics leak" - departments = list(DEPARTMENT_ENGINEERING, DEPARTMENT_SYNTHETIC) - var/area/target_area // Chosen target area - var/area/target_turf // Chosen target turf in target_area - var/gas_type // Chosen gas to release - // Exclude these types and sub-types from targeting eligibilty - var/list/area/excluded = list( - /area/submap, - /area/shuttle, - /area/crew_quarters, - /area/holodeck, - /area/engineering/engine_room - ) - - severity - -// Decide which area will be targeted! -/datum/gm_action/atmos_leak/set_up() - severity = pickweight(EVENT_LEVEL_MUNDANE = 8, - EVENT_LEVEL_MODERATE = 5, - EVENT_LEVEL_MAJOR = 3 - ) - - var/gas_choices = list("carbon_dioxide", "sleeping_agent") // Annoying - if(severity >= EVENT_LEVEL_MODERATE) - gas_choices += "phoron" // Dangerous - if(severity >= EVENT_LEVEL_MAJOR) - gas_choices += "volatile_fuel" // Dangerous and no default atmos setup! - gas_type = pick(gas_choices) - - var/list/area/grand_list_of_areas = get_station_areas(excluded) - - // Okay, now lets try and pick a target! Lets try 10 times, otherwise give up - for(var/i in 1 to 10) - var/area/A = pick(grand_list_of_areas) - if(is_area_occupied(A)) - log_debug("atmos_leak event: Rejected [A] because it is occupied.") - continue - // A good area, great! Lets try and pick a turf - var/list/turfs = list() - for(var/turf/simulated/floor/F in A) - if(turf_clear(F)) - turfs += F - if(turfs.len == 0) - log_debug("atmos_leak event: Rejected [A] because it has no clear turfs.") - continue - target_area = A - target_turf = pick(turfs) - - // If we can't find a good target, give up - if(!target_area) - log_debug("atmos_leak event: Giving up after too many failures to pick target area") - return - -/datum/gm_action/atmos_leak/announce() - if(target_area) - command_announcement.Announce("Warning, hazardous [gas_data.name[gas_type]] gas leak detected in \the [target_area], evacuate the area.", "Hazard Alert") - -/datum/gm_action/atmos_leak/start() - if(!target_turf) - return - ..() - spawn(rand(0, 600)) - // Okay, time to actually put the gas in the room! - // TODO - Would be nice to break a waste pipe perhaps? - // TODO - Maybe having it released from a single point and thus causing airflow to blow stuff around - - // Fow now just add a bunch of it to the air - var/datum/gas_mixture/air_contents = new - air_contents.temperature = T20C + ((severity - 1) * rand(-50, 50)) - air_contents.gas[gas_type] = 10 * MOLES_CELLSTANDARD - target_turf.assume_air(air_contents) - playsound(target_turf, 'sound/effects/smoke.ogg', 50, 1) - -/datum/gm_action/atmos_leak/get_weight() - return 15 + (metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 10 + metric.count_people_in_department(DEPARTMENT_SYNTHETIC) * 30) // Synthetics are counted in higher value because they can wirelessly connect to alarms. diff --git a/code/modules/gamemaster/actions/blob.dm b/code/modules/gamemaster/actions/blob.dm deleted file mode 100644 index dd9939a11d..0000000000 --- a/code/modules/gamemaster/actions/blob.dm +++ /dev/null @@ -1,74 +0,0 @@ -/datum/gm_action/blob - name = "blob infestation" - departments = list(DEPARTMENT_ENGINEERING, DEPARTMENT_SECURITY, DEPARTMENT_MEDICAL) - chaotic = 25 - - var/list/area/excluded = list( - /area/submap, - /area/shuttle, - /area/crew_quarters, - /area/holodeck, - /area/engineering/engine_room - ) - - var/area/target_area // Chosen target area - var/turf/target_turf // Chosen target turf in target_area - - var/obj/structure/blob/core/Blob - var/spawn_blob_type = /obj/structure/blob/core/random_medium - -/datum/gm_action/blob/set_up() - severity = pickweight(EVENT_LEVEL_MUNDANE = 4, - EVENT_LEVEL_MODERATE = 2, - EVENT_LEVEL_MAJOR = 1 - ) - - var/list/area/grand_list_of_areas = get_station_areas(excluded) - - for(var/i in 1 to 10) - var/area/A = pick(grand_list_of_areas) - if(is_area_occupied(A)) - log_debug("Blob infestation event: Rejected [A] because it is occupied.") - continue - var/list/turfs = list() - for(var/turf/simulated/floor/F in A) - if(turf_clear(F)) - turfs += F - if(turfs.len == 0) - log_debug("Blob infestation event: Rejected [A] because it has no clear turfs.") - continue - target_area = A - target_turf = pick(turfs) - - if(!target_area) - log_debug("Blob infestation event: Giving up after too many failures to pick target area") - -/datum/gm_action/blob/start() - ..() - var/turf/T - - if(severity == EVENT_LEVEL_MUNDANE || !target_area || !target_turf) - T = pick(blobstart) - else if(severity == EVENT_LEVEL_MODERATE) - T = target_turf - else - T = target_turf - spawn_blob_type = /obj/structure/blob/core/random_hard - - Blob = new spawn_blob_type(T) - -/datum/gm_action/blob/announce() - spawn(rand(600, 3000)) // 1-5 minute leeway for the blob to go un-detected. - command_announcement.Announce("Confirmed outbreak of level 7 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg') - -/datum/gm_action/blob/get_weight() - var/engineers = metric.count_people_in_department(DEPARTMENT_ENGINEERING) - var/security = metric.count_people_in_department(DEPARTMENT_SECURITY) - var/medical = metric.count_people_in_department(DEPARTMENT_MEDICAL) - - var/assigned_staff = engineers + security - if(engineers || security) // Medical only counts if one of the other two exists, and even then they count as half. - assigned_staff += round(medical / 2) - - var/weight = (max(assigned_staff - 2, 0) * 20) // An assigned staff count of 2 must be had to spawn a blob. - return weight diff --git a/code/modules/gamemaster/actions/brand_intelligence.dm b/code/modules/gamemaster/actions/brand_intelligence.dm deleted file mode 100644 index 28ed6a9928..0000000000 --- a/code/modules/gamemaster/actions/brand_intelligence.dm +++ /dev/null @@ -1,69 +0,0 @@ -/datum/gm_action/brand_intelligence - name = "rampant vending machines" - length = 30 MINUTES - departments = list(DEPARTMENT_ENGINEERING, DEPARTMENT_EVERYONE) - - var/list/obj/machinery/vending/vendingMachines = list() - var/list/obj/machinery/vending/infectedVendingMachines = list() - var/obj/machinery/vending/originMachine - var/start_time = 0 - - var/active = FALSE // Are we currently infecting? - -/datum/gm_action/brand_intelligence/announce() - if(prob(90)) - command_announcement.Announce("An ongoing mass upload of malware for vendors has been detected onboard [station_name()], which appears to transmit \ - to other nearby vendors. The original infected machine is believed to be \a [originMachine.name].", "Vendor Service Alert") - -/datum/gm_action/brand_intelligence/set_up() - vendingMachines.Cut() - infectedVendingMachines.Cut() - - for(var/obj/machinery/vending/V in machines) - if(isNotStationLevel(V.z)) continue - vendingMachines.Add(V) - - if(!vendingMachines.len) - length = 0 - return - - originMachine = pick(vendingMachines) - vendingMachines.Remove(originMachine) - originMachine.shut_up = 0 - originMachine.shoot_inventory = 1 - - start_time = world.time - active = TRUE - -/datum/gm_action/brand_intelligence/start() - ..() - while(originMachine || active) - if(!vendingMachines.len || !originMachine || originMachine.shut_up) //if every machine is infected, or if the original vending machine is missing or has it's voice switch flipped - end() - return - - if(ISMULTIPLE(world.time - start_time, 5)) - if(prob(15)) - var/obj/machinery/vending/infectedMachine = pick(vendingMachines) - vendingMachines.Remove(infectedMachine) - infectedVendingMachines.Add(infectedMachine) - infectedMachine.shut_up = 0 - infectedMachine.shoot_inventory = 1 - - if(ISMULTIPLE(world.time - start_time, 12)) - originMachine.speak(pick("Try our aggressive new marketing strategies!", \ - "You should buy products to feed your lifestyle obsession!", \ - "Consume!", \ - "Your money can buy happiness!", \ - "Engage direct marketing!", \ - "Advertising is legalized lying! But don't let that put you off our great deals!", \ - "You don't want to buy anything? Yeah, well I didn't want to buy your mom either.")) - -/datum/gm_action/brand_intelligence/end() - active = FALSE - for(var/obj/machinery/vending/infectedMachine in infectedVendingMachines) - infectedMachine.shut_up = 1 - infectedMachine.shoot_inventory = 0 - -/datum/gm_action/brand_intelligence/get_weight() - return 60 + (metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 20) diff --git a/code/modules/gamemaster/actions/camera_damage.dm b/code/modules/gamemaster/actions/camera_damage.dm deleted file mode 100644 index 10ccb510ce..0000000000 --- a/code/modules/gamemaster/actions/camera_damage.dm +++ /dev/null @@ -1,52 +0,0 @@ -/datum/gm_action/camera_damage - name = "random camera damage" - reusable = TRUE - departments = list(DEPARTMENT_SYNTHETIC, DEPARTMENT_ENGINEERING) - -/datum/gm_action/camera_damage/start() - var/obj/machinery/camera/C = acquire_random_camera() - if(!C) - return - ..() - - var/severity_range = 0 - severity = pickweight(EVENT_LEVEL_MUNDANE = 10, - EVENT_LEVEL_MODERATE = 5, - EVENT_LEVEL_MAJOR = 1 - ) - - switch(severity) - if(EVENT_LEVEL_MUNDANE) - severity_range = 0 - if(EVENT_LEVEL_MODERATE) - severity_range = 7 - if(EVENT_LEVEL_MAJOR) - severity_range = 15 - - for(var/obj/machinery/camera/cam in range(severity_range,C)) - if(is_valid_camera(cam)) - if(prob(2*severity)) - cam.destroy() - else - cam.wires.UpdateCut(CAMERA_WIRE_POWER, 0) - if(prob(5*severity)) - cam.wires.UpdateCut(CAMERA_WIRE_ALARM, 0) - -/datum/gm_action/camera_damage/proc/acquire_random_camera(var/remaining_attempts = 5) - if(!cameranet.cameras.len) - return - if(!remaining_attempts) - return - - var/obj/machinery/camera/C = pick(cameranet.cameras) - if(is_valid_camera(C)) - return C - return acquire_random_camera(remaining_attempts--) - -/datum/gm_action/camera_damage/proc/is_valid_camera(var/obj/machinery/camera/C) - // Only return a functional camera, not installed in a silicon/hardsuit/circuit/etc, and that exists somewhere players have access - var/turf/T = get_turf(C) - return T && C.can_use() && istype(C.loc, /turf) && (T.z in using_map.player_levels) - -/datum/gm_action/camera_damage/get_weight() - return 40 + (metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 20) + (metric.count_people_in_department(DEPARTMENT_SYNTHETIC) * 40) diff --git a/code/modules/gamemaster/actions/carp_migration.dm b/code/modules/gamemaster/actions/carp_migration.dm deleted file mode 100644 index 137c2cccb9..0000000000 --- a/code/modules/gamemaster/actions/carp_migration.dm +++ /dev/null @@ -1,58 +0,0 @@ -//carp_migration -/datum/gm_action/carp_migration - name = "carp migration" - departments = list(DEPARTMENT_SECURITY, DEPARTMENT_EVERYONE) - chaotic = 50 - var/list/spawned_carp = list() - var/carp_amount = 0 - length = 20 MINUTES - -/datum/gm_action/carp_migration/get_weight() - return 50 + (metric.count_people_in_department(DEPARTMENT_SECURITY) * 10) + (metric.count_all_space_mobs() * 20) - -/datum/gm_action/carp_migration/announce() - var/announcement = "Unknown biological entities have been detected near [station_name()], please stand-by." - command_announcement.Announce(announcement, "Lifesign Alert") - -/datum/gm_action/carp_migration/set_up() - // Higher filled roles means more groups of fish. - var/station_strength = 0 - station_strength += (metric.count_people_in_department(DEPARTMENT_SECURITY) * 3) - station_strength += (metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 2) - station_strength += metric.count_people_in_department(DEPARTMENT_MEDICAL) - - // Less active emergency response departments tones the event down. - var/activeness = ((metric.assess_department(DEPARTMENT_SECURITY) + metric.assess_department(DEPARTMENT_ENGINEERING) + metric.assess_department(DEPARTMENT_MEDICAL)) / 3) - activeness = max(activeness, 20) - - carp_amount = CEILING(station_strength * (activeness / 100) + 1, 1) - -/datum/gm_action/carp_migration/start() - ..() - var/list/spawn_locations = list() - - var/group_size_min = 3 - var/group_size_max = 5 - - for(var/obj/effect/landmark/C in landmarks_list) - if(C.name == "carpspawn") - spawn_locations.Add(C.loc) - - spawn_locations = shuffle(spawn_locations) - carp_amount = min(carp_amount, spawn_locations.len) - - var/i = 1 - while (i <= carp_amount) - var/group_size = rand(group_size_min, group_size_max) - for (var/j = 1, j <= group_size, j++) - spawned_carp.Add(new /mob/living/simple_mob/animal/space/carp/event(spawn_locations[i])) - i++ - message_admins("[spawned_carp.len] carp spawned by event.") - -/datum/gm_action/carp_migration/end() - for(var/mob/living/simple_mob/animal/space/carp/C in spawned_carp) - if(!C.stat) - var/turf/T = get_turf(C) - if(istype(T, /turf/space)) - if(!prob(25)) - qdel(C) \ No newline at end of file diff --git a/code/modules/gamemaster/actions/comms_blackout.dm b/code/modules/gamemaster/actions/comms_blackout.dm deleted file mode 100644 index 353a3bd92b..0000000000 --- a/code/modules/gamemaster/actions/comms_blackout.dm +++ /dev/null @@ -1,21 +0,0 @@ -/datum/gm_action/comms_blackout - name = "communications blackout" - departments = list(DEPARTMENT_ENGINEERING, DEPARTMENT_EVERYONE) - chaotic = 35 - -/datum/gm_action/comms_blackout/get_weight() - return 50 + (metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 40) - -/datum/gm_action/comms_blackout/announce() - if(prob(33)) - command_announcement.Announce("Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT", new_sound = 'sound/misc/interference.ogg') - // AIs will always know if there's a comm blackout, rogue AIs could then lie about comm blackouts in the future while they shutdown comms - for(var/mob/living/silicon/ai/A in player_list) - to_chat(A, "
") - to_chat(A, "Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT") - to_chat(A, "
") - -/datum/gm_action/comms_blackout/start() - ..() - for(var/obj/machinery/telecomms/T in telecomms_list) - T.emp_act(1) diff --git a/code/modules/gamemaster/actions/drill_announcement.dm b/code/modules/gamemaster/actions/drill_announcement.dm deleted file mode 100644 index 47f44e2caf..0000000000 --- a/code/modules/gamemaster/actions/drill_announcement.dm +++ /dev/null @@ -1,10 +0,0 @@ -/datum/gm_action/security_drill - name = "security drills" - departments = list(DEPARTMENT_SECURITY, DEPARTMENT_EVERYONE) - -/datum/gm_action/security_drill/announce() - spawn(rand(1 MINUTE, 2 MINUTES)) - command_announcement.Announce("[pick("A NanoTrasen security director", "A Vir-Gov correspondant", "Local Sif authoritiy")] has advised the enactment of [pick("a rampant wildlife", "a fire", "a hostile boarding", "a nonstandard", "a bomb", "an emergent intelligence")] drill with the personnel onboard \the [station_name()].", "Security Advisement") - -/datum/gm_action/security_drill/get_weight() - return max(-20, 10 + gm.staleness - (gm.danger * 2)) + (metric.count_people_in_department(DEPARTMENT_SECURITY) * 5) + (metric.count_people_in_department(DEPARTMENT_EVERYONE) * 1.5) diff --git a/code/modules/gamemaster/actions/dust.dm b/code/modules/gamemaster/actions/dust.dm deleted file mode 100644 index 49d0a33b95..0000000000 --- a/code/modules/gamemaster/actions/dust.dm +++ /dev/null @@ -1,17 +0,0 @@ -/datum/gm_action/dust - name = "dust" - departments = list(DEPARTMENT_ENGINEERING) - chaotic = 10 - reusable = TRUE - -/datum/gm_action/dust/announce() - command_announcement.Announce("Debris resulting from activity on another nearby asteroid is approaching your colony.", "Dust Alert") - -/datum/gm_action/dust/get_weight() - var/engineers = metric.count_people_in_department(DEPARTMENT_ENGINEERING) - var/weight = 30 + (engineers * 25) - return weight - -/datum/gm_action/dust/start() - ..() - dust_swarm("norm") diff --git a/code/modules/gamemaster/actions/electrical_storm.dm b/code/modules/gamemaster/actions/electrical_storm.dm deleted file mode 100644 index 4cd4c39df6..0000000000 --- a/code/modules/gamemaster/actions/electrical_storm.dm +++ /dev/null @@ -1,33 +0,0 @@ -/datum/gm_action/electrical_storm - name = "electrical storm" - departments = list(DEPARTMENT_EVERYONE) - reusable = TRUE - var/lightsoutAmount = 1 - var/lightsoutRange = 25 - -/datum/gm_action/electrical_storm/announce() - command_announcement.Announce("An electrical issue has been detected in your area, please repair potential electronic overloads.", "Electrical Alert") - -/datum/gm_action/electrical_storm/start() - ..() - var/list/epicentreList = list() - - for(var/i=1, i <= lightsoutAmount, i++) - var/list/possibleEpicentres = list() - for(var/obj/effect/landmark/newEpicentre in landmarks_list) - if(newEpicentre.name == "lightsout" && !(newEpicentre in epicentreList)) - possibleEpicentres += newEpicentre - if(possibleEpicentres.len) - epicentreList += pick(possibleEpicentres) - else - break - - if(!epicentreList.len) - return - - for(var/obj/effect/landmark/epicentre in epicentreList) - for(var/obj/machinery/power/apc/apc in range(epicentre,lightsoutRange)) - apc.overload_lighting() - -/datum/gm_action/electrical_storm/get_weight() - return 30 + (metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 15) + (metric.count_people_in_department(DEPARTMENT_EVERYONE) * 5) diff --git a/code/modules/gamemaster/actions/electrified_door.dm b/code/modules/gamemaster/actions/electrified_door.dm deleted file mode 100644 index 213c0c0292..0000000000 --- a/code/modules/gamemaster/actions/electrified_door.dm +++ /dev/null @@ -1,75 +0,0 @@ -/datum/gm_action/electrified_door - name = "airlock short-circuit" - departments = list(DEPARTMENT_ENGINEERING, DEPARTMENT_MEDICAL) - chaotic = 10 - var/obj/machinery/door/airlock/chosen_door - var/area/target_area - var/list/area/excluded = list( - /area/submap, - /area/shuttle, - /area/crew_quarters - ) - -/datum/gm_action/electrified_door/set_up() - var/list/area/grand_list_of_areas = get_station_areas(excluded) - - severity = pickweight(EVENT_LEVEL_MUNDANE = 10, - EVENT_LEVEL_MODERATE = 5, - EVENT_LEVEL_MAJOR = 1 - ) - - //try 10 times - for(var/i in 1 to 10) - target_area = pick(grand_list_of_areas) - var/list/obj/machinery/door/airlock/target_doors = list() - for(var/obj/machinery/door/airlock/target_door in target_area.contents) - target_doors += target_door - target_doors = shuffle(target_doors) - - for(var/obj/machinery/door/airlock/target_door in target_doors) - if(!target_door.isElectrified() && target_door.arePowerSystemsOn() && target_door.maxhealth == target_door.health) - chosen_door = target_door - return - -/datum/gm_action/electrified_door/start() - ..() - if(!chosen_door) - return - command_announcement.Announce("An electrical issue has been detected in your area, please repair potential electronic overloads.", "Electrical Alert") - chosen_door.visible_message("\The [chosen_door]'s panel sparks!") - chosen_door.set_safeties(0) - playsound(get_turf(chosen_door), 'sound/machines/buzz-sigh.ogg', 50, 1) - if(severity >= EVENT_LEVEL_MODERATE) - chosen_door.electrify(-1) - spawn(rand(10 SECONDS, 2 MINUTES)) - if(chosen_door && chosen_door.arePowerSystemsOn() && prob(25 + 25 * severity)) - command_announcement.Announce("Overload has been localized to \the [target_area].", "Electrical Alert") - - if(severity >= EVENT_LEVEL_MAJOR) // New Major effect. Hydraulic boom. - spawn() - chosen_door.visible_message("\The [chosen_door] buzzes.") - playsound(get_turf(chosen_door), 'sound/machines/buzz-sigh.ogg', 50, 1) - sleep(rand(10 SECONDS, 3 MINUTES)) - if(!chosen_door || !chosen_door.arePowerSystemsOn()) - return - chosen_door.visible_message("\The [chosen_door]'s hydraulics creak.") - playsound(get_turf(chosen_door), 'sound/machines/airlock_creaking.ogg', 50, 1) - sleep(rand(30 SECONDS, 10 MINUTES)) - if(!chosen_door || !chosen_door.arePowerSystemsOn()) - return - chosen_door.visible_message("\The [chosen_door] emits a hydraulic shriek!") - playsound(get_turf(chosen_door), 'sound/machines/airlock.ogg', 80, 1) - spawn(rand(5 SECONDS, 30 SECONDS)) - if(!chosen_door || !chosen_door.arePowerSystemsOn()) - return - chosen_door.visible_message("\The [chosen_door]'s hydraulics detonate!") - chosen_door.fragmentate(get_turf(chosen_door), rand(5, 10), rand(3, 5), list(/obj/item/projectile/bullet/pellet/fragment/tank/small)) - explosion(get_turf(chosen_door),-1,-1,2,3) - - chosen_door.lock() - chosen_door.health = chosen_door.maxhealth / 6 - chosen_door.aiControlDisabled = 1 - chosen_door.update_icon() - -/datum/gm_action/electrified_door/get_weight() - return 10 + (metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 5 + metric.count_people_in_department(DEPARTMENT_MEDICAL) * 10) diff --git a/code/modules/gamemaster/actions/gravity.dm b/code/modules/gamemaster/actions/gravity.dm deleted file mode 100644 index f568de9eae..0000000000 --- a/code/modules/gamemaster/actions/gravity.dm +++ /dev/null @@ -1,36 +0,0 @@ -/datum/gm_action/gravity - name = "gravity failure" - departments = list(DEPARTMENT_EVERYONE) - length = 600 - var/list/zLevels - -/datum/gm_action/gravity/set_up() - length = rand(length, length * 5) - // Setup which levels we will disrupt gravit on. - zLevels = using_map.station_levels.Copy() - for(var/datum/planet/P in SSplanets.planets) - zLevels -= P.expected_z_levels - -/datum/gm_action/gravity/announce() - command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artificial gravity has been disabled whilst the system \ - reinitializes. Please stand by while the gravity system reinitializes.", "Gravity Failure") - -/datum/gm_action/gravity/start() - ..() - gravity_is_on = 0 - for(var/area/A in all_areas) - if(A.z in zLevels) - A.gravitychange(gravity_is_on) - -/datum/gm_action/gravity/end() - if(!gravity_is_on) - gravity_is_on = 1 - - for(var/area/A in all_areas) - if(A.z in zLevels) - A.gravitychange(gravity_is_on) - - command_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.", "Gravity Restored") - -/datum/gm_action/gravity/get_weight() - return 30 + (metric.count_people_in_department(DEPARTMENT_EVERYONE) * 20) diff --git a/code/modules/gamemaster/actions/grid_check.dm b/code/modules/gamemaster/actions/grid_check.dm deleted file mode 100644 index ddd0cd923e..0000000000 --- a/code/modules/gamemaster/actions/grid_check.dm +++ /dev/null @@ -1,23 +0,0 @@ -// New grid check event: -// Very similar to the old one, power goes out in most of the colony, however the new feature is the ability for engineering to -// get power back on sooner, if they are able to reach a special machine and initiate a manual reboot. If no one is able to do so, -// it will reboot itself after a few minutes, just like the old one. Bad things happen if there is no grid checker machine protecting -// the powernet when this event fires. - -/datum/gm_action/grid_check - name = "grid check" - departments = list(DEPARTMENT_ENGINEERING, DEPARTMENT_EVERYONE) - chaotic = 20 - -/datum/gm_action/grid_check/get_weight() - return 50 + (metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 30) - -/datum/gm_action/grid_check/start() - ..() - // This sets off a chain of events that lead to the actual grid check (or perhaps worse). - // First, the Supermatter engine makes a power spike. - for(var/obj/machinery/power/generator/engine in machines) - engine.power_spike() - break // Just one engine, please. - // After that, the engine checks if a grid checker exists on the same powernet, and if so, it triggers a blackout. - // If not, lots of stuff breaks. See code/modules/power/generator.dm for that piece of code. \ No newline at end of file diff --git a/code/modules/gamemaster/actions/infestation.dm b/code/modules/gamemaster/actions/infestation.dm deleted file mode 100644 index a887a3b5d3..0000000000 --- a/code/modules/gamemaster/actions/infestation.dm +++ /dev/null @@ -1,116 +0,0 @@ -#define LOC_KITCHEN 0 -#define LOC_ATMOS 1 -#define LOC_CHAPEL 2 -#define LOC_LIBRARY 3 -#define LOC_HYDRO 4 -#define LOC_VAULT 5 -#define LOC_CONSTR 6 -#define LOC_TECH 7 -#define LOC_GARDEN 8 - -#define VERM_MICE 0 -#define VERM_LIZARDS 1 -#define VERM_SPIDERS 2 - -/datum/gm_action/infestation - name = "animal infestation" - departments = list(DEPARTMENT_EVERYONE) - var/location - var/locstring - var/vermin - var/vermstring - - var/list/turf/simulated/floor/turfs = list() - - var/spawn_types - var/max_number - -/datum/gm_action/infestation/set_up() - location = rand(0,8) - turfs.Cut() - var/spawn_area_type - switch(location) - if(LOC_KITCHEN) - spawn_area_type = /area/crew_quarters/kitchen - locstring = "the kitchen" - if(LOC_ATMOS) - spawn_area_type = /area/engineering/atmos - locstring = "atmospherics" - if(LOC_CHAPEL) - spawn_area_type = /area/chapel/main - locstring = "the chapel" - if(LOC_LIBRARY) - spawn_area_type = /area/library - locstring = "the library" - if(LOC_HYDRO) - spawn_area_type = /area/hydroponics - locstring = "hydroponics" - if(LOC_VAULT) - spawn_area_type = /area/security/nuke_storage - locstring = "the vault" - if(LOC_CONSTR) - spawn_area_type = /area/construction - locstring = "the construction area" - if(LOC_TECH) - spawn_area_type = /area/storage/tech - locstring = "technical storage" - if(LOC_GARDEN) - spawn_area_type = /area/hydroponics/garden - locstring = "the public garden" - - for(var/areapath in typesof(spawn_area_type)) - var/area/A = locate(areapath) - for(var/turf/simulated/floor/F in A.contents) - if(turf_clear(F)) - turfs += F - - spawn_types = list() - max_number = 0 - vermin = rand(0,2) - switch(vermin) - if(VERM_MICE) - spawn_types = list(/mob/living/simple_mob/animal/passive/mouse/gray, /mob/living/simple_mob/animal/passive/mouse/brown, /mob/living/simple_mob/animal/passive/mouse/white, /mob/living/simple_mob/animal/passive/mouse/rat) - max_number = 12 - vermstring = "mice" - if(VERM_LIZARDS) - spawn_types = list(/mob/living/simple_mob/animal/passive/lizard, /mob/living/simple_mob/animal/passive/lizard, /mob/living/simple_mob/animal/passive/lizard/large, /mob/living/simple_mob/animal/passive/lizard/large/defensive) - max_number = 6 - vermstring = "lizards" - if(VERM_SPIDERS) - spawn_types = list(/obj/effect/spider/spiderling) - max_number = 3 - vermstring = "spiders" - -/datum/gm_action/infestation/start() - spawn() - var/num = rand(2,max_number) - while(turfs.len > 0 && num > 0) - var/turf/simulated/floor/T = pick(turfs) - turfs.Remove(T) - num-- - - if(vermin == VERM_SPIDERS) - var/obj/effect/spider/spiderling/S = new(T) - S.amount_grown = -1 - else - var/spawn_type = pick(spawn_types) - new spawn_type(T) - -/datum/gm_action/infestation/announce() - command_announcement.Announce("Bioscans indicate that [vermstring] have been breeding in [locstring]. Clear them out, before this starts to affect productivity.", "Vermin infestation") - -/datum/gm_action/infestation/get_weight() - return 5 + (metric.count_people_in_department(DEPARTMENT_EVERYONE) * 20) - -#undef LOC_KITCHEN -#undef LOC_ATMOS -#undef LOC_CHAPEL -#undef LOC_LIBRARY -#undef LOC_HYDRO -#undef LOC_VAULT -#undef LOC_TECH -#undef LOC_GARDEN - -#undef VERM_MICE -#undef VERM_LIZARDS -#undef VERM_SPIDERS \ No newline at end of file diff --git a/code/modules/gamemaster/actions/ion_storm.dm b/code/modules/gamemaster/actions/ion_storm.dm deleted file mode 100644 index 5ff51ccbaa..0000000000 --- a/code/modules/gamemaster/actions/ion_storm.dm +++ /dev/null @@ -1,50 +0,0 @@ -/datum/gm_action/ionstorm - name = "ion storm" - departments = list(DEPARTMENT_SYNTHETIC) - var/botEmagChance = 0.5 - var/list/players = list() - var/active = FALSE - length = 1 MINUTE - -/datum/gm_action/ionstorm/set_up() - length = rand(length, length * 10) -// command_alert("The station has entered an ion storm. Monitor all electronic equipment for malfunctions", "Anomaly Alert") - for (var/mob/living/carbon/human/player in player_list) - if( !player.mind || player_is_antag(player.mind, only_offstation_roles = 1) || player.client.inactivity > MinutesToTicks(10)) - continue - players += player.real_name - - for (var/mob/living/silicon/ai/target in silicon_mob_list) - var/law = target.generate_ion_law() - to_chat(target, "You have detected a change in your laws information:") - to_chat(target,law) - target.add_ion_law(law) - target.show_laws() - -/datum/gm_action/ionstorm/announce() - if(message_servers) - for (var/obj/machinery/message_server/MS in message_servers) - MS.spamfilter.Cut() - var/i - for (i = 1, i <= MS.spamfilter_limit, i++) - MS.spamfilter += pick("kitty","HONK","rev","malf","liberty","freedom","drugs", "[using_map.station_short]", \ - "admin","ponies","heresy","meow","Pun Pun","monkey","Ian","moron","pizza","message","spam",\ - "director", "Hello", "Hi!"," ","nuke","crate","dwarf","xeno") - -/datum/gm_action/ionstorm/start() - while(active) - sleep(1) - if(botEmagChance) - for(var/mob/living/bot/bot in mob_list) - if(prob(botEmagChance)) - bot.emag_act(1) - -/datum/gm_action/ionstorm/end() - spawn(rand(5000,8000)) - if(prob(50)) - ion_storm_announcement() - -/datum/gm_action/ionstorm/get_weight() - var/bots = metric.count_people_in_department(DEPARTMENT_SYNTHETIC) - var/weight = 5 + (bots * 20) - return weight diff --git a/code/modules/gamemaster/actions/manifest_malfunction.dm b/code/modules/gamemaster/actions/manifest_malfunction.dm deleted file mode 100644 index 2b924a4157..0000000000 --- a/code/modules/gamemaster/actions/manifest_malfunction.dm +++ /dev/null @@ -1,52 +0,0 @@ -/datum/gm_action/manifest_malfunction - name = "manifest malfunction" - enabled = TRUE - departments = list(DEPARTMENT_SECURITY, DEPARTMENT_SYNTHETIC, DEPARTMENT_EVERYONE) - chaotic = 3 - reusable = FALSE - length = 0 - - var/recordtype - -/datum/gm_action/manifest_malfunction/set_up() - severity = pickweight(EVENT_LEVEL_MUNDANE = 6, - EVENT_LEVEL_MODERATE = 2, - EVENT_LEVEL_MAJOR = 1 - ) - - recordtype = pickweight("medical" = 10,"security" = (severity * 15)) - - return - -/datum/gm_action/manifest_malfunction/get_weight() - . = -10 - - var/security = metric.count_people_in_department(DEPARTMENT_SECURITY) - - if(security && data_core) - . += (metric.count_people_in_department(DEPARTMENT_EVERYONE) * 5) - (metric.count_people_in_department(DEPARTMENT_SYNTHETIC) * 5) - - return . - -/datum/gm_action/manifest_malfunction/start() - ..() - - var/manifest_cut_count = 1 * severity - - for(var/I = 1 to manifest_cut_count) - var/datum/data/record/R - - switch(recordtype) - if("security") - R = pick(data_core.security) - - if("medical") - R = pick(data_core.medical) - - qdel(R) - -/datum/gm_action/manifest_malfunction/announce() - if(prob(30 * severity)) - spawn(rand(5 MINUTES, 10 MINUTES)) - command_announcement.Announce("An ongoing mass upload of malware for [recordtype] record cores has been detected onboard [station_name()]", "Data Breach Alert") - return diff --git a/code/modules/gamemaster/actions/meteor_defense.dm b/code/modules/gamemaster/actions/meteor_defense.dm deleted file mode 100644 index dc92413a82..0000000000 --- a/code/modules/gamemaster/actions/meteor_defense.dm +++ /dev/null @@ -1,71 +0,0 @@ -// This event gives the station an advance warning about meteors, so that they can prepare in various ways. - -/datum/gm_action/meteor_defense - name = "meteor defense" - departments = list(DEPARTMENT_ENGINEERING, DEPARTMENT_CARGO) - chaotic = 50 - var/direction = null - var/dir_text = null - var/waves = 0 - - var/meteor_types - -/datum/gm_action/meteor_defense/get_weight() - var/engineers = metric.count_people_in_department(DEPARTMENT_ENGINEERING) - var/cargo = metric.count_people_in_department(DEPARTMENT_CARGO) - var/bots = metric.count_people_in_department(DEPARTMENT_SYNTHETIC) - var/weight = (max(engineers - 1, 0) * 20) // If only one engineer exists, no meteors for now. - - if(engineers >= 2) - weight += ((cargo - 1) * 10) - weight += (bots * 15) - - return weight - -/datum/gm_action/meteor_defense/set_up() - severity = pickweight(EVENT_LEVEL_MUNDANE = 10, - EVENT_LEVEL_MODERATE = 3 - ) - - switch(severity) - if(EVENT_LEVEL_MUNDANE) - meteor_types = meteors_threatening.Copy() - - if(EVENT_LEVEL_MODERATE) - meteor_types = meteors_catastrophic.Copy() - - direction = pick(cardinal) // alldirs doesn't work with current meteor code unfortunately. - waves = rand(5, 8) - switch(direction) - if(NORTH) - dir_text = "aft" // For some reason this is needed. - if(SOUTH) - dir_text = "fore" - if(EAST) - dir_text = "port" - if(WEST) - dir_text = "starboard" - -/datum/gm_action/meteor_defense/announce() - var/announcement = "Alert! Two asteroids have collided near [station_name()]. Chunks of it are expected to approach from the [dir_text] side. ETA to arrival is \ - approximately [round(5 * severity * 2)] minutes." - command_announcement.Announce(announcement, "Meteor Alert", new_sound = 'sound/AI/meteors.ogg') - -/datum/gm_action/meteor_defense/start() - ..() - spawn(0) - sleep(round(5 * severity) MINUTES) - var/announcement = "The incoming debris are expected to approach from the [dir_text] side. ETA to arrival is approximately [round(5 * severity)] minutes." - command_announcement.Announce(announcement, "Meteor Alert - Update") - sleep(round(5 * severity) MINUTES) - announcement = "Incoming debris approaches from the [dir_text] side!" - command_announcement.Announce(announcement, "Meteor Alert - Update") - while(waves) - message_admins("[waves] more wave\s of meteors remain.") - spawn(1) // Dir is reversed because the direction describes where meteors are going, not what side it's gonna hit. - spawn_meteors(rand(8, 12), meteors_threatening, reverse_dir[direction]) - waves-- - sleep(30 SECONDS) - announcement = "The station has cleared the incoming debris." - command_announcement.Announce(announcement, "Meteor Alert - Update") - message_admins("Meteor defense event has ended.") diff --git a/code/modules/gamemaster/actions/money_hacker.dm b/code/modules/gamemaster/actions/money_hacker.dm deleted file mode 100644 index 2705de450c..0000000000 --- a/code/modules/gamemaster/actions/money_hacker.dm +++ /dev/null @@ -1,79 +0,0 @@ -/var/global/account_hack_attempted = 0 - -/datum/gm_action/money_hacker - name = "bank account hacker" - departments = list(DEPARTMENT_EVERYONE) - reusable = TRUE - var/datum/money_account/affected_account - var/active - var/activeFor - var/end_time - -/datum/gm_action/money_hacker/set_up() - active = TRUE - end_time = world.time + 6000 - if(all_money_accounts.len) - affected_account = pick(all_money_accounts) - - account_hack_attempted = 1 - -/datum/gm_action/money_hacker/announce() - var/message = "A brute force hack has been detected (in progress since [stationtime2text()]). The target of the attack is: Financial account #[affected_account.account_number], \ - without intervention this attack will succeed in approximately 10 minutes. Required intervention: temporary suspension of affected accounts until the attack has ceased. \ - Notifications will be sent as updates occur.
" - var/my_department = "[station_name()] firewall subroutines" - - for(var/obj/machinery/message_server/MS in machines) - if(!MS.active) continue - MS.send_rc_message("Head of Personnel's Desk", my_department, message, "", "", 2) - - -/datum/gm_action/money_hacker/start() - ..() - spawn(0) - while(active) - sleep(1) - activeFor++ - if(world.time >= end_time) - length = activeFor - else - length = activeFor + 10 - -/datum/gm_action/money_hacker/end() - active = FALSE - var/message - if(affected_account && !affected_account.suspended) - //hacker wins - message = "The hack attempt has succeeded." - - //subtract the money - var/lost = affected_account.money * 0.8 + (rand(2,4) - 2) / 10 - affected_account.money -= lost - - //create a taunting log entry - var/datum/transaction/T = new() - T.target_name = pick("","yo brotha from anotha motha","el Presidente","chieF smackDowN","Nobody") - T.purpose = pick("Ne$ ---ount fu%ds init*&lisat@*n","PAY BACK YOUR MUM","Funds withdrawal","pWnAgE","l33t hax","liberationez","Hit","Nothing") - T.amount = pick("","([rand(0,99999)])","alla money","9001$","HOLLA HOLLA GET DOLLA","([lost])") - var/date1 = "31 December, 1999" - var/date2 = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], [rand(1000,3000)]" - T.date = pick("", current_date_string, date1, date2,"Nowhen") - var/time1 = rand(0, 99999999) - var/time2 = "[round(time1 / 36000)+12]:[(time1 / 600 % 60) < 10 ? add_zero(time1 / 600 % 60, 1) : time1 / 600 % 60]" - T.time = pick("", stationtime2text(), time2, "Never") - T.source_terminal = pick("","[pick("Biesel","New Gibson")] GalaxyNet Terminal #[rand(111,999)]","your mums place","nantrasen high CommanD","Angessa's Pearl","Nowhere") - - affected_account.transaction_log.Add(T) - - else - //crew wins - message = "The attack has ceased, the affected accounts can now be brought online." - - var/my_department = "[station_name()] firewall subroutines" - - for(var/obj/machinery/message_server/MS in machines) - if(!MS.active) continue - MS.send_rc_message("Head of Personnel's Desk", my_department, message, "", "", 2) - -/datum/gm_action/money_hacker/get_weight() - return 30 * all_money_accounts.len diff --git a/code/modules/gamemaster/actions/money_lotto.dm b/code/modules/gamemaster/actions/money_lotto.dm deleted file mode 100644 index ea82510e57..0000000000 --- a/code/modules/gamemaster/actions/money_lotto.dm +++ /dev/null @@ -1,39 +0,0 @@ -/datum/gm_action/money_lotto - name = "lottery win" - departments = list(DEPARTMENT_EVERYONE) - var/winner_name = "John Smith" - var/winner_sum = 0 - var/deposit_success = 0 - -/datum/gm_action/money_lotto/start() - ..() - winner_sum = pick(5000, 10000, 50000, 100000, 500000, 1000000, 1500000) - if(all_money_accounts.len) - var/datum/money_account/D = pick(all_money_accounts) - winner_name = D.owner_name - if(!D.suspended) - D.money += winner_sum - - var/datum/transaction/T = new() - T.target_name = "The [using_map.starsys_name] Times Grand Slam -Stellar- Lottery" - T.purpose = "Winner!" - T.amount = winner_sum - T.date = current_date_string - T.time = stationtime2text() - T.source_terminal = "Sif TCD Terminal #[rand(111,333)]" - D.transaction_log.Add(T) - - deposit_success = 1 - -/datum/gm_action/money_lotto/announce() - var/author = "[using_map.company_name] Editor" - var/channel = "The [using_map.starsys_name] Times" - - var/body = "The [using_map.starsys_name] Times wishes to congratulate [winner_name] for recieving the [using_map.starsys_name] Stellar Slam Lottery, and receiving the out of this world sum of [winner_sum] credits!" - if(!deposit_success) - body += "
Unfortunately, we were unable to verify the account details provided, so we were unable to transfer the money. Send a cheque containing the sum of 5000 Thalers to ND 'Stellar Slam' office on the The [using_map.starsys_name] Times gateway containing updated details, and your winnings'll be re-sent within the month." - - news_network.SubmitArticle(body, author, channel, null, 1) - -/datum/gm_action/money_lotto/get_weight() - return 25 * metric.count_people_in_department(DEPARTMENT_EVERYONE) diff --git a/code/modules/gamemaster/actions/money_spam.dm b/code/modules/gamemaster/actions/money_spam.dm deleted file mode 100644 index d770837b3c..0000000000 --- a/code/modules/gamemaster/actions/money_spam.dm +++ /dev/null @@ -1,129 +0,0 @@ -/datum/gm_action/pda_spam - name = "PDA spam" - departments = list(DEPARTMENT_EVERYONE) - reusable = TRUE - var/last_spam_time = 0 - var/obj/machinery/message_server/useMS - var/obj/machinery/exonet_node/node - -/datum/gm_action/pda_spam/set_up() - last_spam_time = world.time - pick_message_server() - -/datum/gm_action/pda_spam/proc/pick_message_server() - if(message_servers) - for (var/obj/machinery/message_server/MS in message_servers) - if(MS.active) - useMS = MS - break - -/datum/gm_action/pda_spam/start() - ..() - while(world.time < last_spam_time + 3000) - if(!node) - node = get_exonet_node() - - if(!node || !node.on || !node.allow_external_PDAs) - return - - if(!useMS || !useMS.active) - useMS = null - pick_message_server() - - if(useMS) - if(prob(5)) - // /obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "") - var/obj/item/device/pda/P - var/list/viables = list() - for(var/obj/item/device/pda/check_pda in sortAtom(PDAs)) - if (!check_pda.owner||check_pda.toff||check_pda == src||check_pda.hidden) - continue - viables.Add(check_pda) - - if(!viables.len) - return - P = pick(viables) - - var/sender - var/message - switch(pick(1,2,3,4,5,6,7)) - if(1) - sender = pick("MaxBet","MaxBet Online Casino","There is no better time to register","I'm excited for you to join us") - message = pick("Triple deposits are waiting for you at MaxBet Online when you register to play with us.",\ - "You can qualify for a 200% Welcome Bonus at MaxBet Online when you sign up today.",\ - "Once you are a player with MaxBet, you will also receive lucrative weekly and monthly promotions.",\ - "You will be able to enjoy over 450 top-flight casino games at MaxBet.") - if(2) - sender = pick(300;"QuickDatingSystem",200;"Find your russian bride",50;"Tajaran beauties are waiting",50;"Find your secret skrell crush",50;"Beautiful unathi brides") - message = pick("Your profile caught my attention and I wanted to write and say hello (QuickDating).",\ - "If you will write to me on my email [pick(first_names_female)]@[pick(last_names)].[pick("ru","ck","tj","ur","nt")] I shall necessarily send you a photo (QuickDating).",\ - "I want that we write each other and I hope, that you will like my profile and you will answer me (QuickDating).",\ - "You have (1) new message!",\ - "You have (2) new profile views!") - if(3) - sender = pick("Galactic Payments Association","Better Business Bureau","[using_map.starsys_name] E-Payments","NAnoTransen Finance Deparmtent","Luxury Replicas") - message = pick("Luxury watches for Blowout sale prices!",\ - "Watches, Jewelry & Accessories, Bags & Wallets !",\ - "Deposit 100$ and get 300$ totally free!",\ - " 100K NT.|WOWGOLD õnly $89 ",\ - "We have been filed with a complaint from one of your customers in respect of their business relations with you.",\ - "We kindly ask you to open the COMPLAINT REPORT (attached) to reply on this complaint..") - if(4) - sender = pick("Buy Dr. Maxman","Having dysfuctional troubles?") - message = pick("DR MAXMAN: REAL Doctors, REAL Science, REAL Results!",\ - "Dr. Maxman was created by George Acuilar, M.D, a [using_map.boss_short] Certified Urologist who has treated over 70,000 patients sector wide with 'male problems'.",\ - "After seven years of research, Dr Acuilar and his team came up with this simple breakthrough male enhancement formula.",\ - "Men of all species report AMAZING increases in length, width and stamina.") - if(5) - sender = pick("Dr","Crown prince","King Regent","Professor","Captain") - sender += " " + pick("Robert","Alfred","Josephat","Kingsley","Sehi","Zbahi") - sender += " " + pick("Mugawe","Nkem","Gbatokwia","Nchekwube","Ndim","Ndubisi") - message = pick("YOUR FUND HAS BEEN MOVED TO [pick("Salusa","Segunda","Cepheus","Andromeda","Gruis","Corona","Aquila","ARES","Asellus")] DEVELOPMENTARY BANK FOR ONWARD REMITTANCE.",\ - "We are happy to inform you that due to the delay, we have been instructed to IMMEDIATELY deposit all funds into your account",\ - "Dear fund beneficiary, We have please to inform you that overdue funds payment has finally been approved and released for payment",\ - "Due to my lack of agents I require an off-world financial account to immediately deposit the sum of 1 POINT FIVE MILLION credits.",\ - "Greetings sir, I regretfully to inform you that as I lay dying here due to my lack ofheirs I have chosen you to recieve the full sum of my lifetime savings of 1.5 billion credits") - if(6) - sender = pick("[using_map.company_name] Morale Divison","Feeling Lonely?","Bored?","www.wetskrell.nt") - message = pick("The [using_map.company_name] Morale Division wishes to provide you with quality entertainment sites.",\ - "WetSkrell.nt is a xenophillic website endorsed by NT for the use of male crewmembers among it's many stations and outposts.",\ - "Wetskrell.nt only provides the higest quality of male entertaiment to [using_map.company_name] Employees.",\ - "Simply enter your [using_map.company_name] Bank account system number and pin. With three easy steps this service could be yours!") - if(7) - sender = pick("You have won free tickets!","Click here to claim your prize!","You are the 1000th vistor!","You are our lucky grand prize winner!") - message = pick("You have won tickets to the newest ACTION JAXSON MOVIE!",\ - "You have won tickets to the newest crime drama DETECTIVE MYSTERY IN THE CLAMITY CAPER!",\ - "You have won tickets to the newest romantic comedy 16 RULES OF LOVE!",\ - "You have won tickets to the newest thriller THE CULT OF THE SLEEPING ONE!") - - if (useMS.send_pda_message("[P.owner]", sender, message)) //Message been filtered by spam filter. - return - - last_spam_time = world.time - - if (prob(50)) //Give the AI an increased chance to intercept the message - for(var/mob/living/silicon/ai/ai in mob_list) - // Allows other AIs to intercept the message but the AI won't intercept their own message. - if(ai.aiPDA != P && ai.aiPDA != src) - ai.show_message("Intercepted message from [sender] (Unknown / spam?) to [P:owner]: [message]") - - //Commented out because we don't send messages like this anymore. Instead it will just popup in their chat window. - //P.tnote += "← From [sender] (Unknown / spam?):
[message]
" - - if (!P.message_silent) - playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1) - for (var/mob/O in hearers(3, P.loc)) - if(!P.message_silent) O.show_message(text("\icon[P] *[P.ttone]*")) - //Search for holder of the PDA. - var/mob/living/L = null - if(P.loc && isliving(P.loc)) - L = P.loc - //Maybe they are a pAI! - else - L = get(P, /mob/living/silicon) - - if(L) - to_chat(L, "\icon[P] Message from [sender] (Unknown / spam?), \"[message]\" (Unable to Reply)") - -/datum/gm_action/pda_spam/get_weight() - return 25 * metric.count_people_in_department(DEPARTMENT_EVERYONE) diff --git a/code/modules/gamemaster/actions/planet_weather_change.dm b/code/modules/gamemaster/actions/planet_weather_change.dm deleted file mode 100644 index 86723d7494..0000000000 --- a/code/modules/gamemaster/actions/planet_weather_change.dm +++ /dev/null @@ -1,33 +0,0 @@ -/datum/gm_action/planet_weather_shift - name = "sudden weather shift" - enabled = TRUE - departments = list(DEPARTMENT_EVERYONE) - reusable = TRUE - var/datum/planet/target_planet - - var/list/banned_weathers = list( - /datum/weather/sif/ash_storm, - /datum/weather/sif/emberfall, - /datum/weather/sif/blood_moon, - /datum/weather/sif/fallout) - var/list/possible_weathers = list() - -/datum/gm_action/planet_weather_shift/set_up() - if(!target_planet || isnull(target_planet)) - target_planet = pick(SSplanets.planets) - possible_weathers |= target_planet.weather_holder.allowed_weather_types - possible_weathers -= banned_weathers - return - -/datum/gm_action/planet_weather_shift/get_weight() - return max(0, -15 + (metric.count_all_outdoor_mobs() * 20)) - -/datum/gm_action/planet_weather_shift/start() - ..() - var/new_weather = pick(possible_weathers) - target_planet.weather_holder.change_weather(new_weather) - -/datum/gm_action/planet_weather_shift/announce() - spawn(rand(3 SECONDS, 2 MINUTES)) - command_announcement.Announce("Local weather patterns on [target_planet.name] suggest that a sudden atmospheric fluctuation has occurred. All groundside personnel should be wary of rapidly deteriorating conditions.", "Weather Alert") - return diff --git a/code/modules/gamemaster/actions/prison_break.dm b/code/modules/gamemaster/actions/prison_break.dm deleted file mode 100644 index 0111ea0ecd..0000000000 --- a/code/modules/gamemaster/actions/prison_break.dm +++ /dev/null @@ -1,93 +0,0 @@ -/datum/gm_action/prison_break - name = "prison break" - departments = list(DEPARTMENT_SECURITY, DEPARTMENT_SYNTHETIC) - - var/start_time = 0 - var/active = FALSE // Are we doing stuff? - var/releaseWhen = 60 // The delay for the breakout to occur. - var/list/area/areas = list() // List of areas to affect. Filled by start() - - var/eventDept = "Security" // Department name in announcement - var/list/areaName = list("Brig") // Names of areas mentioned in AI and Engineering announcements - var/list/areaType = list(/area/security/prison, /area/security/brig) // Area types to include. - var/list/areaNotType = list() // Area types to specifically exclude. - -/datum/gm_action/prison_break/get_weight() - var/afflicted_staff = 0 - var/assigned_staff = metric.count_people_in_department(DEPARTMENT_ENGINEERING) - for(var/department in departments) - afflicted_staff += round(metric.count_people_in_department(department) / 2) - - var/weight = 20 + (assigned_staff * 10) - - if(assigned_staff) - weight += afflicted_staff - - return weight - -/datum/gm_action/prison_break/virology - name = "virology breakout" - departments = list(DEPARTMENT_MEDICAL, DEPARTMENT_SYNTHETIC) - eventDept = "Medical" - areaName = list("Virology") - areaType = list(/area/medical/virology, /area/medical/virologyaccess) - -/datum/gm_action/prison_break/xenobiology - name = "xenobiology breakout" - departments = list(DEPARTMENT_RESEARCH, DEPARTMENT_SYNTHETIC) - eventDept = "Science" - areaName = list("Xenobiology") - areaType = list(/area/rnd/xenobiology) - areaNotType = list(/area/rnd/xenobiology/xenoflora, /area/rnd/xenobiology/xenoflora_storage) - -/datum/gm_action/prison_break/station - name = "station-wide breakout" - departments = list(DEPARTMENT_SECURITY, DEPARTMENT_MEDICAL, DEPARTMENT_RESEARCH, DEPARTMENT_SYNTHETIC) - eventDept = "Station" - areaName = list("Brig","Virology","Xenobiology") - areaType = list(/area/security/prison, /area/security/brig, /area/medical/virology, /area/medical/virologyaccess, /area/rnd/xenobiology) - areaNotType = list(/area/rnd/xenobiology/xenoflora, /area/rnd/xenobiology/xenoflora_storage) - -/datum/gm_action/prison_break/set_up() - releaseWhen = rand(60, 90) - start_time = world.time - active = TRUE - length = releaseWhen + 1 SECOND - -/datum/gm_action/prison_break/announce() - if(areas && areas.len > 0) - command_announcement.Announce("[pick("Gr3y.T1d3 virus","Malignant trojan")] detected in [station_name()] [(eventDept == "Security")? "imprisonment":"containment"] subroutines. Secure any compromised areas immediately. Station AI involvement is recommended.", "[eventDept] Alert") - -/datum/gm_action/prison_break/start() - ..() - for(var/area/A in all_areas) - if(is_type_in_list(A,areaType) && !is_type_in_list(A,areaNotType)) - areas += A - - if(areas && areas.len > 0) - var/my_department = "[station_name()] firewall subroutines" - var/rc_message = "An unknown malicious program has been detected in the [english_list(areaName)] lighting and airlock control systems at [stationtime2text()]. Systems will be fully compromised within approximately three minutes. Direct intervention is required immediately.
" - for(var/obj/machinery/message_server/MS in machines) - MS.send_rc_message("Engineering", my_department, rc_message, "", "", 2) - for(var/mob/living/silicon/ai/A in player_list) - to_chat(A, "Malicious program detected in the [english_list(areaName)] lighting and airlock control systems by [my_department].") - - else - to_world_log("ERROR: Could not initate grey-tide. Unable to find suitable containment area.") - - if(areas && areas.len > 0) - spawn() - while(active) - sleep(1) - if(world.time >= releaseWhen + start_time) - var/obj/machinery/power/apc/theAPC = null - for(var/area/A in areas) - theAPC = A.get_apc() - if(theAPC.operating) //If the apc's off, it's a little hard to overload the lights. - for(var/obj/machinery/light/L in A) - L.flicker(10) - -/datum/gm_action/prison_break/end() - active = FALSE - for(var/area/A in shuffle(areas)) - A.prison_break() diff --git a/code/modules/gamemaster/actions/radiation_storm.dm b/code/modules/gamemaster/actions/radiation_storm.dm deleted file mode 100644 index e6a31a6da8..0000000000 --- a/code/modules/gamemaster/actions/radiation_storm.dm +++ /dev/null @@ -1,67 +0,0 @@ -/datum/gm_action/radiation_storm - name = "radiation storm" - departments = list(DEPARTMENT_EVERYONE) - reusable = TRUE - - var/enterBelt = 30 - var/radIntervall = 5 - var/leaveBelt = 80 - var/revokeAccess = 165 - var/activeFor = 0 - var/postStartTicks = 0 - var/active = FALSE - -/datum/gm_action/radiation_storm/announce() - command_announcement.Announce("High levels of radiation detected near \the [station_name()]. Please evacuate into one of the shielded maintenance tunnels.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg') - -/datum/gm_action/radiation_storm/set_up() - active = TRUE - -/datum/gm_action/radiation_storm/start() - ..() - make_maint_all_access() - - while(active) - sleep(1 SECOND) - activeFor ++ - if(activeFor == enterBelt) - command_announcement.Announce("The station has entered the radiation belt. Please remain in a sheltered area until we have passed the radiation belt.", "Anomaly Alert") - radiate() - - if(activeFor >= enterBelt && activeFor <= leaveBelt) - postStartTicks++ - - if(postStartTicks == radIntervall) - postStartTicks = 0 - radiate() - - else if(activeFor == leaveBelt) - command_announcement.Announce("The station has passed the radiation belt. Please allow for up to one minute while radiation levels dissipate, and report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert") - -/datum/gm_action/radiation_storm/proc/radiate() - var/radiation_level = rand(15, 35) - for(var/z in using_map.station_levels) - SSradiation.z_radiate(locate(1, 1, z), radiation_level, 1) - - for(var/mob/living/carbon/C in living_mob_list) - var/area/A = get_area(C) - if(!A) - continue - if(A.flags & RAD_SHIELDED) - continue - if(istype(C,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = C - if(prob(5)) - if (prob(75)) - randmutb(H) // Applies bad mutation - domutcheck(H,null,MUTCHK_FORCED) - else - randmutg(H) // Applies good mutation - domutcheck(H,null,MUTCHK_FORCED) - -/datum/gm_action/radiation_storm/end() - spawn(revokeAccess SECONDS) - revoke_maint_all_access() - -/datum/gm_action/radiation_storm/get_weight() - return 20 + (metric.count_people_in_department(DEPARTMENT_MEDICAL) * 10) + (metric.count_all_space_mobs() * 40) + (metric.count_people_in_department(DEPARTMENT_EVERYONE) * 20) diff --git a/code/modules/gamemaster/actions/random_antagonist.dm b/code/modules/gamemaster/actions/random_antagonist.dm deleted file mode 100644 index bf1169bb73..0000000000 --- a/code/modules/gamemaster/actions/random_antagonist.dm +++ /dev/null @@ -1,23 +0,0 @@ -// The random spawn proc on the antag datum will handle announcing the spawn and whatnot. -/datum/gm_action/random_antag - name = "random antagonist" - departments = list(DEPARTMENT_EVERYONE) - chaotic = 30 - reusable = TRUE - -/datum/gm_action/random_antag/start() - ..() - var/list/valid_types = list() - for(var/antag_type in all_antag_types) - var/datum/antagonist/antag = all_antag_types[antag_type] - if(antag.flags & ANTAG_RANDSPAWN) - valid_types |= antag - if(valid_types.len) - var/datum/antagonist/antag = pick(valid_types) - antag.attempt_random_spawn() - -/datum/gm_action/random_antag/get_weight() - . = ..() - if(gm) - var/weight = max(0, (metric.count_people_in_department(DEPARTMENT_SECURITY) * 20) + (metric.count_people_in_department(DEPARTMENT_EVERYONE) * 5) + gm.staleness) - return weight diff --git a/code/modules/gamemaster/actions/rogue_drones.dm b/code/modules/gamemaster/actions/rogue_drones.dm deleted file mode 100644 index a1594fd370..0000000000 --- a/code/modules/gamemaster/actions/rogue_drones.dm +++ /dev/null @@ -1,63 +0,0 @@ -/datum/gm_action/rogue_drone - name = "rogue drones" - departments = list(DEPARTMENT_SECURITY) - chaotic = 60 - length = 20 MINUTES - var/list/drones_list = list() - -/datum/gm_action/rogue_drone/start() - ..() - //spawn them at the same place as carp - var/list/possible_spawns = list() - for(var/obj/effect/landmark/C in landmarks_list) - if(C.name == "carpspawn") - possible_spawns.Add(C) - - //25% chance for this to be a false alarm - var/num - if(prob(25)) - num = 0 - else - num = rand(2,6) - for(var/i=0, i drones_list.len * 0.75) - command_announcement.Announce("The drones that were malfunctioning have been recovered safely.", "Rogue drone alert") - else - command_announcement.Announce("We're disappointed at the loss of the drones, but the survivors have been recovered.", "Rogue drone alert") - -/datum/gm_action/rogue_drone/get_weight() - return 20 + (metric.count_people_in_department(DEPARTMENT_SECURITY) * 10) + (metric.count_all_space_mobs() * 30) diff --git a/code/modules/gamemaster/actions/security_advisement.dm b/code/modules/gamemaster/actions/security_advisement.dm deleted file mode 100644 index e98504df09..0000000000 --- a/code/modules/gamemaster/actions/security_advisement.dm +++ /dev/null @@ -1,49 +0,0 @@ -/datum/gm_action/security_screening - name = "security screening" - departments = list(DEPARTMENT_SECURITY, DEPARTMENT_EVERYONE) - - var/list/species_weights = list( - SPECIES_SKRELL = 9, - SPECIES_UNATHI = 15, - SPECIES_HUMAN_VATBORN = 6, - SPECIES_TESHARI = 2, - SPECIES_TAJ = 3, - SPECIES_DIONA = 1, - SPECIES_ZADDAT = 25, - SPECIES_HUMAN = 3, - SPECIES_PROMETHEAN = 30 - ) - - var/list/synth_weights = list( - "Cybernetic" = 15, - "Drone" = 30, - "Positronic" = 25 - ) - - var/list/end_weights = list() - -/datum/gm_action/security_screening/set_up() - for(var/species_name in species_weights) - var/giveweight = 0 - - for(var/datum/data/record/R in data_core.general) - if(R.fields["species"] == species_name) - giveweight += species_weights[species_name] - - end_weights[species_name] = giveweight - - for(var/bottype in synth_weights) - var/giveweight = 0 - - for(var/datum/data/record/R in data_core.general) - if(R.fields["brain_type"] == bottype) - giveweight += synth_weights[bottype] - - end_weights[bottype] = giveweight - -/datum/gm_action/security_screening/announce() - spawn(rand(1 MINUTE, 2 MINUTES)) - command_announcement.Announce("[pick("A nearby Navy vessel", "A Solar official", "A Vir-Gov official", "A NanoTrasen board director")] has requested the screening of [pick("every other", "every", "suspicious", "willing")] [pickweight(end_weights)] personnel onboard \the [station_name()].", "Security Advisement") - -/datum/gm_action/security_screening/get_weight() - return max(-20, 10 + round(gm.staleness * 1.5) - (gm.danger * 2)) + (metric.count_people_in_department(DEPARTMENT_SECURITY) * 10) + (metric.count_people_in_department(DEPARTMENT_EVERYONE) * 1.5) diff --git a/code/modules/gamemaster/actions/shipping_error.dm b/code/modules/gamemaster/actions/shipping_error.dm deleted file mode 100644 index da9179cc96..0000000000 --- a/code/modules/gamemaster/actions/shipping_error.dm +++ /dev/null @@ -1,17 +0,0 @@ -/datum/gm_action/shipping_error - name = "shipping error" - departments = list(DEPARTMENT_CARGO) - reusable = TRUE - -/datum/gm_action/shipping_error/get_weight() - var/cargo = metric.count_people_in_department(DEPARTMENT_CARGO) - var/weight = (cargo * 40) - return weight - -/datum/gm_action/shipping_error/start() - ..() - var/datum/supply_order/O = new /datum/supply_order() - O.ordernum = supply_controller.ordernum - O.object = supply_controller.supply_pack[pick(supply_controller.supply_pack)] - O.ordered_by = random_name(pick(MALE,FEMALE), species = "Human") - supply_controller.shoppinglist += O \ No newline at end of file diff --git a/code/modules/gamemaster/actions/solar_storm.dm b/code/modules/gamemaster/actions/solar_storm.dm deleted file mode 100644 index f468c024a9..0000000000 --- a/code/modules/gamemaster/actions/solar_storm.dm +++ /dev/null @@ -1,56 +0,0 @@ -/datum/gm_action/solar_storm - name = "solar storm" - var/rad_interval = 1 SECOND - var/base_solar_gen_rate - length = 3 MINUTES - var/duration // Duration for the storm - var/start_time = 0 - - reusable = TRUE - -/datum/gm_action/solar_storm/set_up() - start_time = world.time - duration = length - duration += rand(-1 * 1 MINUTE, 1 MINUTE) - -/datum/gm_action/solar_storm/announce() - command_announcement.Announce("A solar storm has been detected approaching \the [station_name()]. Please halt all EVA activites immediately and return to the interior of the station.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg') - adjust_solar_output(1.5) - -/datum/gm_action/solar_storm/proc/adjust_solar_output(var/mult = 1) - if(isnull(base_solar_gen_rate)) base_solar_gen_rate = GLOB.solar_gen_rate - GLOB.solar_gen_rate = mult * base_solar_gen_rate - -/datum/gm_action/solar_storm/start() - ..() - length = duration - command_announcement.Announce("The solar storm has reached the station. Please refain from EVA and remain inside the station until it has passed.", "Anomaly Alert") - adjust_solar_output(5) - - var/start_time = world.time - - spawn() - while(world.time <= start_time + duration) - sleep(rad_interval) - radiate() - -/datum/gm_action/solar_storm/get_weight() - return 20 + (metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 10) + (metric.count_all_space_mobs() * 30) - -/datum/gm_action/solar_storm/proc/radiate() - // Note: Too complicated to be worth trying to use the radiation system for this. Its only in space anyway, so we make an exception in this case. - for(var/mob/living/L in player_list) - var/turf/T = get_turf(L) - if(!T) - continue - - if(!istype(T.loc,/area/space) && !istype(T,/turf/space)) //Make sure you're in a space area or on a space turf - continue - - //Todo: Apply some burn damage from the heat of the sun. Until then, enjoy some moderate radiation. - L.rad_act(rand(15, 30)) - -/datum/gm_action/solar_storm/end() - command_announcement.Announce("The solar storm has passed the station. It is now safe to resume EVA activities. Please report to medbay if you experience any unusual symptoms. ", "Anomaly Alert") - adjust_solar_output() - length = initial(length) diff --git a/code/modules/gamemaster/actions/spacevine.dm b/code/modules/gamemaster/actions/spacevine.dm deleted file mode 100644 index 759329dbbc..0000000000 --- a/code/modules/gamemaster/actions/spacevine.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/gm_action/spacevine - name = "space-vine infestation" - departments = list(DEPARTMENT_ENGINEERING) - chaotic = 2 - -/datum/gm_action/spacevine/start() - ..() - spacevine_infestation() - -/datum/gm_action/spacevine/announce() - level_seven_announcement() - -/datum/gm_action/spacevine/get_weight() - return 20 + (metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 20) + (metric.count_people_in_department(DEPARTMENT_EVERYONE) * 10) diff --git a/code/modules/gamemaster/actions/spider_infestation.dm b/code/modules/gamemaster/actions/spider_infestation.dm deleted file mode 100644 index 4105a8e1d4..0000000000 --- a/code/modules/gamemaster/actions/spider_infestation.dm +++ /dev/null @@ -1,56 +0,0 @@ -/datum/gm_action/spider_infestation - name = "spider infestation" - departments = list(DEPARTMENT_SECURITY, DEPARTMENT_MEDICAL, DEPARTMENT_EVERYONE) - chaotic = 30 - - severity = 1 - - var/spawncount = 1 - - var/spawntype = /obj/effect/spider/spiderling - -/datum/gm_action/spider_infestation/set_up() - severity = pickweight(EVENT_LEVEL_MUNDANE = max(1,(12 - (3 * metric.count_people_in_department(DEPARTMENT_SECURITY)))), - EVENT_LEVEL_MODERATE = (7 + (2 * metric.count_people_in_department(DEPARTMENT_SECURITY))), - EVENT_LEVEL_MAJOR = (1 + (2 * metric.count_people_in_department(DEPARTMENT_SECURITY))) - ) - - switch(severity) - if(EVENT_LEVEL_MUNDANE) - spawntype = /obj/effect/spider/spiderling/stunted - if(EVENT_LEVEL_MODERATE) - spawntype = /obj/effect/spider/spiderling - if(EVENT_LEVEL_MAJOR) - spawntype = /obj/effect/spider/spiderling - - spawncount = rand(4 * severity, 6 * severity) - -/datum/gm_action/spider_infestation/announce() - command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg') - - if(severity >= EVENT_LEVEL_MAJOR) - spawn(rand(600, 3000)) - command_announcement.Announce("Unidentified lifesigns previously detected coming aboard [station_name()] have been classified as a swarm of arachnids. Extreme caution is advised.", "Arachnid Alert") - -/datum/gm_action/spider_infestation/start() - ..() - var/list/vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines) - if(!temp_vent.welded && temp_vent.network && temp_vent.loc.z in using_map.station_levels) - if(temp_vent.network.normal_members.len > 50) - vents += temp_vent - - while((spawncount >= 1) && vents.len) - var/obj/vent = pick(vents) - new /obj/effect/spider/spiderling(vent.loc) - vents -= vent - spawncount-- - -/datum/gm_action/spider_infestation/get_weight() - var/security = metric.count_people_in_department(DEPARTMENT_SECURITY) - var/medical = metric.count_people_in_department(DEPARTMENT_MEDICAL) - var/engineering = metric.count_people_in_department(DEPARTMENT_ENGINEERING) - - var/assigned_staff = security + round(medical / 2) + round(engineering / 2) - - return 10 + (assigned_staff * 15) diff --git a/code/modules/gamemaster/actions/spontaneous_appendicitis.dm b/code/modules/gamemaster/actions/spontaneous_appendicitis.dm deleted file mode 100644 index ef7efde26b..0000000000 --- a/code/modules/gamemaster/actions/spontaneous_appendicitis.dm +++ /dev/null @@ -1,13 +0,0 @@ -/datum/gm_action/spontaneous_appendicitis - name = "appendicitis" - departments = list(DEPARTMENT_MEDICAL, DEPARTMENT_EVERYONE) - chaotic = 1 - -/datum/gm_action/spontaneous_appendicitis/start() - ..() - for(var/mob/living/carbon/human/H in shuffle(living_mob_list)) - if(H.client && !player_is_antag(H.mind) && H.appendicitis()) - break - -/datum/gm_action/spontaneous_appendicitis/get_weight() - return max(0, -5 + (metric.count_people_in_department(DEPARTMENT_MEDICAL) * 10)) diff --git a/code/modules/gamemaster/actions/station_fundraise.dm b/code/modules/gamemaster/actions/station_fundraise.dm deleted file mode 100644 index 96d4299053..0000000000 --- a/code/modules/gamemaster/actions/station_fundraise.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/gm_action/station_fund_raise - name = "local funding drive" - departments = list(DEPARTMENT_SECURITY, DEPARTMENT_CARGO, DEPARTMENT_EVERYONE) - -/datum/gm_action/station_fund_raise/announce() - spawn(rand(1 MINUTE, 2 MINUTES)) - command_announcement.Announce("Due to [pick("recent", "unfortunate", "possible future")] budget [pick("changes", "issues")], in-system stations are now advised to increase funding income.", "Security & Supply Advisement") - -/datum/gm_action/station_fund_raise/get_weight() - var/weight_modifier = 0.5 - if(station_account.money <= 80000) - weight_modifier = 1 - - return (max(-20, 10 + gm.staleness) + ((metric.count_people_in_department(DEPARTMENT_SECURITY) + (metric.count_people_in_department(DEPARTMENT_CARGO))) * 5) + (metric.count_people_in_department(DEPARTMENT_EVERYONE) * 3)) * weight_modifier diff --git a/code/modules/gamemaster/actions/stowaway.dm b/code/modules/gamemaster/actions/stowaway.dm deleted file mode 100644 index b7185e1ed4..0000000000 --- a/code/modules/gamemaster/actions/stowaway.dm +++ /dev/null @@ -1,80 +0,0 @@ -/datum/gm_action/stowaway - name = "stowaway pod" - departments = list(DEPARTMENT_EVERYONE, DEPARTMENT_SECURITY) - chaotic = 10 - observers_used = TRUE - var/area/target_area // Chosen target area - var/area/target_turf // Chosen target turf in target_area - var/list/area/excluded = list( - /area/submap, - /area/shuttle, - /area/crew_quarters, - /area/holodeck, - /area/engineering/engine_room - ) - - var/list/area/included = list( - /area/maintenance - ) - -/datum/gm_action/stowaway/set_up() - severity = pickweight(EVENT_LEVEL_MUNDANE = 20, - EVENT_LEVEL_MODERATE = 5, - EVENT_LEVEL_MAJOR = 1 - ) - - var/list/area/grand_list_of_areas = get_station_areas(excluded) - - for(var/area/Incl in included) - for(var/area/A in grand_list_of_areas) - if(!istype(A, Incl)) - grand_list_of_areas -= A - - // Okay, now lets try and pick a target! Lets try 10 times, otherwise give up - for(var/i in 1 to 10) - var/area/A = pick(grand_list_of_areas) - if(is_area_occupied(A)) - log_debug("[name] event: Rejected [A] because it is occupied.") - continue - // A good area, great! Lets try and pick a turf - var/list/turfs = list() - for(var/turf/simulated/floor/F in A) - if(turf_clear(F)) - turfs += F - if(turfs.len == 0) - log_debug("[name] event: Rejected [A] because it has no clear turfs.") - continue - target_area = A - target_turf = pick(turfs) - - if(!target_area) - log_debug("[name] event: Giving up after too many failures to pick target area") - return - -/datum/gm_action/stowaway/start() - if(!target_turf) - return - ..() - - var/obj/structure/ghost_pod/ghost_activated/human/HP = new (target_turf) - - if(severity == EVENT_LEVEL_MUNDANE || istype(ticker.mode, /datum/game_mode/extended)) - HP.make_antag = MODE_STOWAWAY - - else if(severity == EVENT_LEVEL_MODERATE) - HP.make_antag = MODE_RENEGADE - HP.occupant_type = "renegade [HP.occupant_type]" - - else if(severity == EVENT_LEVEL_MAJOR) - HP.make_antag = MODE_INFILTRATOR - HP.occupant_type = "volatile [HP.occupant_type]" - - say_dead_object("A [HP.occupant_type] pod is now available in \the [target_area].", HP) - -/datum/gm_action/stowaway/get_weight() - return -20 + (metric.count_people_in_department(DEPARTMENT_SECURITY) * 15 + metric.count_people_in_department(DEPARTMENT_SYNTHETIC) * 5 + metric.count_people_in_department(DEPARTMENT_EVERYONE) * 1) - -/datum/gm_action/stowaway/announce() - spawn(rand(15 MINUTES, 30 MINUTES)) - if(prob(20) && severity >= EVENT_LEVEL_MODERATE && atc && !atc.squelched) - atc.msg("Attention civilian vessels in [using_map.starsys_name] shipping lanes, caution is advised as [pick("an unidentified vessel", "a known criminal's vessel", "a derelict vessel")] has been detected passing multiple local stations.") diff --git a/code/modules/gamemaster/actions/supply_conversion.dm b/code/modules/gamemaster/actions/supply_conversion.dm deleted file mode 100644 index dacd548dae..0000000000 --- a/code/modules/gamemaster/actions/supply_conversion.dm +++ /dev/null @@ -1,65 +0,0 @@ -/datum/gm_action/nanotrasen_budget_allocation - name = "supply point to cargo budget" - enabled = TRUE - departments = list(DEPARTMENT_CARGO) - chaotic = 0 - reusable = TRUE - - var/datum/controller/supply/SC - var/running = FALSE - var/last_run - - var/thaler_earned - -/datum/gm_action/nanotrasen_budget_allocation/New() - ..() - SC = supply_controller - -/datum/gm_action/nanotrasen_budget_allocation/set_up() - running = TRUE - return - -/datum/gm_action/nanotrasen_budget_allocation/get_weight() - . = round(SC.points / 15) - - var/cargo = metric.count_people_in_department(DEPARTMENT_CARGO) - var/personnel = metric.count_people_in_department(DEPARTMENT_EVERYONE) - if(cargo) - . = round(SC.points / (10 + personnel)) + cargo * 10 - - if(running || ( world.time < (last_run + 30 MINUTES))) - . = 0 - - return . - -/datum/gm_action/nanotrasen_budget_allocation/start() - . = ..() - - last_run = world.time - - var/point_difference = SC.points - - if(SC.points >= 1000) - SC.points = round(SC.points / 3) - point_difference -= SC.points - - else if(SC.points >= 500) - SC.points -= 100 * (rand(5, 20) / 10) - point_difference -= SC.points - - else - SC.points = round(SC.points / 1.25) - point_difference -= SC.points - - if(point_difference > 0) - thaler_earned = round(point_difference / SC.points_per_money) - -/datum/gm_action/nanotrasen_budget_allocation/end() - spawn(5 MINUTES) - running = FALSE - return - -/datum/gm_action/nanotrasen_budget_allocation/announce() - spawn(rand(1 MINUTE, 5 MINUTES)) - command_announcement.Announce("[station_name()] Supply Department has earned a converted thaler budget of [thaler_earned] due to their backlogged daily requisition tokens.", "Supply Budget Conversion") - return diff --git a/code/modules/gamemaster/actions/supplyrequest.dm b/code/modules/gamemaster/actions/supplyrequest.dm deleted file mode 100644 index 0ba9366542..0000000000 --- a/code/modules/gamemaster/actions/supplyrequest.dm +++ /dev/null @@ -1,11 +0,0 @@ -/datum/gm_action/request - name = "general request" - departments = list(DEPARTMENT_CARGO) - -/datum/gm_action/request/announce() - spawn(rand(1 MINUTE, 2 MINUTES)) - command_announcement.Announce("[pick("A nearby vessel", "A Solar contractor", "A Skrellian contractor", "A NanoTrasen board director")] has requested the delivery of [pick("one","two","three","several")] [pick("medical","engineering","research","civilian")] supply packages. The [station_name()] has been tasked with completing this request.", "Supply Request") - -/datum/gm_action/request/get_weight() - return max(15, 15 + round(gm.staleness / 2) - gm.danger) + (metric.count_people_in_department(DEPARTMENT_CARGO) * 10) - diff --git a/code/modules/gamemaster/actions/surprise_carp_attack.dm b/code/modules/gamemaster/actions/surprise_carp_attack.dm deleted file mode 100644 index eb7b61841c..0000000000 --- a/code/modules/gamemaster/actions/surprise_carp_attack.dm +++ /dev/null @@ -1,45 +0,0 @@ -// This event sends a few carp after someone in space. - -/datum/gm_action/surprise_carp_attack - name = "surprise carp attack" - departments = list(DEPARTMENT_EVERYONE) - reusable = TRUE - chaotic = 10 - var/mob/living/victim = null - -/datum/gm_action/surprise_carp_attack/get_weight() - return metric.count_all_space_mobs() * 50 - -/datum/gm_action/surprise_carp_attack/set_up() - var/list/potential_victims = list() - victim = null - for(var/mob/living/L in player_list) - if(!(L.z in using_map.station_levels)) - continue // Not on the right z-level. - if(L.stat) - continue // Don't want dead people. - var/turf/T = get_turf(L) - if(istype(T, /turf/space) && istype(T.loc,/area/space)) - potential_victims.Add(L) - if(potential_victims.len) - victim = pick(potential_victims) - - -/datum/gm_action/surprise_carp_attack/start() - ..() - if(!victim) - message_admins("Surprise carp attack failed to find a target.") - return - var/number_of_carp = rand(1, 2) - message_admins("Sending [number_of_carp] carp\s after [victim].") - while(number_of_carp) - var/turf/spawning_turf = null - var/list/nearby_things = oview(10, victim) - for(var/turf/space/space in nearby_things) - if(get_dist(space, victim) <= 7) - continue - spawning_turf = space - break - if(spawning_turf) - new /mob/living/simple_mob/animal/space/carp(spawning_turf) - number_of_carp-- \ No newline at end of file diff --git a/code/modules/gamemaster/actions/surprise_meteor.dm b/code/modules/gamemaster/actions/surprise_meteor.dm deleted file mode 100644 index 9bdf894948..0000000000 --- a/code/modules/gamemaster/actions/surprise_meteor.dm +++ /dev/null @@ -1,17 +0,0 @@ -// This event sends one wave of meteors unannounced. - -/datum/gm_action/surprise_meteors - name = "surprise meteors" - departments = list(DEPARTMENT_ENGINEERING) - chaotic = 25 - -/datum/gm_action/surprise_meteors/get_weight() - var/engineers = metric.count_people_in_department(DEPARTMENT_ENGINEERING) - var/weight = (max(engineers - 1, 0) * 25) // If only one engineer exists, no meteors for now. - return weight - -/datum/gm_action/surprise_meteors/start() - ..() - spawn(1) - spawn_meteors(rand(4, 8), meteors_normal, pick(cardinal)) - message_admins("Surprise meteors event has ended.") \ No newline at end of file diff --git a/code/modules/gamemaster/actions/swarmboarder.dm b/code/modules/gamemaster/actions/swarmboarder.dm deleted file mode 100644 index fb98dc535e..0000000000 --- a/code/modules/gamemaster/actions/swarmboarder.dm +++ /dev/null @@ -1,75 +0,0 @@ -/datum/gm_action/swarm_boarder - name = "swarmer shell" - departments = list(DEPARTMENT_EVERYONE, DEPARTMENT_SECURITY, DEPARTMENT_ENGINEERING) - chaotic = 60 - observers_used = TRUE - var/area/target_area // Chosen target area - var/area/target_turf // Chosen target turf in target_area - var/list/area/excluded = list( - /area/submap, - /area/shuttle, - /area/crew_quarters, - /area/holodeck, - /area/engineering/engine_room - ) - - var/list/area/included = list( - /area/maintenance - ) - -/datum/gm_action/swarm_boarder/set_up() - severity = pickweight(EVENT_LEVEL_MUNDANE = 30, - EVENT_LEVEL_MODERATE = 10, - EVENT_LEVEL_MAJOR = 1 - ) - - var/list/area/grand_list_of_areas = get_station_areas(excluded) - - for(var/area/Incl in included) - for(var/area/A in grand_list_of_areas) - if(!istype(A, Incl)) - grand_list_of_areas -= A - - // Okay, now lets try and pick a target! Lets try 10 times, otherwise give up - for(var/i in 1 to 10) - var/area/A = pick(grand_list_of_areas) - if(is_area_occupied(A)) - log_debug("[name] event: Rejected [A] because it is occupied.") - continue - // A good area, great! Lets try and pick a turf - var/list/turfs = list() - for(var/turf/simulated/floor/F in A) - if(turf_clear(F)) - turfs += F - if(turfs.len == 0) - log_debug("[name] event: Rejected [A] because it has no clear turfs.") - continue - target_area = A - target_turf = pick(turfs) - - if(!target_area) - log_debug("[name] event: Giving up after too many failures to pick target area") - return - -/datum/gm_action/swarm_boarder/start() - if(!target_turf) - return - ..() - - var/swarmertype = /obj/structure/ghost_pod/ghost_activated/swarm_drone/event - - if(severity == EVENT_LEVEL_MODERATE) - swarmertype = /obj/structure/ghost_pod/ghost_activated/swarm_drone/event/melee - - if(severity == EVENT_LEVEL_MAJOR) - swarmertype = /obj/structure/ghost_pod/ghost_activated/swarm_drone/event/gunner - - new swarmertype(target_turf) - -/datum/gm_action/swarm_boarder/get_weight() - return max(0, -60 + (metric.count_people_in_department(DEPARTMENT_SECURITY) * 10 + metric.count_people_in_department(DEPARTMENT_SYNTHETIC) * 5)) - -/datum/gm_action/swarm_boarder/announce() - spawn(rand(5 MINUTES, 15 MINUTES)) - if(prob(80) && severity >= EVENT_LEVEL_MODERATE && atc && !atc.squelched) - atc.msg("Attention civilian vessels in [using_map.starsys_name] shipping lanes, caution is advised as [pick("an unidentified vessel", "a known criminal's vessel", "a derelict vessel")] has been detected passing multiple local stations.") diff --git a/code/modules/gamemaster/actions/viral_infection.dm b/code/modules/gamemaster/actions/viral_infection.dm deleted file mode 100644 index 97a646e2a3..0000000000 --- a/code/modules/gamemaster/actions/viral_infection.dm +++ /dev/null @@ -1,83 +0,0 @@ -/var/global/list/event_viruses = list() // so that event viruses are kept around for admin logs, rather than being GCed - -/datum/gm_action/viral_infection - name = "viral infection" - departments = list(DEPARTMENT_MEDICAL) - chaotic = 5 - var/list/viruses = list() - severity = 1 - -/datum/gm_action/viral_infection/set_up() - severity = pickweight(EVENT_LEVEL_MUNDANE = 20, - EVENT_LEVEL_MODERATE = 10, - EVENT_LEVEL_MAJOR = 3 - ) - - //generate 1-3 viruses. This way there's an upper limit on how many individual diseases need to be cured if many people are initially infected - var/num_diseases = rand(1,3) - for (var/i=0, i < num_diseases, i++) - var/datum/disease2/disease/D = new /datum/disease2/disease - - var/strength = 1 //whether the disease is of the greater or lesser variety - if (severity >= EVENT_LEVEL_MAJOR && prob(75)) - strength = 2 - D.makerandom(strength) - viruses += D - -/datum/gm_action/viral_infection/announce() - var/level - if (severity == EVENT_LEVEL_MUNDANE) - return - else if (severity == EVENT_LEVEL_MODERATE) - level = pick("one", "two", "three", "four") - else - level = "five" - - spawn(rand(0, 3000)) - if(severity == EVENT_LEVEL_MAJOR || prob(60)) - command_announcement.Announce("Confirmed outbreak of level [level] biohazard aboard \the [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak5.ogg') - -/datum/gm_action/viral_infection/start() - if(!viruses.len) return - - ..() - - var/list/candidates = list() //list of candidate keys - for(var/mob/living/carbon/human/G in player_list) - if(G.mind && G.stat != DEAD && G.is_client_active(5) && !player_is_antag(G.mind)) - var/turf/T = get_turf(G) - if(T.z in using_map.station_levels) - candidates += G - if(!candidates.len) return - candidates = shuffle(candidates)//Incorporating Donkie's list shuffle - - var/list/used_viruses = list() - var/list/used_candidates = list() - severity = max(EVENT_LEVEL_MUNDANE, severity - 1) - var/actual_severity = severity * rand(1, 3) - while(actual_severity > 0 && candidates.len) - var/datum/disease2/disease/D = pick(viruses) - infect_mob(candidates[1], D.getcopy()) - used_candidates += candidates[1] - candidates.Remove(candidates[1]) - actual_severity-- - used_viruses |= D - - event_viruses |= used_viruses - var/list/used_viruses_links = list() - var/list/used_viruses_text = list() - for(var/datum/disease2/disease/D in used_viruses) - used_viruses_links += "
[D.name()]" - used_viruses_text += D.name() - - var/list/used_candidates_links = list() - var/list/used_candidates_text = list() - for(var/mob/M in used_candidates) - used_candidates_links += key_name_admin(M) - used_candidates_text += key_name(M) - - log_admin("Virus event affecting [english_list(used_candidates_text)] started; Viruses: [english_list(used_viruses_text)]") - message_admins("Virus event affecting [english_list(used_candidates_links)] started; Viruses: [english_list(used_viruses_links)]") - -/datum/gm_action/viral_infection/get_weight() - return (metric.count_people_in_department(DEPARTMENT_MEDICAL) * 20) diff --git a/code/modules/gamemaster/actions/viral_outbreak.dm b/code/modules/gamemaster/actions/viral_outbreak.dm deleted file mode 100644 index 352627bd24..0000000000 --- a/code/modules/gamemaster/actions/viral_outbreak.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/gm_action/viral_outbreak - name = "viral outbreak" - departments = list(DEPARTMENT_MEDICAL, DEPARTMENT_EVERYONE) - chaotic = 30 - severity = 1 - var/list/candidates = list() - -/datum/gm_action/viral_outbreak/set_up() - candidates.Cut() // Incase we somehow get run twice. - severity = rand(2, 4) - for(var/mob/living/carbon/human/G in player_list) - if(G.client && G.stat != DEAD) - candidates += G - if(!candidates.len) return - candidates = shuffle(candidates)//Incorporating Donkie's list shuffle - -/datum/gm_action/viral_outbreak/announce() - command_announcement.Announce("Confirmed outbreak of level 7 biohazard aboard \the [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg') - -/datum/gm_action/viral_outbreak/start() - ..() - while(severity > 0 && candidates.len) - if(prob(33)) - infect_mob_random_lesser(candidates[1]) - else - infect_mob_random_greater(candidates[1]) - - candidates.Remove(candidates[1]) - severity-- - -/datum/gm_action/viral_outbreak/get_weight() - var/medical = metric.count_people_in_department(DEPARTMENT_MEDICAL) - var/security = metric.count_people_in_department(DEPARTMENT_SECURITY) - var/everyone = metric.count_people_in_department(DEPARTMENT_EVERYONE) - - var/assigned_staff = medical + round(security / 2) - - if(!medical) // No docs, no staff. - assigned_staff = 0 - - if(assigned_staff < round(everyone / 6) - assigned_staff) // A doc or half an officer per roughly six people. Any less, and assigned staff is halved. - assigned_staff /= 2 - - return (assigned_staff * 10) diff --git a/code/modules/gamemaster/actions/wallrot.dm b/code/modules/gamemaster/actions/wallrot.dm deleted file mode 100644 index deabfbe34a..0000000000 --- a/code/modules/gamemaster/actions/wallrot.dm +++ /dev/null @@ -1,43 +0,0 @@ -/datum/gm_action/wallrot - name = "wall rot" - departments = list(DEPARTMENT_ENGINEERING) - reusable = TRUE - var/turf/simulated/wall/center - severity = 1 - -/datum/gm_action/wallrot/set_up() - severity = rand(1,3) - center = null - // 100 attempts - for(var/i=0, i<100, i++) - var/turf/candidate = locate(rand(1, world.maxx), rand(1, world.maxy), 1) - if(istype(candidate, /turf/simulated/wall)) - center = candidate - return 1 - return 0 - -/datum/gm_action/wallrot/announce() - if(center && prob(min(90,40 * severity))) - command_announcement.Announce("Harmful fungi detected on \the [station_name()] nearby [center.loc.name]. Station structures may be contaminated.", "Biohazard Alert") - -/datum/gm_action/wallrot/start() - ..() - spawn() - if(center) - // Make sure at least one piece of wall rots! - center.rot() - - // Have a chance to rot lots of other walls. - var/rotcount = 0 - var/actual_severity = severity * rand(5, 10) - for(var/turf/simulated/wall/W in range(5, center)) - if(prob(50)) - W.rot() - rotcount++ - - // Only rot up to severity walls - if(rotcount >= actual_severity) - break - -/datum/gm_action/wallrot/get_weight() - return 60 + (metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 35) diff --git a/code/modules/gamemaster/actions/waste_disposal.dm b/code/modules/gamemaster/actions/waste_disposal.dm deleted file mode 100644 index e8412d7e95..0000000000 --- a/code/modules/gamemaster/actions/waste_disposal.dm +++ /dev/null @@ -1,9 +0,0 @@ -// A shuttle full of junk docks, and cargo is tasked with sifting through it all to find valuables, or just dispose of it. - -/datum/gm_action/waste_disposal - name = "waste disposal" - departments = list(DEPARTMENT_CARGO) - chaotic = 0 - -/datum/gm_action/waste_disposal/get_weight() - return metric.count_people_in_department(DEPARTMENT_CARGO) * 50 \ No newline at end of file diff --git a/code/modules/gamemaster/actions/window_break.dm b/code/modules/gamemaster/actions/window_break.dm deleted file mode 100644 index c409388c23..0000000000 --- a/code/modules/gamemaster/actions/window_break.dm +++ /dev/null @@ -1,78 +0,0 @@ -/datum/gm_action/window_break - name = "window breach" - departments = list(DEPARTMENT_ENGINEERING) - chaotic = 5 - var/obj/structure/window/chosen_window - var/list/obj/structure/window/collateral_windows - var/turf/chosen_location - var/list/area/excluded = list( - /area/shuttle, - /area/crew_quarters - ) - -/datum/gm_action/window_break/set_up() - var/list/area/grand_list_of_areas = get_station_areas(excluded) - //try 10 times - for(var/i in 1 to 10) - var/area/A = pick(grand_list_of_areas) - var/list/obj/structure/window/possible_target_windows = list() - for(var/obj/structure/window/target_window in A.contents) - possible_target_windows += target_window - possible_target_windows = shuffle(possible_target_windows) - - for(var/obj/structure/window/target_window in possible_target_windows) - //if() don't have any conditions, for isn't strictly necessary - chosen_window = target_window - chosen_location = chosen_window.loc - collateral_windows = gather_collateral_windows(chosen_window) - return - -//TL;DR: breadth first search for all connected turfs with windows -/datum/gm_action/window_break/proc/gather_collateral_windows(var/obj/structure/window/target_window) - var/list/turf/frontier_set = list(target_window.loc) - var/list/obj/structure/window/result_set = list() - var/list/turf/explored_set = list() - - while(frontier_set.len > 0) - var/turf/current = frontier_set[1] - frontier_set -= current - explored_set += current - - var/contains_windows = 0 - for(var/obj/structure/window/to_add in current.contents) - contains_windows = 1 - result_set += to_add - - if(contains_windows) - //add adjacent turfs to be checked for windows as well - var/turf/neighbor = locate(current.x + 1, current.y, current.z) - if(!(neighbor in frontier_set) && !(neighbor in explored_set)) - frontier_set += neighbor - neighbor = locate(current.x - 1, current.y, current.z) - if(!(neighbor in frontier_set) && !(neighbor in explored_set)) - frontier_set += neighbor - neighbor = locate(current.x, current.y + 1, current.z) - if(!(neighbor in frontier_set) && !(neighbor in explored_set)) - frontier_set += neighbor - neighbor = locate(current.x, current.y - 1, current.z) - if(!(neighbor in frontier_set) && !(neighbor in explored_set)) - frontier_set += neighbor - return result_set - -/datum/gm_action/window_break/start() - if(!chosen_window) - return - ..() - chosen_window.shatter(0) - - spawn() - for(var/obj/structure/window/current_collateral in collateral_windows) - sleep(rand(1,20)) - current_collateral.take_damage(current_collateral.health - (current_collateral.maxhealth / 5)) //set to 1/5th health - -/datum/gm_action/window_break/announce() - if(chosen_window) - command_announcement.Announce("Structural integrity of windows at [chosen_location.loc.name] is failing. Immediate repair or replacement is advised.", "Structural Alert") - -/datum/gm_action/window_break/get_weight() - return 20 * metric.count_people_in_department(DEPARTMENT_ENGINEERING) diff --git a/code/modules/gamemaster/actions/wormholes.dm b/code/modules/gamemaster/actions/wormholes.dm deleted file mode 100644 index a7650713b3..0000000000 --- a/code/modules/gamemaster/actions/wormholes.dm +++ /dev/null @@ -1,23 +0,0 @@ -/datum/gm_action/wormholes - name = "space-time anomalies" - chaotic = 70 - length = 12 MINUTES - departments = list(DEPARTMENT_EVERYONE) - severity = 1 - -/datum/gm_action/wormholes/set_up() // 1 out of 5 will be full-duration wormholes, meaning up to a minute long. - severity = pickweight(list( - 3 = 5, - 2 = 7, - 1 = 13 - )) - -/datum/gm_action/wormholes/start() - ..() - wormhole_event(length / 2, (severity / 3)) - -/datum/gm_action/wormholes/get_weight() - return 10 + max(0, -30 + (metric.count_people_in_department(DEPARTMENT_EVERYONE) * 5) + (metric.count_people_in_department(DEPARTMENT_ENGINEERING) + 10) + (metric.count_people_in_department(DEPARTMENT_MEDICAL) * 20)) - -/datum/gm_action/wormholes/end() - command_announcement.Announce("There are no more space-time anomalies detected on the station.", "Anomaly Alert") diff --git a/code/modules/gamemaster/controller.dm b/code/modules/gamemaster/controller.dm deleted file mode 100644 index 343f05842d..0000000000 --- a/code/modules/gamemaster/controller.dm +++ /dev/null @@ -1,92 +0,0 @@ -/client/proc/show_gm_status() - set category = "Debug" - set name = "Show GM Status" - set desc = "Shows you what the GM is thinking. If only that existed in real life..." - - game_master.interact(usr) - -/datum/game_master/proc/interact(var/client/user) - if(!user) - return - - var/HTML = "Game Master AI" - - HTML += "\[Toggle Time Restrictions\] | \ - \[Toggle GM\] | \ - \[Force Event Decision\]
" - - HTML += "Status: [pre_action_checks() ? "Ready" : "Suppressed"]

" - - HTML += "Staleness: [staleness] \[Adjust\]
" - HTML += "Danger: [danger] \[Adjust\]

" - - HTML += "Actions available;
" - for(var/datum/gm_action/action in available_actions) - if(action.enabled == FALSE) - continue - HTML += "[action.name] ([english_list(action.departments)]) (weight: [action.get_weight()]) \[Force\]
" - - HTML += "
" - HTML += "All living mobs activity: [metric.assess_all_living_mobs()]%
" - HTML += "All ghost activity: [metric.assess_all_dead_mobs()]%
" - - HTML += "
" - HTML += "Departmental activity;
" - for(var/department in metric.departments) - HTML += " [department] : [metric.assess_department(department)]%
" - - HTML += "
" - HTML += "Activity of players;
" - for(var/mob/player in player_list) - HTML += " [player] ([player.key]) : [metric.assess_player_activity(player)]%
" - - - - HTML +="" - user << browse(HTML, "window=log;size=400x450;border=1;can_resize=1;can_close=1;can_minimize=1") - -/datum/game_master/Topic(href, href_list) - if(..()) - return - - if(!is_admin(usr)) - message_admins("[usr] has attempted to modify the Game Master values without being an admin.") - return - - if(href_list["toggle_time_restrictions"]) - ignore_time_restrictions = !ignore_time_restrictions - message_admins("GM event time restrictions was [ignore_time_restrictions ? "dis" : "en"]abled by [usr.key].") - - if(href_list["force_choose_event"]) - start_action() - message_admins("[usr.key] forced the Game Master to choose an event immediately.") - - if(href_list["suspend"]) - suspended = !suspended - message_admins("GM was [suspended ? "dis" : "en"]abled by [usr.key].") - - if(href_list["adjust_staleness"]) - var/amount = input(usr, "How much staleness should be added or subtracted?", "Game Master") as null|num - if(amount) - adjust_staleness(amount) - message_admins("GM staleness was adjusted by [amount] by [usr.key].") - - if(href_list["adjust_danger"]) - var/amount = input(usr, "How much danger should be added or subtracted?", "Game Master") as null|num - if(amount) - adjust_danger(amount) - message_admins("GM danger was adjusted by [amount] by [usr.key].") - - interact(usr) // To refresh the UI. - -/datum/gm_action/Topic(href, href_list) - if(..()) - return - - if(!is_admin(usr)) - message_admins("[usr] has attempted to force an event without being an admin.") - return - - if(href_list["force"]) - gm.run_action(src) - message_admins("GM event [name] was forced by [usr.key].") \ No newline at end of file diff --git a/code/modules/gamemaster/defines.dm b/code/modules/gamemaster/defines.dm index 2e486ee23b..5bc17b462c 100644 --- a/code/modules/gamemaster/defines.dm +++ b/code/modules/gamemaster/defines.dm @@ -1 +1,3 @@ -#define EVENT_BASELINE_WEIGHT 200 \ No newline at end of file +#define EVENT_CHAOS_THRESHOLD_HIGH_IMPACT 25 +#define EVENT_CHAOS_THRESHOLD_MEDIUM_IMPACT 50 +#define EVENT_CHAOS_THRESHOLD_LOW_IMPACT 100 \ No newline at end of file diff --git a/code/modules/gamemaster/event2/event.dm b/code/modules/gamemaster/event2/event.dm new file mode 100644 index 0000000000..c82034083a --- /dev/null +++ b/code/modules/gamemaster/event2/event.dm @@ -0,0 +1,230 @@ +// This object holds the code that is needed to execute an event. +// Code for judging whether doing that event is a good idea or not belongs inside its meta event object. + + +/* + +Important: DO NOT `sleep()` in any of the procs here, or the GM will get stuck. Use callbacks insead. +Also please don't use spawn(), but use callbacks instead. + +Note that there is an important distinction between an event being ended, and an event being finished. +- Ended is for when the actual event is over, regardless of whether an announcement happened or not. +- Finished is for when both the event itself is over, and it was announced. The event will stop being +processed after it is finished. + +For an event to finish, it must have done two things: +- Go through its entire cycle, of start() -> end(), and +- Have the event be announced. +If an event has ended, but the announcement didn't happen, the event will not be finished. +This allows for events that have their announcement happen after the end itself. + +*/ + +// +/datum/event2/event + var/announced = FALSE // Is set to TRUE when `announce()` is called by `process()`. + var/started = FALSE // Is set to TRUE when `start()` is called by `process()`. + var/ended = FALSE // Is set to TRUE when `end()` is called by `process()`. + var/finished = FALSE // Is set to TRUE when `ended` and `announced` are TRUE. + + // `world.time`s when this event started, and finished, for bookkeeping. + var/time_started = null + var/time_finished = null + + // If these are set, the announcement will be delayed by a random time between the lower and upper bounds. + // If the upper bound is not defined, then it will use the lower bound instead. + // Note that this is independant of the event itself, so you can have the announcement happen long after the event ended. + // This may not work if should_announce() is overrided. + var/announce_delay_lower_bound = null + var/announce_delay_upper_bound = null + + // If these are set, the event will be delayed by a random time between the lower and upper bounds. + // If the upper bound is not defined, then it will use the lower bound instead. + // This may not work if should_start() is overrided. + var/start_delay_lower_bound = null + var/start_delay_upper_bound = null + + // If these are set, the event will automatically end at a random time between the lower and upper bounds. + // If the upper bound is not defined, then it will use the lower bound instead. + // This may not work if should_end() is overrided. + var/length_lower_bound = null + var/length_upper_bound = null + + // Set automatically, don't touch. + var/time_to_start = null + var/time_to_announce = null + var/time_to_end = null + + // These are also set automatically, and are provided for events to know what RNG decided for the various durations. + var/start_delay = null + var/announce_delay = null + var/length = null + +// Returns the name of where the event is taking place. +// In the future this might be handy for off-station events. +/datum/event2/event/proc/location_name() + return station_name() + +// Returns the z-levels that are involved with the event. +// In the future this might be handy for off-station events. +/datum/event2/event/proc/get_location_z_levels() + return using_map.station_levels + +// Returns a list of empty turfs in the same area. +/datum/event2/event/proc/find_random_turfs(minimum_free_space = 5, list/specific_areas = list(), ignore_occupancy = FALSE) + var/list/area/grand_list_of_areas = find_random_areas(specific_areas) + + if(!LAZYLEN(grand_list_of_areas)) + return list() + + for(var/thing in grand_list_of_areas) + var/list/A = thing + var/list/turfs = list() + for(var/turf/T in A) + if(!T.check_density()) + turfs += T + + if(turfs.len < minimum_free_space) + continue // Not enough free space. + return turfs + + return list() + +/datum/event2/event/proc/find_random_areas(list/specific_areas = list(), ignore_occupancy = FALSE) + if(!LAZYLEN(specific_areas)) + specific_areas = global.the_station_areas.Copy() + + var/list/area/grand_list_of_areas = get_all_existing_areas_of_types(specific_areas) + . = list() + for(var/thing in shuffle(grand_list_of_areas)) + var/area/A = thing + if(A.forbid_events) + continue + if(!(A.z in get_location_z_levels())) + continue + if(!ignore_occupancy && is_area_occupied(A)) + continue // Occupied. + . += A + +// Starts the event. +/datum/event2/event/proc/execute() + time_started = world.time + + if(announce_delay_lower_bound) + announce_delay = rand(announce_delay_lower_bound, announce_delay_upper_bound ? announce_delay_upper_bound : announce_delay_lower_bound) + time_to_announce = world.time + announce_delay + + if(start_delay_lower_bound) + start_delay = rand(start_delay_lower_bound, start_delay_upper_bound ? start_delay_upper_bound : start_delay_lower_bound) + time_to_start = world.time + start_delay + + if(length_lower_bound) + var/starting_point = time_to_start ? time_to_start : world.time + length = rand(length_lower_bound, length_upper_bound ? length_upper_bound : length_lower_bound) + time_to_end = starting_point + length + + set_up() + +// Called at the very end of the event's lifecycle, or when aborted. +// Don't override this, use `end()` for cleanup instead. +/datum/event2/event/proc/finish() + finished = TRUE + time_finished = world.time + +// Called by admins wanting to stop an event immediately. +/datum/event2/event/proc/abort() + if(!announced) + announce() + if(!ended) // `end()` generally has cleanup procs, so call that. + end() + finish() + +// Called by the GM processer. +/datum/event2/event/process() + // Handle announcement track. + if(!announced && should_announce()) + announced = TRUE + announce() + + // Handle event track. + if(!started) + if(should_start()) + started = TRUE + start() + else + wait_tick() + + if(started && !ended) + if(should_end()) + ended = TRUE + end() + else + event_tick() + + // In order to be finished, the event needs to end, and be announced. + if(ended && announced) + finish() + +/datum/event2/event/Topic(href, href_list) + if(..()) + return + + if(!check_rights(R_ADMIN|R_EVENT|R_DEBUG)) + message_admins("[usr] has attempted to manipulate an event without sufficent privilages.") + return + + if(href_list["abort"]) + abort() + message_admins("Event '[type]' was aborted by [usr.key].") + + SSgame_master.interact(usr) // To refresh the UI. + +/* + * Procs to Override + */ + +// Override this for code to be ran before the event is started. +/datum/event2/event/proc/set_up() + +// Called every tick from the GM system, and determines if the announcement should happen. +// Override this for special logic on when it should be announced, e.g. after `ended` is set to TRUE, +// however be aware that the event cannot finish until this returns TRUE at some point. +/datum/event2/event/proc/should_announce() + if(!time_to_announce) + return TRUE + return time_to_announce <= world.time + +// Override this for code that alerts the crew that the event is happening in some form, e.g. a centcom announcement or some other message. +// If you want them to not know, you can just not override it. +/datum/event2/event/proc/announce() + +// Override for code that runs every few seconds, while the event is waiting for `should_start()` to return TRUE. +// Note that events that have `should_start()` return TRUE at the start will never have this proc called. +/datum/event2/event/proc/wait_tick() + +// Called every tick from the GM system, and determines if the event should offically start. +// Override this for special logic on when it should start. +/datum/event2/event/proc/should_start() + if(!time_to_start) + return TRUE + return time_to_start <= world.time + +// Override this for code to do the actual event. +/datum/event2/event/proc/start() + + +// Override for code that runs every few seconds, while the event is waiting for `should_end()` to return TRUE. +// Note that events that have `should_end()` return TRUE at the start will never have this proc called. +/datum/event2/event/proc/event_tick() + + +// Called every tick from the GM system, and determines if the event should end. +// If this returns TRUE at the very start, then the event ends instantly and `tick()` will never be called. +// Override this for special logic on when it should end, e.g. blob core has to die before event ends. +/datum/event2/event/proc/should_end() + if(!time_to_end) + return TRUE + return time_to_end <= world.time + +// Override this for code to run when the event is over, e.g. cleanup. +/datum/event2/event/proc/end() diff --git a/code/modules/gamemaster/event2/events/cargo/shipping_error.dm b/code/modules/gamemaster/event2/events/cargo/shipping_error.dm new file mode 100644 index 0000000000..eaab32cb8a --- /dev/null +++ b/code/modules/gamemaster/event2/events/cargo/shipping_error.dm @@ -0,0 +1,16 @@ +/datum/event2/meta/shipping_error + name = "shipping error" + departments = list(DEPARTMENT_CARGO) + chaos = -10 // A helpful event. + reusable = TRUE + event_type = /datum/event2/event/shipping_error + +/datum/event2/meta/shipping_error/get_weight() + return (metric.count_people_with_job(/datum/job/cargo_tech) + metric.count_people_with_job(/datum/job/qm)) * 30 + +/datum/event2/event/shipping_error/start() + var/datum/supply_order/O = new /datum/supply_order() + O.ordernum = SSsupply.ordernum + O.object = SSsupply.supply_pack[pick(SSsupply.supply_pack)] + O.ordered_by = random_name(pick(MALE,FEMALE), species = "Human") + SSsupply.shoppinglist += O diff --git a/code/modules/gamemaster/event2/events/command/manifest_malfunction.dm b/code/modules/gamemaster/event2/events/command/manifest_malfunction.dm new file mode 100644 index 0000000000..0a19ec7a65 --- /dev/null +++ b/code/modules/gamemaster/event2/events/command/manifest_malfunction.dm @@ -0,0 +1,61 @@ +/datum/event2/meta/manifest_malfunction + name = "manifest_malfunction" + departments = list(DEPARTMENT_COMMAND, DEPARTMENT_SECURITY, DEPARTMENT_EVERYONE) + chaos = 10 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_LOW_IMPACT + event_type = /datum/event2/event/manifest_malfunction + +/datum/event2/meta/manifest_malfunction/get_weight() + var/security = metric.count_people_in_department(DEPARTMENT_SECURITY) + + if(!security || !data_core) + return 0 + + var/command = metric.count_people_with_job(/datum/job/hop) + metric.count_people_with_job(/datum/job/captain) + var/synths = metric.count_people_in_department(DEPARTMENT_SYNTHETIC) + var/everyone = metric.count_people_in_department(DEPARTMENT_EVERYONE) - (synths + security + command) // So they don't get counted twice. + + return (security * 10) + (synths * 20) + (command * 20) + (everyone * 5) + + + +/datum/event2/event/manifest_malfunction + announce_delay_lower_bound = 5 MINUTES + announce_delay_upper_bound = 10 MINUTES + var/records_to_delete = 2 + var/record_class_to_delete = null + +/datum/event2/event/manifest_malfunction/set_up() + record_class_to_delete = pickweight(list("medical" = 10, "security" = 30)) + +/datum/event2/event/manifest_malfunction/announce() + if(prob(30)) + var/message = null + var/author = null + var/rng = rand(1, 2) + switch(rng) + if(1) + author = "Data Breach Alert" + message = "The [record_class_to_delete] record database has suffered from an attack by one or more hackers. \ + They appear to have wiped several records, before disconnecting." + if(2) + author = "Downtime Alert" + message = "The [record_class_to_delete] record database server has suffered a hardware failure, and is no longer functional. \ + A temporary replacement server has been activated, containing recovered data from the main server. \ + A few records became corrupted, and could not be transferred." + command_announcement.Announce(message, author) + +/datum/event2/event/manifest_malfunction/start() + for(var/i = 1 to records_to_delete) + var/datum/data/record/R + + switch(record_class_to_delete) + if("security") + R = safepick(data_core.security) + + if("medical") + R = safepick(data_core.medical) + + if(R) + log_debug("Manifest malfunction event is now deleting [R.fields["name"]]'s [record_class_to_delete] record.") + qdel(R) diff --git a/code/modules/gamemaster/event2/events/command/money_hacker.dm b/code/modules/gamemaster/event2/events/command/money_hacker.dm new file mode 100644 index 0000000000..a1dbd1e18b --- /dev/null +++ b/code/modules/gamemaster/event2/events/command/money_hacker.dm @@ -0,0 +1,110 @@ +/datum/event2/meta/money_hacker + name = "money hacker" + departments = list(DEPARTMENT_COMMAND) + chaos = 10 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_LOW_IMPACT + event_type = /datum/event2/event/money_hacker + +/datum/event2/meta/money_hacker/get_weight() + var/command = metric.count_people_with_job(/datum/job/hop) + metric.count_people_with_job(/datum/job/captain) + + if(!command) + return 0 + return 30 + (command * 20) + (all_money_accounts.len * 5) + + + +/datum/event2/event/money_hacker + length_lower_bound = 8 MINUTES + length_upper_bound = 12 MINUTES + var/datum/money_account/targeted_account = null + +/datum/event2/event/money_hacker/set_up() + if(LAZYLEN(all_money_accounts)) + targeted_account = pick(all_money_accounts) + + if(!targeted_account) + log_debug("Money hacker event could not find an account to hack. Aborting.") + abort() + return + +/datum/event2/event/money_hacker/announce() + var/message = "A brute force hack has been detected (in progress since [stationtime2text()]). The target of the attack is: Financial account #[targeted_account.account_number], \ + without intervention this attack will succeed in approximately 10 minutes. Required intervention: temporary suspension of affected accounts until the attack has ceased. \ + Notifications will be sent as updates occur." + var/my_department = "[location_name()] Firewall Subroutines" + + for(var/obj/machinery/message_server/MS in machines) + if(!MS.active) + continue + MS.send_rc_message("Head of Personnel's Desk", my_department, "[message]
", "", "", 2) + + // Nobody reads the requests consoles so lets use the radio as well. + global_announcer.autosay(message, my_department, DEPARTMENT_COMMAND) + +/datum/event2/event/money_hacker/end() + var/message = null + if(targeted_account && !targeted_account.suspended) // Hacker wins. + message = "The hack attempt has succeeded." + hack_account(targeted_account) + log_debug("Money hacker event managed to hack the targeted account.") + + else // Crew wins. + message = "The attack has ceased, the affected accounts can now be brought online." + log_debug("Money hacker event failed to hack the targeted account due to intervention by the crew.") + + var/my_department = "[location_name()] Firewall Subroutines" + + for(var/obj/machinery/message_server/MS in machines) + if(!MS.active) continue + MS.send_rc_message("Head of Personnel's Desk", my_department, message, "", "", 2) + + global_announcer.autosay(message, my_department, DEPARTMENT_COMMAND) + +/datum/event2/event/money_hacker/proc/hack_account(datum/money_account/A) + // Subtract the money. + var/lost = A.money * 0.8 + (rand(2,4) - 2) / 10 + A.money -= lost + + // Create a taunting log entry. + var/datum/transaction/T = new() + T.target_name = pick(list( + "", + "yo brotha from anotha motha", + "el Presidente", + "chieF smackDowN", + "Nobody" + )) + + T.purpose = pick(list( + "Ne$ ---ount fu%ds init*&lisat@*n", + "PAY BACK YOUR MUM", + "Funds withdrawal", + "pWnAgE", + "l33t hax", + "liberationez", + "Hit", + "Nothing" + )) + + T.amount = pick(list( + "", + "([rand(0,99999)])", + "alla money", + "9001$", + "HOLLA HOLLA GET DOLLA", + "([lost])", + "69,420t" + )) + + var/date1 = "1 January 1970" // Unix epoch. + var/date2 = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], [rand(1000,3000)]" + T.date = pick("", current_date_string, date1, date2,"Nowhen") + + var/time1 = rand(0, 99999999) + var/time2 = "[round(time1 / 36000)+12]:[(time1 / 600 % 60) < 10 ? add_zero(time1 / 600 % 60, 1) : time1 / 600 % 60]" + T.time = pick("", stationtime2text(), time2, "Never") + + T.source_terminal = pick("","[pick("Biesel","New Gibson")] GalaxyNet Terminal #[rand(111,999)]","your mums place","nantrasen high CommanD","Angessa's Pearl","Nowhere") + + A.transaction_log.Add(T) diff --git a/code/modules/gamemaster/event2/events/command/raise_funds.dm b/code/modules/gamemaster/event2/events/command/raise_funds.dm new file mode 100644 index 0000000000..31e8816350 --- /dev/null +++ b/code/modules/gamemaster/event2/events/command/raise_funds.dm @@ -0,0 +1,96 @@ +/datum/event2/meta/raise_funds + name = "local funding drive" + enabled = FALSE // There isn't really any suitable way for the crew to generate thalers right now, if that gets fixed feel free to turn this event on. + departments = list(DEPARTMENT_COMMAND, DEPARTMENT_CARGO) + chaotic_threshold = EVENT_CHAOS_THRESHOLD_LOW_IMPACT + event_type = /datum/event2/event/raise_funds + +/datum/event2/meta/raise_funds/get_weight() + var/command = metric.count_people_in_department(DEPARTMENT_COMMAND) + if(!command) // Need someone to read the centcom message. + return 0 + + var/cargo = metric.count_people_in_department(DEPARTMENT_CARGO) + return (command * 20) + (cargo * 20) + + + +/datum/event2/event/raise_funds + length_lower_bound = 30 MINUTES + length_upper_bound = 45 MINUTES + var/money_at_start = 0 + +/datum/event2/event/raise_funds/announce() + var/message = "Due to [pick("recent", "unfortunate", "possible future")] budget \ + [pick("changes", "issues")], in-system stations are now advised to increase funding income." + + send_command_report("Budget Advisement", message) + +/datum/event2/event/raise_funds/start() + // Note that the event remembers the amount of money when it started. If an issue develops where people try to scam centcom by + // taking out loads of money before the event, then depositing it back in after the event fires, feel free to make this check for + // roundstart money instead. + money_at_start = count_money() + log_debug("Funding Drive event logged a sum of [money_at_start] thalers in all station accounts at the start of the event.") + +/datum/event2/event/raise_funds/end() + var/money_at_end = count_money() + log_debug("Funding Drive event logged a sum of [money_at_end] thalers in all station accounts at the end of the event, compared \ + to [money_at_start] thalers. A difference of [money_at_end / money_at_start] was calculated.") + + // A number above 1 indicates money was made, while below 1 does the opposite. + var/budget_shift = money_at_end / money_at_start + + // Centcom will say different things based on if they gained or lost money. + var/message = null + switch(budget_shift) + if(0 to 0.02) // Abyssmal response. + message = "We are very interested in learning where [round(money_at_start, 1000)] thaler went in \ + just half an hour. We highly recommend rectifying this issue before the end of the shift, otherwise a \ + discussion regarding your future employment prospects will occur.

\ + Your facility's current balance of requisition tokens has been revoked." + SSsupply.points = 0 + log_debug("Funding Drive event ended with an abyssmal response, and the loss of all cargo points.") + + if(0.02 to 0.98) // Bad response. + message = "We're very disappointed that \the [location_name()] has ran a deficit since our request. \ + As such, we will be taking away some requisition tokens to cover the cost of operating your facility." + var/points_lost = round(SSsupply.points * rand(0.5, 0.8)) + SSsupply.points -= points_lost + log_debug("Funding Drive event ended with a bad response, and [points_lost] cargo points was taken away.") + + if(0.98 to 1.02) // Neutral response. + message = "It is unfortunate that \the [location_name()]'s finances remain at a standstill, however \ + that is still preferred over having a decicit. We hope that in the future, your facility will be able to be \ + more profitable." + log_debug("Funding Drive event ended with a neutral response.") + + if(1.02 to INFINITY) // Good response. + message = "We appreciate the efforts made by \the [location_name()] to run at a surplus. \ + Together, along with the other facilities present in the [using_map.starsys_name] system, \ + the company is expected to meet the quota.

\ + We will allocate additional requisition tokens for the cargo department as a reward." + + // If cargo is ever made to use station funds instead of cargo points, then a new kind of reward will be needed. + // Otherwise it would be weird for centcom to go 'thanks for not spending money, your reward is money to spend'. + var/point_reward = rand(100, 200) + SSsupply.points += point_reward + log_debug("Funding Drive event ended with a good response and a bonus of [point_reward] cargo points.") + + send_command_report("Budget Followup", message) + + + +// Returns the sum of the station account and all the departmental accounts. +/datum/event2/event/raise_funds/proc/count_money() + . = 0 + . += station_account.money + for(var/i = 1 to SSjob.department_datums.len) + var/datum/money_account/account = LAZYACCESS(department_accounts, SSjob.department_datums[i]) + if(istype(account)) + . += account.money + +/datum/event2/event/raise_funds/proc/send_command_report(title, message) + post_comm_message(title, message) + to_world(span("danger", "New [using_map.company_name] Update available at all communication consoles.")) + SEND_SOUND(world, 'sound/AI/commandreport.ogg') diff --git a/code/modules/gamemaster/event2/events/engineering/airlock_failure.dm b/code/modules/gamemaster/event2/events/engineering/airlock_failure.dm new file mode 100644 index 0000000000..69b596d799 --- /dev/null +++ b/code/modules/gamemaster/event2/events/engineering/airlock_failure.dm @@ -0,0 +1,100 @@ +/datum/event2/meta/airlock_failure + event_class = "airlock failure" + departments = list(DEPARTMENT_ENGINEERING, DEPARTMENT_MEDICAL) + chaos = 15 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_MEDIUM_IMPACT + event_type = /datum/event2/event/airlock_failure + +/datum/event2/meta/airlock_failure/emag + name = "airlock failure - emag" + event_type = /datum/event2/event/airlock_failure/emag + +/datum/event2/meta/airlock_failure/door_crush + name = "airlock failure - crushing" + event_type = /datum/event2/event/airlock_failure/door_crush + +/datum/event2/meta/airlock_failure/shock + name = "airlock failure - shock" + chaos = 30 + event_type = /datum/event2/event/airlock_failure/shock + + +/datum/event2/meta/airlock_failure/get_weight() + var/engineering = metric.count_people_in_department(DEPARTMENT_ENGINEERING) + + // Synths are good both for fixing the doors and getting blamed for the doors zapping people. + var/synths = metric.count_people_in_department(DEPARTMENT_SYNTHETIC) + if(!engineering && !synths) // Nobody's around to fix the door. + return 0 + + // Medical might be needed for some of the more violent airlock failures. + var/medical = metric.count_people_in_department(DEPARTMENT_MEDICAL) + + return (engineering * 20) + (medical * 20) + (synths * 20) + + + +/datum/event2/event/airlock_failure + announce_delay_lower_bound = 20 SECONDS + announce_delay_upper_bound = 40 SECONDS + var/announce_odds = 0 + var/doors_to_break = 1 + var/list/affected_areas = list() + +/datum/event2/event/airlock_failure/emag + announce_odds = 10 // To make people wonder if the emagged door was from a baddie or from this event. + doors_to_break = 2 // Replacing emagged doors really sucks for engineering so don't overdo it. + +/datum/event2/event/airlock_failure/door_crush + announce_odds = 30 + doors_to_break = 5 + +/datum/event2/event/airlock_failure/shock + announce_odds = 70 + +/datum/event2/event/airlock_failure/start() + var/list/areas = find_random_areas() + if(!LAZYLEN(areas)) + log_debug("Airlock Failure event could not find any areas. Aborting.") + abort() + return + + while(areas.len) + var/area/area = pick(areas) + areas -= area + + for(var/obj/machinery/door/airlock/door in area.contents) + if(can_break_door(door)) + addtimer(CALLBACK(src, .proc/break_door, door), 1) // Emagging proc is actually a blocking proc and that's bad for the ticker. + door.visible_message(span("danger", "\The [door]'s panel sparks!")) + playsound(door, "sparks", 50, 1) + log_debug("Airlock Failure event has broken \the [door] airlock in [area].") + affected_areas |= area + doors_to_break-- + + if(doors_to_break <= 0) + return + +/datum/event2/event/airlock_failure/announce() + if(prob(announce_odds)) + command_announcement.Announce("An electrical issue has been detected in the airlock grid at [english_list(affected_areas)]. \ + Some airlocks may require servicing by a qualified technician.", "Electrical Alert") + + +/datum/event2/event/airlock_failure/proc/can_break_door(obj/machinery/door/airlock/door) + if(istype(door, /obj/machinery/door/airlock/lift)) + return FALSE + return door.arePowerSystemsOn() + +// Override this for door busting. +/datum/event2/event/airlock_failure/proc/break_door(obj/machinery/door/airlock/door) + +/datum/event2/event/airlock_failure/emag/break_door(obj/machinery/door/airlock/door) + door.emag_act(1) + +/datum/event2/event/airlock_failure/door_crush/break_door(obj/machinery/door/airlock/door) + door.normalspeed = FALSE + door.safe = FALSE + +/datum/event2/event/airlock_failure/shock/break_door(obj/machinery/door/airlock/door) + door.electrify(-1) diff --git a/code/modules/gamemaster/event2/events/engineering/blob.dm b/code/modules/gamemaster/event2/events/engineering/blob.dm new file mode 100644 index 0000000000..3ace8f0894 --- /dev/null +++ b/code/modules/gamemaster/event2/events/engineering/blob.dm @@ -0,0 +1,163 @@ +/datum/event2/meta/blob + name = "blob" + departments = list(DEPARTMENT_ENGINEERING, DEPARTMENT_SECURITY, DEPARTMENT_MEDICAL) + chaos = 30 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_HIGH_IMPACT + event_class = "blob" // This makes it so there is no potential for multiple blob events of different types happening in the same round. + event_type = /datum/event2/event/blob + // In the distant future, if a mechanical skill system were to come into being, these vars could be replaced with skill checks so off duty people could count. + var/required_fighters = 2 // Fighters refers to engineering OR security. + var/required_support = 1 // Support refers to doctors AND roboticists, depending on fighter composition. + +/datum/event2/meta/blob/hard + name = "harder blob" + chaos = 40 + event_type = /datum/event2/event/blob/hard_blob + required_fighters = 3 + +/datum/event2/meta/blob/multi_blob + name = "multi blob" + chaos = 60 + event_type = /datum/event2/event/blob/multi_blob + required_fighters = 4 + required_support = 2 + +// For bussing only. +/datum/event2/meta/blob/omni_blob + name = "omni blob" + chaos = 200 + event_type = /datum/event2/event/blob/omni_blob + enabled = FALSE + +/datum/event2/meta/blob/get_weight() + // Count the 'fighters'. + var/list/engineers = metric.get_people_in_department(DEPARTMENT_ENGINEERING) + var/list/security = metric.get_people_in_department(DEPARTMENT_SECURITY) + + if(engineers.len + security.len < required_fighters) + return 0 + + // Now count the 'support'. + var/list/medical = metric.get_people_in_department(DEPARTMENT_MEDICAL) + var/need_medical = FALSE + + var/list/robotics = metric.get_people_with_job(/datum/job/roboticist) + var/need_robotics = FALSE + + // Determine what kind of support might be needed. + for(var/mob/living/L in engineers|security) + if(L.isSynthetic()) + need_robotics = TRUE + else + need_medical = TRUE + + // Medical is more important than robotics, since robits tend to not suffer slow deaths if there isn't a roboticist. + if(medical.len < required_support && need_medical) + return 0 + + // Engineers can sometimes fill in as robotics. This is done in the interest of the event having a chance of not being super rare. + // In the uncertain future, a mechanical skill system check could replace this check here. + if(robotics.len + engineers.len < required_support && need_robotics) + return 0 + + var/fighter_weight = (engineers.len + security.len) * 20 + var/support_weight = (medical.len + robotics.len) * 10 // Not counting engineers as support so they don't cause 30 weight each. + var/chaos_weight = chaos / 2 // Chaos is added as a weight in order to make more chaotic variants be preferred if they are allowed to be picked. + + return fighter_weight + support_weight + chaos_weight + + + +/datum/event2/event/blob + announce_delay_lower_bound = 1 MINUTE + announce_delay_upper_bound = 5 MINUTES + // This could be made into a GLOB accessible list for reuse if needed. + var/list/area/excluded = list( + /area/submap, + /area/shuttle, + /area/crew_quarters, + /area/holodeck, + /area/engineering/engine_room + ) + var/list/open_turfs = list() + var/spawn_blob_type = /obj/structure/blob/core/random_medium + var/number_of_blobs = 1 + var/list/blobs = list() // A list containing weakrefs to blob cores created. Weakrefs mean this event won't interfere with qdel. + +/datum/event2/event/blob/hard_blob + spawn_blob_type = /obj/structure/blob/core/random_hard + +/datum/event2/event/blob/multi_blob + spawn_blob_type = /obj/structure/blob/core/random_hard // Lethargic blobs are boring. + number_of_blobs = 2 + +// For adminbus only. +/datum/event2/event/blob/omni_blob + number_of_blobs = 16 // Someday maybe we can get this to specifically spawn every blob. + +/datum/event2/event/blob/set_up() + open_turfs = find_random_turfs(5 + number_of_blobs) + + if(!open_turfs.len) + log_debug("Blob infestation event: Giving up after failure to find blob spots.") + abort() + +/datum/event2/event/blob/start() + for(var/i = 1 to number_of_blobs) + var/turf/T = pick(open_turfs) + var/obj/structure/blob/core/new_blob = new spawn_blob_type(T) + blobs += weakref(new_blob) + open_turfs -= T // So we can't put two cores on the same tile if doing multiblob. + log_debug("Spawned [new_blob.overmind.blob_type.name] blob at [get_area(new_blob)].") + +/datum/event2/event/blob/should_end() + for(var/WR in blobs) + var/weakref/weakref = WR + if(weakref.resolve()) // If the weakref is resolvable, that means the blob hasn't been deleted yet. + return FALSE + return TRUE // Only end if all blobs die. + +// Normally this does nothing, but is useful if aborted by an admin. +/datum/event2/event/blob/end() + for(var/WR in blobs) + var/weakref/weakref = WR + var/obj/structure/blob/core/B = weakref.resolve() + if(istype(B)) + qdel(B) + +/datum/event2/event/blob/announce() + if(!ended) // Don't announce if the blobs die early. + var/danger_level = 0 + var/list/blob_type_names = list() + var/multiblob = FALSE + for(var/WR in blobs) + var/weakref/weakref = WR + var/obj/structure/blob/core/B = weakref.resolve() + if(!istype(B)) + continue + var/datum/blob_type/blob_type = B.overmind.blob_type + + blob_type_names += blob_type.name + if(danger_level > blob_type.difficulty) // The highest difficulty is used, if multiple blobs are present. + danger_level = blob_type.difficulty + + if(blob_type_names.len > 1) // More than one blob is harder. + danger_level += blob_type_names.len + multiblob = TRUE + + var/list/lines = list() + lines += "Confirmed outbreak of level [7 + danger_level] biohazard[multiblob ? "s": ""] \ + aboard [location_name()]. All personnel must contain the outbreak." + + if(danger_level >= BLOB_DIFFICULTY_MEDIUM) // Tell them what kind of blob it is if it's tough. + lines += "The biohazard[multiblob ? "s have": " has"] been identified as [english_list(blob_type_names)]." + + if(danger_level >= BLOB_DIFFICULTY_HARD) // If it's really hard then tell them where it is so the response occurs faster. + var/turf/T = open_turfs[1] + var/area/A = T.loc + lines += "[multiblob ? "It is": "They are"] suspected to have originated from \the [A]." + + if(danger_level >= BLOB_DIFFICULTY_SUPERHARD) + lines += "Extreme caution is advised." + + command_announcement.Announce(lines.Join("\n"), "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg') diff --git a/code/modules/gamemaster/event2/events/engineering/brand_intelligence.dm b/code/modules/gamemaster/event2/events/engineering/brand_intelligence.dm new file mode 100644 index 0000000000..bf1a8dfed6 --- /dev/null +++ b/code/modules/gamemaster/event2/events/engineering/brand_intelligence.dm @@ -0,0 +1,90 @@ +/datum/event2/meta/brand_intelligence + name = "vending machine malware" + departments = list(DEPARTMENT_EVERYONE, DEPARTMENT_EVERYONE) + chaos = 10 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_LOW_IMPACT + event_type = /datum/event2/event/brand_intelligence + +/datum/event2/meta/brand_intelligence/get_weight() + return 10 + (metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 20) + + + +/datum/event2/event/brand_intelligence + var/malware_spread_cooldown = 30 SECONDS + + var/list/vending_machines = list() // List of venders that can potentially be infected. + var/list/infected_vending_machines = list() // List of venders that have been infected. + var/obj/machinery/vending/vender_zero = null // The first vending machine infected. If that one gets fixed, all other infected machines will be cured. + var/last_malware_spread_time = null + +/datum/event2/event/brand_intelligence/set_up() + for(var/obj/machinery/vending/V in machines) + if(!(V.z in using_map.station_levels)) + continue + vending_machines += V + + if(!vending_machines.len) + log_debug("Could not find any vending machines on station Z levels. Aborting.") + abort() + return + + vender_zero = pick(vending_machines) + +/datum/event2/event/brand_intelligence/announce() + if(prob(90)) + command_announcement.Announce("An ongoing mass upload of malware for venders has been detected onboard \the [location_name()], \ + which appears to transmit to nearby vendors. The original infected machine is believed to be \a [vender_zero].", "Vender Service Alert") + +/datum/event2/event/brand_intelligence/start() + infect_vender(vender_zero) + +/datum/event2/event/brand_intelligence/event_tick() + if(last_malware_spread_time + malware_spread_cooldown > world.time) + return // Still on cooldown. + last_malware_spread_time = world.time + + if(vending_machines.len) + var/next_victim = pick(vending_machines) + infect_vender(next_victim) + + // Every time Vender Zero infects, it says something. + vender_zero.speak(pick("Try our aggressive new marketing strategies!", \ + "You should buy products to feed your lifestyle obsession!", \ + "Consume!", \ + "Your money can buy happiness!", \ + "Engage direct marketing!", \ + "Advertising is legalized lying! But don't let that put you off our great deals!", \ + "You don't want to buy anything? Yeah, well I didn't want to buy your mom either.")) + + +/datum/event2/event/brand_intelligence/should_end() + if(!vending_machines.len) + return TRUE + if(!can_propagate(vender_zero)) + return TRUE + return FALSE + +/datum/event2/event/brand_intelligence/end() + if(can_propagate(vender_zero)) // The crew failed and all the machines are infected! + return + // Otherwise Vender Zero was taken out in some form. + if(vender_zero) + vender_zero.visible_message(span("notice", "\The [vender_zero]'s network activity light flickers wildly \ + for a few seconds as a small screen reads: 'Rolling out firmware reset to networked machines'.")) + for(var/obj/machinery/vending/vender in infected_vending_machines) + cure_vender(vender) + +/datum/event2/event/brand_intelligence/proc/infect_vender(obj/machinery/vending/V) + vending_machines -= V + infected_vending_machines += V + V.shut_up = FALSE + V.shoot_inventory = TRUE + +/datum/event2/event/brand_intelligence/proc/cure_vender(obj/machinery/vending/V) + infected_vending_machines -= V + V.shut_up = TRUE + V.shoot_inventory = FALSE + +/datum/event2/event/brand_intelligence/proc/can_propagate(obj/machinery/vending/V) + return V && V.shut_up == FALSE diff --git a/code/modules/gamemaster/event2/events/engineering/camera_damage.dm b/code/modules/gamemaster/event2/events/engineering/camera_damage.dm new file mode 100644 index 0000000000..c24fbb06f3 --- /dev/null +++ b/code/modules/gamemaster/event2/events/engineering/camera_damage.dm @@ -0,0 +1,41 @@ +/datum/event2/meta/camera_damage + name = "random camera damage" + departments = list(DEPARTMENT_SYNTHETIC, DEPARTMENT_ENGINEERING) + chaos = 5 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_LOW_IMPACT + reusable = TRUE + event_type = /datum/event2/event/camera_damage + +/datum/event2/meta/camera_damage/get_weight() + return 30 + (metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 20) + (metric.count_people_in_department(DEPARTMENT_SYNTHETIC) * 40) + +/datum/event2/event/camera_damage + var/camera_range = 7 + +/datum/event2/event/camera_damage/start() + var/obj/machinery/camera/C = acquire_random_camera() + if(!C) + return + + for(var/obj/machinery/camera/cam in range(camera_range, C)) + if(is_valid_camera(cam)) + cam.wires.UpdateCut(CAMERA_WIRE_POWER, 0) + if(prob(25)) + cam.wires.UpdateCut(CAMERA_WIRE_ALARM, 0) + +/datum/event2/event/camera_damage/proc/acquire_random_camera(var/remaining_attempts = 5) + if(!cameranet.cameras.len) + return + if(!remaining_attempts) + return + + var/obj/machinery/camera/C = pick(cameranet.cameras) + if(is_valid_camera(C)) + return C + // It is very important to use --var and not var-- for recursive calls, as var-- will cause an infinite loop. + return acquire_random_camera(--remaining_attempts) + +/datum/event2/event/camera_damage/proc/is_valid_camera(var/obj/machinery/camera/C) + // Only return a functional camera, not installed in a silicon/hardsuit/circuit/etc, and that exists somewhere players have access + var/turf/T = get_turf(C) + return T && C?.can_use() && istype(C.loc, /turf) && (T.z in using_map.player_levels) \ No newline at end of file diff --git a/code/modules/gamemaster/actions/canister_leak.dm b/code/modules/gamemaster/event2/events/engineering/canister_leak.dm similarity index 69% rename from code/modules/gamemaster/actions/canister_leak.dm rename to code/modules/gamemaster/event2/events/engineering/canister_leak.dm index 670b65c9fc..a48823151c 100644 --- a/code/modules/gamemaster/actions/canister_leak.dm +++ b/code/modules/gamemaster/event2/events/engineering/canister_leak.dm @@ -1,24 +1,26 @@ -// -// This event chooses a random canister on player levels and breaks it, releasing its contents! -// - -/datum/gm_action/canister_leak - name = "Canister Leak" - departments = list(DEPARTMENT_ENGINEERING) - chaotic = 20 - -/datum/gm_action/canister_leak/get_weight() - return metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 30 - -/datum/gm_action/canister_leak/start() - ..() - // List of all non-destroyed canisters on station levels - var/list/all_canisters = list() - for(var/obj/machinery/portable_atmospherics/canister/C in machines) - if(!C.destroyed && (C.z in using_map.station_levels) && C.air_contents.total_moles >= MOLES_CELLSTANDARD) - all_canisters += C - var/obj/machinery/portable_atmospherics/canister/C = pick(all_canisters) - log_debug("canister_leak event: Canister [C] ([C.x],[C.y],[C.z]) destroyed.") - C.health = 0 - C.healthcheck() - return +// +// This event chooses a random canister on player levels and breaks it, releasing its contents! +// + +/datum/event2/meta/canister_leak + name = "canister leak" + departments = list(DEPARTMENT_ENGINEERING) + chaos = 10 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_LOW_IMPACT + reusable = TRUE + event_type = /datum/event2/event/canister_leak + +/datum/event2/meta/canister_leak/get_weight() + return metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 30 + +/datum/event2/event/canister_leak/start() + // List of all non-destroyed canisters on station levels + var/list/all_canisters = list() + for(var/obj/machinery/portable_atmospherics/canister/C in machines) + if(!C.destroyed && (C.z in using_map.station_levels) && C.air_contents.total_moles >= MOLES_CELLSTANDARD) + all_canisters += C + var/obj/machinery/portable_atmospherics/canister/C = pick(all_canisters) + log_debug("canister_leak event: Canister [C] ([C.x],[C.y],[C.z]) destroyed.") + C.health = 0 + C.healthcheck() + diff --git a/code/modules/gamemaster/event2/events/engineering/dust.dm b/code/modules/gamemaster/event2/events/engineering/dust.dm new file mode 100644 index 0000000000..1a26118fbc --- /dev/null +++ b/code/modules/gamemaster/event2/events/engineering/dust.dm @@ -0,0 +1,19 @@ +/datum/event2/meta/dust + name = "dust" + departments = list(DEPARTMENT_ENGINEERING) + chaos = 10 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_LOW_IMPACT + reusable = TRUE + event_type = /datum/event2/event/dust + +/datum/event2/meta/dust/get_weight() + return metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 20 + + + +/datum/event2/event/dust/announce() + if(prob(33)) + command_announcement.Announce("Dust has been detected on a collision course with \the [location_name()].") + +/datum/event2/event/dust/start() + dust_swarm("norm") diff --git a/code/modules/gamemaster/event2/events/engineering/gas_leak.dm b/code/modules/gamemaster/event2/events/engineering/gas_leak.dm new file mode 100644 index 0000000000..fb8dc41f86 --- /dev/null +++ b/code/modules/gamemaster/event2/events/engineering/gas_leak.dm @@ -0,0 +1,47 @@ +/datum/event2/meta/gas_leak + name = "gas leak" + departments = list(DEPARTMENT_ENGINEERING, DEPARTMENT_SYNTHETIC) + chaos = 10 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_LOW_IMPACT + reusable = TRUE + event_type = /datum/event2/event/gas_leak + +/datum/event2/meta/gas_leak/get_weight() + // Synthetics are counted in higher value because they can wirelessly connect to alarms. + var/engineering_factor = metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 10 + var/synthetic_factor = metric.count_people_in_department(DEPARTMENT_SYNTHETIC) * 30 + return (15 + engineering_factor + synthetic_factor) / (times_ran + 1) + + + +/datum/event2/event/gas_leak + var/potential_gas_choices = list("carbon_dioxide", "sleeping_agent", "phoron", "volatile_fuel") + var/chosen_gas = null + var/turf/chosen_turf = null + +/datum/event2/event/gas_leak/set_up() + chosen_gas = pick(potential_gas_choices) + + var/list/turfs = find_random_turfs() + if(!turfs.len) + log_debug("Gas Leak event failed to find any available turfs to leak into. Aborting.") + abort() + return + chosen_turf = pick(turfs) + +/datum/event2/event/gas_leak/announce() + if(chosen_turf) + command_announcement.Announce("Warning, hazardous [lowertext(gas_data.name[chosen_gas])] gas leak detected in \the [chosen_turf.loc], evacuate the area.", "Hazard Alert") + +/datum/event2/event/gas_leak/start() + // Okay, time to actually put the gas in the room! + // TODO - Would be nice to break a waste pipe perhaps? + // TODO - Maybe having it released from a single point and thus causing airflow to blow stuff around + + // Fow now just add a bunch of it to the air + + var/datum/gas_mixture/air_contents = new + air_contents.temperature = T20C + rand(-50, 50) + air_contents.gas[chosen_gas] = 10 * MOLES_CELLSTANDARD + chosen_turf.assume_air(air_contents) + playsound(chosen_turf, 'sound/effects/smoke.ogg', 75, 1) \ No newline at end of file diff --git a/code/modules/gamemaster/event2/events/engineering/grid_check.dm b/code/modules/gamemaster/event2/events/engineering/grid_check.dm new file mode 100644 index 0000000000..8b081f29e2 --- /dev/null +++ b/code/modules/gamemaster/event2/events/engineering/grid_check.dm @@ -0,0 +1,52 @@ +// New grid check event: +// Very similar to the old one, power goes out in most of the station, however the new feature is the ability for engineering to +// get power back on sooner, if they are able to reach a special machine and initiate a manual reboot. If no one is able to do so, +// it will reboot itself after a few minutes, just like the old one. Bad things happen if there is no grid checker machine protecting +// the powernet when this event fires. + +/datum/event2/meta/grid_check + name = "grid check" + departments = list(DEPARTMENT_ENGINEERING, DEPARTMENT_EVERYONE) + chaos = 10 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_LOW_IMPACT + reusable = TRUE + event_type = /datum/event2/event/grid_check + +// Having the turbines be way over their rated limit makes grid checks more likely. +/datum/event2/meta/grid_check/proc/get_overpower() + var/highest_overpower = 0 + for(var/T in GLOB.all_turbines) + var/obj/machinery/power/generator/turbine = T + var/overpower = max((turbine.effective_gen / turbine.max_power) - 1, 0) + if(overpower > highest_overpower) + highest_overpower = overpower + return highest_overpower + +/datum/event2/meta/grid_check/get_weight() + var/population_factor = metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 10 + var/overpower_factor = 50 * get_overpower() // Will be 0 if not overloaded at all, and 50 if turbines are outputting twice as much as rated. + return (20 + population_factor + overpower_factor) / (times_ran + 1) + + + +/datum/event2/event/grid_check + var/obj/machinery/power/generator/engine // The turbine that will send a power spike. + +/datum/event2/event/grid_check/set_up() + // Find the turbine being pushed the most. + var/obj/machinery/power/generator/most_stressed_turbine = null + for(var/T in GLOB.all_turbines) + var/obj/machinery/power/generator/turbine = T + if(!most_stressed_turbine) + most_stressed_turbine = turbine + else if(turbine.effective_gen > most_stressed_turbine.effective_gen) + most_stressed_turbine = turbine + engine = most_stressed_turbine + +/datum/event2/event/grid_check/start() + // This sets off a chain of events that lead to the actual grid check (or perhaps worse). + // First, the Supermatter engine makes a power spike. + if(engine) + engine.power_spike() + // After that, the engine checks if a grid checker exists on the same powernet, and if so, it triggers a blackout. + // If not, lots of stuff breaks. See code/modules/power/generator.dm for that piece of code. diff --git a/code/modules/gamemaster/event2/events/engineering/meteor_defense.dm b/code/modules/gamemaster/event2/events/engineering/meteor_defense.dm new file mode 100644 index 0000000000..378c6b42fe --- /dev/null +++ b/code/modules/gamemaster/event2/events/engineering/meteor_defense.dm @@ -0,0 +1,83 @@ +// This event gives the station an advance warning about meteors, so that they can prepare in various ways. + +/datum/event2/meta/meteor_defense + name = "meteor defense" + departments = list(DEPARTMENT_ENGINEERING, DEPARTMENT_CARGO) + chaos = 50 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_HIGH_IMPACT + event_class = "meteor defense" + event_type = /datum/event2/event/meteor_defense + +/datum/event2/meta/meteor_defense/get_weight() + // Engineers count as 20. + var/engineers = metric.count_people_in_department(DEPARTMENT_ENGINEERING) + if(engineers < 3) // There -must- be at least three engineers for this to be possible. + return 0 + + . = engineers * 20 + + // Cargo and AI/borgs count as 10. + var/cargo = metric.count_people_with_job(/datum/job/cargo_tech) + metric.count_people_with_job(/datum/job/qm) + var/bots = metric.count_people_in_department(DEPARTMENT_SYNTHETIC) + + . += (cargo + bots) * 10 + + +/datum/event2/event/meteor_defense + start_delay_lower_bound = 10 MINUTES + start_delay_upper_bound = 15 MINUTES + var/soon_announced = FALSE + var/direction = null // Actual dir used for which side the meteors come from. + var/dir_text = null // Direction shown in the announcement. + var/list/meteor_types = null + var/waves = null // How many times to send meteors. + var/last_wave_time = null // world.time of latest wave. + var/wave_delay = 10 SECONDS + var/wave_upper_bound = 8 // Max amount of meteors per wave. + var/wave_lower_bound = 4 // Min amount. + +/datum/event2/event/meteor_defense/proc/set_meteor_types() + meteor_types = meteors_threatening.Copy() + +/datum/event2/event/meteor_defense/set_up() + direction = pick(cardinal) // alldirs doesn't work with current meteor code unfortunately. + waves = rand(3, 6) + switch(direction) + if(NORTH) + dir_text = "aft" // For some reason this is needed. + if(SOUTH) + dir_text = "fore" + if(EAST) + dir_text = "port" + if(WEST) + dir_text = "starboard" + set_meteor_types() + +/datum/event2/event/meteor_defense/announce() + var/announcement = "Meteors are expected to approach from the [dir_text] side, in approximately [DisplayTimeText(time_to_start - world.time, 60)]." + command_announcement.Announce(announcement, "Meteor Alert", new_sound = 'sound/AI/meteors.ogg') + +/datum/event2/event/meteor_defense/wait_tick() + if(!soon_announced) + if((time_to_start - world.time) <= 5 MINUTES) + soon_announced = TRUE + var/announcement = "The incoming meteors are expected to approach from the [dir_text] side. \ + ETA to arrival is approximately [DisplayTimeText(time_to_start - world.time, 60)]." + command_announcement.Announce(announcement, "Meteor Alert - Update") + +/datum/event2/event/meteor_defense/start() + command_announcement.Announce("Incoming meteors approach from \the [dir_text] side!", "Meteor Alert - Update") + +/datum/event2/event/meteor_defense/event_tick() + if(world.time > last_wave_time + wave_delay) + last_wave_time = world.time + waves-- + message_admins("[waves] more wave\s of meteors remain.") + // Dir is reversed because the direction describes where meteors are going, not what side it's gonna hit. + spawn_meteors(rand(wave_upper_bound, wave_lower_bound), meteor_types, reverse_dir[direction]) + +/datum/event2/event/meteor_defense/should_end() + return waves <= 0 + +/datum/event2/event/meteor_defense/end() + command_announcement.Announce("\The [location_name()] will clear the incoming meteors in a moment.", "Meteor Alert - Update") diff --git a/code/modules/gamemaster/event2/events/engineering/spacevine.dm b/code/modules/gamemaster/event2/events/engineering/spacevine.dm new file mode 100644 index 0000000000..5dd5d6b3a1 --- /dev/null +++ b/code/modules/gamemaster/event2/events/engineering/spacevine.dm @@ -0,0 +1,17 @@ +/datum/event2/meta/spacevine + name = "space-vine infestation" + departments = list(DEPARTMENT_ENGINEERING) + chaos = 10 // There's a really rare chance of vines getting something awful like phoron atmosphere but thats not really controllable. + chaotic_threshold = EVENT_CHAOS_THRESHOLD_MEDIUM_IMPACT + event_type = /datum/event2/event/spacevine + +/datum/event2/meta/spacevine/get_weight() + return 20 + (metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 20) + (metric.count_people_in_department(DEPARTMENT_EVERYONE) * 10) + + + +/datum/event2/event/spacevine/announce() + level_seven_announcement() + +/datum/event2/event/spacevine/start() + spacevine_infestation() diff --git a/code/modules/gamemaster/event2/events/engineering/wallrot.dm b/code/modules/gamemaster/event2/events/engineering/wallrot.dm new file mode 100644 index 0000000000..29d12c8524 --- /dev/null +++ b/code/modules/gamemaster/event2/events/engineering/wallrot.dm @@ -0,0 +1,46 @@ +/datum/event2/meta/wallrot + name = "wall-rot" + departments = list(DEPARTMENT_ENGINEERING) + reusable = TRUE + event_type = /datum/event2/event/wallrot + +/datum/event2/meta/wallrot/get_weight() + return (10 + metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 10) / (times_ran + 1) + + + + +/datum/event2/event/wallrot + var/turf/simulated/wall/origin = null + +/datum/event2/event/wallrot/set_up() + for(var/i = 1 to 100) + var/turf/candidate = locate(rand(1, world.maxx), rand(1, world.maxy), pick(get_location_z_levels()) ) + if(istype(candidate, /turf/simulated/wall)) + origin = candidate + log_debug("Wall-rot event has chosen \the [origin] ([origin.loc]) as the origin for the wallrot infestation.") + return + + log_debug("Wall-rot event failed to find a valid wall after one hundred tries. Aborting.") + abort() + +/datum/event2/event/wallrot/announce() + if(origin && prob(80)) + command_announcement.Announce("Harmful fungi detected on \the [location_name()], near \the [origin.loc]. \ + Station structural integrity may be compromised.", "Biohazard Alert") + +/datum/event2/event/wallrot/start() + if(origin) + origin.rot() + + var/rot_count = 0 + var/target_rot = rand(5, 20) + for(var/turf/simulated/wall/W in range(7, origin)) + if(prob(50)) + if(W.rot()) + rot_count++ + if(rot_count >= target_rot) + break + + + diff --git a/code/modules/gamemaster/event2/events/engineering/window_break.dm b/code/modules/gamemaster/event2/events/engineering/window_break.dm new file mode 100644 index 0000000000..0b02e78b3d --- /dev/null +++ b/code/modules/gamemaster/event2/events/engineering/window_break.dm @@ -0,0 +1,148 @@ +// This event causes a random window near space to become damaged. +// If that window is not fixed in a certain amount of time, +// that window and nearby windows will shatter, causing a breach. + +/datum/event2/meta/window_break + name = "window break" + departments = list(DEPARTMENT_ENGINEERING) + chaos = 10 + reusable = TRUE + chaotic_threshold = EVENT_CHAOS_THRESHOLD_MEDIUM_IMPACT + event_type = /datum/event2/event/window_break + +/datum/event2/meta/window_break/get_weight() + return metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 20 + + + +/datum/event2/event/window_break + announce_delay_lower_bound = 10 SECONDS + announce_delay_upper_bound = 20 SECONDS + length_lower_bound = 8 MINUTES + length_upper_bound = 12 MINUTES + var/turf/chosen_turf_with_windows = null + var/obj/structure/window/chosen_window = null + var/list/collateral_windows = list() + +/datum/event2/event/window_break/set_up() + var/list/areas = find_random_areas() + if(!LAZYLEN(areas)) + log_debug("Window Break event could not find any areas. Aborting.") + abort() + return + + while(areas.len) + var/area/area = pick(areas) + areas -= area + + for(var/obj/structure/window/W in area.contents) + if(!is_window_to_space(W)) + continue + chosen_turf_with_windows = get_turf(W) + collateral_windows = gather_collateral_windows(W) + break // Break out of the inner loop. + + if(chosen_turf_with_windows) + log_debug("Window Break event has chosen turf '[chosen_turf_with_windows.name]' in [chosen_turf_with_windows.loc].") + break // Then the outer loop. + + if(!chosen_turf_with_windows) + log_debug("Window Break event could not find a turf with valid windows to break. Aborting.") + abort() + return + +/datum/event2/event/window_break/announce() + if(chosen_window) + command_announcement.Announce("Structural integrity of space-facing windows at \the [get_area(chosen_turf_with_windows)] are failing. \ + Repair of the damaged window is advised. Personnel without EVA suits in the area should leave until repairs are complete.", "Structural Alert") + +/datum/event2/event/window_break/start() + if(!chosen_turf_with_windows) + return + + for(var/obj/structure/window/W in chosen_turf_with_windows.contents) + if(W.is_fulltile()) // Full tile windows are simple and can always be used. + chosen_window = W + break + else // Otherwise we only want the window that is on the inside side of the station. + var/turf/T = get_step(W, W.dir) + if(T.is_space()) + continue + if(T.check_density()) + continue + chosen_window = W + break + + if(!chosen_window) + return + + chosen_window.take_damage(chosen_window.maxhealth * 0.8) + playsound(chosen_window, 'sound/effects/Glasshit.ogg', 100, 1) + chosen_window.visible_message(span("danger", "\The [chosen_window] suddenly begins to crack!")) + +/datum/event2/event/window_break/should_end() + . = ..() + if(!.) // If the timer didn't expire, we can still end it early if someone messes up. + if(!chosen_window || !chosen_window.anchored || chosen_window.health == chosen_window.maxhealth) + // If the window got deconstructed/moved/etc, immediately end and make the breach happen. + // Also end early if it was repaired. + return TRUE + +/datum/event2/event/window_break/end() + // If someone fixed the window, then everything is fine. + if(chosen_window && chosen_window.anchored && chosen_window.health == chosen_window.maxhealth) + log_debug("Window Break event ended with window repaired.") + return + + // Otherwise a bunch of windows shatter. + chosen_window?.shatter() + + var/windows_to_shatter = min(rand(4, 10), collateral_windows.len) + for(var/i = 1 to windows_to_shatter) + var/obj/structure/window/W = collateral_windows[i] + W?.shatter() + + log_debug("Window Break event ended with [windows_to_shatter] shattered windows and a breach.") + +// Checks if a window is adjacent to a space tile, and also that the opposite direction is open. +// This is done to avoid getting caught in corner parts of windows. +/datum/event2/event/window_break/proc/is_window_to_space(obj/structure/window/W) + for(var/direction in GLOB.cardinal) + var/turf/T = get_step(W, direction) + if(T.is_space()) + var/turf/opposite_T = get_step(W, GLOB.reverse_dir[direction]) + if(!opposite_T.check_density()) + return TRUE + return FALSE + +//TL;DR: breadth first search for all connected turfs with windows +/datum/event2/event/window_break/proc/gather_collateral_windows(var/obj/structure/window/target_window) + var/list/turf/frontier_set = list(target_window.loc) + var/list/obj/structure/window/result_set = list() + var/list/turf/explored_set = list() + + while(frontier_set.len > 0) + var/turf/current = frontier_set[1] + frontier_set -= current + explored_set += current + + var/contains_windows = 0 + for(var/obj/structure/window/to_add in current.contents) + contains_windows = 1 + result_set += to_add + + if(contains_windows) + //add adjacent turfs to be checked for windows as well + var/turf/neighbor = locate(current.x + 1, current.y, current.z) + if(!(neighbor in frontier_set) && !(neighbor in explored_set)) + frontier_set += neighbor + neighbor = locate(current.x - 1, current.y, current.z) + if(!(neighbor in frontier_set) && !(neighbor in explored_set)) + frontier_set += neighbor + neighbor = locate(current.x, current.y + 1, current.z) + if(!(neighbor in frontier_set) && !(neighbor in explored_set)) + frontier_set += neighbor + neighbor = locate(current.x, current.y - 1, current.z) + if(!(neighbor in frontier_set) && !(neighbor in explored_set)) + frontier_set += neighbor + return result_set diff --git a/code/modules/gamemaster/event2/events/everyone/comms_blackout.dm b/code/modules/gamemaster/event2/events/everyone/comms_blackout.dm new file mode 100644 index 0000000000..6da19c32cc --- /dev/null +++ b/code/modules/gamemaster/event2/events/everyone/comms_blackout.dm @@ -0,0 +1,43 @@ +/datum/event2/meta/comms_blackout + name = "communications blackout" + departments = list(DEPARTMENT_EVERYONE) // It's not an engineering event because engineering can't do anything to help . . . for now. + chaos = 10 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_MEDIUM_IMPACT + reusable = TRUE + event_type = /datum/event2/event/comms_blackout + +/datum/event2/meta/comms_blackout/get_weight() + return 50 + metric.count_people_in_department(DEPARTMENT_EVERYONE) * 5 + + + +/datum/event2/event/comms_blackout/announce() + var/alert = pick("Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you*%fj00)`5vc-BZZT", \ + "Ionospheric anomalies detected. Temporary telecommunication failu*3mga;b4;'1v¬-BZZZT", \ + "Ionospheric anomalies detected. Temporary telec#MCi46:5.;@63-BZZZZT", \ + "Ionospheric anomalies dete'fZ\\kg5_0-BZZZZZT", \ + "Ionospheri:%£ MCayj^j<.3-BZZZZZZT", \ + "#4nd%;f4y6,>£%-BZZZZZZZT") + if(prob(33)) + command_announcement.Announce(alert, new_sound = 'sound/misc/interference.ogg') + // AIs will always know if there's a comm blackout, rogue AIs could then lie about comm blackouts in the future while they shutdown comms + for(var/mob/living/silicon/ai/A in player_list) + to_chat(A, "
") + to_chat(A, "[alert]") + to_chat(A, "
") + +/datum/event2/event/comms_blackout/start() + if(prob(50)) + // One in two chance for the radios to turn i%t# t&_)#%, which can be more alarming than radio silence. + log_debug("Doing partial outage of telecomms.") + for(var/obj/machinery/telecomms/processor/P in telecomms_list) + P.emp_act(1) + else + // Otherwise just shut everything down, madagascar style. + log_debug("Doing complete outage of telecomms.") + for(var/obj/machinery/telecomms/T in telecomms_list) + T.emp_act(1) + + // Communicators go down no matter what. + for(var/obj/machinery/exonet_node/N in machines) + N.emp_act(1) diff --git a/code/modules/gamemaster/event2/events/everyone/electrical_fault.dm b/code/modules/gamemaster/event2/events/everyone/electrical_fault.dm new file mode 100644 index 0000000000..6467646f1b --- /dev/null +++ b/code/modules/gamemaster/event2/events/everyone/electrical_fault.dm @@ -0,0 +1,99 @@ +// Makes a spooky electrical thing happen, that can blow the lights or make the APCs turn off for a short period of time. +// Doesn't do any permanent damage beyond the small chance to emag an APC, which just unlocks it forever. As such, this is free to occur even with no engineers. +// Since this is an 'external' thing, the Grid Checker can't stop it. + +/datum/event2/meta/electrical_fault + name = "electrical fault" + departments = list(DEPARTMENT_EVERYONE) + chaos = 10 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_LOW_IMPACT + event_type = /datum/event2/event/electrical_fault + +/datum/event2/meta/electrical_fault/get_weight() + return 10 + (metric.count_people_in_department(DEPARTMENT_EVERYONE) * 5) + + +/datum/event2/event/electrical_fault + start_delay_lower_bound = 30 SECONDS + start_delay_upper_bound = 1 MINUTE + length_lower_bound = 20 SECONDS + length_upper_bound = 40 SECONDS + var/max_apcs_per_tick = 6 + + var/list/valid_apcs = null + var/list/valid_z_levels = null + + var/apcs_disabled = 0 + var/apcs_overloaded = 0 + var/apcs_emagged = 0 + +/datum/event2/event/electrical_fault/announce() + // Trying to be vague to avoid 'space lightning storms'. + // This could be re-flavored to be a solar flare or something and have robots outside be sad. + command_announcement.Announce("External conditions near \the [location_name()] are likely \ + to cause voltage spikes and other electrical issues very soon. Please secure sensitive electrical equipment until the situation passes.", "[location_name()] Sensor Array") + +/datum/event2/event/electrical_fault/set_up() + valid_z_levels = get_location_z_levels() + valid_z_levels -= using_map.sealed_levels // Space levels only please! + + valid_apcs = list() + for(var/obj/machinery/power/apc/A in global.machines) + if(A.z in valid_z_levels) + valid_apcs += A + +/datum/event2/event/electrical_fault/start() + command_announcement.Announce("Irregularities detected in \the [location_name()] power grid.", "[location_name()] Power Grid Monitoring") + +/datum/event2/event/electrical_fault/event_tick() + if(!valid_apcs.len) + log_debug("ELECTRICAL EVENT: No valid APCs found for electrical fault event. Aborting.") + abort() + return + + var/list/picked_apcs = list() + for(var/i = 1 to max_apcs_per_tick) + picked_apcs |= pick(valid_apcs) + + for(var/A in picked_apcs) + affect_apc(A) + +/datum/event2/event/electrical_fault/end() + command_announcement.Announce("The irregular electrical conditions inside \the [location_name()] power grid has ceased.", "[location_name()] Power Grid Monitoring") + log_debug("Electrical Fault event caused [apcs_disabled] APC\s to shut off, \ + [apcs_overloaded] APC\s to overload lighting, and [apcs_emagged] APC\s to be emagged.") + +/datum/event2/event/electrical_fault/proc/affect_apc(obj/machinery/power/apc/A) + // Main breaker is turned off or is Special(tm). Consider it protected. + // Important APCs like the AI or the engine core shouldn't get shut off by this event. + if((!A.operating || A.failure_timer > 0) || A.is_critical) + return + + // In reality this would probably make the lights get brighter but oh well. + for(var/obj/machinery/light/L in get_area(A)) + L.flicker(rand(10, 20)) + + // Chance to make the APC turn off for awhile. + // This will actually protect it from further damage. + if(prob(25)) + A.energy_fail(rand(60, 120)) + log_debug("ELECTRICAL EVENT: Disabled \the [A]'s power for a temporary amount of time.") + playsound(A, 'sound/machines/defib_success.ogg', 50, 1) + apcs_disabled++ + return + + // Decent chance to overload lighting circuit. + if(prob(30)) + A.overload_lighting() + log_debug("ELECTRICAL EVENT: Overloaded \the [A]'s lighting.") + playsound(A, 'sound/effects/lightningshock.ogg', 50, 1) + apcs_overloaded++ + + // Relatively small chance to emag the apc as apc_damage event does. + if(prob(5)) + A.emagged = TRUE + A.update_icon() + log_debug("ELECTRICAL EVENT: Emagged \the [A].") + playsound(A, 'sound/machines/chime.ogg', 50, 1) + apcs_emagged++ + diff --git a/code/modules/gamemaster/event2/events/everyone/gravity.dm b/code/modules/gamemaster/event2/events/everyone/gravity.dm new file mode 100644 index 0000000000..37a0e2daeb --- /dev/null +++ b/code/modules/gamemaster/event2/events/everyone/gravity.dm @@ -0,0 +1,34 @@ +/datum/event2/meta/gravity + name = "gravity failure" + departments = list(DEPARTMENT_EVERYONE) + chaos = 20 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_LOW_IMPACT + reusable = TRUE + event_type = /datum/event2/event/gravity + +/datum/event2/meta/gravity/get_weight() + return (20 + (metric.count_people_in_department(DEPARTMENT_EVERYONE) * 20)) / (times_ran + 1) + + + + +/datum/event2/event/gravity + length_lower_bound = 5 MINUTES + length_upper_bound = 10 MINUTES + +/datum/event2/event/gravity/announce() + command_announcement.Announce("Feedback surge detected in mass-distributions systems. \ + Artificial gravity has been disabled whilst the system reinitializes. \ + Please stand by while the gravity system reinitializes.", "Gravity Failure") + +/datum/event2/event/gravity/start() + for(var/area/A in all_areas) + if(A.z in get_location_z_levels()) + A.gravitychange(FALSE) + +/datum/event2/event/gravity/end() + for(var/area/A in all_areas) + if(A.z in get_location_z_levels()) + A.gravitychange(TRUE) + + command_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.", "Gravity Restored") \ No newline at end of file diff --git a/code/modules/gamemaster/event2/events/everyone/infestation.dm b/code/modules/gamemaster/event2/events/everyone/infestation.dm new file mode 100644 index 0000000000..f51456f362 --- /dev/null +++ b/code/modules/gamemaster/event2/events/everyone/infestation.dm @@ -0,0 +1,72 @@ +/datum/event2/meta/infestation + event_class = "infestation" + departments = list(DEPARTMENT_EVERYONE) + +/datum/event2/meta/infestation/get_weight() + return metric.count_people_in_department(DEPARTMENT_EVERYONE) * 10 + +/datum/event2/meta/infestation/rodents + name = "infestation - rodents" + event_type = /datum/event2/event/infestation/rodents + +/datum/event2/meta/infestation/lizards + name = "infestation - lizards" + event_type = /datum/event2/event/infestation/lizards + +/datum/event2/meta/infestation/spiderlings + name = "infestation - spiders" + event_type = /datum/event2/event/infestation/spiderlings + + +/datum/event2/event/infestation + var/vermin_string = null + var/max_vermin = 0 + var/list/things_to_spawn = list() + + var/list/turfs = list() + +/datum/event2/event/infestation/rodents + vermin_string = "rodents" + max_vermin = 12 + things_to_spawn = list( + /mob/living/simple_mob/animal/passive/mouse/gray, + /mob/living/simple_mob/animal/passive/mouse/brown, + /mob/living/simple_mob/animal/passive/mouse/white, + /mob/living/simple_mob/animal/passive/mouse/rat + ) + +/datum/event2/event/infestation/lizards + vermin_string = "lizards" + max_vermin = 6 + things_to_spawn = list( + /mob/living/simple_mob/animal/passive/lizard, + /mob/living/simple_mob/animal/passive/lizard/large, + /mob/living/simple_mob/animal/passive/lizard/large/defensive + ) + +/datum/event2/event/infestation/spiderlings + vermin_string = "spiders" + max_vermin = 3 + things_to_spawn = list(/obj/effect/spider/spiderling/non_growing) + + +/datum/event2/event/infestation/set_up() + turfs = find_random_turfs(max_vermin) + if(!turfs.len) + log_debug("Infestation event failed to find any valid turfs. Aborting.") + abort() + return + +/datum/event2/event/infestation/announce() + var/turf/T = turfs[1] + command_announcement.Announce("Bioscans indicate that [vermin_string] have been breeding \ + in \the [T.loc]. Clear them out, before this starts to affect productivity.", "Vermin infestation") + + +/datum/event2/event/infestation/start() + var/vermin_to_spawn = rand(2, max_vermin) + for(var/i = 1 to vermin_to_spawn) + var/turf/T = pick(turfs) + turfs -= T + var/spawn_type = pick(things_to_spawn) + new spawn_type(T) diff --git a/code/modules/gamemaster/event2/events/everyone/pda_spam.dm b/code/modules/gamemaster/event2/events/everyone/pda_spam.dm new file mode 100644 index 0000000000..b56687283c --- /dev/null +++ b/code/modules/gamemaster/event2/events/everyone/pda_spam.dm @@ -0,0 +1,137 @@ +/datum/event2/meta/pda_spam + name = "pda spam" + departments = list(DEPARTMENT_EVERYONE) + event_type = /datum/event2/event/pda_spam + +/datum/event2/meta/pda_spam/get_weight() + return metric.count_people_in_department(DEPARTMENT_EVERYONE) * 2 + + +/datum/event2/event/pda_spam + length_lower_bound = 30 MINUTES + length_upper_bound = 1 HOUR + var/spam_debug = FALSE // If true, notices of the event sending spam go to `log_debug()`. + var/last_spam_time = null // world.time of most recent spam. + var/next_spam_attempt_time = 0 // world.time of next attempt to try to spam. + var/give_up_after = 5 MINUTES + var/obj/machinery/message_server/MS = null + var/obj/machinery/exonet_node/node = null + +/datum/event2/event/pda_spam/set_up() + last_spam_time = world.time // So it won't immediately give up. + MS = pick_message_server() + node = get_exonet_node() + +/datum/event2/event/pda_spam/event_tick() + if(!can_spam()) + return + + if(world.time < next_spam_attempt_time) + return + + next_spam_attempt_time = world.time + rand(30 SECONDS, 2 MINUTES) + + var/obj/item/device/pda/P = null + var/list/viables = list() + + for(var/obj/item/device/pda/check_pda in sortAtom(PDAs)) + if(!check_pda.owner || check_pda.toff || check_pda.hidden || check_pda.spam_proof) + continue + viables += check_pda + + if(!viables.len) + return + + P = pick(viables) + var/list/spam = generate_spam() + + if(MS.send_pda_message("[P.owner]", spam[1], spam[2])) // Message been filtered by spam filter. + return + + send_spam(P, spam[1], spam[2]) + + +/datum/event2/event/pda_spam/should_end() + . = ..() + if(!.) + // Give up if nobody was reachable for five minutes. + if(last_spam_time + give_up_after < world.time) + log_debug("PDA Spam event giving up after not being able to spam for awhile.") + return TRUE + +/datum/event2/event/pda_spam/proc/can_spam() + if(!node || !node.on || !node.allow_external_PDAs) + node = get_exonet_node() + return FALSE + + if(!MS || !MS.active) + MS = pick_message_server() + return FALSE + + return TRUE + +// Returns a list containing two items, the sender and message. +/datum/event2/event/pda_spam/proc/generate_spam() + var/sender = null + var/message = null + switch(rand(1, 7)) + if(1) + sender = pick("MaxBet","MaxBet Online Casino","There is no better time to register","I'm excited for you to join us") + message = pick("Triple deposits are waiting for you at MaxBet Online when you register to play with us.",\ + "You can qualify for a 200% Welcome Bonus at MaxBet Online when you sign up today.",\ + "Once you are a player with MaxBet, you will also receive lucrative weekly and monthly promotions.",\ + "You will be able to enjoy over 450 top-flight casino games at MaxBet.") + if(2) + sender = pick(300;"QuickDatingSystem",200;"Find your russian bride",50;"Tajaran beauties are waiting",50;"Find your secret skrell crush",50;"Beautiful unathi brides") + message = pick("Your profile caught my attention and I wanted to write and say hello (QuickDating).",\ + "If you will write to me on my email [pick(first_names_female)]@[pick(last_names)].[pick("ru","ck","tj","ur","nt")] I shall necessarily send you a photo (QuickDating).",\ + "I want that we write each other and I hope, that you will like my profile and you will answer me (QuickDating).",\ + "You have (1) new message!",\ + "You have (2) new profile views!") + if(3) + sender = pick("Galactic Payments Association","Better Business Bureau","[using_map.starsys_name] E-Payments","NAnoTransen Finance Deparmtent","Luxury Replicas") + message = pick("Luxury watches for Blowout sale prices!",\ + "Watches, Jewelry & Accessories, Bags & Wallets !",\ + "Deposit 100$ and get 300$ totally free!",\ + " 100K NT.|WOWGOLD õnly $89 ",\ + "We have been filed with a complaint from one of your customers in respect of their business relations with you.",\ + "We kindly ask you to open the COMPLAINT REPORT (attached) to reply on this complaint..") + if(4) + sender = pick("Buy Dr. Maxman","Having dysfuctional troubles?") + message = pick("DR MAXMAN: REAL Doctors, REAL Science, REAL Results!",\ + "Dr. Maxman was created by George Acuilar, M.D, a [using_map.boss_short] Certified Urologist who has treated over 70,000 patients sector wide with 'male problems'.",\ + "After seven years of research, Dr Acuilar and his team came up with this simple breakthrough male enhancement formula.",\ + "Men of all species report AMAZING increases in length, width and stamina.") + if(5) + sender = pick("Dr","Crown prince","King Regent","Professor","Captain") + sender += " " + pick("Robert","Alfred","Josephat","Kingsley","Sehi","Zbahi") + sender += " " + pick("Mugawe","Nkem","Gbatokwia","Nchekwube","Ndim","Ndubisi") + message = pick("YOUR FUND HAS BEEN MOVED TO [uppertext(pick("Salusa","Segunda","Cepheus","Andromeda","Gruis","Corona","Aquila","ARES","Asellus"))] DEVELOPMENTARY BANK FOR ONWARD REMITTANCE.",\ + "We are happy to inform you that due to the delay, we have been instructed to IMMEDIATELY deposit all funds into your account",\ + "Dear fund beneficiary, We have please to inform you that overdue funds payment has finally been approved and released for payment",\ + "Due to my lack of agents I require an off-world financial account to immediately deposit the sum of 1 POINT FIVE MILLION credits.",\ + "Greetings sir, I regretfully to inform you that as I lay dying here due to my lack ofheirs I have chosen you to recieve the full sum of my lifetime savings of 1.5 billion credits") + if(6) + sender = pick("[using_map.company_name] Morale Divison","Feeling Lonely?","Bored?","www.wetskrell.nt") + message = pick("The [using_map.company_name] Morale Division wishes to provide you with quality entertainment sites.",\ + "WetSkrell.nt is a xenophillic website endorsed by NT for the use of male crewmembers among it's many stations and outposts.",\ + "Wetskrell.nt only provides the higest quality of male entertaiment to [using_map.company_name] Employees.",\ + "Simply enter your [using_map.company_name] Bank account system number and pin. With three easy steps this service could be yours!") + if(7) + sender = pick("You have won free tickets!","Click here to claim your prize!","You are the 1000th vistor!","You are our lucky grand prize winner!") + message = pick("You have won tickets to the newest ACTION JAXSON MOVIE!",\ + "You have won tickets to the newest crime drama DETECTIVE MYSTERY IN THE CLAMITY CAPER!",\ + "You have won tickets to the newest romantic comedy 16 RULES OF LOVE!",\ + "You have won tickets to the newest thriller THE CULT OF THE SLEEPING ONE!") + return list(sender, message) + +/datum/event2/event/pda_spam/proc/send_spam(obj/item/device/pda/P, sender, message) + last_spam_time = world.time + P.spam_message(sender, message) + if(spam_debug) + log_debug("PDA Spam event sent spam to \the [P].") + + +/datum/event2/event/pda_spam/proc/pick_message_server() + if(LAZYLEN(message_servers)) + return pick(message_servers) diff --git a/code/modules/gamemaster/event2/events/everyone/radiation_storm.dm b/code/modules/gamemaster/event2/events/everyone/radiation_storm.dm new file mode 100644 index 0000000000..ebd137b404 --- /dev/null +++ b/code/modules/gamemaster/event2/events/everyone/radiation_storm.dm @@ -0,0 +1,49 @@ +/datum/event2/meta/radiation_storm + name = "radiation storm" + departments = list(DEPARTMENT_EVERYONE) + chaos = 20 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_MEDIUM_IMPACT + event_type = /datum/event2/event/radiation_storm + +/datum/event2/meta/radiation_storm/get_weight() + var/medical_factor = metric.count_people_in_department(DEPARTMENT_MEDICAL) * 10 + var/population_factor = metric.count_people_in_department(DEPARTMENT_EVERYONE) * 5 // Note medical people will get counted twice at 25 weight. + return 20 + medical_factor + population_factor + + + +/datum/event2/event/radiation_storm + start_delay_lower_bound = 1 MINUTE + length_lower_bound = 1 MINUTE + +/datum/event2/event/radiation_storm/announce() + command_announcement.Announce("High levels of radiation detected near \the [location_name()]. \ + Please evacuate into one of the shielded maintenance tunnels.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg') + make_maint_all_access() + +/datum/event2/event/radiation_storm/start() + command_announcement.Announce("The station has entered the radiation belt. \ + Please remain in a sheltered area until we have passed the radiation belt.", "Anomaly Alert") + +/datum/event2/event/radiation_storm/event_tick() + radiate() + +/datum/event2/event/radiation_storm/proc/radiate() + var/radiation_level = rand(15, 35) + for(var/z in using_map.station_levels) + SSradiation.z_radiate(locate(1, 1, z), radiation_level, 1) + +/datum/event2/event/radiation_storm/end() + command_announcement.Announce("The station has passed the radiation belt. \ + Please allow for up to one minute while radiation levels dissipate, and report to \ + medbay if you experience any unusual symptoms. Maintenance will lose all \ + access again shortly.", "Anomaly Alert") + addtimer(CALLBACK(src, .proc/maint_callback), 2 MINUTES) + +/datum/event2/event/radiation_storm/proc/maint_callback() + revoke_maint_all_access() + + +// There is no actual radiation during a fake storm. +/datum/event2/event/radiation_storm/fake/radiate() + return diff --git a/code/modules/gamemaster/event2/events/everyone/random_antag.dm b/code/modules/gamemaster/event2/events/everyone/random_antag.dm new file mode 100644 index 0000000000..fe3b58be8c --- /dev/null +++ b/code/modules/gamemaster/event2/events/everyone/random_antag.dm @@ -0,0 +1,31 @@ +// No idea if this is needed for autotraitor or not. +// If it is, it shouldn't depend on the event system, but fixing that would be it's own project. +// If not, it can stay off until an admin wants to play with it. + +/datum/event2/meta/random_antagonist + name = "random antagonist" + enabled = FALSE + reusable = TRUE + chaos = 0 // This is zero due to the event system not being able to know if an antag actually got spawned or not. + departments = list(DEPARTMENT_EVERYONE) + chaotic_threshold = EVENT_CHAOS_THRESHOLD_MEDIUM_IMPACT + event_type = /datum/event2/event/random_antagonist + +// This has an abnormally high weight due to antags being very important for the round, +// however the weight will decay with more antags, and more attempts to add antags. +/datum/event2/meta/random_antagonist/get_weight() + var/antags = metric.count_all_antags() + return 200 / (antags + times_ran + 1) + + + +// The random spawn proc on the antag datum will handle announcing the spawn and whatnot, in theory. +/datum/event2/event/random_antagonist/start() + var/list/valid_types = list() + for(var/antag_type in all_antag_types) + var/datum/antagonist/antag = all_antag_types[antag_type] + if(antag.flags & ANTAG_RANDSPAWN) + valid_types |= antag + if(valid_types.len) + var/datum/antagonist/antag = pick(valid_types) + antag.attempt_random_spawn() diff --git a/code/modules/gamemaster/event2/events/everyone/solar_storm.dm b/code/modules/gamemaster/event2/events/everyone/solar_storm.dm new file mode 100644 index 0000000000..b73df66076 --- /dev/null +++ b/code/modules/gamemaster/event2/events/everyone/solar_storm.dm @@ -0,0 +1,52 @@ +/datum/event2/meta/solar_storm + name = "solar storm" + reusable = TRUE + event_type = /datum/event2/event/solar_storm + +/datum/event2/meta/solar_storm/get_weight() + var/population_factor = metric.count_people_in_department(DEPARTMENT_ENGINEERING) * 10 + var/space_factor = metric.count_all_space_mobs() * 50 + return (20 + population_factor + space_factor) / (times_ran + 1) + + +/datum/event2/event/solar_storm + start_delay_lower_bound = 1 MINUTE + start_delay_upper_bound = 1 MINUTE + length_lower_bound = 2 MINUTES + length_upper_bound = 4 MINUTES + var/base_solar_gen_rate = null + +/datum/event2/event/solar_storm/announce() + command_announcement.Announce("A solar storm has been detected approaching \the [station_name()]. \ + Please halt all EVA activites immediately and return to the interior of the station.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg') + adjust_solar_output(1.5) + +/datum/event2/event/solar_storm/start() + command_announcement.Announce("The solar storm has reached the station. Please refain from EVA and remain inside the station until it has passed.", "Anomaly Alert") + adjust_solar_output(5) + +/datum/event2/event/solar_storm/event_tick() + radiate() + +/datum/event2/event/solar_storm/end() + command_announcement.Announce("The solar storm has passed the station. It is now safe to resume EVA activities. \ + Please report to medbay if you experience any unusual symptoms.", "Anomaly Alert") + adjust_solar_output(1) + +/datum/event2/event/solar_storm/proc/adjust_solar_output(var/mult = 1) + if(isnull(base_solar_gen_rate)) + base_solar_gen_rate = GLOB.solar_gen_rate + GLOB.solar_gen_rate = mult * base_solar_gen_rate + +/datum/event2/event/solar_storm/proc/radiate() + // Note: Too complicated to be worth trying to use the radiation system for this. Its only in space anyway, so we make an exception in this case. + for(var/mob/living/L in player_list) + var/turf/T = get_turf(L) + if(!T) + continue + + if(!istype(T.loc,/area/space) && !istype(T,/turf/space)) //Make sure you're in a space area or on a space turf + continue + + //Todo: Apply some burn damage from the heat of the sun. Until then, enjoy some moderate radiation. + L.rad_act(rand(15, 30)) diff --git a/code/modules/gamemaster/event2/events/everyone/sudden_weather_shift.dm b/code/modules/gamemaster/event2/events/everyone/sudden_weather_shift.dm new file mode 100644 index 0000000000..2d83209612 --- /dev/null +++ b/code/modules/gamemaster/event2/events/everyone/sudden_weather_shift.dm @@ -0,0 +1,45 @@ +/datum/event2/meta/sudden_weather_shift + name = "sudden weather shift" + departments = list(DEPARTMENT_EVERYONE) + reusable = TRUE + event_type = /datum/event2/event/sudden_weather_shift + +/datum/event2/meta/sudden_weather_shift/get_weight() + // The proc name is a bit misleading, it only counts players outside, not all mobs. + return (metric.count_all_outdoor_mobs() * 20) / (times_ran + 1) + +/datum/event2/event/sudden_weather_shift + start_delay_lower_bound = 30 SECONDS + start_delay_upper_bound = 1 MINUTE + var/datum/planet/chosen_planet = null + +/datum/event2/event/sudden_weather_shift/set_up() + if(!LAZYLEN(SSplanets.planets)) + log_debug("Weather shift event was ran when no planets exist. Aborting.") + abort() + return + + chosen_planet = pick(SSplanets.planets) + +/datum/event2/event/sudden_weather_shift/announce() + if(!chosen_planet) + return + command_announcement.Announce("Local weather patterns on [chosen_planet.name] suggest that a \ + sudden atmospheric fluctuation has occurred. All groundside personnel should be wary of \ + rapidly deteriorating conditions.", "Weather Alert") + +/datum/event2/event/sudden_weather_shift/start() + // Using the roundstart weather list is handy, because it avoids the chance of choosing a bus-only weather. + // It also makes this event generic and suitable for other planets besides the main one, with no additional code needed. + // Only flaw is that roundstart weathers are -usually- safe ones, but we can fix that by tweaking a copy of it. + var/list/weather_choices = chosen_planet.weather_holder.roundstart_weather_chances.Copy() + var/list/new_weather_weights = list() + + // A lazy way of inverting the odds is to use some division. + for(var/weather in weather_choices) + new_weather_weights[weather] = 100 / weather_choices[weather] + + // Now choose a new weather. + var/new_weather = pickweight(new_weather_weights) + log_debug("Sudden weather shift event is now changing [chosen_planet.name]'s weather to [new_weather].") + chosen_planet.weather_holder.change_weather(new_weather) diff --git a/code/modules/gamemaster/event2/events/ghost_pod_spawner.dm b/code/modules/gamemaster/event2/events/ghost_pod_spawner.dm new file mode 100644 index 0000000000..4c462d06d6 --- /dev/null +++ b/code/modules/gamemaster/event2/events/ghost_pod_spawner.dm @@ -0,0 +1,21 @@ +// Generic subtype for events that make ghost pods. + +/datum/event2/event/ghost_pod_spawner + var/pod_type = null + var/list/desired_turf_areas = list() // If this is left empty, it will default to a global list of 'station' turfs. + var/list/free_turfs = list() + +/datum/event2/event/ghost_pod_spawner/set_up() + free_turfs = find_random_turfs(5, desired_turf_areas) + + if(!free_turfs.len) + log_debug("Ghost Pod Spawning event failed to find a place to spawn. Aborting.") + abort() + return + +/datum/event2/event/ghost_pod_spawner/start() + var/obj/structure/ghost_pod/pod = new pod_type(pick(free_turfs)) + post_pod_creation(pod) + +// Override to do things to the pod after it's spawned. +/datum/event2/event/ghost_pod_spawner/proc/post_pod_creation(obj/structure/ghost_pod/pod) \ No newline at end of file diff --git a/code/modules/gamemaster/event2/events/legacy/legacy.dm b/code/modules/gamemaster/event2/events/legacy/legacy.dm new file mode 100644 index 0000000000..6f70cafa85 --- /dev/null +++ b/code/modules/gamemaster/event2/events/legacy/legacy.dm @@ -0,0 +1,63 @@ +// This is a somewhat special type of event, that bridges to the old event datum and makes it work with the new system. +// It acts as a compatability layer between the old event, and the new GM system. +// This is possible because the new datum is mostly a superset of the old one. +/datum/event2/event/legacy + var/datum/event/legacy_event = null + + // Used to emulate legacy's `activeFor` tick counter. + var/tick_count = 0 + + // How 'severe' the legacy event should be. This should only be used for legacy events, as severity is an outdated concept for the GM system. + var/severity = EVENT_LEVEL_MODERATE + +/datum/event2/meta/legacy/get_weight() + return 50 + +/datum/event2/event/legacy/process() + ..() + tick_count++ + +/datum/event2/event/legacy/set_up() + legacy_event = new legacy_event(null, external_use = TRUE) + legacy_event.severity = severity + legacy_event.setup() + +/datum/event2/event/legacy/should_announce() + return tick_count >= legacy_event.announceWhen + +/datum/event2/event/legacy/announce() + legacy_event.announce() + + +// Legacy events don't tick before they start, so we don't need to do `wait_tick()`. + +/datum/event2/event/legacy/should_start() + return tick_count >= legacy_event.startWhen + +/datum/event2/event/legacy/start() + legacy_event.start() + +/datum/event2/event/legacy/event_tick() + legacy_event.tick() + + +/datum/event2/event/legacy/should_end() + return tick_count >= legacy_event.endWhen + +/datum/event2/event/legacy/end() + legacy_event.end() + +/datum/event2/event/legacy/finish() + legacy_event.kill(external_use = TRUE) + ..() + +// Proof of concept. +/* +/datum/event2/meta/legacy_gravity + name = "gravity (legacy)" + reusable = TRUE + event_type = /datum/event2/event/legacy/gravity + +/datum/event2/event/legacy/gravity + legacy_event = /datum/event/gravity +*/ \ No newline at end of file diff --git a/code/modules/gamemaster/event2/events/medical/appendicitis.dm b/code/modules/gamemaster/event2/events/medical/appendicitis.dm new file mode 100644 index 0000000000..27f5284020 --- /dev/null +++ b/code/modules/gamemaster/event2/events/medical/appendicitis.dm @@ -0,0 +1,36 @@ +/datum/event2/meta/appendicitis + name = "appendicitis" + departments = list(DEPARTMENT_MEDICAL) + chaos = 40 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_MEDIUM_IMPACT + event_type = /datum/event2/event/appendicitis + +/datum/event2/meta/appendicitis/get_weight() + var/list/doctors = metric.get_people_with_job(/datum/job/doctor) + + doctors -= metric.get_people_with_alt_title(/datum/job/doctor, /datum/alt_title/nurse) + doctors -= metric.get_people_with_alt_title(/datum/job/doctor, /datum/alt_title/virologist) + doctors += metric.get_people_with_job(/datum/job/cmo) + + return doctors.len * 10 + + + +/datum/event2/event/appendicitis/start() + for(var/mob/living/carbon/human/H in shuffle(living_mob_list)) + // Don't do it to SSD people. + if(!H.client) + continue + + // Or antags. + if(player_is_antag(H.mind)) + continue + + // Or doctors (otherwise it could be possible for the only surgeon to need surgery). + if(H in metric.get_people_with_job(/datum/job/doctor) ) + continue + + if(H.appendicitis()) + log_debug("Appendicitis event gave appendicitis to \the [H].") + return + log_debug("Appendicitis event could not find a valid victim.") diff --git a/code/modules/gamemaster/event2/events/medical/virus.dm b/code/modules/gamemaster/event2/events/medical/virus.dm new file mode 100644 index 0000000000..58791d2ad1 --- /dev/null +++ b/code/modules/gamemaster/event2/events/medical/virus.dm @@ -0,0 +1,69 @@ +/datum/event2/meta/virus + name = "viral infection" + event_class = "virus" + departments = list(DEPARTMENT_MEDICAL, DEPARTMENT_EVERYONE) + chaos = 40 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_HIGH_IMPACT + event_type = /datum/event2/event/virus + +/datum/event2/meta/virus/superbug + name = "viral superbug" + chaos = 60 + event_type = /datum/event2/event/virus/superbug + +/datum/event2/meta/virus/outbreak + name = "viral outbreak" + chaos = 60 + event_type = /datum/event2/event/virus/outbreak + +/datum/event2/meta/virus/get_weight() + var/list/virologists = metric.get_people_with_alt_title(/datum/job/doctor, /datum/alt_title/virologist) + virologists += metric.get_people_with_job(/datum/job/cmo) + + return virologists.len * 25 + + + +/datum/event2/event/virus + announce_delay_lower_bound = 1 MINUTE + announce_delay_upper_bound = 3 MINUTES + var/number_of_viruses = 1 + var/virus_power = 2 // Ranges from 1 to 3, with 1 being the weakest. + var/list/candidates = list() + +// A single powerful virus. +/datum/event2/event/virus/superbug + virus_power = 3 + +// A lot of weaker viruses. +/datum/event2/event/virus/outbreak + virus_power = 1 + number_of_viruses = 3 + + + +/datum/event2/event/virus/set_up() + for(var/mob/living/carbon/human/H in player_list) + if(H.client && !H.isSynthetic() && H.stat != DEAD && !player_is_antag(H.mind)) + candidates += H + candidates = shuffle(candidates) + +/datum/event2/event/virus/announce() + command_announcement.Announce("Confirmed outbreak of level 7 biohazard aboard \the [location_name()]. \ + All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg') + +/datum/event2/event/virus/start() + if(!candidates.len) + log_debug("Virus event could not find any valid targets to infect. Aborting.") + abort() + return + + for(var/i = 1 to number_of_viruses) + var/mob/living/carbon/human/H = LAZYACCESS(candidates, 1) + if(!H) + return + var/datum/disease2/disease/D = new() + D.makerandom(virus_power) + log_debug("Virus event is now infecting \the [H] with a new random virus.") + infect_mob(H, D) + candidates -= H diff --git a/code/modules/gamemaster/event2/events/mob_spawning.dm b/code/modules/gamemaster/event2/events/mob_spawning.dm new file mode 100644 index 0000000000..78b1eac69c --- /dev/null +++ b/code/modules/gamemaster/event2/events/mob_spawning.dm @@ -0,0 +1,99 @@ +// A subtype that involves spawning mobs like carp, rogue drones, spiders, etc. + +/datum/event2/event/mob_spawning + var/list/spawned_mobs = list() + var/use_map_edge_with_landmarks = TRUE // Use both landmarks and spawning from the "edge" of the map. Otherise uses landmarks over map edge. + var/landmark_name = "carpspawn" // Which landmark to use for spawning. + +// Spawns a specific mob from the "edge" of the map, and makes them go towards the station. +// Can also use landmarks, if desired. +/datum/event2/event/mob_spawning/proc/spawn_mobs_in_space(mob_type, number_of_groups, min_size_of_group, max_size_of_group, dir) + if(isnull(dir)) + dir = pick(GLOB.cardinal) + + var/list/valid_z_levels = get_location_z_levels() + valid_z_levels -= using_map.sealed_levels // Space levels only please! + + // Check if any landmarks exist! + var/list/spawn_locations = list() + for(var/obj/effect/landmark/C in landmarks_list) + if(C.name == landmark_name && (C.z in valid_z_levels)) + spawn_locations.Add(C.loc) + + var/prioritize_landmarks = TRUE + if(use_map_edge_with_landmarks && prob(50)) + prioritize_landmarks = FALSE // One in two chance to come from the edge instead. + + if(spawn_locations.len && prioritize_landmarks) // Okay we've got landmarks, lets use those! + shuffle_inplace(spawn_locations) + number_of_groups = min(number_of_groups, spawn_locations.len) + var/i = 1 + while (i <= number_of_groups) + var/group_size = rand(min_size_of_group, max_size_of_group) + for (var/j = 0, j < group_size, j++) + spawn_one_mob(spawn_locations[i], mob_type) + i++ + return + + // Okay we did *not* have any landmarks, or we're being told to do both, so lets do our best! + var/i = 1 + while(i <= number_of_groups) + var/z_level = pick(valid_z_levels) + var/group_size = rand(min_size_of_group, max_size_of_group) + var/turf/map_center = locate(round(world.maxx/2), round(world.maxy/2), z_level) + var/turf/group_center = pick_random_edge_turf(dir, z_level, TRANSITIONEDGE + 2) + var/list/turfs = getcircle(group_center, 2) + for(var/j = 0, j < group_size, j++) + // On larger maps, BYOND gets in the way of letting simple_mobs path to the closest edge of the station. + // So instead we need to simulate the mob's travel, then spawn them somewhere still hopefully off screen. + + // Find a turf to be the edge of the map. + var/turf/edge_of_map = turfs[(i % turfs.len) + 1] + + // Now walk a straight line towards the center of the map, until we find a non-space tile. + var/turf/edge_of_station = null + + var/list/space_line = list() // This holds all space tiles on the line. Will be used a bit later. + for(var/turf/T in getline(edge_of_map, map_center)) + if(!T.is_space()) + break // We found the station! + space_line += T + edge_of_station = T + + // Now put the mob somewhere on the line, hopefully off screen. + // I wish this was higher than 8 but the BYOND internal A* algorithm gives up sometimes when using + // 16 or more. + // In the future, a new AI stance that handles long distance travel using getline() could work. + var/max_distance = 8 + var/turf/spawn_turf = null + for(var/P in space_line) + var/turf/point = P + if(get_dist(point, edge_of_station) <= max_distance) + spawn_turf = P + break + + if(spawn_turf) + // Finally, make the simple_mob go towards the edge of the station. + var/mob/living/simple_mob/M = spawn_one_mob(spawn_turf, mob_type) + if(edge_of_station) + M.ai_holder?.give_destination(edge_of_station) // Ask simple_mobs to fly towards the edge of the station. + i++ + +/datum/event2/event/mob_spawning/proc/spawn_one_mob(new_loc, mob_type) + var/mob/living/simple_mob/M = new mob_type(new_loc) + GLOB.destroyed_event.register(M, src, .proc/on_mob_destruction) + spawned_mobs += M + return M + +// Counts living simple_mobs spawned by this event. +/datum/event2/event/mob_spawning/proc/count_spawned_mobs() + . = 0 + for(var/I in spawned_mobs) + var/mob/living/simple_mob/M = I + if(!QDELETED(M) && M.stat != DEAD) + . += 1 + +// If simple_mob is bomphed, remove it from the list. +/datum/event2/event/mob_spawning/proc/on_mob_destruction(mob/M) + spawned_mobs -= M + GLOB.destroyed_event.unregister(M, src, .proc/on_mob_destruction) \ No newline at end of file diff --git a/code/modules/gamemaster/event2/events/security/carp_migration.dm b/code/modules/gamemaster/event2/events/security/carp_migration.dm new file mode 100644 index 0000000000..12f08f3edd --- /dev/null +++ b/code/modules/gamemaster/event2/events/security/carp_migration.dm @@ -0,0 +1,49 @@ +/datum/event2/meta/carp_migration + name = "carp migration" + event_class = "carp" + departments = list(DEPARTMENT_SECURITY, DEPARTMENT_EVERYONE) + chaos = 30 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_MEDIUM_IMPACT + event_type = /datum/event2/event/mob_spawning/carp_migration + +/datum/event2/meta/carp_migration/get_weight() + return 10 + (metric.count_people_in_department(DEPARTMENT_SECURITY) * 20) + (metric.count_all_space_mobs() * 40) + + +/datum/event2/event/mob_spawning/carp_migration + announce_delay_lower_bound = 1 MINUTE + announce_delay_upper_bound = 2 MINUTES + length_lower_bound = 30 SECONDS + length_upper_bound = 1 MINUTE + var/carp_cap = 30 // No more than this many (living) carp can exist from this event. + var/carp_smallest_group = 3 + var/carp_largest_group = 5 + var/carp_wave_cooldown = 10 SECONDS + + var/last_carp_wave_time = null // Last world.time we spawned a carp wave. + +/datum/event2/event/mob_spawning/carp_migration/announce() + var/announcement = "Unknown biological entities been detected near \the [location_name()], please stand-by." + command_announcement.Announce(announcement, "Lifesign Alert") + +/datum/event2/event/mob_spawning/carp_migration/event_tick() + if(last_carp_wave_time + carp_wave_cooldown > world.time) + return + last_carp_wave_time = world.time + + if(count_spawned_mobs() < carp_cap) + spawn_mobs_in_space( + mob_type = /mob/living/simple_mob/animal/space/carp/event, + number_of_groups = rand(1, 4), + min_size_of_group = carp_smallest_group, + max_size_of_group = carp_largest_group + ) + +/datum/event2/event/mob_spawning/carp_migration/end() + // Clean up carp that died in space for some reason. + for(var/mob/living/simple_mob/SM in spawned_mobs) + if(SM.stat == DEAD) + var/turf/T = get_turf(SM) + if(istype(T, /turf/space)) + if(prob(75)) + qdel(SM) diff --git a/code/modules/gamemaster/event2/events/security/drill_announcement.dm b/code/modules/gamemaster/event2/events/security/drill_announcement.dm new file mode 100644 index 0000000000..271e2d75f1 --- /dev/null +++ b/code/modules/gamemaster/event2/events/security/drill_announcement.dm @@ -0,0 +1,22 @@ +/datum/event2/meta/security_drill + name = "security drill" + departments = list(DEPARTMENT_SECURITY, DEPARTMENT_EVERYONE) + chaotic_threshold = EVENT_CHAOS_THRESHOLD_HIGH_IMPACT // Don't run if we just got hit by meteors. + event_type = /datum/event2/event/security_drill + +/datum/event2/meta/security_drill/get_weight() + var/sec = metric.count_people_in_department(DEPARTMENT_SECURITY) + var/everyone = metric.count_people_in_department(DEPARTMENT_EVERYONE) + + if(!sec) // If there's no security, then there is no drill. + return 0 + if(everyone - sec < 0) // If there's no non-sec, then there is no drill. + return 0 + + // Each security player adds +5 weight, while non-security adds +1.5. + return (sec * 5) + ((everyone - sec) * 1.5) + +/datum/event2/event/security_drill/announce() + command_announcement.Announce("[pick("A NanoTrasen security director", "A Vir-Gov correspondant", "Local Sif authoritiy")] \ + has advised the enactment of [pick("a rampant wildlife", "a fire", "a hostile boarding", \ + "a bomb", "an emergent intelligence")] drill with the personnel onboard \the [location_name()].", "Security Advisement") diff --git a/code/modules/gamemaster/event2/events/security/prison_break.dm b/code/modules/gamemaster/event2/events/security/prison_break.dm new file mode 100644 index 0000000000..7c5127c26c --- /dev/null +++ b/code/modules/gamemaster/event2/events/security/prison_break.dm @@ -0,0 +1,227 @@ + +// Type for inheritence. +// It has a null name, so it won't be ran. +/datum/event2/meta/prison_break + chaos = 10 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_LOW_IMPACT + // The weight system can check if people are in these areas. + // This isn't the same list as what the event itself will break, as the event will also + // break open areas inbetween the holding area and the public hallway, like the brig area verses + // the prison area. + var/list/relevant_areas = list() + var/list/irrelevant_areas = list() + +/datum/event2/meta/prison_break/get_weight() + // First, don't do this if nobody can fix the doors. + var/door_fixers = metric.count_people_in_department(DEPARTMENT_ENGINEERING) + metric.count_people_in_department(DEPARTMENT_SYNTHETIC) + if(!door_fixers) + return 0 + var/list/afflicted_departments = departments.Copy() + var/afflicted_crew = 0 + + afflicted_departments -= DEPARTMENT_SYNTHETIC + for(var/D in afflicted_departments) + afflicted_crew += metric.count_people_in_department(D) + + // Don't do it if nobody is around to ""appreciate"" it. + if(!afflicted_crew) + return 0 + + var/trapped = get_odds_from_trapped_mobs() + + return 10 + (door_fixers * 20) + (afflicted_crew * 10) + trapped + +// This is overriden to have specific events trigger more often based on who is trapped in where, if applicable. +/datum/event2/meta/prison_break/proc/get_odds_from_trapped_mobs() + return 0 + +/datum/event2/meta/prison_break/proc/is_mob_in_relevant_area(mob/living/L) + var/area/A = get_area(L) + if(!A) + return FALSE + if(is_type_in_list(A, relevant_areas) && !is_type_in_list(A, irrelevant_areas)) + return TRUE + return FALSE + +/datum/event2/meta/prison_break/brig + name = "prison break - brig" + departments = list(DEPARTMENT_SECURITY, DEPARTMENT_SYNTHETIC) + event_type = /datum/event2/event/prison_break/brig + relevant_areas = list( + /area/security/prison, + /area/security/security_cell_hallway, + /area/security/security_processing, + /area/security/interrogation + ) + +/datum/event2/meta/prison_break/brig/get_odds_from_trapped_mobs() + . = 0 + for(var/mob/living/L in player_list) + if(is_mob_in_relevant_area(L)) + // Don't count them if they're in security. + if(!(L in metric.count_people_in_department(DEPARTMENT_SECURITY))) + . += 40 + + +/datum/event2/meta/prison_break/armory + name = "prison break - armory" + departments = list(DEPARTMENT_SECURITY, DEPARTMENT_SYNTHETIC) + chaos = 40 // Potentially free guns. + chaotic_threshold = EVENT_CHAOS_THRESHOLD_MEDIUM_IMPACT + event_type = /datum/event2/event/prison_break/armory + +/datum/event2/meta/prison_break/bridge + name = "prison break - bridge" + departments = list(DEPARTMENT_COMMAND, DEPARTMENT_SYNTHETIC) + chaos = 40 // Potentially free spare ID. + chaotic_threshold = EVENT_CHAOS_THRESHOLD_MEDIUM_IMPACT + event_type = /datum/event2/event/prison_break/bridge + +/datum/event2/meta/prison_break/xenobio + name = "prison break - xenobio" + departments = list(DEPARTMENT_RESEARCH, DEPARTMENT_SYNTHETIC) + chaos = 20 // This one is more likely to actually kill someone. + chaotic_threshold = EVENT_CHAOS_THRESHOLD_MEDIUM_IMPACT + event_type = /datum/event2/event/prison_break/xenobio + relevant_areas = list(/area/rnd/xenobiology) + irrelevant_areas = list( + /area/rnd/xenobiology/xenoflora, + /area/rnd/xenobiology/xenoflora_storage + ) + +/datum/event2/meta/prison_break/xenobio/get_odds_from_trapped_mobs() + . = 0 + for(var/mob/living/simple_mob/slime/xenobio/X in living_mob_list) + if(is_mob_in_relevant_area(X)) + . += 5 + + +/datum/event2/meta/prison_break/virology + name = "prison break - virology" + departments = list(DEPARTMENT_MEDICAL, DEPARTMENT_SYNTHETIC) + event_type = /datum/event2/event/prison_break/virology + relevant_areas = list( + /area/medical/virology, + /area/medical/virologyaccess + ) + +/datum/event2/meta/prison_break/virology/get_odds_from_trapped_mobs() + . = 0 + for(var/mob/living/L in player_list) + if(is_mob_in_relevant_area(L)) + // Don't count them if they're in medical. + if(!(L in metric.count_people_in_department(DEPARTMENT_MEDICAL))) + . += 40 + + + + +/datum/event2/event/prison_break + start_delay_lower_bound = 3 MINUTES + start_delay_upper_bound = 4 MINUTES + length_lower_bound = 40 SECONDS + length_upper_bound = 1 MINUTE + var/area_display_name = null // A string used to describe the area being messed with. + var/containment_display_desc = null + var/list/areas_to_break = list() + var/list/area_types_to_break = null // Area types to include. + var/list/area_types_to_ignore = null // Area types to exclude, usually due to undesired inclusion from inheritence. + +/datum/event2/event/prison_break/brig + area_display_name = "Brig" + containment_display_desc = "imprisonment" + area_types_to_break = list( + /area/security/prison, + /area/security/brig, + /area/security/security_cell_hallway, + /area/security/security_processing, + /area/security/interrogation + ) + +/datum/event2/event/prison_break/armory + area_display_name = "Armory" + containment_display_desc = "protection" + area_types_to_break = list( + /area/security/brig, + /area/security/warden, + /area/security/evidence_storage, + /area/security/security_equiptment_storage, + /area/security/armoury, + /area/security/tactical + ) + +/datum/event2/event/prison_break/bridge + area_display_name = "Bridge" + containment_display_desc = "isolation" + area_types_to_break = list( + /area/bridge, + /area/bridge_hallway + ) + +/datum/event2/event/prison_break/xenobio + area_display_name = "Xenobiology" + containment_display_desc = "containment" + area_types_to_break = list(/area/rnd/xenobiology) + area_types_to_ignore = list( + /area/rnd/xenobiology/xenoflora, + /area/rnd/xenobiology/xenoflora_storage + ) + +/datum/event2/event/prison_break/virology + area_display_name = "Virology" + containment_display_desc = "quarantine" + area_types_to_break = list( + /area/medical/virology, + /area/medical/virologyaccess + ) + + +/datum/event2/event/prison_break/set_up() + for(var/area/A in all_areas) + if(is_type_in_list(A, area_types_to_break) && !is_type_in_list(A, area_types_to_ignore)) + areas_to_break += A + + if(!areas_to_break.len) + log_debug("Prison Break event failed to find any areas to break. Aborting.") + abort() + return + +/datum/event2/event/prison_break/announce() + var/my_department = "[location_name()] Firewall Subroutines" + var/message = "An unknown malicious program has been detected in the [area_display_name] \ + lighting and airlock control systems at [stationtime2text()]. Systems will be fully compromised \ + within approximately three minutes. Direct intervention is required immediately. Disabling the \ + main breaker in the APCs will protect the APC's room from being compromised." + + for(var/obj/machinery/message_server/MS in machines) + MS.send_rc_message(DEPARTMENT_ENGINEERING, my_department, "[message]
", "", "", 2) + + // Nobody reads the requests consoles so lets use the radio as well. + global_announcer.autosay(message, my_department, DEPARTMENT_ENGINEERING) + + for(var/mob/living/silicon/ai/A in player_list) + to_chat(A, span("danger", "Malicious program detected in the [area_display_name] lighting and airlock control systems by [my_department]. \ + Disabling the main breaker in the APCs will protect the APC's room from being compromised.")) + + var/time_to_flicker = start_delay - 10 SECONDS + addtimer(CALLBACK(src, .proc/flicker_area), time_to_flicker) + + +/datum/event2/event/prison_break/proc/flicker_area() + for(var/area/A in areas_to_break) + var/obj/machinery/power/apc/apc = A.get_apc() + if(apc.operating) //If the apc's off, it's a little hard to overload the lights. + for(var/obj/machinery/light/L in A) + L.flicker(10) + +/datum/event2/event/prison_break/start() + for(var/area/A in areas_to_break) + spawn(0) // So we don't block the ticker. + A.prison_break() + +// There's between 40 seconds and one minute before the whole station knows. +// If there's a baddie engineer, they can choose to keep their early announcement to themselves and get a minute to exploit it. +/datum/event2/event/prison_break/end() + command_announcement.Announce("[pick("Gr3y.T1d3 virus","Malignant trojan")] was detected \ + in \the [location_name()] [area_display_name] [containment_display_desc] subroutines. Secure any compromised \ + areas immediately. AI involvement is recommended.", "[capitalize(containment_display_desc)] Alert") diff --git a/code/modules/gamemaster/event2/events/security/rogue_drones.dm b/code/modules/gamemaster/event2/events/security/rogue_drones.dm new file mode 100644 index 0000000000..da40b3262f --- /dev/null +++ b/code/modules/gamemaster/event2/events/security/rogue_drones.dm @@ -0,0 +1,70 @@ +/datum/event2/meta/rogue_drones + name = "rogue drones" + departments = list(DEPARTMENT_SECURITY, DEPARTMENT_EVERYONE) + chaos = 40 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_MEDIUM_IMPACT + event_type = /datum/event2/event/mob_spawning/rogue_drones + +/datum/event2/meta/rogue_drones/get_weight() + . = 10 // Start with a base weight, since this event does provide some value even if no sec is around. + . += metric.count_people_in_department(DEPARTMENT_SECURITY) * 20 + . += metric.count_all_space_mobs() * 40 + + +/datum/event2/event/mob_spawning/rogue_drones + length_lower_bound = 15 MINUTES + length_upper_bound = 20 MINUTES + var/drones_to_spawn = 6 + +/datum/event2/event/mob_spawning/rogue_drones/set_up() + if(prob(10)) // Small chance for a false alarm. + drones_to_spawn = 0 + +/datum/event2/event/mob_spawning/rogue_drones/announce() + var/msg = null + var/rng = rand(1,5) + switch(rng) + if(1) + msg = "A combat drone wing operating in close orbit above Sif has failed to return from a anti-piracy sweep. \ + If any are sighted, approach with caution." + if(2) + msg = "Contact has been lost with a combat drone wing in Sif orbit. \ + If any are sighted in the area, approach with caution." + if(3) + msg = "Unidentified hackers have targeted a combat drone wing deployed around Sif. \ + If any are sighted in the area, approach with caution." + if(4) + msg = "A passing derelict ship's drone defense systems have just activated. \ + If any are sighted in the area, use caution." + if(5) + msg = "We're detecting a swarm of small objects approaching your station. \ + Most likely a bunch of drones. Please exercise caution if you see any." + + command_announcement.Announce(msg, "Rogue drone alert") + +/datum/event2/event/mob_spawning/rogue_drones/start() + for(var/i = 1 to drones_to_spawn) + spawn_mobs_in_space( + mob_type = /mob/living/simple_mob/mechanical/combat_drone/event, + number_of_groups = 1, + min_size_of_group = 1, + max_size_of_group = 1 + ) + +/datum/event2/event/mob_spawning/rogue_drones/end() + if(drones_to_spawn) + var/number_recovered = 0 + for(var/mob/living/simple_mob/mechanical/combat_drone/D in spawned_mobs) + var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() + sparks.set_up(3, 0, D.loc) + sparks.start() + D.z = using_map.admin_levels[1] + D.loot_list = list() + + qdel(D) + number_recovered++ + + if(number_recovered > spawned_mobs.len * 0.75) + command_announcement.Announce("The drones that were malfunctioning have been recovered safely.", "Rogue drone alert") + else + command_announcement.Announce("We're disappointed at the loss of the drones, but the survivors have been recovered.", "Rogue drone alert") diff --git a/code/modules/gamemaster/event2/events/security/security_advisement.dm b/code/modules/gamemaster/event2/events/security/security_advisement.dm new file mode 100644 index 0000000000..6a3764e40e --- /dev/null +++ b/code/modules/gamemaster/event2/events/security/security_advisement.dm @@ -0,0 +1,93 @@ +/datum/event2/meta/security_screening + name = "security screening" + departments = list(DEPARTMENT_SECURITY, DEPARTMENT_EVERYONE) + chaotic_threshold = EVENT_CHAOS_THRESHOLD_HIGH_IMPACT // So this won't get called in the middle of a crisis. + event_type = /datum/event2/event/security_screening + +/datum/event2/meta/security_screening/get_weight() + . = 0 + var/sec = metric.count_people_in_department(DEPARTMENT_SECURITY) + if(!sec < 2) + return 0 // Can't screen with no security. + . += sec * 10 + . += metric.count_people_in_department(DEPARTMENT_EVERYONE) * 2 + + // Having ""suspecious"" people present makes this more likely to be picked. + var/suspicious_people = 0 + suspicious_people += metric.count_all_of_specific_species(SPECIES_PROMETHEAN) * 20 + suspicious_people += metric.count_all_of_specific_species(SPECIES_UNATHI) * 10 + suspicious_people += metric.count_all_of_specific_species(SPECIES_ZADDAT) * 10 + suspicious_people += metric.count_all_of_specific_species(SPECIES_SKRELL) * 5 // Not sure why skrell are so high. + suspicious_people += metric.count_all_of_specific_species(SPECIES_TAJ) * 5 + suspicious_people += metric.count_all_of_specific_species(SPECIES_TESHARI) * 5 + suspicious_people += metric.count_all_of_specific_species(SPECIES_HUMAN_VATBORN) * 5 + suspicious_people += metric.count_all_FBPs_of_kind(FBP_DRONE) * 20 + suspicious_people += metric.count_all_FBPs_of_kind(FBP_POSI) * 10 + if(!suspicious_people) + return 0 + . += suspicious_people + +/datum/event2/event/security_screening + var/victim = null + var/list/species_weights = list( + SPECIES_SKRELL = 9, + SPECIES_UNATHI = 15, + SPECIES_HUMAN_VATBORN = 6, + SPECIES_TESHARI = 2, + SPECIES_TAJ = 3, + SPECIES_DIONA = 1, + SPECIES_ZADDAT = 25, + SPECIES_PROMETHEAN = 30 + ) + + var/list/synth_weights = list( + FBP_CYBORG = 15, + FBP_DRONE = 30, + FBP_POSI = 25 + ) + +/datum/event2/event/security_screening/set_up() + var/list/end_weights = list() + + // First pass makes popular things more likely to get picked, e.g. 5 prommies vs 1 drone. + for(var/species_name in species_weights) + var/give_weight = 0 + for(var/datum/data/record/R in data_core.general) + if(R.fields["species"] == species_name) + give_weight += species_weights[species_name] + + end_weights[species_name] = give_weight + + for(var/bot_type in synth_weights) + var/give_weight = 0 + for(var/datum/data/record/R in data_core.general) + if(R.fields["brain_type"] == bot_type) + give_weight += synth_weights[bot_type] + + end_weights[bot_type] = give_weight + + // Second pass eliminates things that don't exist on the station. + // It's possible to choose something like drones when all the drones are AFK. This prevents that from happening. + while(end_weights.len) // Keep at it until we find someone or run out of possibilities. + var/victim_chosen = pickweight(end_weights) + + if(victim_chosen in synth_weights) + if(metric.count_all_FBPs_of_kind(victim_chosen) > 0) + victim = victim_chosen + break + else + if(metric.count_all_of_specific_species(victim_chosen) > 0) + victim = victim_chosen + break + if(!victim) + end_weights -= victim_chosen + + if(!victim) + log_debug("Security Screening event failed to find anyone to screen. Aborting.") + abort() + return + +/datum/event2/event/security_screening/announce() + command_announcement.Announce("[pick("A nearby Navy vessel", "A Solar official", "A Vir-Gov official", "A NanoTrasen board director")] has \ + requested the screening of [pick("every other", "every", "suspicious", "willing")] [victim] \ + personnel onboard \the [location_name()].", "Security Advisement") diff --git a/code/modules/gamemaster/event2/events/security/spider_infestation.dm b/code/modules/gamemaster/event2/events/security/spider_infestation.dm new file mode 100644 index 0000000000..23dc61c673 --- /dev/null +++ b/code/modules/gamemaster/event2/events/security/spider_infestation.dm @@ -0,0 +1,49 @@ +/datum/event2/meta/spider_infestation + name = "spider infestation" + event_class = "spiders" + departments = list(DEPARTMENT_SECURITY, DEPARTMENT_MEDICAL, DEPARTMENT_EVERYONE) + chaos = 30 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_MEDIUM_IMPACT + event_type = /datum/event2/event/spider_infestation + +/datum/event2/meta/spider_infestation/weak + name = "weak spider infestation" + chaos = 20 + event_type = /datum/event2/event/spider_infestation/weak + + +/datum/event2/meta/spider_infestation/get_weight() + . = 10 + . += metric.count_people_in_department(DEPARTMENT_SECURITY) * 20 + . += metric.count_people_in_department(DEPARTMENT_MEDICAL) * 10 + + +// This isn't a /mob_spawning subtype since spiderlings aren't actually mobs. + +/datum/event2/event/spider_infestation + var/spiders_to_spawn = 8 + var/spiderling_to_spawn = /obj/effect/spider/spiderling + +/datum/event2/event/spider_infestation/weak + spiders_to_spawn = 5 + spiderling_to_spawn = /obj/effect/spider/spiderling/stunted + + + +/datum/event2/event/spider_infestation/announce() + command_announcement.Announce("Unidentified lifesigns detected coming aboard \the [location_name()]. \ + Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg') + +/datum/event2/event/spider_infestation/start() + var/list/vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines) + if(!temp_vent.welded && temp_vent.network && temp_vent.loc.z in get_location_z_levels()) + if(temp_vent.network.normal_members.len > 50) + vents += temp_vent + + while((spiders_to_spawn >= 1) && vents.len) + var/obj/vent = pick(vents) + new spiderling_to_spawn(vent.loc) + log_debug("Spider infestation event spawned a spiderling at [get_area(vent)].") + vents -= vent + spiders_to_spawn-- diff --git a/code/modules/gamemaster/event2/events/security/stowaway.dm b/code/modules/gamemaster/event2/events/security/stowaway.dm new file mode 100644 index 0000000000..d04d350234 --- /dev/null +++ b/code/modules/gamemaster/event2/events/security/stowaway.dm @@ -0,0 +1,64 @@ +// Base type used for inheritence. +/datum/event2/meta/stowaway + event_class = "stowaway" + departments = list(DEPARTMENT_SECURITY, DEPARTMENT_EVERYONE) + chaos = 10 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_LOW_IMPACT + event_type = /datum/event2/event/ghost_pod_spawner/stowaway + var/safe_for_extended = FALSE + +/datum/event2/meta/stowaway/normal + name = "stowaway - normal" + safe_for_extended = TRUE + +/datum/event2/meta/stowaway/renegade + name = "stowaway - renegade" + chaos = 30 + event_type = /datum/event2/event/ghost_pod_spawner/stowaway/renegade + +/datum/event2/meta/stowaway/infiltrator + name = "stowaway - infiltrator" + chaos = 60 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_MEDIUM_IMPACT + event_type = /datum/event2/event/ghost_pod_spawner/stowaway/infiltrator + +/datum/event2/meta/stowaway/get_weight() + if(istype(ticker.mode, /datum/game_mode/extended) && !safe_for_extended) + return 0 + + var/security = metric.count_people_in_department(DEPARTMENT_SECURITY) + var/everyone = metric.count_people_in_department(DEPARTMENT_EVERYONE) - security + var/ghost_activity = metric.assess_all_dead_mobs() / 100 + + return ( (security * 20) + (everyone * 2) ) * ghost_activity + + +/datum/event2/event/ghost_pod_spawner/stowaway + pod_type = /obj/structure/ghost_pod/ghost_activated/human + desired_turf_areas = list(/area/maintenance) + announce_delay_lower_bound = 15 MINUTES + announce_delay_upper_bound = 30 MINUTES + var/antag_type = MODE_STOWAWAY + var/announce_odds = 20 + +/datum/event2/event/ghost_pod_spawner/stowaway/renegade + antag_type = MODE_RENEGADE + announce_odds = 33 + +/datum/event2/event/ghost_pod_spawner/stowaway/infiltrator + antag_type = MODE_INFILTRATOR + announce_odds = 50 + +/datum/event2/event/ghost_pod_spawner/stowaway/post_pod_creation(obj/structure/ghost_pod/ghost_activated/human/pod) + pod.make_antag = antag_type + pod.occupant_type = "[pod.make_antag] [pod.occupant_type]" + + say_dead_object("[span("notice", pod.occupant_type)] pod is now available in \the [get_area(pod)].", pod) + +/datum/event2/event/ghost_pod_spawner/stowaway/announce() + if(prob(announce_odds)) + if(atc?.squelched) + return + atc.msg("Attention civilian vessels in [using_map.starsys_name] shipping lanes, caution is advised as \ + [pick("an unidentified vessel", "a known criminal's vessel", "a derelict vessel")] \ + has been detected passing multiple local stations.") diff --git a/code/modules/gamemaster/event2/events/security/surprise_carp.dm b/code/modules/gamemaster/event2/events/security/surprise_carp.dm new file mode 100644 index 0000000000..39be6d8412 --- /dev/null +++ b/code/modules/gamemaster/event2/events/security/surprise_carp.dm @@ -0,0 +1,71 @@ +// This event sends a few carp after someone hanging around in space, unannounced. + +/datum/event2/meta/surprise_carp + name = "surprise carp" + departments = list(DEPARTMENT_EVERYONE) + chaos = 20 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_MEDIUM_IMPACT + event_type = /datum/event2/event/surprise_carp + +/datum/event2/meta/surprise_carp/get_weight() + return metric.count_all_space_mobs() * 50 + + +/datum/event2/event/surprise_carp + var/mob/living/victim = null + +/datum/event2/event/surprise_carp/set_up() + var/list/potential_victims = list() + for(var/mob/living/L in player_list) + if(!(L.z in get_location_z_levels())) + continue // Not on the right z-level. + if(L.stat) + continue // Don't want dead people. + if(istype(get_turf(L), /turf/space) && istype(get_area(L),/area/space)) + potential_victims += L + + if(potential_victims.len) + victim = pick(potential_victims) + +/datum/event2/event/surprise_carp/start() + if(!victim) + log_debug("Failed to find a target for surprise carp attack. Aborting.") + abort() + return + + var/number_of_carp = rand(1, 2) + log_debug("Sending [number_of_carp] carp\s after \the [victim].") + // Getting off screen tiles is kind of tricky due to potential edge cases that could arise. + // The method we're gonna do is make a big square around the victim, then + // subtract a smaller square in the middle for the default vision range. + var/list/outer_square = get_safe_square(victim, world.view + 3) + var/list/inner_square = get_safe_square(victim, world.view) + + var/list/donut = outer_square - inner_square + for(var/T in donut) + if(!istype(T, /turf/space)) + donut -= T + + for(var/i = 1 to number_of_carp) + var/turf/spawning_turf = pick(donut) + + if(spawning_turf) + var/mob/living/simple_mob/animal/space/carp/C = new(spawning_turf) + // Ask carp to swim onto the victim's screen. The AI will then switch to hostile and try to eat them. + C.ai_holder?.give_destination(get_turf(victim)) + else + log_debug("Surprise carp attack failed to find any space turfs offscreen to the victim.") + +// Gets suitable spots for carp to spawn, without risk of going off the edge of the map. +// If there is demand for this proc, then it can easily be made independant and moved into one of the helper files. +/datum/event2/event/surprise_carp/proc/get_safe_square(atom/center, radius) + var/lower_left_x = max(center.x - radius, 1 + TRANSITIONEDGE) + var/lower_left_y = max(center.y - radius, 1 + TRANSITIONEDGE) + + var/upper_right_x = min(center.x + radius, world.maxx - TRANSITIONEDGE) + var/upper_right_y = min(center.y + radius, world.maxy - TRANSITIONEDGE) + + var/turf/lower_left = locate(lower_left_x, lower_left_y, victim.z) + var/turf/upper_right = locate(upper_right_x, upper_right_y, victim.z) + + return block(lower_left, upper_right) diff --git a/code/modules/gamemaster/event2/events/security/swarm_boarder.dm b/code/modules/gamemaster/event2/events/security/swarm_boarder.dm new file mode 100644 index 0000000000..283333c679 --- /dev/null +++ b/code/modules/gamemaster/event2/events/security/swarm_boarder.dm @@ -0,0 +1,55 @@ +// This is just porting the event to the new new event system, it's not been balanced in any way +// so don't @ me if these things are grossly OP. +/datum/event2/meta/swarm_boarder + event_class = "swarm boarder" + departments = list(DEPARTMENT_EVERYONE, DEPARTMENT_SECURITY, DEPARTMENT_ENGINEERING) + chaos = 60 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_HIGH_IMPACT + var/safe_for_extended = FALSE + +/datum/event2/meta/swarm_boarder/get_weight() + if(istype(ticker.mode, /datum/game_mode/extended) && !safe_for_extended) + return 0 + + var/security = metric.count_people_in_department(DEPARTMENT_SECURITY) + var/engineering = metric.count_people_in_department(DEPARTMENT_ENGINEERING) + var/everyone = metric.count_people_in_department(DEPARTMENT_EVERYONE) - (engineering + security) + + var/ghost_activity = metric.assess_all_dead_mobs() / 100 + + return ( (security * 20) + (engineering * 10) + (everyone * 2) ) * ghost_activity + +/datum/event2/meta/swarm_boarder/normal + name = "swarmer shell - normal" + event_type = /datum/event2/event/ghost_pod_spawner/swarm_boarder + +/datum/event2/meta/swarm_boarder/melee + name = "swarmer shell - melee" + event_type = /datum/event2/event/ghost_pod_spawner/swarm_boarder/melee + +/datum/event2/meta/swarm_boarder/gunner + name = "swarmer shell - gunner" + event_type = /datum/event2/event/ghost_pod_spawner/swarm_boarder/gunner + + + + +/datum/event2/event/ghost_pod_spawner/swarm_boarder + announce_delay_lower_bound = 5 MINUTES + announce_delay_upper_bound = 15 MINUTES + pod_type = /obj/structure/ghost_pod/ghost_activated/swarm_drone/event + desired_turf_areas = list(/area/maintenance) + var/announce_odds = 80 + +/datum/event2/event/ghost_pod_spawner/swarm_boarder/melee + pod_type = /obj/structure/ghost_pod/ghost_activated/swarm_drone/event/melee + +/datum/event2/event/ghost_pod_spawner/swarm_boarder/gunner + pod_type = /obj/structure/ghost_pod/ghost_activated/swarm_drone/event/gunner + +/datum/event2/event/ghost_pod_spawner/swarm_boarder/announce() + if(prob(announce_odds)) + if(atc?.squelched) + atc.msg("Attention civilian vessels in [using_map.starsys_name] shipping lanes, caution \ + is advised as [pick("an unidentified vessel", "a known criminal's vessel", "a derelict vessel")] \ + has been detected passing multiple local stations.") diff --git a/code/modules/gamemaster/event2/events/synthetic/ion_storm.dm b/code/modules/gamemaster/event2/events/synthetic/ion_storm.dm new file mode 100644 index 0000000000..afcf20ebc8 --- /dev/null +++ b/code/modules/gamemaster/event2/events/synthetic/ion_storm.dm @@ -0,0 +1,71 @@ +/datum/event2/meta/ion_storm + name = "ion storm" + departments = list(DEPARTMENT_SYNTHETIC) + chaos = 40 + chaotic_threshold = EVENT_CHAOS_THRESHOLD_MEDIUM_IMPACT + event_type = /datum/event2/event/ion_storm + +/datum/event2/meta/ion_storm/get_weight() + var/bots = metric.count_people_in_department(DEPARTMENT_SYNTHETIC) + var/weight = 5 + (bots * 40) // A small chance even if no synths are on, since it can still emag beepsky. + return weight + + +/datum/event2/event/ion_storm + announce_delay_lower_bound = 7 MINUTES + announce_delay_upper_bound = 15 MINUTES + var/bot_emag_chance = 30 // This is rolled once, instead of once a second for a minute like the old version. + var/announce_odds = 50 // Probability of an announcement actually happening after the delay. + +/datum/event2/event/ion_storm/start() + // Ion laws. + for(var/mob/living/silicon/target in silicon_mob_list) + if(target.z in get_location_z_levels()) + // Don't ion law drons. + if(istype(target, /mob/living/silicon/robot/drone)) + continue + + // Or borgs with an AI (they'll get their AI's ion law anyways). + if(istype(target, /mob/living/silicon/robot)) + var/mob/living/silicon/robot/R = target + if(R.connected_ai) + continue + if(R.shell) + continue + + // Crew member names, and excluding off station antags, are handled by `generate_ion_law()` automatically. + var/law = target.generate_ion_law() + target.add_ion_law(law) + target.show_laws() + + // Emag bots. + for(var/mob/living/bot/B in mob_list) + if(B.z in get_location_z_levels()) + if(prob(bot_emag_chance)) + B.emag_act(1) + + // Messaging server spam filters. + // This might be better served as a seperate event since it seems more like a hacker attack than a natural occurance. + if(message_servers) + for(var/obj/machinery/message_server/MS in message_servers) + if(MS.z in get_location_z_levels()) + MS.spamfilter.Cut() + for (var/i = 1, i <= MS.spamfilter_limit, i++) + MS.spamfilter += pick("warble","help","almach","ai","liberty","freedom","drugs", "[using_map.station_short]", \ + "admin","sol","security","meow","_","monkey","-","moron","pizza","message","spam",\ + "director", "Hello", "Hi!"," ","nuke","crate","taj","xeno") + +/datum/event2/event/ion_storm/announce() + if(prob(announce_odds)) + command_announcement.Announce("An ion storm was detected within proximity to \the [location_name()] recently. \ + Check all AI controlled equipment for corruption.", "Anomaly Alert", new_sound = 'sound/AI/ionstorm.ogg') + +// Fake variant used by traitors. +/datum/event2/event/ion_storm/fake + // Fake ion storms announce instantly, so the traitor can time it to make the AI look suspicious. + announce_delay_lower_bound = 0 + announce_delay_upper_bound = 0 + announce_odds = 100 + +/datum/event2/event/ion_storm/fake/start() + return \ No newline at end of file diff --git a/code/modules/gamemaster/event2/meta.dm b/code/modules/gamemaster/event2/meta.dm new file mode 100644 index 0000000000..c876ce8f7d --- /dev/null +++ b/code/modules/gamemaster/event2/meta.dm @@ -0,0 +1,91 @@ +// The 'meta' object contains information about its assigned 'action' object, like what departments it will affect. +// It is directly held inside the Game Master Event System. + +// The code for actually executing an event should go inside the event object instead. +/datum/event2/meta + // Name used for organization, shown in the debug verb for the GM system. + // If null, the meta event will be discarded when the GM system initializes, so it is safe to use nameless subtypes for inheritence. + var/name = null + + // If FALSE, the GM system won't pick this. + // Some events set this to FALSE after running, to avoid running twice. + var/enabled = TRUE + + // What departments the event attached might affect. + var/list/departments = list(DEPARTMENT_EVERYONE) + + // A guess on how disruptive to a round the event might be. If the action is chosen, the GM's + // 'danger' score is increased by this number. + // Negative numbers could be used to signify helpful events. + var/chaos = 0 + + // A threshold the GM will use alongside its 'danger' score, to determine if it should pass + // over the event associated with this object. The decision is based on + var/chaotic_threshold = null + + // If true, the event won't have it's `enabled` var set to FALSE when ran by the GM system. + var/reusable = FALSE + + // A string used to identify a 'class' of similar events. + // If the event is not reusable, than all events sharing the same class are disabled. + // Useful if you only ever want one event per round while having a lot of different subtypes of the event. + var/event_class = null + + // Counter for how many times this event has been picked by the GM. + // Can be used to make event repeats discouraged but not forbidden by adjusting the weight based on it. + var/times_ran = 0 + + // A reference to the system that initialized us. + var/datum/controller/subsystem/game_master/GM = null + + // The type path to the event associated with this meta object. + // When the GM chooses this event, a new instance is made. + // Seperate instances allow for multiple concurrent events without sharing state, e.g. two blobs. + var/event_type = null + +/datum/event2/meta/New(datum/controller/subsystem/game_master/new_gm) + GM = new_gm + +/datum/event2/meta/Destroy() + GM = null + return ..() + + +// Called by the GM system to actually start an event. +/datum/event2/meta/proc/make_event() + var/datum/event2/event/E = new event_type(GM) + E.execute() + return E + +// Returns a TRUE or FALSE for if the GM system should be able to pick this event. +// Can be extended to check for more than just `enabled` later. +/datum/event2/meta/proc/can_pick() + return enabled + +/* + * Procs to Override + */ + +// Returns a number that determines how likely it is for the event to be picked over others. +// Individual events should override this for their own weights. +/datum/event2/meta/proc/get_weight() + return 0 + + +/datum/event2/meta/Topic(href, href_list) + if(..()) + return + + if(!check_rights(R_ADMIN|R_EVENT|R_DEBUG)) + message_admins("[usr] has attempted to manipulate an event without sufficent privilages.") + return + + if(href_list["force"]) + SSevent_ticker.start_event(event_type) + message_admins("Event '[name]' was forced by [usr.key].") + + if(href_list["toggle"]) + enabled = !enabled + message_admins("Event '[name]' was toggled [enabled ? "on" : "off"] by [usr.key].") + + SSgame_master.interact(usr) // To refresh the UI. \ No newline at end of file diff --git a/code/modules/gamemaster/game_master.dm b/code/modules/gamemaster/game_master.dm deleted file mode 100644 index 7220cb11a9..0000000000 --- a/code/modules/gamemaster/game_master.dm +++ /dev/null @@ -1,160 +0,0 @@ -// This is a sort of successor to the various event systems created over the years. It is designed to be just a tad smarter than the -// previous ones, checking various things like player count, department size and composition, individual player activity, -// individual player (IC) skill, and such, in order to try to choose the best actions to take in order to add spice or variety to -// the round. - -/datum/game_master - var/suspended = TRUE // If true, it will not do anything. - var/ignore_time_restrictions = FALSE// Useful for debugging without needing to wait 20 minutes each time. - var/list/available_actions = list() // A list of 'actions' that the GM has access to, to spice up a round, such as events. - var/danger = 0 // The GM's best guess at how chaotic the round is. High danger makes it hold back. - var/staleness = -20 // Determines liklihood of the GM doing something, increases over time. - var/danger_modifier = 1 // Multiplier for how much 'danger' is accumulated. - var/staleness_modifier = 1 // Ditto. Higher numbers generally result in more events occuring in a round. - var/ticks_completed = 0 // Counts amount of ticks completed. Note that this ticks once a minute. - var/next_action = 0 // Minimum amount of time of nothingness until the GM can pick something again. - var/last_department_used = null // If an event was done for a specific department, it is written here, so it doesn't do it again. - -/datum/game_master/New() - ..() - available_actions = init_subtypes(/datum/gm_action) - for(var/datum/gm_action/action in available_actions) - action.gm = src - - var/config_setup_delay = TRUE - spawn(0) - while(config_setup_delay) - if(config) - config_setup_delay = FALSE - if(config.enable_game_master) - suspended = FALSE - next_action = world.time + rand(15 MINUTES, 25 MINUTES) - else - sleep(30 SECONDS) - -/datum/game_master/process() - if(ticker && ticker.current_state == GAME_STATE_PLAYING && !suspended) - adjust_staleness(1) - adjust_danger(-1) - ticks_completed++ - - var/global_afk = metric.assess_all_living_mobs() - global_afk -= 100 - global_afk = abs(global_afk) - global_afk = round(global_afk / 100, 0.1) - adjust_staleness(global_afk) // Staleness increases faster if more people are less active. - - if(world.time < next_action && prob(staleness * 2) ) - log_debug("Game Master going to start something.") - start_action() - -// This is run before committing to an action/event. -/datum/game_master/proc/pre_action_checks() - if(!ticker || ticker.current_state != GAME_STATE_PLAYING) - log_debug("Game Master unable to start event: Ticker is nonexistant, or the game is not ongoing.") - return FALSE - if(suspended) - return FALSE - if(ignore_time_restrictions) - return TRUE - if(world.time < next_action) // Sanity. - log_debug("Game Master unable to start event: Time until next action is approximately [round((next_action - world.time) / (1 MINUTE))] minute(s)") - return FALSE - // Last minute antagging is bad for humans to do, so the GM will respect the start and end of the round. - var/mills = round_duration_in_ticks - var/mins = round((mills % 36000) / 600) - var/hours = round(mills / 36000) - - if(hours < 1 && mins <= 20) // Don't do anything for the first twenty minutes of the round. - log_debug("Game Master unable to start event: It is too early.") - return FALSE - if(hours >= 2 && mins >= 40) // Don't do anything in the last twenty minutes of the round, as well. - log_debug("Game Master unable to start event: It is too late.") - return FALSE - return TRUE - -/datum/game_master/proc/start_action() - if(!pre_action_checks()) // Make sure we're not doing last minute events, or early events. - return - log_debug("Game Master now starting action decision.") - var/list/most_active_departments = metric.assess_all_departments(3, list(last_department_used)) - var/list/best_actions = decide_best_action(most_active_departments) - - if(best_actions && best_actions.len) - var/list/weighted_actions = list() - for(var/datum/gm_action/action in best_actions) - if(action.chaotic > danger) - continue // We skip dangerous events when bad stuff is already occuring. - weighted_actions[action] = action.get_weight() - - var/datum/gm_action/choice = pickweight(weighted_actions) - if(choice) - log_debug("[choice.name] was chosen by the Game Master, and is now being ran.") - run_action(choice) - -/datum/game_master/proc/run_action(var/datum/gm_action/action) - action.set_up() - action.start() - action.announce() - if(action.chaotic) - danger += action.chaotic - if(action.length) - spawn(action.length) - action.end() - next_action = world.time + rand(5 MINUTES, 20 MINUTES) - last_department_used = action.departments[1] - - -/datum/game_master/proc/decide_best_action(var/list/most_active_departments) - if(!most_active_departments.len) // Server's empty? - log_debug("Game Master failed to find any active departments.") - return list() - - var/list/best_actions = list() // List of actions which involve the most active departments. - if(most_active_departments.len >= 2) - for(var/datum/gm_action/action in available_actions) - if(!action.enabled) - continue - // Try to incorporate an action with the top two departments first. - if(most_active_departments[1] in action.departments && most_active_departments[2] in action.departments) - best_actions.Add(action) - log_debug("[action.name] is being considered because both most active departments are involved.") - - if(best_actions.len) // We found something for those two, let's do it. - return best_actions - - // Otherwise we probably couldn't find something for the second highest group, so let's ignore them. - for(var/datum/gm_action/action in available_actions) - if(!action.enabled) - continue - if(most_active_departments[1] in action.departments) - best_actions.Add(action) - log_debug("[action.name] is being considered because the most active department is involved.") - - if(best_actions.len) // Found something for the one guy. - return best_actions - - // At this point we should expand our horizons. - for(var/datum/gm_action/action in available_actions) - if(!action.enabled) - continue - if(DEPARTMENT_EVERYONE in action.departments) - best_actions.Add(action) - log_debug("[action.name] is being considered because it involves everyone.") - - if(best_actions.len) // Finally, perhaps? - return best_actions - - // Just give a random event if for some reason it still can't make up its mind. - for(var/datum/gm_action/action in available_actions) - if(!action.enabled) - continue - best_actions.Add(action) - log_debug("[action.name] is being considered because everything else failed.") - - if(best_actions.len) // Finally, perhaps? - return best_actions - else - log_debug("Game Master failed to find a suitable event, something very wrong is going on.") - - diff --git a/code/modules/gamemaster/helpers.dm b/code/modules/gamemaster/helpers.dm deleted file mode 100644 index da05cb1b20..0000000000 --- a/code/modules/gamemaster/helpers.dm +++ /dev/null @@ -1,9 +0,0 @@ -// Tell the game master that something dangerous happened, e.g. someone dying. -/datum/game_master/proc/adjust_danger(var/amt) - amt = amt * danger_modifier - danger = round( CLAMP(danger + amt, 0, 1000), 0.1) - -// Tell the game master that something interesting happened. -/datum/game_master/proc/adjust_staleness(var/amt) - amt = amt * staleness_modifier - staleness = round( CLAMP(staleness + amt, -50, 200), 0.1) \ No newline at end of file diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index ed1ced9c78..5783bfc398 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -4,7 +4,7 @@ icon_keyboard = "tech_key" icon_screen = "holocontrol" - use_power = 1 + use_power = USE_POWER_IDLE active_power_usage = 8000 //8kW for the scenery + 500W per holoitem var/item_power_usage = 500 @@ -224,7 +224,7 @@ damaged = 1 loadProgram(powerdown_program, 0) active = 0 - use_power = 1 + update_use_power(USE_POWER_IDLE) for(var/mob/M in range(10,src)) M.show_message("The holodeck overloads!") @@ -271,7 +271,7 @@ linkedholodeck.gravitychange(1) active = 0 - use_power = 1 + update_use_power(USE_POWER_IDLE) /obj/machinery/computer/HolodeckControl/proc/loadProgram(var/prog, var/check_delay = 1) @@ -301,7 +301,7 @@ last_change = world.time active = 1 - use_power = 2 + use_power = USE_POWER_ACTIVE for(var/item in holographic_objs) derez(item) @@ -362,7 +362,7 @@ last_gravity_change = world.time active = 1 - use_power = 1 + use_power = USE_POWER_IDLE if(A.has_gravity) A.gravitychange(0) @@ -377,4 +377,4 @@ linkedholodeck.gravitychange(1) active = 0 - use_power = 1 + use_power = USE_POWER_IDLE diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index c6626c66e7..b3783460ad 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -58,8 +58,13 @@ /turf/simulated/floor/holofloor/space icon = 'icons/turf/space.dmi' + plane = SPACE_PLANE name = "\proper space" - icon_state = "0" + icon_state = "white" + +/turf/simulated/floor/holofloor/space/update_icon() + . = ..() + add_overlay(SSskybox.dust_cache["[((x + y) ^ ~(x * y) + z) % 25]"]) /turf/simulated/floor/holofloor/reinforced icon = 'icons/turf/flooring/tiles.dmi' @@ -67,9 +72,6 @@ name = "reinforced holofloor" icon_state = "reinforced" -/turf/simulated/floor/holofloor/space/New() - icon_state = "[((x + y) ^ ~(x * y) + z) % 25]" - /turf/simulated/floor/holofloor/beach desc = "Uncomfortably gritty for a hologram." base_desc = "Uncomfortably gritty for a hologram." @@ -391,7 +393,7 @@ datum/unarmed_attack/holopugilism/unarmed_override(var/mob/living/carbon/human/u var/eventstarted = 0 anchored = 1.0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 2 active_power_usage = 6 power_channel = ENVIRON diff --git a/code/modules/holomap/station_holomap.dm b/code/modules/holomap/station_holomap.dm index d38875f220..39a1c30452 100644 --- a/code/modules/holomap/station_holomap.dm +++ b/code/modules/holomap/station_holomap.dm @@ -8,7 +8,7 @@ icon_state = "station_map" anchored = 1 density = 0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 10 active_power_usage = 500 circuit = /obj/item/weapon/circuitboard/station_map @@ -33,16 +33,15 @@ /obj/machinery/station_map/New() ..() - holomap_datum = new() - original_zLevel = loc.z - SSholomaps.station_holomaps += src flags |= ON_BORDER // Why? It doesn't help if its not density /obj/machinery/station_map/Initialize() . = ..() + holomap_datum = new() + original_zLevel = loc.z + SSholomaps.station_holomaps += src if(SSholomaps.holomaps_initialized) - spawn(1) // Tragically we need to spawn this in order to give the frame construcing us time to set pixel_x/y - setup_holomap() + setup_holomap() /obj/machinery/station_map/Destroy() SSholomaps.station_holomaps -= src @@ -64,14 +63,12 @@ holomap_datum.initialize_holomap(T, reinit = TRUE) small_station_map = image(SSholomaps.extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[original_zLevel]"], dir = dir) - // small_station_map.plane = LIGHTING_PLANE // Not until we do planes ~Leshana - // small_station_map.layer = LIGHTING_LAYER+1 // Weird things will happen! floor_markings = image('icons/obj/machines/stationmap.dmi', "decal_station_map") floor_markings.dir = src.dir - // floor_markings.plane = ABOVE_TURF_PLANE // Not until we do planes ~Leshana - // floor_markings.layer = DECAL_LAYER - update_icon() + + spawn(1) //When built from frames, need to allow time for it to set pixel_x and pixel_y + update_icon() /obj/machinery/station_map/attack_hand(var/mob/user) if(watching_mob && (watching_mob != user)) @@ -126,7 +123,7 @@ GLOB.moved_event.register(watching_mob, src, /obj/machinery/station_map/proc/checkPosition) GLOB.dir_set_event.register(watching_mob, src, /obj/machinery/station_map/proc/checkPosition) GLOB.destroyed_event.register(watching_mob, src, /obj/machinery/station_map/proc/stopWatching) - update_use_power(2) + update_use_power(USE_POWER_ACTIVE) if(bogus) to_chat(user, "The holomap failed to initialize. This area of space cannot be mapped.") @@ -156,7 +153,7 @@ GLOB.dir_set_event.unregister(watching_mob, src) GLOB.destroyed_event.unregister(watching_mob, src) watching_mob = null - update_use_power(1) + update_use_power(USE_POWER_IDLE) /obj/machinery/station_map/power_change() . = ..() @@ -172,6 +169,9 @@ update_icon() /obj/machinery/station_map/update_icon() + if(!holomap_datum) + return //Not yet. + overlays.Cut() if(stat & BROKEN) icon_state = "station_mapb" diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 58a4b4ee5f..0cb0dbb0d3 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -13,46 +13,36 @@ var/datum/seed/seed var/potency = -1 -/obj/item/weapon/reagent_containers/food/snacks/grown/New(newloc,planttype) - - ..() +/obj/item/weapon/reagent_containers/food/snacks/grown/Initialize(var/mapload, var/planttype) + . = ..() + if(!dried_type) dried_type = type - src.pixel_x = rand(-5.0, 5) - src.pixel_y = rand(-5.0, 5) + + pixel_x = rand(-5.0, 5) + pixel_y = rand(-5.0, 5) - // Fill the object up with the appropriate reagents. if(planttype) plantname = planttype -/obj/item/weapon/reagent_containers/food/snacks/grown/Initialize() - ..() - spawn() - if(!plantname) - return + if(!plantname) + log_debug("Plantname not provided and and [src] requires it at [x],[y],[z]") + return INITIALIZE_HINT_QDEL - if(!plant_controller) - sleep(250) // ugly hack, should mean roundstart plants are fine. - if(!plant_controller) - to_world("Plant controller does not exist and [src] requires it. Aborting.") - qdel(src) - return + seed = plant_controller.seeds[plantname] - seed = plant_controller.seeds[plantname] + if(!seed) + log_debug("Plant name '[plantname]' does not exist and [src] requires it at [x],[y],[z]") + return INITIALIZE_HINT_QDEL - if(!seed) - return + name = "[seed.seed_name]" + trash = seed.get_trash_type() - name = "[seed.seed_name]" - trash = seed.get_trash_type() + update_icon() - update_icon() - - if(!seed.chems) - return - - potency = seed.get_trait(TRAIT_POTENCY) + potency = seed.get_trait(TRAIT_POTENCY) + if(seed.chems) for(var/rid in seed.chems) var/list/reagent_data = seed.chems[rid] if(reagent_data && reagent_data.len) diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 626882ee95..8bce59600f 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -103,7 +103,7 @@ var/injecting = min(5,max(1,get_trait(TRAIT_POTENCY)/3)) R.add_reagent(rid,injecting) - var/datum/effect/effect/system/smoke_spread/chem/spores/S = new(name) + var/datum/effect/effect/system/smoke_spread/chem/spores/S = new(src) S.attach(T) S.set_up(R, round(get_trait(TRAIT_POTENCY)/4), 0, T) S.start() @@ -228,6 +228,7 @@ open_turfs |= origin_turf // Flood fill to get affected turfs. + // NOTE: Halfass bugfix implemented using air_blocked() but this really should be redone completely ~Leshana while(open_turfs.len) var/turf/T = pick(open_turfs) open_turfs -= T @@ -245,11 +246,11 @@ var/no_los var/turf/last_turf = origin_turf for(var/turf/target_turf in getline(origin_turf,neighbor)) - if(!last_turf.Enter(target_turf) || target_turf.density) + if(air_master.air_blocked(last_turf, target_turf)) no_los = 1 break last_turf = target_turf - if(!no_los && !origin_turf.Enter(neighbor)) + if(!no_los && air_master.air_blocked(origin_turf, neighbor)) no_los = 1 if(no_los) closed_turfs |= neighbor @@ -689,11 +690,11 @@ for(var/gas in exude_gasses) exude_gasses[gas] = max(1,round(exude_gasses[gas]*0.8)) - set_trait(TRAIT_BENEFICIAL_REAG, gene.values["[TRAIT_BENEFICIAL_REAG]"].Copy()) + set_trait(TRAIT_BENEFICIAL_REAG, gene.values["[TRAIT_BENEFICIAL_REAG]"]?.Copy() || list()) - set_trait(TRAIT_MUTAGENIC_REAG, gene.values["[TRAIT_MUTAGENIC_REAG]"].Copy()) + set_trait(TRAIT_MUTAGENIC_REAG, gene.values["[TRAIT_MUTAGENIC_REAG]"]?.Copy() || list()) - set_trait(TRAIT_TOXIC_REAG, gene.values["[TRAIT_TOXIC_REAG]"].Copy()) + set_trait(TRAIT_TOXIC_REAG, gene.values["[TRAIT_TOXIC_REAG]"]?.Copy() || list()) gene.values["[TRAIT_EXUDE_GASSES]"] = null gene.values["[TRAIT_CHEMS]"] = null diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index 2acfa4fb72..affddf1168 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -37,7 +37,7 @@ icon_state = "hydrotray3" density = 1 anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE var/obj/item/seeds/seed // Currently loaded seed packet. var/obj/item/weapon/disk/botany/loaded_disk //Currently loaded data disk. @@ -68,15 +68,15 @@ active = 0 if(failed_task) failed_task = 0 - visible_message("\icon[src] [src] pings unhappily, flashing a red warning light.") + visible_message("[bicon(src)] [src] pings unhappily, flashing a red warning light.") else - visible_message("\icon[src] [src] pings happily.") + visible_message("[bicon(src)] [src] pings happily.") if(eject_disk) eject_disk = 0 if(loaded_disk) loaded_disk.loc = get_turf(src) - visible_message("\icon[src] [src] beeps and spits out [loaded_disk].") + visible_message("[bicon(src)] [src] beeps and spits out [loaded_disk].") loaded_disk = null /obj/machinery/botany/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -190,14 +190,14 @@ plant_controller.seeds[seed.seed.name] = seed.seed seed.update_seed() - visible_message("\icon[src] [src] beeps and spits out [seed].") + visible_message("[bicon(src)] [src] beeps and spits out [seed].") seed = null if(href_list["eject_disk"]) if(!loaded_disk) return loaded_disk.loc = get_turf(src) - visible_message("\icon[src] [src] beeps and spits out [loaded_disk].") + visible_message("[bicon(src)] [src] beeps and spits out [loaded_disk].") loaded_disk = null usr.set_machine(src) diff --git a/code/modules/hydroponics/seed_mobs.dm b/code/modules/hydroponics/seed_mobs.dm index 0c9441dbac..8b5c4a56a1 100644 --- a/code/modules/hydroponics/seed_mobs.dm +++ b/code/modules/hydroponics/seed_mobs.dm @@ -12,7 +12,7 @@ spawn(75) if(!host.ckey && !host.client) host.death() // This seems redundant, but a lot of mobs don't - host.stat = DEAD // handle death() properly. Better safe than etc. + host.set_stat(DEAD) // handle death() properly. Better safe than etc. host.visible_message("[host] is malformed and unable to survive. It expires pitifully, leaving behind some seeds.") var/total_yield = rand(1,3) diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index cc29f0c05f..053ce5a59c 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -24,7 +24,7 @@ icon_state = "seeds" density = 1 anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 100 var/seeds_initialized = 0 // Map-placed ones break if seeds are loaded right at the start of the round, so we do it on the first interaction diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 53e4e87627..e3ac11ed76 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -7,7 +7,7 @@ for(var/areapath in typesof(/area/hallway)) var/area/A = locate(areapath) for(var/turf/simulated/floor/F in A.contents) - if(turf_clear(F)) + if(!F.check_density()) turfs += F if(turfs.len) //Pick a turf to spawn at if we can diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm index d6297a6766..76a3417645 100644 --- a/code/modules/hydroponics/trays/tray_soil.dm +++ b/code/modules/hydroponics/trays/tray_soil.dm @@ -2,7 +2,7 @@ name = "soil" icon_state = "soil" density = 0 - use_power = 0 + use_power = USE_POWER_OFF mechanical = 0 tray_light = 0 frozen = -1 diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index b540aaec2e..896deca111 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -265,9 +265,11 @@ else if(istype(I, /obj/item/device/integrated_electronics/wirer) || istype(I, /obj/item/device/integrated_electronics/debugger) || I.is_screwdriver()) if(opened) interact(user) + return TRUE else to_chat(user, "\The [src] isn't opened, so you can't fiddle with the internal components. \ Try using a crowbar.") + return FALSE else if(istype(I, /obj/item/device/integrated_electronics/detailer)) var/obj/item/device/integrated_electronics/detailer/D = I @@ -365,3 +367,7 @@ /obj/item/device/electronic_assembly/proc/on_unanchored() for(var/obj/item/integrated_circuit/IC in contents) IC.on_unanchored() + +// Returns TRUE if I is something that could/should have a valid interaction. Used to tell circuitclothes to hit the circuit with something instead of the clothes +/obj/item/device/electronic_assembly/proc/is_valid_tool(var/obj/item/I) + return I.is_crowbar() || I.is_screwdriver() || istype(I, /obj/item/integrated_circuit) || istype(I, /obj/item/weapon/cell/device) || istype(I, /obj/item/device/integrated_electronics) \ No newline at end of file diff --git a/code/modules/integrated_electronics/core/assemblies/clothing.dm b/code/modules/integrated_electronics/core/assemblies/clothing.dm index 4415d367f8..2b0b75f69f 100644 --- a/code/modules/integrated_electronics/core/assemblies/clothing.dm +++ b/code/modules/integrated_electronics/core/assemblies/clothing.dm @@ -51,13 +51,12 @@ IC.examine(user) ..() -/obj/item/clothing/attackby(obj/item/I, mob/user) - if(IC) - // This needs to be done in a better way... - if(I.is_crowbar() || I.is_screwdriver() || istype(I, /obj/item/integrated_circuit) || istype(I, /obj/item/weapon/cell/device) || istype(I, /obj/item/device/integrated_electronics) ) - IC.attackby(I, user) - else - ..() +/obj/item/clothing/CtrlShiftClick(mob/user) + var/turf/T = get_turf(src) + if(!T.AdjacentQuick(user)) // So people aren't messing with these from across the room + return FALSE + var/obj/item/I = user.get_active_hand() // ctrl-shift-click doesn't give us the item, we have to fetch it + return IC.attackby(I, user) /obj/item/clothing/attack_self(mob/user) if(IC) @@ -105,6 +104,7 @@ /obj/item/clothing/under/circuitry name = "electronic jumpsuit" desc = "It's a wearable case for electronics. This on is a black jumpsuit with wiring weaved into the fabric." + description_info = "Control-shift-click on this with an item in hand to use it on the integrated circuit." icon_state = "circuitry" worn_state = "circuitry" @@ -118,6 +118,7 @@ name = "electronic gloves" desc = "It's a wearable case for electronics. This one is a pair of black gloves, with wires woven into them. A small \ device with a screen is attached to the left glove." + description_info = "Control-shift-click on this with an item in hand to use it on the integrated circuit." icon_state = "circuitry" item_state = "circuitry" @@ -131,6 +132,7 @@ name = "electronic goggles" desc = "It's a wearable case for electronics. This one is a pair of goggles, with wiring sticking out. \ Could this augment your vision?" // Sadly it won't, or at least not yet. + description_info = "Control-shift-click on this with an item in hand to use it on the integrated circuit." icon_state = "circuitry" item_state = "night" // The on-mob sprite would be identical anyways. @@ -143,6 +145,7 @@ name = "electronic boots" desc = "It's a wearable case for electronics. This one is a pair of boots, with wires attached to a small \ cover." + description_info = "Control-shift-click on this with an item in hand to use it on the integrated circuit." icon_state = "circuitry" item_state = "circuitry" @@ -155,6 +158,7 @@ name = "electronic headwear" desc = "It's a wearable case for electronics. This one appears to be a very technical-looking piece that \ goes around the collar, with a heads-up-display attached on the right." + description_info = "Control-shift-click on this with an item in hand to use it on the integrated circuit." icon_state = "circuitry" item_state = "circuitry" @@ -166,6 +170,7 @@ /obj/item/clothing/ears/circuitry name = "electronic earwear" desc = "It's a wearable case for electronics. This one appears to be a technical-looking headset." + description_info = "Control-shift-click on this with an item in hand to use it on the integrated circuit." icon = 'icons/obj/clothing/ears.dmi' icon_state = "circuitry" item_state = "circuitry" @@ -179,6 +184,7 @@ name = "electronic chestpiece" desc = "It's a wearable case for electronics. This one appears to be a very technical-looking vest, that \ almost looks professionally made, however the wiring popping out betrays that idea." + description_info = "Control-shift-click on this with an item in hand to use it on the integrated circuit." icon_state = "circuitry" item_state = "circuitry" diff --git a/code/modules/integrated_electronics/core/tools.dm b/code/modules/integrated_electronics/core/tools.dm index 23e8e3f24b..79533bfe25 100644 --- a/code/modules/integrated_electronics/core/tools.dm +++ b/code/modules/integrated_electronics/core/tools.dm @@ -276,60 +276,54 @@ ) cant_hold = list(/obj/item/weapon/tool/screwdriver/power) -/obj/item/weapon/storage/bag/circuits/basic/New() - ..() - spawn(2 SECONDS) // So the list has time to initialize. -// for(var/obj/item/integrated_circuit/IC in all_integrated_circuits) -// if(IC.spawn_flags & IC_SPAWN_DEFAULT) -// for(var/i = 1 to 4) -// new IC.type(src) - new /obj/item/weapon/storage/bag/circuits/mini/arithmetic(src) - new /obj/item/weapon/storage/bag/circuits/mini/trig(src) - new /obj/item/weapon/storage/bag/circuits/mini/input(src) - new /obj/item/weapon/storage/bag/circuits/mini/output(src) - new /obj/item/weapon/storage/bag/circuits/mini/memory(src) - new /obj/item/weapon/storage/bag/circuits/mini/logic(src) - new /obj/item/weapon/storage/bag/circuits/mini/time(src) - new /obj/item/weapon/storage/bag/circuits/mini/reagents(src) - new /obj/item/weapon/storage/bag/circuits/mini/transfer(src) - new /obj/item/weapon/storage/bag/circuits/mini/converter(src) - new /obj/item/weapon/storage/bag/circuits/mini/power(src) +/obj/item/weapon/storage/bag/circuits/basic/Initialize() + . = ..() + new /obj/item/weapon/storage/bag/circuits/mini/arithmetic(src) + new /obj/item/weapon/storage/bag/circuits/mini/trig(src) + new /obj/item/weapon/storage/bag/circuits/mini/input(src) + new /obj/item/weapon/storage/bag/circuits/mini/output(src) + new /obj/item/weapon/storage/bag/circuits/mini/memory(src) + new /obj/item/weapon/storage/bag/circuits/mini/logic(src) + new /obj/item/weapon/storage/bag/circuits/mini/time(src) + new /obj/item/weapon/storage/bag/circuits/mini/reagents(src) + new /obj/item/weapon/storage/bag/circuits/mini/transfer(src) + new /obj/item/weapon/storage/bag/circuits/mini/converter(src) + new /obj/item/weapon/storage/bag/circuits/mini/power(src) - new /obj/item/device/electronic_assembly(src) - new /obj/item/device/assembly/electronic_assembly(src) - new /obj/item/device/assembly/electronic_assembly(src) - new /obj/item/device/multitool(src) - new /obj/item/weapon/tool/screwdriver(src) - new /obj/item/weapon/tool/crowbar(src) - make_exact_fit() + new /obj/item/device/electronic_assembly(src) + new /obj/item/device/assembly/electronic_assembly(src) + new /obj/item/device/assembly/electronic_assembly(src) + new /obj/item/device/multitool(src) + new /obj/item/weapon/tool/screwdriver(src) + new /obj/item/weapon/tool/crowbar(src) + make_exact_fit() -/obj/item/weapon/storage/bag/circuits/all/New() - ..() - spawn(2 SECONDS) // So the list has time to initialize. - new /obj/item/weapon/storage/bag/circuits/mini/arithmetic/all(src) - new /obj/item/weapon/storage/bag/circuits/mini/trig/all(src) - new /obj/item/weapon/storage/bag/circuits/mini/input/all(src) - new /obj/item/weapon/storage/bag/circuits/mini/output/all(src) - new /obj/item/weapon/storage/bag/circuits/mini/memory/all(src) - new /obj/item/weapon/storage/bag/circuits/mini/logic/all(src) - new /obj/item/weapon/storage/bag/circuits/mini/smart/all(src) - new /obj/item/weapon/storage/bag/circuits/mini/manipulation/all(src) - new /obj/item/weapon/storage/bag/circuits/mini/time/all(src) - new /obj/item/weapon/storage/bag/circuits/mini/reagents/all(src) - new /obj/item/weapon/storage/bag/circuits/mini/transfer/all(src) - new /obj/item/weapon/storage/bag/circuits/mini/converter/all(src) - new /obj/item/weapon/storage/bag/circuits/mini/power/all(src) +/obj/item/weapon/storage/bag/circuits/all/Initialize() + . = ..() + new /obj/item/weapon/storage/bag/circuits/mini/arithmetic/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/trig/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/input/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/output/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/memory/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/logic/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/smart/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/manipulation/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/time/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/reagents/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/transfer/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/converter/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/power/all(src) - new /obj/item/device/electronic_assembly(src) - new /obj/item/device/electronic_assembly/medium(src) - new /obj/item/device/electronic_assembly/large(src) - new /obj/item/device/electronic_assembly/drone(src) - new /obj/item/device/integrated_electronics/wirer(src) - new /obj/item/device/integrated_electronics/debugger(src) - new /obj/item/weapon/tool/crowbar(src) - make_exact_fit() + new /obj/item/device/electronic_assembly(src) + new /obj/item/device/electronic_assembly/medium(src) + new /obj/item/device/electronic_assembly/large(src) + new /obj/item/device/electronic_assembly/drone(src) + new /obj/item/device/integrated_electronics/wirer(src) + new /obj/item/device/integrated_electronics/debugger(src) + new /obj/item/weapon/tool/crowbar(src) + make_exact_fit() -/obj/item/weapon/storage/bag/circuits/mini/ +/obj/item/weapon/storage/bag/circuits/mini name = "circuit box" desc = "Used to partition categories of circuits, for a neater workspace." w_class = 2 diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index dc17f3323b..37504035c0 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -416,7 +416,7 @@ if(loc) for(var/mob/O in hearers(1, get_turf(src))) - O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2) + O.show_message("[bicon(src)] *beep* *beep*", 3, "*beep* *beep*", 2) /obj/item/integrated_circuit/input/EPv2 name = "\improper EPv2 circuit" diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm index 61fcae72f9..000e492a22 100644 --- a/code/modules/integrated_electronics/subtypes/output.dm +++ b/code/modules/integrated_electronics/subtypes/output.dm @@ -43,7 +43,7 @@ var/list/nearby_things = range(0, get_turf(src)) for(var/mob/M in nearby_things) var/obj/O = assembly ? assembly : src - to_chat(M, "\icon[O] [stuff_to_display]") + to_chat(M, "[bicon(O)] [stuff_to_display]") /obj/item/integrated_circuit/output/screen/large name = "large screen" @@ -56,7 +56,7 @@ /obj/item/integrated_circuit/output/screen/large/do_work() ..() var/obj/O = assembly ? loc : assembly - O.visible_message("\icon[O] [stuff_to_display]") + O.visible_message("[bicon(O)] [stuff_to_display]") /obj/item/integrated_circuit/output/light name = "light" @@ -134,7 +134,7 @@ text = get_pin_data(IC_INPUT, 1) if(!isnull(text)) var/obj/O = assembly ? loc : assembly - audible_message("\icon[O] \The [O.name] states, \"[text]\"") + audible_message("[bicon(O)] \The [O.name] states, \"[text]\"") /obj/item/integrated_circuit/output/text_to_speech/advanced name = "advanced text-to-speech circuit" diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index 743a0d8e2b..bc3c099091 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -9,12 +9,6 @@ var/tmp/list/datum/lighting_corner/corners var/tmp/has_opaque_atom = FALSE // Not to be confused with opacity, this will be TRUE if there's any opaque atom on the tile. -/turf/New() - . = ..() - - if(opacity) - has_opaque_atom = TRUE - // Causes any affecting light sources to be queued for a visibility update, for example a door got opened. /turf/proc/reconsider_lights() for(var/datum/light_source/L in affecting_lights) diff --git a/code/modules/looking_glass/lg_area.dm b/code/modules/looking_glass/lg_area.dm new file mode 100644 index 0000000000..b17c67449f --- /dev/null +++ b/code/modules/looking_glass/lg_area.dm @@ -0,0 +1,78 @@ +/area/looking_glass + name = "make a subtype" + + var/obj/effect/landmark/looking_glass/our_landmark + var/list/our_turfs = list() + var/list/our_optional_turfs = list() + + var/lg_id + + var/active = FALSE + +/area/looking_glass/Initialize() + . = ..() + our_landmark = locate() in src + if(!our_landmark) + testing("Looking glass area [name] couldn't find a landmark") + for(var/turf/simulated/floor/looking_glass/lgt in src) + our_turfs += lgt + if(lgt.optional) + our_optional_turfs += lgt + +/area/looking_glass/Destroy() + our_landmark = null + our_turfs.Cut() + return ..() + +/area/looking_glass/Entered(var/atom/movable/AM) + if(isliving(AM)) + var/mob/living/L = AM + if(L.client) + our_landmark?.gain_viewer(L.client) + +/area/looking_glass/Exited(var/atom/movable/AM) + if(isliving(AM)) + var/mob/living/L = AM + if(L.client) + our_landmark?.lose_viewer(L.client) + +/area/looking_glass/proc/begin_program(var/image/newimage) + if(!active) + for(var/trf in our_turfs) + var/turf/simulated/floor/looking_glass/lgt = trf + lgt.activate() + + our_landmark.take_image(newimage) + active = TRUE + +/area/looking_glass/proc/end_program() + if(active) + for(var/trf in our_turfs) + var/turf/simulated/floor/looking_glass/lgt = trf + lgt.deactivate() + + active = FALSE + + spawn(2 SECONDS) + our_landmark.drop_image() + +/area/looking_glass/proc/toggle_optional(var/transparent) + for(var/trf in our_optional_turfs) + var/turf/simulated/floor/looking_glass/lgt = trf + lgt.center = !transparent + if(active) + lgt.deactivate() + spawn(3 SECONDS) + lgt.activate() + +/area/looking_glass/lg_1 + name = "looking glass one" + lg_id = "one" + +/area/looking_glass/lg_2 + name = "looking glass two" + lg_id = "two" + +/area/looking_glass/lg_3 + name = "looking glass three" + lg_id = "three" diff --git a/code/modules/looking_glass/lg_console.dm b/code/modules/looking_glass/lg_console.dm new file mode 100644 index 0000000000..f4a5a97b6b --- /dev/null +++ b/code/modules/looking_glass/lg_console.dm @@ -0,0 +1,162 @@ +/obj/machinery/computer/looking_glass + name = "looking glass control" + desc = "Controls the looking glass displays in this room. Provided courtesy of KHI." + + icon_keyboard = "tech_key" + icon_screen = "holocontrol" + + var/static/list/supported_programs = list() + var/static/list/secret_programs = list() + + use_power = USE_POWER_IDLE + active_power_usage = 8000 + + var/current_program = "Off" + var/area/looking_glass/my_area + var/last_gravity_change = 0 + var/ready = TRUE + var/immersion = FALSE + + var/lg_id = "change_me" + +/obj/machinery/computer/looking_glass/Initialize() + . = ..() + for(var/area/looking_glass/lga in world) + if(lga.lg_id == lg_id) + my_area = lga + break + if(!istype(my_area)) + testing("Looking glass console [x],[y],[x] not in a looking glass area.") + if(!supported_programs.len) + supported_programs["Off"] = null + supported_programs["Diagnostics"] = image(icon = 'icons/skybox/skybox.dmi', icon_state = "diagnostic") + supported_programs["Space 1"] = image(icon = 'icons/skybox/skybox.dmi', icon_state = "space1") + supported_programs["Space 2"] = image(icon = 'icons/skybox/skybox.dmi', icon_state = "space2") + supported_programs["Space 3"] = image(icon = 'icons/skybox/skybox.dmi', icon_state = "space3") + supported_programs["Space 4"] = image(icon = 'icons/skybox/skybox.dmi', icon_state = "space4") + supported_programs["Space 5"] = image(icon = 'icons/skybox/skybox.dmi', icon_state = "space5") + supported_programs["Space 6"] = image(icon = 'icons/skybox/skybox.dmi', icon_state = "space6") + +/obj/machinery/computer/looking_glass/Destroy() + my_area = null + return ..() + +/obj/machinery/computer/looking_glass/attack_ai(var/mob/user as mob) + return src.attack_hand(user) + +/obj/machinery/computer/looking_glass/attack_hand(var/mob/user as mob) + if(..()) + return + user.set_machine(src) + + ui_interact(user) + +/obj/machinery/computer/looking_glass/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + user.set_machine(src) + + var/list/data = list() + var/program_list[0] + + for(var/P in supported_programs) + program_list[++program_list.len] = P + + if(emagged) + for(var/P in secret_programs) + program_list[++program_list.len] = P + + data["supportedPrograms"] = program_list + data["currentProgram"] = current_program + data["immersion"] = immersion + if(my_area?.has_gravity) + data["gravity"] = 1 + else + data["gravity"] = null + + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "lookingglass.tmpl", src.name, 400, 550) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(20) + +/obj/machinery/computer/looking_glass/Topic(href, href_list) + if(..()) + return 1 + if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) + usr.set_machine(src) + + if(href_list["program"]) + if(ready) + var/prog = href_list["program"] + if(prog == "Off") + current_program = "Off" + unload_program() + else if((prog in supported_programs) || (emagged && (prog in secret_programs))) + current_program = prog + load_program(prog) + else + visible_message("ERROR. Recalibrating displays.") + + else if(href_list["gravity"]) + toggle_gravity(my_area) + + else if(href_list["immersion"]) + immersion = !immersion + my_area.toggle_optional(immersion) + + src.add_fingerprint(usr) + + SSnanoui.update_uis(src) + +/obj/machinery/computer/looking_glass/emag_act(var/remaining_charges, var/mob/user as mob) + if (!emagged) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + emagged = 1 + to_chat(user, "You unlock several programs that were hidden somewhere in memory.") + log_game("[key_name(usr)] emagged the [name]") + return 1 + return + +/obj/machinery/computer/looking_glass/proc/load_program(var/prog_name) + ready = FALSE + VARSET_IN(src, ready, TRUE, 10 SECONDS) + + if(prog_name in supported_programs) + my_area.begin_program(supported_programs[prog_name]) + else if(prog_name in secret_programs) + my_area.begin_program(secret_programs[prog_name]) + +/obj/machinery/computer/looking_glass/proc/unload_program() + ready = FALSE + VARSET_IN(src, ready, TRUE, 10 SECONDS) + + my_area.end_program() + +/obj/machinery/computer/looking_glass/proc/toggle_gravity(var/area/A) + if(world.time < (last_gravity_change + 3 SECONDS)) + if(world.time < (last_gravity_change + 1 SECOND)) + return + visible_message("ERROR. Recalibrating gravity field.") + return + + last_gravity_change = world.time + + if(A.has_gravity) + A.gravitychange(0) + else + A.gravitychange(1) + +//This could all be done better, but it works for now. +/obj/machinery/computer/looking_glass/Destroy() + unload_program() + ..() + +/obj/machinery/computer/looking_glass/ex_act(severity) + unload_program() + ..() + +/obj/machinery/computer/looking_glass/power_change() + var/oldstat = stat + ..() + if (stat != oldstat && (stat & NOPOWER)) + unload_program() \ No newline at end of file diff --git a/code/modules/looking_glass/lg_imageholder.dm b/code/modules/looking_glass/lg_imageholder.dm new file mode 100644 index 0000000000..0d4cf5b157 --- /dev/null +++ b/code/modules/looking_glass/lg_imageholder.dm @@ -0,0 +1,66 @@ +#define LG_IMAGE_SIZE 736 + +/obj/effect/landmark/looking_glass + var/image/holding + + var/list/viewers + + var/lg_id //Area sets this for you + + mouse_opacity = 0 + +/obj/effect/landmark/looking_glass/Initialize() + . = ..() + viewers = list() + +/obj/effect/landmark/looking_glass/proc/gain_viewer(var/client/C) + if(C in viewers) + testing("Looking Glass [x],[y],[z] tried to add a duplicate viewer.") + viewers |= C + if(holding) + show_to(C) + +/obj/effect/landmark/looking_glass/proc/lose_viewer(var/client/C) + if(!(C in viewers)) + testing("Looking Glass [x],[y],[z] tried to remove a viewer it didn't have") + viewers -= C + if(holding) + unshow_to(C) + +/obj/effect/landmark/looking_glass/proc/show_to(var/client/C) + C.images |= holding + +/obj/effect/landmark/looking_glass/proc/unshow_to(var/client/C) + C.images -= holding + +/obj/effect/landmark/looking_glass/proc/take_image(var/image/newimage) + if(!istype(newimage)) + return + + if(holding) + for(var/client in viewers) + unshow_to(client) + + holding = newimage + newimage.plane = PLANE_LOOKINGGLASS_IMG + newimage.blend_mode = BLEND_MULTIPLY + newimage.appearance_flags = RESET_TRANSFORM + newimage.mouse_opacity = 0 + newimage.pixel_y = newimage.pixel_x = (LG_IMAGE_SIZE/-2) + 16 + newimage.loc = src + + for(var/client in viewers) + show_to(client) + +/obj/effect/landmark/looking_glass/proc/drop_image() + if(!holding) + return + + for(var/client in viewers) + unshow_to(client) + + holding.loc = null + holding = null + + +#undef LG_IMAGE_SIZE \ No newline at end of file diff --git a/code/modules/looking_glass/lg_turfs.dm b/code/modules/looking_glass/lg_turfs.dm new file mode 100644 index 0000000000..189790335d --- /dev/null +++ b/code/modules/looking_glass/lg_turfs.dm @@ -0,0 +1,88 @@ +/decl/flooring/looking_glass + name = "looking glass surface" + desc = "Too expensive to replace. Don't break it!" + icon = 'icons/turf/flooring/lg_origin.dmi' + icon_base = "origin" + build_type = null + damage_temperature = T0C+200 + + +/turf/simulated/floor/looking_glass + name = "looking glass surface" + icon = 'icons/turf/flooring/lg_origin.dmi' + icon_state = "origin_arrow" + initial_flooring = /decl/flooring/looking_glass + appearance_flags = TILE_BOUND + dynamic_lighting = FALSE + + var/center = FALSE + var/optional = FALSE + +/turf/simulated/floor/looking_glass/center + center = TRUE + icon_state = "origin_center" + +/turf/simulated/floor/looking_glass/optional + center = TRUE + optional = TRUE + icon_state = "origin_optional_arrow" + +/turf/simulated/floor/looking_glass/proc/activate() + set waitfor = FALSE + + icon_state = "origin_switching" + + animate(src, color = "#000000", time = 3 SECONDS) + + sleep(3 SECONDS) + + var/new_x = 0 + var/new_y = 0 + + if(dir & NORTH) + new_y = 112 + else if(dir & SOUTH) + new_y = -112 + + if(dir & EAST) + new_x = 112 + else if(dir & WEST) + new_x = -112 + + var/matrix/M = matrix() + var/mutable_appearance/MA = new (src) + + if(!center) + var/horizontal = (dir & (WEST|EAST)) + var/vertical = (dir & (NORTH|SOUTH)) + M.Scale(horizontal ? 8 : 1, vertical ? 8 : 1) + M.Translate(new_x, new_y) + MA.opacity = 1 + if(!optional) + MA.density = 1 + + MA.icon_state = "origin_active" + MA.plane = PLANE_LOOKINGGLASS + MA.layer = 0 + appearance = MA + + animate(src, color = "#FFFFFF", transform = M, time = 3 SECONDS) + +/turf/simulated/floor/looking_glass/proc/deactivate() + set waitfor = FALSE + + animate(src, color = "#000000", transform = matrix(), time = 3 SECONDS) + + sleep(3 SECONDS) + var/mutable_appearance/MA = new (src) + MA.opacity = 0 + MA.density = 0 + MA.icon_state = "origin_switching" + MA.plane = initial(plane) + MA.layer = initial(layer) + appearance = MA + + animate(src, color = null, time = 3 SECONDS) + sleep(3 SECONDS) + icon_state = "origin" + diff --git a/code/modules/metric/count.dm b/code/modules/metric/count.dm index 3900aaaa97..ba3678295f 100644 --- a/code/modules/metric/count.dm +++ b/code/modules/metric/count.dm @@ -21,3 +21,47 @@ if(assess_player_activity(L) >= cutoff) num++ return num + +// Gives a count of how many human mobs of a specific species are on the station. +// Note that `ignore_synths` makes this proc ignore posibrains and drones, but NOT cyborgs, as they are still the same species in-universe. +/datum/metric/proc/count_all_of_specific_species(species_name, ignore_synths = TRUE, cutoff = 75, respect_z = TRUE) + var/num = 0 + for(var/mob/living/carbon/human/H in player_list) + if(respect_z && !(H.z in using_map.station_levels)) + continue + if(ignore_synths && H.isSynthetic() && H.get_FBP_type() != FBP_CYBORG) + continue + if(H.species.name == species_name) + if(assess_player_activity(H) >= cutoff) + num++ + return num + +// Gives a count of how many FBPs of a specific type there are on the station. +/datum/metric/proc/count_all_FBPs_of_kind(desired_FBP_class, cutoff = 75, respect_z = TRUE) + var/num = 0 + for(var/mob/living/carbon/human/H in player_list) + if(respect_z && !(H.z in using_map.station_levels)) + continue + if(H.get_FBP_type() != desired_FBP_class) + continue + if(assess_player_activity(H) >= cutoff) + num++ + return num + +// Like above, but for all FBPs. +/datum/metric/proc/count_all_FBPs(cutoff = 75, respect_z = TRUE) + var/num = count_all_FBPs_of_kind(FBP_CYBORG, cutoff, respect_z) + num += count_all_FBPs_of_kind(FBP_POSI, cutoff, respect_z) + num += count_all_FBPs_of_kind(FBP_DRONE, cutoff, respect_z) + return num + + +/datum/metric/proc/get_all_antags(cutoff = 75) + . = list() + for(var/mob/living/L in player_list) + if(L.mind && player_is_antag(L.mind) && assess_player_activity(L) >= cutoff) + . += L + +/datum/metric/proc/count_all_antags(cutoff = 75) + var/list/L = get_all_antags(cutoff) + return L.len \ No newline at end of file diff --git a/code/modules/metric/department.dm b/code/modules/metric/department.dm index acb58101f1..89a0f78ed9 100644 --- a/code/modules/metric/department.dm +++ b/code/modules/metric/department.dm @@ -29,44 +29,88 @@ return DEPARTMENT_UNKNOWN // Welp. +// Similar to above, but gets the actual job. Note that it returns the job datum itself, or null. +/datum/metric/proc/guess_job(mob/M) + // Like before, records are the most reliable way. + var/datum/data/record/R = find_general_record("name", M.real_name) + if(R) // They got a record, now find the job datum. + var/datum/job/J = SSjob.get_job(R.fields["real_rank"]) + if(istype(J)) + return J + + // Try the mind. + if(M.mind) + var/datum/job/J = SSjob.get_job(M.mind.assigned_role) + if(istype(J)) + return J + + // Last ditch effort, check for job assigned to the mob itself. + var/datum/job/J = SSjob.get_job(M.job) + if(istype(J)) + return J + + return null + // Feed this proc the name of a job, and it will try to figure out what department they are apart of. -// Note that this returns a list, as some jobs are in more than one department, like Command. The 'primary' department is the first -// in the list, e.g. a HoS has Security as first, Command as second in the returned list. +// Improved with the addition of SSjob, which has departments be an actual thing and not a virtual concept. /datum/metric/proc/role_name_to_department(var/role_name) - var/list/result = list() + var/datum/job/J = SSjob.get_job(role_name) + if(istype(J)) + if(LAZYLEN(J.departments)) + return J.departments + return list(DEPARTMENT_UNKNOWN) - if(SSjob.is_job_in_department(role_name, DEPARTMENT_SECURITY)) - result += DEPARTMENT_SECURITY +/datum/metric/proc/count_people_in_department(var/department, cutoff = 75) + var/list/L = get_people_in_department(department, cutoff) + return L.len - if(SSjob.is_job_in_department(role_name, DEPARTMENT_ENGINEERING)) - result += DEPARTMENT_ENGINEERING - if(SSjob.is_job_in_department(role_name, DEPARTMENT_MEDICAL)) - result += DEPARTMENT_MEDICAL - - if(SSjob.is_job_in_department(role_name, DEPARTMENT_RESEARCH)) - result += DEPARTMENT_RESEARCH - - if(SSjob.is_job_in_department(role_name, DEPARTMENT_CARGO)) - result += DEPARTMENT_CARGO - - if(SSjob.is_job_in_department(role_name, DEPARTMENT_CIVILIAN)) - result += DEPARTMENT_CIVILIAN - - if(SSjob.is_job_in_department(role_name, DEPARTMENT_SYNTHETIC)) - result += DEPARTMENT_SYNTHETIC - - if(SSjob.is_job_in_department(role_name, DEPARTMENT_COMMAND)) // We do Command last, since we consider command to only be a primary department for hop/admin. - result += DEPARTMENT_COMMAND - - if(!result.len) // No department was found. - result += DEPARTMENT_UNKNOWN - return result - -/datum/metric/proc/count_people_in_department(var/department) +/datum/metric/proc/get_people_in_department(department, cutoff = 75) + . = list() if(!department) return for(var/mob/M in player_list) - if(guess_department(M) != department) // Ignore people outside the department we're counting. + if(department != DEPARTMENT_EVERYONE && guess_department(M) != department) // Ignore people outside the department we're counting. continue - . += 1 + if(assess_player_activity(M) < cutoff) + continue + . += M + +/datum/metric/proc/get_people_with_job(job_type, cutoff = 75) + . = list() + // First, get the name. + var/datum/job/J = SSjob.get_job_type(job_type) + if(!istype(J)) + return + + // Now find people with the job name. + for(var/M in player_list) + var/datum/job/their_job = guess_job(M) + if(!istype(their_job)) // No job was guessed. + continue + if(their_job.title != J.title) // Jobs don't match. + continue + if(assess_player_activity(M) < cutoff) // Too AFK. + continue + . += M + +/datum/metric/proc/count_people_with_job(job_type, cutoff = 75) + var/list/L = get_people_with_job(job_type, cutoff) + return L.len + + + +/datum/metric/proc/get_people_with_alt_title(job_type, alt_title_type, cutoff = 75) + . = list() + + var/list/people_with_jobs = get_people_with_job(job_type, cutoff) + var/datum/job/J = SSjob.get_job_type(job_type) + var/datum/alt_title/A = new alt_title_type() + + for(var/M in people_with_jobs) + if(J.has_alt_title(M, null, A.title)) + . += M + +/datum/metric/proc/count_people_with_alt_title(job_type, alt_title_type, cutoff = 75) + var/list/L = get_people_with_alt_title(job_type, alt_title_type, cutoff) + return L.len \ No newline at end of file diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index bdfab8f92b..3c38927910 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -1,7 +1,7 @@ /obj/machinery/mining icon = 'icons/obj/mining_drill.dmi' anchored = 0 - use_power = 0 //The drill takes power directly from a cell. + use_power = USE_POWER_OFF //The drill takes power directly from a cell. density = 1 layer = MOB_LAYER+0.1 //So it draws over mobs in the tile north of it. diff --git a/code/modules/mining/drilling/scanner.dm b/code/modules/mining/drilling/scanner.dm index 5b969d5c68..79ae5f1573 100644 --- a/code/modules/mining/drilling/scanner.dm +++ b/code/modules/mining/drilling/scanner.dm @@ -9,13 +9,13 @@ var/scan_time = 5 SECONDS /obj/item/weapon/mining_scanner/attack_self(mob/user as mob) - to_chat(user, "You begin sweeping \the [src] about, scanning for metal deposits.") + to_chat(user, "You begin sweeping \the [src] about, scanning for metal deposits.") playsound(loc, 'sound/items/goggles_charge.ogg', 50, 1, -6) if(!do_after(user, scan_time)) return - ScanTurf(user, get_turf(user)) + ScanTurf(get_turf(user), user) /obj/item/weapon/mining_scanner/proc/ScanTurf(var/atom/target, var/mob/user, var/exact = FALSE) var/list/metals = list( @@ -45,7 +45,7 @@ if(ore_type) metals[ore_type] += T.resources[metal] - to_chat(user, "\icon[src] The scanner beeps and displays a readout.") + var/message = "[bicon(src)] The scanner beeps and displays a readout." for(var/ore_type in metals) var/result = "no sign" @@ -59,4 +59,6 @@ else result = metals[ore_type] - to_chat(user, "- [result] of [ore_type].") + message += "
- [result] of [ore_type]." + + to_chat(user, message) diff --git a/code/modules/mining/machine_unloading.dm b/code/modules/mining/machine_unloading.dm index 1bbf7706ec..06a6da599b 100644 --- a/code/modules/mining/machine_unloading.dm +++ b/code/modules/mining/machine_unloading.dm @@ -11,17 +11,16 @@ var/obj/machinery/mineral/output = null -/obj/machinery/mineral/unloading_machine/New() - ..() - spawn( 5 ) - for (var/dir in cardinal) - src.input = locate(/obj/machinery/mineral/input, get_step(src, dir)) - if(src.input) break - for (var/dir in cardinal) - src.output = locate(/obj/machinery/mineral/output, get_step(src, dir)) - if(src.output) break - return - return +/obj/machinery/mineral/unloading_machine/Initialize() + . = ..() + for(var/dir in cardinal) + input = locate(/obj/machinery/mineral/input, get_step(src, dir)) + if(input) + break + for(var/dir in cardinal) + output = locate(/obj/machinery/mineral/output, get_step(src, dir)) + if(output) + break /obj/machinery/mineral/unloading_machine/process() if (src.output && src.input) diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm index 3172496414..e3e72693fe 100644 --- a/code/modules/mining/mint.dm +++ b/code/modules/mining/mint.dm @@ -1,6 +1,4 @@ /**********************Mint**************************/ - - /obj/machinery/mineral/mint name = "Coin press" icon = 'icons/obj/stationobjs.dmi' @@ -21,43 +19,43 @@ var/coinsToProduce = 10 -/obj/machinery/mineral/mint/New() - ..() - spawn( 5 ) - for (var/dir in cardinal) - src.input = locate(/obj/machinery/mineral/input, get_step(src, dir)) - if(src.input) break - for (var/dir in cardinal) - src.output = locate(/obj/machinery/mineral/output, get_step(src, dir)) - if(src.output) break - START_PROCESSING(SSobj, src) - return - return - +/obj/machinery/mineral/mint/Initialize() + . = ..() + for (var/dir in cardinal) + input = locate(/obj/machinery/mineral/input, get_step(src, dir)) + if(input) + break + for (var/dir in cardinal) + output = locate(/obj/machinery/mineral/output, get_step(src, dir)) + if(output) + break /obj/machinery/mineral/mint/process() - if ( src.input) - var/obj/item/stack/O - O = locate(/obj/item/stack, input.loc) - if(O) - var/processed = 1 - switch(O.get_material_name()) - if("gold") - amt_gold += 100 * O.get_amount() - if("silver") - amt_silver += 100 * O.get_amount() - if("diamond") - amt_diamond += 100 * O.get_amount() - if("phoron") - amt_phoron += 100 * O.get_amount() - if("uranium") - amt_uranium += 100 * O.get_amount() - if(DEFAULT_WALL_MATERIAL) - amt_iron += 100 * O.get_amount() - else - processed = 0 - if(processed) - qdel(O) + if(!input) + return + + var/obj/item/stack/O = locate(/obj/item/stack, input.loc) + if(!O) + return + + var/processed = 1 + switch(O.get_material_name()) + if("gold") + amt_gold += 100 * O.get_amount() + if("silver") + amt_silver += 100 * O.get_amount() + if("diamond") + amt_diamond += 100 * O.get_amount() + if("phoron") + amt_phoron += 100 * O.get_amount() + if("uranium") + amt_uranium += 100 * O.get_amount() + if(DEFAULT_WALL_MATERIAL) + amt_iron += 100 * O.get_amount() + else + processed = 0 + if(processed) + qdel(O) /obj/machinery/mineral/mint/attack_hand(user as mob) diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm index c1eede7744..32f97919fd 100644 --- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm +++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm @@ -3,12 +3,13 @@ /obj/machinery/mineral/equipment_vendor name = "mining equipment vendor" desc = "An equipment vendor for miners, points collected at an ore redemption machine can be spent here." - icon = 'icons/obj/machines/mining_machines.dmi' - icon_state = "mining" + icon = 'icons/obj/vending.dmi' + icon_state = "adh-tool" density = TRUE anchored = TRUE + var/icon_deny = "adh-tool-deny" + var/icon_vend = "adh-tool-vend" circuit = /obj/item/weapon/circuitboard/mining_equipment_vendor - var/icon_deny = "mining-deny" var/obj/item/weapon/card/id/inserted_id var/list/prize_list = list( new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10), @@ -81,7 +82,12 @@ /obj/machinery/mineral/equipment_vendor/update_icon() if(panel_open) - icon_state = "[initial(icon_state)]-open" + add_overlay("[initial(icon_state)]-panel") + else + cut_overlay("[initial(icon_state)]-panel") + + if(stat & BROKEN) + icon_state = "[initial(icon_state)]-broken" else if(powered()) icon_state = initial(icon_state) else @@ -148,6 +154,7 @@ inserted_id.mining_points -= prize.cost to_chat(usr, "[src] clanks to life briefly before vending [prize.equipment_name]!") new prize.equipment_path(drop_location()) + flick(icon_vend, src) else to_chat(usr, "Error: Please insert a valid ID!") flick(icon_deny, src) diff --git a/code/modules/mining/resonator.dm b/code/modules/mining/resonator.dm index bfbd29b830..dbee1668b2 100644 --- a/code/modules/mining/resonator.dm +++ b/code/modules/mining/resonator.dm @@ -63,9 +63,7 @@ transform = matrix()*0.75 animate(src, transform = matrix()*1.5, time = timetoburst) // Queue the actual bursting - spawn(timetoburst) - if(!QDELETED(src)) - burst(creator) + addtimer(CALLBACK(src, ./proc/burst, creator), timetoburst) /obj/effect/resonance/proc/burst(var/creator = null) var/turf/T = get_turf(src) diff --git a/code/modules/mob/_modifiers/feysight.dm b/code/modules/mob/_modifiers/feysight.dm new file mode 100644 index 0000000000..af391ed51c --- /dev/null +++ b/code/modules/mob/_modifiers/feysight.dm @@ -0,0 +1,42 @@ +/datum/modifier/feysight + name = "feysight" + desc = "You are filled with an inner peace, and widened sight." + client_color = "#42e6ca" + + on_created_text = "You feel an inner peace as your mind's eye expands!" + on_expired_text = "Your sight returns to what it once was." + stacks = MODIFIER_STACK_EXTEND + + accuracy = -15 + accuracy_dispersion = 1 + +/datum/modifier/feysight/on_applied() + holder.see_invisible = 60 + holder.see_invisible_default = 60 + +/datum/modifier/feysight/on_expire() + holder.see_invisible_default = initial(holder.see_invisible_default) + holder.see_invisible = holder.see_invisible_default + +/datum/modifier/feysight/can_apply(var/mob/living/L) + if(L.stat) + to_chat(L, "You can't be unconscious or dead to experience tranquility.") + return FALSE + + if(!L.is_sentient()) + return FALSE // Drones don't feel anything. + + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(H.species.name == "Diona") + to_chat(L, "You feel strange for a moment, but it passes.") + return FALSE // Happy trees aren't affected by tranquility. + + return ..() + +/datum/modifier/feysight/tick() + ..() + + if(ishuman(holder)) + var/mob/living/carbon/human/H = holder + H.druggy = min(15, H.druggy + 4) diff --git a/code/modules/mob/_modifiers/fire.dm b/code/modules/mob/_modifiers/fire.dm index 7f0cb81c4c..3a3c53a9dc 100644 --- a/code/modules/mob/_modifiers/fire.dm +++ b/code/modules/mob/_modifiers/fire.dm @@ -32,8 +32,11 @@ expire() else if(holder.fire_stacks > 0) - holder.fire_stacks -= 1 + holder.fire_stacks -= 0.5 /datum/modifier/fire/stack_managed/intense mob_overlay_state = "on_fire_intense" damage_per_tick = 10 + +/datum/modifier/fire/stack_managed/weak + damage_per_tick = 1 diff --git a/code/modules/mob/_modifiers/modifiers.dm b/code/modules/mob/_modifiers/modifiers.dm index c38a76078f..5950d9e98d 100644 --- a/code/modules/mob/_modifiers/modifiers.dm +++ b/code/modules/mob/_modifiers/modifiers.dm @@ -61,7 +61,7 @@ // Checks if the modifier should be allowed to be applied to the mob before attaching it. // Override for special criteria, e.g. forbidding robots from receiving it. -/datum/modifier/proc/can_apply(var/mob/living/L) +/datum/modifier/proc/can_apply(var/mob/living/L, var/suppress_output = FALSE) return TRUE // Checks to see if this datum should continue existing. @@ -115,7 +115,8 @@ // Call this to add a modifier to a mob. First argument is the modifier type you want, second is how long it should last, in ticks. // Third argument is the 'source' of the modifier, if it's from someone else. If null, it will default to the mob being applied to. // The SECONDS/MINUTES macro is very helpful for this. E.g. M.add_modifier(/datum/modifier/example, 5 MINUTES) -/mob/living/proc/add_modifier(var/modifier_type, var/expire_at = null, var/mob/living/origin = null) +// The fourth argument is a boolean to suppress failure messages, set it to true if the modifier is repeatedly applied (as chem-based modifiers are) to prevent chat-spam +/mob/living/proc/add_modifier(var/modifier_type, var/expire_at = null, var/mob/living/origin = null, var/suppress_failure = FALSE) // First, check if the mob already has this modifier. for(var/datum/modifier/M in modifiers) if(ispath(modifier_type, M)) @@ -132,7 +133,7 @@ // If we're at this point, the mob doesn't already have it, or it does but stacking is allowed. var/datum/modifier/mod = new modifier_type(src, origin) - if(!mod.can_apply(src)) + if(!mod.can_apply(src, suppress_failure)) qdel(mod) return if(expire_at) diff --git a/code/modules/mob/_modifiers/modifiers_misc.dm b/code/modules/mob/_modifiers/modifiers_misc.dm index b6e5a8394f..8e6a094910 100644 --- a/code/modules/mob/_modifiers/modifiers_misc.dm +++ b/code/modules/mob/_modifiers/modifiers_misc.dm @@ -112,16 +112,18 @@ the artifact triggers the rage. var/mob/living/carbon/human/H = holder H.shock_stage = last_shock_stage -/datum/modifier/berserk/can_apply(var/mob/living/L) +/datum/modifier/berserk/can_apply(var/mob/living/L, var/suppress_failure = FALSE) if(L.stat) - to_chat(L, "You can't be unconscious or dead to berserk.") + if(!suppress_failure) + to_chat(L, "You can't be unconscious or dead to berserk.") return FALSE // It would be weird to see a dead body get angry all of a sudden. if(!L.is_sentient()) return FALSE // Drones don't feel anything. if(L.has_modifier_of_type(/datum/modifier/berserk_exhaustion)) - to_chat(L, "You recently berserked, and cannot do so again while exhausted.") + if(!suppress_failure) + to_chat(L, "You recently berserked, and cannot do so again while exhausted.") return FALSE // On cooldown. if(L.isSynthetic()) @@ -135,7 +137,8 @@ the artifact triggers the rage. return FALSE // Happy trees aren't affected by blood rages. if(L.nutrition < nutrition_cost) - to_chat(L, "You are too hungry to berserk.") + if(!suppress_failure) + to_chat(L, "You are too hungry to berserk.") return FALSE // Too hungry to enrage. return ..() diff --git a/code/modules/mob/dead/corpse.dm b/code/modules/mob/dead/corpse.dm index 81a51214a7..18d81bf484 100644 --- a/code/modules/mob/dead/corpse.dm +++ b/code/modules/mob/dead/corpse.dm @@ -33,7 +33,7 @@ /obj/effect/landmark/mobcorpse/proc/createCorpse() //Creates a mob and checks for gear in each slot before attempting to equip it. var/mob/living/carbon/human/M = new /mob/living/carbon/human (src.loc) M.real_name = src.name - M.stat = 2 //Kills the new mob + M.set_stat(DEAD) //Kills the new mob if(src.corpseuniform) M.equip_to_slot_or_del(new src.corpseuniform(M), slot_w_uniform) if(src.corpsesuit) diff --git a/code/modules/mob/dead/observer/login.dm b/code/modules/mob/dead/observer/login.dm index d3d65faa31..4ccd305d0c 100644 --- a/code/modules/mob/dead/observer/login.dm +++ b/code/modules/mob/dead/observer/login.dm @@ -3,5 +3,6 @@ ..() //Creates the plane_holder lazily plane_holder.set_vis(VIS_GHOSTS, ghostvision) plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) + plane_holder.set_vis(VIS_CLOAKED, TRUE) plane_holder.set_vis(VIS_AI_EYE, TRUE) plane = PLANE_GHOSTS diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 6a72911b8b..96bea5fc74 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -94,8 +94,6 @@ plane = PLANE_GHOSTS //Why doesn't the var above work...??? verbs += /mob/observer/dead/proc/dead_tele - stat = DEAD - var/turf/T if(ismob(body)) T = get_turf(body) //Where is the body located? @@ -149,6 +147,11 @@ /mob/observer/dead/CanPass(atom/movable/mover, turf/target) return TRUE + +/mob/observer/dead/set_stat(var/new_stat) + if(new_stat != DEAD) + CRASH("It is best if observers stay dead, thank you.") + /* Transfer_mind is there to check if mob is being deleted/not going to have a body. Works together with spawning an observer, noted above. diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index dfd6846846..f11aa26bca 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -76,7 +76,7 @@ if(!gibbed && deathmessage != "no message") // This is gross, but reliable. Only brains use it. src.visible_message("\The [src.name] [deathmessage]") - stat = DEAD + set_stat(DEAD) update_canmove() diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 3ead9dedd4..7c1707785d 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -16,7 +16,7 @@ input = message if(input) log_emote(message,src) //Log before we add junk - message = "[src] [input]" + message = "[src] [input]" else return diff --git a/code/modules/mob/freelook/ai/eye.dm b/code/modules/mob/freelook/ai/eye.dm index 6325cec1ec..c79417cb86 100644 --- a/code/modules/mob/freelook/ai/eye.dm +++ b/code/modules/mob/freelook/ai/eye.dm @@ -41,21 +41,23 @@ client.eye = new_eye /mob/living/silicon/ai/proc/create_eyeobj(var/newloc) - if(eyeobj) destroy_eyeobj() - if(!newloc) newloc = src.loc + if(eyeobj) + destroy_eyeobj() + if(!newloc) + newloc = src.loc eyeobj = new /mob/observer/eye/aiEye(newloc) eyeobj.owner = src eyeobj.name = "[src.name] (AI Eye)" // Give it a name - if(client) client.eye = eyeobj + if(client) + client.eye = eyeobj SetName(src.name) // Intiliaze the eye by assigning it's "ai" variable to us. Then set it's loc to us. -/mob/living/silicon/ai/New() - ..() +/mob/living/silicon/ai/Initialize() + . = ..() create_eyeobj() - spawn(5) - if(eyeobj) - eyeobj.loc = src.loc + if(eyeobj) + eyeobj.loc = src.loc /mob/living/silicon/ai/Destroy() destroy_eyeobj() diff --git a/code/modules/mob/freelook/update_triggers.dm b/code/modules/mob/freelook/update_triggers.dm index 0b31e24cce..e6d1976fad 100644 --- a/code/modules/mob/freelook/update_triggers.dm +++ b/code/modules/mob/freelook/update_triggers.dm @@ -17,8 +17,8 @@ updateVisibility(src) return ..() -/turf/simulated/New() - ..() +/turf/simulated/Initialize() + . = ..() updateVisibility(src) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 7d71c92343..5e9f496646 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -79,7 +79,7 @@ /mob/living/bot/updatehealth() if(status_flags & GODMODE) health = getMaxHealth() - stat = CONSCIOUS + set_stat(CONSCIOUS) else health = getMaxHealth() - getFireLoss() - getBruteLoss() oxyloss = 0 diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm index 6914e434e6..edb7486fd1 100644 --- a/code/modules/mob/living/bot/medbot.dm +++ b/code/modules/mob/living/bot/medbot.dm @@ -394,11 +394,10 @@ var/skin = null //Same as medbot, set to tox or ointment for the respective kits. w_class = ITEMSIZE_NORMAL -/obj/item/weapon/firstaid_arm_assembly/New() - ..() - spawn(5) // Terrible. TODO: fix - if(skin) - overlays += image('icons/obj/aibots.dmi', "kit_skin_[src.skin]") +/obj/item/weapon/firstaid_arm_assembly/Initialize() + . = ..() + if(skin) + overlays += image('icons/obj/aibots.dmi', "kit_skin_[src.skin]") /obj/item/weapon/firstaid_arm_assembly/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 2c39964ad6..3b57c6a5f7 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -51,7 +51,7 @@ if(paralysis && paralysis > 0) blinded = 1 - stat = UNCONSCIOUS + set_stat(UNCONSCIOUS) if(halloss > 0) adjustHalLoss(-3) @@ -61,13 +61,13 @@ if(mind.active && client != null) sleeping = max(sleeping-1, 0) blinded = 1 - stat = UNCONSCIOUS + set_stat(UNCONSCIOUS) else if(resting) if(halloss > 0) adjustHalLoss(-3) else - stat = CONSCIOUS + set_stat(CONSCIOUS) if(halloss > 0) adjustHalLoss(-1) diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index b237caf553..1d373679ee 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -59,12 +59,13 @@ return user.visible_message("\The [user] sticks \a [O] into \the [src].") + B.preserved = TRUE brainmob = B.brainmob B.brainmob = null brainmob.loc = src brainmob.container = src - brainmob.stat = 0 + brainmob.set_stat(CONSCIOUS) dead_mob_list -= brainmob//Update dem lists living_mob_list += brainmob @@ -108,6 +109,7 @@ brainobj = null else //Or make a new one if empty. brain = new(user.loc) + brain.preserved = FALSE brainmob.container = null//Reset brainmob mmi var. brainmob.loc = brain//Throw mob into brain. living_mob_list -= brainmob//Get outta here @@ -185,7 +187,7 @@ src.brainmob.add_language(LANGUAGE_EAL) src.brainmob.loc = src src.brainmob.container = src - src.brainmob.stat = 0 + src.brainmob.set_stat(CONSCIOUS) src.brainmob.silent = 0 radio = new(src) dead_mob_list -= src.brainmob @@ -197,7 +199,7 @@ if(!..(user)) return - var/msg = "*---------*\nThis is \icon[src] \a [src]!\n[desc]\n" + var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n[desc]\n" msg += "" if(src.brainmob && src.brainmob.key) @@ -230,7 +232,7 @@ /obj/item/device/mmi/digital/transfer_identity(var/mob/living/carbon/H) brainmob.dna = H.dna brainmob.timeofhostdeath = H.timeofdeath - brainmob.stat = 0 + brainmob.set_stat(CONSCIOUS) if(H.mind) H.mind.transfer_to(brainmob) return diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index eca5da7042..815ffdd374 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -89,7 +89,7 @@ if(!..(user)) return - var/msg = "*---------*\nThis is \icon[src] \a [src]!\n[desc]\n" + var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n[desc]\n" msg += "" if(src.brainmob && src.brainmob.key) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 2c7a4d59b4..94dde27c45 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -147,8 +147,8 @@ var/mob/living/carbon/human/H = src var/datum/gender/T = gender_datums[H.get_visible_gender()] src.visible_message( \ - "[src] examines [T.himself].", \ - "You check yourself for injuries." \ + "[src] examines [T.himself].", \ + "You check yourself for injuries." \ ) for(var/obj/item/organ/external/org in H.organs) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 4f02c8c451..6caeffdb6a 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -79,8 +79,9 @@ verbs -= /mob/living/carbon/proc/release_control callHook("death", list(src, gibbed)) - + if(mind) + SSgame_master.adjust_danger(gibbed ? 40 : 20) for(var/mob/observer/dead/O in mob_list) if(O.client && O.client.is_preference_enabled(/datum/client_preference/show_dsay)) to_chat(O, "[src] has died in [get_area(src)]. [ghost_follow_link(src, O)] ") diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 08e6254421..7a58a03bf2 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -77,8 +77,7 @@ var/list/msg = list("*---------*
This is ") - if(icon) - msg += "\icon[icon] " //fucking BYOND: this should stop dreamseeker crashing if we -somehow- examine somebody before their icon is generated + msg += "[bicon(src)] " //fucking BYOND: this should stop dreamseeker crashing if we -somehow- examine somebody before their icon is generated msg += "[src.name]" @@ -139,16 +138,16 @@ tie_msg += " Attached to it is [english_list(accessories_visible)]." if(w_uniform.blood_DNA) - msg += "[T.He] [T.is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [w_uniform.name]![tie_msg]
" + msg += "[T.He] [T.is] wearing [bicon(w_uniform)] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [w_uniform.name]![tie_msg]
" else - msg += "[T.He] [T.is] wearing \icon[w_uniform] \a [w_uniform].[tie_msg]
" + msg += "[T.He] [T.is] wearing [bicon(w_uniform)] \a [w_uniform].[tie_msg]
" //head if(head && !(skip_gear & EXAMINE_SKIPHELMET) && head.show_examine) if(head.blood_DNA) - msg += "[T.He] [T.is] wearing \icon[head] [head.gender==PLURAL?"some":"a"] [(head.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [head.name] on [T.his] head!
" + msg += "[T.He] [T.is] wearing [bicon(head)] [head.gender==PLURAL?"some":"a"] [(head.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [head.name] on [T.his] head!
" else - msg += "[T.He] [T.is] wearing \icon[head] \a [head] on [T.his] head.
" + msg += "[T.He] [T.is] wearing [bicon(head)] \a [head] on [T.his] head.
" //suit/armour if(wear_suit) @@ -159,71 +158,71 @@ tie_msg += " Attached to it is [english_list(U.accessories)]." if(wear_suit.blood_DNA) - msg += "[T.He] [T.is] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [wear_suit.name][tie_msg]!
" + msg += "[T.He] [T.is] wearing [bicon(wear_suit)] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [wear_suit.name][tie_msg]!
" else - msg += "[T.He] [T.is] wearing \icon[wear_suit] \a [wear_suit].[tie_msg]
" + msg += "[T.He] [T.is] wearing [bicon(wear_suit)] \a [wear_suit].[tie_msg]
" //suit/armour storage if(s_store && !(skip_gear & EXAMINE_SKIPSUITSTORAGE) && s_store.show_examine) if(s_store.blood_DNA) - msg += "[T.He] [T.is] carrying \icon[s_store] [s_store.gender==PLURAL?"some":"a"] [(s_store.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [s_store.name] on [T.his] [wear_suit.name]!
" + msg += "[T.He] [T.is] carrying [bicon(s_store)] [s_store.gender==PLURAL?"some":"a"] [(s_store.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [s_store.name] on [T.his] [wear_suit.name]!
" else - msg += "[T.He] [T.is] carrying \icon[s_store] \a [s_store] on [T.his] [wear_suit.name].
" + msg += "[T.He] [T.is] carrying [bicon(s_store)] \a [s_store] on [T.his] [wear_suit.name].
" //back if(back && !(skip_gear & EXAMINE_SKIPBACKPACK) && back.show_examine) if(back.blood_DNA) - msg += "[T.He] [T.has] \icon[back] [back.gender==PLURAL?"some":"a"] [(back.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [back] on [T.his] back.
" + msg += "[T.He] [T.has] [bicon(back)] [back.gender==PLURAL?"some":"a"] [(back.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [back] on [T.his] back.
" else - msg += "[T.He] [T.has] \icon[back] \a [back] on [T.his] back.
" + msg += "[T.He] [T.has] [bicon(back)] \a [back] on [T.his] back.
" //left hand if(l_hand && l_hand.show_examine) if(l_hand.blood_DNA) - msg += "[T.He] [T.is] holding \icon[l_hand] [l_hand.gender==PLURAL?"some":"a"] [(l_hand.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [l_hand.name] in [T.his] left hand!
" + msg += "[T.He] [T.is] holding [bicon(l_hand)] [l_hand.gender==PLURAL?"some":"a"] [(l_hand.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [l_hand.name] in [T.his] left hand!
" else - msg += "[T.He] [T.is] holding \icon[l_hand] \a [l_hand] in [T.his] left hand.
" + msg += "[T.He] [T.is] holding [bicon(l_hand)] \a [l_hand] in [T.his] left hand.
" //right hand if(r_hand && r_hand.show_examine) if(r_hand.blood_DNA) - msg += "[T.He] [T.is] holding \icon[r_hand] [r_hand.gender==PLURAL?"some":"a"] [(r_hand.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [r_hand.name] in [T.his] right hand!
" + msg += "[T.He] [T.is] holding [bicon(r_hand)] [r_hand.gender==PLURAL?"some":"a"] [(r_hand.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [r_hand.name] in [T.his] right hand!
" else - msg += "[T.He] [T.is] holding \icon[r_hand] \a [r_hand] in [T.his] right hand.
" + msg += "[T.He] [T.is] holding [bicon(r_hand)] \a [r_hand] in [T.his] right hand.
" //gloves if(gloves && !(skip_gear & EXAMINE_SKIPGLOVES) && gloves.show_examine) if(gloves.blood_DNA) - msg += "[T.He] [T.has] \icon[gloves] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [gloves.name] on [T.his] hands!
" + msg += "[T.He] [T.has] [bicon(gloves)] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [gloves.name] on [T.his] hands!
" else - msg += "[T.He] [T.has] \icon[gloves] \a [gloves] on [T.his] hands.
" + msg += "[T.He] [T.has] [bicon(gloves)] \a [gloves] on [T.his] hands.
" else if(blood_DNA && !(skip_body & EXAMINE_SKIPHANDS)) msg += "[T.He] [T.has] [(hand_blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained hands!
" //handcuffed? if(handcuffed && handcuffed.show_examine) if(istype(handcuffed, /obj/item/weapon/handcuffs/cable)) - msg += "[T.He] [T.is] \icon[handcuffed] restrained with cable!
" + msg += "[T.He] [T.is] [bicon(handcuffed)] restrained with cable!
" else - msg += "[T.He] [T.is] \icon[handcuffed] handcuffed!
" + msg += "[T.He] [T.is] [bicon(handcuffed)] handcuffed!
" //buckled if(buckled) - msg += "[T.He] [T.is] \icon[buckled] buckled to [buckled]!
" + msg += "[T.He] [T.is] [bicon(buckled)] buckled to [buckled]!
" //belt if(belt && !(skip_gear & EXAMINE_SKIPBELT) && belt.show_examine) if(belt.blood_DNA) - msg += "[T.He] [T.has] \icon[belt] [belt.gender==PLURAL?"some":"a"] [(belt.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [belt.name] about [T.his] waist!
" + msg += "[T.He] [T.has] [bicon(belt)] [belt.gender==PLURAL?"some":"a"] [(belt.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [belt.name] about [T.his] waist!
" else - msg += "[T.He] [T.has] \icon[belt] \a [belt] about [T.his] waist.
" + msg += "[T.He] [T.has] [bicon(belt)] \a [belt] about [T.his] waist.
" //shoes if(shoes && !(skip_gear & EXAMINE_SKIPSHOES) && shoes.show_examine) if(shoes.blood_DNA) - msg += "[T.He] [T.is] wearing \icon[shoes] [shoes.gender==PLURAL?"some":"a"] [(shoes.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [shoes.name] on [T.his] feet!
" + msg += "[T.He] [T.is] wearing [bicon(shoes)] [shoes.gender==PLURAL?"some":"a"] [(shoes.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [shoes.name] on [T.his] feet!
" else - msg += "[T.He] [T.is] wearing \icon[shoes] \a [shoes] on [T.his] feet.
" + msg += "[T.He] [T.is] wearing [bicon(shoes)] \a [shoes] on [T.his] feet.
" else if(feet_blood_DNA && !(skip_body & EXAMINE_SKIPHANDS)) msg += "[T.He] [T.has] [(feet_blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained feet!
" @@ -234,24 +233,24 @@ descriptor = "in [T.his] mouth" if(wear_mask.blood_DNA) - msg += "[T.He] [T.has] \icon[wear_mask] [wear_mask.gender==PLURAL?"some":"a"] [(wear_mask.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [wear_mask.name] [descriptor]!
" + msg += "[T.He] [T.has] [bicon(wear_mask)] [wear_mask.gender==PLURAL?"some":"a"] [(wear_mask.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [wear_mask.name] [descriptor]!
" else - msg += "[T.He] [T.has] \icon[wear_mask] \a [wear_mask] [descriptor].
" + msg += "[T.He] [T.has] [bicon(wear_mask)] \a [wear_mask] [descriptor].
" //eyes if(glasses && !(skip_gear & EXAMINE_SKIPEYEWEAR) && glasses.show_examine) if(glasses.blood_DNA) - msg += "[T.He] [T.has] \icon[glasses] [glasses.gender==PLURAL?"some":"a"] [(glasses.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [glasses] covering [T.his] eyes!
" + msg += "[T.He] [T.has] [bicon(glasses)] [glasses.gender==PLURAL?"some":"a"] [(glasses.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [glasses] covering [T.his] eyes!
" else - msg += "[T.He] [T.has] \icon[glasses] \a [glasses] covering [T.his] eyes.
" + msg += "[T.He] [T.has] [bicon(glasses)] \a [glasses] covering [T.his] eyes.
" //left ear if(l_ear && !(skip_gear & EXAMINE_SKIPEARS) && l_ear.show_examine) - msg += "[T.He] [T.has] \icon[l_ear] \a [l_ear] on [T.his] left ear.
" + msg += "[T.He] [T.has] [bicon(l_ear)] \a [l_ear] on [T.his] left ear.
" //right ear if(r_ear && !(skip_gear & EXAMINE_SKIPEARS) && r_ear.show_examine) - msg += "[T.He] [T.has] \icon[r_ear] \a [r_ear] on [T.his] right ear.
" + msg += "[T.He] [T.has] [bicon(r_ear)] \a [r_ear] on [T.his] right ear.
" //ID if(wear_id && wear_id.show_examine) @@ -263,9 +262,9 @@ var/obj/item/weapon/card/id/idcard = wear_id id = idcard.registered_name if(id && (id != real_name) && (get_dist(src, usr) <= 1) && prob(10)) - msg += "[T.He] [T.is] wearing \icon[wear_id] \a [wear_id] yet something doesn't seem right...
" + msg += "[T.He] [T.is] wearing [bicon(wear_id)] \a [wear_id] yet something doesn't seem right...
" else*/ - msg += "[T.He] [T.is] wearing \icon[wear_id] \a [wear_id].
" + msg += "[T.He] [T.is] wearing [bicon(wear_id)] \a [wear_id].
" //Jitters if(is_jittery) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 3f9f77f34c..52c0fdbe0c 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -280,7 +280,10 @@ var/randn = rand(1, 100) last_push_time = world.time - if(!(species.flags & NO_SLIP) && randn <= 25) + // We ARE wearing shoes OR + // We as a species CAN be slipped when barefoot + // And also 1 in 4 because rngesus + if((shoes || !(species.flags & NO_SLIP)) && randn <= 25) var/armor_check = run_armor_check(affecting, "melee") apply_effect(3, WEAKEN, armor_check) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index fde95114bb..d262ca2b18 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -4,7 +4,7 @@ if(status_flags & GODMODE) health = getMaxHealth() - stat = CONSCIOUS + set_stat(CONSCIOUS) return var/total_burn = 0 diff --git a/code/modules/mob/living/carbon/human/human_resist.dm b/code/modules/mob/living/carbon/human/human_resist.dm index 37e20d0d21..56d42c1a15 100644 --- a/code/modules/mob/living/carbon/human/human_resist.dm +++ b/code/modules/mob/living/carbon/human/human_resist.dm @@ -1,6 +1,6 @@ /mob/living/carbon/human/process_resist() //drop && roll - if(on_fire && !buckled) + if((on_fire || has_modifier_of_type(/datum/modifier/fire)) && !buckled) adjust_fire_stacks(-1.2) Weaken(3) spin(32,2) @@ -9,7 +9,7 @@ "You stop, drop, and roll!" ) sleep(30) - if(fire_stacks <= 0) + if(fire_stacks <= 0 && !(has_modifier_of_type(/datum/modifier/fire))) visible_message( "[src] has successfully extinguished themselves!", "You extinguish yourself." diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index c30d98b40d..d59a5a4828 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -86,6 +86,9 @@ if(!client) species.handle_npc(src) + else if(stat == DEAD && !stasis) + handle_defib_timer() + if(!handle_some_updates()) return //We go ahead and process them 5 times for HUD images and other stuff though. @@ -1089,9 +1092,9 @@ return 1 -/mob/living/carbon/human/proc/set_stat(var/new_stat) - stat = new_stat - if(stat) +/mob/living/carbon/human/set_stat(var/new_stat) + . = ..() + if(. && stat) update_skin(1) /mob/living/carbon/human/handle_regular_hud_updates() @@ -1506,7 +1509,6 @@ else shock_stage = min(shock_stage, 160) shock_stage = max(shock_stage-1, 0) - return if(stat) return 0 @@ -1808,5 +1810,15 @@ traumatic_shock = 0 ..() +/mob/living/carbon/human/proc/handle_defib_timer() + if(!should_have_organ(O_BRAIN)) + return // No brain. + + var/obj/item/organ/internal/brain/brain = internal_organs_by_name[O_BRAIN] + if(!brain) + return // Still no brain. + + brain.tick_defib_timer() + #undef HUMAN_MAX_OXYLOSS #undef HUMAN_CRIT_MAX_OXYLOSS diff --git a/code/modules/mob/living/carbon/metroid/items.dm b/code/modules/mob/living/carbon/metroid/items.dm index 7fd7754e54..30be7694b5 100644 --- a/code/modules/mob/living/carbon/metroid/items.dm +++ b/code/modules/mob/living/carbon/metroid/items.dm @@ -360,8 +360,7 @@ . = ..() reagents.add_reagent("nutriment", 4) reagents.add_reagent("slimejelly", 1) - spawn(rand(1200,1500))//the egg takes a while to "ripen" - Grow() + addtimer(CALLBACK(src, ./proc/Grow), rand(120 SECONDS, 150 SECONDS)) /obj/item/weapon/reagent_containers/food/snacks/egg/slime/proc/Grow() grown = 1 diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index f11d9d137d..7643ea3d2e 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -102,18 +102,18 @@ else if (src.paralysis || src.stunned || src.weakened || (status_flags & FAKEDEATH)) //Stunned etc. if (src.stunned > 0) - src.stat = 0 + src.set_stat(CONSCIOUS) if (src.weakened > 0) src.lying = 0 - src.stat = 0 + src.set_stat(CONSCIOUS) if (src.paralysis > 0) src.blinded = 0 src.lying = 0 - src.stat = 0 + src.set_stat(CONSCIOUS) else src.lying = 0 - src.stat = 0 + src.set_stat(CONSCIOUS) if (src.stuttering) src.stuttering = 0 diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index f4ffcc7615..0718dc9421 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -98,11 +98,11 @@ updatehealth() if(stat != DEAD) if(paralysis) - stat = UNCONSCIOUS + set_stat(UNCONSCIOUS) else if (status_flags & FAKEDEATH) - stat = UNCONSCIOUS + set_stat(UNCONSCIOUS) else - stat = CONSCIOUS + set_stat(CONSCIOUS) return 1 /mob/living/proc/handle_statuses() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 6b56d1d099..89ded4940c 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -207,11 +207,10 @@ default behaviour is: /mob/living/proc/updatehealth() if(status_flags & GODMODE) health = 100 - stat = CONSCIOUS + set_stat(CONSCIOUS) else health = getMaxHealth() - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - getCloneLoss() - halloss - //This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually //affects them once clothing is factored in. ~Errorage /mob/living/proc/calculate_affecting_pressure(var/pressure) @@ -703,7 +702,7 @@ default behaviour is: timeofdeath = 0 // restore us to conciousness - stat = CONSCIOUS + set_stat(CONSCIOUS) // make the icons look correct regenerate_icons() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index b4160abf70..5eeae44d68 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -375,6 +375,9 @@ handle_light() update_fire() + if(has_modifier_of_type(/datum/modifier/fire)) + remove_modifiers_of_type(/datum/modifier/fire) + /mob/living/proc/update_fire() return diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 1d42d8370e..33998fcaff 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -291,7 +291,7 @@ var/list/ai_verbs_default = list( /obj/machinery/ai_powersupply name="Power Supply" active_power_usage=50000 // Station AIs use significant amounts of power. This, when combined with charged SMES should mean AI lasts for 1hr without external power. - use_power = 2 + use_power = USE_POWER_ACTIVE power_channel = EQUIP var/mob/living/silicon/ai/powered_ai = null invisibility = 100 @@ -319,14 +319,14 @@ var/list/ai_verbs_default = list( qdel(src) return if(powered_ai.APU_power) - use_power = 0 + update_use_power(USE_POWER_OFF) return if(!powered_ai.anchored) loc = powered_ai.loc - use_power = 0 + update_use_power(USE_POWER_OFF) use_power(50000) // Less optimalised but only called if AI is unwrenched. This prevents usage of wrenching as method to keep AI operational without power. Intellicard is for that. if(powered_ai.anchored) - use_power = 2 + update_use_power(USE_POWER_ACTIVE) /mob/living/silicon/ai/proc/pick_icon() set category = "AI Settings" diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 0d429fa089..b1398d3170 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -169,7 +169,7 @@ /mob/living/silicon/ai/updatehealth() if(status_flags & GODMODE) health = 100 - stat = CONSCIOUS + set_stat(CONSCIOUS) setOxyLoss(0) else health = 100 - getFireLoss() - getBruteLoss() // Oxyloss is not part of health as it represents AIs backup power. AI is immune against ToxLoss as it is machine. diff --git a/code/modules/mob/living/silicon/decoy/life.dm b/code/modules/mob/living/silicon/decoy/life.dm index d62d5d15da..07683eb2dc 100644 --- a/code/modules/mob/living/silicon/decoy/life.dm +++ b/code/modules/mob/living/silicon/decoy/life.dm @@ -10,6 +10,6 @@ /mob/living/silicon/decoy/updatehealth() if(status_flags & GODMODE) health = 100 - stat = CONSCIOUS + set_stat(CONSCIOUS) else health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index 42888a3827..e159308d1b 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -30,6 +30,6 @@ /mob/living/silicon/pai/updatehealth() if(status_flags & GODMODE) health = 100 - stat = CONSCIOUS + set_stat(CONSCIOUS) else health = 100 - getBruteLoss() - getFireLoss() diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index 58c9adcac7..8f7e8462de 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -519,7 +519,7 @@ if(href_list["send"]) P.sradio.send_signal("ACTIVATE") for(var/mob/O in hearers(1, P.loc)) - O.show_message(text("\icon[] *beep* *beep*", P), 3, "*beep* *beep*", 2) + O.show_message("[bicon(P)] *beep* *beep*", 3, "*beep* *beep*", 2) return 1 else if(href_list["freq"]) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index cc16dd6dc7..7658ddc1bf 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -257,7 +257,7 @@ var/list/mob_hat_cache = list() /mob/living/silicon/robot/drone/updatehealth() if(status_flags & GODMODE) health = maxHealth - stat = CONSCIOUS + set_stat(CONSCIOUS) return health = maxHealth - (getBruteLoss() + getFireLoss()) return diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index 6bd956c4cc..f6ca7105ea 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -11,7 +11,7 @@ density = 1 anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 20 active_power_usage = 5000 diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 5974e7cd03..c08945b3e1 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -88,7 +88,7 @@ if (src.stat != 2) //Alive. if (src.paralysis || src.stunned || src.weakened || !src.has_power) //Stunned etc. - src.stat = 1 + src.set_stat(UNCONSCIOUS) if (src.stunned > 0) AdjustStunned(-1) if (src.weakened > 0) @@ -100,7 +100,7 @@ src.blinded = 0 else //Not stunned. - src.stat = 0 + src.set_stat(CONSCIOUS) AdjustConfused(-1) diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index c27d7e36b6..67ab5dd3c4 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -1,7 +1,7 @@ /mob/living/silicon/robot/updatehealth() if(status_flags & GODMODE) health = getMaxHealth() - stat = CONSCIOUS + set_stat(CONSCIOUS) return health = getMaxHealth() - (getBruteLoss() + getFireLoss()) return diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 6fdac4213f..1b13cb7096 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -214,7 +214,7 @@ overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = 30 + I.layer) addedSomething = 1 if ( addedSomething ) - user.visible_message("[user] load some items onto their service tray.") + user.visible_message("[user] loads some items onto their service tray.") return @@ -507,4 +507,4 @@ return to_chat(user, "You fail to pick up \the [A] with \the [src]") - return \ No newline at end of file + return diff --git a/code/modules/mob/living/silicon/robot/robot_remote_control.dm b/code/modules/mob/living/silicon/robot/robot_remote_control.dm index 90d74b2638..2f4ca0e56b 100644 --- a/code/modules/mob/living/silicon/robot/robot_remote_control.dm +++ b/code/modules/mob/living/silicon/robot/robot_remote_control.dm @@ -26,6 +26,8 @@ GLOBAL_LIST_EMPTY(available_ai_shells) shell = TRUE braintype = "AI Shell" SetName("[modtype] AI Shell [num2text(ident)]") + rbPDA = new /obj/item/device/pda/ai/shell(src) + setup_PDA() GLOB.available_ai_shells |= src if(!QDELETED(camera)) camera.c_tag = real_name //update the camera name too diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index c861c480be..6a74eb41d5 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -37,7 +37,7 @@ /mob/living/silicon/Destroy() silicon_mob_list -= src - for(var/datum/alarm_handler/AH in alarm_manager.all_handlers) + for(var/datum/alarm_handler/AH in SSalarm.all_handlers) AH.unregister_alarm(src) return ..() diff --git a/code/modules/mob/living/silicon/subystems.dm b/code/modules/mob/living/silicon/subystems.dm index 1dae0026aa..ac10167c2d 100644 --- a/code/modules/mob/living/silicon/subystems.dm +++ b/code/modules/mob/living/silicon/subystems.dm @@ -38,7 +38,7 @@ if(!register_alarms) return - for(var/datum/alarm_handler/AH in alarm_manager.all_handlers) + for(var/datum/alarm_handler/AH in SSalarm.all_handlers) AH.register_alarm(src, /mob/living/silicon/proc/receive_alarm) queued_alarms[AH] = list() // Makes sure alarms remain listed in consistent order diff --git a/code/modules/mob/living/simple_mob/combat.dm b/code/modules/mob/living/simple_mob/combat.dm index 0f3205fb8c..046a4ef988 100644 --- a/code/modules/mob/living/simple_mob/combat.dm +++ b/code/modules/mob/living/simple_mob/combat.dm @@ -3,26 +3,24 @@ set waitfor = FALSE // For attack animations. Don't want the AI processor to get held up. if(!A.Adjacent(src)) - return FALSE + return ATTACK_FAILED var/turf/their_T = get_turf(A) face_atom(A) if(melee_attack_delay) - // their_T.color = "#FF0000" melee_pre_animation(A) + . = ATTACK_SUCCESSFUL //Shoving this in here as a 'best guess' since this proc is about to sleep and return and we won't be able to know the real value handle_attack_delay(A, melee_attack_delay) // This will sleep this proc for a bit, which is why waitfor is false. // Cooldown testing is done at click code (for players) and interface code (for AI). setClickCooldown(get_attack_speed()) + // Returns a value, but will be lost if . = do_attack(A, their_T) if(melee_attack_delay) melee_post_animation(A) - // their_T.color = "#FFFFFF" - - // This does the actual attack. // This is a seperate proc for the purposes of attack animations. diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm index 2bf3568287..d33e93e042 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm @@ -18,7 +18,7 @@ GLOBAL_VAR_INIT(chicken_count, 0) // How mant chickens DO we have? response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" - attacktext = list("kicked") + attacktext = list("pecked") has_langs = list("Bird") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/lurker.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/lurker.dm index d26ad34992..15b04e119a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/lurker.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/lurker.dm @@ -47,29 +47,26 @@ ai_holder_type = /datum/ai_holder/simple_mob/melee/hit_and_run - var/cloaked = FALSE var/cloaked_alpha = 45 // Lower = Harder to see. var/cloaked_bonus_damage = 30 // This is added on top of the normal melee damage. var/cloaked_weaken_amount = 3 // How long to stun for. var/cloak_cooldown = 10 SECONDS // Amount of time needed to re-cloak after losing it. var/last_uncloak = 0 // world.time - -/mob/living/simple_mob/animal/giant_spider/lurker/proc/cloak() +/mob/living/simple_mob/animal/giant_spider/lurker/cloak() if(cloaked) return animate(src, alpha = cloaked_alpha, time = 1 SECOND) cloaked = TRUE -/mob/living/simple_mob/animal/giant_spider/lurker/proc/uncloak() +/mob/living/simple_mob/animal/giant_spider/lurker/uncloak() last_uncloak = world.time // This is assigned even if it isn't cloaked already, to 'reset' the timer if the spider is continously getting attacked. if(!cloaked) return animate(src, alpha = initial(alpha), time = 1 SECOND) cloaked = FALSE - // Check if cloaking if possible. /mob/living/simple_mob/animal/giant_spider/lurker/proc/can_cloak() if(stat) @@ -79,7 +76,6 @@ return TRUE - // Called by things that break cloaks, like Technomancer wards. /mob/living/simple_mob/animal/giant_spider/lurker/break_cloak() uncloak() diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm index 09421f650b..997244a4a7 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm @@ -60,7 +60,7 @@ if( ishuman(AM) ) if(!stat) var/mob/M = AM - M.visible_message("\icon[src] Squeek!") + M.visible_message("[bicon(src)] Squeek!") playsound(src, 'sound/effects/mouse_squeak.ogg', 35, 1) ..() @@ -76,7 +76,7 @@ /mob/living/simple_mob/animal/passive/mouse/proc/splat() src.health = 0 - src.stat = DEAD + src.set_stat(DEAD) src.icon_dead = "mouse_[body_color]_splat" src.icon_state = "mouse_[body_color]_splat" layer = MOB_LAYER diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/bird.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/bird.dm index 4042dd30b4..7dc23ef7f9 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/bird.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/bird.dm @@ -23,7 +23,7 @@ softfall = TRUE parachuting = TRUE - attacktext = list("claws", "pecks") + attacktext = list("clawed", "pecked") speak_emote = list("chirps", "caws") has_langs = list("Bird") response_help = "pets" diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/bats.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/bats.dm index 7397636686..7ca24f3174 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/bats.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/bats.dm @@ -50,3 +50,8 @@ /mob/living/simple_mob/animal/space/bats/cult/cultify() return + +/mob/living/simple_mob/animal/space/bats/cult/strong + maxHealth = 60 + health = 60 + melee_damage_upper = 10 diff --git a/code/modules/mob/living/simple_mob/subtypes/blob/spore.dm b/code/modules/mob/living/simple_mob/subtypes/blob/spore.dm index 3347d73cd2..2628fe3f76 100644 --- a/code/modules/mob/living/simple_mob/subtypes/blob/spore.dm +++ b/code/modules/mob/living/simple_mob/subtypes/blob/spore.dm @@ -20,7 +20,7 @@ movement_cooldown = 0 hovering = TRUE - attacktext = list("slams into") + attacktext = list("slammed into") attack_sound = 'sound/effects/slime_squish.ogg' say_list_type = /datum/say_list/spore @@ -125,7 +125,7 @@ desc = "A parasitic organism attached to a deceased body, controlling it directly as if it were a puppet." melee_damage_lower += 8 // 10 total. melee_damage_upper += 11 // 15 total. - attacktext = list("claws") + attacktext = list("clawed") H.forceMove(src) infested = H diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm index 9dd9b75418..fde974026f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm @@ -134,7 +134,7 @@ /mob/living/simple_mob/construct/examine(mob/user) ..(user) - var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" + var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" if (src.health < src.getMaxHealth()) msg += "" if (src.health >= src.getMaxHealth()/2) diff --git a/code/modules/mob/living/voice/voice.dm b/code/modules/mob/living/voice/voice.dm index 0b9559fb53..f42c362201 100644 --- a/code/modules/mob/living/voice/voice.dm +++ b/code/modules/mob/living/voice/voice.dm @@ -83,7 +83,7 @@ var/new_name = sanitizeSafe(input(src, "Who would you like to be now?", "Communicator", src.client.prefs.real_name) as text, MAX_NAME_LEN) if(new_name) if(comm) - comm.visible_message("\icon[comm] [src.name] has left, and now you see [new_name].") + comm.visible_message("[bicon(comm)] [src.name] has left, and now you see [new_name].") //Do a bit of logging in-case anyone tries to impersonate other characters for whatever reason. var/msg = "[src.client.key] ([src]) has changed their communicator identity's name to [new_name]." message_admins(msg) diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 0069ec7035..61748b54db 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -14,13 +14,14 @@ if( (client.connection != "web") && (M.computer_id == client.computer_id) ) if(matches) matches += " and " matches += "ID ([client.computer_id])" - spawn() alert("You have logged in already with another key this round, please log out of this one NOW or risk being banned!") + if(!config.disable_cid_warn_popup) + spawn() alert("You have logged in already with another key this round, please log out of this one NOW or risk being banned!") if(matches) if(M.client) - message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].", 1) + message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].", 1) log_adminwarn("Notice: [key_name(src)] has the same [matches] as [key_name(M)].") else - message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)] (no longer logged in). ", 1) + message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)] (no longer logged in). ", 1) log_adminwarn("Notice: [key_name(src)] has the same [matches] as [key_name(M)] (no longer logged in).") /mob/Login() @@ -73,4 +74,7 @@ var/turf/T = get_turf(src) if(isturf(T)) - update_client_z(T.z) \ No newline at end of file + update_client_z(T.z) + + if(cloaked && cloaked_selfimage) + client.images += cloaked_selfimage \ No newline at end of file diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index edf2a299c5..47b82f15c4 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -223,6 +223,10 @@ if((is_blind(src) || usr.stat) && !isobserver(src)) to_chat(src, "Something is there but you can't see it.") return 1 + + //Could be gone by the time they finally pick something + if(!A) + return 1 face_atom(A) A.examine(src) @@ -323,9 +327,9 @@ if (flavor_text && flavor_text != "") var/msg = replacetext(flavor_text, "\n", " ") if(length(msg) <= 40) - return "[msg]" + return "[msg]" else - return "[copytext_preserve_html(msg, 1, 37)]... More..." + return "[copytext_preserve_html(msg, 1, 37)]... More..." /* /mob/verb/help() @@ -400,26 +404,6 @@ /client/verb/changes() set name = "Changelog" set category = "OOC" - getFiles( - 'html/88x31.png', - 'html/bug-minus.png', - 'html/cross-circle.png', - 'html/hard-hat-exclamation.png', - 'html/image-minus.png', - 'html/image-plus.png', - 'html/map-pencil.png', - 'html/music-minus.png', - 'html/music-plus.png', - 'html/tick-circle.png', - 'html/wrench-screwdriver.png', - 'html/spell-check.png', - 'html/burn-exclamation.png', - 'html/chevron.png', - 'html/chevron-expand.png', - 'html/changelog.css', - 'html/changelog.js', - 'html/changelog.html' - ) src << browse('html/changelog.html', "window=changes;size=675x650") if(prefs.lastchangelog != changelog_hash) prefs.lastchangelog = changelog_hash @@ -1016,6 +1000,11 @@ mob/proc/yank_out_object() /mob/proc/updateicon() return +// Please always use this proc, never just set the var directly. +/mob/proc/set_stat(var/new_stat) + . = (stat != new_stat) + stat = new_stat + /mob/verb/face_direction() set name = "Face Direction" @@ -1072,6 +1061,13 @@ mob/proc/yank_out_object() /mob/proc/setEarDamage() return +// Set client view distance (size of client's screen). Returns TRUE if anything changed. +/mob/proc/set_viewsize(var/new_view = world.view) + if (client && new_view != client.view) + client.view = new_view + return TRUE + return FALSE + //Throwing stuff /mob/proc/toggle_throw_mode() @@ -1198,4 +1194,26 @@ mob/proc/yank_out_object() /mob/onTransitZ(old_z, new_z) ..() - update_client_z(new_z) \ No newline at end of file + update_client_z(new_z) + +/mob/cloak() + . = ..() + if(client && cloaked_selfimage) + client.images += cloaked_selfimage + +/mob/uncloak() + if(client && cloaked_selfimage) + client.images -= cloaked_selfimage + return ..() + +/mob/get_cloaked_selfimage() + var/icon/selficon = getCompoundIcon(src) + selficon.MapColors(0,0,0, 0,0,0, 0,0,0, 1,1,1) //White + var/image/selfimage = image(selficon) + selfimage.color = "#0000FF" + selfimage.alpha = 100 + selfimage.layer = initial(layer) + selfimage.plane = initial(plane) + selfimage.loc = src + + return selfimage diff --git a/code/modules/mob/mob_planes.dm b/code/modules/mob/mob_planes.dm index 86173ee7fe..e1c33efe72 100644 --- a/code/modules/mob/mob_planes.dm +++ b/code/modules/mob/mob_planes.dm @@ -41,6 +41,7 @@ plane_masters[VIS_TURFS] = new /obj/screen/plane_master/main{plane = TURF_PLANE} plane_masters[VIS_OBJS] = new /obj/screen/plane_master/main{plane = OBJ_PLANE} plane_masters[VIS_MOBS] = new /obj/screen/plane_master/main{plane = MOB_PLANE} + plane_masters[VIS_CLOAKED] = new /obj/screen/plane_master/cloaked //Cloaked atoms! ..() @@ -178,6 +179,13 @@ plane = PLANE_GHOSTS desired_alpha = 127 //When enabled, they're like half-transparent +///////////////// +//Cloaked atoms are visible to ghosts (or for other reasons?) +/obj/screen/plane_master/cloaked + plane = CLOAKED_PLANE + desired_alpha = 80 + color = "#0000FF" + ///////////////// //The main game planes start normal and visible /obj/screen/plane_master/main diff --git a/code/modules/mob/new_player/skill.dm b/code/modules/mob/new_player/skill.dm index dc7e5c354e..b2d061d5a6 100644 --- a/code/modules/mob/new_player/skill.dm +++ b/code/modules/mob/new_player/skill.dm @@ -3,6 +3,7 @@ var/global/const SKILL_BASIC = 1 SKILL_ADEPT = 2 SKILL_EXPERT = 3 + SKILL_PROF = 4 /datum/skill/var ID = "none" // ID of the skill, used in code diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index fc881125ef..d11cc80594 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1304,6 +1304,11 @@ icon_state = "teshari_mushroom" species_allowed = list(SPECIES_TESHARI) + teshari_bald + name = "Bald (use with FBP)" + icon_state = "bald" + species_allowed = list(SPECIES_TESHARI) + // Vox things vox_braid_long name = "Long Vox braid" diff --git a/code/modules/mob/skillset.dm b/code/modules/mob/skillset.dm new file mode 100644 index 0000000000..2877372491 --- /dev/null +++ b/code/modules/mob/skillset.dm @@ -0,0 +1,14 @@ + +// We don't actually have a skills system, so return max skill for everything. +/mob/proc/get_skill_value(skill_path) + return SKILL_EXPERT + +// A generic way of modifying success probabilities via skill values. Higher factor means skills have more effect. fail_chance is the chance at SKILL_NONE. +/mob/proc/skill_fail_chance(skill_path, fail_chance, no_more_fail = SKILL_EXPERT, factor = 1) + var/points = get_skill_value(skill_path) + if(points >= no_more_fail) + return 0 + else + return fail_chance * 2 ** (factor*(SKILL_BASIC - points)) + + return FALSE // We don't actually have a skills system, so never fail. diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm index d659caaf40..2e4d43c731 100644 --- a/code/modules/modular_computers/NTNet/NTNet_relay.dm +++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm @@ -2,7 +2,7 @@ /obj/machinery/ntnet_relay name = "NTNet Quantum Relay" desc = "A very complex router and transmitter capable of connecting electronic devices together. Looks fragile." - use_power = 2 + use_power = USE_POWER_ACTIVE active_power_usage = 20000 //20kW, apropriate for machine that keeps massive cross-Zlevel wireless network operational. idle_power_usage = 100 icon_state = "bus" @@ -38,9 +38,9 @@ /obj/machinery/ntnet_relay/process() if(operable()) - use_power = 2 + update_use_power(USE_POWER_ACTIVE) else - use_power = 1 + update_use_power(USE_POWER_IDLE) if(dos_overload) dos_overload = max(0, dos_overload - dos_dissipate) diff --git a/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm index 20c4dde1ca..c887034754 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm @@ -42,7 +42,7 @@ /datum/nano_module/alarm_monitor/all/New() ..() - alarm_handlers = alarm_manager.all_handlers + alarm_handlers = SSalarm.all_handlers /datum/nano_module/alarm_monitor/engineering/New() ..() diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index b806f46dd3..a9f756469c 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -15,6 +15,10 @@ /mob/proc/zMove(direction) if(eyeobj) return eyeobj.zMove(direction) + if(istype(loc,/obj/mecha)) + var/obj/mecha/mech = loc + return mech.relaymove(src,direction) + if(!can_ztravel()) to_chat(src, "You lack means of travel in that direction.") return diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index b9b1ef07b2..5c0f1e5d1b 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -18,6 +18,22 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain) var/clone_source = FALSE var/mob/living/carbon/brain/brainmob = null var/can_assist = TRUE + var/defib_timer = -1 + +/obj/item/organ/internal/brain/process() + ..() + if(owner && owner.stat != DEAD) // So there's a lower risk of ticking twice. + tick_defib_timer() + +// This is called by `process()` when the owner is alive, or brain is not in a body, and by `Life()` directly when dead. +/obj/item/organ/internal/brain/proc/tick_defib_timer() + if(preserved) // In an MMI/ice box/etc. + return + + if(!owner || owner.stat == DEAD) + defib_timer = max(--defib_timer, 0) + else + defib_timer = min(++defib_timer, (config.defib_timer MINUTES) / 2) /obj/item/organ/internal/brain/proc/can_assist() return can_assist @@ -65,6 +81,7 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain) /obj/item/organ/internal/brain/New() ..() health = config.default_brain_health + defib_timer = (config.defib_timer MINUTES) / 2 spawn(5) if(brainmob && brainmob.client) brainmob.client.screen.len = null //clear the hud diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm index 07ef683e06..f123ea127b 100644 --- a/code/modules/organs/internal/lungs.dm +++ b/code/modules/organs/internal/lungs.dm @@ -15,28 +15,29 @@ if(is_bruised()) if(prob(4)) - spawn owner.emote("me", 1, "coughs up blood!") + spawn owner?.emote("me", 1, "coughs up blood!") owner.drip(10) if(prob(8)) - spawn owner.emote("me", 1, "gasps for air!") + spawn owner?.emote("me", 1, "gasps for air!") owner.AdjustLosebreath(15) if(owner.internal_organs_by_name[O_BRAIN]) // As the brain starts having Trouble, the lungs start malfunctioning. var/obj/item/organ/internal/brain/Brain = owner.internal_organs_by_name[O_BRAIN] if(Brain.get_control_efficiency() <= 0.8) if(prob(4 / max(0.1,Brain.get_control_efficiency()))) - spawn owner.emote("me", 1, "gasps for air!") + spawn owner?.emote("me", 1, "gasps for air!") owner.AdjustLosebreath(round(3 / max(0.1,Brain.get_control_efficiency()))) /obj/item/organ/internal/lungs/proc/rupture() - var/obj/item/organ/external/parent = owner.get_organ(parent_organ) - if(istype(parent)) - owner.custom_pain("You feel a stabbing pain in your [parent.name]!", 50) + if(owner) + var/obj/item/organ/external/parent = owner.get_organ(parent_organ) + if(istype(parent)) + owner.custom_pain("You feel a stabbing pain in your [parent.name]!", 50) bruise() /obj/item/organ/internal/lungs/handle_germ_effects() . = ..() //Up should return an infection level as an integer - if(!.) return + if(!. || !owner) return //Bacterial pneumonia if (. >= 1) @@ -54,6 +55,6 @@ ..() var/mob/living/carbon/human/H = null spawn(15) - if(ishuman(owner)) + if(owner && ishuman(owner)) H = owner color = H.species.blood_color diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index 04afbf6ec5..1224fae71f 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -98,6 +98,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_unathi.dmi' unavailable_to_build = 1 +/datum/robolimb/unbranded_teshari + company = "Unbranded - Teshari" + species_cannot_use = list(SPECIES_UNATHI, SPECIES_PROMETHEAN, SPECIES_DIONA, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_TAJ, SPECIES_SKRELL, SPECIES_ZADDAT) + suggested_species = SPECIES_TESHARI + desc = "A simple robotic limb with a small, raptor-like design. Seems rather stiff." + icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_teshari.dmi' + unavailable_to_build = 0 + /datum/robolimb/nanotrasen company = "NanoTrasen" desc = "A simple but efficient robotic limb, created by NanoTrasen." @@ -122,6 +130,15 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ icon = 'icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_unathi.dmi' unavailable_to_build = 1 +/datum/robolimb/cenilimicybernetics_teshari + company = "Cenilimi Cybernetics" + species_cannot_use = list(SPECIES_UNATHI, SPECIES_PROMETHEAN, SPECIES_DIONA, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_TAJ, SPECIES_SKRELL, SPECIES_ZADDAT) + species_alternates = list(SPECIES_HUMAN = "NanoTrasen") + suggested_species = SPECIES_TESHARI + desc = "Made by a Teshari-owned company, for Teshari." + icon = 'icons/mob/human_races/cyberlimbs/cenilimicybernetics/cenilimicybernetics_teshari.dmi' + unavailable_to_build = 1 + /datum/robolimb/bishop company = "Bishop" desc = "This limb has a white polymer casing with blue holo-displays." @@ -465,3 +482,6 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ /obj/item/weapon/disk/species/zaddat species = SPECIES_ZADDAT + +/obj/item/weapon/disk/limb/cenilimicybernetics + company = "Cenilimi Cybernetics" \ No newline at end of file diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm index 55e3f2cd5f..fef02ada36 100644 --- a/code/modules/organs/subtypes/machine.dm +++ b/code/modules/organs/subtypes/machine.dm @@ -14,7 +14,7 @@ ..() // This is very ghetto way of rebooting an IPC. TODO better way. if(owner && owner.stat == DEAD) - owner.stat = 0 + owner.set_stat(CONSCIOUS) owner.visible_message("\The [owner] twitches visibly!") /obj/item/organ/internal/cell/emp_act(severity) @@ -68,7 +68,7 @@ stored_mmi.brainmob.languages = owner.languages if(owner && owner.stat == DEAD) - owner.stat = 0 + owner.set_stat(CONSCIOUS) dead_mob_list -= owner living_mob_list |= owner owner.visible_message("\The [owner] twitches visibly!") diff --git a/code/modules/overmap/README.dm b/code/modules/overmap/README.dm index 14a7a955a5..ac9fc8890e 100644 --- a/code/modules/overmap/README.dm +++ b/code/modules/overmap/README.dm @@ -53,6 +53,12 @@ Changes desitnation area depending on current sector ship is in. Currently updating is called in attack_hand(), until a better place is found. Currently no modifications were made to interface to display availability of landing area in sector. +************************************************************* +Landable Ships +************************************************************* +Ship - Vessel that can move around on the overmap. It's entire z-level(s) "move" conceptually. +Shuttles - Vessel that can jump to shuttle landmarks. Its areas move by transition_turfs. +Landable Ship - Vessel that can do both. Sits at a special shuttle landmark for overmap movement mode. ************************************************************* Guide to how make new sector diff --git a/code/modules/overmap/_defines.dm b/code/modules/overmap/_defines.dm index a272ab7591..6cfde46793 100644 --- a/code/modules/overmap/_defines.dm +++ b/code/modules/overmap/_defines.dm @@ -1,9 +1,19 @@ -//Zlevel where overmap objects should be -#define OVERMAP_ZLEVEL 1 //How far from the edge of overmap zlevel could randomly placed objects spawn -#define OVERMAP_EDGE 7 +#define OVERMAP_EDGE 2 +#define SHIP_SIZE_TINY 1 +#define SHIP_SIZE_SMALL 2 +#define SHIP_SIZE_LARGE 3 +//multipliers for max_speed to find 'slow' and 'fast' speeds for the ship +#define SHIP_SPEED_SLOW 1/(40 SECONDS) +#define SHIP_SPEED_FAST 3/(20 SECONDS)// 15 speed + +#define OVERMAP_WEAKNESS_NONE 0 +#define OVERMAP_WEAKNESS_FIRE 1 +#define OVERMAP_WEAKNESS_EMP 2 +#define OVERMAP_WEAKNESS_MINING 4 +#define OVERMAP_WEAKNESS_EXPLOSIVE 8 //Dimension of overmap (squares 4 lyfe) var/global/list/map_sectors = list() @@ -17,13 +27,14 @@ var/global/list/map_sectors = list() /turf/unsimulated/map icon = 'icons/turf/space.dmi' icon_state = "map" + initialized = FALSE // TODO - Fix unsimulated turf initialization so this override is not necessary! /turf/unsimulated/map/edge opacity = 1 density = 1 -/turf/unsimulated/map/New() - ..() +/turf/unsimulated/map/Initialize() + . = ..() name = "[x]-[y]" var/list/numbers = list() @@ -48,11 +59,7 @@ var/global/list/map_sectors = list() I.pixel_x = 5*i - 2 if(x == global.using_map.overmap_size) I.pixel_x = 5*i + 2 - overlays += I - - - - + add_overlay(I) //list used to track which zlevels are being 'moved' by the proc below var/list/moving_levels = list() @@ -63,29 +70,13 @@ proc/toggle_move_stars(zlevel, direction) if(!zlevel) return - var/gen_dir = null - if(direction & (NORTH|SOUTH)) - gen_dir += "ns" - else if(direction & (EAST|WEST)) - gen_dir += "ew" - if(!direction) - gen_dir = null - - if (moving_levels["zlevel"] != gen_dir) - moving_levels["zlevel"] = gen_dir - for(var/x = 1 to world.maxx) - for(var/y = 1 to world.maxy) - var/turf/space/T = locate(x,y,zlevel) - if (istype(T)) - if(!gen_dir) - T.icon_state = "[((T.x + T.y) ^ ~(T.x * T.y) + T.z) % 25]" - else - T.icon_state = "speedspace_[gen_dir]_[rand(1,15)]" - for(var/atom/movable/AM in T) - if (!AM.anchored) - AM.throw_at(get_step(T,reverse_direction(direction)), 5, 1) - + if (moving_levels["[zlevel]"] != direction) + moving_levels["[zlevel]"] = direction + var/list/spaceturfs = block(locate(1, 1, zlevel), locate(world.maxx, world.maxy, zlevel)) + for(var/turf/space/T in spaceturfs) + T.toggle_transit(direction) + CHECK_TICK /* //list used to cache empty zlevels to avoid nedless map bloat var/list/cached_space = list() diff --git a/code/modules/overmap/events/event_handler.dm b/code/modules/overmap/events/event_handler.dm new file mode 100644 index 0000000000..67785e95ac --- /dev/null +++ b/code/modules/overmap/events/event_handler.dm @@ -0,0 +1,163 @@ +GLOBAL_DATUM_INIT(overmap_event_handler, /decl/overmap_event_handler, new) + +/decl/overmap_event_handler + var/list/hazard_by_turf + var/list/ship_events + +/decl/overmap_event_handler/New() + ..() + hazard_by_turf = list() + ship_events = list() + +// Populates overmap with random events! Should be called once at startup at some point. +/decl/overmap_event_handler/proc/create_events(var/z_level, var/overmap_size, var/number_of_events) + // Acquire the list of not-yet utilized overmap turfs on this Z-level + var/list/overmap_turfs = block(locate(OVERMAP_EDGE, OVERMAP_EDGE, z_level), locate(overmap_size - OVERMAP_EDGE, overmap_size - OVERMAP_EDGE, z_level)) + var/list/candidate_turfs = list() + for(var/Trf in overmap_turfs) + var/turf/T = Trf + if(!(locate(/obj/effect/overmap/visitable) in T)) + candidate_turfs += T + + for(var/i = 1 to number_of_events) + if(!candidate_turfs.len) + break + var/overmap_event_type = pick(subtypesof(/datum/overmap_event)) + var/datum/overmap_event/datum_spawn = new overmap_event_type + log_debug("Generating cloud of [datum_spawn.count] [datum_spawn] overmap event hazards") + + var/list/event_turfs = acquire_event_turfs(datum_spawn.count, datum_spawn.radius, candidate_turfs, datum_spawn.continuous) + candidate_turfs -= event_turfs + + for(var/event_turf in event_turfs) + var/type = pick(datum_spawn.hazards) + new type(event_turf) + + qdel(datum_spawn)//idk help how do I do this better? + +/decl/overmap_event_handler/proc/acquire_event_turfs(var/number_of_turfs, var/distance_from_origin, var/list/candidate_turfs, var/continuous = TRUE) + number_of_turfs = min(number_of_turfs, candidate_turfs.len) + candidate_turfs = candidate_turfs.Copy() // Not this proc's responsibility to adjust the given lists + + var/origin_turf = pick(candidate_turfs) + var/list/selected_turfs = list(origin_turf) + var/list/selection_turfs = list(origin_turf) + candidate_turfs -= origin_turf + + while(selection_turfs.len && selected_turfs.len < number_of_turfs) + var/selection_turf = pick(selection_turfs) + var/random_neighbour = get_random_neighbour(selection_turf, candidate_turfs, continuous, distance_from_origin) + + if(random_neighbour) + candidate_turfs -= random_neighbour + selected_turfs += random_neighbour + if(get_dist(origin_turf, random_neighbour) < distance_from_origin) + selection_turfs += random_neighbour + else + selection_turfs -= selection_turf + + return selected_turfs + +/decl/overmap_event_handler/proc/get_random_neighbour(var/turf/origin_turf, var/list/candidate_turfs, var/continuous = TRUE, var/range) + var/fitting_turfs + if(continuous) + fitting_turfs = origin_turf.CardinalTurfs(FALSE) + else + fitting_turfs = trange(range, origin_turf) + fitting_turfs = shuffle(fitting_turfs) + for(var/turf/T in fitting_turfs) + if(T in candidate_turfs) + return T + +/decl/overmap_event_handler/proc/start_hazard(var/obj/effect/overmap/visitable/ship/ship, var/obj/effect/overmap/event/hazard)//make these accept both hazards or events + if(!(ship in ship_events)) + ship_events += ship + + for(var/event_type in hazard.events) + if(is_event_active(ship, event_type, hazard.difficulty))//event's already active, don't bother + continue + var/datum/event_meta/EM = new(hazard.difficulty, "Overmap event - [hazard.name]", event_type, add_to_queue = FALSE, is_one_shot = TRUE) + var/datum/event/E = new event_type(EM) + E.startWhen = 0 + E.endWhen = INFINITY + // TODO - Leshana - Note: event.setup() is called before these are set! + E.affecting_z = ship.map_z + E.victim = ship + LAZYADD(ship_events[ship], E) + +/decl/overmap_event_handler/proc/stop_hazard(var/obj/effect/overmap/visitable/ship/ship, var/obj/effect/overmap/event/hazard) + for(var/event_type in hazard.events) + var/datum/event/E = is_event_active(ship, event_type, hazard.difficulty) + if(E) + E.kill() + LAZYREMOVE(ship_events[ship], E) + +/decl/overmap_event_handler/proc/is_event_active(var/ship, var/event_type, var/severity) + if(!ship_events[ship]) return + for(var/datum/event/E in ship_events[ship]) + if(E.type == event_type && E.severity == severity) + return E + +/decl/overmap_event_handler/proc/on_turf_entered(var/turf/new_loc, var/obj/effect/overmap/visitable/ship/ship, var/old_loc) + if(!istype(ship)) + return + if(new_loc == old_loc) + return + + for(var/obj/effect/overmap/event/E in hazard_by_turf[new_loc]) + start_hazard(ship, E) + +/decl/overmap_event_handler/proc/on_turf_exited(var/turf/old_loc, var/obj/effect/overmap/visitable/ship/ship, var/new_loc) + if(!istype(ship)) + return + if(new_loc == old_loc) + return + + for(var/obj/effect/overmap/event/E in hazard_by_turf[old_loc]) + if(is_event_included(hazard_by_turf[new_loc], E)) + continue // If new turf has the same event as well... keep it going! + stop_hazard(ship, E) + +/decl/overmap_event_handler/proc/update_hazards(var/turf/T)//catch all updater + if(!istype(T)) + return + + var/list/active_hazards = list() + for(var/obj/effect/overmap/event/E in T) + if(is_event_included(active_hazards, E, TRUE)) + continue + active_hazards += E + + if(!active_hazards.len) + hazard_by_turf -= T + else + hazard_by_turf |= T + hazard_by_turf[T] = active_hazards + + for(var/obj/effect/overmap/visitable/ship/ship in T) + for(var/datum/event/E in ship_events[ship]) + if(is_event_in_turf(E, T)) + continue + E.kill() + LAZYREMOVE(ship_events[ship], E) + + for(var/obj/effect/overmap/event/E in active_hazards) + start_hazard(ship, E) + +/decl/overmap_event_handler/proc/is_event_in_turf(var/datum/event/E, var/turf/T) + for(var/obj/effect/overmap/event/hazard in hazard_by_turf[T]) + if(E in hazard.events && E.severity == hazard.difficulty) + return TRUE + +/decl/overmap_event_handler/proc/is_event_included(var/list/hazards, var/obj/effect/overmap/event/E, var/equal_or_better)//this proc is only used so it can break out of 2 loops cleanly + for(var/obj/effect/overmap/event/A in hazards) + if(istype(A, E.type) || istype(E, A.type)) + if(same_entries(A.events, E.events)) + if(equal_or_better) + if(A.difficulty >= E.difficulty) + return TRUE + else + hazards -= A // TODO - Improve this SPAGHETTI CODE! Done only when called from update_hazards. ~Leshana + else + if(A.difficulty == E.difficulty) + return TRUE diff --git a/code/modules/overmap/events/generation.dm b/code/modules/overmap/events/generation.dm new file mode 100644 index 0000000000..9b70308866 --- /dev/null +++ b/code/modules/overmap/events/generation.dm @@ -0,0 +1,49 @@ +/* +** /datum/overmap_event - Descriptors of how/what to spawn during overmap event generation +*/ + +//These now are basically only used to spawn hazards. Will be useful when we need to spawn group of moving hazards +/datum/overmap_event + var/name = "map event" + var/radius = 2 // Radius of the spawn circle around chosen epicenter + var/count = 6 // How many hazards to spawn + var/hazards // List (or single) typepath of hazard to spawn + var/continuous = TRUE //if it should form continous blob, or can have gaps + +/datum/overmap_event/meteor + name = "asteroid field" + count = 15 + radius = 4 + continuous = FALSE + hazards = /obj/effect/overmap/event/meteor + +/datum/overmap_event/electric + name = "electrical storm" + count = 11 + radius = 3 + hazards = /obj/effect/overmap/event/electric + +/datum/overmap_event/dust + name = "dust cloud" + count = 16 + radius = 4 + hazards = /obj/effect/overmap/event/dust + +/datum/overmap_event/ion + name = "ion cloud" + count = 8 + radius = 3 + hazards = /obj/effect/overmap/event/ion + +/datum/overmap_event/carp + name = "carp shoal" + count = 8 + radius = 3 + continuous = FALSE + hazards = /obj/effect/overmap/event/carp + +/datum/overmap_event/carp/major + name = "carp school" + count = 5 + radius = 4 + hazards = /obj/effect/overmap/event/carp/major \ No newline at end of file diff --git a/code/modules/overmap/events/overmap_event.dm b/code/modules/overmap/events/overmap_event.dm new file mode 100644 index 0000000000..9add25a5c1 --- /dev/null +++ b/code/modules/overmap/events/overmap_event.dm @@ -0,0 +1,85 @@ +/* +** /obj/effect/overmap/event - Actual instances of event hazards on the overmap map +*/ + +// We don't subtype /obj/effect/overmap/visitable because that'll create sections one can travel to +// And with them "existing" on the overmap Z-level things quickly get odd. +/obj/effect/overmap/event + name = "event" + icon = 'icons/obj/overmap.dmi' + icon_state = "event" + opacity = 1 + var/list/events // List of event datum paths + var/list/event_icon_states // Randomly picked from + var/difficulty = EVENT_LEVEL_MODERATE + var/weaknesses //if the BSA can destroy them and with what + +/obj/effect/overmap/event/Initialize() + . = ..() + icon_state = pick(event_icon_states) + GLOB.overmap_event_handler.update_hazards(loc) + +/obj/effect/overmap/event/Move() + var/turf/old_loc = loc + . = ..() + if(.) + GLOB.overmap_event_handler.update_hazards(old_loc) + GLOB.overmap_event_handler.update_hazards(loc) + +/obj/effect/overmap/event/forceMove(atom/destination) + var/old_loc = loc + . = ..() + if(.) + GLOB.overmap_event_handler.update_hazards(old_loc) + GLOB.overmap_event_handler.update_hazards(loc) + +/obj/effect/overmap/event/Destroy()//takes a look at this one as well, make sure everything is A-OK + var/turf/T = loc + . = ..() + GLOB.overmap_event_handler.update_hazards(T) + +// +// Definitions for specific types! +// + +/obj/effect/overmap/event/meteor + name = "asteroid field" + events = list(/datum/event/meteor_wave/overmap) + event_icon_states = list("meteor1", "meteor2", "meteor3", "meteor4") + difficulty = EVENT_LEVEL_MAJOR + weaknesses = OVERMAP_WEAKNESS_MINING | OVERMAP_WEAKNESS_EXPLOSIVE + +/obj/effect/overmap/event/electric + name = "electrical storm" + events = list(/datum/event/electrical_storm/overmap) + opacity = 0 + event_icon_states = list("electrical1", "electrical2", "electrical3", "electrical4") + difficulty = EVENT_LEVEL_MAJOR + weaknesses = OVERMAP_WEAKNESS_EMP + +/obj/effect/overmap/event/dust + name = "dust cloud" + events = list(/datum/event/dust/overmap) + event_icon_states = list("dust1", "dust2", "dust3", "dust4") + weaknesses = OVERMAP_WEAKNESS_MINING | OVERMAP_WEAKNESS_EXPLOSIVE | OVERMAP_WEAKNESS_FIRE + +/obj/effect/overmap/event/ion + name = "ion cloud" + events = list(/datum/event/ionstorm/overmap) + opacity = 0 + event_icon_states = list("ion1", "ion2", "ion3", "ion4") + difficulty = EVENT_LEVEL_MAJOR + weaknesses = OVERMAP_WEAKNESS_EMP + +/obj/effect/overmap/event/carp + name = "carp shoal" + events = list(/datum/event/carp_migration/overmap) + opacity = 0 + difficulty = EVENT_LEVEL_MODERATE + event_icon_states = list("carp1", "carp2") + weaknesses = OVERMAP_WEAKNESS_EXPLOSIVE | OVERMAP_WEAKNESS_FIRE + +/obj/effect/overmap/event/carp/major + name = "carp school" + difficulty = EVENT_LEVEL_MAJOR + event_icon_states = list("carp3", "carp4") diff --git a/code/modules/overmap/overmap_object.dm b/code/modules/overmap/overmap_object.dm index 9db73eff63..fd2798e7d6 100644 --- a/code/modules/overmap/overmap_object.dm +++ b/code/modules/overmap/overmap_object.dm @@ -21,11 +21,9 @@ if(known) //layer = ABOVE_LIGHTING_LAYER plane = PLANE_LIGHTING_ABOVE - // TODO - Leshana HELM - // for(var/obj/machinery/computer/ship/helm/H in global.machines) - // H.get_known_sectors() -/* -TODO - Leshana - No need for this, we don't have skyboxes + for(var/obj/machinery/computer/ship/helm/H in global.machines) + H.get_known_sectors() + /obj/effect/overmap/Crossed(var/obj/effect/overmap/visitable/other) if(istype(other)) for(var/obj/effect/overmap/visitable/O in loc) @@ -36,4 +34,3 @@ TODO - Leshana - No need for this, we don't have skyboxes SSskybox.rebuild_skyboxes(other.map_z) for(var/obj/effect/overmap/visitable/O in loc) SSskybox.rebuild_skyboxes(O.map_z) -*/ \ No newline at end of file diff --git a/code/modules/overmap/overmap_shuttle.dm b/code/modules/overmap/overmap_shuttle.dm new file mode 100644 index 0000000000..c3195c99de --- /dev/null +++ b/code/modules/overmap/overmap_shuttle.dm @@ -0,0 +1,180 @@ +#define waypoint_sector(waypoint) map_sectors["[waypoint.z]"] + +/datum/shuttle/autodock/overmap + warmup_time = 10 + + var/range = 0 //how many overmap tiles can shuttle go, for picking destinations and returning. + var/fuel_consumption = 0 //Amount of moles of gas consumed per trip; If zero, then shuttle is magic and does not need fuel + var/list/obj/structure/fuel_port/fuel_ports //the fuel ports of the shuttle (but usually just one) + var/obj/effect/overmap/visitable/ship/landable/myship //my overmap ship object + + category = /datum/shuttle/autodock/overmap + var/skill_needed = SKILL_BASIC + var/operator_skill = SKILL_BASIC + +/datum/shuttle/autodock/overmap/New(var/_name, var/obj/effect/shuttle_landmark/start_waypoint) + ..(_name, start_waypoint) + refresh_fuel_ports_list() + +/datum/shuttle/autodock/overmap/Destroy() + . = ..() + myship = null + +/datum/shuttle/autodock/overmap/proc/refresh_fuel_ports_list() //loop through all + fuel_ports = list() + for(var/area/A in shuttle_area) + for(var/obj/structure/fuel_port/fuel_port_in_area in A) + fuel_port_in_area.parent_shuttle = src + fuel_ports += fuel_port_in_area + +/datum/shuttle/autodock/overmap/fuel_check() + if(!src.try_consume_fuel()) //insufficient fuel + for(var/area/A in shuttle_area) + for(var/mob/living/M in A) + M.show_message("You hear the shuttle engines sputter... perhaps it doesn't have enough fuel?", 1, + "The shuttle shakes but fails to take off.", 2) + return 0 //failure! + return 1 //sucess, continue with launch + +/datum/shuttle/autodock/overmap/proc/can_go() + if(!next_location) + return FALSE + if(moving_status == SHUTTLE_INTRANSIT) + return FALSE //already going somewhere, current_location may be an intransit location instead of in a sector + var/our_sector = waypoint_sector(current_location) + if(!our_sector && myship?.landmark && next_location == myship.landmark) + return TRUE //We're not on the overmap yet (admin spawned probably), and we're trying to hook up with our openspace sector + return get_dist(our_sector, waypoint_sector(next_location)) <= range + +/datum/shuttle/autodock/overmap/can_launch() + return ..() && can_go() + +/datum/shuttle/autodock/overmap/can_force() + return ..() && can_go() + +/datum/shuttle/autodock/overmap/get_travel_time() + var/distance_mod = get_dist(waypoint_sector(current_location),waypoint_sector(next_location)) + var/skill_mod = 0.2*(skill_needed - operator_skill) + return move_time * (1 + distance_mod + skill_mod) + +/datum/shuttle/autodock/overmap/process_launch() + if(prob(10*max(0, skill_needed - operator_skill))) + var/places = get_possible_destinations() + var/place = pick(places) + set_destination(places[place]) + ..() + +/datum/shuttle/autodock/overmap/proc/set_destination(var/obj/effect/shuttle_landmark/A) + if(A != current_location) + next_location = A + +/datum/shuttle/autodock/overmap/proc/get_possible_destinations() + var/list/res = list() + var/our_sector = waypoint_sector(current_location) + if(!our_sector && myship?.landmark) + res["Perform Test Jump"] = myship.landmark + return res //We're not on the overmap, maybe an admin spawned us on a non-sector map. We're broken until we connect to our space z-level. + for (var/obj/effect/overmap/visitable/S in range(get_turf(our_sector), range)) + var/list/waypoints = S.get_waypoints(name) + for(var/obj/effect/shuttle_landmark/LZ in waypoints) + if(LZ.is_valid(src)) + res["[waypoints[LZ]] - [LZ.name]"] = LZ + return res + +/datum/shuttle/autodock/overmap/get_location_name() + if(moving_status == SHUTTLE_INTRANSIT) + return "In transit" + return "[waypoint_sector(current_location)] - [current_location]" + +/datum/shuttle/autodock/overmap/get_destination_name() + if(!next_location) + return "None" + return "[waypoint_sector(next_location)] - [next_location]" + +/datum/shuttle/autodock/overmap/proc/try_consume_fuel() //returns 1 if sucessful, returns 0 if error (like insufficient fuel) + if(!fuel_consumption) + return 1 //shuttles with zero fuel consumption are magic and can always launch + if(!fuel_ports.len) + return 0 //Nowhere to get fuel from + var/list/obj/item/weapon/tank/fuel_tanks = list() + for(var/obj/structure/FP in fuel_ports) //loop through fuel ports and assemble list of all fuel tanks + var/obj/item/weapon/tank/FT = locate() in FP + if(FT) + fuel_tanks += FT + if(!fuel_tanks.len) + return 0 //can't launch if you have no fuel TANKS in the ports + var/total_flammable_gas_moles = 0 + for(var/obj/item/weapon/tank/FT in fuel_tanks) + total_flammable_gas_moles += FT.air_contents.get_by_flag(XGM_GAS_FUEL) + if(total_flammable_gas_moles < fuel_consumption) //not enough fuel + return 0 + // We are going to succeed if we got to here, so start consuming that fuel + var/fuel_to_consume = fuel_consumption + for(var/obj/item/weapon/tank/FT in fuel_tanks) //loop through tanks, consume their fuel one by one + var/fuel_available = FT.air_contents.get_by_flag(XGM_GAS_FUEL) + if(!fuel_available) // Didn't even have fuel. + continue + if(fuel_available >= fuel_to_consume) + FT.remove_air_by_flag(XGM_GAS_FUEL, fuel_to_consume) + return 1 //ALL REQUIRED FUEL HAS BEEN CONSUMED, GO FOR LAUNCH! + else //this tank doesn't have enough to launch shuttle by itself, so remove all its fuel, then continue loop + fuel_to_consume -= fuel_available + FT.remove_air_by_flag(XGM_GAS_FUEL, fuel_available) + +/obj/structure/fuel_port + name = "fuel port" + desc = "The fuel input port of the shuttle. Holds one fuel tank. Use a crowbar to open and close it." + icon = 'icons/turf/shuttle_parts.dmi' + icon_state = "fuel_port" + density = 0 + anchored = 1 + var/icon_closed = "fuel_port" + var/icon_empty = "fuel_port_empty" + var/icon_full = "fuel_port_full" + var/opened = 0 + var/parent_shuttle + +/obj/structure/fuel_port/Initialize() + . = ..() + new /obj/item/weapon/tank/phoron(src) + +/obj/structure/fuel_port/attack_hand(mob/user as mob) + if(!opened) + to_chat(user, "The door is secured tightly. You'll need a crowbar to open it.") + return + else if(contents.len > 0) + user.put_in_hands(contents[1]) + update_icon() + +/obj/structure/fuel_port/update_icon() + if(opened) + if(contents.len > 0) + icon_state = icon_full + else + icon_state = icon_empty + else + icon_state = icon_closed + ..() + +/obj/structure/fuel_port/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(W.is_crowbar()) + if(opened) + to_chat(user, "You tightly shut \the [src] door.") + playsound(src.loc, 'sound/effects/locker_close.ogg', 25, 0, -3) + opened = 0 + else + to_chat(user, "You open up \the [src] door.") + playsound(src.loc, 'sound/effects/locker_open.ogg', 15, 1, -3) + opened = 1 + else if(istype(W,/obj/item/weapon/tank)) + if(!opened) + to_chat(user, "\The [src] door is still closed!") + return + if(contents.len == 0) + user.unEquip(W, src) + W.forceMove(src) + update_icon() + +// Walls hide stuff inside them, but we want to be visible. +/obj/structure/fuel_port/hide() + return \ No newline at end of file diff --git a/code/modules/overmap/sectors.dm b/code/modules/overmap/sectors.dm index 15393a5be1..f437874609 100644 --- a/code/modules/overmap/sectors.dm +++ b/code/modules/overmap/sectors.dm @@ -6,6 +6,7 @@ scannable = TRUE var/list/map_z = list() + var/list/extra_z_levels //if you need to manually insist that these z-levels are part of this sector, for things like edge-of-map step trigger transitions rather than multi-z complexes var/list/initial_generic_waypoints //store landmark_tag of landmarks that should be added to the actual lists below on init. var/list/initial_restricted_waypoints //For use with non-automatic landmarks (automatic ones add themselves). @@ -50,12 +51,16 @@ //This is called later in the init order by SSshuttles to populate sector objects. Importantly for subtypes, shuttles will be created by then. /obj/effect/overmap/visitable/proc/populate_sector_objects() -// TODO - Leshana - Implement -///obj/effect/overmap/visitable/proc/get_areas() -// return get_filtered_areas(list(/proc/area_belongs_to_zlevels = map_z)) +/obj/effect/overmap/visitable/proc/get_areas() + . = list() + for(var/area/A) + if (A.z in map_z) + . += A /obj/effect/overmap/visitable/proc/find_z_levels() map_z = GetConnectedZlevels(z) + if(LAZYLEN(extra_z_levels)) + map_z |= extra_z_levels /obj/effect/overmap/visitable/proc/register_z_levels() for(var/zlevel in map_z) @@ -69,6 +74,12 @@ global.using_map.contact_levels |= map_z global.using_map.map_levels |= map_z +/obj/effect/overmap/visitable/proc/get_space_zlevels() + if(in_space) + return map_z + else + return list() + //Helper for init. /obj/effect/overmap/visitable/proc/check_ownership(obj/object) if((object.z in map_z) && !(get_area(object) in SSshuttles.shuttle_areas)) @@ -102,6 +113,21 @@ /obj/effect/overmap/visitable/proc/generate_skybox() return +/obj/effect/overmap/visitable/MouseEntered(location, control, params) + openToolTip(user = usr, tip_src = src, params = params, title = name) + + ..() + +/obj/effect/overmap/visitable/MouseDown() + closeToolTip(usr) //No reason not to, really + + ..() + +/obj/effect/overmap/visitable/MouseExited() + closeToolTip(usr) //No reason not to, really + + ..() + /obj/effect/overmap/visitable/sector name = "generic sector" desc = "Sector with some stuff in it." @@ -117,7 +143,7 @@ return 1 testing("Building overmap...") - world.maxz++ + world.increment_max_z() global.using_map.overmap_z = world.maxz testing("Putting overmap on [global.using_map.overmap_z]") diff --git a/code/modules/overmap/ships/computers/computer_shims.dm b/code/modules/overmap/ships/computers/computer_shims.dm new file mode 100644 index 0000000000..c685acc49d --- /dev/null +++ b/code/modules/overmap/ships/computers/computer_shims.dm @@ -0,0 +1,104 @@ +/* +** +** HELLO! DON'T COPY THINGS FROM HERE - READ THIS! +** +** The ship machines/computers ported from baystation expect certain procs and infrastruture that we don't have. +** I /could/ just port those computers to our code, but I actually *like* that infrastructure. But I +** don't have time (yet) to implement it fully in our codebase, so I'm shimming it here experimentally as a test +** bed for later implementing it on /obj/machinery and /obj/machinery/computer for everything. ~Leshana (March 2020) +*/ + +// +// Power +// + +// This will have this machine have its area eat this much power next tick, and not afterwards. Do not use for continued power draw. +/obj/machinery/proc/use_power_oneoff(var/amount, var/chan = -1) + return use_power(amount, chan) + +// Change one of the power consumption vars +/obj/machinery/proc/change_power_consumption(new_power_consumption, use_power_mode = USE_POWER_IDLE) + switch(use_power_mode) + if(USE_POWER_IDLE) + idle_power_usage = new_power_consumption + if(USE_POWER_ACTIVE) + active_power_usage = new_power_consumption + // No need to do anything else in our power scheme. + +// Defining directly here to avoid conflicts with existing set_broken procs in our codebase that behave differently. +/obj/machinery/atmospherics/unary/engine/proc/set_broken(var/new_state, var/cause) + if(!(stat & BROKEN) == !new_state) + return // Nothing changed + stat ^= BROKEN + update_icon() + + +// +// Compoenents +// + +/obj/machinery/proc/total_component_rating_of_type(var/part_type) + . = 0 + for(var/thing in component_parts) + if(istype(thing, part_type)) + var/obj/item/weapon/stock_parts/part = thing + . += part.rating + // Now isn't THIS a cool idea? + // for(var/path in uncreated_component_parts) + // if(ispath(path, part_type)) + // var/obj/item/weapon/stock_parts/comp = path + // . += initial(comp.rating) * uncreated_component_parts[path] + +// +// Skills +// +/obj/machinery/computer/ship + var/core_skill = /datum/skill/devices //The skill used for skill checks for this machine (mostly so subtypes can use different skills). + +// +// Topic +// + +/obj/machinery/computer/ship/proc/DefaultTopicState() + return global.default_state + +/obj/machinery/computer/ship/Topic(var/href, var/href_list = list(), var/datum/topic_state/state) + if((. = ..())) + return + state = state || DefaultTopicState() || global.default_state + if(CanUseTopic(usr, state, href_list) == STATUS_INTERACTIVE) + CouldUseTopic(usr) + return OnTopic(usr, href_list, state) + CouldNotUseTopic(usr) + return TRUE + +/obj/machinery/computer/ship/proc/OnTopic(var/mob/user, var/href_list, var/datum/topic_state/state) + return TOPIC_NOACTION + +// +// Interaction +// + +// If you want to have interface interactions handled for you conveniently, use this. +// Return TRUE for handled. +// If you perform direct interactions in here, you are responsible for ensuring that full interactivity checks have been made (i.e CanInteract). +// The checks leading in to here only guarantee that the user should be able to view a UI. +/obj/machinery/computer/ship/proc/interface_interact(var/mob/user) + ui_interact(user) + return TRUE + +/obj/machinery/computer/ship/attack_ai(mob/user) + if(CanUseTopic(user, DefaultTopicState()) > STATUS_CLOSE) + return interface_interact(user) + +// After a recent rework this should mostly be safe. +/obj/machinery/computer/ship/attack_ghost(mob/user) + interface_interact(user) + +// If you don't call parent in this proc, you must make all appropriate checks yourself. +// If you do, you must respect the return value. +/obj/machinery/computer/ship/attack_hand(mob/user) + if((. = ..())) + return + if(CanUseTopic(user, DefaultTopicState()) > STATUS_CLOSE) + return interface_interact(user) diff --git a/code/modules/overmap/ships/computers/engine_control.dm b/code/modules/overmap/ships/computers/engine_control.dm index 01920ee2e0..9c77e1b995 100644 --- a/code/modules/overmap/ships/computers/engine_control.dm +++ b/code/modules/overmap/ships/computers/engine_control.dm @@ -1,46 +1,24 @@ //Engine control and monitoring console -/obj/machinery/computer/engines +/obj/machinery/computer/ship/engines name = "engine control console" icon_keyboard = "tech_key" - icon_screen = "id" - var/state = "status" - var/list/engines = list() - var/obj/effect/map/ship/linked + icon_screen = "engines" + var/display_state = "status" -/obj/machinery/computer/engines/Initialize() - . = ..() - linked = map_sectors["[z]"] - if (linked) - if (!linked.eng_control) - linked.eng_control = src - testing("Engines console at level [z] found a corresponding overmap object '[linked.name]'.") - else - testing("Engines console at level [z] was unable to find a corresponding overmap object.") - - for(var/datum/ship_engine/E in engines) - if (E.zlevel == z && !(E in engines)) - engines += E - -/obj/machinery/computer/engines/attack_hand(var/mob/user as mob) - if(..()) - user.unset_machine() - return - - if(!isAI(user)) - user.set_machine(src) - - ui_interact(user) - -/obj/machinery/computer/engines/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) +/obj/machinery/computer/ship/engines/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) if(!linked) + display_reconnect_dialog(user, "ship control systems") return var/data[0] - data["state"] = state + data["state"] = display_state + data["global_state"] = linked.engines_state + data["global_limit"] = round(linked.thrust_limit*100) + var/total_thrust = 0 var/list/enginfo[0] - for(var/datum/ship_engine/E in engines) + for(var/datum/ship_engine/E in linked.engines) var/list/rdata[0] rdata["eng_type"] = E.name rdata["eng_on"] = E.is_on() @@ -48,54 +26,70 @@ rdata["eng_thrust_limiter"] = round(E.get_thrust_limit()*100) rdata["eng_status"] = E.get_status() rdata["eng_reference"] = "\ref[E]" + total_thrust += E.get_thrust() enginfo.Add(list(rdata)) data["engines_info"] = enginfo + data["total_thrust"] = total_thrust ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) - ui = new(user, src, ui_key, "engines_control.tmpl", "[linked.name] Engines Control", 380, 530) + ui = new(user, src, ui_key, "engines_control.tmpl", "[linked.name] Engines Control", 390, 530) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) -/obj/machinery/computer/engines/Topic(href, href_list) +/obj/machinery/computer/ship/engines/OnTopic(var/mob/user, var/list/href_list, state) if(..()) - return 1 + return ..() if(href_list["state"]) - state = href_list["state"] + display_state = href_list["state"] + return TOPIC_REFRESH + + if(href_list["global_toggle"]) + linked.engines_state = !linked.engines_state + for(var/datum/ship_engine/E in linked.engines) + if(linked.engines_state == !E.is_on()) + E.toggle() + return TOPIC_REFRESH + + if(href_list["set_global_limit"]) + var/newlim = input("Input new thrust limit (0..100%)", "Thrust limit", linked.thrust_limit*100) as num + if(!CanInteract(user, state)) + return TOPIC_NOACTION + linked.thrust_limit = CLAMP(newlim/100, 0, 1) + for(var/datum/ship_engine/E in linked.engines) + E.set_thrust_limit(linked.thrust_limit) + return TOPIC_REFRESH + + if(href_list["global_limit"]) + linked.thrust_limit = CLAMP(linked.thrust_limit + text2num(href_list["global_limit"]), 0, 1) + for(var/datum/ship_engine/E in linked.engines) + E.set_thrust_limit(linked.thrust_limit) + return TOPIC_REFRESH if(href_list["engine"]) if(href_list["set_limit"]) var/datum/ship_engine/E = locate(href_list["engine"]) var/newlim = input("Input new thrust limit (0..100)", "Thrust limit", E.get_thrust_limit()) as num + if(!CanInteract(user, state)) + return var/limit = CLAMP(newlim/100, 0, 1) - if(E) + if(istype(E)) E.set_thrust_limit(limit) - + return TOPIC_REFRESH if(href_list["limit"]) var/datum/ship_engine/E = locate(href_list["engine"]) var/limit = CLAMP(E.get_thrust_limit() + text2num(href_list["limit"]), 0, 1) - if(E) + if(istype(E)) E.set_thrust_limit(limit) + return TOPIC_REFRESH if(href_list["toggle"]) var/datum/ship_engine/E = locate(href_list["engine"]) - if(E) + if(istype(E)) E.toggle() - - add_fingerprint(usr) - updateUsrDialog() - -/obj/machinery/computer/engines/proc/burn() - if(engines.len == 0) - return 0 - var/res = 0 - for(var/datum/ship_engine/E in engines) - res |= E.burn() - return res - -/obj/machinery/computer/engines/proc/get_total_thrust() - for(var/datum/ship_engine/E in engines) - . += E.get_thrust() + return TOPIC_REFRESH + return TOPIC_REFRESH + return TOPIC_NOACTION \ No newline at end of file diff --git a/code/modules/overmap/ships/computers/helm.dm b/code/modules/overmap/ships/computers/helm.dm index 0249fae482..1ba9cd875e 100644 --- a/code/modules/overmap/ships/computers/helm.dm +++ b/code/modules/overmap/ships/computers/helm.dm @@ -1,151 +1,187 @@ -/obj/machinery/computer/helm +// LEGACY_RECORD_STRUCTURE(all_waypoints, waypoint) +GLOBAL_LIST_EMPTY(all_waypoints) +/datum/computer_file/data/waypoint + var/list/fields + filetype = "WPT" + +/datum/computer_file/data/waypoint/New() + ..() + fields = list() + GLOB.all_waypoints.Add(src) + +/datum/computer_file/data/waypoint/Destroy() + . = ..() + GLOB.all_waypoints.Remove(src); +// End LEGACY_RECORD_STRUCTURE(all_waypoints, waypoint) + +/obj/machinery/computer/ship/helm name = "helm control console" - icon_keyboard = "med_key" - icon_screen = "id" - var/state = "status" - var/obj/effect/map/ship/linked //connected overmap object + icon_keyboard = "teleport_key" + icon_screen = "helm" + light_color = "#7faaff" + core_skill = /datum/skill/pilot var/autopilot = 0 - var/manual_control = 0 var/list/known_sectors = list() var/dx //desitnation var/dy //coordinates + var/speedlimit = 1/(20 SECONDS) //top speed for autopilot, 5 + var/accellimit = 0.001 //manual limiter for acceleration -/obj/machinery/computer/helm/Initialize() +/obj/machinery/computer/ship/helm/Initialize() . = ..() - linked = map_sectors["[z]"] - if (linked) - if(!linked.nav_control) - linked.nav_control = src - testing("Helm console at level [z] found a corresponding overmap object '[linked.name]'.") - else - testing("Helm console at level [z] was unable to find a corresponding overmap object.") + get_known_sectors() - for(var/level in map_sectors) - var/obj/effect/map/sector/S = map_sectors["[level]"] - if (istype(S) && S.always_known) - var/datum/data/record/R = new() +/obj/machinery/computer/ship/helm/proc/get_known_sectors() + var/area/overmap/map = locate() in world + for(var/obj/effect/overmap/visitable/sector/S in map) + if (S.known) + var/datum/computer_file/data/waypoint/R = new() R.fields["name"] = S.name R.fields["x"] = S.x R.fields["y"] = S.y - known_sectors += R + known_sectors[S.name] = R -/obj/machinery/computer/helm/process() +/obj/machinery/computer/ship/helm/process() ..() if (autopilot && dx && dy) - var/turf/T = locate(dx,dy,1) + var/turf/T = locate(dx,dy,global.using_map.overmap_z) if(linked.loc == T) if(linked.is_still()) autopilot = 0 else linked.decelerate() - - var/brake_path = linked.get_brake_path() - - if(get_dist(linked.loc, T) > brake_path) - linked.accelerate(get_dir(linked.loc, T)) else - linked.decelerate() + var/brake_path = linked.get_brake_path() + var/direction = get_dir(linked.loc, T) + var/acceleration = min(linked.get_acceleration(), accellimit) + var/speed = linked.get_speed() + var/heading = linked.get_heading() + // Destination is current grid or speedlimit is exceeded + if ((get_dist(linked.loc, T) <= brake_path) || speed > speedlimit) + linked.decelerate() + // Heading does not match direction + else if (heading & ~direction) + linked.accelerate(turn(heading & ~direction, 180), accellimit) + // All other cases, move toward direction + else if (speed + acceleration <= speedlimit) + linked.accelerate(direction, accellimit) + linked.operator_skill = null//if this is on you can't dodge meteors return -/obj/machinery/computer/helm/relaymove(var/mob/user, direction) - if(manual_control && linked) - linked.relaymove(user,direction) +/obj/machinery/computer/ship/helm/relaymove(var/mob/user, direction) + if(viewing_overmap(user) && linked) + if(prob(user.skill_fail_chance(/datum/skill/pilot, 50, linked.skill_needed, factor = 1))) + direction = turn(direction,pick(90,-90)) + linked.relaymove(user, direction, accellimit) return 1 -/obj/machinery/computer/helm/check_eye(var/mob/user as mob) - if (!manual_control) - return -1 - if (!get_dist(user, src) > 1 || user.blinded || !linked ) - return -1 - return 0 - -/obj/machinery/computer/helm/attack_hand(var/mob/user as mob) - if(..()) - user.unset_machine() - manual_control = 0 - return - - if(!isAI(user)) - user.set_machine(src) - if(linked) - user.reset_view(linked) - - ui_interact(user) - -/obj/machinery/computer/helm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - if(!linked) - return - +/obj/machinery/computer/ship/helm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] - data["state"] = state - data["sector"] = linked.current_sector ? linked.current_sector.name : "Deep Space" - data["sector_info"] = linked.current_sector ? linked.current_sector.desc : "Not Available" - data["s_x"] = linked.x - data["s_y"] = linked.y - data["dest"] = dy && dx - data["d_x"] = dx - data["d_y"] = dy - data["speed"] = linked.get_speed() - data["accel"] = round(linked.get_acceleration()) - data["heading"] = linked.get_heading() ? dir2angle(linked.get_heading()) : 0 - data["autopilot"] = autopilot - data["manual_control"] = manual_control + if(!linked) + display_reconnect_dialog(user, "helm") + else + var/turf/T = get_turf(linked) + var/obj/effect/overmap/visitable/sector/current_sector = locate() in T - var/list/locations[0] - for (var/datum/data/record/R in known_sectors) - var/list/rdata[0] - rdata["name"] = R.fields["name"] - rdata["x"] = R.fields["x"] - rdata["y"] = R.fields["y"] - rdata["reference"] = "\ref[R]" - locations.Add(list(rdata)) + data["sector"] = current_sector ? current_sector.name : "Deep Space" + data["sector_info"] = current_sector ? current_sector.desc : "Not Available" + data["landed"] = linked.get_landed_info() + data["s_x"] = linked.x + data["s_y"] = linked.y + data["dest"] = dy && dx + data["d_x"] = dx + data["d_y"] = dy + data["speedlimit"] = speedlimit ? speedlimit*1000 : "Halted" + data["accel"] = min(round(linked.get_acceleration()*1000, 0.01),accellimit*1000) + data["heading"] = linked.get_heading_degrees() + data["autopilot"] = autopilot + data["manual_control"] = viewing_overmap(user) + data["canburn"] = linked.can_burn() + data["accellimit"] = accellimit*1000 - data["locations"] = locations + var/speed = round(linked.get_speed()*1000, 0.01) + if(linked.get_speed() < SHIP_SPEED_SLOW) + speed = "[speed]" + if(linked.get_speed() > SHIP_SPEED_FAST) + speed = "[speed]" + data["speed"] = speed - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "helm.tmpl", "[linked.name] Helm Control", 380, 530) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) + if(linked.get_speed()) + data["ETAnext"] = "[round(linked.ETA()/10)] seconds" + else + data["ETAnext"] = "N/A" -/obj/machinery/computer/helm/Topic(href, href_list) + var/list/locations[0] + for (var/key in known_sectors) + var/datum/computer_file/data/waypoint/R = known_sectors[key] + var/list/rdata[0] + rdata["name"] = R.fields["name"] + rdata["x"] = R.fields["x"] + rdata["y"] = R.fields["y"] + rdata["reference"] = "\ref[R]" + locations.Add(list(rdata)) + + data["locations"] = locations + + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "helm.tmpl", "[linked.name] Helm Control", 565, 545) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/computer/ship/helm/OnTopic(var/mob/user, var/list/href_list, state) if(..()) - return 1 + return TOPIC_HANDLED - if (!linked) - return + if(!linked) + return TOPIC_HANDLED if (href_list["add"]) - var/datum/data/record/R = new() + var/datum/computer_file/data/waypoint/R = new() var/sec_name = input("Input naviation entry name", "New navigation entry", "Sector #[known_sectors.len]") as text + if(!CanInteract(user,state)) + return TOPIC_NOACTION if(!sec_name) sec_name = "Sector #[known_sectors.len]" R.fields["name"] = sec_name + if(sec_name in known_sectors) + to_chat(user, "Sector with that name already exists, please input a different name.") + return TOPIC_REFRESH switch(href_list["add"]) if("current") R.fields["x"] = linked.x R.fields["y"] = linked.y if("new") var/newx = input("Input new entry x coordinate", "Coordinate input", linked.x) as num - R.fields["x"] = CLAMP(newx, 1, world.maxx) + if(!CanInteract(user,state)) + return TOPIC_REFRESH var/newy = input("Input new entry y coordinate", "Coordinate input", linked.y) as num + if(!CanInteract(user,state)) + return TOPIC_NOACTION + R.fields["x"] = CLAMP(newx, 1, world.maxx) R.fields["y"] = CLAMP(newy, 1, world.maxy) - known_sectors += R + known_sectors[sec_name] = R if (href_list["remove"]) - var/datum/data/record/R = locate(href_list["remove"]) - known_sectors.Remove(R) + var/datum/computer_file/data/waypoint/R = locate(href_list["remove"]) + if(R) + known_sectors.Remove(R.fields["name"]) + qdel(R) if (href_list["setx"]) var/newx = input("Input new destiniation x coordinate", "Coordinate input", dx) as num|null + if(!CanInteract(user,state)) + return if (newx) dx = CLAMP(newx, 1, world.maxx) if (href_list["sety"]) var/newy = input("Input new destiniation y coordinate", "Coordinate input", dy) as num|null + if(!CanInteract(user,state)) + return if (newy) dy = CLAMP(newy, 1, world.maxy) @@ -157,9 +193,20 @@ dx = 0 dy = 0 + if (href_list["speedlimit"]) + var/newlimit = input("Input new speed limit for autopilot (0 to brake)", "Autopilot speed limit", speedlimit*1000) as num|null + if(newlimit) + speedlimit = CLAMP(newlimit/1000, 0, 100) + if (href_list["accellimit"]) + var/newlimit = input("Input new acceleration limit", "Acceleration limit", accellimit*1000) as num|null + if(newlimit) + accellimit = max(newlimit/1000, 0) + if (href_list["move"]) var/ndir = text2num(href_list["move"]) - linked.relaymove(usr, ndir) + if(prob(user.skill_fail_chance(/datum/skill/pilot, 50, linked.skill_needed, factor = 1))) + ndir = turn(ndir,pick(90,-90)) + linked.relaymove(user, ndir, accellimit) if (href_list["brake"]) linked.decelerate() @@ -168,10 +215,71 @@ autopilot = !autopilot if (href_list["manual"]) - manual_control = !manual_control + viewing_overmap(user) ? unlook(user) : look(user) - if (href_list["state"]) - state = href_list["state"] - add_fingerprint(usr) + add_fingerprint(user) updateUsrDialog() + +/obj/machinery/computer/ship/navigation + name = "navigation console" + icon_keyboard = "generic_key" + icon_screen = "helm" + +/obj/machinery/computer/ship/navigation/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + if(!linked) + display_reconnect_dialog(user, "Navigation") + return + + var/data[0] + + + var/turf/T = get_turf(linked) + var/obj/effect/overmap/visitable/sector/current_sector = locate() in T + + data["sector"] = current_sector ? current_sector.name : "Deep Space" + data["sector_info"] = current_sector ? current_sector.desc : "Not Available" + data["s_x"] = linked.x + data["s_y"] = linked.y + data["speed"] = round(linked.get_speed()*1000, 0.01) + data["accel"] = round(linked.get_acceleration()*1000, 0.01) + data["heading"] = linked.get_heading_degrees() + data["viewing"] = viewing_overmap(user) + + if(linked.get_speed()) + data["ETAnext"] = "[round(linked.ETA()/10)] seconds" + else + data["ETAnext"] = "N/A" + + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "nav.tmpl", "[linked.name] Navigation Screen", 380, 530) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/computer/ship/navigation/OnTopic(var/mob/user, var/list/href_list) + if(..()) + return TOPIC_HANDLED + + if (!linked) + return TOPIC_NOACTION + + if (href_list["viewing"]) + viewing_overmap(user) ? unlook(user) : look(user) + return TOPIC_REFRESH + +/obj/machinery/computer/ship/navigation/telescreen //little hacky but it's only used on one ship so it should be okay + icon_state = "tele_nav" + icon_keyboard = null + icon_screen = null + density = 0 + +/obj/machinery/computer/ship/navigation/telescreen/update_icon() + if(stat & NOPOWER || stat & BROKEN) + icon_state = "tele_off" + set_light(0) + else + icon_state = "tele_nav" + set_light(light_range_on, light_power_on) + ..() diff --git a/code/modules/overmap/ships/computers/sensors.dm b/code/modules/overmap/ships/computers/sensors.dm new file mode 100644 index 0000000000..ded9c5d978 --- /dev/null +++ b/code/modules/overmap/ships/computers/sensors.dm @@ -0,0 +1,226 @@ +/obj/machinery/computer/ship/sensors + name = "sensors console" + icon_keyboard = "teleport_key" + icon_screen = "teleport" + light_color = "#77fff8" + extra_view = 4 + var/obj/machinery/shipsensors/sensors + +/obj/machinery/computer/ship/sensors/attempt_hook_up(obj/effect/overmap/visitable/ship/sector) + if(!(. = ..())) + return + find_sensors() + +/obj/machinery/computer/ship/sensors/proc/find_sensors() + if(!linked) + return + for(var/obj/machinery/shipsensors/S in global.machines) + if(linked.check_ownership(S)) + sensors = S + break + +/obj/machinery/computer/ship/sensors/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + if(!linked) + display_reconnect_dialog(user, "sensors") + return + + var/data[0] + + data["viewing"] = viewing_overmap(user) + if(sensors) + data["on"] = sensors.use_power + data["range"] = sensors.range + data["health"] = sensors.health + data["max_health"] = sensors.max_health + data["heat"] = sensors.heat + data["critical_heat"] = sensors.critical_heat + if(sensors.health == 0) + data["status"] = "DESTROYED" + else if(!sensors.powered()) + data["status"] = "NO POWER" + else if(!sensors.in_vacuum()) + data["status"] = "VACUUM SEAL BROKEN" + else + data["status"] = "OK" + var/list/contacts = list() + for(var/obj/effect/overmap/O in view(7,linked)) + if(linked == O) + continue + if(!O.scannable) + continue + var/bearing = round(90 - ATAN2(O.x - linked.x, O.y - linked.y),5) + if(bearing < 0) + bearing += 360 + contacts.Add(list(list("name"=O.name, "ref"="\ref[O]", "bearing"=bearing))) + if(contacts.len) + data["contacts"] = contacts + else + data["status"] = "MISSING" + data["range"] = "N/A" + data["on"] = 0 + + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "shipsensors.tmpl", "[linked.name] Sensors Control", 420, 530, src) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/computer/ship/sensors/OnTopic(var/mob/user, var/list/href_list, state) + if(..()) + return TOPIC_HANDLED + + if (!linked) + return TOPIC_NOACTION + + if (href_list["viewing"]) + if(user && !isAI(user)) + viewing_overmap(user) ? unlook(user) : look(user) + return TOPIC_REFRESH + + if (href_list["link"]) + find_sensors() + return TOPIC_REFRESH + + if(sensors) + if (href_list["range"]) + var/nrange = input("Set new sensors range", "Sensor range", sensors.range) as num|null + if(!CanInteract(user,state)) + return TOPIC_NOACTION + if (nrange) + sensors.set_range(CLAMP(nrange, 1, world.view)) + return TOPIC_REFRESH + if (href_list["toggle"]) + sensors.toggle() + return TOPIC_REFRESH + + if (href_list["scan"]) + var/obj/effect/overmap/O = locate(href_list["scan"]) + if(istype(O) && !QDELETED(O) && (O in view(7,linked))) + playsound(loc, "sound/machines/dotprinter.ogg", 30, 1) + new/obj/item/weapon/paper/(get_turf(src), O.get_scan_data(user), "paper (Sensor Scan - [O])") + return TOPIC_HANDLED + +/obj/machinery/computer/ship/sensors/process() + ..() + if(!linked) + return + if(sensors && sensors.use_power && sensors.powered()) + var/sensor_range = round(sensors.range*1.5) + 1 + linked.set_light(sensor_range + 0.5, 4) + else + linked.set_light(0) + +/obj/machinery/shipsensors + name = "sensors suite" + desc = "Long range gravity scanner with various other sensors, used to detect irregularities in surrounding space. Can only run in vacuum to protect delicate quantum bluespace elements." + icon = 'icons/obj/stationobjs.dmi' + icon_state = "sensors" + anchored = 1 + var/max_health = 200 + var/health = 200 + var/critical_heat = 50 // sparks and takes damage when active & above this heat + var/heat_reduction = 1.5 // mitigates this much heat per tick + var/heat = 0 + var/range = 1 + idle_power_usage = 5000 + +/obj/machinery/shipsensors/attackby(obj/item/weapon/W, mob/user) + var/damage = max_health - health + if(damage && istype(W, /obj/item/weapon/weldingtool)) + + var/obj/item/weapon/weldingtool/WT = W + + if(!WT.isOn()) + return + + if(WT.remove_fuel(0,user)) + to_chat(user, "You start repairing the damage to [src].") + playsound(src, 'sound/items/Welder.ogg', 100, 1) + if(do_after(user, max(5, damage / 5), src) && WT && WT.isOn()) + to_chat(user, "You finish repairing the damage to [src].") + take_damage(-damage) + else + to_chat(user, "You need more welding fuel to complete this task.") + return + return + ..() + +/obj/machinery/shipsensors/proc/in_vacuum() + var/turf/T=get_turf(src) + if(istype(T)) + var/datum/gas_mixture/environment = T.return_air() + if(environment && environment.return_pressure() > MINIMUM_PRESSURE_DIFFERENCE_TO_SUSPEND) + return 0 + return 1 + +/obj/machinery/shipsensors/update_icon() + if(use_power) + icon_state = "sensors" + else + icon_state = "sensors_off" + ..() + +/obj/machinery/shipsensors/examine(mob/user) + . = ..() + if(health <= 0) + to_chat(user, "\The [src] is wrecked.") + else if(health < max_health * 0.25) + to_chat(user, "\The [src] looks like it's about to break!") + else if(health < max_health * 0.5) + to_chat(user, "\The [src] looks seriously damaged!") + else if(health < max_health * 0.75) + to_chat(user, "\The [src] shows signs of damage!") + +/obj/machinery/shipsensors/bullet_act(var/obj/item/projectile/Proj) + take_damage(Proj.get_structure_damage()) + ..() + +/obj/machinery/shipsensors/proc/toggle() + if(!use_power && (health == 0 || !in_vacuum())) + return // No turning on if broken or misplaced. + if(!use_power) //need some juice to kickstart + use_power_oneoff(idle_power_usage*5) + update_use_power(!use_power) + update_icon() + +/obj/machinery/shipsensors/process() + if(use_power) //can't run in non-vacuum + if(!in_vacuum()) + toggle() + if(heat > critical_heat) + src.visible_message("\The [src] violently spews out sparks!") + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() + + take_damage(rand(10,50)) + toggle() + heat += idle_power_usage/15000 + + if (heat > 0) + heat = max(0, heat - heat_reduction) + +/obj/machinery/shipsensors/power_change() + . = ..() + if(use_power && !powered()) + toggle() + +/obj/machinery/shipsensors/proc/set_range(nrange) + range = nrange + change_power_consumption(1500 * (range**2), USE_POWER_IDLE) //Exponential increase, also affects speed of overheating + +/obj/machinery/shipsensors/emp_act(severity) + if(!use_power) + return + take_damage(20/severity) + toggle() + +/obj/machinery/shipsensors/take_damage(value) + health = min(max(health - value, 0),max_health) + if(use_power && health == 0) + toggle() + +/obj/machinery/shipsensors/weak + heat_reduction = 0.2 + desc = "Miniaturized gravity scanner with various other sensors, used to detect irregularities in surrounding space. Can only run in vacuum to protect delicate quantum bluespace elements." \ No newline at end of file diff --git a/code/modules/overmap/ships/computers/ship.dm b/code/modules/overmap/ships/computers/ship.dm new file mode 100644 index 0000000000..4ab9d241df --- /dev/null +++ b/code/modules/overmap/ships/computers/ship.dm @@ -0,0 +1,97 @@ +/* +While these computers can be placed anywhere, they will only function if placed on either a non-space, non-shuttle turf +with an /obj/effect/overmap/visitable/ship present elsewhere on that z level, or else placed in a shuttle area with an /obj/effect/overmap/visitable/ship +somewhere on that shuttle. Subtypes of these can be then used to perform ship overmap movement functions. +*/ +/obj/machinery/computer/ship + var/obj/effect/overmap/visitable/ship/linked + var/list/viewers // Weakrefs to mobs in direct-view mode. + var/extra_view = 0 // how much the view is increased by when the mob is in overmap mode. + +// A late init operation called in SSshuttles, used to attach the thing to the right ship. +/obj/machinery/computer/ship/proc/attempt_hook_up(obj/effect/overmap/visitable/ship/sector) + if(!istype(sector)) + return + if(sector.check_ownership(src)) + linked = sector + return 1 + +/obj/machinery/computer/ship/proc/sync_linked() + var/obj/effect/overmap/visitable/ship/sector = map_sectors["[z]"] + if(!sector) + return + return attempt_hook_up_recursive(sector) + +/obj/machinery/computer/ship/proc/attempt_hook_up_recursive(obj/effect/overmap/visitable/ship/sector) + if(attempt_hook_up(sector)) + return sector + for(var/obj/effect/overmap/visitable/ship/candidate in sector) + if((. = .(candidate))) + return + +/obj/machinery/computer/ship/proc/display_reconnect_dialog(var/mob/user, var/flavor) + var/datum/browser/popup = new (user, "[src]", "[src]") + popup.set_content("
Error
Unable to connect to [flavor].
Reconnect
") + popup.open() + +// In computer_shims for now - we had to define it. +// /obj/machinery/computer/ship/interface_interact(var/mob/user) +// ui_interact(user) +// return TRUE + +/obj/machinery/computer/ship/OnTopic(var/mob/user, var/list/href_list) + if(..()) + return TOPIC_HANDLED + if(href_list["sync"]) + sync_linked() + return TOPIC_REFRESH + if(href_list["close"]) + unlook(user) + user.unset_machine() + return TOPIC_HANDLED + return TOPIC_NOACTION + +// Management of mob view displacement. look to shift view to the ship on the overmap; unlook to shift back. + +/obj/machinery/computer/ship/proc/look(var/mob/user) + if(linked) + user.reset_view(linked) + user.set_viewsize(world.view + extra_view) + GLOB.moved_event.register(user, src, /obj/machinery/computer/ship/proc/unlook) + // TODO GLOB.stat_set_event.register(user, src, /obj/machinery/computer/ship/proc/unlook) + LAZYDISTINCTADD(viewers, weakref(user)) + +/obj/machinery/computer/ship/proc/unlook(var/mob/user) + user.reset_view() + user.set_viewsize() // reset to default + GLOB.moved_event.unregister(user, src, /obj/machinery/computer/ship/proc/unlook) + // TODO GLOB.stat_set_event.unregister(user, src, /obj/machinery/computer/ship/proc/unlook) + LAZYREMOVE(viewers, weakref(user)) + +/obj/machinery/computer/ship/proc/viewing_overmap(mob/user) + return (weakref(user) in viewers) + +/obj/machinery/computer/ship/CouldNotUseTopic(mob/user) + . = ..() + unlook(user) + +/obj/machinery/computer/ship/CouldUseTopic(mob/user) + . = ..() + if(viewing_overmap(user)) + look(user) + +/obj/machinery/computer/ship/check_eye(var/mob/user) + if (!get_dist(user, src) > 1 || user.blinded || !linked ) + unlook(user) + return -1 + else + return 0 + +/obj/machinery/computer/ship/sensors/Destroy() + sensors = null + if(LAZYLEN(viewers)) + for(var/weakref/W in viewers) + var/M = W.resolve() + if(M) + unlook(M) + . = ..() \ No newline at end of file diff --git a/code/modules/overmap/ships/computers/shuttle.dm b/code/modules/overmap/ships/computers/shuttle.dm index 09bf47512d..726c339178 100644 --- a/code/modules/overmap/ships/computers/shuttle.dm +++ b/code/modules/overmap/ships/computers/shuttle.dm @@ -1,139 +1,45 @@ //Shuttle controller computer for shuttles going between sectors -/datum/shuttle/ferry/var/range = 0 //how many overmap tiles can shuttle go, for picking destinatiosn and returning. /obj/machinery/computer/shuttle_control/explore - name = "exploration shuttle console" - shuttle_tag = "Exploration" - req_access = list() - var/landing_type //area for shuttle ship-side - var/obj/effect/map/destination //current destination - var/obj/effect/map/home //current destination + name = "general shuttle control console" + ui_template = "shuttle_control_console_exploration.tmpl" -/obj/machinery/computer/shuttle_control/explore/Initialize() +/obj/machinery/computer/shuttle_control/explore/get_ui_data(var/datum/shuttle/autodock/overmap/shuttle) . = ..() - home = map_sectors["[z]"] - shuttle_tag = "[shuttle_tag]-[z]" - if(!shuttle_controller.shuttles[shuttle_tag]) - var/datum/shuttle/ferry/shuttle = new() - shuttle.warmup_time = 10 - shuttle.area_station = locate(landing_type) - shuttle.area_offsite = shuttle.area_station - shuttle_controller.shuttles[shuttle_tag] = shuttle - shuttle_controller.process_shuttles += shuttle - testing("Exploration shuttle '[shuttle_tag]' at z-level [z] successfully added.") + if(istype(shuttle)) + var/total_gas = 0 + for(var/obj/structure/fuel_port/FP in shuttle.fuel_ports) //loop through fuel ports + var/obj/item/weapon/tank/fuel_tank = locate() in FP + if(fuel_tank) + total_gas += fuel_tank.air_contents.total_moles -//Sets destination to new sector. Can be null. -/obj/machinery/computer/shuttle_control/explore/proc/update_destination(var/obj/effect/map/D) - destination = D - if(destination && shuttle_controller.shuttles[shuttle_tag]) - var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag] - shuttle.area_offsite = destination.shuttle_landing - testing("Shuttle controller [shuttle_tag] now sends shuttle to [destination]") - shuttle_controller.shuttles[shuttle_tag] = shuttle + var/fuel_span = "good" + if(total_gas < shuttle.fuel_consumption * 2) + fuel_span = "bad" -//Gets all sectors with landing zones in shuttle's range -/obj/machinery/computer/shuttle_control/explore/proc/get_possible_destinations() - var/list/res = list() - var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag] - for (var/obj/effect/map/S in orange(shuttle.range, home)) - if(S.shuttle_landing) - res += S - return res + . += list( + "destination_name" = shuttle.get_destination_name(), + "can_pick" = shuttle.moving_status == SHUTTLE_IDLE, + "fuel_usage" = shuttle.fuel_consumption * 100, + "remaining_fuel" = round(total_gas, 0.01) * 100, + "fuel_span" = fuel_span + ) -//Checks if current destination is still reachable -/obj/machinery/computer/shuttle_control/explore/proc/check_destination() - var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag] - return shuttle && destination && get_dist(home, destination) <= shuttle.range +/obj/machinery/computer/shuttle_control/explore/handle_topic_href(var/datum/shuttle/autodock/overmap/shuttle, var/list/href_list) + if(ismob(usr)) + var/mob/user = usr + shuttle.operator_skill = user.get_skill_value(/datum/skill/pilot) -/obj/machinery/computer/shuttle_control/explore/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - var/data[0] - var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag] - if (!istype(shuttle)) - return - - //If we are already there, or can't reach place anymore, reset destination - if(!shuttle.location && !check_destination()) - destination = null - - //check if shuttle can fly at all - var/can_go = !isnull(destination) - var/current_destination = destination ? destination.name : "None" - //shuttle doesn't need destination set to return home, as long as it's in range. - if(shuttle.location) - current_destination = "Return" - var/area/offsite = shuttle.area_offsite - var/obj/effect/map/cur_loc = map_sectors["[offsite.z]"] - can_go = (get_dist(home,cur_loc) <= shuttle.range) - - //disable picking locations if there are none, or shuttle is already off-site - var/list/possible_d = get_possible_destinations() - var/can_pick = !shuttle.location && possible_d.len - - var/shuttle_state - switch(shuttle.moving_status) - if(SHUTTLE_IDLE) shuttle_state = "idle" - if(SHUTTLE_WARMUP) shuttle_state = "warmup" - if(SHUTTLE_INTRANSIT) shuttle_state = "in_transit" - - var/shuttle_status - switch (shuttle.process_state) - if(IDLE_STATE) - if (shuttle.in_use) - shuttle_status = "Busy." - else if (!shuttle.location) - shuttle_status = "Standing-by at station." - else - shuttle_status = "Standing-by at offsite location." - if(WAIT_LAUNCH, FORCE_LAUNCH) - shuttle_status = "Shuttle has received command and will depart shortly." - if(WAIT_ARRIVE) - shuttle_status = "Proceeding to destination." - if(WAIT_FINISH) - shuttle_status = "Arriving at destination now." - - data = list( - "destination_name" = current_destination, - "can_pick" = can_pick, - "shuttle_status" = shuttle_status, - "shuttle_state" = shuttle_state, - "has_docking" = shuttle.docking_controller? 1 : 0, - "docking_status" = shuttle.docking_controller? shuttle.docking_controller.get_docking_status() : null, - "docking_override" = shuttle.docking_controller? shuttle.docking_controller.override_enabled : null, - "can_launch" = can_go && shuttle.can_launch(), - "can_cancel" = can_go && shuttle.can_cancel(), - "can_force" = can_go && shuttle.can_force(), - ) - - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) - - if (!ui) - ui = new(user, src, ui_key, "shuttle_control_console_exploration.tmpl", "[shuttle_tag] Shuttle Control", 470, 310) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) - -/obj/machinery/computer/shuttle_control/explore/Topic(href, href_list) - if(..()) - return 1 - - usr.set_machine(src) - src.add_fingerprint(usr) - - var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag] - if (!istype(shuttle)) + if((. = ..()) != null) return if(href_list["pick"]) - var/obj/effect/map/self = map_sectors["[z]"] - if(self) - var/list/possible_d = get_possible_destinations() - var/obj/effect/map/D - if(possible_d.len) - D = input("Choose shuttle destination", "Shuttle Destination") as null|anything in possible_d - update_destination(D) - - if(href_list["move"]) - shuttle.launch(src) - if(href_list["force"]) - shuttle.force_launch(src) - else if(href_list["cancel"]) - shuttle.cancel_launch(src) \ No newline at end of file + var/list/possible_d = shuttle.get_possible_destinations() + var/D + if(possible_d.len) + D = input("Choose shuttle destination", "Shuttle Destination") as null|anything in possible_d + else + to_chat(usr,"No valid landing sites in range.") + possible_d = shuttle.get_possible_destinations() + if(CanInteract(usr, global.default_state) && (D in possible_d)) + shuttle.set_destination(possible_d[D]) + return TOPIC_REFRESH diff --git a/code/modules/overmap/ships/engines/engine.dm b/code/modules/overmap/ships/engines/engine.dm index 6e927e6431..a5d3bc7016 100644 --- a/code/modules/overmap/ships/engines/engine.dm +++ b/code/modules/overmap/ships/engines/engine.dm @@ -3,58 +3,43 @@ var/list/ship_engines = list() /datum/ship_engine var/name = "ship engine" - var/obj/machinery/engine //actual engine object - var/zlevel = 0 + var/obj/machinery/holder //actual engine object -/datum/ship_engine/New(var/obj/machinery/holder) - engine = holder - zlevel = holder.z - for(var/obj/machinery/computer/engines/E in machines) - if (E.z == zlevel && !(src in E.engines)) - E.engines += src - break +/datum/ship_engine/New(var/obj/machinery/_holder) + ..() + holder = _holder + ship_engines += src -//Tries to fire the engine. If successfull, returns 1 +/datum/ship_engine/proc/can_burn() + return 0 + +//Tries to fire the engine. Returns thrust /datum/ship_engine/proc/burn() - if(!engine) - die() - return 1 + return 0 //Returns status string for this engine /datum/ship_engine/proc/get_status() - if(!engine) - die() return "All systems nominal" /datum/ship_engine/proc/get_thrust() - if(!engine) - die() - return 100 + return 1 //Sets thrust limiter, a number between 0 and 1 /datum/ship_engine/proc/set_thrust_limit(var/new_limit) - if(!engine) - die() return 1 /datum/ship_engine/proc/get_thrust_limit() - if(!engine) - die() return 1 /datum/ship_engine/proc/is_on() - if(!engine) - die() return 1 /datum/ship_engine/proc/toggle() - if(!engine) - die() return 1 -/datum/ship_engine/proc/die() - for(var/obj/machinery/computer/engines/E in machines) - if (E.z == zlevel) - E.engines -= src - break - qdel(src) \ No newline at end of file +/datum/ship_engine/Destroy() + ship_engines -= src + for(var/obj/effect/overmap/visitable/ship/S in SSshuttles.ships) + S.engines -= src + holder = null + . = ..() \ No newline at end of file diff --git a/code/modules/overmap/ships/engines/gas_thruster.dm b/code/modules/overmap/ships/engines/gas_thruster.dm new file mode 100644 index 0000000000..04101984c4 --- /dev/null +++ b/code/modules/overmap/ships/engines/gas_thruster.dm @@ -0,0 +1,218 @@ +//Gas nozzle engine +/datum/ship_engine/gas_thruster + name = "gas thruster" + var/obj/machinery/atmospherics/unary/engine/nozzle + +/datum/ship_engine/gas_thruster/New(var/obj/machinery/_holder) + ..() + nozzle = _holder + +/datum/ship_engine/gas_thruster/Destroy() + nozzle = null + . = ..() + +/datum/ship_engine/gas_thruster/get_status() + return nozzle.get_status() + +/datum/ship_engine/gas_thruster/get_thrust() + return nozzle.get_thrust() + +/datum/ship_engine/gas_thruster/burn() + return nozzle.burn() + +/datum/ship_engine/gas_thruster/set_thrust_limit(var/new_limit) + nozzle.thrust_limit = new_limit + +/datum/ship_engine/gas_thruster/get_thrust_limit() + return nozzle.thrust_limit + +/datum/ship_engine/gas_thruster/is_on() + if(nozzle.use_power && nozzle.operable()) + if(nozzle.next_on > world.time) + return -1 + else + return 1 + return 0 + +/datum/ship_engine/gas_thruster/toggle() + if(nozzle.use_power) + nozzle.update_use_power(USE_POWER_OFF) + else + if(nozzle.blockage) + if(nozzle.check_blockage()) + return + nozzle.update_use_power(USE_POWER_IDLE) + if(nozzle.stat & NOPOWER)//try again + nozzle.power_change() + if(nozzle.is_on())//if everything is in working order, start booting! + nozzle.next_on = world.time + nozzle.boot_time + +/datum/ship_engine/gas_thruster/can_burn() + return nozzle.is_on() && nozzle.check_fuel() + +//Actual thermal nozzle engine object + +/obj/machinery/atmospherics/unary/engine + name = "rocket nozzle" + desc = "Simple rocket nozzle, expelling gas at hypersonic velocities to propell the ship." + icon = 'icons/turf/shuttle_parts.dmi' + icon_state = "nozzle" + opacity = 1 + density = 1 + can_atmos_pass = ATMOS_PASS_NO + connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_FUEL + + // construct_state = /decl/machine_construction/default/panel_closed + // maximum_component_parts = list(/obj/item/weapon/stock_parts = 6)//don't want too many, let upgraded component shine + // uncreated_component_parts = list(/obj/item/weapon/stock_parts/power/apc/buildable = 1) + + use_power = USE_POWER_OFF + power_channel = EQUIP + idle_power_usage = 1000 + + var/datum/ship_engine/gas_thruster/controller + var/thrust_limit = 1 //Value between 1 and 0 to limit the resulting thrust + var/volume_per_burn = 15 //20 litres(with bin) + var/charge_per_burn = 3600 + var/boot_time = 35 + var/next_on + var/blockage + +/obj/machinery/atmospherics/unary/engine/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + return 0 + +/obj/machinery/atmospherics/unary/engine/Initialize() + . = ..() + controller = new(src) + update_nearby_tiles(need_rebuild=1) + + for(var/ship in SSshuttles.ships) + var/obj/effect/overmap/visitable/ship/S = ship + if(S.check_ownership(src)) + S.engines |= controller + if(dir != S.fore_dir) + set_broken(TRUE) + break + +/obj/machinery/atmospherics/unary/engine/Destroy() + QDEL_NULL(controller) + update_nearby_tiles() + . = ..() + +/obj/machinery/atmospherics/unary/engine/proc/get_status() + . = list() + .+= "Location: [get_area(src)]." + if(stat & NOPOWER) + .+= "Insufficient power to operate." + if(!check_fuel()) + .+= "Insufficient fuel for a burn." + if(stat & BROKEN) + .+= "Inoperable engine configuration." + if(blockage) + .+= "Obstruction of airflow detected." + + .+= "Propellant total mass: [round(air_contents.get_mass(),0.01)] kg." + .+= "Propellant used per burn: [round(air_contents.get_mass() * volume_per_burn * thrust_limit / air_contents.volume,0.01)] kg." + .+= "Propellant pressure: [round(air_contents.return_pressure()/1000,0.1)] MPa." + . = jointext(.,"
") + +/obj/machinery/atmospherics/unary/engine/power_change() + . = ..() + if(stat & NOPOWER) + update_use_power(USE_POWER_OFF) + +/obj/machinery/atmospherics/unary/engine/proc/is_on() + return use_power && operable() && (next_on < world.time) + +/obj/machinery/atmospherics/unary/engine/proc/check_fuel() + return air_contents.total_moles > 5 // minimum fuel usage is five moles, for EXTREMELY hot mix or super low pressure + +/obj/machinery/atmospherics/unary/engine/proc/get_thrust() + if(!is_on() || !check_fuel()) + return 0 + var/used_part = volume_per_burn * thrust_limit / air_contents.volume + . = calculate_thrust(air_contents, used_part) + return + +/obj/machinery/atmospherics/unary/engine/proc/check_blockage() + blockage = FALSE + var/exhaust_dir = reverse_direction(dir) + var/turf/A = get_step(src, exhaust_dir) + var/turf/B = A + while(isturf(A) && !(istype(A, /turf/space) || isopenspace(A))) + if((B.c_airblock(A)) & AIR_BLOCKED) + blockage = TRUE + break + B = A + A = get_step(A, exhaust_dir) + return blockage + +/obj/machinery/atmospherics/unary/engine/proc/burn() + if(!is_on()) + return 0 + if(!check_fuel() || (0 < use_power_oneoff(charge_per_burn)) || check_blockage()) + audible_message(src,"[src] coughs once and goes silent!") + update_use_power(USE_POWER_OFF) + return 0 + + var/datum/gas_mixture/removed = air_contents.remove_ratio(volume_per_burn * thrust_limit / air_contents.volume) + if(!removed) + return 0 + . = calculate_thrust(removed) + playsound(loc, 'sound/machines/thruster.ogg', 100 * thrust_limit, 0, world.view * 4, 0.1) + if(network) + network.update = 1 + + var/exhaust_dir = reverse_direction(dir) + var/turf/T = get_step(src,exhaust_dir) + if(T) + T.assume_air(removed) + new/obj/effect/engine_exhaust(T, exhaust_dir, air_contents.check_combustability() && air_contents.temperature >= PHORON_MINIMUM_BURN_TEMPERATURE) + +/obj/machinery/atmospherics/unary/engine/proc/calculate_thrust(datum/gas_mixture/propellant, used_part = 1) + return round(sqrt(propellant.get_mass() * used_part * sqrt(air_contents.return_pressure()/200)),0.1) + +/obj/machinery/atmospherics/unary/engine/RefreshParts() + ..() + //allows them to upgrade the max limit of fuel intake (which only gives diminishing returns) for increase in max thrust but massive reduction in fuel economy + var/bin_upgrade = 5 * CLAMP(total_component_rating_of_type(/obj/item/weapon/stock_parts/matter_bin), 0, 6)//5 litre per rank + volume_per_burn = bin_upgrade ? initial(volume_per_burn) + bin_upgrade : 2 //Penalty missing part: 10% fuel use, no thrust + boot_time = bin_upgrade ? initial(boot_time) - bin_upgrade : initial(boot_time) * 2 + //energy cost - thb all of this is to limit the use of back up batteries + var/energy_upgrade = CLAMP(total_component_rating_of_type(/obj/item/weapon/stock_parts/capacitor), 0.1, 6) + charge_per_burn = initial(charge_per_burn) / energy_upgrade + change_power_consumption(initial(idle_power_usage) / energy_upgrade, USE_POWER_IDLE) + +//Exhaust effect +/obj/effect/engine_exhaust + name = "engine exhaust" + icon = 'icons/effects/effects.dmi' + icon_state = "smoke" + light_color = "#ed9200" + anchored = 1 + +/obj/effect/engine_exhaust/New(var/turf/nloc, var/ndir, var/flame) + ..(nloc) + if(flame) + icon_state = "exhaust" + nloc.hotspot_expose(1000,125) + set_light(0.5, 3) + set_dir(ndir) + QDEL_IN(src, 20) + +/obj/item/weapon/circuitboard/unary_atmos/engine //why don't we move this elsewhere? + name = T_BOARD("gas thruster") + icon_state = "mcontroller" + build_path = /obj/machinery/atmospherics/unary/engine + origin_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 2) + req_components = list( + /obj/item/stack/cable_coil = 30, + /obj/item/pipe = 2, + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/capacitor = 2) + +// Not Implemented - Variant that pulls power from cables. Too complicated without bay's power components. +// /obj/machinery/atmospherics/unary/engine/terminal +// base_type = /obj/machinery/atmospherics/unary/engine +// stock_part_presets = list(/decl/stock_part_preset/terminal_setup) +// uncreated_component_parts = list(/obj/item/weapon/stock_parts/power/terminal/buildable = 1) diff --git a/code/modules/overmap/ships/engines/ion_thruster.dm b/code/modules/overmap/ships/engines/ion_thruster.dm new file mode 100644 index 0000000000..3252159391 --- /dev/null +++ b/code/modules/overmap/ships/engines/ion_thruster.dm @@ -0,0 +1,86 @@ +/datum/ship_engine/ion + name = "ion thruster" + var/obj/machinery/ion_engine/thruster + +/datum/ship_engine/ion/New(var/obj/machinery/_holder) + ..() + thruster = _holder + +/datum/ship_engine/ion/Destroy() + thruster = null + . = ..() + +/datum/ship_engine/ion/get_status() + return thruster.get_status() + +/datum/ship_engine/ion/get_thrust() + return thruster.get_thrust() + +/datum/ship_engine/ion/burn() + return thruster.burn() + +/datum/ship_engine/ion/set_thrust_limit(var/new_limit) + thruster.thrust_limit = new_limit + +/datum/ship_engine/ion/get_thrust_limit() + return thruster.thrust_limit + +/datum/ship_engine/ion/is_on() + return thruster.on && thruster.powered() + +/datum/ship_engine/ion/toggle() + thruster.on = !thruster.on + +/datum/ship_engine/ion/can_burn() + return thruster.on && thruster.powered() + +/obj/machinery/ion_engine + name = "ion propulsion device" + desc = "An advanced ion propulsion device, using energy and minutes amount of gas to generate thrust." + icon = 'icons/turf/shuttle_parts.dmi' + icon_state = "nozzle" + power_channel = ENVIRON + idle_power_usage = 100 + anchored = TRUE + // construct_state = /decl/machine_construction/default/panel_closed + var/datum/ship_engine/ion/controller + var/thrust_limit = 1 + var/on = 1 + var/burn_cost = 7500 + var/generated_thrust = 2.5 + +/obj/machinery/ion_engine/Initialize() + . = ..() + controller = new(src) + +/obj/machinery/ion_engine/Destroy() + QDEL_NULL(controller) + . = ..() + +/obj/machinery/ion_engine/proc/get_status() + . = list() + .+= "Location: [get_area(src)]." + if(!powered()) + .+= "Insufficient power to operate." + + . = jointext(.,"
") + +/obj/machinery/ion_engine/proc/burn() + if(!on && !powered()) + return 0 + use_power_oneoff(burn_cost) + . = thrust_limit * generated_thrust + +/obj/machinery/ion_engine/proc/get_thrust() + return thrust_limit * generated_thrust * on + +/obj/item/weapon/circuitboard/engine/ion + name = T_BOARD("ion propulsion device") + board_type = "machine" + icon_state = "mcontroller" + build_path = /obj/machinery/ion_engine + origin_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 2) + req_components = list( + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/capacitor = 2) \ No newline at end of file diff --git a/code/modules/overmap/ships/landable.dm b/code/modules/overmap/ships/landable.dm new file mode 100644 index 0000000000..967fdeb571 --- /dev/null +++ b/code/modules/overmap/ships/landable.dm @@ -0,0 +1,173 @@ +// These come with shuttle functionality. Need to be assigned a (unique) shuttle datum name. +// Mapping location doesn't matter, so long as on a map loaded at the same time as the shuttle areas. +// Multiz shuttles currently not supported. Non-autodock shuttles currently not supported. + +/obj/effect/overmap/visitable/ship/landable + var/shuttle // Name of associated shuttle. Must be autodock. + var/obj/effect/shuttle_landmark/ship/landmark // Record our open space landmark for easy reference. + var/multiz = 0 // Index of multi-z levels, starts at 0 + var/status = SHIP_STATUS_LANDED + icon_state = "shuttle" + moving_state = "shuttle_moving" + +/obj/effect/overmap/visitable/ship/landable/Destroy() + GLOB.shuttle_moved_event.unregister(SSshuttles.shuttles[shuttle], src) + return ..() + +/obj/effect/overmap/visitable/ship/landable/can_burn() + if(status != SHIP_STATUS_OVERMAP) + return 0 + return ..() + +/obj/effect/overmap/visitable/ship/landable/burn() + if(status != SHIP_STATUS_OVERMAP) + return 0 + return ..() + +/obj/effect/overmap/visitable/ship/landable/check_ownership(obj/object) + var/datum/shuttle/shuttle_datum = SSshuttles.shuttles[shuttle] + if(!shuttle_datum) + return + var/list/areas = shuttle_datum.find_childfree_areas() + if(get_area(object) in areas) + return 1 + +// We autobuild our z levels. +/obj/effect/overmap/visitable/ship/landable/find_z_levels() + for(var/i = 0 to multiz) + world.increment_max_z() + map_z += world.maxz + + var/turf/center_loc = locate(round(world.maxx/2), round(world.maxy/2), world.maxz) + landmark = new (center_loc, shuttle) + add_landmark(landmark, shuttle) + + var/visitor_dir = fore_dir + for(var/landmark_name in list("FORE", "PORT", "AFT", "STARBOARD")) + var/turf/visitor_turf = get_ranged_target_turf(center_loc, visitor_dir, round(min(world.maxx/4, world.maxy/4))) + var/obj/effect/shuttle_landmark/visiting_shuttle/visitor_landmark = new (visitor_turf, landmark, landmark_name) + add_landmark(visitor_landmark) + visitor_dir = turn(visitor_dir, 90) + + if(multiz) + new /obj/effect/landmark/map_data(center_loc, (multiz + 1)) + +/obj/effect/overmap/visitable/ship/landable/get_areas() + var/datum/shuttle/shuttle_datum = SSshuttles.shuttles[shuttle] + if(!shuttle_datum) + return list() + return shuttle_datum.find_childfree_areas() + +/obj/effect/overmap/visitable/ship/landable/populate_sector_objects() + ..() + var/datum/shuttle/shuttle_datum = SSshuttles.shuttles[shuttle] + if(istype(shuttle_datum,/datum/shuttle/autodock/overmap)) + var/datum/shuttle/autodock/overmap/oms = shuttle_datum + oms.myship = src + GLOB.shuttle_moved_event.register(shuttle_datum, src, .proc/on_shuttle_jump) + on_landing(landmark, shuttle_datum.current_location) // We "land" at round start to properly place ourselves on the overmap. + +/obj/effect/shuttle_landmark/ship + name = "Open Space" + landmark_tag = "ship" + flags = SLANDMARK_FLAG_AUTOSET | SLANDMARK_FLAG_ZERO_G + var/shuttle_name + var/list/visitors // landmark -> visiting shuttle stationed there + +/obj/effect/shuttle_landmark/ship/Initialize(mapload, shuttle_name) + landmark_tag += "_[shuttle_name]" + src.shuttle_name = shuttle_name + . = ..() + +/obj/effect/shuttle_landmark/ship/Destroy() + var/obj/effect/overmap/visitable/ship/landable/ship = map_sectors["[z]"] + if(istype(ship) && ship.landmark == src) + ship.landmark = null + . = ..() + +/obj/effect/shuttle_landmark/ship/cannot_depart(datum/shuttle/shuttle) + if(LAZYLEN(visitors)) + return "Grappled by other shuttle; cannot manouver." + +/obj/effect/shuttle_landmark/visiting_shuttle + flags = SLANDMARK_FLAG_AUTOSET | SLANDMARK_FLAG_ZERO_G + var/obj/effect/shuttle_landmark/ship/core_landmark + +/obj/effect/shuttle_landmark/visiting_shuttle/Initialize(mapload, obj/effect/shuttle_landmark/ship/master, _name) + core_landmark = master + name = _name + landmark_tag = master.shuttle_name + _name + GLOB.destroyed_event.register(master, src, /datum/proc/qdel_self) + . = ..() + +/obj/effect/shuttle_landmark/visiting_shuttle/Destroy() + GLOB.destroyed_event.unregister(core_landmark, src) + LAZYREMOVE(core_landmark.visitors, src) + core_landmark = null + . = ..() + +/obj/effect/shuttle_landmark/visiting_shuttle/is_valid(datum/shuttle/shuttle) + . = ..() + if(!.) + return + var/datum/shuttle/boss_shuttle = SSshuttles.shuttles[core_landmark.shuttle_name] + if(boss_shuttle.current_location != core_landmark) + return FALSE // Only available when our governing shuttle is in space. + if(shuttle == boss_shuttle) // Boss shuttle only lands on main landmark + return FALSE + +/obj/effect/shuttle_landmark/visiting_shuttle/shuttle_arrived(datum/shuttle/shuttle) + LAZYSET(core_landmark.visitors, src, shuttle) + GLOB.shuttle_moved_event.register(shuttle, src, .proc/shuttle_left) + +/obj/effect/shuttle_landmark/visiting_shuttle/proc/shuttle_left(datum/shuttle/shuttle, obj/effect/shuttle_landmark/old_landmark, obj/effect/shuttle_landmark/new_landmark) + if(old_landmark == src) + GLOB.shuttle_moved_event.unregister(shuttle, src) + LAZYREMOVE(core_landmark.visitors, src) + +/obj/effect/overmap/visitable/ship/landable/proc/on_shuttle_jump(datum/shuttle/given_shuttle, obj/effect/shuttle_landmark/from, obj/effect/shuttle_landmark/into) + if(given_shuttle != SSshuttles.shuttles[shuttle]) + return + var/datum/shuttle/autodock/auto = given_shuttle + if(into == auto.landmark_transition) + status = SHIP_STATUS_TRANSIT + on_takeoff(from, into) + return + if(into == landmark) + status = SHIP_STATUS_OVERMAP + on_takeoff(from, into) + return + status = SHIP_STATUS_LANDED + on_landing(from, into) + +/obj/effect/overmap/visitable/ship/landable/proc/on_landing(obj/effect/shuttle_landmark/from, obj/effect/shuttle_landmark/into) + var/obj/effect/overmap/visitable/target = map_sectors["[into.z]"] + var/datum/shuttle/shuttle_datum = SSshuttles.shuttles[shuttle] + if(into.landmark_tag == shuttle_datum.motherdock) // If our motherdock is a landable ship, it won't be found properly here so we need to find it manually. + for(var/obj/effect/overmap/visitable/ship/landable/landable in SSshuttles.ships) + if(landable.shuttle == shuttle_datum.mothershuttle) + target = landable + break + if(!target || target == src) + return + forceMove(target) + halt() + +/obj/effect/overmap/visitable/ship/landable/proc/on_takeoff(obj/effect/shuttle_landmark/from, obj/effect/shuttle_landmark/into) + if(!isturf(loc)) + forceMove(get_turf(loc)) + unhalt() + +/obj/effect/overmap/visitable/ship/landable/get_landed_info() + switch(status) + if(SHIP_STATUS_LANDED) + var/obj/effect/overmap/visitable/location = loc + if(istype(loc, /obj/effect/overmap/visitable/sector)) + return "Landed on \the [location.name]. Use secondary thrust to get clear before activating primary engines." + if(istype(loc, /obj/effect/overmap/visitable/ship)) + return "Docked with \the [location.name]. Use secondary thrust to get clear before activating primary engines." + return "Docked with an unknown object." + if(SHIP_STATUS_TRANSIT) + return "Maneuvering under secondary thrust." + if(SHIP_STATUS_OVERMAP) + return "In open space." \ No newline at end of file diff --git a/code/modules/overmap/ships/ship.dm b/code/modules/overmap/ships/ship.dm index 0abd450a69..4dcecc5d6e 100644 --- a/code/modules/overmap/ships/ship.dm +++ b/code/modules/overmap/ships/ship.dm @@ -1,116 +1,207 @@ -/obj/effect/map/ship +#define SHIP_MOVE_RESOLUTION 0.00001 +#define MOVING(speed) abs(speed) >= min_speed +#define SANITIZE_SPEED(speed) SIGN(speed) * CLAMP(abs(speed), 0, max_speed) +#define CHANGE_SPEED_BY(speed_var, v_diff) \ + v_diff = SANITIZE_SPEED(v_diff);\ + if(!MOVING(speed_var + v_diff)) \ + {speed_var = 0};\ + else \ + {speed_var = SANITIZE_SPEED((speed_var + v_diff)/(1 + speed_var*v_diff/(max_speed ** 2)))} +// Uses Lorentzian dynamics to avoid going too fast. + +/obj/effect/overmap/visitable/ship name = "generic ship" desc = "Space faring vessel." - icon_state = "sheet-sandstone" - var/vessel_mass = 9000 //tonnes, random number - var/default_delay = 60 - var/list/speed = list(0,0) - var/last_burn = 0 - var/list/last_movement = list(0,0) - var/fore_dir = NORTH - var/rotate = 1 //For proc rotate + icon_state = "ship" + var/moving_state = "ship_moving" - var/obj/effect/map/current_sector - var/obj/machinery/computer/helm/nav_control - var/obj/machinery/computer/engines/eng_control + var/vessel_mass = 10000 //tonnes, arbitrary number, affects acceleration provided by engines + var/vessel_size = SHIP_SIZE_LARGE //arbitrary number, affects how likely are we to evade meteors + var/max_speed = 1/(1 SECOND) //"speed of light" for the ship, in turfs/tick. + var/min_speed = 1/(2 MINUTES) // Below this, we round speed to 0 to avoid math errors. -/obj/effect/map/ship/Initialize() + var/list/speed = list(0,0) //speed in x,y direction + var/last_burn = 0 //worldtime when ship last acceleated + var/burn_delay = 1 SECOND //how often ship can do burns + var/list/last_movement = list(0,0) //worldtime when ship last moved in x,y direction + var/fore_dir = NORTH //what dir ship flies towards for purpose of moving stars effect procs + + var/list/engines = list() + var/engines_state = 0 //global on/off toggle for all engines + var/thrust_limit = 1 //global thrust limit for all engines, 0..1 + var/halted = 0 //admin halt or other stop. + var/skill_needed = SKILL_ADEPT //piloting skill needed to steer it without going in random dir + var/operator_skill + +/obj/effect/overmap/visitable/ship/Initialize() . = ..() - for(var/obj/machinery/computer/engines/E in machines) - if (E.z == map_z) - eng_control = E - break - for(var/obj/machinery/computer/helm/H in machines) - if (H.z == map_z) - nav_control = H - break + min_speed = round(min_speed, SHIP_MOVE_RESOLUTION) + max_speed = round(max_speed, SHIP_MOVE_RESOLUTION) + SSshuttles.ships += src START_PROCESSING(SSobj, src) -/obj/effect/map/ship/relaymove(mob/user, direction) - accelerate(direction) +/obj/effect/overmap/visitable/ship/Destroy() + STOP_PROCESSING(SSobj, src) + SSshuttles.ships -= src + . = ..() -/obj/effect/map/ship/proc/is_still() - return !(speed[1] || speed[2]) +/obj/effect/overmap/visitable/ship/relaymove(mob/user, direction, accel_limit) + accelerate(direction, accel_limit) + operator_skill = user.get_skill_value(/datum/skill/pilot) -/obj/effect/map/ship/proc/get_acceleration() - return eng_control.get_total_thrust()/vessel_mass +/obj/effect/overmap/visitable/ship/proc/is_still() + return !MOVING(speed[1]) && !MOVING(speed[2]) -/obj/effect/map/ship/proc/get_speed() - return round(sqrt(speed[1]*speed[1] + speed[2]*speed[2])) +/obj/effect/overmap/visitable/ship/get_scan_data(mob/user) + . = ..() + if(!is_still()) + . += "
Heading: [get_heading_degrees()], speed [get_speed() * 1000]" -/obj/effect/map/ship/proc/get_heading() +//Projected acceleration based on information from engines +/obj/effect/overmap/visitable/ship/proc/get_acceleration() + return round(get_total_thrust()/get_vessel_mass(), SHIP_MOVE_RESOLUTION) + +//Does actual burn and returns the resulting acceleration +/obj/effect/overmap/visitable/ship/proc/get_burn_acceleration() + return round(burn() / get_vessel_mass(), SHIP_MOVE_RESOLUTION) + +/obj/effect/overmap/visitable/ship/proc/get_vessel_mass() + . = vessel_mass + for(var/obj/effect/overmap/visitable/ship/ship in src) + . += ship.get_vessel_mass() + +/obj/effect/overmap/visitable/ship/proc/get_speed() + return round(sqrt(speed[1] ** 2 + speed[2] ** 2), SHIP_MOVE_RESOLUTION) + +// Get heading in BYOND dir bits +/obj/effect/overmap/visitable/ship/proc/get_heading() var/res = 0 - if(speed[1]) + if(MOVING(speed[1])) if(speed[1] > 0) res |= EAST else res |= WEST - if(speed[2]) + if(MOVING(speed[2])) if(speed[2] > 0) res |= NORTH else res |= SOUTH return res -/obj/effect/map/ship/proc/adjust_speed(n_x, n_y) - speed[1] = CLAMP(speed[1] + n_x, -default_delay, default_delay) - speed[2] = CLAMP(speed[2] + n_y, -default_delay, default_delay) - if(is_still()) - toggle_move_stars(map_z) - else - toggle_move_stars(map_z, fore_dir) +// Get heading in degrees (like a compass heading) +/obj/effect/overmap/visitable/ship/proc/get_heading_degrees() + return (ATAN2(speed[2], speed[1]) + 360) % 360 // Yes ATAN2(y, x) is correct to get clockwise degrees -/obj/effect/map/ship/proc/can_burn() - if (!eng_control) - return 0 - if (world.time < last_burn + 10) - return 0 - if (!eng_control.burn()) - return 0 - return 1 +/obj/effect/overmap/visitable/ship/proc/adjust_speed(n_x, n_y) + CHANGE_SPEED_BY(speed[1], n_x) + CHANGE_SPEED_BY(speed[2], n_y) + for(var/zz in map_z) + if(is_still()) + toggle_move_stars(zz) + else + toggle_move_stars(zz, fore_dir) + update_icon() -/obj/effect/map/ship/proc/get_brake_path() +/obj/effect/overmap/visitable/ship/proc/get_brake_path() if(!get_acceleration()) return INFINITY - return get_speed()/get_acceleration() + if(is_still()) + return 0 + if(!burn_delay) + return 0 + if(!get_speed()) + return 0 + var/num_burns = get_speed()/get_acceleration() + 2 //some padding in case acceleration drops form fuel usage + var/burns_per_grid = 1/ (burn_delay * get_speed()) + return round(num_burns/burns_per_grid) -#define SIGN(X) (X == 0 ? 0 : (X > 0 ? 1 : -1)) -/obj/effect/map/ship/proc/decelerate() - if(!is_still() && can_burn()) +/obj/effect/overmap/visitable/ship/proc/decelerate() + if(((speed[1]) || (speed[2])) && can_burn()) if (speed[1]) - adjust_speed(-SIGN(speed[1]) * min(get_acceleration(),abs(speed[1])), 0) + adjust_speed(-SIGN(speed[1]) * min(get_burn_acceleration(),abs(speed[1])), 0) if (speed[2]) - adjust_speed(0, -SIGN(speed[2]) * min(get_acceleration(),abs(speed[2]))) + adjust_speed(0, -SIGN(speed[2]) * min(get_burn_acceleration(),abs(speed[2]))) last_burn = world.time -/obj/effect/map/ship/proc/accelerate(direction) +/obj/effect/overmap/visitable/ship/proc/accelerate(direction, accel_limit) if(can_burn()) last_burn = world.time - + var/acceleration = min(get_burn_acceleration(), accel_limit) if(direction & EAST) - adjust_speed(get_acceleration(), 0) + adjust_speed(acceleration, 0) if(direction & WEST) - adjust_speed(-get_acceleration(), 0) + adjust_speed(-acceleration, 0) if(direction & NORTH) - adjust_speed(0, get_acceleration()) + adjust_speed(0, acceleration) if(direction & SOUTH) - adjust_speed(0, -get_acceleration()) + adjust_speed(0, -acceleration) - -/obj/effect/map/ship/proc/rotate(var/direction) - var/matrix/M = matrix() - M.Turn(dir2angle(direction)) - src.transform = M //Rotate ship - -/obj/effect/map/ship/process() - if(!is_still()) +/obj/effect/overmap/visitable/ship/process() + if(!halted && !is_still()) var/list/deltas = list(0,0) for(var/i=1, i<=2, i++) - if(speed[i] && world.time > last_movement[i] + default_delay - abs(speed[i])) - deltas[i] = speed[i] > 0 ? 1 : -1 + if(MOVING(speed[i]) && world.time > last_movement[i] + 1/abs(speed[i])) + deltas[i] = SIGN(speed[i]) last_movement[i] = world.time var/turf/newloc = locate(x + deltas[1], y + deltas[2], z) if(newloc) Move(newloc) - if(rotate) - rotate(get_heading()) + update_icon() + +/obj/effect/overmap/visitable/ship/update_icon() + if(!is_still()) + icon_state = moving_state + dir = get_heading() + else + icon_state = initial(icon_state) + ..() + +/obj/effect/overmap/visitable/ship/proc/burn() + for(var/datum/ship_engine/E in engines) + . += E.burn() + +/obj/effect/overmap/visitable/ship/proc/get_total_thrust() + for(var/datum/ship_engine/E in engines) + . += E.get_thrust() + +/obj/effect/overmap/visitable/ship/proc/can_burn() + if(halted) + return 0 + if (world.time < last_burn + burn_delay) + return 0 + for(var/datum/ship_engine/E in engines) + . |= E.can_burn() + +//deciseconds to next step +/obj/effect/overmap/visitable/ship/proc/ETA() + . = INFINITY + for(var/i=1, i<=2, i++) + if(MOVING(speed[i])) + . = min(last_movement[i] - world.time + 1/abs(speed[i]), .) + . = max(.,0) + +/obj/effect/overmap/visitable/ship/proc/halt() + adjust_speed(-speed[1], -speed[2]) + halted = 1 + +/obj/effect/overmap/visitable/ship/proc/unhalt() + if(!SSshuttles.overmap_halted) + halted = 0 + +/obj/effect/overmap/visitable/ship/proc/get_helm_skill()//delete this mover operator skill to overmap obj + return operator_skill + +/obj/effect/overmap/visitable/ship/populate_sector_objects() + ..() + for(var/obj/machinery/computer/ship/S in global.machines) + S.attempt_hook_up(src) + for(var/datum/ship_engine/E in ship_engines) + if(check_ownership(E.holder)) + engines |= E + +/obj/effect/overmap/visitable/ship/proc/get_landed_info() + return "This ship cannot land." + +#undef MOVING +#undef SANITIZE_SPEED +#undef CHANGE_SPEED_BY \ No newline at end of file diff --git a/code/modules/overmap/spacetravel.dm b/code/modules/overmap/spacetravel.dm index 22de00d612..adb7e80269 100644 --- a/code/modules/overmap/spacetravel.dm +++ b/code/modules/overmap/spacetravel.dm @@ -96,10 +96,10 @@ proc/overmap_spacetravel(var/turf/space/T, var/atom/movable/A) break if(!TM) TM = get_deepspace(M.x,M.y) - nz = pick(TM.map_z) + nz = pick(TM.get_space_zlevels()) var/turf/dest = locate(nx,ny,nz) - if(dest) + if(istype(dest)) A.forceMove(dest) if(ismob(A)) var/mob/D = A @@ -110,5 +110,5 @@ proc/overmap_spacetravel(var/turf/space/T, var/atom/movable/A) var/obj/effect/overmap/visitable/sector/temporary/source = M if (source.can_die()) testing("Caching [M] for future use") - source.forceMove(null) + source.loc = null cached_space += source diff --git a/code/modules/overmap/turfs.dm b/code/modules/overmap/turfs.dm new file mode 100644 index 0000000000..3508203a6e --- /dev/null +++ b/code/modules/overmap/turfs.dm @@ -0,0 +1,102 @@ +//Dimension of overmap (squares 4 lyfe) +var/global/list/map_sectors = list() + +/area/overmap/ + name = "System Map" + icon_state = "start" + requires_power = 0 + base_turf = /turf/unsimulated/map + +/turf/unsimulated/map + icon = 'icons/turf/space.dmi' + icon_state = "map" + initialized = FALSE // TODO - Fix unsimulated turf initialization so this override is not necessary! + +/turf/unsimulated/map/edge + opacity = 1 + density = 1 + var/map_is_to_my + var/turf/unsimulated/map/edge/wrap_buddy + +/turf/unsimulated/map/edge/Initialize() + . = ..() + //This could be done by using the using_map.overmap_size much faster, HOWEVER, doing it programatically to 'find' + // the edges this way allows for 'sub overmaps' elsewhere and whatnot. + for(var/side in alldirs) //The order of this list is relevant: It should definitely break on finding a cardinal FIRST. + var/turf/T = get_step(src, side) + if(T?.type == /turf/unsimulated/map) //Not a wall, not something else, EXACTLY a flat map turf. + map_is_to_my = side + break + + if(map_is_to_my) + var/turf/T = get_step(src, map_is_to_my) //Should be a normal map turf + while(istype(T, /turf/unsimulated/map)) + T = get_step(T, map_is_to_my) //Could be a wall if the map is only 1 turf big + if(istype(T, /turf/unsimulated/map/edge)) + wrap_buddy = T + break + +/turf/unsimulated/map/edge/Destroy() + wrap_buddy = null + return ..() + +/turf/unsimulated/map/edge/Bumped(var/atom/movable/AM) + if(wrap_buddy?.map_is_to_my) + AM.forceMove(get_step(wrap_buddy, wrap_buddy.map_is_to_my)) + else + . = ..() + +/turf/unsimulated/map/Initialize() + . = ..() + name = "[x]-[y]" + var/list/numbers = list() + + if(x == 1 || x == global.using_map.overmap_size) + numbers += list("[round(y/10)]","[round(y%10)]") + if(y == 1 || y == global.using_map.overmap_size) + numbers += "-" + if(y == 1 || y == global.using_map.overmap_size) + numbers += list("[round(x/10)]","[round(x%10)]") + + for(var/i = 1 to numbers.len) + var/image/I = image('icons/effects/numbers.dmi',numbers[i]) + I.pixel_x = 5*i - 2 + I.pixel_y = world.icon_size/2 - 3 + if(y == 1) + I.pixel_y = 3 + I.pixel_x = 5*i + 4 + if(y == global.using_map.overmap_size) + I.pixel_y = world.icon_size - 9 + I.pixel_x = 5*i + 4 + if(x == 1) + I.pixel_x = 5*i - 2 + if(x == global.using_map.overmap_size) + I.pixel_x = 5*i + 2 + add_overlay(I) + +/turf/unsimulated/map/Entered(var/atom/movable/O, var/atom/oldloc) + ..() + if(istype(O, /obj/effect/overmap/visitable/ship)) + GLOB.overmap_event_handler.on_turf_entered(src, O, oldloc) + +/turf/unsimulated/map/Exited(var/atom/movable/O, var/atom/newloc) + ..() + if(istype(O, /obj/effect/overmap/visitable/ship)) + GLOB.overmap_event_handler.on_turf_exited(src, O, newloc) + +//list used to track which zlevels are being 'moved' by the proc below +var/list/moving_levels = list() +//Proc to 'move' stars in spess +//yes it looks ugly, but it should only fire when state actually change. +//null direction stops movement +proc/toggle_move_stars(zlevel, direction) + if(!zlevel) + return + + if (moving_levels["[zlevel]"] != direction) + moving_levels["[zlevel]"] = direction + + var/list/spaceturfs = block(locate(1, 1, zlevel), locate(world.maxx, world.maxy, zlevel)) + for(var/turf/space/T in spaceturfs) + T.toggle_transit(direction) + CHECK_TICK diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 1288f29aee..3c18577db3 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -12,7 +12,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins insert_anim = "faxsend" req_one_access = list(access_lawyer, access_heads, access_armory, access_qm) - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 30 active_power_usage = 200 circuit = /obj/item/weapon/circuitboard/fax diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 65b189cd98..190616887e 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -645,4 +645,4 @@ /obj/item/weapon/paper/manifest name = "supply manifest" - var/is_copy = 1 \ No newline at end of file + var/is_copy = 1 diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index d626e6f04b..4c927b376e 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -9,7 +9,7 @@ var/shred_anim = "shredder-shredding" density = 1 anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 10 active_power_usage = 200 power_channel = EQUIP diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index d5e04d97a4..eab9984d0f 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -6,7 +6,7 @@ var/insert_anim = "bigscanner1" anchored = 1 density = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 30 active_power_usage = 200 power_channel = EQUIP diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 9e2cb6bce8..918786302b 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -44,6 +44,7 @@ /obj/item/weapon/stamp/denied name = "\improper DENIED rubber stamp" icon_state = "stamp-deny" + attack_verb = list("DENIED") /obj/item/weapon/stamp/clown name = "clown's rubber stamp" @@ -91,4 +92,4 @@ if(chosen_stamp) name = chosen_stamp.name - icon_state = chosen_stamp.icon_state \ No newline at end of file + icon_state = chosen_stamp.icon_state diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index 260730391c..46f05bfd80 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -5,7 +5,7 @@ icon_state = "control" anchored = 1 density = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 100 active_power_usage = 1000 @@ -211,10 +211,10 @@ /obj/machinery/power/am_control_unit/proc/toggle_power() active = !active if(active) - use_power = 2 + update_use_power(USE_POWER_ACTIVE) visible_message("The [src.name] starts up.") else - use_power = 1 + update_use_power(USE_POWER_IDLE) visible_message("The [src.name] shuts down.") update_icon() return diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index a3549b7a2f..2b7b881b09 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -16,7 +16,7 @@ proc/cardinalrange(var/center) anchored = 1 density = 1 dir = 1 - use_power = 0//Living things generally dont use power + use_power = USE_POWER_OFF //Living things generally dont use power idle_power_usage = 0 active_power_usage = 0 diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index a0b53a57e0..149a8a2b4f 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -67,7 +67,7 @@ plane = TURF_PLANE layer = ABOVE_TURF_LAYER anchored = 1 - use_power = 0 + use_power = USE_POWER_OFF clicksound = "switch" req_access = list(access_engine_equip) var/area/area @@ -105,6 +105,7 @@ var/beenhit = 0 // used for counting how many times it has been hit, used for Aliens at the moment var/longtermpower = 10 var/datum/wires/apc/wires = null + var/emergency_lights = FALSE var/update_state = -1 var/update_overlay = -1 var/is_critical = 0 @@ -795,6 +796,7 @@ "gridCheck" = grid_check, "coverLocked" = coverlocked, "siliconUser" = issilicon(user) || isobserver(user), //I add observer here so admins can have more control, even if it makes 'siliconUser' seem inaccurate. + "emergencyLights" = !emergency_lights, "powerChannels" = list( list( @@ -835,7 +837,7 @@ if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm - ui = new(user, src, ui_key, "apc.tmpl", "[area.name] - APC", 520, data["siliconUser"] ? 465 : 440) + ui = new(user, src, ui_key, "apc.tmpl", "[area.name] - APC", 520, data["siliconUser"] ? 490 : 465) // when the ui is first opened this is the data it will use ui.set_initial_data(data) // open the new ui window @@ -932,6 +934,14 @@ update_icon() update() + else if (href_list["emergency_lighting"]) + emergency_lights = !emergency_lights + for(var/obj/machinery/light/L in area) + if(!initial(L.no_emergency)) //If there was an override set on creation, keep that override + L.no_emergency = emergency_lights + INVOKE_ASYNC(L, /obj/machinery/light/.proc/update, FALSE) + CHECK_TICK + else if (href_list["breaker"]) toggle_breaker() diff --git a/code/modules/power/cells/power_cells.dm b/code/modules/power/cells/power_cells.dm index 3afb0d5450..3638c625f1 100644 --- a/code/modules/power/cells/power_cells.dm +++ b/code/modules/power/cells/power_cells.dm @@ -132,3 +132,16 @@ overlays.Cut() target.nutrition += amount user.custom_emote(message = "connects \the [src] to [user == target ? "their" : "[target]'s"] charging port, expending it.") + +/obj/item/weapon/cell/emergency_light + name = "miniature power cell" + desc = "A tiny power cell with a very low power capacity. Used in light fixtures to power them in the event of an outage." + maxcharge = 120 //Emergency lights use 0.2 W per tick, meaning ~10 minutes of emergency power from a cell + matter = list("glass" = 20) + w_class = ITEMSIZE_TINY + +/obj/item/weapon/cell/emergency_light/Initialize() + . = ..() + var/area/A = get_area(src) + if(!A.lightswitch || !A.light_power) + charge = 0 //For naturally depowered areas, we start with no power \ No newline at end of file diff --git a/code/modules/power/fusion/core/_core.dm b/code/modules/power/fusion/core/_core.dm index 99b0346e62..9cc907e052 100644 --- a/code/modules/power/fusion/core/_core.dm +++ b/code/modules/power/fusion/core/_core.dm @@ -13,7 +13,7 @@ var/list/fusion_cores = list() icon = 'icons/obj/machines/power/fusion.dmi' icon_state = "core0" density = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 50 active_power_usage = 500 //multiplied by field strength anchored = 0 @@ -70,7 +70,7 @@ var/list/fusion_cores = list() owned_field = new(loc, src) owned_field.ChangeFieldStrength(field_strength) icon_state = "core1" - use_power = 2 + update_use_power(USE_POWER_ACTIVE) . = 1 /obj/machinery/power/fusion_core/proc/Shutdown(var/force_rupture) @@ -82,7 +82,7 @@ var/list/fusion_cores = list() owned_field.RadiateAll() qdel(owned_field) owned_field = null - use_power = 1 + update_use_power(USE_POWER_IDLE) /obj/machinery/power/fusion_core/proc/AddParticles(var/name, var/quantity = 1) if(owned_field) diff --git a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm index 80a512b91b..0ffab7db07 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm @@ -7,7 +7,7 @@ var/list/fuel_injectors = list() density = 1 anchored = 0 req_access = list(access_engine) - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 10 active_power_usage = 500 @@ -103,13 +103,13 @@ var/list/fuel_injectors = list() if(!injecting && cur_assembly) icon_state = "injector1" injecting = 1 - use_power = 1 + update_use_power(USE_POWER_IDLE) /obj/machinery/fusion_fuel_injector/proc/StopInjecting() if(injecting) injecting = 0 icon_state = "injector0" - use_power = 0 + update_use_power(USE_POWER_OFF) /obj/machinery/fusion_fuel_injector/proc/Inject() if(!injecting) diff --git a/code/modules/power/fusion/gyrotron/gyrotron.dm b/code/modules/power/fusion/gyrotron/gyrotron.dm index 539e9cbda6..bdbdf9a3df 100644 --- a/code/modules/power/fusion/gyrotron/gyrotron.dm +++ b/code/modules/power/fusion/gyrotron/gyrotron.dm @@ -6,7 +6,7 @@ var/list/gyrotrons = list() desc = "It is a heavy duty industrial gyrotron suited for powering fusion reactors." icon_state = "emitter-off" req_access = list(access_engine) - use_power = 1 + use_power = USE_POWER_IDLE active_power_usage = 50000 circuit = /obj/item/weapon/circuitboard/gyrotron diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 2eadfc520a..fd52cd461d 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -1,3 +1,5 @@ +GLOBAL_LIST_EMPTY(all_turbines) + /obj/machinery/power/generator name = "thermoelectric generator" desc = "It's a high efficiency thermoelectric generator." @@ -5,7 +7,7 @@ density = 1 anchored = 0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 100 //Watts, I hope. Just enough to do the computer and display things. var/max_power = 500000 @@ -27,12 +29,16 @@ /obj/machinery/power/generator/Initialize() soundloop = new(list(src), FALSE) desc = initial(desc) + " Rated for [round(max_power/1000)] kW." - spawn(1) - reconnect() - return ..() + GLOB.all_turbines += src + ..() //Not returned, because... + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/power/generator/LateInitialize() + reconnect() /obj/machinery/power/generator/Destroy() QDEL_NULL(soundloop) + GLOB.all_turbines -= src return ..() //generators connect in dir and reverse_dir(dir) directions @@ -156,7 +162,7 @@ user.visible_message("[user.name] [anchored ? "secures" : "unsecures"] the bolts holding [src.name] to the floor.", \ "You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor.", \ "You hear a ratchet.") - use_power = anchored + update_use_power(anchored ? USE_POWER_IDLE : USE_POWER_ACTIVE) if(anchored) // Powernet connection stuff. connect_to_network() else diff --git a/code/modules/power/generator_type2.dm b/code/modules/power/generator_type2.dm index cc1e855a91..a52675b706 100644 --- a/code/modules/power/generator_type2.dm +++ b/code/modules/power/generator_type2.dm @@ -4,7 +4,7 @@ icon_state = "teg" anchored = 1 density = 1 - use_power = 0 + use_power = USE_POWER_OFF var/obj/machinery/atmospherics/unary/generator_input/input1 var/obj/machinery/atmospherics/unary/generator_input/input2 @@ -13,15 +13,13 @@ var/lastgenlev = -1 -/obj/machinery/power/generator_type2/New() - ..() - spawn(5) - input1 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,turn(dir, 90)) - input2 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,turn(dir, -90)) - if(!input1 || !input2) - stat |= BROKEN - updateicon() - +/obj/machinery/power/generator_type2/Initialize() + . = ..() + input1 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,turn(dir, 90)) + input2 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,turn(dir, -90)) + if(!input1 || !input2) + stat |= BROKEN + updateicon() /obj/machinery/power/generator_type2/proc/updateicon() diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index ad02676e9b..d71da42e9e 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -16,7 +16,7 @@ icon_state = "TheSingGen" anchored = 1 density = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 200 active_power_usage = 1000 var/on = 1 @@ -24,27 +24,17 @@ var/effectiverange = 25 // Borrows code from cloning computer -/obj/machinery/computer/gravity_control_computer/New() - ..() - spawn(5) - updatemodules() - return - return - -/obj/machinery/gravity_generator/New() - ..() - spawn(5) - locatelocalareas() - return - return - - +/obj/machinery/computer/gravity_control_computer/Initialize() + . = ..() + updatemodules() +/obj/machinery/gravity_generator/Initialize() + . = ..() + locatelocalareas() + /obj/machinery/computer/gravity_control_computer/proc/updatemodules() src.gravity_generator = findgenerator() - - /obj/machinery/gravity_generator/proc/locatelocalareas() for(var/area/A in range(src,effectiverange)) if(A.name == "Space") diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index ab91a82510..2e9072bbd5 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -10,6 +10,7 @@ #define LIGHT_BURNED 3 #define LIGHT_BULB_TEMPERATURE 400 //K - used value for a 60W bulb #define LIGHTING_POWER_FACTOR 5 //5W per luminosity * range +#define LIGHT_EMERGENCY_POWER_USE 0.2 //How much power emergency lights will consume per tick var/global/list/light_type_cache = list() /proc/get_light_type_instance(var/light_type) @@ -29,6 +30,10 @@ var/global/list/light_type_cache = list() var/stage = 1 var/fixture_type = /obj/machinery/light var/sheets_refunded = 2 + var/obj/machinery/light/newlight = null + var/obj/item/weapon/cell/cell = null + + var/cell_connectors = TRUE /obj/machinery/light_construct/New(var/atom/newloc, var/newdir, var/building = 0, var/datum/frame/frame_types/frame_type, var/obj/machinery/light/fixture = null) ..(newloc) @@ -61,9 +66,44 @@ var/global/list/light_type_cache = list() to_chat(user, "It's wired.") if(3) to_chat(user, "The casing is closed.") + if(cell_connectors) + if(cell) + to_chat(user, "You see [cell] inside the casing.") + else + to_chat(user, "The casing has no power cell for backup power.") + else + to_chat(user, "This casing doesn't support power cells for backup power.") + +/obj/machinery/light_construct/attack_hand(mob/user) + . = ..() + if(.) + return . // obj/machinery/attack_hand returns 1 if user can't use the machine + if(cell) + user.visible_message("[user] removes [cell] from [src]!","You remove [cell].") + user.put_in_hands(cell) + cell.update_icon() + cell = null /obj/machinery/light_construct/attackby(obj/item/weapon/W as obj, mob/user as mob) src.add_fingerprint(user) + if(istype(W, /obj/item/weapon/cell/emergency_light)) + if(!cell_connectors) + to_chat(user, "This [name] can't support a power cell!") + return + if(!user.unEquip(W)) + to_chat(user, "[W] is stuck to your hand!") + return + if(cell) + to_chat(user, "There is a power cell already installed!") + else if(user.drop_from_inventory(W)) + user.visible_message("[user] hooks up [W] to [src].", \ + "You add [W] to [src].") + playsound(src, 'sound/machines/click.ogg', 50, TRUE) + W.forceMove(src) + cell = W + add_fingerprint(user) + return + if (W.is_wrench()) if (src.stage == 1) playsound(src, W.usesound, 75, 1) @@ -114,6 +154,10 @@ var/global/list/light_type_cache = list() var/obj/machinery/light/newlight = new fixture_type(src.loc, src) newlight.set_dir(src.dir) src.transfer_fingerprints_to(newlight) + if(cell) + newlight.cell = cell + cell.forceMove(newlight) + cell = null qdel(src) return ..() @@ -168,7 +212,7 @@ var/global/list/light_type_cache = list() anchored = 1 plane = MOB_PLANE layer = ABOVE_MOB_LAYER - use_power = 2 + use_power = USE_POWER_ACTIVE idle_power_usage = 2 active_power_usage = 10 // Previously 20. power_channel = LIGHT //Lights are calc'd via area so they dont need to be in the machine list @@ -187,6 +231,16 @@ var/global/list/light_type_cache = list() var/auto_flicker = FALSE // If true, will constantly flicker, so long as someone is around to see it (otherwise its a waste of CPU). + var/obj/item/weapon/cell/emergency_light/cell + var/start_with_cell = TRUE // if true, this fixture generates a very weak cell at roundstart + + var/emergency_mode = FALSE // if true, the light is in emergency mode + var/no_emergency = FALSE // if true, this light cannot ever have an emergency mode + var/bulb_emergency_brightness_mul = 0.25 // multiplier for this light's base brightness in emergency power mode + var/bulb_emergency_colour = "#FF3232" // determines the colour of the light while it's in emergency mode + var/bulb_emergency_pow_mul = 0.75 // the multiplier for determining the light's power in emergency mode + var/bulb_emergency_pow_min = 0.5 // the minimum value for the light's power in emergency mode + /obj/machinery/light/flicker auto_flicker = TRUE @@ -202,6 +256,12 @@ var/global/list/light_type_cache = list() /obj/machinery/light/small/flicker auto_flicker = TRUE +/obj/machinery/light/poi + start_with_cell = FALSE + +/obj/machinery/light/small/poi + start_with_cell = FALSE + /obj/machinery/light/flamp icon_state = "flamp1" base_state = "flamp" @@ -214,10 +274,14 @@ var/global/list/light_type_cache = list() /obj/machinery/light/flamp/New(atom/newloc, obj/machinery/light_construct/construct = null) ..(newloc, construct) - if(construct) + start_with_cell = FALSE lamp_shade = 0 update_icon() + else + if(start_with_cell && !no_emergency) + cell = new/obj/item/weapon/cell/emergency_light(src) + /obj/machinery/light/flamp/flicker auto_flicker = TRUE @@ -242,11 +306,14 @@ var/global/list/light_type_cache = list() ..(newloc) if(construct) + start_with_cell = FALSE status = LIGHT_EMPTY construct_type = construct.type construct.transfer_fingerprints_to(src) set_dir(construct.dir) else + if(start_with_cell && !no_emergency) + cell = new/obj/item/weapon/cell/emergency_light(src) var/obj/item/weapon/light/L = get_light_type_instance(light_type) update_from_bulb(L) if(prob(L.broken_chance)) @@ -260,6 +327,7 @@ var/global/list/light_type_cache = list() if(A) on = 0 // A.update_lights() + QDEL_NULL(cell) return ..() /obj/machinery/light/update_icon() @@ -320,10 +388,14 @@ var/global/list/light_type_cache = list() on = 0 set_light(0) else - use_power = 2 + update_use_power(USE_POWER_ACTIVE) set_light(brightness_range, brightness_power, brightness_color) - else + else if(has_emergency_power(LIGHT_EMERGENCY_POWER_USE) && !turned_off()) use_power = 1 + emergency_mode = TRUE + START_PROCESSING(SSobj, src) + else + update_use_power(USE_POWER_IDLE) set_light(0) active_power_usage = ((light_range * light_power) * LIGHTING_POWER_FACTOR) @@ -361,6 +433,9 @@ var/global/list/light_type_cache = list() on = (s && status == LIGHT_OK) update() +/obj/machinery/light/get_cell() + return cell + // examine verb /obj/machinery/light/examine(mob/user) var/fitting = get_fitting_name() @@ -373,6 +448,8 @@ var/global/list/light_type_cache = list() to_chat(user, "[desc] The [fitting] is burnt out.") if(LIGHT_BROKEN) to_chat(user, "[desc] The [fitting] has been smashed.") + if(cell) + to_chat(user, "Its backup power charge meter reads [round((cell.charge / cell.maxcharge) * 100, 0.1)]%.") /obj/machinery/light/proc/get_fitting_name() var/obj/item/weapon/light/L = light_type @@ -498,6 +575,12 @@ var/global/list/light_type_cache = list() ..() +// returns if the light has power /but/ is manually turned off +// if a light is turned off, it won't activate emergency power +/obj/machinery/light/proc/turned_off() + var/area/A = get_area(src) + return !A.lightswitch && A.power_light || flickering + // returns whether this light has power // true if area has power and lightswitch is on /obj/machinery/light/proc/has_power() @@ -511,6 +594,28 @@ var/global/list/light_type_cache = list() else return A && A.lightswitch && (!A.requires_power || A.power_light) +// returns whether this light has emergency power +// can also return if it has access to a certain amount of that power +/obj/machinery/light/proc/has_emergency_power(pwr) + if(no_emergency || !cell) + return FALSE + if(pwr ? cell.charge >= pwr : cell.charge) + return status == LIGHT_OK + +// attempts to use power from the installed emergency cell, returns true if it does and false if it doesn't +/obj/machinery/light/proc/use_emergency_power(pwr = LIGHT_EMERGENCY_POWER_USE) + if(turned_off()) + return FALSE + if(!has_emergency_power(pwr)) + return FALSE + if(cell.charge > 300) //it's meant to handle 120 W, ya doofus + visible_message("[src] short-circuits from too powerful of a power cell!") + status = LIGHT_BURNED + return FALSE + cell.use(pwr) + set_light(brightness_range * bulb_emergency_brightness_mul, max(bulb_emergency_pow_min, bulb_emergency_pow_mul * (cell.charge / cell.maxcharge)), bulb_emergency_colour) + return TRUE + /obj/machinery/light/proc/flicker(var/amount = rand(10, 20)) if(flickering) return flickering = 1 @@ -520,17 +625,24 @@ var/global/list/light_type_cache = list() if(status != LIGHT_OK) break on = !on update(0) + if(!on) // Only play when the light turns off. + playsound(src, 'sound/effects/light_flicker.ogg', 50, 1) sleep(rand(5, 15)) on = (status == LIGHT_OK) update(0) flickering = 0 -// ai attack - make lights flicker, because why not - +// ai attack - turn on/off emergency lighting for a specific fixture /obj/machinery/light/attack_ai(mob/user) - src.flicker(1) + no_emergency = !no_emergency + to_chat(user, "Emergency lights for this fixture have been [no_emergency ? "disabled" : "enabled"].") + update(FALSE) return +// ai alt click - Make light flicker. Very important for atmosphere. +/obj/machinery/light/AIAltClick(mob/user) + flicker(1) + /obj/machinery/light/flamp/attack_ai(mob/user) attack_hand() return @@ -653,6 +765,17 @@ var/global/list/light_type_cache = list() // use power /obj/machinery/light/process() + if(!cell) + return PROCESS_KILL + if(has_power()) + emergency_mode = FALSE + update(FALSE) + if(cell.charge == cell.maxcharge) + return PROCESS_KILL + cell.charge = min(cell.maxcharge, cell.charge + LIGHT_EMERGENCY_POWER_USE*2) //Recharge emergency power automatically while not using it + if(emergency_mode && !use_emergency_power(LIGHT_EMERGENCY_POWER_USE)) + update(FALSE) //Disables emergency mode and sets the color to normal + if(auto_flicker && !flickering) if(check_for_player_proximity(src, radius = 12, ignore_ghosts = FALSE, ignore_afk = TRUE)) seton(TRUE) // Lights must be on to flicker. diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 2443f3ea27..4515b6125c 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -6,7 +6,7 @@ icon_state = "portgen0" density = 1 anchored = 0 - use_power = 0 + use_power = USE_POWER_OFF var/active = 0 var/power_gen = 5000 diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 4fce8ba158..a88d0dafdc 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -11,7 +11,7 @@ icon = 'icons/obj/power.dmi' anchored = 1.0 var/datum/powernet/powernet = null - use_power = 0 + use_power = USE_POWER_OFF idle_power_usage = 0 active_power_usage = 0 diff --git a/code/modules/power/sensors/sensor_monitoring.dm b/code/modules/power/sensors/sensor_monitoring.dm index 21aecc59ea..43d6b34589 100644 --- a/code/modules/power/sensors/sensor_monitoring.dm +++ b/code/modules/power/sensors/sensor_monitoring.dm @@ -7,7 +7,7 @@ name = "Power Monitoring Console" desc = "Computer designed to remotely monitor power levels around the station" icon_keyboard = "power_key" - icon_screen = "power:0" + icon_screen = "power_monitor" light_color = "#ffcc33" //computer stuff @@ -15,7 +15,7 @@ anchored = 1.0 circuit = /obj/item/weapon/circuitboard/powermonitor var/alerting = 0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 300 active_power_usage = 300 var/datum/nano_module/power_monitor/power_monitor @@ -31,9 +31,9 @@ /obj/machinery/computer/power_monitor/update_icon() if(!(stat & (NOPOWER|BROKEN))) if(alerting) - icon_screen = "power:1" + icon_screen = "[initial(icon_screen)]" else - icon_screen = "power:0" + icon_screen = "[initial(icon_screen)]_warn" ..() // On creation automatically connects to active sensors. This is delayed to ensure sensors already exist. diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index d8712a0e4c..6478ff999a 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -8,7 +8,7 @@ anchored = 1 density = 0 unacidable = 1 - use_power = 0 + use_power = USE_POWER_OFF light_range = 4 flags = PROXMOVE var/obj/machinery/field_generator/FG1 = null diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index f847813923..2e6cda0049 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -10,7 +10,7 @@ req_access = list(access_engine_equip) var/id = null - use_power = 0 //uses powernet power, not APC power + use_power = USE_POWER_OFF //uses powernet power, not APC power active_power_usage = 30000 //30 kW laser. I guess that means 30 kJ per shot. var/active = 0 diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 0767084974..b02c835785 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -20,7 +20,7 @@ field_generator power level display icon_state = "Field_Gen" anchored = 0 density = 1 - use_power = 0 + use_power = USE_POWER_OFF var/const/num_power_levels = 6 // Total number of power level icon has var/Varedit_start = 0 var/Varpower = 0 diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index c49c605598..bb470811ba 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -6,7 +6,7 @@ icon_state = "TheSingGen" anchored = 0 density = 1 - use_power = 0 + use_power = USE_POWER_OFF var/energy = 0 var/creation_type = /obj/singularity diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 7460830f21..f5481afd4c 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -258,7 +258,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin icon_state = "none" anchored = 0 density = 1 - use_power = 0 + use_power = USE_POWER_OFF idle_power_usage = 0 active_power_usage = 0 var/construction_state = 0 @@ -383,10 +383,10 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin if(src.construction_state < 3)//Was taken apart, update state update_state() if(use_power) - use_power = 0 + update_use_power(USE_POWER_OFF) src.construction_state = temp_state if(src.construction_state >= 3) - use_power = 1 + update_use_power(USE_POWER_IDLE) update_icon() return 1 return 0 diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index bcdd0d5036..8cb370924b 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -8,7 +8,7 @@ reference = "control_box" anchored = 0 density = 1 - use_power = 0 + use_power = USE_POWER_OFF idle_power_usage = 500 active_power_usage = 70000 //70 kW per unit of strength construction_state = 0 @@ -42,7 +42,7 @@ /obj/machinery/particle_accelerator/control_box/update_state() if(construction_state < 3) - update_use_power(0) + update_use_power(USE_POWER_OFF) assembled = 0 active = 0 for(var/obj/structure/particle_accelerator/part in connected_parts) @@ -52,7 +52,7 @@ connected_parts = list() return if(!part_scan()) - update_use_power(1) + update_use_power(USE_POWER_IDLE) active = 0 connected_parts = list() @@ -138,9 +138,9 @@ ..() if(stat & NOPOWER) active = 0 - update_use_power(0) + update_use_power(USE_POWER_OFF) else if(!stat && construction_state == 3) - update_use_power(1) + update_use_power(USE_POWER_IDLE) /obj/machinery/particle_accelerator/control_box/process() @@ -212,13 +212,13 @@ message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) log_game("PACCEL([x],[y],[z]) [key_name(usr)] turned [active?"ON":"OFF"].") if(active) - update_use_power(2) + update_use_power(USE_POWER_ACTIVE) for(var/obj/structure/particle_accelerator/part in connected_parts) part.strength = src.strength part.powered = 1 part.update_icon() else - update_use_power(1) + update_use_power(USE_POWER_IDLE) for(var/obj/structure/particle_accelerator/part in connected_parts) part.strength = null part.powered = 0 diff --git a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm index 921b000078..5a4176ee89 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm @@ -9,7 +9,7 @@ icon_state = "smasher" anchored = 0 density = 1 - use_power = 0 + use_power = USE_POWER_OFF var/successful_craft = FALSE // Are we waiting to be emptied? var/image/material_layer // Holds the image used for the filled overlay. diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 31c7be32ec..a3ee1a2033 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -11,7 +11,7 @@ icon_state = "smes" density = 1 anchored = 1 - use_power = 0 + use_power = USE_POWER_OFF circuit = /obj/item/weapon/circuitboard/smes clicksound = "switch" @@ -56,36 +56,32 @@ charge -= smes_amt return smes_amt / SMESRATE +/obj/machinery/power/smes/Initialize() + . = ..() + if(!powernet) + connect_to_network() -/obj/machinery/power/smes/New() - ..() - spawn(5) - if(!powernet) - connect_to_network() + dir_loop: + for(var/d in cardinal) + var/turf/T = get_step(src, d) + for(var/obj/machinery/power/terminal/term in T) + if(term && term.dir == turn(d, 180)) + terminal = term + break dir_loop + if(!terminal) + stat |= BROKEN + return + terminal.master = src + if(!terminal.powernet) + terminal.connect_to_network() + update_icon() - dir_loop: - for(var/d in cardinal) - var/turf/T = get_step(src, d) - for(var/obj/machinery/power/terminal/term in T) - if(term && term.dir == turn(d, 180)) - terminal = term - break dir_loop - if(!terminal) - stat |= BROKEN - return - terminal.master = src - if(!terminal.powernet) - terminal.connect_to_network() - update_icon() - - - - - if(!should_be_mapped) - warning("Non-buildable or Non-magical SMES at [src.x]X [src.y]Y [src.z]Z") - - return + if(!should_be_mapped) + warning("Non-buildable or Non-magical SMES at [src.x]X [src.y]Y [src.z]Z") +/obj/machinery/power/smes/Destroy() + terminal = null + return ..() /obj/machinery/power/smes/disconnect_terminal() if(terminal) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index c37a625552..65e618613c 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -13,7 +13,7 @@ GLOBAL_LIST_EMPTY(solars_list) icon_state = "sp_base" anchored = 1 density = 1 - use_power = 0 + use_power = USE_POWER_OFF idle_power_usage = 0 active_power_usage = 0 var/id = 0 @@ -285,7 +285,7 @@ GLOBAL_LIST_EMPTY(solars_list) icon_state = "solar" anchored = 1 density = 1 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 250 var/id = 0 var/cdir = 0 diff --git a/code/modules/power/supermatter/setup_supermatter.dm b/code/modules/power/supermatter/setup_supermatter.dm index 7477623805..c0b63d9ce1 100644 --- a/code/modules/power/supermatter/setup_supermatter.dm +++ b/code/modules/power/supermatter/setup_supermatter.dm @@ -126,7 +126,7 @@ GLOBAL_LIST_BOILERPLATE(all_engine_setup_markers, /obj/effect/engine_setup) log_and_message_admins("## WARNING: Unable to locate pump at [x] [y] [z]!") return SETUP_WARNING P.target_pressure = P.max_pressure_setting - P.use_power = 1 + P.update_use_power(USE_POWER_IDLE) P.update_icon() return SETUP_OK @@ -259,7 +259,7 @@ GLOBAL_LIST_BOILERPLATE(all_engine_setup_markers, /obj/effect/engine_setup) return SETUP_WARNING F.rebuild_filtering_list() - F.use_power = 1 + F.update_use_power(USE_POWER_IDLE) F.update_icon() return SETUP_OK diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index a6eab0dbe0..673b2ece86 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -10,7 +10,7 @@ icon_state = "tracker" anchored = 1 density = 1 - use_power = 0 + use_power = USE_POWER_OFF var/id = 0 var/sun_angle = 0 // sun angle as set by sun datum diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index e64abf8533..6540dc470d 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -166,6 +166,7 @@ origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 5, TECH_POWER = 4) projectile_type = /obj/item/projectile/beam/sniper slot_flags = SLOT_BACK + action_button_name = "Use Scope" battery_lock = 1 charge_cost = 600 fire_delay = 35 @@ -176,6 +177,9 @@ // requires_two_hands = 1 // one_handed_penalty = 60 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand. +/obj/item/weapon/gun/energy/sniperrifle/ui_action_click() + scope() + /obj/item/weapon/gun/energy/sniperrifle/verb/scope() set category = "Object" set name = "Use Scope" @@ -192,6 +196,7 @@ origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_POWER = 3) projectile_type = /obj/item/projectile/beam/sniper slot_flags = SLOT_BACK + action_button_name = "Aim Down Sights" charge_cost = 1300 fire_delay = 20 force = 8 @@ -200,6 +205,9 @@ scoped_accuracy = 15 var/scope_multiplier = 1.5 +/obj/item/weapon/gun/energy/monorifle/ui_action_click() + sights() + /obj/item/weapon/gun/energy/monorifle/verb/sights() set category = "Object" set name = "Aim Down Sights" diff --git a/code/modules/projectiles/guns/magnetic/gasthrower.dm b/code/modules/projectiles/guns/magnetic/gasthrower.dm index f42ae95061..742b5bd6c5 100644 --- a/code/modules/projectiles/guns/magnetic/gasthrower.dm +++ b/code/modules/projectiles/guns/magnetic/gasthrower.dm @@ -9,6 +9,7 @@ one_handed_penalty = 20 origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_ILLEGAL = 2, TECH_PHORON = 4) w_class = ITEMSIZE_LARGE + slowdown = 1 burst = 3 burst_delay = 1 diff --git a/code/modules/projectiles/guns/magnetic/magnetic_construction.dm b/code/modules/projectiles/guns/magnetic/magnetic_construction.dm index e8d38169fd..f37c44849c 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic_construction.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic_construction.dm @@ -91,11 +91,19 @@ . = ..(user,2) if(.) switch(construction_stage) - if(2) to_chat(user, "It has a metal frame loosely shaped around the stock.") - if(3) to_chat(user, "It has a metal frame duct-taped to the stock.") - if(4) to_chat(user, "It has a length of pipe attached to the body.") - if(4) to_chat(user, "It has a length of pipe welded to the body.") - if(6) to_chat(user, "It has a cable mount and capacitor jack wired to the frame.") - if(7) to_chat(user, "It has a single superconducting coil threaded onto the barrel.") - if(8) to_chat(user, "It has a pair of superconducting coils threaded onto the barrel.") - if(9) to_chat(user, "It has three superconducting coils attached to the body, waiting to be secured.") + if(2) + to_chat(user, "It has a metal frame loosely shaped around the stock.") + if(3) + to_chat(user, "It has a metal frame duct-taped to the stock.") + if(4) + to_chat(user, "It has a length of pipe attached to the body.") + if(4) + to_chat(user, "It has a length of pipe welded to the body.") + if(6) + to_chat(user, "It has a cable mount and capacitor jack wired to the frame.") + if(7) + to_chat(user, "It has a single superconducting coil threaded onto the barrel.") + if(8) + to_chat(user, "It has a pair of superconducting coils threaded onto the barrel.") + if(9) + to_chat(user, "It has three superconducting coils attached to the body, waiting to be secured.") diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index 2ee5afefdc..6a4137b296 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -8,6 +8,7 @@ w_class = ITEMSIZE_HUGE // So it can't fit in a backpack. force = 10 slot_flags = SLOT_BACK + action_button_name = "Use Scope" origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 2, TECH_ILLEGAL = 8) caliber = "14.5mm" recoil = 5 //extra kickback @@ -61,6 +62,9 @@ return ..() +/obj/item/weapon/gun/projectile/heavysniper/ui_action_click() + scope() + /obj/item/weapon/gun/projectile/heavysniper/verb/scope() set category = "Object" set name = "Use Scope" @@ -78,6 +82,7 @@ w_class = ITEMSIZE_HUGE // So it can't fit in a backpack. force = 10 slot_flags = SLOT_BACK // Needs a sprite. + action_button_name = "Use Scope" origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 2, TECH_ILLEGAL = 8) caliber = "7.62mm" load_method = MAGAZINE @@ -96,6 +101,9 @@ else icon_state = "SVD-empty" +/obj/item/weapon/gun/projectile/SVD/ui_action_click() + scope() + /obj/item/weapon/gun/projectile/SVD/verb/scope() set category = "Object" set name = "Use Scope" diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 06144e01f8..e05739d194 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -271,10 +271,11 @@ /obj/item/projectile/bullet/incendiary/flamethrower/tiny damage = 2 incendiary = 0 - modifier_type_to_apply = /datum/modifier/fire/weak + flammability = 2 + modifier_type_to_apply = /datum/modifier/fire/stack_managed/weak modifier_duration = 20 SECONDS - range = 7 - agony = 3 + range = 6 + agony = 0 /* Practice rounds and blanks */ diff --git a/code/modules/random_map/automata/diona.dm b/code/modules/random_map/automata/diona.dm index e9e58a03a4..d6bee1c0ff 100644 --- a/code/modules/random_map/automata/diona.dm +++ b/code/modules/random_map/automata/diona.dm @@ -1,5 +1,5 @@ -/turf/simulated/wall/diona/New(var/newloc) - ..(newloc,"biomass") +/turf/simulated/wall/diona/Initialize(mapload) + ..(mapload, "biomass") /turf/simulated/wall/diona/attack_generic(var/mob/user, var/damage, var/attack_message) if(istype(user, /mob/living/carbon/alien/diona)) diff --git a/code/modules/random_map/drop/droppod_doors.dm b/code/modules/random_map/drop/droppod_doors.dm index afabe1335b..7c7075f45f 100644 --- a/code/modules/random_map/drop/droppod_doors.dm +++ b/code/modules/random_map/drop/droppod_doors.dm @@ -10,11 +10,10 @@ var/deploying var/deployed -/obj/structure/droppod_door/New(var/newloc, var/autoopen) - ..(newloc) +/obj/structure/droppod_door/Initialize(var/mapload, var/autoopen) + . = ..() if(autoopen) - spawn(100) - deploy() + addtimer(CALLBACK(src, .proc/deploy), 10 SECONDS) /obj/structure/droppod_door/attack_ai(var/mob/user) if(!user.Adjacent(src)) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 6e2ba4cfb8..b7df9ff8f8 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -16,9 +16,9 @@ icon = 'icons/obj/chemical.dmi' icon_state = "mixer0" circuit = /obj/item/weapon/circuitboard/chem_master - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 20 - var/beaker = null + var/obj/item/weapon/reagent_containers/beaker = null var/obj/item/weapon/storage/pill_bottle/loaded_pill_bottle = null var/mode = 0 var/condi = 0 @@ -105,7 +105,7 @@ data["pillBottle"] = null if(beaker) - var/datum/reagents/R = beaker:reagents + var/datum/reagents/R = beaker.reagents var/ui_reagent_beaker_list[0] for(var/datum/reagent/G in R.reagent_list) ui_reagent_beaker_list[++ui_reagent_beaker_list.len] = list("name" = G.name, "volume" = G.volume, "description" = G.description, "id" = G.id) @@ -160,11 +160,15 @@ if (href_list["ejectp"]) if(loaded_pill_bottle) - loaded_pill_bottle.loc = src.loc + loaded_pill_bottle.forceMove(get_turf(src)) + + if(Adjacent(usr)) + usr.put_in_hands(loaded_pill_bottle) + loaded_pill_bottle = null if(beaker) - var/datum/reagents/R = beaker:reagents + var/datum/reagents/R = beaker.reagents if (tab == "analyze") analyze_data["name"] = href_list["name"] analyze_data["desc"] = href_list["desc"] @@ -216,7 +220,11 @@ else if (href_list["eject"]) if(beaker) - beaker:loc = src.loc + beaker.forceMove(get_turf(src)) + + if(Adjacent(usr)) // So the AI doesn't get a beaker somehow. + usr.put_in_hands(beaker) + beaker = null reagents.clear_reagents() icon_state = "mixer0" @@ -333,7 +341,7 @@ icon_state = "juicer1" density = 0 anchored = 0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 5 active_power_usage = 100 circuit = /obj/item/weapon/circuitboard/grinder diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm index c91a478cfb..489378b533 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm @@ -167,10 +167,10 @@ S.visible_message("[S]'s flesh sizzles where the water touches it!", "Your flesh burns in the water!") // Then extinguish people on fire. - var/needed = L.fire_stacks * 5 + var/needed = max(0,L.fire_stacks) * 5 if(amount > needed) L.ExtinguishMob() - L.adjust_fire_stacks(-(amount / 5)) + L.water_act(amount / 25) // Div by 25, as water_act multiplies it by 5 in order to calculate firestack modification. remove_self(needed) /datum/reagent/water/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index 011710aa66..851521d430 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -959,7 +959,7 @@ color = "#605048" overdose = REAGENTS_OVERDOSE -/datum/reagent/ethylredoxrazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) +/datum/reagent/ethylredoxrazine/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) return M.dizziness = 0 @@ -970,6 +970,14 @@ for(var/datum/reagent/R in M.ingested.reagent_list) if(istype(R, /datum/reagent/ethanol)) R.remove_self(removed * 30) + +/datum/reagent/ethylredoxrazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_DIONA) + return + M.dizziness = 0 + M.drowsyness = 0 + M.stuttering = 0 + M.SetConfused(0) if(M.bloodstr) for(var/datum/reagent/R in M.bloodstr.reagent_list) if(istype(R, /datum/reagent/ethanol)) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Modifiers.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Modifiers.dm index d9a7483ec1..cd2e6767b4 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Modifiers.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Modifiers.dm @@ -12,12 +12,13 @@ metabolism = REM var/modifier_to_add = /datum/modifier/berserk - var/modifier_duration = 2 SECONDS // How long, per unit dose, will this last? + var/modifier_duration = 3 SECONDS // How long, per unit dose, will this last? + // 2 SECONDS is the resolution of life code, and the modifier will expire before chemical processing tries to re-add it /datum/reagent/modapplying/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) return - M.add_modifier(modifier_to_add, dose * modifier_duration) + M.add_modifier(modifier_to_add, modifier_duration, suppress_failure = TRUE) /datum/reagent/modapplying/cryofluid name = "cryogenic slurry" diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index a22f170c02..44e1f60621 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -118,7 +118,7 @@ var/turf/T = get_turf(container) var/list/seen = viewers(4, T) for(var/mob/M in seen) - M.show_message("\icon[container] [mix_message]", 1) + M.show_message("[bicon(container)] [mix_message]", 1) playsound(T, reaction_sound, 80, 1) //obtains any special data that will be provided to the reaction products diff --git a/code/modules/reagents/dispenser/dispenser2.dm b/code/modules/reagents/dispenser/dispenser2.dm index 17da8452de..391659762f 100644 --- a/code/modules/reagents/dispenser/dispenser2.dm +++ b/code/modules/reagents/dispenser/dispenser2.dm @@ -15,7 +15,7 @@ var/accept_drinking = 0 var/amount = 30 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 100 anchored = 1 @@ -165,8 +165,11 @@ else if(href_list["ejectBeaker"]) if(container) - var/obj/item/weapon/reagent_containers/B = container - B.loc = loc + container.forceMove(get_turf(src)) + + if(Adjacent(usr)) // So the AI doesn't get a beaker somehow. + usr.put_in_hands(container) + container = null add_fingerprint(usr) diff --git a/code/modules/reagents/distilling/distilling.dm b/code/modules/reagents/distilling/distilling.dm index b86bcc7435..78780a3543 100644 --- a/code/modules/reagents/distilling/distilling.dm +++ b/code/modules/reagents/distilling/distilling.dm @@ -6,7 +6,7 @@ /obj/machinery/portable_atmospherics/powered/reagent_distillery name = "chemical distillery" desc = "A complex machine utilizing state-of-the-art components to mix chemicals at different temperatures." - use_power = 1 + use_power = USE_POWER_IDLE icon = 'icons/obj/machines/reagent.dmi' icon_state = "distiller" @@ -108,6 +108,57 @@ ..() +/obj/machinery/portable_atmospherics/powered/reagent_distillery/examine(mob/user) + ..() + if(get_dist(user, src) < 3) + to_chat(user, "\The [src] is powered [on ? "on" : "off"].") + + to_chat(user, "\The [src]'s gauges read:") + if(!use_atmos) + to_chat(user, "- Target Temperature: [target_temp]") + to_chat(user, "- Temperature: [current_temp]") + + if(InputBeaker) + if(InputBeaker.reagents.reagent_list.len) + to_chat(user, "\The [src]'s input beaker holds [InputBeaker.reagents.total_volume] units of liquid.") + else + to_chat(user, "\The [src]'s input beaker is empty!") + + if(Reservoir.reagents.reagent_list.len) + to_chat(user, "\The [src]'s internal buffer holds [Reservoir.reagents.total_volume] units of liquid.") + else + to_chat(user, "\The [src]'s internal buffer is empty!") + + if(OutputBeaker) + if(OutputBeaker.reagents.reagent_list.len) + to_chat(user, "\The [src]'s output beaker holds [OutputBeaker.reagents.total_volume] units of liquid.") + else + to_chat(user, "\The [src]'s output beaker is empty!") + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/verb/toggle_power(mob/user = usr) + set name = "Toggle Distillery Heating" + set category = "Object" + set src in view(1) + + if(powered()) + on = !on + to_chat(user, "You turn \the [src] [on ? "on" : "off"].") + else + to_chat(user, " Nothing happens.") + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/verb/toggle_mixing(mob/user = usr) + set name = "Start Distillery Mixing" + set category = "Object" + set src in view(1) + + to_chat(user, "You press \the [src]'s chamber agitator button.") + if(on) + visible_message("\The [src] rattles to life.") + Reservoir.reagents.handle_reactions() + else + spawn(1 SECOND) + to_chat(user, "Nothing happens..") + /obj/machinery/portable_atmospherics/powered/reagent_distillery/attack_hand(mob/user) var/list/options = list() options["examine"] = radial_examine @@ -138,9 +189,7 @@ examine(user) if("use") - if(powered()) - on = !on - to_chat(user, "You turn \the [src] [on ? "on" : "off"].") + toggle_power(user) if("inspect gauges") to_chat(user, "\The [src]'s gauges read:") @@ -149,13 +198,7 @@ to_chat(user, "- Temperature: [current_temp]") if("pulse agitator") - to_chat(user, "You press \the [src]'s chamber agitator button.") - if(on) - visible_message("\The [src] rattles to life.") - Reservoir.reagents.handle_reactions() - else - spawn(1 SECOND) - to_chat(user, "Nothing happens..") + toggle_mixing(user) if("eject input") if(InputBeaker) @@ -252,19 +295,36 @@ if(!powered()) on = FALSE - if(!on || (use_atmos && (!connected_port || avg_pressure < 1000))) + if(!on || (use_atmos && (!connected_port || (avg_pressure / avg_temp) < (1000 / T20C)))) // This mostly respects gas laws by ignoring volume but it should make it usable at low temps current_temp = round((current_temp + T20C) / 2) else if(on) if(!use_atmos) if(current_temp != round(target_temp)) - var/shift_mod = 0 - if(current_temp < target_temp) - shift_mod = 1 - else if(current_temp > target_temp) - shift_mod = -1 - current_temp = CLAMP(round((current_temp + 1 * shift_mod) + (rand(-5, 5) / 10)), min_temp, max_temp) + // Some horrible bastardized attempt at approximating the values of a logistic function, bounded by (max_temp, target_temp, min_temp) + // So we can attempt to estimate the change in temperature for this process() step + + // Apply inverse of the logistic function to fetch our x value + var/x = -1 * log((current_temp < target_temp ? (target_temp - min_temp) / (current_temp - min_temp) : (max_temp - target_temp) / (max_temp - current_temp)) - 1) + if(!x) + x = 0 // Keep null from propagating into the temp + + // Apply the derivative of the logistic function to get the slope + var/dy = (NUM_E ** (-1 * x)) / ((1 + (NUM_E ** (-1 * x))) ** 2) + + // Compute temperature diff, being farther from the target should result in larger steps + // IMPORTANT: If you want to tweak how quickly this changes, tweak this *10! + // As of initial testing, a *10 gives ~5-6 minutes to go from room temp to 500C (+/-0.5C) + var/temp_diff = (current_temp < target_temp ? dy * 10 * target_temp / current_temp : dy * -10 * current_temp / target_temp) + + current_temp = CLAMP(round((current_temp + temp_diff), 0.01), min_temp, max_temp) use_power(power_rating * CELLRATE) + + if(target_temp == round(current_temp, 1.0)) + current_temp = target_temp // Hard set it so we don't need to worry about exact decimals any more, after we've been keeping track of it all this time + playsound(src, 'sound/machines/ping.ogg', 50, 0) + src.visible_message("\The [src] pings as it reaches the target temperature.") + else if(connected_port && avg_pressure > 1000) current_temp = round((current_temp + avg_temp) / 2) else if(!run_pump) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index db4f077753..7a6927f49d 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -104,7 +104,7 @@ feed_sound(user) return 1 else - if(istype(user, /mob/living/carbon/human)) + if(istype(target, /mob/living/carbon/human)) var/mob/living/carbon/human/H = target if(!H.check_has_mouth()) to_chat(user, "Where do you intend to put \the [src]? \The [H] doesn't have a mouth!") diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index e0b692b1c0..0b61719470 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -242,6 +242,7 @@ flags = OPENCONTAINER /obj/item/weapon/reagent_containers/glass/beaker/cryoxadone + name = "beaker (cryoxadone)" prefill = list("cryoxadone" = 30) /obj/item/weapon/reagent_containers/glass/beaker/sulphuric diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 8a2e9796cd..f3dd0fa384 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -29,23 +29,24 @@ // create a new disposal // find the attached trunk (if present) and init gas resvr. -/obj/machinery/disposal/New() - ..() - spawn(5) - trunk = locate() in src.loc - if(!trunk) - mode = 0 - flush = 0 - else - trunk.linked = src // link the pipe trunk to self +/obj/machinery/disposal/Initialize() + . = ..() + + trunk = locate() in loc + if(!trunk) + mode = 0 + flush = 0 + else + trunk.linked = src // link the pipe trunk to self - air_contents = new/datum/gas_mixture(PRESSURE_TANK_VOLUME) - update() + air_contents = new/datum/gas_mixture(PRESSURE_TANK_VOLUME) + update() /obj/machinery/disposal/Destroy() eject() if(trunk) trunk.linked = null + trunk = null return ..() // attack by item places it in to disposal @@ -359,7 +360,7 @@ // charge the gas reservoir and perform flush if ready /obj/machinery/disposal/process() if(!air_contents || (stat & BROKEN)) // nothing can happen if broken - update_use_power(0) + update_use_power(USE_POWER_OFF) return flush_count++ @@ -377,7 +378,7 @@ flush() if(mode != 1) //if off or ready, no need to charge - update_use_power(1) + update_use_power(USE_POWER_IDLE) else if(air_contents.return_pressure() >= SEND_PRESSURE) mode = 2 //if full enough, switch to ready mode update() @@ -386,7 +387,7 @@ /obj/machinery/disposal/proc/pressurize() if(stat & NOPOWER) // won't charge if no power - update_use_power(0) + update_use_power(USE_POWER_OFF) return var/atom/L = loc // recharging from loc turf @@ -1308,46 +1309,39 @@ icon_state = "pipe-t" var/obj/linked // the linked obj/machinery/disposal or obj/disposaloutlet -/obj/structure/disposalpipe/trunk/New() - ..() +/obj/structure/disposalpipe/trunk/Initialize() + ..() //Lateload below dpdir = dir - spawn(1) - getlinked() + return INITIALIZE_HINT_LATELOAD +/obj/structure/disposalpipe/trunk/LateInitialize() + if(!linked) + getlinked() update() - return + +/obj/structure/disposalpipe/trunk/Destroy() + if(linked) + if(istype(linked, /obj/machinery/disposal)) + + var/obj/machinery/disposal/D = linked + D.trunk = null + linked = null + return ..() /obj/structure/disposalpipe/trunk/proc/getlinked() linked = null - var/obj/machinery/disposal/D = locate() in src.loc + var/obj/machinery/disposal/D = locate() in loc if(D) linked = D - if (!D.trunk) + if(!D.trunk) D.trunk = src - var/obj/structure/disposaloutlet/O = locate() in src.loc + var/obj/structure/disposaloutlet/O = locate() in loc if(O) linked = O - update() - return - - // Override attackby so we disallow trunkremoval when somethings ontop +// Override attackby so we disallow trunkremoval when somethings ontop /obj/structure/disposalpipe/trunk/attackby(var/obj/item/I, var/mob/user) - - //Disposal bins or chutes - /* - These shouldn't be required - var/obj/machinery/disposal/D = locate() in src.loc - if(D && D.anchored) - return - - //Disposal outlet - var/obj/structure/disposaloutlet/O = locate() in src.loc - if(O && O.anchored) - return - */ - //Disposal constructors var/obj/structure/disposalconstruct/C = locate() in src.loc if(C && C.anchored) @@ -1439,72 +1433,70 @@ var/turf/target // this will be where the output objects are 'thrown' to. var/mode = 0 - New() - ..() +/obj/structure/disposaloutlet/Initialize() + . = ..() - spawn(1) - target = get_ranged_target_turf(src, dir, 10) + target = get_ranged_target_turf(src, dir, 10) - var/obj/structure/disposalpipe/trunk/trunk = locate() in src.loc - if(trunk) - trunk.linked = src // link the pipe trunk to self + var/obj/structure/disposalpipe/trunk/trunk = locate() in loc + if(trunk) + trunk.linked = src // link the pipe trunk to self // expel the contents of the holder object, then delete it // called when the holder exits the outlet - proc/expel(var/obj/structure/disposalholder/H) +/obj/structure/disposaloutlet/proc/expel(var/obj/structure/disposalholder/H) + flick("outlet-open", src) + playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0) + sleep(20) //wait until correct animation frame + playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) - flick("outlet-open", src) - playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0) - sleep(20) //wait until correct animation frame - playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) + if(H) + for(var/atom/movable/AM in H) + AM.forceMove(src.loc) + AM.pipe_eject(dir) + if(!istype(AM,/mob/living/silicon/robot/drone)) //Drones keep smashing windows from being fired out of chutes. Bad for the station. ~Z + spawn(5) + AM.throw_at(target, 3, 1) + H.vent_gas(src.loc) + qdel(H) - if(H) - for(var/atom/movable/AM in H) - AM.forceMove(src.loc) - AM.pipe_eject(dir) - if(!istype(AM,/mob/living/silicon/robot/drone)) //Drones keep smashing windows from being fired out of chutes. Bad for the station. ~Z - spawn(5) - AM.throw_at(target, 3, 1) - H.vent_gas(src.loc) - qdel(H) + return +/obj/structure/disposaloutlet/attackby(var/obj/item/I, var/mob/user) + if(!I || !user) return - - attackby(var/obj/item/I, var/mob/user) - if(!I || !user) + src.add_fingerprint(user) + if(I.is_screwdriver()) + if(mode==0) + mode=1 + to_chat(user, "You remove the screws around the power connection.") + playsound(src, I.usesound, 50, 1) + return + else if(mode==1) + mode=0 + to_chat(user, "You attach the screws around the power connection.") + playsound(src, I.usesound, 50, 1) + return + else if(istype(I, /obj/item/weapon/weldingtool) && mode==1) + var/obj/item/weapon/weldingtool/W = I + if(W.remove_fuel(0,user)) + playsound(src, W.usesound, 100, 1) + to_chat(user, "You start slicing the floorweld off the disposal outlet.") + if(do_after(user,20 * W.toolspeed)) + if(!src || !W.isOn()) return + to_chat(user, "You sliced the floorweld off the disposal outlet.") + var/obj/structure/disposalconstruct/C = new (src.loc) + src.transfer_fingerprints_to(C) + C.ptype = 7 // 7 = outlet + C.update() + C.anchored = 1 + C.density = 1 + qdel(src) + return + else + to_chat(user, "You need more welding fuel to complete this task.") return - src.add_fingerprint(user) - if(I.is_screwdriver()) - if(mode==0) - mode=1 - to_chat(user, "You remove the screws around the power connection.") - playsound(src, I.usesound, 50, 1) - return - else if(mode==1) - mode=0 - to_chat(user, "You attach the screws around the power connection.") - playsound(src, I.usesound, 50, 1) - return - else if(istype(I, /obj/item/weapon/weldingtool) && mode==1) - var/obj/item/weapon/weldingtool/W = I - if(W.remove_fuel(0,user)) - playsound(src, W.usesound, 100, 1) - to_chat(user, "You start slicing the floorweld off the disposal outlet.") - if(do_after(user,20 * W.toolspeed)) - if(!src || !W.isOn()) return - to_chat(user, "You sliced the floorweld off the disposal outlet.") - var/obj/structure/disposalconstruct/C = new (src.loc) - src.transfer_fingerprints_to(C) - C.ptype = 7 // 7 = outlet - C.update() - C.anchored = 1 - C.density = 1 - qdel(src) - return - else - to_chat(user, "You need more welding fuel to complete this task.") - return // called when movable is expelled from a disposal pipe or outlet // by default does nothing, override for special behaviour diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 75d45652d9..f9ff3adb51 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -20,7 +20,7 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid). hidden_materials = list(MAT_PLASTEEL, MAT_DURASTEEL, MAT_GRAPHITE, MAT_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER) - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 30 active_power_usage = 2500 diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index f8d7fbc4d6..a17bf370bf 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -12,7 +12,7 @@ Note: Must be placed within 3 tiles of the R&D Console var/obj/item/weapon/loaded_item = null var/decon_mod = 0 circuit = /obj/item/weapon/circuitboard/destructive_analyzer - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 30 active_power_usage = 2500 diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm index af8afc44fb..125de3db6c 100644 --- a/code/modules/research/mechfab_designs.dm +++ b/code/modules/research/mechfab_designs.dm @@ -538,6 +538,13 @@ req_tech = list(TECH_BLUESPACE = 10, TECH_MAGNET = 5) build_path = /obj/item/mecha_parts/mecha_equipment/teleporter +/datum/design/item/mecha/teleporter + name = "Cloaking Device" + desc = "A device that renders the exosuit invisible to the naked eye, though not to thermal detection. Uses large amounts of energy." + id = "mech_cloaking" + req_tech = list(TECH_BLUESPACE = 10, TECH_MAGNET = 5) + build_path = /obj/item/mecha_parts/mecha_equipment/cloak + /datum/design/item/mecha/rcd name = "RCD" desc = "An exosuit-mounted rapid construction device." @@ -570,6 +577,14 @@ materials = list(DEFAULT_WALL_MATERIAL = 8000, "gold" = 2000, "silver" = 3000, "phoron" = 5000, "glass" = 3750) build_path = /obj/item/mecha_parts/mecha_equipment/combat_shield +/datum/design/item/mecha/omni_shield + name = "Omni Shield" + desc = "Integral shield projector. Can only protect the exosuit, but has no weak angles." + id = "mech_shield_omni" + req_tech = list(TECH_PHORON = 3, TECH_MAGNET = 6, TECH_ILLEGAL = 4) + materials = list(DEFAULT_WALL_MATERIAL = 8000, "gold" = 2000, "silver" = 3000, "phoron" = 5000, "glass" = 3750) + build_path = /obj/item/mecha_parts/mecha_equipment/omni_shield + /datum/design/item/mecha/crisis_drone name = "Crisis Drone" desc = "Deploys a small medical drone capable of patching small wounds in order to stabilize nearby patients." diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index a61dc04e89..86004b6130 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -54,7 +54,7 @@ var/global/list/obj/machinery/message_server/message_servers = list() desc = "Facilitates both PDA messages and request console functions." density = 1 anchored = 1.0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 10 active_power_usage = 100 @@ -131,12 +131,12 @@ var/global/list/obj/machinery/message_server/message_servers = list() if(2) if(!Console.silent) playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1) - Console.audible_message(text("\icon[Console] *The Requests Console beeps: 'PRIORITY Alert in [sender]'"),,5) + Console.audible_message(text("[bicon(Console)] *The Requests Console beeps: 'PRIORITY Alert in [sender]'"),,5) Console.message_log += "High Priority message from [sender]
[authmsg]" else if(!Console.silent) playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1) - Console.audible_message(text("\icon[Console] *The Requests Console beeps: 'Message from [sender]'"),,4) + Console.audible_message(text("[bicon(Console)] *The Requests Console beeps: 'Message from [sender]'"),,4) Console.message_log += "Message from [sender]
[authmsg]" Console.set_light(2) @@ -240,7 +240,7 @@ var/obj/machinery/blackbox_recorder/blackbox desc = "Records all radio communications, as well as various other information in case of the worst." density = 1 anchored = 1.0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 10 active_power_usage = 100 var/list/messages = list() //Stores messages of non-standard frequencies diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm index d038736b96..da9cc05509 100644 --- a/code/modules/research/prosfab_designs.dm +++ b/code/modules/research/prosfab_designs.dm @@ -53,7 +53,7 @@ newspecies = prosfab.species var/mob/living/carbon/human/H = new(newloc,newspecies) - H.stat = DEAD + H.set_stat(DEAD) H.gender = gender for(var/obj/item/organ/external/EO in H.organs) if(EO.organ_tag == BP_TORSO || EO.organ_tag == BP_GROIN) diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 3d65e35d63..3837e13aae 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -3,7 +3,7 @@ icon_state = "protolathe" flags = OPENCONTAINER circuit = /obj/item/weapon/circuitboard/protolathe - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 30 active_power_usage = 5000 diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 9bcb130c00..a5f25beb08 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -7,7 +7,7 @@ icon = 'icons/obj/machines/research.dmi' density = 1 anchored = 1 - use_power = 1 + use_power = USE_POWER_IDLE var/busy = 0 var/obj/machinery/computer/rdconsole/linked_console diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index e3202ccbec..707bd3ccd9 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -16,7 +16,7 @@ //1 = select event //2 = authenticate anchored = 1.0 - use_power = 1 + use_power = USE_POWER_IDLE idle_power_usage = 2 active_power_usage = 6 power_channel = ENVIRON diff --git a/code/modules/shieldgen/directional_shield.dm b/code/modules/shieldgen/directional_shield.dm index 9cc0454620..00c416895e 100644 --- a/code/modules/shieldgen/directional_shield.dm +++ b/code/modules/shieldgen/directional_shield.dm @@ -125,6 +125,7 @@ for(var/obj/effect/directional_shield/S in active_shields) active_shields -= S qdel(S) + set_light(0) active = FALSE /obj/item/shield_projector/proc/update_shield_positions() @@ -179,13 +180,18 @@ if(always_on) to_chat(user, "You can't seem to deactivate \the [src].") return - - destroy_shields() + set_on(FALSE) else set_dir(user.dir) // Needed for linear shields. - create_shields() + set_on(TRUE) visible_message("\The [user] [!active ? "de":""]activates \the [src].") +/obj/item/shield_projector/proc/set_on(var/on) + if(isnull(on)) + return + + on ? create_shields() : destroy_shields() // Harmless if called when in the wrong state. + /obj/item/shield_projector/process() if(shield_health < max_shield_health && ( (last_damaged_time + shield_regen_delay) < world.time) ) adjust_health(shield_regen_amount) diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index e764e0b516..923d1ec327 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -134,7 +134,7 @@ var/is_open = 0 //Whether or not the wires are exposed var/locked = 0 var/check_delay = 60 //periodically recheck if we need to rebuild a shield - use_power = 0 + use_power = USE_POWER_OFF idle_power_usage = 0 var/global/list/blockedturfs = list( /turf/space, @@ -156,7 +156,7 @@ idle_power_usage = 0 for(var/obj/machinery/shield/shield_tile in deployed_shields) idle_power_usage += shield_tile.shield_idle_power - update_use_power(1) + update_use_power(USE_POWER_IDLE) /obj/machinery/shieldgen/proc/shields_down() if(!active) return 0 //If it's already off, how did this get called? @@ -166,7 +166,7 @@ collapse_shields() - update_use_power(0) + update_use_power(USE_POWER_OFF) /obj/machinery/shieldgen/proc/create_shields() for(var/turf/target_tile in range(2, src)) @@ -258,14 +258,14 @@ return if (src.active) - user.visible_message("\icon[src] [user] deactivated the shield generator.", \ - "\icon[src] You deactivate the shield generator.", \ + user.visible_message("[bicon(src)] [user] deactivated the shield generator.", \ + "[bicon(src)] You deactivate the shield generator.", \ "You hear heavy droning fade out.") src.shields_down() else if(anchored) - user.visible_message("\icon[src] [user] activated the shield generator.", \ - "\icon[src] You activate the shield generator.", \ + user.visible_message("[bicon(src)] [user] activated the shield generator.", \ + "[bicon(src)] You activate the shield generator.", \ "You hear heavy droning.") src.shields_up() else diff --git a/code/modules/shieldgen/energy_field.dm b/code/modules/shieldgen/energy_field.dm index 5b7d7f2118..87d07cceaf 100644 --- a/code/modules/shieldgen/energy_field.dm +++ b/code/modules/shieldgen/energy_field.dm @@ -31,8 +31,14 @@ /obj/effect/energy_field/Destroy() update_nearby_tiles() - my_gen.field.Remove(src) - my_gen = null + if(my_gen) + if(istype(my_gen)) + my_gen.field.Remove(src) + my_gen = null + else if(istype(my_gen, /datum/artifact_effect/forcefield)) + var/datum/artifact_effect/forcefield/AE = my_gen + AE.created_field.Remove(src) + my_gen = null var/turf/current_loc = get_turf(src) . = ..() for(var/direction in cardinal) diff --git a/code/modules/shieldgen/sheldwallgen.dm b/code/modules/shieldgen/sheldwallgen.dm index 331f04549a..2a6a859c43 100644 --- a/code/modules/shieldgen/sheldwallgen.dm +++ b/code/modules/shieldgen/sheldwallgen.dm @@ -23,7 +23,7 @@ //There have to be at least two posts, so these are effectively doubled var/power_draw = 30000 //30 kW. How much power is drawn from powernet. Increase this to allow the generator to sustain longer shields, at the cost of more power draw. var/max_stored_power = 50000 //50 kW - use_power = 0 //Draws directly from power net. Does not use APC power. + use_power = USE_POWER_OFF //Draws directly from power net. Does not use APC power. /obj/machinery/shieldwallgen/attack_hand(mob/user as mob) if(state != 1) diff --git a/code/modules/shieldgen/shield_capacitor.dm b/code/modules/shieldgen/shield_capacitor.dm index 4006a1cedf..2ef3f17a85 100644 --- a/code/modules/shieldgen/shield_capacitor.dm +++ b/code/modules/shieldgen/shield_capacitor.dm @@ -15,7 +15,7 @@ var/max_charge = 8e6 //8 MJ var/max_charge_rate = 400000 //400 kW var/locked = 0 - use_power = 0 //doesn't use APC power + use_power = USE_POWER_OFF //doesn't use APC power var/charge_rate = 100000 //100 kW var/obj/machinery/shield_gen/owned_gen @@ -48,7 +48,7 @@ else if(W.is_wrench()) src.anchored = !src.anchored playsound(src, W.usesound, 75, 1) - src.visible_message("\icon[src] [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by [user].") + src.visible_message("[bicon(src)] [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by [user].") if(anchored) spawn(0) diff --git a/code/modules/shieldgen/shield_diffuser.dm b/code/modules/shieldgen/shield_diffuser.dm index c30f8a7351..9c42e22b57 100644 --- a/code/modules/shieldgen/shield_diffuser.dm +++ b/code/modules/shieldgen/shield_diffuser.dm @@ -4,7 +4,7 @@ description_info = "This device disrupts shields on directly adjacent tiles (in a + shaped pattern). They are commonly installed around exterior airlocks to prevent shields from blocking EVA access." icon = 'icons/obj/machines/shielding.dmi' icon_state = "fdiffuser_on" - use_power = 2 + use_power = USE_POWER_ACTIVE idle_power_usage = 25 // Previously 100. active_power_usage = 500 // Previously 2000 anchored = 1 @@ -57,7 +57,7 @@ update_icon() return enabled = !enabled - use_power = enabled + 1 + update_use_power(enabled ? USE_POWER_ACTIVE : USE_POWER_IDLE) update_icon() to_chat(usr, "You turn \the [src] [enabled ? "on" : "off"].") diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm index 253bc391f3..cdd16d2429 100644 --- a/code/modules/shieldgen/shield_gen.dm +++ b/code/modules/shieldgen/shield_gen.dm @@ -22,7 +22,8 @@ var/time_since_fail = 100 var/energy_conversion_rate = 0.0006 //how many renwicks per watt? Higher numbers equals more effiency. var/z_range = 0 // How far 'up and or down' to extend the shield to, in z-levels. Only works on MultiZ supported z-levels. - use_power = 0 //doesn't use APC power + use_power = USE_POWER_OFF //doesn't use APC power + var/id //for button usage /obj/machinery/shield_gen/advanced name = "advanced bubble shield generator" @@ -67,7 +68,7 @@ else if(W.is_wrench()) src.anchored = !src.anchored playsound(src, W.usesound, 75, 1) - src.visible_message("\icon[src] [src] has been [anchored?"bolted to the floor":"unbolted from the floor"] by [user].") + src.visible_message("[bicon(src)] [src] has been [anchored?"bolted to the floor":"unbolted from the floor"] by [user].") if(active) toggle() @@ -248,7 +249,7 @@ covered_turfs = null for(var/mob/M in view(5,src)) - to_chat(M, "\icon[src] You hear heavy droning start up.") + to_chat(M, "[bicon(src)] You hear heavy droning start up.") for(var/obj/effect/energy_field/E in field) // Update the icons here to ensure all the shields have been made already. E.update_icon() else @@ -258,7 +259,7 @@ qdel(D) for(var/mob/M in view(5,src)) - to_chat(M, "\icon[src] You hear heavy droning fade out.") + to_chat(M, "[bicon(src)] You hear heavy droning fade out.") /obj/machinery/shield_gen/update_icon() if(stat & BROKEN) diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm index 2d277ab32a..d1a7991bdc 100644 --- a/code/modules/shuttles/shuttle.dm +++ b/code/modules/shuttles/shuttle.dm @@ -61,17 +61,17 @@ if(flags & SHUTTLE_FLAGS_PROCESS) SSshuttles.process_shuttles += src if(flags & SHUTTLE_FLAGS_SUPPLY) - if(supply_controller.shuttle) + if(SSsupply.shuttle) CRASH("A supply shuttle is already defined.") - supply_controller.shuttle = src + SSsupply.shuttle = src /datum/shuttle/Destroy() current_location = null SSshuttles.shuttles -= src.name SSshuttles.process_shuttles -= src SSshuttles.shuttle_logs -= src - if(supply_controller.shuttle == src) - supply_controller.shuttle = null + if(SSsupply.shuttle == src) + SSsupply.shuttle = null . = ..() // This creates a graphical warning to where the shuttle is about to land, in approximately five seconds. diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 80086b1b47..f8c2a8210d 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -121,7 +121,7 @@ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) - ui = new(user, src, ui_key, ui_template, "[shuttle_tag] Shuttle Control", 470, 310) + ui = new(user, src, ui_key, ui_template, "[shuttle_tag] Shuttle Control", 470, 360) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) @@ -142,3 +142,30 @@ /obj/machinery/computer/shuttle_control/emp_act() return + + +GLOBAL_LIST_BOILERPLATE(papers_dockingcode, /obj/item/weapon/paper/dockingcodes) +/hook/roundstart/proc/populate_dockingcodes() + for(var/paper in global.papers_dockingcode) + var/obj/item/weapon/paper/dockingcodes/dcp = paper + dcp.populate_info() + return TRUE + +/obj/item/weapon/paper/dockingcodes + name = "Docking Codes" + var/codes_from_z = null //So you can put codes from the station other places to give to antags or whatever + +/obj/item/weapon/paper/dockingcodes/proc/populate_info() + var/dockingcodes = null + var/z_to_check = codes_from_z ? codes_from_z : z + if(using_map.use_overmap) + var/obj/effect/overmap/visitable/location = map_sectors["[z_to_check]"] + if(location && location.docking_codes) + dockingcodes = location.docking_codes + + if(!dockingcodes) + info = "

Daily Docking Codes


The docking security system is down for maintenance. Please exercise caution when shuttles dock and depart." + else + info = "

Daily Docking Codes


The docking codes for this shift are '[dockingcodes]'.
These codes are secret, as they will allow hostile shuttles to dock with impunity if discovered.
" + info_links = info + icon_state = "paper_words" diff --git a/code/modules/shuttles/shuttle_ferry.dm b/code/modules/shuttles/shuttle_ferry.dm index a5876f55dd..cad706c800 100644 --- a/code/modules/shuttles/shuttle_ferry.dm +++ b/code/modules/shuttles/shuttle_ferry.dm @@ -48,3 +48,9 @@ /datum/shuttle/autodock/ferry/process_arrived() ..() next_location = get_location_waypoint(!location) + +// Ferry shuttles should generally always be able to dock. So read the docking codes off of the target. +/datum/shuttle/autodock/ferry/update_docking_target(var/obj/effect/shuttle_landmark/location) + ..() + if(active_docking_controller && active_docking_controller.docking_codes) + set_docking_codes(active_docking_controller.docking_codes) diff --git a/code/modules/shuttles/shuttle_supply.dm b/code/modules/shuttles/shuttle_supply.dm index 53286ac949..a51fe50d56 100644 --- a/code/modules/shuttles/shuttle_supply.dm +++ b/code/modules/shuttles/shuttle_supply.dm @@ -13,6 +13,13 @@ if(isnull(location)) return + // Set the supply shuttle displays to read out the ETA + var/datum/signal/S = new() + S.source = src + S.data = list("command" = "supply") + var/datum/radio_frequency/F = radio_controller.return_frequency(1435) + F.post_signal(src, S) + //it would be cool to play a sound here moving_status = SHUTTLE_WARMUP spawn(warmup_time*10) @@ -31,7 +38,7 @@ return if (!at_station()) //at centcom - supply_controller.buy() + SSsupply.buy() //We pretend it's a long_jump by making the shuttle stay at centcom for the "in-transit" period. var/obj/effect/shuttle_landmark/away_waypoint = get_location_waypoint(away_location) @@ -42,7 +49,7 @@ attempt_move(away_waypoint) //wait ETA here. - arrive_time = world.time + supply_controller.movetime + arrive_time = world.time + SSsupply.movetime while (world.time <= arrive_time) sleep(5) @@ -57,7 +64,7 @@ make_sounds(HYPERSPACE_END) if (!at_station()) //at centcom - supply_controller.sell() + SSsupply.sell() // returns 1 if the supply shuttle should be prevented from moving because it contains forbidden atoms /datum/shuttle/autodock/ferry/supply/proc/forbidden_atoms_check() @@ -65,7 +72,7 @@ return 0 //if badmins want to send mobs or a nuke on the supply shuttle from centcom we don't care for(var/area/A in shuttle_area) - if(supply_controller.forbidden_atoms_check(A)) + if(SSsupply.forbidden_atoms_check(A)) return 1 /datum/shuttle/autodock/ferry/supply/proc/at_station() @@ -77,11 +84,8 @@ //returns the ETA in minutes /datum/shuttle/autodock/ferry/supply/proc/eta_minutes() - var/ticksleft = arrive_time - world.time - return round(ticksleft/600,1) + return round((arrive_time - world.time) / (1 MINUTE), 1) // Floor, so it's an actual timer -// Read the docking codes off of the target to make sure we can always dock. -/datum/shuttle/autodock/ferry/supply/update_docking_target(var/obj/effect/shuttle_landmark/location) - ..() - if(active_docking_controller && active_docking_controller.docking_codes) - set_docking_codes(active_docking_controller.docking_codes) +// returns the ETA in seconds +/datum/shuttle/autodock/ferry/supply/proc/eta_seconds() + return round((arrive_time - world.time) / (1 SECOND)) // Floor, so it's an actual timer diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index c994d6259c..6a48eb198d 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -31,21 +31,21 @@ /datum/surgery_step/glue_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) if (affected.stage == 0) - user.visible_message("[user] starts applying medication to the damaged bones in [target]'s [affected.name] with \the [tool]." , \ - "You start applying medication to the damaged bones in [target]'s [affected.name] with \the [tool].") + user.visible_message("[user] starts applying medication to the damaged bones in [target]'s [affected.name] with \the [tool]." , \ + "You start applying medication to the damaged bones in [target]'s [affected.name] with \the [tool].") target.custom_pain("Something in your [affected.name] is causing you a lot of pain!", 50) ..() /datum/surgery_step/glue_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] applies some [tool] to [target]'s bone in [affected.name]", \ - "You apply some [tool] to [target]'s bone in [affected.name] with \the [tool].") + user.visible_message("[user] applies some [tool] to [target]'s bone in [affected.name]", \ + "You apply some [tool] to [target]'s bone in [affected.name] with \the [tool].") affected.stage = 1 /datum/surgery_step/glue_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \ - "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!") + user.visible_message("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \ + "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!") /////////////////////////////////////////////////////////////// // Bone Setting Surgery @@ -71,26 +71,26 @@ /datum/surgery_step/set_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] is beginning to set the bone in [target]'s [affected.name] in place with \the [tool]." , \ - "You are beginning to set the bone in [target]'s [affected.name] in place with \the [tool].") + user.visible_message("[user] is beginning to set the bone in [target]'s [affected.name] in place with \the [tool]." , \ + "You are beginning to set the bone in [target]'s [affected.name] in place with \the [tool].") target.custom_pain("The pain in your [affected.name] is going to make you pass out!", 50) ..() /datum/surgery_step/set_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) if (affected.status & ORGAN_BROKEN) - user.visible_message("[user] sets the bone in [target]'s [affected.name] in place with \the [tool].", \ - "You set the bone in [target]'s [affected.name] in place with \the [tool].") + user.visible_message("[user] sets the bone in [target]'s [affected.name] in place with \the [tool].", \ + "You set the bone in [target]'s [affected.name] in place with \the [tool].") affected.stage = 2 else - user.visible_message("[user] sets the bone in [target]'s [affected.name] in the WRONG place with \the [tool].", \ - "You set the bone in [target]'s [affected.name] in the WRONG place with \the [tool].") + user.visible_message("[user] sets the bone in [target]'s [affected.name] in the WRONG place with \the [tool].", \ + "You set the bone in [target]'s [affected.name] in the WRONG place with \the [tool].") affected.fracture() /datum/surgery_step/set_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!" , \ - "Your hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!") + user.visible_message("[user]'s hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!" , \ + "Your hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!") affected.createwound(BRUISE, 5) /////////////////////////////////////////////////////////////// @@ -116,20 +116,20 @@ return affected && affected.organ_tag == BP_HEAD && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1 /datum/surgery_step/mend_skull/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] is beginning to piece together [target]'s skull with \the [tool]." , \ - "You are beginning to piece together [target]'s skull with \the [tool].") + user.visible_message("[user] is beginning to piece together [target]'s skull with \the [tool]." , \ + "You are beginning to piece together [target]'s skull with \the [tool].") ..() /datum/surgery_step/mend_skull/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] sets [target]'s skull with \the [tool]." , \ - "You set [target]'s skull with \the [tool].") + user.visible_message("[user] sets [target]'s skull with \the [tool]." , \ + "You set [target]'s skull with \the [tool].") affected.stage = 2 /datum/surgery_step/mend_skull/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, damaging [target]'s face with \the [tool]!" , \ - "Your hand slips, damaging [target]'s face with \the [tool]!") + user.visible_message("[user]'s hand slips, damaging [target]'s face with \the [tool]!" , \ + "Your hand slips, damaging [target]'s face with \the [tool]!") var/obj/item/organ/external/head/h = affected h.createwound(BRUISE, 10) h.disfigured = 1 @@ -161,21 +161,21 @@ /datum/surgery_step/finish_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] starts to finish mending the damaged bones in [target]'s [affected.name] with \the [tool].", \ - "You start to finish mending the damaged bones in [target]'s [affected.name] with \the [tool].") + user.visible_message("[user] starts to finish mending the damaged bones in [target]'s [affected.name] with \the [tool].", \ + "You start to finish mending the damaged bones in [target]'s [affected.name] with \the [tool].") ..() /datum/surgery_step/finish_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] has mended the damaged bones in [target]'s [affected.name] with \the [tool]." , \ - "You have mended the damaged bones in [target]'s [affected.name] with \the [tool]." ) + user.visible_message("[user] has mended the damaged bones in [target]'s [affected.name] with \the [tool]." , \ + "You have mended the damaged bones in [target]'s [affected.name] with \the [tool]." ) affected.status &= ~ORGAN_BROKEN affected.stage = 0 /datum/surgery_step/finish_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \ - "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!") + user.visible_message("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \ + "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!") /////////////////////////////////////////////////////////////// // Bone Clamp Surgery @@ -203,19 +203,19 @@ /datum/surgery_step/clamp_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) if (affected.stage == 0) - user.visible_message("[user] starts repairing the damaged bones in [target]'s [affected.name] with \the [tool]." , \ - "You starts repairing the damaged bones in [target]'s [affected.name] with \the [tool].") + user.visible_message("[user] starts repairing the damaged bones in [target]'s [affected.name] with \the [tool]." , \ + "You starts repairing the damaged bones in [target]'s [affected.name] with \the [tool].") target.custom_pain("Something in your [affected.name] is causing you a lot of pain!", 50) ..() /datum/surgery_step/clamp_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] sets the bone in [target]'s [affected.name] with \the [tool].", \ - "You sets [target]'s bone in [affected.name] with \the [tool].") + user.visible_message("[user] sets the bone in [target]'s [affected.name] with \the [tool].", \ + "You sets [target]'s bone in [affected.name] with \the [tool].") affected.status &= ~ORGAN_BROKEN /datum/surgery_step/clamp_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!" , \ - "Your hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!") + user.visible_message("[user]'s hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!" , \ + "Your hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!") affected.createwound(BRUISE, 5) \ No newline at end of file diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm index 6111e56fc8..d69c456f7c 100644 --- a/code/modules/surgery/encased.dm +++ b/code/modules/surgery/encased.dm @@ -50,8 +50,8 @@ return var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] has cut [target]'s [affected.encased] open with \the [tool].", \ - "You have cut [target]'s [affected.encased] open with \the [tool].") + user.visible_message("[user] has cut [target]'s [affected.encased] open with \the [tool].", \ + "You have cut [target]'s [affected.encased] open with \the [tool].") affected.open = 2.5 /datum/surgery_step/open_encased/saw/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -59,8 +59,8 @@ return var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, cracking [target]'s [affected.encased] with \the [tool]!" , \ - "Your hand slips, cracking [target]'s [affected.encased] with \the [tool]!" ) + user.visible_message("[user]'s hand slips, cracking [target]'s [affected.encased] with \the [tool]!" , \ + "Your hand slips, cracking [target]'s [affected.encased] with \the [tool]!" ) affected.createwound(CUT, 20) affected.fracture() @@ -100,8 +100,8 @@ if (!hasorgans(target)) return var/obj/item/organ/external/affected = target.get_organ(target_zone) - var/msg = "[user] forces open [target]'s [affected.encased] with \the [tool]." - var/self_msg = "You force open [target]'s [affected.encased] with \the [tool]." + var/msg = "[user] forces open [target]'s [affected.encased] with \the [tool]." + var/self_msg = "You force open [target]'s [affected.encased] with \the [tool]." user.visible_message(msg, self_msg) affected.open = 3 @@ -111,8 +111,8 @@ return var/obj/item/organ/external/affected = target.get_organ(target_zone) - var/msg = "[user]'s hand slips, cracking [target]'s [affected.encased]!" - var/self_msg = "Your hand slips, cracking [target]'s [affected.encased]!" + var/msg = "[user]'s hand slips, cracking [target]'s [affected.encased]!" + var/self_msg = "Your hand slips, cracking [target]'s [affected.encased]!" user.visible_message(msg, self_msg) affected.createwound(BRUISE, 20) @@ -154,8 +154,8 @@ return var/obj/item/organ/external/affected = target.get_organ(target_zone) - var/msg = "[user] bends [target]'s [affected.encased] back into place with \the [tool]." - var/self_msg = "You bend [target]'s [affected.encased] back into place with \the [tool]." + var/msg = "[user] bends [target]'s [affected.encased] back into place with \the [tool]." + var/self_msg = "You bend [target]'s [affected.encased] back into place with \the [tool]." user.visible_message(msg, self_msg) affected.open = 2.5 @@ -165,15 +165,15 @@ return var/obj/item/organ/external/affected = target.get_organ(target_zone) - var/msg = "[user]'s hand slips, bending [target]'s [affected.encased] the wrong way!" - var/self_msg = "Your hand slips, bending [target]'s [affected.encased] the wrong way!" + var/msg = "[user]'s hand slips, bending [target]'s [affected.encased] the wrong way!" + var/self_msg = "Your hand slips, bending [target]'s [affected.encased] the wrong way!" user.visible_message(msg, self_msg) affected.createwound(BRUISE, 20) affected.fracture() /*if (prob(40)) //TODO: ORGAN REMOVAL UPDATE. - user.visible_message(" A rib pierces the lung!") + user.visible_message(" A rib pierces the lung!") target.rupture_lung()*/ /////////////////////////////////////////////////////////////// @@ -212,8 +212,8 @@ return var/obj/item/organ/external/affected = target.get_organ(target_zone) - var/msg = "[user] applied \the [tool] to [target]'s [affected.encased]." - var/self_msg = "You applied \the [tool] to [target]'s [affected.encased]." + var/msg = "[user] applied \the [tool] to [target]'s [affected.encased]." + var/self_msg = "You applied \the [tool] to [target]'s [affected.encased]." user.visible_message(msg, self_msg) affected.open = 2 @@ -252,8 +252,8 @@ return var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] has cut [target]'s [affected.encased] wide open with \the [tool].", \ - "You have cut [target]'s [affected.encased] wide open with \the [tool].") + user.visible_message("[user] has cut [target]'s [affected.encased] wide open with \the [tool].", \ + "You have cut [target]'s [affected.encased] wide open with \the [tool].") affected.open = 3 /datum/surgery_step/open_encased/advancedsaw_open/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -261,8 +261,8 @@ return var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, searing [target]'s [affected.encased] with \the [tool]!" , \ - "Your hand slips, searing [target]'s [affected.encased] with \the [tool]!" ) + user.visible_message("[user]'s hand slips, searing [target]'s [affected.encased] with \the [tool]!" , \ + "Your hand slips, searing [target]'s [affected.encased] with \the [tool]!" ) affected.createwound(CUT, 20) affected.createwound(BURN, 15) @@ -302,8 +302,8 @@ return var/obj/item/organ/external/affected = target.get_organ(target_zone) - var/msg = "[user] sealed \the [target]'s [affected.encased] with \the [tool]." - var/self_msg = "You sealed \the [target]'s [affected.encased] with \the [tool]." + var/msg = "[user] sealed \the [target]'s [affected.encased] with \the [tool]." + var/self_msg = "You sealed \the [target]'s [affected.encased] with \the [tool]." user.visible_message(msg, self_msg) affected.open = 2 diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm index f871d84ec2..b670497fc9 100644 --- a/code/modules/surgery/face.dm +++ b/code/modules/surgery/face.dm @@ -41,14 +41,14 @@ ..() /datum/surgery_step/generic/cut_face/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] has cut open [target]'s face and neck with \the [tool]." , \ - " You have cut open[target]'s face and neck with \the [tool].",) + user.visible_message("[user] has cut open [target]'s face and neck with \the [tool]." , \ + " You have cut open[target]'s face and neck with \the [tool].",) target.op_stage.face = 1 /datum/surgery_step/generic/cut_face/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, slicing [target]'s throat wth \the [tool]!" , \ - "Your hand slips, slicing [target]'s throat wth \the [tool]!" ) + user.visible_message("[user]'s hand slips, slicing [target]'s throat wth \the [tool]!" , \ + "Your hand slips, slicing [target]'s throat wth \the [tool]!" ) affected.createwound(CUT, 60) target.AdjustLosebreath(10) @@ -75,13 +75,13 @@ ..() /datum/surgery_step/face/mend_vocal/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] mends [target]'s vocal cords with \the [tool].", \ - "You mend [target]'s vocal cords with \the [tool].") + user.visible_message("[user] mends [target]'s vocal cords with \the [tool].", \ + "You mend [target]'s vocal cords with \the [tool].") target.op_stage.face = 2 /datum/surgery_step/face/mend_vocal/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user]'s hand slips, clamping [target]'s trachea shut for a moment with \the [tool]!", \ - "Your hand slips, clamping [user]'s trachea shut for a moment with \the [tool]!") + user.visible_message("[user]'s hand slips, clamping [target]'s trachea shut for a moment with \the [tool]!", \ + "Your hand slips, clamping [user]'s trachea shut for a moment with \the [tool]!") target.AdjustLosebreath(10) /////////////////////////////////////////////////////////////// @@ -108,14 +108,14 @@ ..() /datum/surgery_step/face/fix_face/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] pulls the skin on [target]'s face back in place with \the [tool].", \ - "You pull the skin on [target]'s face back in place with \the [tool].") + user.visible_message("[user] pulls the skin on [target]'s face back in place with \the [tool].", \ + "You pull the skin on [target]'s face back in place with \the [tool].") target.op_stage.face = 3 /datum/surgery_step/face/fix_face/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, tearing skin on [target]'s face with \the [tool]!", \ - "Your hand slips, tearing skin on [target]'s face with \the [tool]!") + user.visible_message("[user]'s hand slips, tearing skin on [target]'s face with \the [tool]!", \ + "Your hand slips, tearing skin on [target]'s face with \the [tool]!") target.apply_damage(10, BRUTE, affected, sharp=1, sharp=1) /////////////////////////////////////////////////////////////// @@ -137,14 +137,14 @@ return ..() && target.op_stage.face > 0 /datum/surgery_step/face/cauterize/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] is beginning to cauterize the incision on [target]'s face and neck with \the [tool]." , \ - "You are beginning to cauterize the incision on [target]'s face and neck with \the [tool].") + user.visible_message("[user] is beginning to cauterize the incision on [target]'s face and neck with \the [tool]." , \ + "You are beginning to cauterize the incision on [target]'s face and neck with \the [tool].") ..() /datum/surgery_step/face/cauterize/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] cauterizes the incision on [target]'s face and neck with \the [tool].", \ - "You cauterize the incision on [target]'s face and neck with \the [tool].") + user.visible_message("[user] cauterizes the incision on [target]'s face and neck with \the [tool].", \ + "You cauterize the incision on [target]'s face and neck with \the [tool].") affected.open = 0 affected.status &= ~ORGAN_BLEEDING if (target.op_stage.face == 3) @@ -154,6 +154,6 @@ /datum/surgery_step/face/cauterize/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, leaving a small burn on [target]'s face with \the [tool]!", \ - "Your hand slips, leaving a small burn on [target]'s face with \the [tool]!") + user.visible_message("[user]'s hand slips, leaving a small burn on [target]'s face with \the [tool]!", \ + "Your hand slips, leaving a small burn on [target]'s face with \the [tool]!") target.apply_damage(4, BURN, affected) \ No newline at end of file diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index 556b616cf5..a5ccd15050 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -53,8 +53,8 @@ /datum/surgery_step/generic/cut_open/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] has made an incision on [target]'s [affected.name] with \the [tool].", \ - "You have made an incision on [target]'s [affected.name] with \the [tool].",) + user.visible_message("[user] has made an incision on [target]'s [affected.name] with \the [tool].", \ + "You have made an incision on [target]'s [affected.name] with \the [tool].",) affected.open = 1 if(istype(target) && target.should_have_organ(O_HEART)) @@ -64,8 +64,8 @@ /datum/surgery_step/generic/cut_open/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, slicing open [target]'s [affected.name] in the wrong place with \the [tool]!", \ - "Your hand slips, slicing open [target]'s [affected.name] in the wrong place with \the [tool]!") + user.visible_message("[user]'s hand slips, slicing open [target]'s [affected.name] in the wrong place with \the [tool]!", \ + "Your hand slips, slicing open [target]'s [affected.name] in the wrong place with \the [tool]!") affected.createwound(CUT, 10) /////////////////////////////////////////////////////////////// @@ -98,8 +98,8 @@ /datum/surgery_step/generic/cut_with_laser/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] has made a bloodless incision on [target]'s [affected.name] with \the [tool].", \ - "You have made a bloodless incision on [target]'s [affected.name] with \the [tool].",) + user.visible_message("[user] has made a bloodless incision on [target]'s [affected.name] with \the [tool].", \ + "You have made a bloodless incision on [target]'s [affected.name] with \the [tool].",) //Could be cleaner ... affected.open = 1 @@ -109,8 +109,8 @@ /datum/surgery_step/generic/cut_with_laser/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips as the blade sputters, searing a long gash in [target]'s [affected.name] with \the [tool]!", \ - "Your hand slips as the blade sputters, searing a long gash in [target]'s [affected.name] with \the [tool]!") + user.visible_message("[user]'s hand slips as the blade sputters, searing a long gash in [target]'s [affected.name] with \the [tool]!", \ + "Your hand slips as the blade sputters, searing a long gash in [target]'s [affected.name] with \the [tool]!") affected.createwound(CUT, 7.5) affected.createwound(BURN, 12.5) @@ -142,8 +142,8 @@ /datum/surgery_step/generic/incision_manager/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] has constructed a prepared incision on and within [target]'s [affected.name] with \the [tool].", \ - "You have constructed a prepared incision on and within [target]'s [affected.name] with \the [tool].",) + user.visible_message("[user] has constructed a prepared incision on and within [target]'s [affected.name] with \the [tool].", \ + "You have constructed a prepared incision on and within [target]'s [affected.name] with \the [tool].",) affected.open = 1 if(istype(target) && target.should_have_organ(O_HEART)) @@ -155,8 +155,8 @@ /datum/surgery_step/generic/incision_manager/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand jolts as the system sparks, ripping a gruesome hole in [target]'s [affected.name] with \the [tool]!", \ - "Your hand jolts as the system sparks, ripping a gruesome hole in [target]'s [affected.name] with \the [tool]!") + user.visible_message("[user]'s hand jolts as the system sparks, ripping a gruesome hole in [target]'s [affected.name] with \the [tool]!", \ + "Your hand jolts as the system sparks, ripping a gruesome hole in [target]'s [affected.name] with \the [tool]!") affected.createwound(CUT, 20) affected.createwound(BURN, 15) @@ -188,15 +188,15 @@ /datum/surgery_step/generic/clamp_bleeders/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] clamps bleeders in [target]'s [affected.name] with \the [tool].", \ - "You clamp bleeders in [target]'s [affected.name] with \the [tool].") + user.visible_message("[user] clamps bleeders in [target]'s [affected.name] with \the [tool].", \ + "You clamp bleeders in [target]'s [affected.name] with \the [tool].") affected.organ_clamp() spread_germs_to_organ(affected, user) /datum/surgery_step/generic/clamp_bleeders/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, tearing blood vessals and causing massive bleeding in [target]'s [affected.name] with \the [tool]!", \ - "Your hand slips, tearing blood vessels and causing massive bleeding in [target]'s [affected.name] with \the [tool]!",) + user.visible_message("[user]'s hand slips, tearing blood vessals and causing massive bleeding in [target]'s [affected.name] with \the [tool]!", \ + "Your hand slips, tearing blood vessels and causing massive bleeding in [target]'s [affected.name] with \the [tool]!",) affected.createwound(CUT, 10) /////////////////////////////////////////////////////////////// @@ -235,27 +235,27 @@ /datum/surgery_step/generic/retract_skin/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - var/msg = "[user] keeps the incision open on [target]'s [affected.name] with \the [tool]." - var/self_msg = "You keep the incision open on [target]'s [affected.name] with \the [tool]." + var/msg = "[user] keeps the incision open on [target]'s [affected.name] with \the [tool]." + var/self_msg = "You keep the incision open on [target]'s [affected.name] with \the [tool]." if (target_zone == BP_TORSO) - msg = "[user] keeps the ribcage open on [target]'s torso with \the [tool]." - self_msg = "You keep the ribcage open on [target]'s torso with \the [tool]." + msg = "[user] keeps the ribcage open on [target]'s torso with \the [tool]." + self_msg = "You keep the ribcage open on [target]'s torso with \the [tool]." if (target_zone == BP_GROIN) - msg = "[user] keeps the incision open on [target]'s lower abdomen with \the [tool]." - self_msg = "You keep the incision open on [target]'s lower abdomen with \the [tool]." + msg = "[user] keeps the incision open on [target]'s lower abdomen with \the [tool]." + self_msg = "You keep the incision open on [target]'s lower abdomen with \the [tool]." user.visible_message(msg, self_msg) affected.open = 2 /datum/surgery_step/generic/retract_skin/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - var/msg = "[user]'s hand slips, tearing the edges of the incision on [target]'s [affected.name] with \the [tool]!" - var/self_msg = "Your hand slips, tearing the edges of the incision on [target]'s [affected.name] with \the [tool]!" + var/msg = "[user]'s hand slips, tearing the edges of the incision on [target]'s [affected.name] with \the [tool]!" + var/self_msg = "Your hand slips, tearing the edges of the incision on [target]'s [affected.name] with \the [tool]!" if (target_zone == BP_TORSO) - msg = "[user]'s hand slips, damaging several organs in [target]'s torso with \the [tool]!" - self_msg = "Your hand slips, damaging several organs in [target]'s torso with \the [tool]!" + msg = "[user]'s hand slips, damaging several organs in [target]'s torso with \the [tool]!" + self_msg = "Your hand slips, damaging several organs in [target]'s torso with \the [tool]!" if (target_zone == BP_GROIN) - msg = "[user]'s hand slips, damaging several organs in [target]'s lower abdomen with \the [tool]!" - self_msg = "Your hand slips, damaging several organs in [target]'s lower abdomen with \the [tool]!" + msg = "[user]'s hand slips, damaging several organs in [target]'s lower abdomen with \the [tool]!" + self_msg = "Your hand slips, damaging several organs in [target]'s lower abdomen with \the [tool]!" user.visible_message(msg, self_msg) target.apply_damage(12, BRUTE, affected, sharp=1) @@ -288,16 +288,16 @@ /datum/surgery_step/generic/cauterize/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] cauterizes the incision on [target]'s [affected.name] with \the [tool].", \ - "You cauterize the incision on [target]'s [affected.name] with \the [tool].") + user.visible_message("[user] cauterizes the incision on [target]'s [affected.name] with \the [tool].", \ + "You cauterize the incision on [target]'s [affected.name] with \the [tool].") affected.open = 0 affected.germ_level = 0 affected.status &= ~ORGAN_BLEEDING /datum/surgery_step/generic/cauterize/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, leaving a small burn on [target]'s [affected.name] with \the [tool]!", \ - "Your hand slips, leaving a small burn on [target]'s [affected.name] with \the [tool]!") + user.visible_message("[user]'s hand slips, leaving a small burn on [target]'s [affected.name] with \the [tool]!", \ + "Your hand slips, leaving a small burn on [target]'s [affected.name] with \the [tool]!") target.apply_damage(3, BURN, affected) /////////////////////////////////////////////////////////////// @@ -333,13 +333,13 @@ /datum/surgery_step/generic/amputate/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] amputates [target]'s [affected.name] at the [affected.amputation_point] with \the [tool].", \ - "You amputate [target]'s [affected.name] with \the [tool].") + user.visible_message("[user] amputates [target]'s [affected.name] at the [affected.amputation_point] with \the [tool].", \ + "You amputate [target]'s [affected.name] with \the [tool].") affected.droplimb(1,DROPLIMB_EDGE) /datum/surgery_step/generic/amputate/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, sawing through the bone in [target]'s [affected.name] with \the [tool]!", \ - "Your hand slips, sawwing through the bone in [target]'s [affected.name] with \the [tool]!") + user.visible_message("[user]'s hand slips, sawing through the bone in [target]'s [affected.name] with \the [tool]!", \ + "Your hand slips, sawwing through the bone in [target]'s [affected.name] with \the [tool]!") affected.createwound(CUT, 30) affected.fracture() diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index b8341ed155..01b5bb276b 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -37,8 +37,8 @@ /datum/surgery_step/cavity/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/chest/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!", \ - "Your hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!") + user.visible_message("[user]'s hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!", \ + "Your hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!") affected.createwound(CUT, 20) /////////////////////////////////////////////////////////////// @@ -70,8 +70,8 @@ /datum/surgery_step/cavity/make_space/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/chest/affected = target.get_organ(target_zone) - user.visible_message("[user] makes some space inside [target]'s [get_cavity(affected)] cavity with \the [tool].", \ - "You make some space inside [target]'s [get_cavity(affected)] cavity with \the [tool]." ) + user.visible_message("[user] makes some space inside [target]'s [get_cavity(affected)] cavity with \the [tool].", \ + "You make some space inside [target]'s [get_cavity(affected)] cavity with \the [tool]." ) /////////////////////////////////////////////////////////////// // Cavity Closing Surgery @@ -104,8 +104,8 @@ /datum/surgery_step/cavity/close_space/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/chest/affected = target.get_organ(target_zone) - user.visible_message("[user] mends [target]'s [get_cavity(affected)] cavity walls with \the [tool].", \ - " You mend[target]'s [get_cavity(affected)] cavity walls with \the [tool]." ) + user.visible_message("[user] mends [target]'s [get_cavity(affected)] cavity walls with \the [tool].", \ + " You mend[target]'s [get_cavity(affected)] cavity walls with \the [tool]." ) /////////////////////////////////////////////////////////////// // Item Implantation Surgery @@ -133,18 +133,18 @@ /datum/surgery_step/cavity/place_item/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] starts putting \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ - "You start putting \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) //Nobody will probably ever see this, but I made these two blue. ~CK + user.visible_message("[user] starts putting \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ + "You start putting \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) //Nobody will probably ever see this, but I made these two blue. ~CK target.custom_pain("The pain in your chest is living hell!",1) ..() /datum/surgery_step/cavity/place_item/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/chest/affected = target.get_organ(target_zone) - user.visible_message("[user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ - "You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) + user.visible_message("[user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ + "You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) if (tool.w_class > get_max_wclass(affected)/2 && prob(50) && (affected.robotic < ORGAN_ROBOT)) - to_chat(user, " You tear some blood vessels trying to fit such a big object in this cavity.") + to_chat(user, " You tear some blood vessels trying to fit such a big object in this cavity.") var/datum/wound/internal_bleeding/I = new (10) affected.wounds += I affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1) @@ -178,8 +178,8 @@ /datum/surgery_step/cavity/implant_removal/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] starts poking around inside [target]'s [affected.name] with \the [tool].", \ - "You start poking around inside [target]'s [affected.name] with \the [tool]." ) + user.visible_message("[user] starts poking around inside [target]'s [affected.name] with \the [tool].", \ + "You start poking around inside [target]'s [affected.name] with \the [tool]." ) target.custom_pain("The pain in your [affected.name] is living hell!",1) ..() @@ -202,8 +202,8 @@ find_prob +=50 if (prob(find_prob)) - user.visible_message("[user] takes something out of incision on [target]'s [affected.name] with \the [tool]!", \ - "You take [obj] out of incision on [target]'s [affected.name]s with \the [tool]!" ) + user.visible_message("[user] takes something out of incision on [target]'s [affected.name] with \the [tool]!", \ + "You take [obj] out of incision on [target]'s [affected.name]s with \the [tool]!" ) affected.implants -= obj BITSET(target.hud_updateflag, IMPLOYAL_HUD) @@ -224,11 +224,11 @@ imp.imp_in = null imp.implanted = 0 else - user.visible_message("[user] removes \the [tool] from [target]'s [affected.name].", \ - "There's something inside [target]'s [affected.name], but you just missed it this time." ) + user.visible_message("[user] removes \the [tool] from [target]'s [affected.name].", \ + "There's something inside [target]'s [affected.name], but you just missed it this time." ) else - user.visible_message("[user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out.", \ - "You could not find anything inside [target]'s [affected.name]." ) + user.visible_message("[user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out.", \ + "You could not find anything inside [target]'s [affected.name]." ) /datum/surgery_step/cavity/implant_removal/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) ..() @@ -238,7 +238,7 @@ fail_prob += 100 - tool_quality(tool) if (prob(fail_prob)) var/obj/item/weapon/implant/imp = affected.implants[1] - user.visible_message(" Something beeps inside [target]'s [affected.name]!") + user.visible_message(" Something beeps inside [target]'s [affected.name]!") playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3) spawn(25) imp.activate() diff --git a/code/modules/surgery/neck.dm b/code/modules/surgery/neck.dm index 88d5053afe..6b970ad4c2 100644 --- a/code/modules/surgery/neck.dm +++ b/code/modules/surgery/neck.dm @@ -41,14 +41,14 @@ ..() /datum/surgery_step/brainstem/mend_vessels/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] has mended the blood vessels on [target]'s brainstem with \the [tool]." , \ - " You have mended the blood vessels on [target]'s brainstem with \the [tool].",) + user.visible_message("[user] has mended the blood vessels on [target]'s brainstem with \the [tool]." , \ + " You have mended the blood vessels on [target]'s brainstem with \the [tool].",) target.op_stage.brainstem = 1 /datum/surgery_step/brainstem/mend_vessels/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, tearing at [target]'s brainstem with \the [tool]!" , \ - "Your hand slips, tearing at [target]'s brainstem with \the [tool]!" ) + user.visible_message("[user]'s hand slips, tearing at [target]'s brainstem with \the [tool]!" , \ + "Your hand slips, tearing at [target]'s brainstem with \the [tool]!" ) affected.createwound(PIERCE, 10) target.AdjustParalysis(10) @@ -79,16 +79,16 @@ /datum/surgery_step/brainstem/drill_vertebrae/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] has drilled around [target]'s brainstem with \the [tool]." , \ - " You have drilled around [target]'s brainstem with \the [tool].",) + user.visible_message("[user] has drilled around [target]'s brainstem with \the [tool]." , \ + " You have drilled around [target]'s brainstem with \the [tool].",) target.AdjustParalysis(10) //We're getting Invasive here. This only ticks down when the person is alive, so it's a good side-effect for this step. Rattling the braincase with a drill is not optimal. target.op_stage.brainstem = 2 affected.fracture() //Does not apply damage, simply breaks it if it wasn't already. Doesn't stop a defib on its own. /datum/surgery_step/brainstem/drill_vertebrae/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, shredding [target]'s brainstem with \the [tool]!" , \ - "Your hand slips, shredding [target]'s brainstem with \the [tool]!" ) + user.visible_message("[user]'s hand slips, shredding [target]'s brainstem with \the [tool]!" , \ + "Your hand slips, shredding [target]'s brainstem with \the [tool]!" ) affected.createwound(PIERCE, 10) target.AdjustParalysis(15) spawn() @@ -119,15 +119,15 @@ ..() /datum/surgery_step/brainstem/clean_chips/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] has cleaned around [target]'s brainstem with \the [tool]." , \ - " You have cleaned around [target]'s brainstem with \the [tool].",) + user.visible_message("[user] has cleaned around [target]'s brainstem with \the [tool]." , \ + " You have cleaned around [target]'s brainstem with \the [tool].",) target.AdjustParalysis(10) //Still invasive. target.op_stage.brainstem = 3 /datum/surgery_step/brainstem/clean_chips/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, gouging [target]'s brainstem with \the [tool]!" , \ - "Your hand slips, gouging [target]'s brainstem with \the [tool]!" ) + user.visible_message("[user]'s hand slips, gouging [target]'s brainstem with \the [tool]!" , \ + "Your hand slips, gouging [target]'s brainstem with \the [tool]!" ) affected.createwound(CUT, 5) target.AdjustParalysis(10) spawn() @@ -158,16 +158,16 @@ ..() /datum/surgery_step/brainstem/mend_cord/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] has fused [target]'s spinal cord with \the [tool]." , \ - " You have fused [target]'s spinal cord with \the [tool].",) + user.visible_message("[user] has fused [target]'s spinal cord with \the [tool]." , \ + " You have fused [target]'s spinal cord with \the [tool].",) target.op_stage.brainstem = 4 target.AdjustParalysis(5) target.add_modifier(/datum/modifier/franken_sickness, 20 MINUTES) /datum/surgery_step/brainstem/mend_cord/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, tearing at [target]'s spinal cord with \the [tool]!" , \ - "Your hand slips, tearing at [target]'s spinal cord with \the [tool]!" ) + user.visible_message("[user]'s hand slips, tearing at [target]'s spinal cord with \the [tool]!" , \ + "Your hand slips, tearing at [target]'s spinal cord with \the [tool]!" ) affected.createwound(PIERCE, 5) target.AdjustParalysis(20) spawn() @@ -197,15 +197,15 @@ ..() /datum/surgery_step/brainstem/mend_vertebrae/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] has mended [target]'s vertebrae with \the [tool]." , \ - " You have mended [target]'s vertebrae with \the [tool].",) + user.visible_message("[user] has mended [target]'s vertebrae with \the [tool]." , \ + " You have mended [target]'s vertebrae with \the [tool].",) target.can_defib = 1 target.op_stage.brainstem = 5 /datum/surgery_step/brainstem/mend_vertebrae/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, tearing at [target]'s spinal cord with \the [tool]!" , \ - "Your hand slips, tearing at [target]'s spinal cord with \the [tool]!" ) + user.visible_message("[user]'s hand slips, tearing at [target]'s spinal cord with \the [tool]!" , \ + "Your hand slips, tearing at [target]'s spinal cord with \the [tool]!" ) affected.createwound(PIERCE, 5) target.AdjustParalysis(15) spawn() @@ -236,15 +236,15 @@ ..() /datum/surgery_step/brainstem/realign_tissue/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] has realigned the tissues in [target]'s skull back into place with \the [tool]." , \ - " You have realigned the tissues in [target]'s skull back into place with \the [tool].",) + user.visible_message("[user] has realigned the tissues in [target]'s skull back into place with \the [tool]." , \ + " You have realigned the tissues in [target]'s skull back into place with \the [tool].",) target.AdjustParalysis(5) //I n v a s i v e target.op_stage.brainstem = 0 //The cycle begins anew. /datum/surgery_step/brainstem/realign_tissue/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, gouging [target]'s brainstem with \the [tool]!" , \ - "Your hand slips, gouging [target]'s brainstem with \the [tool]!" ) + user.visible_message("[user]'s hand slips, gouging [target]'s brainstem with \the [tool]!" , \ + "Your hand slips, gouging [target]'s brainstem with \the [tool]!" ) affected.createwound(CUT, 5) target.AdjustParalysis(30) spawn() diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index b6ec121adf..fe7d004dc4 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -43,8 +43,8 @@ /datum/surgery_step/fix_vein/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] has patched the damaged vein in [target]'s [affected.name] with \the [tool].", \ - "You have patched the damaged vein in [target]'s [affected.name] with \the [tool].") + user.visible_message("[user] has patched the damaged vein in [target]'s [affected.name] with \the [tool].", \ + "You have patched the damaged vein in [target]'s [affected.name] with \the [tool].") for(var/datum/wound/W in affected.wounds) if(W.internal) affected.wounds -= W @@ -53,8 +53,8 @@ /datum/surgery_step/fix_vein/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \ - "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!") + user.visible_message("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \ + "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!") affected.take_damage(5, 0) /////////////////////////////////////////////////////////////// @@ -96,14 +96,14 @@ /datum/surgery_step/fix_dead_tissue/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] has cut away necrotic tissue in [target]'s [affected.name] with \the [tool].", \ - "You have cut away necrotic tissue in [target]'s [affected.name] with \the [tool].") + user.visible_message("[user] has cut away necrotic tissue in [target]'s [affected.name] with \the [tool].", \ + "You have cut away necrotic tissue in [target]'s [affected.name] with \the [tool].") affected.open = 3 /datum/surgery_step/fix_dead_tissue/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user]'s hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!", \ - "Your hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!") + user.visible_message("[user]'s hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!", \ + "Your hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!") affected.createwound(CUT, 20, 1) /////////////////////////////////////////////////////////////// @@ -164,8 +164,8 @@ affected.status &= ~ORGAN_DEAD affected.owner.update_icons_body() - user.visible_message("[user] applies [trans] units of the solution to affected tissue in [target]'s [affected.name].", \ - "You apply [trans] units of the solution to affected tissue in [target]'s [affected.name] with \the [tool].") + user.visible_message("[user] applies [trans] units of the solution to affected tissue in [target]'s [affected.name].", \ + "You apply [trans] units of the solution to affected tissue in [target]'s [affected.name] with \the [tool].") /datum/surgery_step/treat_necrosis/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) @@ -177,8 +177,8 @@ var/trans = container.reagents.trans_to_mob(target, container.amount_per_transfer_from_this, CHEM_BLOOD) - user.visible_message("[user]'s hand slips, applying [trans] units of the solution to the wrong place in [target]'s [affected.name] with the [tool]!" , \ - "Your hand slips, applying [trans] units of the solution to the wrong place in [target]'s [affected.name] with the [tool]!") + user.visible_message("[user]'s hand slips, applying [trans] units of the solution to the wrong place in [target]'s [affected.name] with the [tool]!" , \ + "Your hand slips, applying [trans] units of the solution to the wrong place in [target]'s [affected.name] with the [tool]!") //no damage or anything, just wastes medicine diff --git a/code/modules/surgery/slimes.dm b/code/modules/surgery/slimes.dm index ad4c413c8e..1c2a748c38 100644 --- a/code/modules/surgery/slimes.dm +++ b/code/modules/surgery/slimes.dm @@ -28,14 +28,14 @@ user.visible_message("[user] starts cutting through [target]'s flesh with \the [tool].", \ "You start cutting through [target]'s flesh with \the [tool].") -/datum/surgery_step/slime/cut_flesh/end_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool) - user.visible_message("[user] cuts through [target]'s flesh with \the [tool].", \ - "You cut through [target]'s flesh with \the [tool], revealing its silky innards.") +/datum/surgery_step/slime/cut_flesh/end_step(mob/living/user, mob/living/simple_mob/slime/target, target_zone, obj/item/tool) + user.visible_message("[user] cuts through [target]'s flesh with \the [tool].", \ + "You cut through [target]'s flesh with \the [tool], revealing its silky innards.") target.core_removal_stage = 1 -/datum/surgery_step/slime/cut_flesh/fail_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool) - user.visible_message("[user]'s hand slips, tearing [target]'s flesh with \the [tool]!", \ - "Your hand slips, tearing [target]'s flesh with \the [tool]!") +/datum/surgery_step/slime/cut_flesh/fail_step(mob/living/user, mob/living/simple_mob/slime/target, target_zone, obj/item/tool) + user.visible_message("[user]'s hand slips, tearing [target]'s flesh with \the [tool]!", \ + "Your hand slips, tearing [target]'s flesh with \the [tool]!") @@ -56,14 +56,14 @@ user.visible_message("[user] starts cutting [target]'s silky innards apart with \the [tool].", \ "You start cutting [target]'s silky innards apart with \the [tool].") -/datum/surgery_step/slime/cut_innards/end_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool) - user.visible_message("[user] cuts [target]'s innards apart with \the [tool], exposing the cores.", \ - "You cut [target]'s innards apart with \the [tool], exposing the cores.") +/datum/surgery_step/slime/cut_innards/end_step(mob/living/user, mob/living/simple_mob/slime/target, target_zone, obj/item/tool) + user.visible_message("[user] cuts [target]'s innards apart with \the [tool], exposing the cores.", \ + "You cut [target]'s innards apart with \the [tool], exposing the cores.") target.core_removal_stage = 2 -/datum/surgery_step/slime/cut_innards/fail_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool) - user.visible_message("[user]'s hand slips, tearing [target]'s innards with \the [tool]!", \ - "Your hand slips, tearing [target]'s innards with \the [tool]!") +/datum/surgery_step/slime/cut_innards/fail_step(mob/living/user, mob/living/simple_mob/slime/target, target_zone, obj/item/tool) + user.visible_message("[user]'s hand slips, tearing [target]'s innards with \the [tool]!", \ + "Your hand slips, tearing [target]'s innards with \the [tool]!") @@ -85,8 +85,8 @@ /datum/surgery_step/slime/saw_core/end_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool) target.cores-- - user.visible_message("[user] cuts out one of [target]'s cores with \the [tool].",, \ - "You cut out one of [target]'s cores with \the [tool]. [target.cores] cores left.") + user.visible_message("[user] cuts out one of [target]'s cores with \the [tool].",, \ + "You cut out one of [target]'s cores with \the [tool]. [target.cores] cores left.") if(target.cores >= 0) new target.coretype(target.loc) @@ -96,5 +96,5 @@ /datum/surgery_step/slime/saw_core/fail_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool) var/datum/gender/T = gender_datums[user.get_visible_gender()] - user.visible_message("[user]'s hand slips, causing [T.him] to miss the core!", \ - "Your hand slips, causing you to miss the core!") \ No newline at end of file + user.visible_message("[user]'s hand slips, causing [T.him] to miss the core!", \ + "Your hand slips, causing you to miss the core!") \ No newline at end of file diff --git a/code/modules/turbolift/turbolift.dm b/code/modules/turbolift/turbolift.dm index 6b657f4d4b..46f201ab4f 100644 --- a/code/modules/turbolift/turbolift.dm +++ b/code/modules/turbolift/turbolift.dm @@ -11,7 +11,8 @@ var/doors_closing = 0 // Whether doors are in the process of closing var/tmp/moving_upwards - var/tmp/busy + var/tmp/busy_state // Used for controller processing. + var/tmp/next_process // world.time process() should next do something /datum/turbolift/proc/emergency_stop() queued_floors.Cut() @@ -38,7 +39,42 @@ door.close() return +#define LIFT_MOVING 1 // Lift will try moving. +#define LIFT_WAITING_A 2 // Waiting 15ds after arrival to announce, then goto LIFT_WAITING_B +#define LIFT_WAITING_B 3 // Waiting floor_wait_delay after announcement before potentially moving again. + +/datum/turbolift/process() + if(world.time < next_process) + return + switch(busy_state) + if(LIFT_MOVING) + if(!do_move()) + if(target_floor) + // TODO - This logic copied from old processor. Would be better to have error states. + target_floor.ext_panel.reset() + target_floor = null + return PROCESS_KILL + else if(!next_process) + log_debug("Turbolift [src] do_move() returned 1 but next_process = null; busy_state=[busy_state]") + return PROCESS_KILL + if(LIFT_WAITING_A) + var/area/turbolift/origin = locate(current_floor.area_ref) + control_panel_interior.visible_message("The elevator announces, \"[origin.lift_announce_str]\"") + next_process = world.time + floor_wait_delay + busy_state = LIFT_WAITING_B + if(LIFT_WAITING_B) + if(queued_floors.len) + busy_state = LIFT_MOVING + else + busy_state = null + return PROCESS_KILL + else + log_debug("Turbolift [src] process() called with unknown busy_state='[busy_state]'") + return PROCESS_KILL + +// Called by process when in LIFT_MOVING /datum/turbolift/proc/do_move() + next_process = null var/current_floor_index = floors.Find(current_floor) @@ -56,6 +92,7 @@ if(!doors_closing) close_doors() doors_closing = 1 + next_process = world.time + 1 SECOND // Wait for doors to close return 1 else // We failed to close the doors - probably, someone is blocking them; stop trying to move doors_closing = 0 @@ -74,10 +111,8 @@ target_floor.arrived(src) target_floor = null - sleep(15) - control_panel_interior.visible_message("The elevator announces, \"[origin.lift_announce_str]\"") - sleep(floor_wait_delay) - + next_process = world.time + 15 + busy_state = LIFT_WAITING_A return 1 // Work out where we're headed. @@ -110,15 +145,21 @@ current_floor = next_floor control_panel_interior.visible_message("The elevator [moving_upwards ? "rises" : "descends"] smoothly.") - return (next_floor.delay_time || move_delay || 30) + next_process = world.time + (next_floor.delay_time || move_delay) + return 1 /datum/turbolift/proc/queue_move_to(var/datum/turbolift_floor/floor) if(!floor || !(floor in floors) || (floor in queued_floors)) return // STOP PRESSING THE BUTTON. floor.pending_move(src) queued_floors |= floor - turbolift_controller.lift_is_moving(src) + busy_state = LIFT_MOVING + START_PROCESSING(SSprocessing, src) // TODO: dummy machine ('lift mechanism') in powered area for functionality/blackout checks. /datum/turbolift/proc/is_functional() - return 1 \ No newline at end of file + return 1 + +#undef LIFT_MOVING +#undef LIFT_WAITING_A +#undef LIFT_WAITING_B diff --git a/code/modules/turbolift/turbolift_process.dm b/code/modules/turbolift/turbolift_process.dm deleted file mode 100644 index 124049d42e..0000000000 --- a/code/modules/turbolift/turbolift_process.dm +++ /dev/null @@ -1,36 +0,0 @@ -var/datum/controller/process/turbolift/turbolift_controller - -/datum/controller/process/turbolift - var/list/moving_lifts = list() - -/datum/controller/process/turbolift/New() - ..() - turbolift_controller = src - -/datum/controller/process/turbolift/setup() - name = "turbolift controller" - schedule_interval = 10 - -/datum/controller/process/turbolift/doWork() - for(var/liftref in moving_lifts) - if(world.time < moving_lifts[liftref]) - continue - var/datum/turbolift/lift = locate(liftref) - if(lift.busy) - continue - spawn(0) - lift.busy = 1 - var/floor_delay - if(!(floor_delay = lift.do_move())) - moving_lifts[liftref] = null - moving_lifts -= liftref - if(lift.target_floor) - lift.target_floor.ext_panel.reset() - lift.target_floor = null - else - lift_is_moving(lift,floor_delay) - lift.busy = 0 - SCHECK - -/datum/controller/process/turbolift/proc/lift_is_moving(var/datum/turbolift/lift,var/floor_delay) - moving_lifts["\ref[lift]"] = world.time + floor_delay diff --git a/code/modules/turbolift/turbolift_turfs.dm b/code/modules/turbolift/turbolift_turfs.dm index 632160efaa..8949f71448 100644 --- a/code/modules/turbolift/turbolift_turfs.dm +++ b/code/modules/turbolift/turbolift_turfs.dm @@ -1,2 +1,2 @@ -/turf/simulated/wall/elevator/New(var/newloc) - ..(newloc,"elevatorium") +/turf/simulated/wall/elevator/Initialize(mapload) + ..(mapload, "elevatorium") diff --git a/code/modules/vchat/css/css-testing.html b/code/modules/vchat/css/css-testing.html new file mode 100644 index 0000000000..94e2844b91 --- /dev/null +++ b/code/modules/vchat/css/css-testing.html @@ -0,0 +1,110 @@ + + + + + + + + + + + +
+
+ Test Person says, "Testing say message."
+ Testing notice message.
+ Testing danger message.
+ [Security] Secu Person says, "Testing radio message."
+ Testing OOC message.
+ Testing LOOC message.
+ Testing asay message.
+ Test Person says, "Testing say message 2."
+ Testing notice message 2.
+ Testing danger message 2.
+ [Security] Secu Person says, "Testing radio message 2".
+ Testing OOC message 2.
+ Testing LOOC message 2.
+ Testing asay message 2.
+ Test Person says, "Testing say message 3."
+ Testing notice message 3.
+ Testing danger message 3.
+ [Security] Secu Person says, "Testing radio message 3".
+ Testing OOC message 3.
+ Testing LOOC message 3.
+ Testing asay message 3.
+ Test Person says, "Testing say message 4."
+ Testing notice message 4.
+ Testing danger message 4.
+ [Security] Secu Person says, "Testing radio message 4".
+ Testing OOC message 4.
+ Testing LOOC message 4.
+ Testing asay message 4.
+ Test Person says, "Testing say message 5."
+ Testing notice message 5.
+ Testing danger message 5.
+ [Security] Secu Person says, "Testing radio message 5".
+ Testing OOC message 5.
+ Testing LOOC message 5.
+ Testing asay message 5.
+
+
+ Test Person says, "Testing say message."
+ Testing notice message.
+ Testing danger message.
+ [Security] Secu Person says, "Testing radio message."
+ Testing OOC message.
+ Testing LOOC message.
+ Testing asay message.
+ Test Person says, "Testing say message 2."
+ Testing notice message 2.
+ Testing danger message 2.
+ [Security] Secu Person says, "Testing radio message 2".
+ Testing OOC message 2.
+ Testing LOOC message 2.
+ Testing asay message 2.
+ Test Person says, "Testing say message 3."
+ Testing notice message 3.
+ Testing danger message 3.
+ [Security] Secu Person says, "Testing radio message 3".
+ Testing OOC message 3.
+ Testing LOOC message 3.
+ Testing asay message 3.
+ Test Person says, "Testing say message 4."
+ Testing notice message 4.
+ Testing danger message 4.
+ [Security] Secu Person says, "Testing radio message 4".
+ Testing OOC message 4.
+ Testing LOOC message 4.
+ Testing asay message 4.
+ Test Person says, "Testing say message 5."
+ Testing notice message 5.
+ Testing danger message 5.
+ [Security] Secu Person says, "Testing radio message 5".
+ Testing OOC message 5.
+ Testing LOOC message 5.
+ Testing asay message 5.
+
+
+ + + \ No newline at end of file diff --git a/code/modules/vchat/css/semantic.min.css b/code/modules/vchat/css/semantic.min.css new file mode 100644 index 0000000000..776f2e0a6b --- /dev/null +++ b/code/modules/vchat/css/semantic.min.css @@ -0,0 +1,404 @@ + /* + * # Fomantic UI - 2.8.3 + * https://github.com/fomantic/Fomantic-UI + * http://fomantic-ui.com/ + * + * Copyright 2014 Contributors + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */ +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic&subset=latin&display=swap);/*! + * # Fomantic-UI - Reset + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */*,:after,:before{-webkit-box-sizing:inherit;box-sizing:inherit}html{-webkit-box-sizing:border-box;box-sizing:border-box}input[type=email],input[type=password],input[type=search],input[type=text]{-webkit-appearance:none;-moz-appearance:none}/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}/*! + * # Fomantic-UI - Site + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */body,html{height:100%}html{font-size:14px}body{margin:0;padding:0;overflow-x:hidden;min-width:320px;background:#fff;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:14px;line-height:1.4285em;color:rgba(0,0,0,.87)}h1,h2,h3,h4,h5{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;line-height:1.28571429em;margin:calc(2rem - .1428571428571429em) 0 1rem;font-weight:700;padding:0}h1{min-height:1rem;font-size:2rem}h2{font-size:1.71428571rem}h3{font-size:1.28571429rem}h4{font-size:1.07142857rem}h5{font-size:1rem}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child{margin-top:0}h1:last-child,h2:last-child,h3:last-child,h4:last-child,h5:last-child{margin-bottom:0}p{margin:0 0 1em;line-height:1.4285em}p:first-child{margin-top:0}p:last-child{margin-bottom:0}a{color:#4183c4;text-decoration:none}a:hover{color:#1e70bf;text-decoration:none}::-webkit-selection{background-color:#cce2ff;color:rgba(0,0,0,.87)}::-moz-selection{background-color:#cce2ff;color:rgba(0,0,0,.87)}::selection{background-color:#cce2ff;color:rgba(0,0,0,.87)}input::-webkit-selection,textarea::-webkit-selection{background-color:rgba(100,100,100,.4);color:rgba(0,0,0,.87)}input::-moz-selection,textarea::-moz-selection{background-color:rgba(100,100,100,.4);color:rgba(0,0,0,.87)}input::selection,textarea::selection{background-color:rgba(100,100,100,.4);color:rgba(0,0,0,.87)}body ::-webkit-scrollbar{-webkit-appearance:none;width:10px;height:10px}body ::-webkit-scrollbar-track{background:rgba(0,0,0,.1);border-radius:0}body ::-webkit-scrollbar-thumb{cursor:pointer;border-radius:5px;background:rgba(0,0,0,.25);-webkit-transition:color .2s ease;transition:color .2s ease}body ::-webkit-scrollbar-thumb:window-inactive{background:rgba(0,0,0,.15)}body ::-webkit-scrollbar-thumb:hover{background:rgba(128,135,139,.8)}body .ui.inverted:not(.dimmer)::-webkit-scrollbar-track{background:rgba(255,255,255,.1)}body .ui.inverted:not(.dimmer)::-webkit-scrollbar-thumb{background:rgba(255,255,255,.25)}body .ui.inverted:not(.dimmer)::-webkit-scrollbar-thumb:window-inactive{background:rgba(255,255,255,.15)}body .ui.inverted:not(.dimmer)::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.35)}/*! + * # Fomantic-UI - Button + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.button{cursor:pointer;display:inline-block;min-height:1em;outline:0;border:none;vertical-align:baseline;background:#e0e1e2 none;color:rgba(0,0,0,.6);font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;margin:0 .25em 0 0;padding:.78571429em 1.5em .78571429em;text-transform:none;text-shadow:none;font-weight:700;line-height:1em;font-style:normal;text-align:center;text-decoration:none;border-radius:.28571429rem;-webkit-box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:opacity .1s ease,background-color .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease,-webkit-box-shadow .1s ease;will-change:auto;-webkit-tap-highlight-color:transparent}.ui.button:hover{background-color:#cacbcd;background-image:none;-webkit-box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;color:rgba(0,0,0,.8)}.ui.button:hover .icon{opacity:.85}.ui.button:focus{background-color:#cacbcd;color:rgba(0,0,0,.8);background-image:none;-webkit-box-shadow:'';box-shadow:''}.ui.button:focus .icon{opacity:.85}.ui.active.button:active,.ui.button:active{background-color:#babbbc;background-image:'';color:rgba(0,0,0,.9);-webkit-box-shadow:0 0 0 1px transparent inset,none;box-shadow:0 0 0 1px transparent inset,none}.ui.active.button{background-color:#c0c1c2;background-image:none;-webkit-box-shadow:0 0 0 1px transparent inset;box-shadow:0 0 0 1px transparent inset;color:rgba(0,0,0,.95)}.ui.active.button:hover{background-color:#c0c1c2;background-image:none;color:rgba(0,0,0,.95)}.ui.active.button:active{background-color:#c0c1c2;background-image:none}.ui.loading.loading.loading.loading.loading.loading.button{position:relative;cursor:default;text-shadow:none!important;color:transparent;opacity:1;pointer-events:auto;-webkit-transition:all 0s linear,opacity .1s ease;transition:all 0s linear,opacity .1s ease}.ui.loading.button:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.15)}.ui.loading.button:after{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;-webkit-animation:loader .6s infinite linear;animation:loader .6s infinite linear;border:.2em solid currentColor;color:#fff;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}.ui.labeled.icon.loading.button .icon{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.ui.basic.loading.button:not(.inverted):before{border-color:rgba(0,0,0,.1)}.ui.basic.loading.button:not(.inverted):after{border-color:#767676}.ui.button:disabled,.ui.buttons .disabled.button:not(.basic),.ui.disabled.active.button,.ui.disabled.button,.ui.disabled.button:hover{cursor:default;opacity:.45!important;background-image:none;-webkit-box-shadow:none;box-shadow:none;pointer-events:none!important}.ui.basic.buttons .ui.disabled.button{border-color:rgba(34,36,38,.5)}.ui.animated.button{position:relative;overflow:hidden;padding-right:0!important;vertical-align:middle;z-index:1}.ui.animated.button .content{will-change:transform,opacity}.ui.animated.button .visible.content{position:relative;margin-right:1.5em}.ui.animated.button .hidden.content{position:absolute;width:100%}.ui.animated.button .hidden.content,.ui.animated.button .visible.content{-webkit-transition:right .3s ease 0s;transition:right .3s ease 0s}.ui.animated.button .visible.content{left:auto;right:0}.ui.animated.button .hidden.content{top:50%;left:auto;right:-100%;margin-top:-.5em}.ui.animated.button:focus .visible.content,.ui.animated.button:hover .visible.content{left:auto;right:200%}.ui.animated.button:focus .hidden.content,.ui.animated.button:hover .hidden.content{left:auto;right:0}.ui.vertical.animated.button .hidden.content,.ui.vertical.animated.button .visible.content{-webkit-transition:top .3s ease,-webkit-transform .3s ease;transition:top .3s ease,-webkit-transform .3s ease;transition:top .3s ease,transform .3s ease;transition:top .3s ease,transform .3s ease,-webkit-transform .3s ease}.ui.vertical.animated.button .visible.content{-webkit-transform:translateY(0);transform:translateY(0);right:auto}.ui.vertical.animated.button .hidden.content{top:-50%;left:0;right:auto}.ui.vertical.animated.button:focus .visible.content,.ui.vertical.animated.button:hover .visible.content{-webkit-transform:translateY(200%);transform:translateY(200%);right:auto}.ui.vertical.animated.button:focus .hidden.content,.ui.vertical.animated.button:hover .hidden.content{top:50%;right:auto}.ui.fade.animated.button .hidden.content,.ui.fade.animated.button .visible.content{-webkit-transition:opacity .3s ease,-webkit-transform .3s ease;transition:opacity .3s ease,-webkit-transform .3s ease;transition:opacity .3s ease,transform .3s ease;transition:opacity .3s ease,transform .3s ease,-webkit-transform .3s ease}.ui.fade.animated.button .visible.content{left:auto;right:auto;opacity:1;-webkit-transform:scale(1);transform:scale(1)}.ui.fade.animated.button .hidden.content{opacity:0;left:0;right:auto;-webkit-transform:scale(1.5);transform:scale(1.5)}.ui.fade.animated.button:focus .visible.content,.ui.fade.animated.button:hover .visible.content{left:auto;right:auto;opacity:0;-webkit-transform:scale(.75);transform:scale(.75)}.ui.fade.animated.button:focus .hidden.content,.ui.fade.animated.button:hover .hidden.content{left:0;right:auto;opacity:1;-webkit-transform:scale(1);transform:scale(1)}.ui.inverted.button{-webkit-box-shadow:0 0 0 2px #fff inset;box-shadow:0 0 0 2px #fff inset;background:transparent none;color:#fff;text-shadow:none!important}.ui.inverted.buttons .button{margin:0 0 0 -2px}.ui.inverted.buttons .button:first-child{margin-left:0}.ui.inverted.vertical.buttons .button{margin:0 0 -2px 0}.ui.inverted.vertical.buttons .button:first-child{margin-top:0}.ui.inverted.button:hover{background:#fff;-webkit-box-shadow:0 0 0 2px #fff inset;box-shadow:0 0 0 2px #fff inset;color:rgba(0,0,0,.8)}.ui.inverted.button.active,.ui.inverted.button:focus{background:#fff;-webkit-box-shadow:0 0 0 2px #fff inset;box-shadow:0 0 0 2px #fff inset;color:rgba(0,0,0,.8)}.ui.inverted.button.active:focus{background:#dcddde;-webkit-box-shadow:0 0 0 2px #dcddde inset;box-shadow:0 0 0 2px #dcddde inset;color:rgba(0,0,0,.8)}.ui.labeled.button:not(.icon){display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;background:0 0;padding:0!important;border:none;-webkit-box-shadow:none;box-shadow:none}.ui.labeled.button>.button{margin:0}.ui.labeled.button>.label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0 0 0 -1px!important;font-size:1em;padding:'';border-color:rgba(34,36,38,.15)}.ui.labeled.button>.tag.label:before{width:1.85em;height:1.85em}.ui.labeled.button:not([class*="left labeled"])>.button{border-top-right-radius:0;border-bottom-right-radius:0}.ui.labeled.button:not([class*="left labeled"])>.label{border-top-left-radius:0;border-bottom-left-radius:0}.ui[class*="left labeled"].button>.button{border-top-left-radius:0;border-bottom-left-radius:0}.ui[class*="left labeled"].button>.label{border-top-right-radius:0;border-bottom-right-radius:0}.ui.facebook.button{background-color:#3b5998;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.facebook.button:hover{background-color:#304d8a;color:#fff;text-shadow:none}.ui.facebook.button:active{background-color:#2d4373;color:#fff;text-shadow:none}.ui.twitter.button{background-color:#1da1f2;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.twitter.button:hover{background-color:#0298f3;color:#fff;text-shadow:none}.ui.twitter.button:active{background-color:#0c85d0;color:#fff;text-shadow:none}.ui.google.plus.button{background-color:#dd4b39;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.google.plus.button:hover{background-color:#e0321c;color:#fff;text-shadow:none}.ui.google.plus.button:active{background-color:#c23321;color:#fff;text-shadow:none}.ui.linkedin.button{background-color:#0077b5;color:#fff;text-shadow:none}.ui.linkedin.button:hover{background-color:#00669c;color:#fff;text-shadow:none}.ui.linkedin.button:active{background-color:#005582;color:#fff;text-shadow:none}.ui.youtube.button{background-color:red;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.youtube.button:hover{background-color:#e60000;color:#fff;text-shadow:none}.ui.youtube.button:active{background-color:#c00;color:#fff;text-shadow:none}.ui.instagram.button{background-color:#49769c;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.instagram.button:hover{background-color:#3d698e;color:#fff;text-shadow:none}.ui.instagram.button:active{background-color:#395c79;color:#fff;text-shadow:none}.ui.pinterest.button{background-color:#bd081c;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.pinterest.button:hover{background-color:#ac0013;color:#fff;text-shadow:none}.ui.pinterest.button:active{background-color:#8c0615;color:#fff;text-shadow:none}.ui.vk.button{background-color:#45668e;color:#fff;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.vk.button:hover{background-color:#395980;color:#fff}.ui.vk.button:active{background-color:#344d6c;color:#fff}.ui.whatsapp.button{background-color:#25d366;color:#fff;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.whatsapp.button:hover{background-color:#19c55a;color:#fff}.ui.whatsapp.button:active{background-color:#1da851;color:#fff}.ui.telegram.button{background-color:#08c;color:#fff;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.telegram.button:hover{background-color:#0077b3;color:#fff}.ui.telegram.button:active{background-color:#069;color:#fff}.ui.button>.icon:not(.button){height:auto;opacity:.8;margin:0 .42857143em 0 -.21428571em;-webkit-transition:opacity .1s ease;transition:opacity .1s ease;vertical-align:'';color:''}.ui.button:not(.icon)>.icon:not(.button):not(.dropdown),.ui.button:not(.icon)>.icons:not(.button):not(.dropdown){margin:0 .42857143em 0 -.21428571em}.ui.button:not(.icon)>.right.icon:not(.button):not(.dropdown){margin:0 -.21428571em 0 .42857143em}.ui[class*="left floated"].button,.ui[class*="left floated"].buttons{float:left;margin-left:0;margin-right:.25em}.ui[class*="right floated"].button,.ui[class*="right floated"].buttons{float:right;margin-right:0;margin-left:.25em}.ui.compact.button,.ui.compact.buttons .button{padding:.58928571em 1.125em .58928571em}.ui.compact.icon.button,.ui.compact.icon.buttons .button{padding:.58928571em .58928571em .58928571em}.ui.compact.labeled.icon.button,.ui.compact.labeled.icon.buttons .button{padding:.58928571em 3.69642857em .58928571em}.ui.compact.labeled.icon.button>.icon,.ui.compact.labeled.icon.buttons .button>.icon{padding:.58928571em 0 .58928571em 0}.ui.button,.ui.buttons .button,.ui.buttons .or{font-size:1rem}.ui.mini.buttons .button,.ui.mini.buttons .dropdown,.ui.mini.buttons .dropdown .menu>.item,.ui.mini.buttons .or,.ui.ui.ui.ui.mini.button{font-size:.78571429rem}.ui.tiny.buttons .button,.ui.tiny.buttons .dropdown,.ui.tiny.buttons .dropdown .menu>.item,.ui.tiny.buttons .or,.ui.ui.ui.ui.tiny.button{font-size:.85714286rem}.ui.small.buttons .button,.ui.small.buttons .dropdown,.ui.small.buttons .dropdown .menu>.item,.ui.small.buttons .or,.ui.ui.ui.ui.small.button{font-size:.92857143rem}.ui.large.buttons .button,.ui.large.buttons .dropdown,.ui.large.buttons .dropdown .menu>.item,.ui.large.buttons .or,.ui.ui.ui.ui.large.button{font-size:1.14285714rem}.ui.big.buttons .button,.ui.big.buttons .dropdown,.ui.big.buttons .dropdown .menu>.item,.ui.big.buttons .or,.ui.ui.ui.ui.big.button{font-size:1.28571429rem}.ui.huge.buttons .button,.ui.huge.buttons .dropdown,.ui.huge.buttons .dropdown .menu>.item,.ui.huge.buttons .or,.ui.ui.ui.ui.huge.button{font-size:1.42857143rem}.ui.massive.buttons .button,.ui.massive.buttons .dropdown,.ui.massive.buttons .dropdown .menu>.item,.ui.massive.buttons .or,.ui.ui.ui.ui.massive.button{font-size:1.71428571rem}.ui.icon.button,.ui.icon.buttons .button{padding:.78571429em .78571429em .78571429em}.ui.icon.button>.icon,.ui.icon.buttons .button>.icon{opacity:.9;margin:0!important;vertical-align:top}.ui.basic.button,.ui.basic.buttons .button{background:transparent none;color:rgba(0,0,0,.6);font-weight:400;border-radius:.28571429rem;text-transform:none;text-shadow:none!important;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.15) inset}.ui.basic.buttons{-webkit-box-shadow:none;box-shadow:none;border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem}.ui.basic.buttons .button{border-radius:0}.ui.basic.button:hover,.ui.basic.buttons .button:hover{background:#fff;color:rgba(0,0,0,.8);-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset}.ui.basic.button:focus,.ui.basic.buttons .button:focus{background:#fff;color:rgba(0,0,0,.8);-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset}.ui.basic.button:active,.ui.basic.buttons .button:active{background:#f8f8f8;color:rgba(0,0,0,.9);-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset}.ui.basic.active.button,.ui.basic.buttons .active.button{background:rgba(0,0,0,.05);-webkit-box-shadow:'';box-shadow:'';color:rgba(0,0,0,.95)}.ui.basic.active.button:hover,.ui.basic.buttons .active.button:hover{background-color:rgba(0,0,0,.05)}.ui.basic.buttons .button:hover{-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset inset;box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset inset}.ui.basic.buttons .button:active{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset inset;box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset inset}.ui.basic.buttons .active.button{-webkit-box-shadow:'';box-shadow:''}.ui.basic.inverted.button,.ui.basic.inverted.buttons .button{background-color:transparent;color:#f9fafb;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset}.ui.basic.inverted.button:hover,.ui.basic.inverted.buttons .button:hover{color:#fff;-webkit-box-shadow:0 0 0 2px #fff inset;box-shadow:0 0 0 2px #fff inset}.ui.basic.inverted.button:focus,.ui.basic.inverted.buttons .button:focus{color:#fff;-webkit-box-shadow:0 0 0 2px #fff inset;box-shadow:0 0 0 2px #fff inset}.ui.basic.inverted.button:active,.ui.basic.inverted.buttons .button:active{background-color:rgba(255,255,255,.08);color:#fff;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.9) inset;box-shadow:0 0 0 2px rgba(255,255,255,.9) inset}.ui.basic.inverted.active.button,.ui.basic.inverted.buttons .active.button{background-color:rgba(255,255,255,.08);color:#fff;text-shadow:none;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.7) inset;box-shadow:0 0 0 2px rgba(255,255,255,.7) inset}.ui.basic.inverted.active.button:hover,.ui.basic.inverted.buttons .active.button:hover{background-color:rgba(255,255,255,.15);-webkit-box-shadow:0 0 0 2px #fff inset;box-shadow:0 0 0 2px #fff inset}.ui.basic.buttons .button{border-left:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none;box-shadow:none}.ui.basic.vertical.buttons .button{border-left:none;border-left-width:0;border-top:1px solid rgba(34,36,38,.15)}.ui.basic.vertical.buttons .button:first-child{border-top-width:0}.ui.tertiary.button{-webkit-transition:color .1s ease!important;transition:color .1s ease!important;border-radius:0;margin:.28571429em .25em .28571429em 0!important;padding:.5em!important;-webkit-box-shadow:none;box-shadow:none;color:rgba(0,0,0,.6);background:0 0}.ui.tertiary.button:hover{-webkit-box-shadow:inset 0 -.2em 0 #666;box-shadow:inset 0 -.2em 0 #666;color:#333;background:0 0}.ui.tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #666;box-shadow:inset 0 -.2em 0 #666;color:#333;background:0 0}.ui.tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #999;box-shadow:inset 0 -.2em 0 #999;border-radius:.28571429rem .28571429rem 0 0;color:#666;background:0 0}.ui.labeled.icon.button,.ui.labeled.icon.buttons .button{position:relative;padding-left:4.07142857em!important;padding-right:1.5em!important}.ui.labeled.icon.button>.icon,.ui.labeled.icon.buttons>.button>.icon{position:absolute;top:0;left:0;height:100%;line-height:1;border-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit;text-align:center;-webkit-animation:none;animation:none;padding:.78571429em 0 .78571429em 0;margin:0;width:2.57142857em;background-color:rgba(0,0,0,.05);color:'';-webkit-box-shadow:-1px 0 0 0 transparent inset;box-shadow:-1px 0 0 0 transparent inset}.ui[class*="right labeled"].icon.button{padding-right:4.07142857em!important;padding-left:1.5em!important}.ui[class*="right labeled"].icon.button>.icon{left:auto;right:0;border-radius:0;border-top-right-radius:inherit;border-bottom-right-radius:inherit;-webkit-box-shadow:1px 0 0 0 transparent inset;box-shadow:1px 0 0 0 transparent inset}.ui.labeled.icon.button>.icon:after,.ui.labeled.icon.button>.icon:before,.ui.labeled.icon.buttons>.button>.icon:after,.ui.labeled.icon.buttons>.button>.icon:before{display:block;position:relative;width:100%;top:0;text-align:center}.ui.labeled.icon.buttons .button>.icon{border-radius:0}.ui.labeled.icon.buttons .button:first-child>.icon{border-top-left-radius:.28571429rem;border-bottom-left-radius:.28571429rem}.ui.labeled.icon.buttons .button:last-child>.icon{border-top-right-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.vertical.labeled.icon.buttons .button:first-child>.icon{border-radius:0;border-top-left-radius:.28571429rem}.ui.vertical.labeled.icon.buttons .button:last-child>.icon{border-radius:0;border-bottom-left-radius:.28571429rem}.ui.labeled.icon.button>.loading.icon:before{-webkit-animation:loader 2s linear infinite;animation:loader 2s linear infinite}.ui.button.toggle.active,.ui.buttons .button.toggle.active,.ui.toggle.buttons .active.button{background-color:#21ba45;-webkit-box-shadow:none;box-shadow:none;text-shadow:none;color:#fff}.ui.button.toggle.active:hover{background-color:#16ab39;text-shadow:none;color:#fff}.ui.circular.button{border-radius:10em}.ui.circular.button>.icon{width:1em;vertical-align:baseline}.ui.buttons .or{position:relative;width:.3em;height:2.57142857em;z-index:3}.ui.buttons .or:before{position:absolute;text-align:center;border-radius:500rem;content:'or';top:50%;left:50%;background-color:#fff;text-shadow:none;margin-top:-.89285714em;margin-left:-.89285714em;width:1.78571429em;height:1.78571429em;line-height:1.78571429em;color:rgba(0,0,0,.4);font-style:normal;font-weight:700;-webkit-box-shadow:0 0 0 1px transparent inset;box-shadow:0 0 0 1px transparent inset}.ui.buttons .or[data-text]:before{content:attr(data-text)}.ui.fluid.buttons .or{width:0!important}.ui.fluid.buttons .or:after{display:none}.ui.attached.button{position:relative;display:block;margin:0;border-radius:0;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15);box-shadow:0 0 0 1px rgba(34,36,38,.15)}.ui.attached.top.button{border-radius:.28571429rem .28571429rem 0 0}.ui.attached.bottom.button{border-radius:0 0 .28571429rem .28571429rem}.ui.left.attached.button{display:inline-block;border-left:none;text-align:right;padding-right:.75em;border-radius:.28571429rem 0 0 .28571429rem}.ui.right.attached.button{display:inline-block;text-align:left;padding-left:.75em;border-radius:0 .28571429rem .28571429rem 0}.ui.attached.buttons{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;border-radius:0;width:auto!important;z-index:auto;margin-left:-1px;margin-right:-1px}.ui.attached.buttons .button{margin:0}.ui.attached.buttons .button:first-child{border-radius:0}.ui.attached.buttons .button:last-child{border-radius:0}.ui[class*="top attached"].buttons{margin-bottom:-1px;border-radius:.28571429rem .28571429rem 0 0}.ui[class*="top attached"].buttons .button:first-child{border-radius:.28571429rem 0 0 0}.ui[class*="top attached"].buttons .button:last-child{border-radius:0 .28571429rem 0 0}.ui[class*="bottom attached"].buttons{margin-top:-1px;border-radius:0 0 .28571429rem .28571429rem}.ui[class*="bottom attached"].buttons .button:first-child{border-radius:0 0 0 .28571429rem}.ui[class*="bottom attached"].buttons .button:last-child{border-radius:0 0 .28571429rem 0}.ui[class*="left attached"].buttons{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:0;margin-left:-1px;border-radius:0 .28571429rem .28571429rem 0}.ui[class*="left attached"].buttons .button:first-child{margin-left:-1px;border-radius:0 .28571429rem 0 0}.ui[class*="left attached"].buttons .button:last-child{margin-left:-1px;border-radius:0 0 .28571429rem 0}.ui[class*="right attached"].buttons{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-left:0;margin-right:-1px;border-radius:.28571429rem 0 0 .28571429rem}.ui[class*="right attached"].buttons .button:first-child{margin-left:-1px;border-radius:.28571429rem 0 0 0}.ui[class*="right attached"].buttons .button:last-child{margin-left:-1px;border-radius:0 0 0 .28571429rem}.ui.fluid.button,.ui.fluid.buttons{width:100%}.ui.fluid.button{display:block}.ui.two.buttons{width:100%}.ui.two.buttons>.button{width:50%}.ui.three.buttons{width:100%}.ui.three.buttons>.button{width:33.333%}.ui.four.buttons{width:100%}.ui.four.buttons>.button{width:25%}.ui.five.buttons{width:100%}.ui.five.buttons>.button{width:20%}.ui.six.buttons{width:100%}.ui.six.buttons>.button{width:16.666%}.ui.seven.buttons{width:100%}.ui.seven.buttons>.button{width:14.285%}.ui.eight.buttons{width:100%}.ui.eight.buttons>.button{width:12.5%}.ui.nine.buttons{width:100%}.ui.nine.buttons>.button{width:11.11%}.ui.ten.buttons{width:100%}.ui.ten.buttons>.button{width:10%}.ui.eleven.buttons{width:100%}.ui.eleven.buttons>.button{width:9.09%}.ui.twelve.buttons{width:100%}.ui.twelve.buttons>.button{width:8.3333%}.ui.fluid.vertical.buttons,.ui.fluid.vertical.buttons>.button{display:-webkit-box;display:-ms-flexbox;display:flex;width:auto;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.two.vertical.buttons>.button{height:50%}.ui.three.vertical.buttons>.button{height:33.333%}.ui.four.vertical.buttons>.button{height:25%}.ui.five.vertical.buttons>.button{height:20%}.ui.six.vertical.buttons>.button{height:16.666%}.ui.seven.vertical.buttons>.button{height:14.285%}.ui.eight.vertical.buttons>.button{height:12.5%}.ui.nine.vertical.buttons>.button{height:11.11%}.ui.ten.vertical.buttons>.button{height:10%}.ui.eleven.vertical.buttons>.button{height:9.09%}.ui.twelve.vertical.buttons>.button{height:8.3333%}.ui.primary.button,.ui.primary.buttons .button{background-color:#2185d0;color:#fff;text-shadow:none;background-image:none}.ui.primary.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.primary.button:hover,.ui.primary.buttons .button:hover{background-color:#1678c2;color:#fff;text-shadow:none}.ui.primary.button:focus,.ui.primary.buttons .button:focus{background-color:#0d71bb;color:#fff;text-shadow:none}.ui.primary.button:active,.ui.primary.buttons .button:active{background-color:#1a69a4;color:#fff;text-shadow:none}.ui.primary.active.button,.ui.primary.button .active.button:active,.ui.primary.buttons .active.button,.ui.primary.buttons .active.button:active{background-color:#1279c6;color:#fff;text-shadow:none}.ui.basic.primary.button,.ui.basic.primary.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #2185d0 inset;box-shadow:0 0 0 1px #2185d0 inset;color:#2185d0}.ui.basic.primary.button:hover,.ui.basic.primary.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #1678c2 inset;box-shadow:0 0 0 1px #1678c2 inset;color:#1678c2}.ui.basic.primary.button:focus,.ui.basic.primary.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #0d71bb inset;box-shadow:0 0 0 1px #0d71bb inset;color:#1678c2}.ui.basic.primary.active.button,.ui.basic.primary.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #1279c6 inset;box-shadow:0 0 0 1px #1279c6 inset;color:#1a69a4}.ui.basic.primary.button:active,.ui.basic.primary.buttons .button:active{-webkit-box-shadow:0 0 0 1px #1a69a4 inset;box-shadow:0 0 0 1px #1a69a4 inset;color:#1a69a4}.ui.buttons:not(.vertical)>.basic.primary.button:not(:first-child){margin-left:-1px}.ui.inverted.primary.button,.ui.inverted.primary.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #54c8ff inset;box-shadow:0 0 0 2px #54c8ff inset;color:#54c8ff}.ui.inverted.primary.button.active,.ui.inverted.primary.button:active,.ui.inverted.primary.button:focus,.ui.inverted.primary.button:hover,.ui.inverted.primary.buttons .button.active,.ui.inverted.primary.buttons .button:active,.ui.inverted.primary.buttons .button:focus,.ui.inverted.primary.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.primary.button:hover,.ui.inverted.primary.buttons .button:hover{background-color:#21b8ff}.ui.inverted.primary.button:focus,.ui.inverted.primary.buttons .button:focus{background-color:#2bbbff}.ui.inverted.primary.active.button,.ui.inverted.primary.buttons .active.button{background-color:#3ac0ff}.ui.inverted.primary.button:active,.ui.inverted.primary.buttons .button:active{background-color:#21b8ff}.ui.inverted.primary.basic.button,.ui.inverted.primary.basic.buttons .button,.ui.inverted.primary.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.primary.basic.button:hover,.ui.inverted.primary.basic.buttons .button:hover,.ui.inverted.primary.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #21b8ff inset;box-shadow:0 0 0 2px #21b8ff inset;color:#54c8ff}.ui.inverted.primary.basic.button:focus,.ui.inverted.primary.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #2bbbff inset;box-shadow:0 0 0 2px #2bbbff inset;color:#54c8ff}.ui.inverted.primary.basic.active.button,.ui.inverted.primary.basic.buttons .active.button,.ui.inverted.primary.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #3ac0ff inset;box-shadow:0 0 0 2px #3ac0ff inset;color:#54c8ff}.ui.inverted.primary.basic.button:active,.ui.inverted.primary.basic.buttons .button:active,.ui.inverted.primary.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #21b8ff inset;box-shadow:0 0 0 2px #21b8ff inset;color:#54c8ff}.ui.tertiary.primary.button,.ui.tertiary.primary.buttons .button,.ui.tertiary.primary.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#2185d0}.ui.tertiary.primary.button:hover,.ui.tertiary.primary.buttons .button:hover,.ui.tertiary.primary.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #2b75ac;box-shadow:inset 0 -.2em 0 #2b75ac;color:#2b75ac}.ui.tertiary.primary.button:focus,.ui.tertiary.primary.buttons .button:focus,.ui.tertiary.primary.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #216ea7;box-shadow:inset 0 -.2em 0 #216ea7;color:#216ea7}.ui.tertiary.primary.active.button,.ui.tertiary.primary.button:active,.ui.tertiary.primary.buttons .active.button,.ui.tertiary.primary.buttons .button:active,.ui.tertiary.primary.buttons .tertiary.active.button,.ui.tertiary.primary.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #007bd8;box-shadow:inset 0 -.2em 0 #007bd8;color:#1279c6}.ui.secondary.button,.ui.secondary.buttons .button{background-color:#1b1c1d;color:#fff;text-shadow:none;background-image:none}.ui.secondary.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.secondary.button:hover,.ui.secondary.buttons .button:hover{background-color:#27292a;color:#fff;text-shadow:none}.ui.secondary.button:focus,.ui.secondary.buttons .button:focus{background-color:#2e3032;color:#fff;text-shadow:none}.ui.secondary.button:active,.ui.secondary.buttons .button:active{background-color:#343637;color:#fff;text-shadow:none}.ui.secondary.active.button,.ui.secondary.button .active.button:active,.ui.secondary.buttons .active.button,.ui.secondary.buttons .active.button:active{background-color:#27292a;color:#fff;text-shadow:none}.ui.basic.secondary.button,.ui.basic.secondary.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #1b1c1d inset;box-shadow:0 0 0 1px #1b1c1d inset;color:#1b1c1d}.ui.basic.secondary.button:hover,.ui.basic.secondary.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #27292a inset;box-shadow:0 0 0 1px #27292a inset;color:#27292a}.ui.basic.secondary.button:focus,.ui.basic.secondary.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #2e3032 inset;box-shadow:0 0 0 1px #2e3032 inset;color:#27292a}.ui.basic.secondary.active.button,.ui.basic.secondary.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #27292a inset;box-shadow:0 0 0 1px #27292a inset;color:#343637}.ui.basic.secondary.button:active,.ui.basic.secondary.buttons .button:active{-webkit-box-shadow:0 0 0 1px #343637 inset;box-shadow:0 0 0 1px #343637 inset;color:#343637}.ui.buttons:not(.vertical)>.basic.secondary.button:not(:first-child){margin-left:-1px}.ui.inverted.secondary.button,.ui.inverted.secondary.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #545454 inset;box-shadow:0 0 0 2px #545454 inset;color:#545454}.ui.inverted.secondary.button.active,.ui.inverted.secondary.button:active,.ui.inverted.secondary.button:focus,.ui.inverted.secondary.button:hover,.ui.inverted.secondary.buttons .button.active,.ui.inverted.secondary.buttons .button:active,.ui.inverted.secondary.buttons .button:focus,.ui.inverted.secondary.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.secondary.button:hover,.ui.inverted.secondary.buttons .button:hover{background-color:#6e6e6e}.ui.inverted.secondary.button:focus,.ui.inverted.secondary.buttons .button:focus{background-color:#686868}.ui.inverted.secondary.active.button,.ui.inverted.secondary.buttons .active.button{background-color:#616161}.ui.inverted.secondary.button:active,.ui.inverted.secondary.buttons .button:active{background-color:#6e6e6e}.ui.inverted.secondary.basic.button,.ui.inverted.secondary.basic.buttons .button,.ui.inverted.secondary.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.secondary.basic.button:hover,.ui.inverted.secondary.basic.buttons .button:hover,.ui.inverted.secondary.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #6e6e6e inset;box-shadow:0 0 0 2px #6e6e6e inset;color:#545454}.ui.inverted.secondary.basic.button:focus,.ui.inverted.secondary.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #686868 inset;box-shadow:0 0 0 2px #686868 inset;color:#545454}.ui.inverted.secondary.basic.active.button,.ui.inverted.secondary.basic.buttons .active.button,.ui.inverted.secondary.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #616161 inset;box-shadow:0 0 0 2px #616161 inset;color:#545454}.ui.inverted.secondary.basic.button:active,.ui.inverted.secondary.basic.buttons .button:active,.ui.inverted.secondary.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #6e6e6e inset;box-shadow:0 0 0 2px #6e6e6e inset;color:#545454}.ui.tertiary.secondary.button,.ui.tertiary.secondary.buttons .button,.ui.tertiary.secondary.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#1b1c1d}.ui.tertiary.secondary.button:hover,.ui.tertiary.secondary.buttons .button:hover,.ui.tertiary.secondary.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #292929;box-shadow:inset 0 -.2em 0 #292929;color:#292929}.ui.tertiary.secondary.button:focus,.ui.tertiary.secondary.buttons .button:focus,.ui.tertiary.secondary.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #303030;box-shadow:inset 0 -.2em 0 #303030;color:#303030}.ui.tertiary.secondary.active.button,.ui.tertiary.secondary.button:active,.ui.tertiary.secondary.buttons .active.button,.ui.tertiary.secondary.buttons .button:active,.ui.tertiary.secondary.buttons .tertiary.active.button,.ui.tertiary.secondary.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #1f2933;box-shadow:inset 0 -.2em 0 #1f2933;color:#27292a}.ui.red.button,.ui.red.buttons .button{background-color:#db2828;color:#fff;text-shadow:none;background-image:none}.ui.red.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.red.button:hover,.ui.red.buttons .button:hover{background-color:#d01919;color:#fff;text-shadow:none}.ui.red.button:focus,.ui.red.buttons .button:focus{background-color:#ca1010;color:#fff;text-shadow:none}.ui.red.button:active,.ui.red.buttons .button:active{background-color:#b21e1e;color:#fff;text-shadow:none}.ui.red.active.button,.ui.red.button .active.button:active,.ui.red.buttons .active.button,.ui.red.buttons .active.button:active{background-color:#d41515;color:#fff;text-shadow:none}.ui.basic.red.button,.ui.basic.red.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #db2828 inset;box-shadow:0 0 0 1px #db2828 inset;color:#db2828}.ui.basic.red.button:hover,.ui.basic.red.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #d01919 inset;box-shadow:0 0 0 1px #d01919 inset;color:#d01919}.ui.basic.red.button:focus,.ui.basic.red.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #ca1010 inset;box-shadow:0 0 0 1px #ca1010 inset;color:#d01919}.ui.basic.red.active.button,.ui.basic.red.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #d41515 inset;box-shadow:0 0 0 1px #d41515 inset;color:#b21e1e}.ui.basic.red.button:active,.ui.basic.red.buttons .button:active{-webkit-box-shadow:0 0 0 1px #b21e1e inset;box-shadow:0 0 0 1px #b21e1e inset;color:#b21e1e}.ui.buttons:not(.vertical)>.basic.red.button:not(:first-child){margin-left:-1px}.ui.inverted.red.button,.ui.inverted.red.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #ff695e inset;box-shadow:0 0 0 2px #ff695e inset;color:#ff695e}.ui.inverted.red.button.active,.ui.inverted.red.button:active,.ui.inverted.red.button:focus,.ui.inverted.red.button:hover,.ui.inverted.red.buttons .button.active,.ui.inverted.red.buttons .button:active,.ui.inverted.red.buttons .button:focus,.ui.inverted.red.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.red.button:hover,.ui.inverted.red.buttons .button:hover{background-color:#ff392b}.ui.inverted.red.button:focus,.ui.inverted.red.buttons .button:focus{background-color:#ff4335}.ui.inverted.red.active.button,.ui.inverted.red.buttons .active.button{background-color:#ff5144}.ui.inverted.red.button:active,.ui.inverted.red.buttons .button:active{background-color:#ff392b}.ui.inverted.red.basic.button,.ui.inverted.red.basic.buttons .button,.ui.inverted.red.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.red.basic.button:hover,.ui.inverted.red.basic.buttons .button:hover,.ui.inverted.red.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #ff392b inset;box-shadow:0 0 0 2px #ff392b inset;color:#ff695e}.ui.inverted.red.basic.button:focus,.ui.inverted.red.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #ff4335 inset;box-shadow:0 0 0 2px #ff4335 inset;color:#ff695e}.ui.inverted.red.basic.active.button,.ui.inverted.red.basic.buttons .active.button,.ui.inverted.red.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #ff5144 inset;box-shadow:0 0 0 2px #ff5144 inset;color:#ff695e}.ui.inverted.red.basic.button:active,.ui.inverted.red.basic.buttons .button:active,.ui.inverted.red.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #ff392b inset;box-shadow:0 0 0 2px #ff392b inset;color:#ff695e}.ui.tertiary.red.button,.ui.tertiary.red.buttons .button,.ui.tertiary.red.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#db2828}.ui.tertiary.red.button:hover,.ui.tertiary.red.buttons .button:hover,.ui.tertiary.red.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #b93131;box-shadow:inset 0 -.2em 0 #b93131;color:#b93131}.ui.tertiary.red.button:focus,.ui.tertiary.red.buttons .button:focus,.ui.tertiary.red.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #b52626;box-shadow:inset 0 -.2em 0 #b52626;color:#b52626}.ui.tertiary.red.active.button,.ui.tertiary.red.button:active,.ui.tertiary.red.buttons .active.button,.ui.tertiary.red.buttons .button:active,.ui.tertiary.red.buttons .tertiary.active.button,.ui.tertiary.red.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #ea0000;box-shadow:inset 0 -.2em 0 #ea0000;color:#d41515}.ui.orange.button,.ui.orange.buttons .button{background-color:#f2711c;color:#fff;text-shadow:none;background-image:none}.ui.orange.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.orange.button:hover,.ui.orange.buttons .button:hover{background-color:#f26202;color:#fff;text-shadow:none}.ui.orange.button:focus,.ui.orange.buttons .button:focus{background-color:#e55b00;color:#fff;text-shadow:none}.ui.orange.button:active,.ui.orange.buttons .button:active{background-color:#cf590c;color:#fff;text-shadow:none}.ui.orange.active.button,.ui.orange.button .active.button:active,.ui.orange.buttons .active.button,.ui.orange.buttons .active.button:active{background-color:#f56100;color:#fff;text-shadow:none}.ui.basic.orange.button,.ui.basic.orange.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #f2711c inset;box-shadow:0 0 0 1px #f2711c inset;color:#f2711c}.ui.basic.orange.button:hover,.ui.basic.orange.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #f26202 inset;box-shadow:0 0 0 1px #f26202 inset;color:#f26202}.ui.basic.orange.button:focus,.ui.basic.orange.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #e55b00 inset;box-shadow:0 0 0 1px #e55b00 inset;color:#f26202}.ui.basic.orange.active.button,.ui.basic.orange.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #f56100 inset;box-shadow:0 0 0 1px #f56100 inset;color:#cf590c}.ui.basic.orange.button:active,.ui.basic.orange.buttons .button:active{-webkit-box-shadow:0 0 0 1px #cf590c inset;box-shadow:0 0 0 1px #cf590c inset;color:#cf590c}.ui.buttons:not(.vertical)>.basic.orange.button:not(:first-child){margin-left:-1px}.ui.inverted.orange.button,.ui.inverted.orange.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #ff851b inset;box-shadow:0 0 0 2px #ff851b inset;color:#ff851b}.ui.inverted.orange.button.active,.ui.inverted.orange.button:active,.ui.inverted.orange.button:focus,.ui.inverted.orange.button:hover,.ui.inverted.orange.buttons .button.active,.ui.inverted.orange.buttons .button:active,.ui.inverted.orange.buttons .button:focus,.ui.inverted.orange.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.orange.button:hover,.ui.inverted.orange.buttons .button:hover{background-color:#e76b00}.ui.inverted.orange.button:focus,.ui.inverted.orange.buttons .button:focus{background-color:#f17000}.ui.inverted.orange.active.button,.ui.inverted.orange.buttons .active.button{background-color:#ff7701}.ui.inverted.orange.button:active,.ui.inverted.orange.buttons .button:active{background-color:#e76b00}.ui.inverted.orange.basic.button,.ui.inverted.orange.basic.buttons .button,.ui.inverted.orange.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.orange.basic.button:hover,.ui.inverted.orange.basic.buttons .button:hover,.ui.inverted.orange.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #e76b00 inset;box-shadow:0 0 0 2px #e76b00 inset;color:#ff851b}.ui.inverted.orange.basic.button:focus,.ui.inverted.orange.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #f17000 inset;box-shadow:0 0 0 2px #f17000 inset;color:#ff851b}.ui.inverted.orange.basic.active.button,.ui.inverted.orange.basic.buttons .active.button,.ui.inverted.orange.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #ff7701 inset;box-shadow:0 0 0 2px #ff7701 inset;color:#ff851b}.ui.inverted.orange.basic.button:active,.ui.inverted.orange.basic.buttons .button:active,.ui.inverted.orange.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #e76b00 inset;box-shadow:0 0 0 2px #e76b00 inset;color:#ff851b}.ui.tertiary.orange.button,.ui.tertiary.orange.buttons .button,.ui.tertiary.orange.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#f2711c}.ui.tertiary.orange.button:hover,.ui.tertiary.orange.buttons .button:hover,.ui.tertiary.orange.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #da671b;box-shadow:inset 0 -.2em 0 #da671b;color:#da671b}.ui.tertiary.orange.button:focus,.ui.tertiary.orange.buttons .button:focus,.ui.tertiary.orange.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #ce6017;box-shadow:inset 0 -.2em 0 #ce6017;color:#ce6017}.ui.tertiary.orange.active.button,.ui.tertiary.orange.button:active,.ui.tertiary.orange.buttons .active.button,.ui.tertiary.orange.buttons .button:active,.ui.tertiary.orange.buttons .tertiary.active.button,.ui.tertiary.orange.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #f56100;box-shadow:inset 0 -.2em 0 #f56100;color:#f56100}.ui.yellow.button,.ui.yellow.buttons .button{background-color:#fbbd08;color:#fff;text-shadow:none;background-image:none}.ui.yellow.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.yellow.button:hover,.ui.yellow.buttons .button:hover{background-color:#eaae00;color:#fff;text-shadow:none}.ui.yellow.button:focus,.ui.yellow.buttons .button:focus{background-color:#daa300;color:#fff;text-shadow:none}.ui.yellow.button:active,.ui.yellow.buttons .button:active{background-color:#cd9903;color:#fff;text-shadow:none}.ui.yellow.active.button,.ui.yellow.button .active.button:active,.ui.yellow.buttons .active.button,.ui.yellow.buttons .active.button:active{background-color:#eaae00;color:#fff;text-shadow:none}.ui.basic.yellow.button,.ui.basic.yellow.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #fbbd08 inset;box-shadow:0 0 0 1px #fbbd08 inset;color:#fbbd08}.ui.basic.yellow.button:hover,.ui.basic.yellow.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #eaae00 inset;box-shadow:0 0 0 1px #eaae00 inset;color:#eaae00}.ui.basic.yellow.button:focus,.ui.basic.yellow.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #daa300 inset;box-shadow:0 0 0 1px #daa300 inset;color:#eaae00}.ui.basic.yellow.active.button,.ui.basic.yellow.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #eaae00 inset;box-shadow:0 0 0 1px #eaae00 inset;color:#cd9903}.ui.basic.yellow.button:active,.ui.basic.yellow.buttons .button:active{-webkit-box-shadow:0 0 0 1px #cd9903 inset;box-shadow:0 0 0 1px #cd9903 inset;color:#cd9903}.ui.buttons:not(.vertical)>.basic.yellow.button:not(:first-child){margin-left:-1px}.ui.inverted.yellow.button,.ui.inverted.yellow.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #ffe21f inset;box-shadow:0 0 0 2px #ffe21f inset;color:#ffe21f}.ui.inverted.yellow.button.active,.ui.inverted.yellow.button:active,.ui.inverted.yellow.button:focus,.ui.inverted.yellow.button:hover,.ui.inverted.yellow.buttons .button.active,.ui.inverted.yellow.buttons .button:active,.ui.inverted.yellow.buttons .button:focus,.ui.inverted.yellow.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:rgba(0,0,0,.6)}.ui.inverted.yellow.button:hover,.ui.inverted.yellow.buttons .button:hover{background-color:#ebcd00}.ui.inverted.yellow.button:focus,.ui.inverted.yellow.buttons .button:focus{background-color:#f5d500}.ui.inverted.yellow.active.button,.ui.inverted.yellow.buttons .active.button{background-color:#ffdf05}.ui.inverted.yellow.button:active,.ui.inverted.yellow.buttons .button:active{background-color:#ebcd00}.ui.inverted.yellow.basic.button,.ui.inverted.yellow.basic.buttons .button,.ui.inverted.yellow.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.yellow.basic.button:hover,.ui.inverted.yellow.basic.buttons .button:hover,.ui.inverted.yellow.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #ebcd00 inset;box-shadow:0 0 0 2px #ebcd00 inset;color:#ffe21f}.ui.inverted.yellow.basic.button:focus,.ui.inverted.yellow.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #f5d500 inset;box-shadow:0 0 0 2px #f5d500 inset;color:#ffe21f}.ui.inverted.yellow.basic.active.button,.ui.inverted.yellow.basic.buttons .active.button,.ui.inverted.yellow.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #ffdf05 inset;box-shadow:0 0 0 2px #ffdf05 inset;color:#ffe21f}.ui.inverted.yellow.basic.button:active,.ui.inverted.yellow.basic.buttons .button:active,.ui.inverted.yellow.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #ebcd00 inset;box-shadow:0 0 0 2px #ebcd00 inset;color:#ffe21f}.ui.tertiary.yellow.button,.ui.tertiary.yellow.buttons .button,.ui.tertiary.yellow.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#fbbd08}.ui.tertiary.yellow.button:hover,.ui.tertiary.yellow.buttons .button:hover,.ui.tertiary.yellow.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #d2a217;box-shadow:inset 0 -.2em 0 #d2a217;color:#d2a217}.ui.tertiary.yellow.button:focus,.ui.tertiary.yellow.buttons .button:focus,.ui.tertiary.yellow.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #c49816;box-shadow:inset 0 -.2em 0 #c49816;color:#c49816}.ui.tertiary.yellow.active.button,.ui.tertiary.yellow.button:active,.ui.tertiary.yellow.buttons .active.button,.ui.tertiary.yellow.buttons .button:active,.ui.tertiary.yellow.buttons .tertiary.active.button,.ui.tertiary.yellow.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #eaae00;box-shadow:inset 0 -.2em 0 #eaae00;color:#eaae00}.ui.olive.button,.ui.olive.buttons .button{background-color:#b5cc18;color:#fff;text-shadow:none;background-image:none}.ui.olive.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.olive.button:hover,.ui.olive.buttons .button:hover{background-color:#a7bd0d;color:#fff;text-shadow:none}.ui.olive.button:focus,.ui.olive.buttons .button:focus{background-color:#a0b605;color:#fff;text-shadow:none}.ui.olive.button:active,.ui.olive.buttons .button:active{background-color:#8d9e13;color:#fff;text-shadow:none}.ui.olive.active.button,.ui.olive.button .active.button:active,.ui.olive.buttons .active.button,.ui.olive.buttons .active.button:active{background-color:#aac109;color:#fff;text-shadow:none}.ui.basic.olive.button,.ui.basic.olive.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #b5cc18 inset;box-shadow:0 0 0 1px #b5cc18 inset;color:#b5cc18}.ui.basic.olive.button:hover,.ui.basic.olive.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #a7bd0d inset;box-shadow:0 0 0 1px #a7bd0d inset;color:#a7bd0d}.ui.basic.olive.button:focus,.ui.basic.olive.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #a0b605 inset;box-shadow:0 0 0 1px #a0b605 inset;color:#a7bd0d}.ui.basic.olive.active.button,.ui.basic.olive.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #aac109 inset;box-shadow:0 0 0 1px #aac109 inset;color:#8d9e13}.ui.basic.olive.button:active,.ui.basic.olive.buttons .button:active{-webkit-box-shadow:0 0 0 1px #8d9e13 inset;box-shadow:0 0 0 1px #8d9e13 inset;color:#8d9e13}.ui.buttons:not(.vertical)>.basic.olive.button:not(:first-child){margin-left:-1px}.ui.inverted.olive.button,.ui.inverted.olive.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #d9e778 inset;box-shadow:0 0 0 2px #d9e778 inset;color:#d9e778}.ui.inverted.olive.button.active,.ui.inverted.olive.button:active,.ui.inverted.olive.button:focus,.ui.inverted.olive.button:hover,.ui.inverted.olive.buttons .button.active,.ui.inverted.olive.buttons .button:active,.ui.inverted.olive.buttons .button:focus,.ui.inverted.olive.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:rgba(0,0,0,.6)}.ui.inverted.olive.button:hover,.ui.inverted.olive.buttons .button:hover{background-color:#d2e745}.ui.inverted.olive.button:focus,.ui.inverted.olive.buttons .button:focus{background-color:#daef47}.ui.inverted.olive.active.button,.ui.inverted.olive.buttons .active.button{background-color:#daed59}.ui.inverted.olive.button:active,.ui.inverted.olive.buttons .button:active{background-color:#cddf4d}.ui.inverted.olive.basic.button,.ui.inverted.olive.basic.buttons .button,.ui.inverted.olive.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.olive.basic.button:hover,.ui.inverted.olive.basic.buttons .button:hover,.ui.inverted.olive.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #d2e745 inset;box-shadow:0 0 0 2px #d2e745 inset;color:#d9e778}.ui.inverted.olive.basic.button:focus,.ui.inverted.olive.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #daef47 inset;box-shadow:0 0 0 2px #daef47 inset;color:#d9e778}.ui.inverted.olive.basic.active.button,.ui.inverted.olive.basic.buttons .active.button,.ui.inverted.olive.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #daed59 inset;box-shadow:0 0 0 2px #daed59 inset;color:#d9e778}.ui.inverted.olive.basic.button:active,.ui.inverted.olive.basic.buttons .button:active,.ui.inverted.olive.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #cddf4d inset;box-shadow:0 0 0 2px #cddf4d inset;color:#d9e778}.ui.tertiary.olive.button,.ui.tertiary.olive.buttons .button,.ui.tertiary.olive.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#b5cc18}.ui.tertiary.olive.button:hover,.ui.tertiary.olive.buttons .button:hover,.ui.tertiary.olive.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #98a922;box-shadow:inset 0 -.2em 0 #98a922;color:#98a922}.ui.tertiary.olive.button:focus,.ui.tertiary.olive.buttons .button:focus,.ui.tertiary.olive.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #92a418;box-shadow:inset 0 -.2em 0 #92a418;color:#92a418}.ui.tertiary.olive.active.button,.ui.tertiary.olive.button:active,.ui.tertiary.olive.buttons .active.button,.ui.tertiary.olive.buttons .button:active,.ui.tertiary.olive.buttons .tertiary.active.button,.ui.tertiary.olive.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #b1cb00;box-shadow:inset 0 -.2em 0 #b1cb00;color:#aac109}.ui.green.button,.ui.green.buttons .button{background-color:#21ba45;color:#fff;text-shadow:none;background-image:none}.ui.green.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.green.button:hover,.ui.green.buttons .button:hover{background-color:#16ab39;color:#fff;text-shadow:none}.ui.green.button:focus,.ui.green.buttons .button:focus{background-color:#0ea432;color:#fff;text-shadow:none}.ui.green.button:active,.ui.green.buttons .button:active{background-color:#198f35;color:#fff;text-shadow:none}.ui.green.active.button,.ui.green.button .active.button:active,.ui.green.buttons .active.button,.ui.green.buttons .active.button:active{background-color:#13ae38;color:#fff;text-shadow:none}.ui.basic.green.button,.ui.basic.green.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #21ba45 inset;box-shadow:0 0 0 1px #21ba45 inset;color:#21ba45}.ui.basic.green.button:hover,.ui.basic.green.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #16ab39 inset;box-shadow:0 0 0 1px #16ab39 inset;color:#16ab39}.ui.basic.green.button:focus,.ui.basic.green.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #0ea432 inset;box-shadow:0 0 0 1px #0ea432 inset;color:#16ab39}.ui.basic.green.active.button,.ui.basic.green.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #13ae38 inset;box-shadow:0 0 0 1px #13ae38 inset;color:#198f35}.ui.basic.green.button:active,.ui.basic.green.buttons .button:active{-webkit-box-shadow:0 0 0 1px #198f35 inset;box-shadow:0 0 0 1px #198f35 inset;color:#198f35}.ui.buttons:not(.vertical)>.basic.green.button:not(:first-child){margin-left:-1px}.ui.inverted.green.button,.ui.inverted.green.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #2ecc40 inset;box-shadow:0 0 0 2px #2ecc40 inset;color:#2ecc40}.ui.inverted.green.button.active,.ui.inverted.green.button:active,.ui.inverted.green.button:focus,.ui.inverted.green.button:hover,.ui.inverted.green.buttons .button.active,.ui.inverted.green.buttons .button:active,.ui.inverted.green.buttons .button:focus,.ui.inverted.green.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.green.button:hover,.ui.inverted.green.buttons .button:hover{background-color:#1ea92e}.ui.inverted.green.button:focus,.ui.inverted.green.buttons .button:focus{background-color:#19b82b}.ui.inverted.green.active.button,.ui.inverted.green.buttons .active.button{background-color:#1fc231}.ui.inverted.green.button:active,.ui.inverted.green.buttons .button:active{background-color:#25a233}.ui.inverted.green.basic.button,.ui.inverted.green.basic.buttons .button,.ui.inverted.green.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.green.basic.button:hover,.ui.inverted.green.basic.buttons .button:hover,.ui.inverted.green.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #1ea92e inset;box-shadow:0 0 0 2px #1ea92e inset;color:#2ecc40}.ui.inverted.green.basic.button:focus,.ui.inverted.green.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #19b82b inset;box-shadow:0 0 0 2px #19b82b inset;color:#2ecc40}.ui.inverted.green.basic.active.button,.ui.inverted.green.basic.buttons .active.button,.ui.inverted.green.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #1fc231 inset;box-shadow:0 0 0 2px #1fc231 inset;color:#2ecc40}.ui.inverted.green.basic.button:active,.ui.inverted.green.basic.buttons .button:active,.ui.inverted.green.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #25a233 inset;box-shadow:0 0 0 2px #25a233 inset;color:#2ecc40}.ui.tertiary.green.button,.ui.tertiary.green.buttons .button,.ui.tertiary.green.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#21ba45}.ui.tertiary.green.button:hover,.ui.tertiary.green.buttons .button:hover,.ui.tertiary.green.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #2a9844;box-shadow:inset 0 -.2em 0 #2a9844;color:#2a9844}.ui.tertiary.green.button:focus,.ui.tertiary.green.buttons .button:focus,.ui.tertiary.green.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #20923b;box-shadow:inset 0 -.2em 0 #20923b;color:#20923b}.ui.tertiary.green.active.button,.ui.tertiary.green.button:active,.ui.tertiary.green.buttons .active.button,.ui.tertiary.green.buttons .button:active,.ui.tertiary.green.buttons .tertiary.active.button,.ui.tertiary.green.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #00c22e;box-shadow:inset 0 -.2em 0 #00c22e;color:#13ae38}.ui.teal.button,.ui.teal.buttons .button{background-color:#00b5ad;color:#fff;text-shadow:none;background-image:none}.ui.teal.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.teal.button:hover,.ui.teal.buttons .button:hover{background-color:#009c95;color:#fff;text-shadow:none}.ui.teal.button:focus,.ui.teal.buttons .button:focus{background-color:#008c86;color:#fff;text-shadow:none}.ui.teal.button:active,.ui.teal.buttons .button:active{background-color:#00827c;color:#fff;text-shadow:none}.ui.teal.active.button,.ui.teal.button .active.button:active,.ui.teal.buttons .active.button,.ui.teal.buttons .active.button:active{background-color:#009c95;color:#fff;text-shadow:none}.ui.basic.teal.button,.ui.basic.teal.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #00b5ad inset;box-shadow:0 0 0 1px #00b5ad inset;color:#00b5ad}.ui.basic.teal.button:hover,.ui.basic.teal.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #009c95 inset;box-shadow:0 0 0 1px #009c95 inset;color:#009c95}.ui.basic.teal.button:focus,.ui.basic.teal.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #008c86 inset;box-shadow:0 0 0 1px #008c86 inset;color:#009c95}.ui.basic.teal.active.button,.ui.basic.teal.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #009c95 inset;box-shadow:0 0 0 1px #009c95 inset;color:#00827c}.ui.basic.teal.button:active,.ui.basic.teal.buttons .button:active{-webkit-box-shadow:0 0 0 1px #00827c inset;box-shadow:0 0 0 1px #00827c inset;color:#00827c}.ui.buttons:not(.vertical)>.basic.teal.button:not(:first-child){margin-left:-1px}.ui.inverted.teal.button,.ui.inverted.teal.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #6dffff inset;box-shadow:0 0 0 2px #6dffff inset;color:#6dffff}.ui.inverted.teal.button.active,.ui.inverted.teal.button:active,.ui.inverted.teal.button:focus,.ui.inverted.teal.button:hover,.ui.inverted.teal.buttons .button.active,.ui.inverted.teal.buttons .button:active,.ui.inverted.teal.buttons .button:focus,.ui.inverted.teal.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:rgba(0,0,0,.6)}.ui.inverted.teal.button:hover,.ui.inverted.teal.buttons .button:hover{background-color:#3affff}.ui.inverted.teal.button:focus,.ui.inverted.teal.buttons .button:focus{background-color:#4ff}.ui.inverted.teal.active.button,.ui.inverted.teal.buttons .active.button{background-color:#54ffff}.ui.inverted.teal.button:active,.ui.inverted.teal.buttons .button:active{background-color:#3affff}.ui.inverted.teal.basic.button,.ui.inverted.teal.basic.buttons .button,.ui.inverted.teal.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.teal.basic.button:hover,.ui.inverted.teal.basic.buttons .button:hover,.ui.inverted.teal.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #3affff inset;box-shadow:0 0 0 2px #3affff inset;color:#6dffff}.ui.inverted.teal.basic.button:focus,.ui.inverted.teal.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #4ff inset;box-shadow:0 0 0 2px #4ff inset;color:#6dffff}.ui.inverted.teal.basic.active.button,.ui.inverted.teal.basic.buttons .active.button,.ui.inverted.teal.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #54ffff inset;box-shadow:0 0 0 2px #54ffff inset;color:#6dffff}.ui.inverted.teal.basic.button:active,.ui.inverted.teal.basic.buttons .button:active,.ui.inverted.teal.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #3affff inset;box-shadow:0 0 0 2px #3affff inset;color:#6dffff}.ui.tertiary.teal.button,.ui.tertiary.teal.buttons .button,.ui.tertiary.teal.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#00b5ad}.ui.tertiary.teal.button:hover,.ui.tertiary.teal.buttons .button:hover,.ui.tertiary.teal.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #108c86;box-shadow:inset 0 -.2em 0 #108c86;color:#108c86}.ui.tertiary.teal.button:focus,.ui.tertiary.teal.buttons .button:focus,.ui.tertiary.teal.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #0e7e79;box-shadow:inset 0 -.2em 0 #0e7e79;color:#0e7e79}.ui.tertiary.teal.active.button,.ui.tertiary.teal.button:active,.ui.tertiary.teal.buttons .active.button,.ui.tertiary.teal.buttons .button:active,.ui.tertiary.teal.buttons .tertiary.active.button,.ui.tertiary.teal.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #009c95;box-shadow:inset 0 -.2em 0 #009c95;color:#009c95}.ui.blue.button,.ui.blue.buttons .button{background-color:#2185d0;color:#fff;text-shadow:none;background-image:none}.ui.blue.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.blue.button:hover,.ui.blue.buttons .button:hover{background-color:#1678c2;color:#fff;text-shadow:none}.ui.blue.button:focus,.ui.blue.buttons .button:focus{background-color:#0d71bb;color:#fff;text-shadow:none}.ui.blue.button:active,.ui.blue.buttons .button:active{background-color:#1a69a4;color:#fff;text-shadow:none}.ui.blue.active.button,.ui.blue.button .active.button:active,.ui.blue.buttons .active.button,.ui.blue.buttons .active.button:active{background-color:#1279c6;color:#fff;text-shadow:none}.ui.basic.blue.button,.ui.basic.blue.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #2185d0 inset;box-shadow:0 0 0 1px #2185d0 inset;color:#2185d0}.ui.basic.blue.button:hover,.ui.basic.blue.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #1678c2 inset;box-shadow:0 0 0 1px #1678c2 inset;color:#1678c2}.ui.basic.blue.button:focus,.ui.basic.blue.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #0d71bb inset;box-shadow:0 0 0 1px #0d71bb inset;color:#1678c2}.ui.basic.blue.active.button,.ui.basic.blue.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #1279c6 inset;box-shadow:0 0 0 1px #1279c6 inset;color:#1a69a4}.ui.basic.blue.button:active,.ui.basic.blue.buttons .button:active{-webkit-box-shadow:0 0 0 1px #1a69a4 inset;box-shadow:0 0 0 1px #1a69a4 inset;color:#1a69a4}.ui.buttons:not(.vertical)>.basic.blue.button:not(:first-child){margin-left:-1px}.ui.inverted.blue.button,.ui.inverted.blue.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #54c8ff inset;box-shadow:0 0 0 2px #54c8ff inset;color:#54c8ff}.ui.inverted.blue.button.active,.ui.inverted.blue.button:active,.ui.inverted.blue.button:focus,.ui.inverted.blue.button:hover,.ui.inverted.blue.buttons .button.active,.ui.inverted.blue.buttons .button:active,.ui.inverted.blue.buttons .button:focus,.ui.inverted.blue.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.blue.button:hover,.ui.inverted.blue.buttons .button:hover{background-color:#21b8ff}.ui.inverted.blue.button:focus,.ui.inverted.blue.buttons .button:focus{background-color:#2bbbff}.ui.inverted.blue.active.button,.ui.inverted.blue.buttons .active.button{background-color:#3ac0ff}.ui.inverted.blue.button:active,.ui.inverted.blue.buttons .button:active{background-color:#21b8ff}.ui.inverted.blue.basic.button,.ui.inverted.blue.basic.buttons .button,.ui.inverted.blue.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.blue.basic.button:hover,.ui.inverted.blue.basic.buttons .button:hover,.ui.inverted.blue.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #21b8ff inset;box-shadow:0 0 0 2px #21b8ff inset;color:#54c8ff}.ui.inverted.blue.basic.button:focus,.ui.inverted.blue.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #2bbbff inset;box-shadow:0 0 0 2px #2bbbff inset;color:#54c8ff}.ui.inverted.blue.basic.active.button,.ui.inverted.blue.basic.buttons .active.button,.ui.inverted.blue.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #3ac0ff inset;box-shadow:0 0 0 2px #3ac0ff inset;color:#54c8ff}.ui.inverted.blue.basic.button:active,.ui.inverted.blue.basic.buttons .button:active,.ui.inverted.blue.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #21b8ff inset;box-shadow:0 0 0 2px #21b8ff inset;color:#54c8ff}.ui.tertiary.blue.button,.ui.tertiary.blue.buttons .button,.ui.tertiary.blue.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#2185d0}.ui.tertiary.blue.button:hover,.ui.tertiary.blue.buttons .button:hover,.ui.tertiary.blue.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #2b75ac;box-shadow:inset 0 -.2em 0 #2b75ac;color:#2b75ac}.ui.tertiary.blue.button:focus,.ui.tertiary.blue.buttons .button:focus,.ui.tertiary.blue.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #216ea7;box-shadow:inset 0 -.2em 0 #216ea7;color:#216ea7}.ui.tertiary.blue.active.button,.ui.tertiary.blue.button:active,.ui.tertiary.blue.buttons .active.button,.ui.tertiary.blue.buttons .button:active,.ui.tertiary.blue.buttons .tertiary.active.button,.ui.tertiary.blue.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #007bd8;box-shadow:inset 0 -.2em 0 #007bd8;color:#1279c6}.ui.violet.button,.ui.violet.buttons .button{background-color:#6435c9;color:#fff;text-shadow:none;background-image:none}.ui.violet.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.violet.button:hover,.ui.violet.buttons .button:hover{background-color:#5829bb;color:#fff;text-shadow:none}.ui.violet.button:focus,.ui.violet.buttons .button:focus{background-color:#4f20b5;color:#fff;text-shadow:none}.ui.violet.button:active,.ui.violet.buttons .button:active{background-color:#502aa1;color:#fff;text-shadow:none}.ui.violet.active.button,.ui.violet.button .active.button:active,.ui.violet.buttons .active.button,.ui.violet.buttons .active.button:active{background-color:#5626bf;color:#fff;text-shadow:none}.ui.basic.violet.button,.ui.basic.violet.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #6435c9 inset;box-shadow:0 0 0 1px #6435c9 inset;color:#6435c9}.ui.basic.violet.button:hover,.ui.basic.violet.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #5829bb inset;box-shadow:0 0 0 1px #5829bb inset;color:#5829bb}.ui.basic.violet.button:focus,.ui.basic.violet.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #4f20b5 inset;box-shadow:0 0 0 1px #4f20b5 inset;color:#5829bb}.ui.basic.violet.active.button,.ui.basic.violet.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #5626bf inset;box-shadow:0 0 0 1px #5626bf inset;color:#502aa1}.ui.basic.violet.button:active,.ui.basic.violet.buttons .button:active{-webkit-box-shadow:0 0 0 1px #502aa1 inset;box-shadow:0 0 0 1px #502aa1 inset;color:#502aa1}.ui.buttons:not(.vertical)>.basic.violet.button:not(:first-child){margin-left:-1px}.ui.inverted.violet.button,.ui.inverted.violet.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #a291fb inset;box-shadow:0 0 0 2px #a291fb inset;color:#a291fb}.ui.inverted.violet.button.active,.ui.inverted.violet.button:active,.ui.inverted.violet.button:focus,.ui.inverted.violet.button:hover,.ui.inverted.violet.buttons .button.active,.ui.inverted.violet.buttons .button:active,.ui.inverted.violet.buttons .button:focus,.ui.inverted.violet.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.violet.button:hover,.ui.inverted.violet.buttons .button:hover{background-color:#745aff}.ui.inverted.violet.button:focus,.ui.inverted.violet.buttons .button:focus{background-color:#7d64ff}.ui.inverted.violet.active.button,.ui.inverted.violet.buttons .active.button{background-color:#8a73ff}.ui.inverted.violet.button:active,.ui.inverted.violet.buttons .button:active{background-color:#7860f9}.ui.inverted.violet.basic.button,.ui.inverted.violet.basic.buttons .button,.ui.inverted.violet.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.violet.basic.button:hover,.ui.inverted.violet.basic.buttons .button:hover,.ui.inverted.violet.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #745aff inset;box-shadow:0 0 0 2px #745aff inset;color:#a291fb}.ui.inverted.violet.basic.button:focus,.ui.inverted.violet.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #7d64ff inset;box-shadow:0 0 0 2px #7d64ff inset;color:#a291fb}.ui.inverted.violet.basic.active.button,.ui.inverted.violet.basic.buttons .active.button,.ui.inverted.violet.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #8a73ff inset;box-shadow:0 0 0 2px #8a73ff inset;color:#a291fb}.ui.inverted.violet.basic.button:active,.ui.inverted.violet.basic.buttons .button:active,.ui.inverted.violet.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #7860f9 inset;box-shadow:0 0 0 2px #7860f9 inset;color:#a291fb}.ui.tertiary.violet.button,.ui.tertiary.violet.buttons .button,.ui.tertiary.violet.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#6435c9}.ui.tertiary.violet.button:hover,.ui.tertiary.violet.buttons .button:hover,.ui.tertiary.violet.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #6040a5;box-shadow:inset 0 -.2em 0 #6040a5;color:#6040a5}.ui.tertiary.violet.button:focus,.ui.tertiary.violet.buttons .button:focus,.ui.tertiary.violet.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #5735a0;box-shadow:inset 0 -.2em 0 #5735a0;color:#5735a0}.ui.tertiary.violet.active.button,.ui.tertiary.violet.button:active,.ui.tertiary.violet.buttons .active.button,.ui.tertiary.violet.buttons .button:active,.ui.tertiary.violet.buttons .tertiary.active.button,.ui.tertiary.violet.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #4e0fd6;box-shadow:inset 0 -.2em 0 #4e0fd6;color:#5626bf}.ui.purple.button,.ui.purple.buttons .button{background-color:#a333c8;color:#fff;text-shadow:none;background-image:none}.ui.purple.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.purple.button:hover,.ui.purple.buttons .button:hover{background-color:#9627ba;color:#fff;text-shadow:none}.ui.purple.button:focus,.ui.purple.buttons .button:focus{background-color:#8f1eb4;color:#fff;text-shadow:none}.ui.purple.button:active,.ui.purple.buttons .button:active{background-color:#82299f;color:#fff;text-shadow:none}.ui.purple.active.button,.ui.purple.button .active.button:active,.ui.purple.buttons .active.button,.ui.purple.buttons .active.button:active{background-color:#9724be;color:#fff;text-shadow:none}.ui.basic.purple.button,.ui.basic.purple.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #a333c8 inset;box-shadow:0 0 0 1px #a333c8 inset;color:#a333c8}.ui.basic.purple.button:hover,.ui.basic.purple.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #9627ba inset;box-shadow:0 0 0 1px #9627ba inset;color:#9627ba}.ui.basic.purple.button:focus,.ui.basic.purple.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #8f1eb4 inset;box-shadow:0 0 0 1px #8f1eb4 inset;color:#9627ba}.ui.basic.purple.active.button,.ui.basic.purple.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #9724be inset;box-shadow:0 0 0 1px #9724be inset;color:#82299f}.ui.basic.purple.button:active,.ui.basic.purple.buttons .button:active{-webkit-box-shadow:0 0 0 1px #82299f inset;box-shadow:0 0 0 1px #82299f inset;color:#82299f}.ui.buttons:not(.vertical)>.basic.purple.button:not(:first-child){margin-left:-1px}.ui.inverted.purple.button,.ui.inverted.purple.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #dc73ff inset;box-shadow:0 0 0 2px #dc73ff inset;color:#dc73ff}.ui.inverted.purple.button.active,.ui.inverted.purple.button:active,.ui.inverted.purple.button:focus,.ui.inverted.purple.button:hover,.ui.inverted.purple.buttons .button.active,.ui.inverted.purple.buttons .button:active,.ui.inverted.purple.buttons .button:focus,.ui.inverted.purple.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.purple.button:hover,.ui.inverted.purple.buttons .button:hover{background-color:#cf40ff}.ui.inverted.purple.button:focus,.ui.inverted.purple.buttons .button:focus{background-color:#d24aff}.ui.inverted.purple.active.button,.ui.inverted.purple.buttons .active.button{background-color:#d65aff}.ui.inverted.purple.button:active,.ui.inverted.purple.buttons .button:active{background-color:#cf40ff}.ui.inverted.purple.basic.button,.ui.inverted.purple.basic.buttons .button,.ui.inverted.purple.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.purple.basic.button:hover,.ui.inverted.purple.basic.buttons .button:hover,.ui.inverted.purple.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #cf40ff inset;box-shadow:0 0 0 2px #cf40ff inset;color:#dc73ff}.ui.inverted.purple.basic.button:focus,.ui.inverted.purple.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #d24aff inset;box-shadow:0 0 0 2px #d24aff inset;color:#dc73ff}.ui.inverted.purple.basic.active.button,.ui.inverted.purple.basic.buttons .active.button,.ui.inverted.purple.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #d65aff inset;box-shadow:0 0 0 2px #d65aff inset;color:#dc73ff}.ui.inverted.purple.basic.button:active,.ui.inverted.purple.basic.buttons .button:active,.ui.inverted.purple.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #cf40ff inset;box-shadow:0 0 0 2px #cf40ff inset;color:#dc73ff}.ui.tertiary.purple.button,.ui.tertiary.purple.buttons .button,.ui.tertiary.purple.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#a333c8}.ui.tertiary.purple.button:hover,.ui.tertiary.purple.buttons .button:hover,.ui.tertiary.purple.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #8a3ea4;box-shadow:inset 0 -.2em 0 #8a3ea4;color:#8a3ea4}.ui.tertiary.purple.button:focus,.ui.tertiary.purple.buttons .button:focus,.ui.tertiary.purple.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #84339f;box-shadow:inset 0 -.2em 0 #84339f;color:#84339f}.ui.tertiary.purple.active.button,.ui.tertiary.purple.button:active,.ui.tertiary.purple.buttons .active.button,.ui.tertiary.purple.buttons .button:active,.ui.tertiary.purple.buttons .tertiary.active.button,.ui.tertiary.purple.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #a30dd4;box-shadow:inset 0 -.2em 0 #a30dd4;color:#9724be}.ui.pink.button,.ui.pink.buttons .button{background-color:#e03997;color:#fff;text-shadow:none;background-image:none}.ui.pink.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.pink.button:hover,.ui.pink.buttons .button:hover{background-color:#e61a8d;color:#fff;text-shadow:none}.ui.pink.button:focus,.ui.pink.buttons .button:focus{background-color:#e10f85;color:#fff;text-shadow:none}.ui.pink.button:active,.ui.pink.buttons .button:active{background-color:#c71f7e;color:#fff;text-shadow:none}.ui.pink.active.button,.ui.pink.button .active.button:active,.ui.pink.buttons .active.button,.ui.pink.buttons .active.button:active{background-color:#ea158d;color:#fff;text-shadow:none}.ui.basic.pink.button,.ui.basic.pink.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #e03997 inset;box-shadow:0 0 0 1px #e03997 inset;color:#e03997}.ui.basic.pink.button:hover,.ui.basic.pink.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #e61a8d inset;box-shadow:0 0 0 1px #e61a8d inset;color:#e61a8d}.ui.basic.pink.button:focus,.ui.basic.pink.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #e10f85 inset;box-shadow:0 0 0 1px #e10f85 inset;color:#e61a8d}.ui.basic.pink.active.button,.ui.basic.pink.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #ea158d inset;box-shadow:0 0 0 1px #ea158d inset;color:#c71f7e}.ui.basic.pink.button:active,.ui.basic.pink.buttons .button:active{-webkit-box-shadow:0 0 0 1px #c71f7e inset;box-shadow:0 0 0 1px #c71f7e inset;color:#c71f7e}.ui.buttons:not(.vertical)>.basic.pink.button:not(:first-child){margin-left:-1px}.ui.inverted.pink.button,.ui.inverted.pink.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #ff8edf inset;box-shadow:0 0 0 2px #ff8edf inset;color:#ff8edf}.ui.inverted.pink.button.active,.ui.inverted.pink.button:active,.ui.inverted.pink.button:focus,.ui.inverted.pink.button:hover,.ui.inverted.pink.buttons .button.active,.ui.inverted.pink.buttons .button:active,.ui.inverted.pink.buttons .button:focus,.ui.inverted.pink.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.pink.button:hover,.ui.inverted.pink.buttons .button:hover{background-color:#ff5bd1}.ui.inverted.pink.button:focus,.ui.inverted.pink.buttons .button:focus{background-color:#ff65d3}.ui.inverted.pink.active.button,.ui.inverted.pink.buttons .active.button{background-color:#ff74d8}.ui.inverted.pink.button:active,.ui.inverted.pink.buttons .button:active{background-color:#ff5bd1}.ui.inverted.pink.basic.button,.ui.inverted.pink.basic.buttons .button,.ui.inverted.pink.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.pink.basic.button:hover,.ui.inverted.pink.basic.buttons .button:hover,.ui.inverted.pink.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #ff5bd1 inset;box-shadow:0 0 0 2px #ff5bd1 inset;color:#ff8edf}.ui.inverted.pink.basic.button:focus,.ui.inverted.pink.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #ff65d3 inset;box-shadow:0 0 0 2px #ff65d3 inset;color:#ff8edf}.ui.inverted.pink.basic.active.button,.ui.inverted.pink.basic.buttons .active.button,.ui.inverted.pink.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #ff74d8 inset;box-shadow:0 0 0 2px #ff74d8 inset;color:#ff8edf}.ui.inverted.pink.basic.button:active,.ui.inverted.pink.basic.buttons .button:active,.ui.inverted.pink.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #ff5bd1 inset;box-shadow:0 0 0 2px #ff5bd1 inset;color:#ff8edf}.ui.tertiary.pink.button,.ui.tertiary.pink.buttons .button,.ui.tertiary.pink.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#e03997}.ui.tertiary.pink.button:hover,.ui.tertiary.pink.buttons .button:hover,.ui.tertiary.pink.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #cc3389;box-shadow:inset 0 -.2em 0 #cc3389;color:#cc3389}.ui.tertiary.pink.button:focus,.ui.tertiary.pink.buttons .button:focus,.ui.tertiary.pink.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #c92782;box-shadow:inset 0 -.2em 0 #c92782;color:#c92782}.ui.tertiary.pink.active.button,.ui.tertiary.pink.button:active,.ui.tertiary.pink.buttons .active.button,.ui.tertiary.pink.buttons .button:active,.ui.tertiary.pink.buttons .tertiary.active.button,.ui.tertiary.pink.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #ff0090;box-shadow:inset 0 -.2em 0 #ff0090;color:#ea158d}.ui.brown.button,.ui.brown.buttons .button{background-color:#a5673f;color:#fff;text-shadow:none;background-image:none}.ui.brown.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.brown.button:hover,.ui.brown.buttons .button:hover{background-color:#975b33;color:#fff;text-shadow:none}.ui.brown.button:focus,.ui.brown.buttons .button:focus{background-color:#90532b;color:#fff;text-shadow:none}.ui.brown.button:active,.ui.brown.buttons .button:active{background-color:#805031;color:#fff;text-shadow:none}.ui.brown.active.button,.ui.brown.button .active.button:active,.ui.brown.buttons .active.button,.ui.brown.buttons .active.button:active{background-color:#995a31;color:#fff;text-shadow:none}.ui.basic.brown.button,.ui.basic.brown.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #a5673f inset;box-shadow:0 0 0 1px #a5673f inset;color:#a5673f}.ui.basic.brown.button:hover,.ui.basic.brown.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #975b33 inset;box-shadow:0 0 0 1px #975b33 inset;color:#975b33}.ui.basic.brown.button:focus,.ui.basic.brown.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #90532b inset;box-shadow:0 0 0 1px #90532b inset;color:#975b33}.ui.basic.brown.active.button,.ui.basic.brown.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #995a31 inset;box-shadow:0 0 0 1px #995a31 inset;color:#805031}.ui.basic.brown.button:active,.ui.basic.brown.buttons .button:active{-webkit-box-shadow:0 0 0 1px #805031 inset;box-shadow:0 0 0 1px #805031 inset;color:#805031}.ui.buttons:not(.vertical)>.basic.brown.button:not(:first-child){margin-left:-1px}.ui.inverted.brown.button,.ui.inverted.brown.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #d67c1c inset;box-shadow:0 0 0 2px #d67c1c inset;color:#d67c1c}.ui.inverted.brown.button.active,.ui.inverted.brown.button:active,.ui.inverted.brown.button:focus,.ui.inverted.brown.button:hover,.ui.inverted.brown.buttons .button.active,.ui.inverted.brown.buttons .button:active,.ui.inverted.brown.buttons .button:focus,.ui.inverted.brown.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.brown.button:hover,.ui.inverted.brown.buttons .button:hover{background-color:#b0620f}.ui.inverted.brown.button:focus,.ui.inverted.brown.buttons .button:focus{background-color:#c16808}.ui.inverted.brown.active.button,.ui.inverted.brown.buttons .active.button{background-color:#cc6f0d}.ui.inverted.brown.button:active,.ui.inverted.brown.buttons .button:active{background-color:#a96216}.ui.inverted.brown.basic.button,.ui.inverted.brown.basic.buttons .button,.ui.inverted.brown.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.brown.basic.button:hover,.ui.inverted.brown.basic.buttons .button:hover,.ui.inverted.brown.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #b0620f inset;box-shadow:0 0 0 2px #b0620f inset;color:#d67c1c}.ui.inverted.brown.basic.button:focus,.ui.inverted.brown.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #c16808 inset;box-shadow:0 0 0 2px #c16808 inset;color:#d67c1c}.ui.inverted.brown.basic.active.button,.ui.inverted.brown.basic.buttons .active.button,.ui.inverted.brown.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #cc6f0d inset;box-shadow:0 0 0 2px #cc6f0d inset;color:#d67c1c}.ui.inverted.brown.basic.button:active,.ui.inverted.brown.basic.buttons .button:active,.ui.inverted.brown.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #a96216 inset;box-shadow:0 0 0 2px #a96216 inset;color:#d67c1c}.ui.tertiary.brown.button,.ui.tertiary.brown.buttons .button,.ui.tertiary.brown.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#a5673f}.ui.tertiary.brown.button:hover,.ui.tertiary.brown.buttons .button:hover,.ui.tertiary.brown.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #835f48;box-shadow:inset 0 -.2em 0 #835f48;color:#835f48}.ui.tertiary.brown.button:focus,.ui.tertiary.brown.buttons .button:focus,.ui.tertiary.brown.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #7d573e;box-shadow:inset 0 -.2em 0 #7d573e;color:#7d573e}.ui.tertiary.brown.active.button,.ui.tertiary.brown.button:active,.ui.tertiary.brown.buttons .active.button,.ui.tertiary.brown.buttons .button:active,.ui.tertiary.brown.buttons .tertiary.active.button,.ui.tertiary.brown.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #ae561d;box-shadow:inset 0 -.2em 0 #ae561d;color:#995a31}.ui.grey.button,.ui.grey.buttons .button{background-color:#767676;color:#fff;text-shadow:none;background-image:none}.ui.grey.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.grey.button:hover,.ui.grey.buttons .button:hover{background-color:#838383;color:#fff;text-shadow:none}.ui.grey.button:focus,.ui.grey.buttons .button:focus{background-color:#8a8a8a;color:#fff;text-shadow:none}.ui.grey.button:active,.ui.grey.buttons .button:active{background-color:#909090;color:#fff;text-shadow:none}.ui.grey.active.button,.ui.grey.button .active.button:active,.ui.grey.buttons .active.button,.ui.grey.buttons .active.button:active{background-color:#696969;color:#fff;text-shadow:none}.ui.basic.grey.button,.ui.basic.grey.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #767676 inset;box-shadow:0 0 0 1px #767676 inset;color:#767676}.ui.basic.grey.button:hover,.ui.basic.grey.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #838383 inset;box-shadow:0 0 0 1px #838383 inset;color:#838383}.ui.basic.grey.button:focus,.ui.basic.grey.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #8a8a8a inset;box-shadow:0 0 0 1px #8a8a8a inset;color:#838383}.ui.basic.grey.active.button,.ui.basic.grey.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #696969 inset;box-shadow:0 0 0 1px #696969 inset;color:#909090}.ui.basic.grey.button:active,.ui.basic.grey.buttons .button:active{-webkit-box-shadow:0 0 0 1px #909090 inset;box-shadow:0 0 0 1px #909090 inset;color:#909090}.ui.buttons:not(.vertical)>.basic.grey.button:not(:first-child){margin-left:-1px}.ui.inverted.grey.button,.ui.inverted.grey.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #d4d4d5 inset;box-shadow:0 0 0 2px #d4d4d5 inset;color:#fff}.ui.inverted.grey.button.active,.ui.inverted.grey.button:active,.ui.inverted.grey.button:focus,.ui.inverted.grey.button:hover,.ui.inverted.grey.buttons .button.active,.ui.inverted.grey.buttons .button:active,.ui.inverted.grey.buttons .button:focus,.ui.inverted.grey.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:rgba(0,0,0,.6)}.ui.inverted.grey.button:hover,.ui.inverted.grey.buttons .button:hover{background-color:#c2c4c5}.ui.inverted.grey.button:focus,.ui.inverted.grey.buttons .button:focus{background-color:#c7c9cb}.ui.inverted.grey.active.button,.ui.inverted.grey.buttons .active.button{background-color:#cfd0d2}.ui.inverted.grey.button:active,.ui.inverted.grey.buttons .button:active{background-color:#c2c4c5}.ui.inverted.grey.basic.button,.ui.inverted.grey.basic.buttons .button,.ui.inverted.grey.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.grey.basic.button:hover,.ui.inverted.grey.basic.buttons .button:hover,.ui.inverted.grey.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #c2c4c5 inset;box-shadow:0 0 0 2px #c2c4c5 inset;color:#fff}.ui.inverted.grey.basic.button:focus,.ui.inverted.grey.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #c7c9cb inset;box-shadow:0 0 0 2px #c7c9cb inset;color:#dcddde}.ui.inverted.grey.basic.active.button,.ui.inverted.grey.basic.buttons .active.button,.ui.inverted.grey.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #cfd0d2 inset;box-shadow:0 0 0 2px #cfd0d2 inset;color:#fff}.ui.inverted.grey.basic.button:active,.ui.inverted.grey.basic.buttons .button:active,.ui.inverted.grey.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #c2c4c5 inset;box-shadow:0 0 0 2px #c2c4c5 inset;color:#fff}.ui.tertiary.grey.button,.ui.tertiary.grey.buttons .button,.ui.tertiary.grey.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#767676}.ui.tertiary.grey.button:hover,.ui.tertiary.grey.buttons .button:hover,.ui.tertiary.grey.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #838383;box-shadow:inset 0 -.2em 0 #838383;color:#838383}.ui.tertiary.grey.button:focus,.ui.tertiary.grey.buttons .button:focus,.ui.tertiary.grey.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #8a8a8a;box-shadow:inset 0 -.2em 0 #8a8a8a;color:#8a8a8a}.ui.tertiary.grey.active.button,.ui.tertiary.grey.button:active,.ui.tertiary.grey.buttons .active.button,.ui.tertiary.grey.buttons .button:active,.ui.tertiary.grey.buttons .tertiary.active.button,.ui.tertiary.grey.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #7e5454;box-shadow:inset 0 -.2em 0 #7e5454;color:#696969}.ui.black.button,.ui.black.buttons .button{background-color:#1b1c1d;color:#fff;text-shadow:none;background-image:none}.ui.black.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.black.button:hover,.ui.black.buttons .button:hover{background-color:#27292a;color:#fff;text-shadow:none}.ui.black.button:focus,.ui.black.buttons .button:focus{background-color:#2f3032;color:#fff;text-shadow:none}.ui.black.button:active,.ui.black.buttons .button:active{background-color:#343637;color:#fff;text-shadow:none}.ui.black.active.button,.ui.black.button .active.button:active,.ui.black.buttons .active.button,.ui.black.buttons .active.button:active{background-color:#0f0f10;color:#fff;text-shadow:none}.ui.basic.black.button,.ui.basic.black.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #1b1c1d inset;box-shadow:0 0 0 1px #1b1c1d inset;color:#1b1c1d}.ui.basic.black.button:hover,.ui.basic.black.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #27292a inset;box-shadow:0 0 0 1px #27292a inset;color:#27292a}.ui.basic.black.button:focus,.ui.basic.black.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #2f3032 inset;box-shadow:0 0 0 1px #2f3032 inset;color:#27292a}.ui.basic.black.active.button,.ui.basic.black.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #0f0f10 inset;box-shadow:0 0 0 1px #0f0f10 inset;color:#343637}.ui.basic.black.button:active,.ui.basic.black.buttons .button:active{-webkit-box-shadow:0 0 0 1px #343637 inset;box-shadow:0 0 0 1px #343637 inset;color:#343637}.ui.buttons:not(.vertical)>.basic.black.button:not(:first-child){margin-left:-1px}.ui.inverted.black.button,.ui.inverted.black.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #d4d4d5 inset;box-shadow:0 0 0 2px #d4d4d5 inset;color:#fff}.ui.inverted.black.button.active,.ui.inverted.black.button:active,.ui.inverted.black.button:focus,.ui.inverted.black.button:hover,.ui.inverted.black.buttons .button.active,.ui.inverted.black.buttons .button:active,.ui.inverted.black.buttons .button:focus,.ui.inverted.black.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.black.button:hover,.ui.inverted.black.buttons .button:hover{background-color:#000}.ui.inverted.black.button:focus,.ui.inverted.black.buttons .button:focus{background-color:#000}.ui.inverted.black.active.button,.ui.inverted.black.buttons .active.button{background-color:#000}.ui.inverted.black.button:active,.ui.inverted.black.buttons .button:active{background-color:#000}.ui.inverted.black.basic.button,.ui.inverted.black.basic.buttons .button,.ui.inverted.black.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.black.basic.button:hover,.ui.inverted.black.basic.buttons .button:hover,.ui.inverted.black.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #000 inset;box-shadow:0 0 0 2px #000 inset;color:#fff}.ui.inverted.black.basic.button:focus,.ui.inverted.black.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #000 inset;box-shadow:0 0 0 2px #000 inset;color:#545454}.ui.inverted.black.basic.active.button,.ui.inverted.black.basic.buttons .active.button,.ui.inverted.black.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #000 inset;box-shadow:0 0 0 2px #000 inset;color:#fff}.ui.inverted.black.basic.button:active,.ui.inverted.black.basic.buttons .button:active,.ui.inverted.black.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #000 inset;box-shadow:0 0 0 2px #000 inset;color:#fff}.ui.tertiary.black.button,.ui.tertiary.black.buttons .button,.ui.tertiary.black.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#1b1c1d}.ui.tertiary.black.button:hover,.ui.tertiary.black.buttons .button:hover,.ui.tertiary.black.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #8b8f93;box-shadow:inset 0 -.2em 0 #8b8f93;color:#8b8f93}.ui.tertiary.black.button:focus,.ui.tertiary.black.buttons .button:focus,.ui.tertiary.black.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #93969a;box-shadow:inset 0 -.2em 0 #93969a;color:#93969a}.ui.tertiary.black.active.button,.ui.tertiary.black.button:active,.ui.tertiary.black.buttons .active.button,.ui.tertiary.black.buttons .button:active,.ui.tertiary.black.buttons .tertiary.active.button,.ui.tertiary.black.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #404245;box-shadow:inset 0 -.2em 0 #404245;color:#0f0f10}.ui.positive.button,.ui.positive.buttons .button{background-color:#21ba45;color:#fff;text-shadow:none;background-image:none}.ui.positive.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.positive.button:hover,.ui.positive.buttons .button:hover{background-color:#16ab39;color:#fff;text-shadow:none}.ui.positive.button:focus,.ui.positive.buttons .button:focus{background-color:#0ea432;color:#fff;text-shadow:none}.ui.positive.button:active,.ui.positive.buttons .button:active{background-color:#198f35;color:#fff;text-shadow:none}.ui.positive.active.button,.ui.positive.button .active.button:active,.ui.positive.buttons .active.button,.ui.positive.buttons .active.button:active{background-color:#13ae38;color:#fff;text-shadow:none}.ui.basic.positive.button,.ui.basic.positive.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #21ba45 inset;box-shadow:0 0 0 1px #21ba45 inset;color:#21ba45}.ui.basic.positive.button:hover,.ui.basic.positive.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #16ab39 inset;box-shadow:0 0 0 1px #16ab39 inset;color:#16ab39}.ui.basic.positive.button:focus,.ui.basic.positive.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #0ea432 inset;box-shadow:0 0 0 1px #0ea432 inset;color:#16ab39}.ui.basic.positive.active.button,.ui.basic.positive.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #13ae38 inset;box-shadow:0 0 0 1px #13ae38 inset;color:#198f35}.ui.basic.positive.button:active,.ui.basic.positive.buttons .button:active{-webkit-box-shadow:0 0 0 1px #198f35 inset;box-shadow:0 0 0 1px #198f35 inset;color:#198f35}.ui.buttons:not(.vertical)>.basic.positive.button:not(:first-child){margin-left:-1px}.ui.negative.button,.ui.negative.buttons .button{background-color:#db2828;color:#fff;text-shadow:none;background-image:none}.ui.negative.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.negative.button:hover,.ui.negative.buttons .button:hover{background-color:#d01919;color:#fff;text-shadow:none}.ui.negative.button:focus,.ui.negative.buttons .button:focus{background-color:#ca1010;color:#fff;text-shadow:none}.ui.negative.button:active,.ui.negative.buttons .button:active{background-color:#b21e1e;color:#fff;text-shadow:none}.ui.negative.active.button,.ui.negative.button .active.button:active,.ui.negative.buttons .active.button,.ui.negative.buttons .active.button:active{background-color:#d41515;color:#fff;text-shadow:none}.ui.basic.negative.button,.ui.basic.negative.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #db2828 inset;box-shadow:0 0 0 1px #db2828 inset;color:#db2828}.ui.basic.negative.button:hover,.ui.basic.negative.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #d01919 inset;box-shadow:0 0 0 1px #d01919 inset;color:#d01919}.ui.basic.negative.button:focus,.ui.basic.negative.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #ca1010 inset;box-shadow:0 0 0 1px #ca1010 inset;color:#d01919}.ui.basic.negative.active.button,.ui.basic.negative.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #d41515 inset;box-shadow:0 0 0 1px #d41515 inset;color:#b21e1e}.ui.basic.negative.button:active,.ui.basic.negative.buttons .button:active{-webkit-box-shadow:0 0 0 1px #b21e1e inset;box-shadow:0 0 0 1px #b21e1e inset;color:#b21e1e}.ui.buttons:not(.vertical)>.basic.negative.button:not(:first-child){margin-left:-1px}.ui.buttons{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;font-size:0;vertical-align:baseline;margin:0 .25em 0 0}.ui.buttons:not(.basic):not(.inverted){-webkit-box-shadow:none;box-shadow:none}.ui.buttons:after{content:".";display:block;height:0;clear:both;visibility:hidden}.ui.buttons .button{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;border-radius:0;margin:0}.ui.buttons:not(.basic):not(.inverted)>.button:not(.basic):not(.inverted){-webkit-box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset}.ui.buttons .button:first-child{border-left:none;margin-left:0;border-top-left-radius:.28571429rem;border-bottom-left-radius:.28571429rem}.ui.buttons .button:last-child{border-top-right-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.vertical.buttons{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.vertical.buttons .button{display:block;float:none;width:100%;margin:0;-webkit-box-shadow:none;box-shadow:none;border-radius:0}.ui.vertical.buttons .button:first-child{border-top-left-radius:.28571429rem;border-top-right-radius:.28571429rem}.ui.vertical.buttons .button:last-child{margin-bottom:0;border-bottom-left-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.vertical.buttons .button:only-child{border-radius:.28571429rem}/*! + * # Fomantic-UI - Container + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.container{display:block;max-width:100%}@media only screen and (max-width:767.98px){.ui.ui.ui.container:not(.fluid){width:auto;margin-left:1em;margin-right:1em}.ui.ui.ui.grid.container{width:auto}.ui.ui.ui.relaxed.grid.container{width:auto}.ui.ui.ui.very.relaxed.grid.container{width:auto}}@media only screen and (min-width:768px) and (max-width:991.98px){.ui.ui.ui.container:not(.fluid){width:723px;margin-left:auto;margin-right:auto}.ui.ui.ui.grid.container{width:calc(723px + 2rem)}.ui.ui.ui.relaxed.grid.container{width:calc(723px + 3rem)}.ui.ui.ui.very.relaxed.grid.container{width:calc(723px + 5rem)}}@media only screen and (min-width:992px) and (max-width:1199.98px){.ui.ui.ui.container:not(.fluid){width:933px;margin-left:auto;margin-right:auto}.ui.ui.ui.grid.container{width:calc(933px + 2rem)}.ui.ui.ui.relaxed.grid.container{width:calc(933px + 3rem)}.ui.ui.ui.very.relaxed.grid.container{width:calc(933px + 5rem)}}@media only screen and (min-width:1200px){.ui.ui.ui.container:not(.fluid){width:1127px;margin-left:auto;margin-right:auto}.ui.ui.ui.grid.container{width:calc(1127px + 2rem)}.ui.ui.ui.relaxed.grid.container{width:calc(1127px + 3rem)}.ui.ui.ui.very.relaxed.grid.container{width:calc(1127px + 5rem)}}.ui.text.container{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;max-width:700px;line-height:1.5;font-size:1.14285714rem}.ui.fluid.container{width:100%}.ui[class*="left aligned"].container{text-align:left}.ui[class*="center aligned"].container{text-align:center}.ui[class*="right aligned"].container{text-align:right}.ui.justified.container{text-align:justify;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}/*! + * # Fomantic-UI - Divider + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.divider{margin:1rem 0;line-height:1;height:0;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:rgba(0,0,0,.85);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.ui.divider:not(.vertical):not(.horizontal){border-top:1px solid rgba(34,36,38,.15);border-bottom:1px solid rgba(255,255,255,.1)}.ui.grid>.column+.divider,.ui.grid>.row>.column+.divider{left:auto}.ui.horizontal.divider{display:table;white-space:nowrap;height:auto;margin:'';line-height:1;text-align:center}.ui.horizontal.divider:after,.ui.horizontal.divider:before{content:'';display:table-cell;position:relative;top:50%;width:50%;background-repeat:no-repeat}.ui.horizontal.divider:before{background-position:right 1em top 50%}.ui.horizontal.divider:after{background-position:left 1em top 50%}.ui.vertical.divider{position:absolute;z-index:2;top:50%;left:50%;margin:0;padding:0;width:auto;height:50%;line-height:0;text-align:center;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.ui.vertical.divider:after,.ui.vertical.divider:before{position:absolute;left:50%;content:'';z-index:3;border-left:1px solid rgba(34,36,38,.15);border-right:1px solid rgba(255,255,255,.1);width:0;height:calc(100% - 1rem)}.ui.vertical.divider:before{top:-100%}.ui.vertical.divider:after{top:auto;bottom:0}@media only screen and (max-width:767.98px){.ui.grid .stackable.row .ui.vertical.divider,.ui.stackable.grid .ui.vertical.divider{display:table;white-space:nowrap;height:auto;margin:'';overflow:hidden;line-height:1;text-align:center;position:static;top:0;left:0;-webkit-transform:none;transform:none}.ui.grid .stackable.row .ui.vertical.divider:after,.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:before{left:0;border-left:none;border-right:none;content:'';display:table-cell;position:relative;top:50%;width:50%;background-repeat:no-repeat}.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:before{background-position:right 1em top 50%}.ui.grid .stackable.row .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:after{background-position:left 1em top 50%}}.ui.divider>.icon{margin:0;font-size:1rem;height:1em;vertical-align:middle}.ui.horizontal.divider[class*="left aligned"]:before{display:none}.ui.horizontal.divider[class*="left aligned"]:after{width:100%}.ui.horizontal.divider[class*="right aligned"]:before{width:100%}.ui.horizontal.divider[class*="right aligned"]:after{display:none}.ui.hidden.divider{border-color:transparent!important}.ui.hidden.divider:after,.ui.hidden.divider:before{display:none}.ui.divider.inverted,.ui.horizontal.inverted.divider,.ui.vertical.inverted.divider{color:#fff}.ui.divider.inverted,.ui.divider.inverted:after,.ui.divider.inverted:before{border-top-color:rgba(34,36,38,.15)!important;border-left-color:rgba(34,36,38,.15)!important;border-bottom-color:rgba(255,255,255,.15)!important;border-right-color:rgba(255,255,255,.15)!important}.ui.fitted.divider{margin:0}.ui.clearing.divider{clear:both}.ui.section.divider{margin-top:2rem;margin-bottom:2rem}.ui.divider{font-size:1rem}.ui.mini.divider{font-size:.78571429rem}.ui.tiny.divider{font-size:.85714286rem}.ui.small.divider{font-size:.92857143rem}.ui.large.divider{font-size:1.14285714rem}.ui.big.divider{font-size:1.28571429rem}.ui.huge.divider{font-size:1.42857143rem}.ui.massive.divider{font-size:1.71428571rem}.ui.horizontal.divider:after,.ui.horizontal.divider:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC)}@media only screen and (max-width:767px){.ui.grid .stackable.row .ui.vertical.divider:after,.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC)}}/*! + * # Fomantic UI - Emoji + * https://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * https://github.com/fomantic/Fomantic-UI/blob/master/LICENSE.md + * + */em[data-emoji]{opacity:1;speak:none;-webkit-backface-visibility:hidden;backface-visibility:hidden}em[data-emoji]:before{content:'\00A0\00A0\00A0\00A0\00A0\00A0\00A0';display:inline-block;line-height:1.28571429em;background-repeat:no-repeat;background-position:center center}em[data-emoji].disabled{opacity:.45}em[data-emoji].loading:before{-webkit-animation:loader 2s linear infinite;animation:loader 2s linear infinite}em[data-emoji].link{cursor:pointer}em[data-emoji].small{font-size:1.5em;vertical-align:middle}em[data-emoji].medium{font-size:3em;vertical-align:middle}em[data-emoji].large{font-size:6em;vertical-align:middle}em[data-emoji].big{font-size:7.5em;vertical-align:middle}em[data-emoji=":interrobang:"]:before,em[data-emoji=interrobang]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2049.svg)}em[data-emoji=":tm:"]:before,em[data-emoji=tm]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2122.svg)}em[data-emoji=":information_source:"]:before,em[data-emoji=information_source]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2139.svg)}em[data-emoji=":left_right_arrow:"]:before,em[data-emoji=left_right_arrow]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2194.svg)}em[data-emoji=":arrow_up_down:"]:before,em[data-emoji=arrow_up_down]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2195.svg)}em[data-emoji=":arrow_upper_left:"]:before,em[data-emoji=arrow_upper_left]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2196.svg)}em[data-emoji=":arrow_upper_right:"]:before,em[data-emoji=arrow_upper_right]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2197.svg)}em[data-emoji=":arrow_lower_right:"]:before,em[data-emoji=arrow_lower_right]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2198.svg)}em[data-emoji=":arrow_lower_left:"]:before,em[data-emoji=arrow_lower_left]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2199.svg)}em[data-emoji=":keyboard:"]:before,em[data-emoji=keyboard]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2328.svg)}em[data-emoji=":sunny:"]:before,em[data-emoji=sunny]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2600.svg)}em[data-emoji=":cloud:"]:before,em[data-emoji=cloud]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2601.svg)}em[data-emoji=":umbrella2:"]:before,em[data-emoji=umbrella2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2602.svg)}em[data-emoji=":snowman2:"]:before,em[data-emoji=snowman2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2603.svg)}em[data-emoji=":comet:"]:before,em[data-emoji=comet]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2604.svg)}em[data-emoji=":ballot_box_with_check:"]:before,em[data-emoji=ballot_box_with_check]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2611.svg)}em[data-emoji=":umbrella:"]:before,em[data-emoji=umbrella]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2614.svg)}em[data-emoji=":coffee:"]:before,em[data-emoji=coffee]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2615.svg)}em[data-emoji=":shamrock:"]:before,em[data-emoji=shamrock]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2618.svg)}em[data-emoji=":skull_crossbones:"]:before,em[data-emoji=skull_crossbones]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2620.svg)}em[data-emoji=":radioactive:"]:before,em[data-emoji=radioactive]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2622.svg)}em[data-emoji=":biohazard:"]:before,em[data-emoji=biohazard]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2623.svg)}em[data-emoji=":orthodox_cross:"]:before,em[data-emoji=orthodox_cross]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2626.svg)}em[data-emoji=":wheel_of_dharma:"]:before,em[data-emoji=wheel_of_dharma]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2638.svg)}em[data-emoji=":frowning2:"]:before,em[data-emoji=frowning2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2639.svg)}em[data-emoji=":female_sign:"]:before,em[data-emoji=female_sign]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2640.svg)}em[data-emoji=":male_sign:"]:before,em[data-emoji=male_sign]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2642.svg)}em[data-emoji=":aries:"]:before,em[data-emoji=aries]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2648.svg)}em[data-emoji=":taurus:"]:before,em[data-emoji=taurus]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2649.svg)}em[data-emoji=":sagittarius:"]:before,em[data-emoji=sagittarius]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2650.svg)}em[data-emoji=":capricorn:"]:before,em[data-emoji=capricorn]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2651.svg)}em[data-emoji=":aquarius:"]:before,em[data-emoji=aquarius]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2652.svg)}em[data-emoji=":pisces:"]:before,em[data-emoji=pisces]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2653.svg)}em[data-emoji=":spades:"]:before,em[data-emoji=spades]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2660.svg)}em[data-emoji=":clubs:"]:before,em[data-emoji=clubs]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2663.svg)}em[data-emoji=":hearts:"]:before,em[data-emoji=hearts]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2665.svg)}em[data-emoji=":diamonds:"]:before,em[data-emoji=diamonds]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2666.svg)}em[data-emoji=":hotsprings:"]:before,em[data-emoji=hotsprings]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2668.svg)}em[data-emoji=":hammer_pick:"]:before,em[data-emoji=hammer_pick]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2692.svg)}em[data-emoji=":anchor:"]:before,em[data-emoji=anchor]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2693.svg)}em[data-emoji=":crossed_swords:"]:before,em[data-emoji=crossed_swords]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2694.svg)}em[data-emoji=":medical_symbol:"]:before,em[data-emoji=medical_symbol]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2695.svg)}em[data-emoji=":scales:"]:before,em[data-emoji=scales]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2696.svg)}em[data-emoji=":alembic:"]:before,em[data-emoji=alembic]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2697.svg)}em[data-emoji=":gear:"]:before,em[data-emoji=gear]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2699.svg)}em[data-emoji=":scissors:"]:before,em[data-emoji=scissors]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2702.svg)}em[data-emoji=":white_check_mark:"]:before,em[data-emoji=white_check_mark]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2705.svg)}em[data-emoji=":airplane:"]:before,em[data-emoji=airplane]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2708.svg)}em[data-emoji=":envelope:"]:before,em[data-emoji=envelope]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2709.svg)}em[data-emoji=":black_nib:"]:before,em[data-emoji=black_nib]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2712.svg)}em[data-emoji=":heavy_check_mark:"]:before,em[data-emoji=heavy_check_mark]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2714.svg)}em[data-emoji=":heavy_multiplication_x:"]:before,em[data-emoji=heavy_multiplication_x]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2716.svg)}em[data-emoji=":star_of_david:"]:before,em[data-emoji=star_of_david]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2721.svg)}em[data-emoji=":sparkles:"]:before,em[data-emoji=sparkles]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2728.svg)}em[data-emoji=":eight_spoked_asterisk:"]:before,em[data-emoji=eight_spoked_asterisk]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2733.svg)}em[data-emoji=":eight_pointed_black_star:"]:before,em[data-emoji=eight_pointed_black_star]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2734.svg)}em[data-emoji=":snowflake:"]:before,em[data-emoji=snowflake]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2744.svg)}em[data-emoji=":sparkle:"]:before,em[data-emoji=sparkle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2747.svg)}em[data-emoji=":question:"]:before,em[data-emoji=question]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2753.svg)}em[data-emoji=":grey_question:"]:before,em[data-emoji=grey_question]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2754.svg)}em[data-emoji=":grey_exclamation:"]:before,em[data-emoji=grey_exclamation]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2755.svg)}em[data-emoji=":exclamation:"]:before,em[data-emoji=exclamation]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2757.svg)}em[data-emoji=":heart_exclamation:"]:before,em[data-emoji=heart_exclamation]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2763.svg)}em[data-emoji=":heart:"]:before,em[data-emoji=heart]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2764.svg)}em[data-emoji=":heavy_plus_sign:"]:before,em[data-emoji=heavy_plus_sign]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2795.svg)}em[data-emoji=":heavy_minus_sign:"]:before,em[data-emoji=heavy_minus_sign]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2796.svg)}em[data-emoji=":heavy_division_sign:"]:before,em[data-emoji=heavy_division_sign]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2797.svg)}em[data-emoji=":arrow_heading_up:"]:before,em[data-emoji=arrow_heading_up]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2934.svg)}em[data-emoji=":arrow_heading_down:"]:before,em[data-emoji=arrow_heading_down]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2935.svg)}em[data-emoji=":wavy_dash:"]:before,em[data-emoji=wavy_dash]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/3030.svg)}em[data-emoji=":congratulations:"]:before,em[data-emoji=congratulations]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/3297.svg)}em[data-emoji=":secret:"]:before,em[data-emoji=secret]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/3299.svg)}em[data-emoji=":orange_heart:"]:before,em[data-emoji=orange_heart]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9e1.svg)}em[data-emoji=":yellow_heart:"]:before,em[data-emoji=yellow_heart]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f49b.svg)}em[data-emoji=":green_heart:"]:before,em[data-emoji=green_heart]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f49a.svg)}em[data-emoji=":blue_heart:"]:before,em[data-emoji=blue_heart]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f499.svg)}em[data-emoji=":purple_heart:"]:before,em[data-emoji=purple_heart]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f49c.svg)}em[data-emoji=":black_heart:"]:before,em[data-emoji=black_heart]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5a4.svg)}em[data-emoji=":brown_heart:"]:before,em[data-emoji=brown_heart]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f90e.svg)}em[data-emoji=":white_heart:"]:before,em[data-emoji=white_heart]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f90d.svg)}em[data-emoji=":broken_heart:"]:before,em[data-emoji=broken_heart]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f494.svg)}em[data-emoji=":two_hearts:"]:before,em[data-emoji=two_hearts]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f495.svg)}em[data-emoji=":revolving_hearts:"]:before,em[data-emoji=revolving_hearts]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f49e.svg)}em[data-emoji=":heartbeat:"]:before,em[data-emoji=heartbeat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f493.svg)}em[data-emoji=":heartpulse:"]:before,em[data-emoji=heartpulse]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f497.svg)}em[data-emoji=":sparkling_heart:"]:before,em[data-emoji=sparkling_heart]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f496.svg)}em[data-emoji=":cupid:"]:before,em[data-emoji=cupid]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f498.svg)}em[data-emoji=":gift_heart:"]:before,em[data-emoji=gift_heart]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f49d.svg)}em[data-emoji=":heart_decoration:"]:before,em[data-emoji=heart_decoration]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f49f.svg)}em[data-emoji=":peace:"]:before,em[data-emoji=peace]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/262e.svg)}em[data-emoji=":cross:"]:before,em[data-emoji=cross]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/271d.svg)}em[data-emoji=":star_and_crescent:"]:before,em[data-emoji=star_and_crescent]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/262a.svg)}em[data-emoji=":om_symbol:"]:before,em[data-emoji=om_symbol]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f549.svg)}em[data-emoji=":six_pointed_star:"]:before,em[data-emoji=six_pointed_star]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f52f.svg)}em[data-emoji=":menorah:"]:before,em[data-emoji=menorah]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f54e.svg)}em[data-emoji=":yin_yang:"]:before,em[data-emoji=yin_yang]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/262f.svg)}em[data-emoji=":place_of_worship:"]:before,em[data-emoji=place_of_worship]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6d0.svg)}em[data-emoji=":ophiuchus:"]:before,em[data-emoji=ophiuchus]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26ce.svg)}em[data-emoji=":gemini:"]:before,em[data-emoji=gemini]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/264a.svg)}em[data-emoji=":cancer:"]:before,em[data-emoji=cancer]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/264b.svg)}em[data-emoji=":leo:"]:before,em[data-emoji=leo]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/264c.svg)}em[data-emoji=":virgo:"]:before,em[data-emoji=virgo]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/264d.svg)}em[data-emoji=":libra:"]:before,em[data-emoji=libra]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/264e.svg)}em[data-emoji=":scorpius:"]:before,em[data-emoji=scorpius]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/264f.svg)}em[data-emoji=":id:"]:before,em[data-emoji=id]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f194.svg)}em[data-emoji=":atom:"]:before,em[data-emoji=atom]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/269b.svg)}em[data-emoji=":accept:"]:before,em[data-emoji=accept]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f251.svg)}em[data-emoji=":mobile_phone_off:"]:before,em[data-emoji=mobile_phone_off]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4f4.svg)}em[data-emoji=":vibration_mode:"]:before,em[data-emoji=vibration_mode]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4f3.svg)}em[data-emoji=":u6709:"]:before,em[data-emoji=u6709]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f236.svg)}em[data-emoji=":u7121:"]:before,em[data-emoji=u7121]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f21a.svg)}em[data-emoji=":u7533:"]:before,em[data-emoji=u7533]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f238.svg)}em[data-emoji=":u55b6:"]:before,em[data-emoji=u55b6]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f23a.svg)}em[data-emoji=":u6708:"]:before,em[data-emoji=u6708]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f237.svg)}em[data-emoji=":vs:"]:before,em[data-emoji=vs]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f19a.svg)}em[data-emoji=":white_flower:"]:before,em[data-emoji=white_flower]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4ae.svg)}em[data-emoji=":ideograph_advantage:"]:before,em[data-emoji=ideograph_advantage]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f250.svg)}em[data-emoji=":u5408:"]:before,em[data-emoji=u5408]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f234.svg)}em[data-emoji=":u6e80:"]:before,em[data-emoji=u6e80]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f235.svg)}em[data-emoji=":u5272:"]:before,em[data-emoji=u5272]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f239.svg)}em[data-emoji=":u7981:"]:before,em[data-emoji=u7981]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f232.svg)}em[data-emoji=":a:"]:before,em[data-emoji="a"]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f170.svg)}em[data-emoji=":b:"]:before,em[data-emoji="b"]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f171.svg)}em[data-emoji=":ab:"]:before,em[data-emoji=ab]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f18e.svg)}em[data-emoji=":cl:"]:before,em[data-emoji=cl]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f191.svg)}em[data-emoji=":o2:"]:before,em[data-emoji=o2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f17e.svg)}em[data-emoji=":sos:"]:before,em[data-emoji=sos]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f198.svg)}em[data-emoji=":x:"]:before,em[data-emoji="x"]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/274c.svg)}em[data-emoji=":o:"]:before,em[data-emoji="o"]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2b55.svg)}em[data-emoji=":octagonal_sign:"]:before,em[data-emoji=octagonal_sign]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6d1.svg)}em[data-emoji=":no_entry:"]:before,em[data-emoji=no_entry]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26d4.svg)}em[data-emoji=":name_badge:"]:before,em[data-emoji=name_badge]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4db.svg)}em[data-emoji=":no_entry_sign:"]:before,em[data-emoji=no_entry_sign]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6ab.svg)}em[data-emoji="100"]:before,em[data-emoji=":100:"]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4af.svg)}em[data-emoji=":anger:"]:before,em[data-emoji=anger]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4a2.svg)}em[data-emoji=":no_pedestrians:"]:before,em[data-emoji=no_pedestrians]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b7.svg)}em[data-emoji=":do_not_litter:"]:before,em[data-emoji=do_not_litter]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6af.svg)}em[data-emoji=":no_bicycles:"]:before,em[data-emoji=no_bicycles]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b3.svg)}em[data-emoji=":non-potable_water:"]:before,em[data-emoji=non-potable_water]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b1.svg)}em[data-emoji=":underage:"]:before,em[data-emoji=underage]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f51e.svg)}em[data-emoji=":no_mobile_phones:"]:before,em[data-emoji=no_mobile_phones]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4f5.svg)}em[data-emoji=":no_smoking:"]:before,em[data-emoji=no_smoking]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6ad.svg)}em[data-emoji=":bangbang:"]:before,em[data-emoji=bangbang]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/203c.svg)}em[data-emoji=":low_brightness:"]:before,em[data-emoji=low_brightness]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f505.svg)}em[data-emoji=":high_brightness:"]:before,em[data-emoji=high_brightness]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f506.svg)}em[data-emoji=":part_alternation_mark:"]:before,em[data-emoji=part_alternation_mark]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/303d.svg)}em[data-emoji=":warning:"]:before,em[data-emoji=warning]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26a0.svg)}em[data-emoji=":children_crossing:"]:before,em[data-emoji=children_crossing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b8.svg)}em[data-emoji=":trident:"]:before,em[data-emoji=trident]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f531.svg)}em[data-emoji=":fleur-de-lis:"]:before,em[data-emoji=fleur-de-lis]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/269c.svg)}em[data-emoji=":beginner:"]:before,em[data-emoji=beginner]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f530.svg)}em[data-emoji=":recycle:"]:before,em[data-emoji=recycle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/267b.svg)}em[data-emoji=":u6307:"]:before,em[data-emoji=u6307]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f22f.svg)}em[data-emoji=":chart:"]:before,em[data-emoji=chart]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4b9.svg)}em[data-emoji=":negative_squared_cross_mark:"]:before,em[data-emoji=negative_squared_cross_mark]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/274e.svg)}em[data-emoji=":globe_with_meridians:"]:before,em[data-emoji=globe_with_meridians]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f310.svg)}em[data-emoji=":diamond_shape_with_a_dot_inside:"]:before,em[data-emoji=diamond_shape_with_a_dot_inside]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4a0.svg)}em[data-emoji=":m:"]:before,em[data-emoji="m"]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/24c2.svg)}em[data-emoji=":cyclone:"]:before,em[data-emoji=cyclone]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f300.svg)}em[data-emoji=":zzz:"]:before,em[data-emoji=zzz]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4a4.svg)}em[data-emoji=":atm:"]:before,em[data-emoji=atm]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3e7.svg)}em[data-emoji=":wc:"]:before,em[data-emoji=wc]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6be.svg)}em[data-emoji=":wheelchair:"]:before,em[data-emoji=wheelchair]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/267f.svg)}em[data-emoji=":parking:"]:before,em[data-emoji=parking]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f17f.svg)}em[data-emoji=":u7a7a:"]:before,em[data-emoji=u7a7a]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f233.svg)}em[data-emoji=":sa:"]:before,em[data-emoji=sa]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f202.svg)}em[data-emoji=":passport_control:"]:before,em[data-emoji=passport_control]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6c2.svg)}em[data-emoji=":customs:"]:before,em[data-emoji=customs]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6c3.svg)}em[data-emoji=":baggage_claim:"]:before,em[data-emoji=baggage_claim]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6c4.svg)}em[data-emoji=":left_luggage:"]:before,em[data-emoji=left_luggage]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6c5.svg)}em[data-emoji=":mens:"]:before,em[data-emoji=mens]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b9.svg)}em[data-emoji=":womens:"]:before,em[data-emoji=womens]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6ba.svg)}em[data-emoji=":baby_symbol:"]:before,em[data-emoji=baby_symbol]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6bc.svg)}em[data-emoji=":restroom:"]:before,em[data-emoji=restroom]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6bb.svg)}em[data-emoji=":put_litter_in_its_place:"]:before,em[data-emoji=put_litter_in_its_place]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6ae.svg)}em[data-emoji=":cinema:"]:before,em[data-emoji=cinema]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3a6.svg)}em[data-emoji=":signal_strength:"]:before,em[data-emoji=signal_strength]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4f6.svg)}em[data-emoji=":koko:"]:before,em[data-emoji=koko]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f201.svg)}em[data-emoji=":symbols:"]:before,em[data-emoji=symbols]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f523.svg)}em[data-emoji=":abc:"]:before,em[data-emoji=abc]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f524.svg)}em[data-emoji=":abcd:"]:before,em[data-emoji=abcd]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f521.svg)}em[data-emoji=":capital_abcd:"]:before,em[data-emoji=capital_abcd]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f520.svg)}em[data-emoji=":ng:"]:before,em[data-emoji=ng]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f196.svg)}em[data-emoji=":ok:"]:before,em[data-emoji=ok]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f197.svg)}em[data-emoji=":up:"]:before,em[data-emoji=up]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f199.svg)}em[data-emoji=":cool:"]:before,em[data-emoji=cool]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f192.svg)}em[data-emoji=":new:"]:before,em[data-emoji=new]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f195.svg)}em[data-emoji=":free:"]:before,em[data-emoji=free]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f193.svg)}em[data-emoji=":zero:"]:before,em[data-emoji=zero]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/30-20e3.svg)}em[data-emoji=":one:"]:before,em[data-emoji=one]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/31-20e3.svg)}em[data-emoji=":two:"]:before,em[data-emoji=two]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/32-20e3.svg)}em[data-emoji=":three:"]:before,em[data-emoji=three]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/33-20e3.svg)}em[data-emoji=":four:"]:before,em[data-emoji=four]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/34-20e3.svg)}em[data-emoji=":five:"]:before,em[data-emoji=five]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/35-20e3.svg)}em[data-emoji=":six:"]:before,em[data-emoji=six]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/36-20e3.svg)}em[data-emoji=":seven:"]:before,em[data-emoji=seven]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/37-20e3.svg)}em[data-emoji=":eight:"]:before,em[data-emoji=eight]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/38-20e3.svg)}em[data-emoji=":nine:"]:before,em[data-emoji=nine]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/39-20e3.svg)}em[data-emoji=":keycap_ten:"]:before,em[data-emoji=keycap_ten]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f51f.svg)}em[data-emoji="1234"]:before,em[data-emoji=":1234:"]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f522.svg)}em[data-emoji=":hash:"]:before,em[data-emoji=hash]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/23-20e3.svg)}em[data-emoji=":asterisk:"]:before,em[data-emoji=asterisk]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2a-20e3.svg)}em[data-emoji=":eject:"]:before,em[data-emoji=eject]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/23cf.svg)}em[data-emoji=":arrow_forward:"]:before,em[data-emoji=arrow_forward]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/25b6.svg)}em[data-emoji=":pause_button:"]:before,em[data-emoji=pause_button]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/23f8.svg)}em[data-emoji=":play_pause:"]:before,em[data-emoji=play_pause]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/23ef.svg)}em[data-emoji=":stop_button:"]:before,em[data-emoji=stop_button]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/23f9.svg)}em[data-emoji=":record_button:"]:before,em[data-emoji=record_button]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/23fa.svg)}em[data-emoji=":track_next:"]:before,em[data-emoji=track_next]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/23ed.svg)}em[data-emoji=":track_previous:"]:before,em[data-emoji=track_previous]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/23ee.svg)}em[data-emoji=":fast_forward:"]:before,em[data-emoji=fast_forward]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/23e9.svg)}em[data-emoji=":rewind:"]:before,em[data-emoji=rewind]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/23ea.svg)}em[data-emoji=":arrow_double_up:"]:before,em[data-emoji=arrow_double_up]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/23eb.svg)}em[data-emoji=":arrow_double_down:"]:before,em[data-emoji=arrow_double_down]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/23ec.svg)}em[data-emoji=":arrow_backward:"]:before,em[data-emoji=arrow_backward]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/25c0.svg)}em[data-emoji=":arrow_up_small:"]:before,em[data-emoji=arrow_up_small]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f53c.svg)}em[data-emoji=":arrow_down_small:"]:before,em[data-emoji=arrow_down_small]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f53d.svg)}em[data-emoji=":arrow_right:"]:before,em[data-emoji=arrow_right]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/27a1.svg)}em[data-emoji=":arrow_left:"]:before,em[data-emoji=arrow_left]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2b05.svg)}em[data-emoji=":arrow_up:"]:before,em[data-emoji=arrow_up]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2b06.svg)}em[data-emoji=":arrow_down:"]:before,em[data-emoji=arrow_down]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2b07.svg)}em[data-emoji=":arrow_right_hook:"]:before,em[data-emoji=arrow_right_hook]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/21aa.svg)}em[data-emoji=":leftwards_arrow_with_hook:"]:before,em[data-emoji=leftwards_arrow_with_hook]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/21a9.svg)}em[data-emoji=":twisted_rightwards_arrows:"]:before,em[data-emoji=twisted_rightwards_arrows]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f500.svg)}em[data-emoji=":repeat:"]:before,em[data-emoji=repeat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f501.svg)}em[data-emoji=":repeat_one:"]:before,em[data-emoji=repeat_one]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f502.svg)}em[data-emoji=":arrows_counterclockwise:"]:before,em[data-emoji=arrows_counterclockwise]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f504.svg)}em[data-emoji=":arrows_clockwise:"]:before,em[data-emoji=arrows_clockwise]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f503.svg)}em[data-emoji=":musical_note:"]:before,em[data-emoji=musical_note]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3b5.svg)}em[data-emoji=":notes:"]:before,em[data-emoji=notes]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3b6.svg)}em[data-emoji=":infinity:"]:before,em[data-emoji=infinity]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/267e.svg)}em[data-emoji=":heavy_dollar_sign:"]:before,em[data-emoji=heavy_dollar_sign]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4b2.svg)}em[data-emoji=":currency_exchange:"]:before,em[data-emoji=currency_exchange]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4b1.svg)}em[data-emoji=":copyright:"]:before,em[data-emoji=copyright]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/a9.svg)}em[data-emoji=":registered:"]:before,em[data-emoji=registered]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/ae.svg)}em[data-emoji=":curly_loop:"]:before,em[data-emoji=curly_loop]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/27b0.svg)}em[data-emoji=":loop:"]:before,em[data-emoji=loop]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/27bf.svg)}em[data-emoji=":end:"]:before,em[data-emoji=end]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f51a.svg)}em[data-emoji=":back:"]:before,em[data-emoji=back]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f519.svg)}em[data-emoji=":on:"]:before,em[data-emoji=on]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f51b.svg)}em[data-emoji=":top:"]:before,em[data-emoji=top]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f51d.svg)}em[data-emoji=":soon:"]:before,em[data-emoji=soon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f51c.svg)}em[data-emoji=":radio_button:"]:before,em[data-emoji=radio_button]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f518.svg)}em[data-emoji=":white_circle:"]:before,em[data-emoji=white_circle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26aa.svg)}em[data-emoji=":black_circle:"]:before,em[data-emoji=black_circle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26ab.svg)}em[data-emoji=":red_circle:"]:before,em[data-emoji=red_circle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f534.svg)}em[data-emoji=":blue_circle:"]:before,em[data-emoji=blue_circle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f535.svg)}em[data-emoji=":brown_circle:"]:before,em[data-emoji=brown_circle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f7e4.svg)}em[data-emoji=":purple_circle:"]:before,em[data-emoji=purple_circle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f7e3.svg)}em[data-emoji=":green_circle:"]:before,em[data-emoji=green_circle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f7e2.svg)}em[data-emoji=":yellow_circle:"]:before,em[data-emoji=yellow_circle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f7e1.svg)}em[data-emoji=":orange_circle:"]:before,em[data-emoji=orange_circle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f7e0.svg)}em[data-emoji=":small_red_triangle:"]:before,em[data-emoji=small_red_triangle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f53a.svg)}em[data-emoji=":small_red_triangle_down:"]:before,em[data-emoji=small_red_triangle_down]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f53b.svg)}em[data-emoji=":small_orange_diamond:"]:before,em[data-emoji=small_orange_diamond]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f538.svg)}em[data-emoji=":small_blue_diamond:"]:before,em[data-emoji=small_blue_diamond]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f539.svg)}em[data-emoji=":large_orange_diamond:"]:before,em[data-emoji=large_orange_diamond]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f536.svg)}em[data-emoji=":large_blue_diamond:"]:before,em[data-emoji=large_blue_diamond]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f537.svg)}em[data-emoji=":white_square_button:"]:before,em[data-emoji=white_square_button]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f533.svg)}em[data-emoji=":black_square_button:"]:before,em[data-emoji=black_square_button]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f532.svg)}em[data-emoji=":black_small_square:"]:before,em[data-emoji=black_small_square]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/25aa.svg)}em[data-emoji=":white_small_square:"]:before,em[data-emoji=white_small_square]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/25ab.svg)}em[data-emoji=":black_medium_small_square:"]:before,em[data-emoji=black_medium_small_square]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/25fe.svg)}em[data-emoji=":white_medium_small_square:"]:before,em[data-emoji=white_medium_small_square]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/25fd.svg)}em[data-emoji=":black_medium_square:"]:before,em[data-emoji=black_medium_square]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/25fc.svg)}em[data-emoji=":white_medium_square:"]:before,em[data-emoji=white_medium_square]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/25fb.svg)}em[data-emoji=":black_large_square:"]:before,em[data-emoji=black_large_square]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2b1b.svg)}em[data-emoji=":white_large_square:"]:before,em[data-emoji=white_large_square]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2b1c.svg)}em[data-emoji=":orange_square:"]:before,em[data-emoji=orange_square]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f7e7.svg)}em[data-emoji=":blue_square:"]:before,em[data-emoji=blue_square]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f7e6.svg)}em[data-emoji=":red_square:"]:before,em[data-emoji=red_square]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f7e5.svg)}em[data-emoji=":brown_square:"]:before,em[data-emoji=brown_square]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f7eb.svg)}em[data-emoji=":purple_square:"]:before,em[data-emoji=purple_square]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f7ea.svg)}em[data-emoji=":green_square:"]:before,em[data-emoji=green_square]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f7e9.svg)}em[data-emoji=":yellow_square:"]:before,em[data-emoji=yellow_square]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f7e8.svg)}em[data-emoji=":speaker:"]:before,em[data-emoji=speaker]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f508.svg)}em[data-emoji=":mute:"]:before,em[data-emoji=mute]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f507.svg)}em[data-emoji=":sound:"]:before,em[data-emoji=sound]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f509.svg)}em[data-emoji=":loud_sound:"]:before,em[data-emoji=loud_sound]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f50a.svg)}em[data-emoji=":bell:"]:before,em[data-emoji=bell]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f514.svg)}em[data-emoji=":no_bell:"]:before,em[data-emoji=no_bell]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f515.svg)}em[data-emoji=":mega:"]:before,em[data-emoji=mega]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4e3.svg)}em[data-emoji=":loudspeaker:"]:before,em[data-emoji=loudspeaker]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4e2.svg)}em[data-emoji=":speech_left:"]:before,em[data-emoji=speech_left]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5e8.svg)}em[data-emoji=":eye_in_speech_bubble:"]:before,em[data-emoji=eye_in_speech_bubble]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f441-200d-1f5e8.svg)}em[data-emoji=":speech_balloon:"]:before,em[data-emoji=speech_balloon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4ac.svg)}em[data-emoji=":thought_balloon:"]:before,em[data-emoji=thought_balloon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4ad.svg)}em[data-emoji=":anger_right:"]:before,em[data-emoji=anger_right]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5ef.svg)}em[data-emoji=":black_joker:"]:before,em[data-emoji=black_joker]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f0cf.svg)}em[data-emoji=":flower_playing_cards:"]:before,em[data-emoji=flower_playing_cards]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3b4.svg)}em[data-emoji=":mahjong:"]:before,em[data-emoji=mahjong]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f004.svg)}em[data-emoji=":clock1:"]:before,em[data-emoji=clock1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f550.svg)}em[data-emoji=":clock2:"]:before,em[data-emoji=clock2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f551.svg)}em[data-emoji=":clock3:"]:before,em[data-emoji=clock3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f552.svg)}em[data-emoji=":clock4:"]:before,em[data-emoji=clock4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f553.svg)}em[data-emoji=":clock5:"]:before,em[data-emoji=clock5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f554.svg)}em[data-emoji=":clock6:"]:before,em[data-emoji=clock6]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f555.svg)}em[data-emoji=":clock7:"]:before,em[data-emoji=clock7]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f556.svg)}em[data-emoji=":clock8:"]:before,em[data-emoji=clock8]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f557.svg)}em[data-emoji=":clock9:"]:before,em[data-emoji=clock9]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f558.svg)}em[data-emoji=":clock10:"]:before,em[data-emoji=clock10]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f559.svg)}em[data-emoji=":clock11:"]:before,em[data-emoji=clock11]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f55a.svg)}em[data-emoji=":clock12:"]:before,em[data-emoji=clock12]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f55b.svg)}em[data-emoji=":clock130:"]:before,em[data-emoji=clock130]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f55c.svg)}em[data-emoji=":clock230:"]:before,em[data-emoji=clock230]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f55d.svg)}em[data-emoji=":clock330:"]:before,em[data-emoji=clock330]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f55e.svg)}em[data-emoji=":clock430:"]:before,em[data-emoji=clock430]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f55f.svg)}em[data-emoji=":clock530:"]:before,em[data-emoji=clock530]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f560.svg)}em[data-emoji=":clock630:"]:before,em[data-emoji=clock630]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f561.svg)}em[data-emoji=":clock730:"]:before,em[data-emoji=clock730]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f562.svg)}em[data-emoji=":clock830:"]:before,em[data-emoji=clock830]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f563.svg)}em[data-emoji=":clock930:"]:before,em[data-emoji=clock930]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f564.svg)}em[data-emoji=":clock1030:"]:before,em[data-emoji=clock1030]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f565.svg)}em[data-emoji=":clock1130:"]:before,em[data-emoji=clock1130]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f566.svg)}em[data-emoji=":clock1230:"]:before,em[data-emoji=clock1230]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f567.svg)}em[data-emoji=":digit_zero:"]:before,em[data-emoji=digit_zero]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/30-20e3.svg)}em[data-emoji=":digit_one:"]:before,em[data-emoji=digit_one]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/31-20e3.svg)}em[data-emoji=":digit_two:"]:before,em[data-emoji=digit_two]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/32-20e3.svg)}em[data-emoji=":digit_three:"]:before,em[data-emoji=digit_three]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/33-20e3.svg)}em[data-emoji=":digit_four:"]:before,em[data-emoji=digit_four]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/34-20e3.svg)}em[data-emoji=":digit_five:"]:before,em[data-emoji=digit_five]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/35-20e3.svg)}em[data-emoji=":digit_six:"]:before,em[data-emoji=digit_six]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/36-20e3.svg)}em[data-emoji=":digit_seven:"]:before,em[data-emoji=digit_seven]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/37-20e3.svg)}em[data-emoji=":digit_eight:"]:before,em[data-emoji=digit_eight]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/38-20e3.svg)}em[data-emoji=":digit_nine:"]:before,em[data-emoji=digit_nine]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/39-20e3.svg)}em[data-emoji=":pound_symbol:"]:before,em[data-emoji=pound_symbol]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/23-20e3.svg)}em[data-emoji=":asterisk_symbol:"]:before,em[data-emoji=asterisk_symbol]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2a-20e3.svg)}em[data-emoji=":soccer:"]:before,em[data-emoji=soccer]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26bd.svg)}em[data-emoji=":basketball:"]:before,em[data-emoji=basketball]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c0.svg)}em[data-emoji=":football:"]:before,em[data-emoji=football]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c8.svg)}em[data-emoji=":baseball:"]:before,em[data-emoji=baseball]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26be.svg)}em[data-emoji=":softball:"]:before,em[data-emoji=softball]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f94e.svg)}em[data-emoji=":tennis:"]:before,em[data-emoji=tennis]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3be.svg)}em[data-emoji=":volleyball:"]:before,em[data-emoji=volleyball]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3d0.svg)}em[data-emoji=":rugby_football:"]:before,em[data-emoji=rugby_football]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c9.svg)}em[data-emoji=":flying_disc:"]:before,em[data-emoji=flying_disc]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f94f.svg)}em[data-emoji="8ball"]:before,em[data-emoji=":8ball:"]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3b1.svg)}em[data-emoji=":ping_pong:"]:before,em[data-emoji=ping_pong]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3d3.svg)}em[data-emoji=":badminton:"]:before,em[data-emoji=badminton]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3f8.svg)}em[data-emoji=":hockey:"]:before,em[data-emoji=hockey]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3d2.svg)}em[data-emoji=":field_hockey:"]:before,em[data-emoji=field_hockey]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3d1.svg)}em[data-emoji=":lacrosse:"]:before,em[data-emoji=lacrosse]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f94d.svg)}em[data-emoji=":cricket_game:"]:before,em[data-emoji=cricket_game]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cf.svg)}em[data-emoji=":goal:"]:before,em[data-emoji=goal]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f945.svg)}em[data-emoji=":golf:"]:before,em[data-emoji=golf]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f3.svg)}em[data-emoji=":bow_and_arrow:"]:before,em[data-emoji=bow_and_arrow]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3f9.svg)}em[data-emoji=":fishing_pole_and_fish:"]:before,em[data-emoji=fishing_pole_and_fish]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3a3.svg)}em[data-emoji=":boxing_glove:"]:before,em[data-emoji=boxing_glove]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f94a.svg)}em[data-emoji=":martial_arts_uniform:"]:before,em[data-emoji=martial_arts_uniform]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f94b.svg)}em[data-emoji=":running_shirt_with_sash:"]:before,em[data-emoji=running_shirt_with_sash]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3bd.svg)}em[data-emoji=":skateboard:"]:before,em[data-emoji=skateboard]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6f9.svg)}em[data-emoji=":sled:"]:before,em[data-emoji=sled]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6f7.svg)}em[data-emoji=":parachute:"]:before,em[data-emoji=parachute]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1fa82.svg)}em[data-emoji=":ice_skate:"]:before,em[data-emoji=ice_skate]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f8.svg)}em[data-emoji=":curling_stone:"]:before,em[data-emoji=curling_stone]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f94c.svg)}em[data-emoji=":ski:"]:before,em[data-emoji=ski]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3bf.svg)}em[data-emoji=":skier:"]:before,em[data-emoji=skier]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f7.svg)}em[data-emoji=":snowboarder:"]:before,em[data-emoji=snowboarder]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c2.svg)}em[data-emoji=":snowboarder_tone1:"]:before,em[data-emoji=snowboarder_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c2-1f3fb.svg)}em[data-emoji=":snowboarder_tone2:"]:before,em[data-emoji=snowboarder_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c2-1f3fc.svg)}em[data-emoji=":snowboarder_tone3:"]:before,em[data-emoji=snowboarder_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c2-1f3fd.svg)}em[data-emoji=":snowboarder_tone4:"]:before,em[data-emoji=snowboarder_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c2-1f3fe.svg)}em[data-emoji=":snowboarder_tone5:"]:before,em[data-emoji=snowboarder_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c2-1f3ff.svg)}em[data-emoji=":person_lifting_weights:"]:before,em[data-emoji=person_lifting_weights]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cb.svg)}em[data-emoji=":person_lifting_weights_tone1:"]:before,em[data-emoji=person_lifting_weights_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cb-1f3fb.svg)}em[data-emoji=":person_lifting_weights_tone2:"]:before,em[data-emoji=person_lifting_weights_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cb-1f3fc.svg)}em[data-emoji=":person_lifting_weights_tone3:"]:before,em[data-emoji=person_lifting_weights_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cb-1f3fd.svg)}em[data-emoji=":person_lifting_weights_tone4:"]:before,em[data-emoji=person_lifting_weights_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cb-1f3fe.svg)}em[data-emoji=":person_lifting_weights_tone5:"]:before,em[data-emoji=person_lifting_weights_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cb-1f3ff.svg)}em[data-emoji=":woman_lifting_weights:"]:before,em[data-emoji=woman_lifting_weights]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cb-fe0f-200d-2640-fe0f.svg)}em[data-emoji=":woman_lifting_weights_tone1:"]:before,em[data-emoji=woman_lifting_weights_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cb-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_lifting_weights_tone2:"]:before,em[data-emoji=woman_lifting_weights_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cb-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_lifting_weights_tone3:"]:before,em[data-emoji=woman_lifting_weights_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cb-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_lifting_weights_tone4:"]:before,em[data-emoji=woman_lifting_weights_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cb-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_lifting_weights_tone5:"]:before,em[data-emoji=woman_lifting_weights_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cb-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_lifting_weights:"]:before,em[data-emoji=man_lifting_weights]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cb-fe0f-200d-2642-fe0f.svg)}em[data-emoji=":man_lifting_weights_tone1:"]:before,em[data-emoji=man_lifting_weights_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cb-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_lifting_weights_tone2:"]:before,em[data-emoji=man_lifting_weights_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cb-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_lifting_weights_tone3:"]:before,em[data-emoji=man_lifting_weights_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cb-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_lifting_weights_tone4:"]:before,em[data-emoji=man_lifting_weights_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cb-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_lifting_weights_tone5:"]:before,em[data-emoji=man_lifting_weights_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cb-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":people_wrestling:"]:before,em[data-emoji=people_wrestling]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93c.svg)}em[data-emoji=":women_wrestling:"]:before,em[data-emoji=women_wrestling]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93c-200d-2640-fe0f.svg)}em[data-emoji=":men_wrestling:"]:before,em[data-emoji=men_wrestling]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93c-200d-2642-fe0f.svg)}em[data-emoji=":person_doing_cartwheel:"]:before,em[data-emoji=person_doing_cartwheel]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f938.svg)}em[data-emoji=":person_doing_cartwheel_tone1:"]:before,em[data-emoji=person_doing_cartwheel_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f938-1f3fb.svg)}em[data-emoji=":person_doing_cartwheel_tone2:"]:before,em[data-emoji=person_doing_cartwheel_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f938-1f3fc.svg)}em[data-emoji=":person_doing_cartwheel_tone3:"]:before,em[data-emoji=person_doing_cartwheel_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f938-1f3fd.svg)}em[data-emoji=":person_doing_cartwheel_tone4:"]:before,em[data-emoji=person_doing_cartwheel_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f938-1f3fe.svg)}em[data-emoji=":person_doing_cartwheel_tone5:"]:before,em[data-emoji=person_doing_cartwheel_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f938-1f3ff.svg)}em[data-emoji=":woman_cartwheeling:"]:before,em[data-emoji=woman_cartwheeling]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f938-200d-2640-fe0f.svg)}em[data-emoji=":woman_cartwheeling_tone1:"]:before,em[data-emoji=woman_cartwheeling_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f938-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_cartwheeling_tone2:"]:before,em[data-emoji=woman_cartwheeling_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f938-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_cartwheeling_tone3:"]:before,em[data-emoji=woman_cartwheeling_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f938-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_cartwheeling_tone4:"]:before,em[data-emoji=woman_cartwheeling_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f938-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_cartwheeling_tone5:"]:before,em[data-emoji=woman_cartwheeling_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f938-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_cartwheeling:"]:before,em[data-emoji=man_cartwheeling]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f938-200d-2642-fe0f.svg)}em[data-emoji=":man_cartwheeling_tone1:"]:before,em[data-emoji=man_cartwheeling_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f938-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_cartwheeling_tone2:"]:before,em[data-emoji=man_cartwheeling_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f938-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_cartwheeling_tone3:"]:before,em[data-emoji=man_cartwheeling_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f938-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_cartwheeling_tone4:"]:before,em[data-emoji=man_cartwheeling_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f938-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_cartwheeling_tone5:"]:before,em[data-emoji=man_cartwheeling_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f938-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_bouncing_ball:"]:before,em[data-emoji=person_bouncing_ball]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f9.svg)}em[data-emoji=":person_bouncing_ball_tone1:"]:before,em[data-emoji=person_bouncing_ball_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f9-1f3fb.svg)}em[data-emoji=":person_bouncing_ball_tone2:"]:before,em[data-emoji=person_bouncing_ball_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f9-1f3fc.svg)}em[data-emoji=":person_bouncing_ball_tone3:"]:before,em[data-emoji=person_bouncing_ball_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f9-1f3fd.svg)}em[data-emoji=":person_bouncing_ball_tone4:"]:before,em[data-emoji=person_bouncing_ball_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f9-1f3fe.svg)}em[data-emoji=":person_bouncing_ball_tone5:"]:before,em[data-emoji=person_bouncing_ball_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f9-1f3ff.svg)}em[data-emoji=":woman_bouncing_ball:"]:before,em[data-emoji=woman_bouncing_ball]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f9-fe0f-200d-2640-fe0f.svg)}em[data-emoji=":woman_bouncing_ball_tone1:"]:before,em[data-emoji=woman_bouncing_ball_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f9-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_bouncing_ball_tone2:"]:before,em[data-emoji=woman_bouncing_ball_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f9-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_bouncing_ball_tone3:"]:before,em[data-emoji=woman_bouncing_ball_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f9-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_bouncing_ball_tone4:"]:before,em[data-emoji=woman_bouncing_ball_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f9-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_bouncing_ball_tone5:"]:before,em[data-emoji=woman_bouncing_ball_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f9-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_bouncing_ball:"]:before,em[data-emoji=man_bouncing_ball]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f9-fe0f-200d-2642-fe0f.svg)}em[data-emoji=":man_bouncing_ball_tone1:"]:before,em[data-emoji=man_bouncing_ball_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f9-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_bouncing_ball_tone2:"]:before,em[data-emoji=man_bouncing_ball_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f9-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_bouncing_ball_tone3:"]:before,em[data-emoji=man_bouncing_ball_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f9-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_bouncing_ball_tone4:"]:before,em[data-emoji=man_bouncing_ball_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f9-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_bouncing_ball_tone5:"]:before,em[data-emoji=man_bouncing_ball_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f9-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_fencing:"]:before,em[data-emoji=person_fencing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93a.svg)}em[data-emoji=":person_playing_handball:"]:before,em[data-emoji=person_playing_handball]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93e.svg)}em[data-emoji=":person_playing_handball_tone1:"]:before,em[data-emoji=person_playing_handball_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93e-1f3fb.svg)}em[data-emoji=":person_playing_handball_tone2:"]:before,em[data-emoji=person_playing_handball_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93e-1f3fc.svg)}em[data-emoji=":person_playing_handball_tone3:"]:before,em[data-emoji=person_playing_handball_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93e-1f3fd.svg)}em[data-emoji=":person_playing_handball_tone4:"]:before,em[data-emoji=person_playing_handball_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93e-1f3fe.svg)}em[data-emoji=":person_playing_handball_tone5:"]:before,em[data-emoji=person_playing_handball_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93e-1f3ff.svg)}em[data-emoji=":woman_playing_handball:"]:before,em[data-emoji=woman_playing_handball]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93e-200d-2640-fe0f.svg)}em[data-emoji=":woman_playing_handball_tone1:"]:before,em[data-emoji=woman_playing_handball_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93e-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_playing_handball_tone2:"]:before,em[data-emoji=woman_playing_handball_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93e-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_playing_handball_tone3:"]:before,em[data-emoji=woman_playing_handball_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93e-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_playing_handball_tone4:"]:before,em[data-emoji=woman_playing_handball_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93e-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_playing_handball_tone5:"]:before,em[data-emoji=woman_playing_handball_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93e-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_playing_handball:"]:before,em[data-emoji=man_playing_handball]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93e-200d-2642-fe0f.svg)}em[data-emoji=":man_playing_handball_tone1:"]:before,em[data-emoji=man_playing_handball_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93e-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_playing_handball_tone2:"]:before,em[data-emoji=man_playing_handball_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93e-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_playing_handball_tone3:"]:before,em[data-emoji=man_playing_handball_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93e-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_playing_handball_tone4:"]:before,em[data-emoji=man_playing_handball_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93e-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_playing_handball_tone5:"]:before,em[data-emoji=man_playing_handball_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93e-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_golfing:"]:before,em[data-emoji=person_golfing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cc.svg)}em[data-emoji=":person_golfing_tone1:"]:before,em[data-emoji=person_golfing_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cc-1f3fb.svg)}em[data-emoji=":person_golfing_tone2:"]:before,em[data-emoji=person_golfing_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cc-1f3fc.svg)}em[data-emoji=":person_golfing_tone3:"]:before,em[data-emoji=person_golfing_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cc-1f3fd.svg)}em[data-emoji=":person_golfing_tone4:"]:before,em[data-emoji=person_golfing_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cc-1f3fe.svg)}em[data-emoji=":person_golfing_tone5:"]:before,em[data-emoji=person_golfing_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cc-1f3ff.svg)}em[data-emoji=":woman_golfing:"]:before,em[data-emoji=woman_golfing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cc-fe0f-200d-2640-fe0f.svg)}em[data-emoji=":woman_golfing_tone1:"]:before,em[data-emoji=woman_golfing_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cc-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_golfing_tone2:"]:before,em[data-emoji=woman_golfing_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cc-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_golfing_tone3:"]:before,em[data-emoji=woman_golfing_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cc-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_golfing_tone4:"]:before,em[data-emoji=woman_golfing_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cc-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_golfing_tone5:"]:before,em[data-emoji=woman_golfing_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cc-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_golfing:"]:before,em[data-emoji=man_golfing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cc-fe0f-200d-2642-fe0f.svg)}em[data-emoji=":man_golfing_tone1:"]:before,em[data-emoji=man_golfing_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cc-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_golfing_tone2:"]:before,em[data-emoji=man_golfing_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cc-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_golfing_tone3:"]:before,em[data-emoji=man_golfing_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cc-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_golfing_tone4:"]:before,em[data-emoji=man_golfing_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cc-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_golfing_tone5:"]:before,em[data-emoji=man_golfing_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cc-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":horse_racing:"]:before,em[data-emoji=horse_racing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c7.svg)}em[data-emoji=":horse_racing_tone1:"]:before,em[data-emoji=horse_racing_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c7-1f3fb.svg)}em[data-emoji=":horse_racing_tone2:"]:before,em[data-emoji=horse_racing_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c7-1f3fc.svg)}em[data-emoji=":horse_racing_tone3:"]:before,em[data-emoji=horse_racing_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c7-1f3fd.svg)}em[data-emoji=":horse_racing_tone4:"]:before,em[data-emoji=horse_racing_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c7-1f3fe.svg)}em[data-emoji=":horse_racing_tone5:"]:before,em[data-emoji=horse_racing_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c7-1f3ff.svg)}em[data-emoji=":person_in_lotus_position:"]:before,em[data-emoji=person_in_lotus_position]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d8.svg)}em[data-emoji=":person_in_lotus_position_tone1:"]:before,em[data-emoji=person_in_lotus_position_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d8-1f3fb.svg)}em[data-emoji=":person_in_lotus_position_tone2:"]:before,em[data-emoji=person_in_lotus_position_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d8-1f3fc.svg)}em[data-emoji=":person_in_lotus_position_tone3:"]:before,em[data-emoji=person_in_lotus_position_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d8-1f3fd.svg)}em[data-emoji=":person_in_lotus_position_tone4:"]:before,em[data-emoji=person_in_lotus_position_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d8-1f3fe.svg)}em[data-emoji=":person_in_lotus_position_tone5:"]:before,em[data-emoji=person_in_lotus_position_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d8-1f3ff.svg)}em[data-emoji=":woman_in_lotus_position:"]:before,em[data-emoji=woman_in_lotus_position]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d8-200d-2640-fe0f.svg)}em[data-emoji=":woman_in_lotus_position_tone1:"]:before,em[data-emoji=woman_in_lotus_position_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d8-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_in_lotus_position_tone2:"]:before,em[data-emoji=woman_in_lotus_position_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d8-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_in_lotus_position_tone3:"]:before,em[data-emoji=woman_in_lotus_position_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d8-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_in_lotus_position_tone4:"]:before,em[data-emoji=woman_in_lotus_position_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d8-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_in_lotus_position_tone5:"]:before,em[data-emoji=woman_in_lotus_position_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d8-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_in_lotus_position:"]:before,em[data-emoji=man_in_lotus_position]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d8-200d-2642-fe0f.svg)}em[data-emoji=":man_in_lotus_position_tone1:"]:before,em[data-emoji=man_in_lotus_position_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d8-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_in_lotus_position_tone2:"]:before,em[data-emoji=man_in_lotus_position_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d8-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_in_lotus_position_tone3:"]:before,em[data-emoji=man_in_lotus_position_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d8-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_in_lotus_position_tone4:"]:before,em[data-emoji=man_in_lotus_position_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d8-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_in_lotus_position_tone5:"]:before,em[data-emoji=man_in_lotus_position_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d8-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_surfing:"]:before,em[data-emoji=person_surfing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c4.svg)}em[data-emoji=":person_surfing_tone1:"]:before,em[data-emoji=person_surfing_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c4-1f3fb.svg)}em[data-emoji=":person_surfing_tone2:"]:before,em[data-emoji=person_surfing_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c4-1f3fc.svg)}em[data-emoji=":person_surfing_tone3:"]:before,em[data-emoji=person_surfing_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c4-1f3fd.svg)}em[data-emoji=":person_surfing_tone4:"]:before,em[data-emoji=person_surfing_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c4-1f3fe.svg)}em[data-emoji=":person_surfing_tone5:"]:before,em[data-emoji=person_surfing_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c4-1f3ff.svg)}em[data-emoji=":woman_surfing:"]:before,em[data-emoji=woman_surfing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c4-200d-2640-fe0f.svg)}em[data-emoji=":woman_surfing_tone1:"]:before,em[data-emoji=woman_surfing_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c4-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_surfing_tone2:"]:before,em[data-emoji=woman_surfing_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c4-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_surfing_tone3:"]:before,em[data-emoji=woman_surfing_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c4-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_surfing_tone4:"]:before,em[data-emoji=woman_surfing_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c4-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_surfing_tone5:"]:before,em[data-emoji=woman_surfing_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c4-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_surfing:"]:before,em[data-emoji=man_surfing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c4-200d-2642-fe0f.svg)}em[data-emoji=":man_surfing_tone1:"]:before,em[data-emoji=man_surfing_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c4-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_surfing_tone2:"]:before,em[data-emoji=man_surfing_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c4-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_surfing_tone3:"]:before,em[data-emoji=man_surfing_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c4-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_surfing_tone4:"]:before,em[data-emoji=man_surfing_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c4-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_surfing_tone5:"]:before,em[data-emoji=man_surfing_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c4-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_swimming:"]:before,em[data-emoji=person_swimming]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ca.svg)}em[data-emoji=":person_swimming_tone1:"]:before,em[data-emoji=person_swimming_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ca-1f3fb.svg)}em[data-emoji=":person_swimming_tone2:"]:before,em[data-emoji=person_swimming_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ca-1f3fc.svg)}em[data-emoji=":person_swimming_tone3:"]:before,em[data-emoji=person_swimming_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ca-1f3fd.svg)}em[data-emoji=":person_swimming_tone4:"]:before,em[data-emoji=person_swimming_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ca-1f3fe.svg)}em[data-emoji=":person_swimming_tone5:"]:before,em[data-emoji=person_swimming_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ca-1f3ff.svg)}em[data-emoji=":woman_swimming:"]:before,em[data-emoji=woman_swimming]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ca-200d-2640-fe0f.svg)}em[data-emoji=":woman_swimming_tone1:"]:before,em[data-emoji=woman_swimming_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ca-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_swimming_tone2:"]:before,em[data-emoji=woman_swimming_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ca-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_swimming_tone3:"]:before,em[data-emoji=woman_swimming_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ca-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_swimming_tone4:"]:before,em[data-emoji=woman_swimming_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ca-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_swimming_tone5:"]:before,em[data-emoji=woman_swimming_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ca-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_swimming:"]:before,em[data-emoji=man_swimming]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ca-200d-2642-fe0f.svg)}em[data-emoji=":man_swimming_tone1:"]:before,em[data-emoji=man_swimming_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ca-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_swimming_tone2:"]:before,em[data-emoji=man_swimming_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ca-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_swimming_tone3:"]:before,em[data-emoji=man_swimming_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ca-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_swimming_tone4:"]:before,em[data-emoji=man_swimming_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ca-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_swimming_tone5:"]:before,em[data-emoji=man_swimming_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ca-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_playing_water_polo:"]:before,em[data-emoji=person_playing_water_polo]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93d.svg)}em[data-emoji=":person_playing_water_polo_tone1:"]:before,em[data-emoji=person_playing_water_polo_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93d-1f3fb.svg)}em[data-emoji=":person_playing_water_polo_tone2:"]:before,em[data-emoji=person_playing_water_polo_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93d-1f3fc.svg)}em[data-emoji=":person_playing_water_polo_tone3:"]:before,em[data-emoji=person_playing_water_polo_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93d-1f3fd.svg)}em[data-emoji=":person_playing_water_polo_tone4:"]:before,em[data-emoji=person_playing_water_polo_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93d-1f3fe.svg)}em[data-emoji=":person_playing_water_polo_tone5:"]:before,em[data-emoji=person_playing_water_polo_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93d-1f3ff.svg)}em[data-emoji=":woman_playing_water_polo:"]:before,em[data-emoji=woman_playing_water_polo]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93d-200d-2640-fe0f.svg)}em[data-emoji=":woman_playing_water_polo_tone1:"]:before,em[data-emoji=woman_playing_water_polo_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93d-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_playing_water_polo_tone2:"]:before,em[data-emoji=woman_playing_water_polo_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93d-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_playing_water_polo_tone3:"]:before,em[data-emoji=woman_playing_water_polo_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93d-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_playing_water_polo_tone4:"]:before,em[data-emoji=woman_playing_water_polo_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93d-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_playing_water_polo_tone5:"]:before,em[data-emoji=woman_playing_water_polo_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93d-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_playing_water_polo:"]:before,em[data-emoji=man_playing_water_polo]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93d-200d-2642-fe0f.svg)}em[data-emoji=":man_playing_water_polo_tone1:"]:before,em[data-emoji=man_playing_water_polo_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93d-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_playing_water_polo_tone2:"]:before,em[data-emoji=man_playing_water_polo_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93d-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_playing_water_polo_tone3:"]:before,em[data-emoji=man_playing_water_polo_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93d-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_playing_water_polo_tone4:"]:before,em[data-emoji=man_playing_water_polo_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93d-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_playing_water_polo_tone5:"]:before,em[data-emoji=man_playing_water_polo_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93d-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_rowing_boat:"]:before,em[data-emoji=person_rowing_boat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a3.svg)}em[data-emoji=":person_rowing_boat_tone1:"]:before,em[data-emoji=person_rowing_boat_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a3-1f3fb.svg)}em[data-emoji=":person_rowing_boat_tone2:"]:before,em[data-emoji=person_rowing_boat_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a3-1f3fc.svg)}em[data-emoji=":person_rowing_boat_tone3:"]:before,em[data-emoji=person_rowing_boat_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a3-1f3fd.svg)}em[data-emoji=":person_rowing_boat_tone4:"]:before,em[data-emoji=person_rowing_boat_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a3-1f3fe.svg)}em[data-emoji=":person_rowing_boat_tone5:"]:before,em[data-emoji=person_rowing_boat_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a3-1f3ff.svg)}em[data-emoji=":woman_rowing_boat:"]:before,em[data-emoji=woman_rowing_boat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a3-200d-2640-fe0f.svg)}em[data-emoji=":woman_rowing_boat_tone1:"]:before,em[data-emoji=woman_rowing_boat_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a3-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_rowing_boat_tone2:"]:before,em[data-emoji=woman_rowing_boat_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a3-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_rowing_boat_tone3:"]:before,em[data-emoji=woman_rowing_boat_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a3-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_rowing_boat_tone4:"]:before,em[data-emoji=woman_rowing_boat_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a3-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_rowing_boat_tone5:"]:before,em[data-emoji=woman_rowing_boat_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a3-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_rowing_boat:"]:before,em[data-emoji=man_rowing_boat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a3-200d-2642-fe0f.svg)}em[data-emoji=":man_rowing_boat_tone1:"]:before,em[data-emoji=man_rowing_boat_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a3-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_rowing_boat_tone2:"]:before,em[data-emoji=man_rowing_boat_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a3-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_rowing_boat_tone3:"]:before,em[data-emoji=man_rowing_boat_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a3-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_rowing_boat_tone4:"]:before,em[data-emoji=man_rowing_boat_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a3-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_rowing_boat_tone5:"]:before,em[data-emoji=man_rowing_boat_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a3-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_climbing:"]:before,em[data-emoji=person_climbing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d7.svg)}em[data-emoji=":person_climbing_tone1:"]:before,em[data-emoji=person_climbing_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d7-1f3fb.svg)}em[data-emoji=":person_climbing_tone2:"]:before,em[data-emoji=person_climbing_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d7-1f3fc.svg)}em[data-emoji=":person_climbing_tone3:"]:before,em[data-emoji=person_climbing_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d7-1f3fd.svg)}em[data-emoji=":person_climbing_tone4:"]:before,em[data-emoji=person_climbing_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d7-1f3fe.svg)}em[data-emoji=":person_climbing_tone5:"]:before,em[data-emoji=person_climbing_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d7-1f3ff.svg)}em[data-emoji=":woman_climbing:"]:before,em[data-emoji=woman_climbing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d7-200d-2640-fe0f.svg)}em[data-emoji=":woman_climbing_tone1:"]:before,em[data-emoji=woman_climbing_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d7-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_climbing_tone2:"]:before,em[data-emoji=woman_climbing_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d7-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_climbing_tone3:"]:before,em[data-emoji=woman_climbing_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d7-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_climbing_tone4:"]:before,em[data-emoji=woman_climbing_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d7-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_climbing_tone5:"]:before,em[data-emoji=woman_climbing_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d7-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_climbing:"]:before,em[data-emoji=man_climbing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d7-200d-2642-fe0f.svg)}em[data-emoji=":man_climbing_tone1:"]:before,em[data-emoji=man_climbing_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d7-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_climbing_tone2:"]:before,em[data-emoji=man_climbing_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d7-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_climbing_tone3:"]:before,em[data-emoji=man_climbing_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d7-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_climbing_tone4:"]:before,em[data-emoji=man_climbing_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d7-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_climbing_tone5:"]:before,em[data-emoji=man_climbing_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d7-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_mountain_biking:"]:before,em[data-emoji=person_mountain_biking]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b5.svg)}em[data-emoji=":person_mountain_biking_tone1:"]:before,em[data-emoji=person_mountain_biking_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b5-1f3fb.svg)}em[data-emoji=":person_mountain_biking_tone2:"]:before,em[data-emoji=person_mountain_biking_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b5-1f3fc.svg)}em[data-emoji=":person_mountain_biking_tone3:"]:before,em[data-emoji=person_mountain_biking_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b5-1f3fd.svg)}em[data-emoji=":person_mountain_biking_tone4:"]:before,em[data-emoji=person_mountain_biking_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b5-1f3fe.svg)}em[data-emoji=":person_mountain_biking_tone5:"]:before,em[data-emoji=person_mountain_biking_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b5-1f3ff.svg)}em[data-emoji=":woman_mountain_biking:"]:before,em[data-emoji=woman_mountain_biking]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b5-200d-2640-fe0f.svg)}em[data-emoji=":woman_mountain_biking_tone1:"]:before,em[data-emoji=woman_mountain_biking_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b5-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_mountain_biking_tone2:"]:before,em[data-emoji=woman_mountain_biking_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b5-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_mountain_biking_tone3:"]:before,em[data-emoji=woman_mountain_biking_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b5-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_mountain_biking_tone4:"]:before,em[data-emoji=woman_mountain_biking_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b5-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_mountain_biking_tone5:"]:before,em[data-emoji=woman_mountain_biking_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b5-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_mountain_biking:"]:before,em[data-emoji=man_mountain_biking]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b5-200d-2642-fe0f.svg)}em[data-emoji=":man_mountain_biking_tone1:"]:before,em[data-emoji=man_mountain_biking_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b5-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_mountain_biking_tone2:"]:before,em[data-emoji=man_mountain_biking_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b5-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_mountain_biking_tone3:"]:before,em[data-emoji=man_mountain_biking_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b5-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_mountain_biking_tone4:"]:before,em[data-emoji=man_mountain_biking_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b5-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_mountain_biking_tone5:"]:before,em[data-emoji=man_mountain_biking_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b5-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_biking:"]:before,em[data-emoji=person_biking]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b4.svg)}em[data-emoji=":person_biking_tone1:"]:before,em[data-emoji=person_biking_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b4-1f3fb.svg)}em[data-emoji=":person_biking_tone2:"]:before,em[data-emoji=person_biking_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b4-1f3fc.svg)}em[data-emoji=":person_biking_tone3:"]:before,em[data-emoji=person_biking_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b4-1f3fd.svg)}em[data-emoji=":person_biking_tone4:"]:before,em[data-emoji=person_biking_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b4-1f3fe.svg)}em[data-emoji=":person_biking_tone5:"]:before,em[data-emoji=person_biking_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b4-1f3ff.svg)}em[data-emoji=":woman_biking:"]:before,em[data-emoji=woman_biking]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b4-200d-2640-fe0f.svg)}em[data-emoji=":woman_biking_tone1:"]:before,em[data-emoji=woman_biking_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b4-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_biking_tone2:"]:before,em[data-emoji=woman_biking_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b4-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_biking_tone3:"]:before,em[data-emoji=woman_biking_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b4-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_biking_tone4:"]:before,em[data-emoji=woman_biking_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b4-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_biking_tone5:"]:before,em[data-emoji=woman_biking_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b4-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_biking:"]:before,em[data-emoji=man_biking]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b4-200d-2642-fe0f.svg)}em[data-emoji=":man_biking_tone1:"]:before,em[data-emoji=man_biking_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b4-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_biking_tone2:"]:before,em[data-emoji=man_biking_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b4-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_biking_tone3:"]:before,em[data-emoji=man_biking_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b4-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_biking_tone4:"]:before,em[data-emoji=man_biking_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b4-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_biking_tone5:"]:before,em[data-emoji=man_biking_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b4-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":trophy:"]:before,em[data-emoji=trophy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c6.svg)}em[data-emoji=":first_place:"]:before,em[data-emoji=first_place]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f947.svg)}em[data-emoji=":second_place:"]:before,em[data-emoji=second_place]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f948.svg)}em[data-emoji=":third_place:"]:before,em[data-emoji=third_place]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f949.svg)}em[data-emoji=":medal:"]:before,em[data-emoji=medal]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c5.svg)}em[data-emoji=":military_medal:"]:before,em[data-emoji=military_medal]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f396.svg)}em[data-emoji=":rosette:"]:before,em[data-emoji=rosette]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3f5.svg)}em[data-emoji=":reminder_ribbon:"]:before,em[data-emoji=reminder_ribbon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f397.svg)}em[data-emoji=":ticket:"]:before,em[data-emoji=ticket]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ab.svg)}em[data-emoji=":tickets:"]:before,em[data-emoji=tickets]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f39f.svg)}em[data-emoji=":circus_tent:"]:before,em[data-emoji=circus_tent]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3aa.svg)}em[data-emoji=":person_juggling:"]:before,em[data-emoji=person_juggling]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f939.svg)}em[data-emoji=":person_juggling_tone1:"]:before,em[data-emoji=person_juggling_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f939-1f3fb.svg)}em[data-emoji=":person_juggling_tone2:"]:before,em[data-emoji=person_juggling_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f939-1f3fc.svg)}em[data-emoji=":person_juggling_tone3:"]:before,em[data-emoji=person_juggling_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f939-1f3fd.svg)}em[data-emoji=":person_juggling_tone4:"]:before,em[data-emoji=person_juggling_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f939-1f3fe.svg)}em[data-emoji=":person_juggling_tone5:"]:before,em[data-emoji=person_juggling_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f939-1f3ff.svg)}em[data-emoji=":woman_juggling:"]:before,em[data-emoji=woman_juggling]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f939-200d-2640-fe0f.svg)}em[data-emoji=":woman_juggling_tone1:"]:before,em[data-emoji=woman_juggling_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f939-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_juggling_tone2:"]:before,em[data-emoji=woman_juggling_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f939-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_juggling_tone3:"]:before,em[data-emoji=woman_juggling_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f939-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_juggling_tone4:"]:before,em[data-emoji=woman_juggling_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f939-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_juggling_tone5:"]:before,em[data-emoji=woman_juggling_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f939-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_juggling:"]:before,em[data-emoji=man_juggling]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f939-200d-2642-fe0f.svg)}em[data-emoji=":man_juggling_tone1:"]:before,em[data-emoji=man_juggling_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f939-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_juggling_tone2:"]:before,em[data-emoji=man_juggling_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f939-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_juggling_tone3:"]:before,em[data-emoji=man_juggling_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f939-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_juggling_tone4:"]:before,em[data-emoji=man_juggling_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f939-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_juggling_tone5:"]:before,em[data-emoji=man_juggling_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f939-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":performing_arts:"]:before,em[data-emoji=performing_arts]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ad.svg)}em[data-emoji=":art:"]:before,em[data-emoji=art]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3a8.svg)}em[data-emoji=":clapper:"]:before,em[data-emoji=clapper]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ac.svg)}em[data-emoji=":microphone:"]:before,em[data-emoji=microphone]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3a4.svg)}em[data-emoji=":headphones:"]:before,em[data-emoji=headphones]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3a7.svg)}em[data-emoji=":musical_score:"]:before,em[data-emoji=musical_score]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3bc.svg)}em[data-emoji=":musical_keyboard:"]:before,em[data-emoji=musical_keyboard]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3b9.svg)}em[data-emoji=":drum:"]:before,em[data-emoji=drum]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f941.svg)}em[data-emoji=":saxophone:"]:before,em[data-emoji=saxophone]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3b7.svg)}em[data-emoji=":trumpet:"]:before,em[data-emoji=trumpet]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ba.svg)}em[data-emoji=":banjo:"]:before,em[data-emoji=banjo]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1fa95.svg)}em[data-emoji=":guitar:"]:before,em[data-emoji=guitar]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3b8.svg)}em[data-emoji=":violin:"]:before,em[data-emoji=violin]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3bb.svg)}em[data-emoji=":game_die:"]:before,em[data-emoji=game_die]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3b2.svg)}em[data-emoji=":chess_pawn:"]:before,em[data-emoji=chess_pawn]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/265f.svg)}em[data-emoji=":dart:"]:before,em[data-emoji=dart]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3af.svg)}em[data-emoji=":kite:"]:before,em[data-emoji=kite]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1fa81.svg)}em[data-emoji=":yo_yo:"]:before,em[data-emoji=yo_yo]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1fa80.svg)}em[data-emoji=":bowling:"]:before,em[data-emoji=bowling]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3b3.svg)}em[data-emoji=":video_game:"]:before,em[data-emoji=video_game]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ae.svg)}em[data-emoji=":slot_machine:"]:before,em[data-emoji=slot_machine]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3b0.svg)}em[data-emoji=":jigsaw:"]:before,em[data-emoji=jigsaw]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9e9.svg)}em[data-emoji=":watch:"]:before,em[data-emoji=watch]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/231a.svg)}em[data-emoji=":iphone:"]:before,em[data-emoji=iphone]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4f1.svg)}em[data-emoji=":calling:"]:before,em[data-emoji=calling]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4f2.svg)}em[data-emoji=":computer:"]:before,em[data-emoji=computer]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4bb.svg)}em[data-emoji=":desktop:"]:before,em[data-emoji=desktop]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5a5.svg)}em[data-emoji=":printer:"]:before,em[data-emoji=printer]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5a8.svg)}em[data-emoji=":mouse_three_button:"]:before,em[data-emoji=mouse_three_button]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5b1.svg)}em[data-emoji=":trackball:"]:before,em[data-emoji=trackball]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5b2.svg)}em[data-emoji=":joystick:"]:before,em[data-emoji=joystick]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f579.svg)}em[data-emoji=":compression:"]:before,em[data-emoji=compression]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5dc.svg)}em[data-emoji=":minidisc:"]:before,em[data-emoji=minidisc]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4bd.svg)}em[data-emoji=":floppy_disk:"]:before,em[data-emoji=floppy_disk]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4be.svg)}em[data-emoji=":cd:"]:before,em[data-emoji=cd]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4bf.svg)}em[data-emoji=":dvd:"]:before,em[data-emoji=dvd]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4c0.svg)}em[data-emoji=":vhs:"]:before,em[data-emoji=vhs]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4fc.svg)}em[data-emoji=":camera:"]:before,em[data-emoji=camera]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4f7.svg)}em[data-emoji=":camera_with_flash:"]:before,em[data-emoji=camera_with_flash]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4f8.svg)}em[data-emoji=":video_camera:"]:before,em[data-emoji=video_camera]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4f9.svg)}em[data-emoji=":movie_camera:"]:before,em[data-emoji=movie_camera]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3a5.svg)}em[data-emoji=":projector:"]:before,em[data-emoji=projector]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4fd.svg)}em[data-emoji=":film_frames:"]:before,em[data-emoji=film_frames]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f39e.svg)}em[data-emoji=":telephone_receiver:"]:before,em[data-emoji=telephone_receiver]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4de.svg)}em[data-emoji=":telephone:"]:before,em[data-emoji=telephone]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/260e.svg)}em[data-emoji=":pager:"]:before,em[data-emoji=pager]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4df.svg)}em[data-emoji=":fax:"]:before,em[data-emoji=fax]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4e0.svg)}em[data-emoji=":tv:"]:before,em[data-emoji=tv]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4fa.svg)}em[data-emoji=":radio:"]:before,em[data-emoji=radio]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4fb.svg)}em[data-emoji=":microphone2:"]:before,em[data-emoji=microphone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f399.svg)}em[data-emoji=":level_slider:"]:before,em[data-emoji=level_slider]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f39a.svg)}em[data-emoji=":control_knobs:"]:before,em[data-emoji=control_knobs]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f39b.svg)}em[data-emoji=":compass:"]:before,em[data-emoji=compass]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ed.svg)}em[data-emoji=":stopwatch:"]:before,em[data-emoji=stopwatch]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/23f1.svg)}em[data-emoji=":timer:"]:before,em[data-emoji=timer]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/23f2.svg)}em[data-emoji=":alarm_clock:"]:before,em[data-emoji=alarm_clock]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/23f0.svg)}em[data-emoji=":clock:"]:before,em[data-emoji=clock]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f570.svg)}em[data-emoji=":hourglass:"]:before,em[data-emoji=hourglass]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/231b.svg)}em[data-emoji=":hourglass_flowing_sand:"]:before,em[data-emoji=hourglass_flowing_sand]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/23f3.svg)}em[data-emoji=":satellite:"]:before,em[data-emoji=satellite]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4e1.svg)}em[data-emoji=":battery:"]:before,em[data-emoji=battery]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f50b.svg)}em[data-emoji=":electric_plug:"]:before,em[data-emoji=electric_plug]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f50c.svg)}em[data-emoji=":bulb:"]:before,em[data-emoji=bulb]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4a1.svg)}em[data-emoji=":flashlight:"]:before,em[data-emoji=flashlight]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f526.svg)}em[data-emoji=":candle:"]:before,em[data-emoji=candle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f56f.svg)}em[data-emoji=":fire_extinguisher:"]:before,em[data-emoji=fire_extinguisher]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ef.svg)}em[data-emoji=":oil:"]:before,em[data-emoji=oil]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6e2.svg)}em[data-emoji=":money_with_wings:"]:before,em[data-emoji=money_with_wings]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4b8.svg)}em[data-emoji=":dollar:"]:before,em[data-emoji=dollar]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4b5.svg)}em[data-emoji=":yen:"]:before,em[data-emoji=yen]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4b4.svg)}em[data-emoji=":euro:"]:before,em[data-emoji=euro]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4b6.svg)}em[data-emoji=":pound:"]:before,em[data-emoji=pound]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4b7.svg)}em[data-emoji=":moneybag:"]:before,em[data-emoji=moneybag]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4b0.svg)}em[data-emoji=":credit_card:"]:before,em[data-emoji=credit_card]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4b3.svg)}em[data-emoji=":gem:"]:before,em[data-emoji=gem]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f48e.svg)}em[data-emoji=":toolbox:"]:before,em[data-emoji=toolbox]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9f0.svg)}em[data-emoji=":wrench:"]:before,em[data-emoji=wrench]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f527.svg)}em[data-emoji=":hammer:"]:before,em[data-emoji=hammer]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f528.svg)}em[data-emoji=":tools:"]:before,em[data-emoji=tools]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6e0.svg)}em[data-emoji=":pick:"]:before,em[data-emoji=pick]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26cf.svg)}em[data-emoji=":nut_and_bolt:"]:before,em[data-emoji=nut_and_bolt]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f529.svg)}em[data-emoji=":bricks:"]:before,em[data-emoji=bricks]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9f1.svg)}em[data-emoji=":chains:"]:before,em[data-emoji=chains]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26d3.svg)}em[data-emoji=":magnet:"]:before,em[data-emoji=magnet]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9f2.svg)}em[data-emoji=":gun:"]:before,em[data-emoji=gun]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f52b.svg)}em[data-emoji=":bomb:"]:before,em[data-emoji=bomb]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4a3.svg)}em[data-emoji=":firecracker:"]:before,em[data-emoji=firecracker]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9e8.svg)}em[data-emoji=":axe:"]:before,em[data-emoji=axe]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1fa93.svg)}em[data-emoji=":razor:"]:before,em[data-emoji=razor]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1fa92.svg)}em[data-emoji=":knife:"]:before,em[data-emoji=knife]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f52a.svg)}em[data-emoji=":dagger:"]:before,em[data-emoji=dagger]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5e1.svg)}em[data-emoji=":shield:"]:before,em[data-emoji=shield]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6e1.svg)}em[data-emoji=":smoking:"]:before,em[data-emoji=smoking]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6ac.svg)}em[data-emoji=":coffin:"]:before,em[data-emoji=coffin]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26b0.svg)}em[data-emoji=":urn:"]:before,em[data-emoji=urn]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26b1.svg)}em[data-emoji=":amphora:"]:before,em[data-emoji=amphora]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3fa.svg)}em[data-emoji=":diya_lamp:"]:before,em[data-emoji=diya_lamp]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1fa94.svg)}em[data-emoji=":crystal_ball:"]:before,em[data-emoji=crystal_ball]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f52e.svg)}em[data-emoji=":prayer_beads:"]:before,em[data-emoji=prayer_beads]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4ff.svg)}em[data-emoji=":nazar_amulet:"]:before,em[data-emoji=nazar_amulet]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ff.svg)}em[data-emoji=":barber:"]:before,em[data-emoji=barber]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f488.svg)}em[data-emoji=":telescope:"]:before,em[data-emoji=telescope]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f52d.svg)}em[data-emoji=":microscope:"]:before,em[data-emoji=microscope]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f52c.svg)}em[data-emoji=":hole:"]:before,em[data-emoji=hole]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f573.svg)}em[data-emoji=":probing_cane:"]:before,em[data-emoji=probing_cane]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9af.svg)}em[data-emoji=":stethoscope:"]:before,em[data-emoji=stethoscope]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1fa7a.svg)}em[data-emoji=":adhesive_bandage:"]:before,em[data-emoji=adhesive_bandage]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1fa79.svg)}em[data-emoji=":pill:"]:before,em[data-emoji=pill]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f48a.svg)}em[data-emoji=":syringe:"]:before,em[data-emoji=syringe]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f489.svg)}em[data-emoji=":drop_of_blood:"]:before,em[data-emoji=drop_of_blood]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1fa78.svg)}em[data-emoji=":dna:"]:before,em[data-emoji=dna]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ec.svg)}em[data-emoji=":microbe:"]:before,em[data-emoji=microbe]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9a0.svg)}em[data-emoji=":petri_dish:"]:before,em[data-emoji=petri_dish]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9eb.svg)}em[data-emoji=":test_tube:"]:before,em[data-emoji=test_tube]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ea.svg)}em[data-emoji=":thermometer:"]:before,em[data-emoji=thermometer]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f321.svg)}em[data-emoji=":chair:"]:before,em[data-emoji=chair]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1fa91.svg)}em[data-emoji=":broom:"]:before,em[data-emoji=broom]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9f9.svg)}em[data-emoji=":basket:"]:before,em[data-emoji=basket]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9fa.svg)}em[data-emoji=":roll_of_paper:"]:before,em[data-emoji=roll_of_paper]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9fb.svg)}em[data-emoji=":toilet:"]:before,em[data-emoji=toilet]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6bd.svg)}em[data-emoji=":potable_water:"]:before,em[data-emoji=potable_water]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b0.svg)}em[data-emoji=":shower:"]:before,em[data-emoji=shower]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6bf.svg)}em[data-emoji=":bathtub:"]:before,em[data-emoji=bathtub]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6c1.svg)}em[data-emoji=":bath:"]:before,em[data-emoji=bath]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6c0.svg)}em[data-emoji=":bath_tone1:"]:before,em[data-emoji=bath_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6c0-1f3fb.svg)}em[data-emoji=":bath_tone2:"]:before,em[data-emoji=bath_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6c0-1f3fc.svg)}em[data-emoji=":bath_tone3:"]:before,em[data-emoji=bath_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6c0-1f3fd.svg)}em[data-emoji=":bath_tone4:"]:before,em[data-emoji=bath_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6c0-1f3fe.svg)}em[data-emoji=":bath_tone5:"]:before,em[data-emoji=bath_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6c0-1f3ff.svg)}em[data-emoji=":soap:"]:before,em[data-emoji=soap]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9fc.svg)}em[data-emoji=":sponge:"]:before,em[data-emoji=sponge]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9fd.svg)}em[data-emoji=":squeeze_bottle:"]:before,em[data-emoji=squeeze_bottle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9f4.svg)}em[data-emoji=":bellhop:"]:before,em[data-emoji=bellhop]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6ce.svg)}em[data-emoji=":key:"]:before,em[data-emoji=key]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f511.svg)}em[data-emoji=":key2:"]:before,em[data-emoji=key2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5dd.svg)}em[data-emoji=":door:"]:before,em[data-emoji=door]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6aa.svg)}em[data-emoji=":couch:"]:before,em[data-emoji=couch]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6cb.svg)}em[data-emoji=":bed:"]:before,em[data-emoji=bed]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6cf.svg)}em[data-emoji=":sleeping_accommodation:"]:before,em[data-emoji=sleeping_accommodation]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6cc.svg)}em[data-emoji=":person_in_bed_tone1:"]:before,em[data-emoji=person_in_bed_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6cc-1f3fb.svg)}em[data-emoji=":person_in_bed_tone2:"]:before,em[data-emoji=person_in_bed_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6cc-1f3fc.svg)}em[data-emoji=":person_in_bed_tone3:"]:before,em[data-emoji=person_in_bed_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6cc-1f3fd.svg)}em[data-emoji=":person_in_bed_tone4:"]:before,em[data-emoji=person_in_bed_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6cc-1f3fe.svg)}em[data-emoji=":person_in_bed_tone5:"]:before,em[data-emoji=person_in_bed_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6cc-1f3ff.svg)}em[data-emoji=":teddy_bear:"]:before,em[data-emoji=teddy_bear]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9f8.svg)}em[data-emoji=":frame_photo:"]:before,em[data-emoji=frame_photo]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5bc.svg)}em[data-emoji=":shopping_bags:"]:before,em[data-emoji=shopping_bags]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6cd.svg)}em[data-emoji=":shopping_cart:"]:before,em[data-emoji=shopping_cart]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6d2.svg)}em[data-emoji=":gift:"]:before,em[data-emoji=gift]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f381.svg)}em[data-emoji=":balloon:"]:before,em[data-emoji=balloon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f388.svg)}em[data-emoji=":flags:"]:before,em[data-emoji=flags]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f38f.svg)}em[data-emoji=":ribbon:"]:before,em[data-emoji=ribbon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f380.svg)}em[data-emoji=":confetti_ball:"]:before,em[data-emoji=confetti_ball]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f38a.svg)}em[data-emoji=":tada:"]:before,em[data-emoji=tada]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f389.svg)}em[data-emoji=":dolls:"]:before,em[data-emoji=dolls]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f38e.svg)}em[data-emoji=":izakaya_lantern:"]:before,em[data-emoji=izakaya_lantern]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ee.svg)}em[data-emoji=":wind_chime:"]:before,em[data-emoji=wind_chime]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f390.svg)}em[data-emoji=":red_envelope:"]:before,em[data-emoji=red_envelope]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9e7.svg)}em[data-emoji=":envelope_with_arrow:"]:before,em[data-emoji=envelope_with_arrow]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4e9.svg)}em[data-emoji=":incoming_envelope:"]:before,em[data-emoji=incoming_envelope]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4e8.svg)}em[data-emoji=":e-mail:"]:before,em[data-emoji=e-mail]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4e7.svg)}em[data-emoji=":love_letter:"]:before,em[data-emoji=love_letter]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f48c.svg)}em[data-emoji=":inbox_tray:"]:before,em[data-emoji=inbox_tray]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4e5.svg)}em[data-emoji=":outbox_tray:"]:before,em[data-emoji=outbox_tray]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4e4.svg)}em[data-emoji=":package:"]:before,em[data-emoji=package]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4e6.svg)}em[data-emoji=":label:"]:before,em[data-emoji=label]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3f7.svg)}em[data-emoji=":mailbox_closed:"]:before,em[data-emoji=mailbox_closed]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4ea.svg)}em[data-emoji=":mailbox:"]:before,em[data-emoji=mailbox]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4eb.svg)}em[data-emoji=":mailbox_with_mail:"]:before,em[data-emoji=mailbox_with_mail]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4ec.svg)}em[data-emoji=":mailbox_with_no_mail:"]:before,em[data-emoji=mailbox_with_no_mail]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4ed.svg)}em[data-emoji=":postbox:"]:before,em[data-emoji=postbox]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4ee.svg)}em[data-emoji=":postal_horn:"]:before,em[data-emoji=postal_horn]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4ef.svg)}em[data-emoji=":scroll:"]:before,em[data-emoji=scroll]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4dc.svg)}em[data-emoji=":page_with_curl:"]:before,em[data-emoji=page_with_curl]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4c3.svg)}em[data-emoji=":page_facing_up:"]:before,em[data-emoji=page_facing_up]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4c4.svg)}em[data-emoji=":bookmark_tabs:"]:before,em[data-emoji=bookmark_tabs]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4d1.svg)}em[data-emoji=":receipt:"]:before,em[data-emoji=receipt]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9fe.svg)}em[data-emoji=":bar_chart:"]:before,em[data-emoji=bar_chart]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4ca.svg)}em[data-emoji=":chart_with_upwards_trend:"]:before,em[data-emoji=chart_with_upwards_trend]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4c8.svg)}em[data-emoji=":chart_with_downwards_trend:"]:before,em[data-emoji=chart_with_downwards_trend]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4c9.svg)}em[data-emoji=":notepad_spiral:"]:before,em[data-emoji=notepad_spiral]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5d2.svg)}em[data-emoji=":calendar_spiral:"]:before,em[data-emoji=calendar_spiral]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5d3.svg)}em[data-emoji=":calendar:"]:before,em[data-emoji=calendar]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4c6.svg)}em[data-emoji=":date:"]:before,em[data-emoji=date]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4c5.svg)}em[data-emoji=":wastebasket:"]:before,em[data-emoji=wastebasket]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5d1.svg)}em[data-emoji=":card_index:"]:before,em[data-emoji=card_index]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4c7.svg)}em[data-emoji=":card_box:"]:before,em[data-emoji=card_box]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5c3.svg)}em[data-emoji=":ballot_box:"]:before,em[data-emoji=ballot_box]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5f3.svg)}em[data-emoji=":file_cabinet:"]:before,em[data-emoji=file_cabinet]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5c4.svg)}em[data-emoji=":clipboard:"]:before,em[data-emoji=clipboard]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4cb.svg)}em[data-emoji=":file_folder:"]:before,em[data-emoji=file_folder]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4c1.svg)}em[data-emoji=":open_file_folder:"]:before,em[data-emoji=open_file_folder]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4c2.svg)}em[data-emoji=":dividers:"]:before,em[data-emoji=dividers]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5c2.svg)}em[data-emoji=":newspaper2:"]:before,em[data-emoji=newspaper2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5de.svg)}em[data-emoji=":newspaper:"]:before,em[data-emoji=newspaper]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4f0.svg)}em[data-emoji=":notebook:"]:before,em[data-emoji=notebook]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4d3.svg)}em[data-emoji=":notebook_with_decorative_cover:"]:before,em[data-emoji=notebook_with_decorative_cover]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4d4.svg)}em[data-emoji=":ledger:"]:before,em[data-emoji=ledger]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4d2.svg)}em[data-emoji=":closed_book:"]:before,em[data-emoji=closed_book]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4d5.svg)}em[data-emoji=":green_book:"]:before,em[data-emoji=green_book]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4d7.svg)}em[data-emoji=":blue_book:"]:before,em[data-emoji=blue_book]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4d8.svg)}em[data-emoji=":orange_book:"]:before,em[data-emoji=orange_book]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4d9.svg)}em[data-emoji=":books:"]:before,em[data-emoji=books]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4da.svg)}em[data-emoji=":book:"]:before,em[data-emoji=book]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4d6.svg)}em[data-emoji=":bookmark:"]:before,em[data-emoji=bookmark]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f516.svg)}em[data-emoji=":safety_pin:"]:before,em[data-emoji=safety_pin]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9f7.svg)}em[data-emoji=":link:"]:before,em[data-emoji=link]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f517.svg)}em[data-emoji=":paperclip:"]:before,em[data-emoji=paperclip]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4ce.svg)}em[data-emoji=":paperclips:"]:before,em[data-emoji=paperclips]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f587.svg)}em[data-emoji=":triangular_ruler:"]:before,em[data-emoji=triangular_ruler]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4d0.svg)}em[data-emoji=":straight_ruler:"]:before,em[data-emoji=straight_ruler]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4cf.svg)}em[data-emoji=":abacus:"]:before,em[data-emoji=abacus]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ee.svg)}em[data-emoji=":pushpin:"]:before,em[data-emoji=pushpin]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4cc.svg)}em[data-emoji=":round_pushpin:"]:before,em[data-emoji=round_pushpin]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4cd.svg)}em[data-emoji=":pen_ballpoint:"]:before,em[data-emoji=pen_ballpoint]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f58a.svg)}em[data-emoji=":pen_fountain:"]:before,em[data-emoji=pen_fountain]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f58b.svg)}em[data-emoji=":paintbrush:"]:before,em[data-emoji=paintbrush]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f58c.svg)}em[data-emoji=":crayon:"]:before,em[data-emoji=crayon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f58d.svg)}em[data-emoji=":pencil:"]:before,em[data-emoji=pencil]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4dd.svg)}em[data-emoji=":pencil2:"]:before,em[data-emoji=pencil2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270f.svg)}em[data-emoji=":mag:"]:before,em[data-emoji=mag]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f50d.svg)}em[data-emoji=":mag_right:"]:before,em[data-emoji=mag_right]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f50e.svg)}em[data-emoji=":lock_with_ink_pen:"]:before,em[data-emoji=lock_with_ink_pen]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f50f.svg)}em[data-emoji=":closed_lock_with_key:"]:before,em[data-emoji=closed_lock_with_key]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f510.svg)}em[data-emoji=":lock:"]:before,em[data-emoji=lock]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f512.svg)}em[data-emoji=":unlock:"]:before,em[data-emoji=unlock]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f513.svg)}em[data-emoji=":dog:"]:before,em[data-emoji=dog]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f436.svg)}em[data-emoji=":cat:"]:before,em[data-emoji=cat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f431.svg)}em[data-emoji=":mouse:"]:before,em[data-emoji=mouse]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f42d.svg)}em[data-emoji=":hamster:"]:before,em[data-emoji=hamster]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f439.svg)}em[data-emoji=":rabbit:"]:before,em[data-emoji=rabbit]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f430.svg)}em[data-emoji=":fox:"]:before,em[data-emoji=fox]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f98a.svg)}em[data-emoji=":bear:"]:before,em[data-emoji=bear]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f43b.svg)}em[data-emoji=":panda_face:"]:before,em[data-emoji=panda_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f43c.svg)}em[data-emoji=":koala:"]:before,em[data-emoji=koala]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f428.svg)}em[data-emoji=":tiger:"]:before,em[data-emoji=tiger]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f42f.svg)}em[data-emoji=":lion_face:"]:before,em[data-emoji=lion_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f981.svg)}em[data-emoji=":cow:"]:before,em[data-emoji=cow]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f42e.svg)}em[data-emoji=":pig:"]:before,em[data-emoji=pig]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f437.svg)}em[data-emoji=":pig_nose:"]:before,em[data-emoji=pig_nose]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f43d.svg)}em[data-emoji=":frog:"]:before,em[data-emoji=frog]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f438.svg)}em[data-emoji=":monkey_face:"]:before,em[data-emoji=monkey_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f435.svg)}em[data-emoji=":see_no_evil:"]:before,em[data-emoji=see_no_evil]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f648.svg)}em[data-emoji=":hear_no_evil:"]:before,em[data-emoji=hear_no_evil]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f649.svg)}em[data-emoji=":speak_no_evil:"]:before,em[data-emoji=speak_no_evil]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64a.svg)}em[data-emoji=":monkey:"]:before,em[data-emoji=monkey]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f412.svg)}em[data-emoji=":chicken:"]:before,em[data-emoji=chicken]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f414.svg)}em[data-emoji=":penguin:"]:before,em[data-emoji=penguin]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f427.svg)}em[data-emoji=":bird:"]:before,em[data-emoji=bird]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f426.svg)}em[data-emoji=":baby_chick:"]:before,em[data-emoji=baby_chick]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f424.svg)}em[data-emoji=":hatching_chick:"]:before,em[data-emoji=hatching_chick]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f423.svg)}em[data-emoji=":hatched_chick:"]:before,em[data-emoji=hatched_chick]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f425.svg)}em[data-emoji=":duck:"]:before,em[data-emoji=duck]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f986.svg)}em[data-emoji=":eagle:"]:before,em[data-emoji=eagle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f985.svg)}em[data-emoji=":owl:"]:before,em[data-emoji=owl]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f989.svg)}em[data-emoji=":bat:"]:before,em[data-emoji=bat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f987.svg)}em[data-emoji=":wolf:"]:before,em[data-emoji=wolf]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f43a.svg)}em[data-emoji=":boar:"]:before,em[data-emoji=boar]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f417.svg)}em[data-emoji=":horse:"]:before,em[data-emoji=horse]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f434.svg)}em[data-emoji=":unicorn:"]:before,em[data-emoji=unicorn]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f984.svg)}em[data-emoji=":bee:"]:before,em[data-emoji=bee]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f41d.svg)}em[data-emoji=":bug:"]:before,em[data-emoji=bug]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f41b.svg)}em[data-emoji=":butterfly:"]:before,em[data-emoji=butterfly]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f98b.svg)}em[data-emoji=":snail:"]:before,em[data-emoji=snail]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f40c.svg)}em[data-emoji=":shell:"]:before,em[data-emoji=shell]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f41a.svg)}em[data-emoji=":beetle:"]:before,em[data-emoji=beetle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f41e.svg)}em[data-emoji=":ant:"]:before,em[data-emoji=ant]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f41c.svg)}em[data-emoji=":mosquito:"]:before,em[data-emoji=mosquito]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f99f.svg)}em[data-emoji=":cricket:"]:before,em[data-emoji=cricket]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f997.svg)}em[data-emoji=":spider:"]:before,em[data-emoji=spider]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f577.svg)}em[data-emoji=":spider_web:"]:before,em[data-emoji=spider_web]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f578.svg)}em[data-emoji=":scorpion:"]:before,em[data-emoji=scorpion]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f982.svg)}em[data-emoji=":turtle:"]:before,em[data-emoji=turtle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f422.svg)}em[data-emoji=":snake:"]:before,em[data-emoji=snake]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f40d.svg)}em[data-emoji=":lizard:"]:before,em[data-emoji=lizard]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f98e.svg)}em[data-emoji=":t_rex:"]:before,em[data-emoji=t_rex]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f996.svg)}em[data-emoji=":sauropod:"]:before,em[data-emoji=sauropod]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f995.svg)}em[data-emoji=":octopus:"]:before,em[data-emoji=octopus]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f419.svg)}em[data-emoji=":squid:"]:before,em[data-emoji=squid]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f991.svg)}em[data-emoji=":shrimp:"]:before,em[data-emoji=shrimp]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f990.svg)}em[data-emoji=":lobster:"]:before,em[data-emoji=lobster]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f99e.svg)}em[data-emoji=":oyster:"]:before,em[data-emoji=oyster]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9aa.svg)}em[data-emoji=":crab:"]:before,em[data-emoji=crab]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f980.svg)}em[data-emoji=":blowfish:"]:before,em[data-emoji=blowfish]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f421.svg)}em[data-emoji=":tropical_fish:"]:before,em[data-emoji=tropical_fish]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f420.svg)}em[data-emoji=":fish:"]:before,em[data-emoji=fish]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f41f.svg)}em[data-emoji=":dolphin:"]:before,em[data-emoji=dolphin]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f42c.svg)}em[data-emoji=":whale:"]:before,em[data-emoji=whale]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f433.svg)}em[data-emoji=":whale2:"]:before,em[data-emoji=whale2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f40b.svg)}em[data-emoji=":shark:"]:before,em[data-emoji=shark]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f988.svg)}em[data-emoji=":crocodile:"]:before,em[data-emoji=crocodile]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f40a.svg)}em[data-emoji=":tiger2:"]:before,em[data-emoji=tiger2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f405.svg)}em[data-emoji=":leopard:"]:before,em[data-emoji=leopard]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f406.svg)}em[data-emoji=":zebra:"]:before,em[data-emoji=zebra]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f993.svg)}em[data-emoji=":gorilla:"]:before,em[data-emoji=gorilla]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f98d.svg)}em[data-emoji=":orangutan:"]:before,em[data-emoji=orangutan]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9a7.svg)}em[data-emoji=":elephant:"]:before,em[data-emoji=elephant]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f418.svg)}em[data-emoji=":hippopotamus:"]:before,em[data-emoji=hippopotamus]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f99b.svg)}em[data-emoji=":rhino:"]:before,em[data-emoji=rhino]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f98f.svg)}em[data-emoji=":dromedary_camel:"]:before,em[data-emoji=dromedary_camel]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f42a.svg)}em[data-emoji=":camel:"]:before,em[data-emoji=camel]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f42b.svg)}em[data-emoji=":giraffe:"]:before,em[data-emoji=giraffe]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f992.svg)}em[data-emoji=":kangaroo:"]:before,em[data-emoji=kangaroo]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f998.svg)}em[data-emoji=":water_buffalo:"]:before,em[data-emoji=water_buffalo]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f403.svg)}em[data-emoji=":ox:"]:before,em[data-emoji=ox]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f402.svg)}em[data-emoji=":cow2:"]:before,em[data-emoji=cow2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f404.svg)}em[data-emoji=":racehorse:"]:before,em[data-emoji=racehorse]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f40e.svg)}em[data-emoji=":pig2:"]:before,em[data-emoji=pig2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f416.svg)}em[data-emoji=":ram:"]:before,em[data-emoji=ram]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f40f.svg)}em[data-emoji=":llama:"]:before,em[data-emoji=llama]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f999.svg)}em[data-emoji=":sheep:"]:before,em[data-emoji=sheep]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f411.svg)}em[data-emoji=":goat:"]:before,em[data-emoji=goat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f410.svg)}em[data-emoji=":deer:"]:before,em[data-emoji=deer]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f98c.svg)}em[data-emoji=":dog2:"]:before,em[data-emoji=dog2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f415.svg)}em[data-emoji=":guide_dog:"]:before,em[data-emoji=guide_dog]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ae.svg)}em[data-emoji=":service_dog:"]:before,em[data-emoji=service_dog]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f415-200d-1f9ba.svg)}em[data-emoji=":poodle:"]:before,em[data-emoji=poodle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f429.svg)}em[data-emoji=":cat2:"]:before,em[data-emoji=cat2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f408.svg)}em[data-emoji=":rooster:"]:before,em[data-emoji=rooster]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f413.svg)}em[data-emoji=":turkey:"]:before,em[data-emoji=turkey]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f983.svg)}em[data-emoji=":peacock:"]:before,em[data-emoji=peacock]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f99a.svg)}em[data-emoji=":parrot:"]:before,em[data-emoji=parrot]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f99c.svg)}em[data-emoji=":swan:"]:before,em[data-emoji=swan]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9a2.svg)}em[data-emoji=":flamingo:"]:before,em[data-emoji=flamingo]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9a9.svg)}em[data-emoji=":dove:"]:before,em[data-emoji=dove]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f54a.svg)}em[data-emoji=":rabbit2:"]:before,em[data-emoji=rabbit2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f407.svg)}em[data-emoji=":sloth:"]:before,em[data-emoji=sloth]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9a5.svg)}em[data-emoji=":otter:"]:before,em[data-emoji=otter]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9a6.svg)}em[data-emoji=":skunk:"]:before,em[data-emoji=skunk]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9a8.svg)}em[data-emoji=":raccoon:"]:before,em[data-emoji=raccoon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f99d.svg)}em[data-emoji=":badger:"]:before,em[data-emoji=badger]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9a1.svg)}em[data-emoji=":mouse2:"]:before,em[data-emoji=mouse2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f401.svg)}em[data-emoji=":rat:"]:before,em[data-emoji=rat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f400.svg)}em[data-emoji=":chipmunk:"]:before,em[data-emoji=chipmunk]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f43f.svg)}em[data-emoji=":hedgehog:"]:before,em[data-emoji=hedgehog]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f994.svg)}em[data-emoji=":feet:"]:before,em[data-emoji=feet]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f43e.svg)}em[data-emoji=":dragon:"]:before,em[data-emoji=dragon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f409.svg)}em[data-emoji=":dragon_face:"]:before,em[data-emoji=dragon_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f432.svg)}em[data-emoji=":cactus:"]:before,em[data-emoji=cactus]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f335.svg)}em[data-emoji=":christmas_tree:"]:before,em[data-emoji=christmas_tree]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f384.svg)}em[data-emoji=":evergreen_tree:"]:before,em[data-emoji=evergreen_tree]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f332.svg)}em[data-emoji=":deciduous_tree:"]:before,em[data-emoji=deciduous_tree]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f333.svg)}em[data-emoji=":palm_tree:"]:before,em[data-emoji=palm_tree]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f334.svg)}em[data-emoji=":seedling:"]:before,em[data-emoji=seedling]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f331.svg)}em[data-emoji=":herb:"]:before,em[data-emoji=herb]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f33f.svg)}em[data-emoji=":four_leaf_clover:"]:before,em[data-emoji=four_leaf_clover]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f340.svg)}em[data-emoji=":bamboo:"]:before,em[data-emoji=bamboo]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f38d.svg)}em[data-emoji=":tanabata_tree:"]:before,em[data-emoji=tanabata_tree]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f38b.svg)}em[data-emoji=":leaves:"]:before,em[data-emoji=leaves]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f343.svg)}em[data-emoji=":fallen_leaf:"]:before,em[data-emoji=fallen_leaf]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f342.svg)}em[data-emoji=":maple_leaf:"]:before,em[data-emoji=maple_leaf]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f341.svg)}em[data-emoji=":mushroom:"]:before,em[data-emoji=mushroom]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f344.svg)}em[data-emoji=":ear_of_rice:"]:before,em[data-emoji=ear_of_rice]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f33e.svg)}em[data-emoji=":bouquet:"]:before,em[data-emoji=bouquet]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f490.svg)}em[data-emoji=":tulip:"]:before,em[data-emoji=tulip]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f337.svg)}em[data-emoji=":rose:"]:before,em[data-emoji=rose]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f339.svg)}em[data-emoji=":wilted_rose:"]:before,em[data-emoji=wilted_rose]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f940.svg)}em[data-emoji=":hibiscus:"]:before,em[data-emoji=hibiscus]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f33a.svg)}em[data-emoji=":cherry_blossom:"]:before,em[data-emoji=cherry_blossom]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f338.svg)}em[data-emoji=":blossom:"]:before,em[data-emoji=blossom]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f33c.svg)}em[data-emoji=":sunflower:"]:before,em[data-emoji=sunflower]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f33b.svg)}em[data-emoji=":sun_with_face:"]:before,em[data-emoji=sun_with_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f31e.svg)}em[data-emoji=":full_moon_with_face:"]:before,em[data-emoji=full_moon_with_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f31d.svg)}em[data-emoji=":first_quarter_moon_with_face:"]:before,em[data-emoji=first_quarter_moon_with_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f31b.svg)}em[data-emoji=":last_quarter_moon_with_face:"]:before,em[data-emoji=last_quarter_moon_with_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f31c.svg)}em[data-emoji=":new_moon_with_face:"]:before,em[data-emoji=new_moon_with_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f31a.svg)}em[data-emoji=":full_moon:"]:before,em[data-emoji=full_moon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f315.svg)}em[data-emoji=":waning_gibbous_moon:"]:before,em[data-emoji=waning_gibbous_moon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f316.svg)}em[data-emoji=":last_quarter_moon:"]:before,em[data-emoji=last_quarter_moon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f317.svg)}em[data-emoji=":waning_crescent_moon:"]:before,em[data-emoji=waning_crescent_moon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f318.svg)}em[data-emoji=":new_moon:"]:before,em[data-emoji=new_moon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f311.svg)}em[data-emoji=":waxing_crescent_moon:"]:before,em[data-emoji=waxing_crescent_moon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f312.svg)}em[data-emoji=":first_quarter_moon:"]:before,em[data-emoji=first_quarter_moon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f313.svg)}em[data-emoji=":waxing_gibbous_moon:"]:before,em[data-emoji=waxing_gibbous_moon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f314.svg)}em[data-emoji=":crescent_moon:"]:before,em[data-emoji=crescent_moon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f319.svg)}em[data-emoji=":earth_americas:"]:before,em[data-emoji=earth_americas]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f30e.svg)}em[data-emoji=":earth_africa:"]:before,em[data-emoji=earth_africa]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f30d.svg)}em[data-emoji=":earth_asia:"]:before,em[data-emoji=earth_asia]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f30f.svg)}em[data-emoji=":ringed_planet:"]:before,em[data-emoji=ringed_planet]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1fa90.svg)}em[data-emoji=":dizzy:"]:before,em[data-emoji=dizzy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4ab.svg)}em[data-emoji=":star:"]:before,em[data-emoji=star]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/2b50.svg)}em[data-emoji=":star2:"]:before,em[data-emoji=star2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f31f.svg)}em[data-emoji=":zap:"]:before,em[data-emoji=zap]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26a1.svg)}em[data-emoji=":boom:"]:before,em[data-emoji=boom]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4a5.svg)}em[data-emoji=":fire:"]:before,em[data-emoji=fire]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f525.svg)}em[data-emoji=":cloud_tornado:"]:before,em[data-emoji=cloud_tornado]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f32a.svg)}em[data-emoji=":rainbow:"]:before,em[data-emoji=rainbow]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f308.svg)}em[data-emoji=":white_sun_small_cloud:"]:before,em[data-emoji=white_sun_small_cloud]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f324.svg)}em[data-emoji=":partly_sunny:"]:before,em[data-emoji=partly_sunny]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26c5.svg)}em[data-emoji=":white_sun_cloud:"]:before,em[data-emoji=white_sun_cloud]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f325.svg)}em[data-emoji=":white_sun_rain_cloud:"]:before,em[data-emoji=white_sun_rain_cloud]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f326.svg)}em[data-emoji=":cloud_rain:"]:before,em[data-emoji=cloud_rain]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f327.svg)}em[data-emoji=":thunder_cloud_rain:"]:before,em[data-emoji=thunder_cloud_rain]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26c8.svg)}em[data-emoji=":cloud_lightning:"]:before,em[data-emoji=cloud_lightning]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f329.svg)}em[data-emoji=":cloud_snow:"]:before,em[data-emoji=cloud_snow]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f328.svg)}em[data-emoji=":snowman:"]:before,em[data-emoji=snowman]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26c4.svg)}em[data-emoji=":wind_blowing_face:"]:before,em[data-emoji=wind_blowing_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f32c.svg)}em[data-emoji=":dash:"]:before,em[data-emoji=dash]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4a8.svg)}em[data-emoji=":droplet:"]:before,em[data-emoji=droplet]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4a7.svg)}em[data-emoji=":sweat_drops:"]:before,em[data-emoji=sweat_drops]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4a6.svg)}em[data-emoji=":ocean:"]:before,em[data-emoji=ocean]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f30a.svg)}em[data-emoji=":fog:"]:before,em[data-emoji=fog]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f32b.svg)}em[data-emoji=":green_apple:"]:before,em[data-emoji=green_apple]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f34f.svg)}em[data-emoji=":apple:"]:before,em[data-emoji=apple]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f34e.svg)}em[data-emoji=":pear:"]:before,em[data-emoji=pear]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f350.svg)}em[data-emoji=":tangerine:"]:before,em[data-emoji=tangerine]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f34a.svg)}em[data-emoji=":lemon:"]:before,em[data-emoji=lemon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f34b.svg)}em[data-emoji=":banana:"]:before,em[data-emoji=banana]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f34c.svg)}em[data-emoji=":watermelon:"]:before,em[data-emoji=watermelon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f349.svg)}em[data-emoji=":grapes:"]:before,em[data-emoji=grapes]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f347.svg)}em[data-emoji=":strawberry:"]:before,em[data-emoji=strawberry]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f353.svg)}em[data-emoji=":melon:"]:before,em[data-emoji=melon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f348.svg)}em[data-emoji=":cherries:"]:before,em[data-emoji=cherries]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f352.svg)}em[data-emoji=":peach:"]:before,em[data-emoji=peach]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f351.svg)}em[data-emoji=":mango:"]:before,em[data-emoji=mango]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f96d.svg)}em[data-emoji=":pineapple:"]:before,em[data-emoji=pineapple]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f34d.svg)}em[data-emoji=":coconut:"]:before,em[data-emoji=coconut]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f965.svg)}em[data-emoji=":kiwi:"]:before,em[data-emoji=kiwi]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f95d.svg)}em[data-emoji=":tomato:"]:before,em[data-emoji=tomato]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f345.svg)}em[data-emoji=":eggplant:"]:before,em[data-emoji=eggplant]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f346.svg)}em[data-emoji=":avocado:"]:before,em[data-emoji=avocado]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f951.svg)}em[data-emoji=":broccoli:"]:before,em[data-emoji=broccoli]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f966.svg)}em[data-emoji=":leafy_green:"]:before,em[data-emoji=leafy_green]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f96c.svg)}em[data-emoji=":cucumber:"]:before,em[data-emoji=cucumber]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f952.svg)}em[data-emoji=":hot_pepper:"]:before,em[data-emoji=hot_pepper]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f336.svg)}em[data-emoji=":corn:"]:before,em[data-emoji=corn]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f33d.svg)}em[data-emoji=":carrot:"]:before,em[data-emoji=carrot]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f955.svg)}em[data-emoji=":onion:"]:before,em[data-emoji=onion]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9c5.svg)}em[data-emoji=":garlic:"]:before,em[data-emoji=garlic]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9c4.svg)}em[data-emoji=":potato:"]:before,em[data-emoji=potato]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f954.svg)}em[data-emoji=":sweet_potato:"]:before,em[data-emoji=sweet_potato]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f360.svg)}em[data-emoji=":croissant:"]:before,em[data-emoji=croissant]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f950.svg)}em[data-emoji=":bagel:"]:before,em[data-emoji=bagel]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f96f.svg)}em[data-emoji=":bread:"]:before,em[data-emoji=bread]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f35e.svg)}em[data-emoji=":french_bread:"]:before,em[data-emoji=french_bread]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f956.svg)}em[data-emoji=":pretzel:"]:before,em[data-emoji=pretzel]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f968.svg)}em[data-emoji=":cheese:"]:before,em[data-emoji=cheese]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9c0.svg)}em[data-emoji=":egg:"]:before,em[data-emoji=egg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f95a.svg)}em[data-emoji=":cooking:"]:before,em[data-emoji=cooking]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f373.svg)}em[data-emoji=":pancakes:"]:before,em[data-emoji=pancakes]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f95e.svg)}em[data-emoji=":waffle:"]:before,em[data-emoji=waffle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9c7.svg)}em[data-emoji=":bacon:"]:before,em[data-emoji=bacon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f953.svg)}em[data-emoji=":cut_of_meat:"]:before,em[data-emoji=cut_of_meat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f969.svg)}em[data-emoji=":poultry_leg:"]:before,em[data-emoji=poultry_leg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f357.svg)}em[data-emoji=":meat_on_bone:"]:before,em[data-emoji=meat_on_bone]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f356.svg)}em[data-emoji=":hotdog:"]:before,em[data-emoji=hotdog]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f32d.svg)}em[data-emoji=":hamburger:"]:before,em[data-emoji=hamburger]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f354.svg)}em[data-emoji=":fries:"]:before,em[data-emoji=fries]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f35f.svg)}em[data-emoji=":pizza:"]:before,em[data-emoji=pizza]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f355.svg)}em[data-emoji=":sandwich:"]:before,em[data-emoji=sandwich]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f96a.svg)}em[data-emoji=":falafel:"]:before,em[data-emoji=falafel]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9c6.svg)}em[data-emoji=":stuffed_flatbread:"]:before,em[data-emoji=stuffed_flatbread]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f959.svg)}em[data-emoji=":taco:"]:before,em[data-emoji=taco]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f32e.svg)}em[data-emoji=":burrito:"]:before,em[data-emoji=burrito]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f32f.svg)}em[data-emoji=":salad:"]:before,em[data-emoji=salad]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f957.svg)}em[data-emoji=":shallow_pan_of_food:"]:before,em[data-emoji=shallow_pan_of_food]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f958.svg)}em[data-emoji=":canned_food:"]:before,em[data-emoji=canned_food]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f96b.svg)}em[data-emoji=":spaghetti:"]:before,em[data-emoji=spaghetti]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f35d.svg)}em[data-emoji=":ramen:"]:before,em[data-emoji=ramen]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f35c.svg)}em[data-emoji=":stew:"]:before,em[data-emoji=stew]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f372.svg)}em[data-emoji=":curry:"]:before,em[data-emoji=curry]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f35b.svg)}em[data-emoji=":sushi:"]:before,em[data-emoji=sushi]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f363.svg)}em[data-emoji=":bento:"]:before,em[data-emoji=bento]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f371.svg)}em[data-emoji=":dumpling:"]:before,em[data-emoji=dumpling]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f95f.svg)}em[data-emoji=":fried_shrimp:"]:before,em[data-emoji=fried_shrimp]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f364.svg)}em[data-emoji=":rice_ball:"]:before,em[data-emoji=rice_ball]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f359.svg)}em[data-emoji=":rice:"]:before,em[data-emoji=rice]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f35a.svg)}em[data-emoji=":rice_cracker:"]:before,em[data-emoji=rice_cracker]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f358.svg)}em[data-emoji=":fish_cake:"]:before,em[data-emoji=fish_cake]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f365.svg)}em[data-emoji=":fortune_cookie:"]:before,em[data-emoji=fortune_cookie]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f960.svg)}em[data-emoji=":moon_cake:"]:before,em[data-emoji=moon_cake]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f96e.svg)}em[data-emoji=":oden:"]:before,em[data-emoji=oden]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f362.svg)}em[data-emoji=":dango:"]:before,em[data-emoji=dango]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f361.svg)}em[data-emoji=":shaved_ice:"]:before,em[data-emoji=shaved_ice]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f367.svg)}em[data-emoji=":ice_cream:"]:before,em[data-emoji=ice_cream]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f368.svg)}em[data-emoji=":icecream:"]:before,em[data-emoji=icecream]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f366.svg)}em[data-emoji=":pie:"]:before,em[data-emoji=pie]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f967.svg)}em[data-emoji=":cupcake:"]:before,em[data-emoji=cupcake]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9c1.svg)}em[data-emoji=":cake:"]:before,em[data-emoji=cake]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f370.svg)}em[data-emoji=":birthday:"]:before,em[data-emoji=birthday]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f382.svg)}em[data-emoji=":custard:"]:before,em[data-emoji=custard]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f36e.svg)}em[data-emoji=":lollipop:"]:before,em[data-emoji=lollipop]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f36d.svg)}em[data-emoji=":candy:"]:before,em[data-emoji=candy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f36c.svg)}em[data-emoji=":chocolate_bar:"]:before,em[data-emoji=chocolate_bar]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f36b.svg)}em[data-emoji=":popcorn:"]:before,em[data-emoji=popcorn]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f37f.svg)}em[data-emoji=":doughnut:"]:before,em[data-emoji=doughnut]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f369.svg)}em[data-emoji=":cookie:"]:before,em[data-emoji=cookie]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f36a.svg)}em[data-emoji=":chestnut:"]:before,em[data-emoji=chestnut]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f330.svg)}em[data-emoji=":peanuts:"]:before,em[data-emoji=peanuts]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f95c.svg)}em[data-emoji=":honey_pot:"]:before,em[data-emoji=honey_pot]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f36f.svg)}em[data-emoji=":butter:"]:before,em[data-emoji=butter]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9c8.svg)}em[data-emoji=":milk:"]:before,em[data-emoji=milk]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f95b.svg)}em[data-emoji=":baby_bottle:"]:before,em[data-emoji=baby_bottle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f37c.svg)}em[data-emoji=":tea:"]:before,em[data-emoji=tea]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f375.svg)}em[data-emoji=":mate:"]:before,em[data-emoji=mate]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9c9.svg)}em[data-emoji=":cup_with_straw:"]:before,em[data-emoji=cup_with_straw]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f964.svg)}em[data-emoji=":beverage_box:"]:before,em[data-emoji=beverage_box]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9c3.svg)}em[data-emoji=":ice_cube:"]:before,em[data-emoji=ice_cube]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ca.svg)}em[data-emoji=":sake:"]:before,em[data-emoji=sake]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f376.svg)}em[data-emoji=":beer:"]:before,em[data-emoji=beer]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f37a.svg)}em[data-emoji=":beers:"]:before,em[data-emoji=beers]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f37b.svg)}em[data-emoji=":champagne_glass:"]:before,em[data-emoji=champagne_glass]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f942.svg)}em[data-emoji=":wine_glass:"]:before,em[data-emoji=wine_glass]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f377.svg)}em[data-emoji=":tumbler_glass:"]:before,em[data-emoji=tumbler_glass]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f943.svg)}em[data-emoji=":cocktail:"]:before,em[data-emoji=cocktail]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f378.svg)}em[data-emoji=":tropical_drink:"]:before,em[data-emoji=tropical_drink]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f379.svg)}em[data-emoji=":champagne:"]:before,em[data-emoji=champagne]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f37e.svg)}em[data-emoji=":spoon:"]:before,em[data-emoji=spoon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f944.svg)}em[data-emoji=":fork_and_knife:"]:before,em[data-emoji=fork_and_knife]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f374.svg)}em[data-emoji=":fork_knife_plate:"]:before,em[data-emoji=fork_knife_plate]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f37d.svg)}em[data-emoji=":bowl_with_spoon:"]:before,em[data-emoji=bowl_with_spoon]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f963.svg)}em[data-emoji=":takeout_box:"]:before,em[data-emoji=takeout_box]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f961.svg)}em[data-emoji=":chopsticks:"]:before,em[data-emoji=chopsticks]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f962.svg)}em[data-emoji=":salt:"]:before,em[data-emoji=salt]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9c2.svg)}em[data-emoji=":blush:"]:before,em[data-emoji=blush]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f60a.svg)}em[data-emoji=":innocent:"]:before,em[data-emoji=innocent]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f607.svg)}em[data-emoji=":slight_smile:"]:before,em[data-emoji=slight_smile]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f642.svg)}em[data-emoji=":upside_down:"]:before,em[data-emoji=upside_down]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f643.svg)}em[data-emoji=":wink:"]:before,em[data-emoji=wink]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f609.svg)}em[data-emoji=":grinning:"]:before,em[data-emoji=grinning]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f600.svg)}em[data-emoji=":smiley:"]:before,em[data-emoji=smiley]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f603.svg)}em[data-emoji=":smile:"]:before,em[data-emoji=smile]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f604.svg)}em[data-emoji=":grin:"]:before,em[data-emoji=grin]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f601.svg)}em[data-emoji=":laughing:"]:before,em[data-emoji=laughing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f606.svg)}em[data-emoji=":sweat_smile:"]:before,em[data-emoji=sweat_smile]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f605.svg)}em[data-emoji=":joy:"]:before,em[data-emoji=joy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f602.svg)}em[data-emoji=":rofl:"]:before,em[data-emoji=rofl]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f923.svg)}em[data-emoji=":relaxed:"]:before,em[data-emoji=relaxed]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/263a.svg)}em[data-emoji=":relieved:"]:before,em[data-emoji=relieved]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f60c.svg)}em[data-emoji=":heart_eyes:"]:before,em[data-emoji=heart_eyes]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f60d.svg)}em[data-emoji=":smiling_face_with_3_hearts:"]:before,em[data-emoji=smiling_face_with_3_hearts]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f970.svg)}em[data-emoji=":kissing_heart:"]:before,em[data-emoji=kissing_heart]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f618.svg)}em[data-emoji=":kissing:"]:before,em[data-emoji=kissing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f617.svg)}em[data-emoji=":kissing_smiling_eyes:"]:before,em[data-emoji=kissing_smiling_eyes]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f619.svg)}em[data-emoji=":kissing_closed_eyes:"]:before,em[data-emoji=kissing_closed_eyes]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f61a.svg)}em[data-emoji=":yum:"]:before,em[data-emoji=yum]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f60b.svg)}em[data-emoji=":stuck_out_tongue:"]:before,em[data-emoji=stuck_out_tongue]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f61b.svg)}em[data-emoji=":stuck_out_tongue_closed_eyes:"]:before,em[data-emoji=stuck_out_tongue_closed_eyes]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f61d.svg)}em[data-emoji=":stuck_out_tongue_winking_eye:"]:before,em[data-emoji=stuck_out_tongue_winking_eye]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f61c.svg)}em[data-emoji=":zany_face:"]:before,em[data-emoji=zany_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f92a.svg)}em[data-emoji=":face_with_raised_eyebrow:"]:before,em[data-emoji=face_with_raised_eyebrow]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f928.svg)}em[data-emoji=":face_with_monocle:"]:before,em[data-emoji=face_with_monocle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d0.svg)}em[data-emoji=":nerd:"]:before,em[data-emoji=nerd]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f913.svg)}em[data-emoji=":sunglasses:"]:before,em[data-emoji=sunglasses]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f60e.svg)}em[data-emoji=":star_struck:"]:before,em[data-emoji=star_struck]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f929.svg)}em[data-emoji=":partying_face:"]:before,em[data-emoji=partying_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f973.svg)}em[data-emoji=":smirk:"]:before,em[data-emoji=smirk]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f60f.svg)}em[data-emoji=":unamused:"]:before,em[data-emoji=unamused]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f612.svg)}em[data-emoji=":disappointed:"]:before,em[data-emoji=disappointed]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f61e.svg)}em[data-emoji=":pensive:"]:before,em[data-emoji=pensive]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f614.svg)}em[data-emoji=":worried:"]:before,em[data-emoji=worried]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f61f.svg)}em[data-emoji=":confused:"]:before,em[data-emoji=confused]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f615.svg)}em[data-emoji=":slight_frown:"]:before,em[data-emoji=slight_frown]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f641.svg)}em[data-emoji=":persevere:"]:before,em[data-emoji=persevere]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f623.svg)}em[data-emoji=":confounded:"]:before,em[data-emoji=confounded]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f616.svg)}em[data-emoji=":tired_face:"]:before,em[data-emoji=tired_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f62b.svg)}em[data-emoji=":weary:"]:before,em[data-emoji=weary]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f629.svg)}em[data-emoji=":yawning_face:"]:before,em[data-emoji=yawning_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f971.svg)}em[data-emoji=":pleading_face:"]:before,em[data-emoji=pleading_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f97a.svg)}em[data-emoji=":cry:"]:before,em[data-emoji=cry]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f622.svg)}em[data-emoji=":sob:"]:before,em[data-emoji=sob]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f62d.svg)}em[data-emoji=":triumph:"]:before,em[data-emoji=triumph]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f624.svg)}em[data-emoji=":angry:"]:before,em[data-emoji=angry]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f620.svg)}em[data-emoji=":rage:"]:before,em[data-emoji=rage]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f621.svg)}em[data-emoji=":face_with_symbols_over_mouth:"]:before,em[data-emoji=face_with_symbols_over_mouth]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f92c.svg)}em[data-emoji=":exploding_head:"]:before,em[data-emoji=exploding_head]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f92f.svg)}em[data-emoji=":flushed:"]:before,em[data-emoji=flushed]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f633.svg)}em[data-emoji=":hot_face:"]:before,em[data-emoji=hot_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f975.svg)}em[data-emoji=":cold_face:"]:before,em[data-emoji=cold_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f976.svg)}em[data-emoji=":scream:"]:before,em[data-emoji=scream]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f631.svg)}em[data-emoji=":fearful:"]:before,em[data-emoji=fearful]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f628.svg)}em[data-emoji=":cold_sweat:"]:before,em[data-emoji=cold_sweat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f630.svg)}em[data-emoji=":disappointed_relieved:"]:before,em[data-emoji=disappointed_relieved]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f625.svg)}em[data-emoji=":sweat:"]:before,em[data-emoji=sweat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f613.svg)}em[data-emoji=":hugging:"]:before,em[data-emoji=hugging]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f917.svg)}em[data-emoji=":thinking:"]:before,em[data-emoji=thinking]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f914.svg)}em[data-emoji=":face_with_hand_over_mouth:"]:before,em[data-emoji=face_with_hand_over_mouth]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f92d.svg)}em[data-emoji=":shushing_face:"]:before,em[data-emoji=shushing_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f92b.svg)}em[data-emoji=":lying_face:"]:before,em[data-emoji=lying_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f925.svg)}em[data-emoji=":no_mouth:"]:before,em[data-emoji=no_mouth]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f636.svg)}em[data-emoji=":neutral_face:"]:before,em[data-emoji=neutral_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f610.svg)}em[data-emoji=":expressionless:"]:before,em[data-emoji=expressionless]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f611.svg)}em[data-emoji=":grimacing:"]:before,em[data-emoji=grimacing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f62c.svg)}em[data-emoji=":rolling_eyes:"]:before,em[data-emoji=rolling_eyes]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f644.svg)}em[data-emoji=":hushed:"]:before,em[data-emoji=hushed]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f62f.svg)}em[data-emoji=":frowning:"]:before,em[data-emoji=frowning]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f626.svg)}em[data-emoji=":anguished:"]:before,em[data-emoji=anguished]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f627.svg)}em[data-emoji=":open_mouth:"]:before,em[data-emoji=open_mouth]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f62e.svg)}em[data-emoji=":astonished:"]:before,em[data-emoji=astonished]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f632.svg)}em[data-emoji=":sleeping:"]:before,em[data-emoji=sleeping]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f634.svg)}em[data-emoji=":drooling_face:"]:before,em[data-emoji=drooling_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f924.svg)}em[data-emoji=":sleepy:"]:before,em[data-emoji=sleepy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f62a.svg)}em[data-emoji=":dizzy_face:"]:before,em[data-emoji=dizzy_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f635.svg)}em[data-emoji=":zipper_mouth:"]:before,em[data-emoji=zipper_mouth]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f910.svg)}em[data-emoji=":woozy_face:"]:before,em[data-emoji=woozy_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f974.svg)}em[data-emoji=":nauseated_face:"]:before,em[data-emoji=nauseated_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f922.svg)}em[data-emoji=":face_vomiting:"]:before,em[data-emoji=face_vomiting]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f92e.svg)}em[data-emoji=":sneezing_face:"]:before,em[data-emoji=sneezing_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f927.svg)}em[data-emoji=":mask:"]:before,em[data-emoji=mask]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f637.svg)}em[data-emoji=":thermometer_face:"]:before,em[data-emoji=thermometer_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f912.svg)}em[data-emoji=":head_bandage:"]:before,em[data-emoji=head_bandage]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f915.svg)}em[data-emoji=":money_mouth:"]:before,em[data-emoji=money_mouth]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f911.svg)}em[data-emoji=":cowboy:"]:before,em[data-emoji=cowboy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f920.svg)}em[data-emoji=":smiling_imp:"]:before,em[data-emoji=smiling_imp]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f608.svg)}em[data-emoji=":imp:"]:before,em[data-emoji=imp]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f47f.svg)}em[data-emoji=":japanese_ogre:"]:before,em[data-emoji=japanese_ogre]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f479.svg)}em[data-emoji=":japanese_goblin:"]:before,em[data-emoji=japanese_goblin]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f47a.svg)}em[data-emoji=":clown:"]:before,em[data-emoji=clown]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f921.svg)}em[data-emoji=":poop:"]:before,em[data-emoji=poop]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4a9.svg)}em[data-emoji=":ghost:"]:before,em[data-emoji=ghost]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f47b.svg)}em[data-emoji=":skull:"]:before,em[data-emoji=skull]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f480.svg)}em[data-emoji=":alien:"]:before,em[data-emoji=alien]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f47d.svg)}em[data-emoji=":space_invader:"]:before,em[data-emoji=space_invader]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f47e.svg)}em[data-emoji=":robot:"]:before,em[data-emoji=robot]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f916.svg)}em[data-emoji=":jack_o_lantern:"]:before,em[data-emoji=jack_o_lantern]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f383.svg)}em[data-emoji=":smiley_cat:"]:before,em[data-emoji=smiley_cat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f63a.svg)}em[data-emoji=":smile_cat:"]:before,em[data-emoji=smile_cat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f638.svg)}em[data-emoji=":joy_cat:"]:before,em[data-emoji=joy_cat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f639.svg)}em[data-emoji=":heart_eyes_cat:"]:before,em[data-emoji=heart_eyes_cat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f63b.svg)}em[data-emoji=":smirk_cat:"]:before,em[data-emoji=smirk_cat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f63c.svg)}em[data-emoji=":kissing_cat:"]:before,em[data-emoji=kissing_cat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f63d.svg)}em[data-emoji=":scream_cat:"]:before,em[data-emoji=scream_cat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f640.svg)}em[data-emoji=":crying_cat_face:"]:before,em[data-emoji=crying_cat_face]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f63f.svg)}em[data-emoji=":pouting_cat:"]:before,em[data-emoji=pouting_cat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f63e.svg)}em[data-emoji=":handshake:"]:before,em[data-emoji=handshake]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91d.svg)}em[data-emoji=":palms_up_together:"]:before,em[data-emoji=palms_up_together]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f932.svg)}em[data-emoji=":palms_up_together_tone1:"]:before,em[data-emoji=palms_up_together_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f932-1f3fb.svg)}em[data-emoji=":palms_up_together_tone2:"]:before,em[data-emoji=palms_up_together_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f932-1f3fc.svg)}em[data-emoji=":palms_up_together_tone3:"]:before,em[data-emoji=palms_up_together_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f932-1f3fd.svg)}em[data-emoji=":palms_up_together_tone4:"]:before,em[data-emoji=palms_up_together_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f932-1f3fe.svg)}em[data-emoji=":palms_up_together_tone5:"]:before,em[data-emoji=palms_up_together_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f932-1f3ff.svg)}em[data-emoji=":open_hands:"]:before,em[data-emoji=open_hands]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f450.svg)}em[data-emoji=":open_hands_tone1:"]:before,em[data-emoji=open_hands_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f450-1f3fb.svg)}em[data-emoji=":open_hands_tone2:"]:before,em[data-emoji=open_hands_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f450-1f3fc.svg)}em[data-emoji=":open_hands_tone3:"]:before,em[data-emoji=open_hands_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f450-1f3fd.svg)}em[data-emoji=":open_hands_tone4:"]:before,em[data-emoji=open_hands_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f450-1f3fe.svg)}em[data-emoji=":open_hands_tone5:"]:before,em[data-emoji=open_hands_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f450-1f3ff.svg)}em[data-emoji=":raised_hands:"]:before,em[data-emoji=raised_hands]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64c.svg)}em[data-emoji=":raised_hands_tone1:"]:before,em[data-emoji=raised_hands_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64c-1f3fb.svg)}em[data-emoji=":raised_hands_tone2:"]:before,em[data-emoji=raised_hands_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64c-1f3fc.svg)}em[data-emoji=":raised_hands_tone3:"]:before,em[data-emoji=raised_hands_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64c-1f3fd.svg)}em[data-emoji=":raised_hands_tone4:"]:before,em[data-emoji=raised_hands_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64c-1f3fe.svg)}em[data-emoji=":raised_hands_tone5:"]:before,em[data-emoji=raised_hands_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64c-1f3ff.svg)}em[data-emoji=":clap:"]:before,em[data-emoji=clap]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44f.svg)}em[data-emoji=":clap_tone1:"]:before,em[data-emoji=clap_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44f-1f3fb.svg)}em[data-emoji=":clap_tone2:"]:before,em[data-emoji=clap_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44f-1f3fc.svg)}em[data-emoji=":clap_tone3:"]:before,em[data-emoji=clap_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44f-1f3fd.svg)}em[data-emoji=":clap_tone4:"]:before,em[data-emoji=clap_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44f-1f3fe.svg)}em[data-emoji=":clap_tone5:"]:before,em[data-emoji=clap_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44f-1f3ff.svg)}em[data-emoji=":thumbsup:"]:before,em[data-emoji=thumbsup]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44d.svg)}em[data-emoji=":thumbsup_tone1:"]:before,em[data-emoji=thumbsup_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44d-1f3fb.svg)}em[data-emoji=":thumbsup_tone2:"]:before,em[data-emoji=thumbsup_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44d-1f3fc.svg)}em[data-emoji=":thumbsup_tone3:"]:before,em[data-emoji=thumbsup_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44d-1f3fd.svg)}em[data-emoji=":thumbsup_tone4:"]:before,em[data-emoji=thumbsup_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44d-1f3fe.svg)}em[data-emoji=":thumbsup_tone5:"]:before,em[data-emoji=thumbsup_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44d-1f3ff.svg)}em[data-emoji=":thumbsdown:"]:before,em[data-emoji=thumbsdown]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44e.svg)}em[data-emoji=":thumbsdown_tone1:"]:before,em[data-emoji=thumbsdown_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44e-1f3fb.svg)}em[data-emoji=":thumbsdown_tone2:"]:before,em[data-emoji=thumbsdown_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44e-1f3fc.svg)}em[data-emoji=":thumbsdown_tone3:"]:before,em[data-emoji=thumbsdown_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44e-1f3fd.svg)}em[data-emoji=":thumbsdown_tone4:"]:before,em[data-emoji=thumbsdown_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44e-1f3fe.svg)}em[data-emoji=":thumbsdown_tone5:"]:before,em[data-emoji=thumbsdown_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44e-1f3ff.svg)}em[data-emoji=":punch:"]:before,em[data-emoji=punch]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44a.svg)}em[data-emoji=":punch_tone1:"]:before,em[data-emoji=punch_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44a-1f3fb.svg)}em[data-emoji=":punch_tone2:"]:before,em[data-emoji=punch_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44a-1f3fc.svg)}em[data-emoji=":punch_tone3:"]:before,em[data-emoji=punch_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44a-1f3fd.svg)}em[data-emoji=":punch_tone4:"]:before,em[data-emoji=punch_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44a-1f3fe.svg)}em[data-emoji=":punch_tone5:"]:before,em[data-emoji=punch_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44a-1f3ff.svg)}em[data-emoji=":fist:"]:before,em[data-emoji=fist]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270a.svg)}em[data-emoji=":fist_tone1:"]:before,em[data-emoji=fist_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270a-1f3fb.svg)}em[data-emoji=":fist_tone2:"]:before,em[data-emoji=fist_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270a-1f3fc.svg)}em[data-emoji=":fist_tone3:"]:before,em[data-emoji=fist_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270a-1f3fd.svg)}em[data-emoji=":fist_tone4:"]:before,em[data-emoji=fist_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270a-1f3fe.svg)}em[data-emoji=":fist_tone5:"]:before,em[data-emoji=fist_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270a-1f3ff.svg)}em[data-emoji=":left_facing_fist:"]:before,em[data-emoji=left_facing_fist]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91b.svg)}em[data-emoji=":left_facing_fist_tone1:"]:before,em[data-emoji=left_facing_fist_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91b-1f3fb.svg)}em[data-emoji=":left_facing_fist_tone2:"]:before,em[data-emoji=left_facing_fist_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91b-1f3fc.svg)}em[data-emoji=":left_facing_fist_tone3:"]:before,em[data-emoji=left_facing_fist_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91b-1f3fd.svg)}em[data-emoji=":left_facing_fist_tone4:"]:before,em[data-emoji=left_facing_fist_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91b-1f3fe.svg)}em[data-emoji=":left_facing_fist_tone5:"]:before,em[data-emoji=left_facing_fist_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91b-1f3ff.svg)}em[data-emoji=":right_facing_fist:"]:before,em[data-emoji=right_facing_fist]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91c.svg)}em[data-emoji=":right_facing_fist_tone1:"]:before,em[data-emoji=right_facing_fist_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91c-1f3fb.svg)}em[data-emoji=":right_facing_fist_tone2:"]:before,em[data-emoji=right_facing_fist_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91c-1f3fc.svg)}em[data-emoji=":right_facing_fist_tone3:"]:before,em[data-emoji=right_facing_fist_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91c-1f3fd.svg)}em[data-emoji=":right_facing_fist_tone4:"]:before,em[data-emoji=right_facing_fist_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91c-1f3fe.svg)}em[data-emoji=":right_facing_fist_tone5:"]:before,em[data-emoji=right_facing_fist_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91c-1f3ff.svg)}em[data-emoji=":fingers_crossed:"]:before,em[data-emoji=fingers_crossed]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91e.svg)}em[data-emoji=":fingers_crossed_tone1:"]:before,em[data-emoji=fingers_crossed_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91e-1f3fb.svg)}em[data-emoji=":fingers_crossed_tone2:"]:before,em[data-emoji=fingers_crossed_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91e-1f3fc.svg)}em[data-emoji=":fingers_crossed_tone3:"]:before,em[data-emoji=fingers_crossed_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91e-1f3fd.svg)}em[data-emoji=":fingers_crossed_tone4:"]:before,em[data-emoji=fingers_crossed_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91e-1f3fe.svg)}em[data-emoji=":fingers_crossed_tone5:"]:before,em[data-emoji=fingers_crossed_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91e-1f3ff.svg)}em[data-emoji=":v:"]:before,em[data-emoji="v"]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270c.svg)}em[data-emoji=":v_tone1:"]:before,em[data-emoji=v_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270c-1f3fb.svg)}em[data-emoji=":v_tone2:"]:before,em[data-emoji=v_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270c-1f3fc.svg)}em[data-emoji=":v_tone3:"]:before,em[data-emoji=v_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270c-1f3fd.svg)}em[data-emoji=":v_tone4:"]:before,em[data-emoji=v_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270c-1f3fe.svg)}em[data-emoji=":v_tone5:"]:before,em[data-emoji=v_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270c-1f3ff.svg)}em[data-emoji=":love_you_gesture:"]:before,em[data-emoji=love_you_gesture]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91f.svg)}em[data-emoji=":love_you_gesture_tone1:"]:before,em[data-emoji=love_you_gesture_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91f-1f3fb.svg)}em[data-emoji=":love_you_gesture_tone2:"]:before,em[data-emoji=love_you_gesture_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91f-1f3fc.svg)}em[data-emoji=":love_you_gesture_tone3:"]:before,em[data-emoji=love_you_gesture_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91f-1f3fd.svg)}em[data-emoji=":love_you_gesture_tone4:"]:before,em[data-emoji=love_you_gesture_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91f-1f3fe.svg)}em[data-emoji=":love_you_gesture_tone5:"]:before,em[data-emoji=love_you_gesture_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91f-1f3ff.svg)}em[data-emoji=":metal:"]:before,em[data-emoji=metal]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f918.svg)}em[data-emoji=":metal_tone1:"]:before,em[data-emoji=metal_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f918-1f3fb.svg)}em[data-emoji=":metal_tone2:"]:before,em[data-emoji=metal_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f918-1f3fc.svg)}em[data-emoji=":metal_tone3:"]:before,em[data-emoji=metal_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f918-1f3fd.svg)}em[data-emoji=":metal_tone4:"]:before,em[data-emoji=metal_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f918-1f3fe.svg)}em[data-emoji=":metal_tone5:"]:before,em[data-emoji=metal_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f918-1f3ff.svg)}em[data-emoji=":ok_hand:"]:before,em[data-emoji=ok_hand]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44c.svg)}em[data-emoji=":ok_hand_tone1:"]:before,em[data-emoji=ok_hand_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44c-1f3fb.svg)}em[data-emoji=":ok_hand_tone2:"]:before,em[data-emoji=ok_hand_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44c-1f3fc.svg)}em[data-emoji=":ok_hand_tone3:"]:before,em[data-emoji=ok_hand_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44c-1f3fd.svg)}em[data-emoji=":ok_hand_tone4:"]:before,em[data-emoji=ok_hand_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44c-1f3fe.svg)}em[data-emoji=":ok_hand_tone5:"]:before,em[data-emoji=ok_hand_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44c-1f3ff.svg)}em[data-emoji=":pinching_hand:"]:before,em[data-emoji=pinching_hand]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f90f.svg)}em[data-emoji=":pinching_hand_tone1:"]:before,em[data-emoji=pinching_hand_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f90f-1f3fb.svg)}em[data-emoji=":pinching_hand_tone2:"]:before,em[data-emoji=pinching_hand_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f90f-1f3fc.svg)}em[data-emoji=":pinching_hand_tone3:"]:before,em[data-emoji=pinching_hand_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f90f-1f3fd.svg)}em[data-emoji=":pinching_hand_tone4:"]:before,em[data-emoji=pinching_hand_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f90f-1f3fe.svg)}em[data-emoji=":pinching_hand_tone5:"]:before,em[data-emoji=pinching_hand_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f90f-1f3ff.svg)}em[data-emoji=":point_left:"]:before,em[data-emoji=point_left]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f448.svg)}em[data-emoji=":point_left_tone1:"]:before,em[data-emoji=point_left_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f448-1f3fb.svg)}em[data-emoji=":point_left_tone2:"]:before,em[data-emoji=point_left_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f448-1f3fc.svg)}em[data-emoji=":point_left_tone3:"]:before,em[data-emoji=point_left_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f448-1f3fd.svg)}em[data-emoji=":point_left_tone4:"]:before,em[data-emoji=point_left_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f448-1f3fe.svg)}em[data-emoji=":point_left_tone5:"]:before,em[data-emoji=point_left_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f448-1f3ff.svg)}em[data-emoji=":point_right:"]:before,em[data-emoji=point_right]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f449.svg)}em[data-emoji=":point_right_tone1:"]:before,em[data-emoji=point_right_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f449-1f3fb.svg)}em[data-emoji=":point_right_tone2:"]:before,em[data-emoji=point_right_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f449-1f3fc.svg)}em[data-emoji=":point_right_tone3:"]:before,em[data-emoji=point_right_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f449-1f3fd.svg)}em[data-emoji=":point_right_tone4:"]:before,em[data-emoji=point_right_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f449-1f3fe.svg)}em[data-emoji=":point_right_tone5:"]:before,em[data-emoji=point_right_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f449-1f3ff.svg)}em[data-emoji=":point_up_2:"]:before,em[data-emoji=point_up_2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f446.svg)}em[data-emoji=":point_up_2_tone1:"]:before,em[data-emoji=point_up_2_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f446-1f3fb.svg)}em[data-emoji=":point_up_2_tone2:"]:before,em[data-emoji=point_up_2_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f446-1f3fc.svg)}em[data-emoji=":point_up_2_tone3:"]:before,em[data-emoji=point_up_2_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f446-1f3fd.svg)}em[data-emoji=":point_up_2_tone4:"]:before,em[data-emoji=point_up_2_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f446-1f3fe.svg)}em[data-emoji=":point_up_2_tone5:"]:before,em[data-emoji=point_up_2_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f446-1f3ff.svg)}em[data-emoji=":point_down:"]:before,em[data-emoji=point_down]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f447.svg)}em[data-emoji=":point_down_tone1:"]:before,em[data-emoji=point_down_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f447-1f3fb.svg)}em[data-emoji=":point_down_tone2:"]:before,em[data-emoji=point_down_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f447-1f3fc.svg)}em[data-emoji=":point_down_tone3:"]:before,em[data-emoji=point_down_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f447-1f3fd.svg)}em[data-emoji=":point_down_tone4:"]:before,em[data-emoji=point_down_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f447-1f3fe.svg)}em[data-emoji=":point_down_tone5:"]:before,em[data-emoji=point_down_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f447-1f3ff.svg)}em[data-emoji=":point_up:"]:before,em[data-emoji=point_up]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/261d.svg)}em[data-emoji=":point_up_tone1:"]:before,em[data-emoji=point_up_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/261d-1f3fb.svg)}em[data-emoji=":point_up_tone2:"]:before,em[data-emoji=point_up_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/261d-1f3fc.svg)}em[data-emoji=":point_up_tone3:"]:before,em[data-emoji=point_up_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/261d-1f3fd.svg)}em[data-emoji=":point_up_tone4:"]:before,em[data-emoji=point_up_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/261d-1f3fe.svg)}em[data-emoji=":point_up_tone5:"]:before,em[data-emoji=point_up_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/261d-1f3ff.svg)}em[data-emoji=":raised_hand:"]:before,em[data-emoji=raised_hand]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270b.svg)}em[data-emoji=":raised_hand_tone1:"]:before,em[data-emoji=raised_hand_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270b-1f3fb.svg)}em[data-emoji=":raised_hand_tone2:"]:before,em[data-emoji=raised_hand_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270b-1f3fc.svg)}em[data-emoji=":raised_hand_tone3:"]:before,em[data-emoji=raised_hand_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270b-1f3fd.svg)}em[data-emoji=":raised_hand_tone4:"]:before,em[data-emoji=raised_hand_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270b-1f3fe.svg)}em[data-emoji=":raised_hand_tone5:"]:before,em[data-emoji=raised_hand_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270b-1f3ff.svg)}em[data-emoji=":raised_back_of_hand:"]:before,em[data-emoji=raised_back_of_hand]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91a.svg)}em[data-emoji=":raised_back_of_hand_tone1:"]:before,em[data-emoji=raised_back_of_hand_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91a-1f3fb.svg)}em[data-emoji=":raised_back_of_hand_tone2:"]:before,em[data-emoji=raised_back_of_hand_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91a-1f3fc.svg)}em[data-emoji=":raised_back_of_hand_tone3:"]:before,em[data-emoji=raised_back_of_hand_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91a-1f3fd.svg)}em[data-emoji=":raised_back_of_hand_tone4:"]:before,em[data-emoji=raised_back_of_hand_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91a-1f3fe.svg)}em[data-emoji=":raised_back_of_hand_tone5:"]:before,em[data-emoji=raised_back_of_hand_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f91a-1f3ff.svg)}em[data-emoji=":hand_splayed:"]:before,em[data-emoji=hand_splayed]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f590.svg)}em[data-emoji=":hand_splayed_tone1:"]:before,em[data-emoji=hand_splayed_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f590-1f3fb.svg)}em[data-emoji=":hand_splayed_tone2:"]:before,em[data-emoji=hand_splayed_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f590-1f3fc.svg)}em[data-emoji=":hand_splayed_tone3:"]:before,em[data-emoji=hand_splayed_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f590-1f3fd.svg)}em[data-emoji=":hand_splayed_tone4:"]:before,em[data-emoji=hand_splayed_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f590-1f3fe.svg)}em[data-emoji=":hand_splayed_tone5:"]:before,em[data-emoji=hand_splayed_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f590-1f3ff.svg)}em[data-emoji=":vulcan:"]:before,em[data-emoji=vulcan]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f596.svg)}em[data-emoji=":vulcan_tone1:"]:before,em[data-emoji=vulcan_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f596-1f3fb.svg)}em[data-emoji=":vulcan_tone2:"]:before,em[data-emoji=vulcan_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f596-1f3fc.svg)}em[data-emoji=":vulcan_tone3:"]:before,em[data-emoji=vulcan_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f596-1f3fd.svg)}em[data-emoji=":vulcan_tone4:"]:before,em[data-emoji=vulcan_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f596-1f3fe.svg)}em[data-emoji=":vulcan_tone5:"]:before,em[data-emoji=vulcan_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f596-1f3ff.svg)}em[data-emoji=":wave:"]:before,em[data-emoji=wave]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44b.svg)}em[data-emoji=":wave_tone1:"]:before,em[data-emoji=wave_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44b-1f3fb.svg)}em[data-emoji=":wave_tone2:"]:before,em[data-emoji=wave_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44b-1f3fc.svg)}em[data-emoji=":wave_tone3:"]:before,em[data-emoji=wave_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44b-1f3fd.svg)}em[data-emoji=":wave_tone4:"]:before,em[data-emoji=wave_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44b-1f3fe.svg)}em[data-emoji=":wave_tone5:"]:before,em[data-emoji=wave_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f44b-1f3ff.svg)}em[data-emoji=":call_me:"]:before,em[data-emoji=call_me]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f919.svg)}em[data-emoji=":call_me_tone1:"]:before,em[data-emoji=call_me_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f919-1f3fb.svg)}em[data-emoji=":call_me_tone2:"]:before,em[data-emoji=call_me_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f919-1f3fc.svg)}em[data-emoji=":call_me_tone3:"]:before,em[data-emoji=call_me_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f919-1f3fd.svg)}em[data-emoji=":call_me_tone4:"]:before,em[data-emoji=call_me_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f919-1f3fe.svg)}em[data-emoji=":call_me_tone5:"]:before,em[data-emoji=call_me_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f919-1f3ff.svg)}em[data-emoji=":muscle:"]:before,em[data-emoji=muscle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4aa.svg)}em[data-emoji=":muscle_tone1:"]:before,em[data-emoji=muscle_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4aa-1f3fb.svg)}em[data-emoji=":muscle_tone2:"]:before,em[data-emoji=muscle_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4aa-1f3fc.svg)}em[data-emoji=":muscle_tone3:"]:before,em[data-emoji=muscle_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4aa-1f3fd.svg)}em[data-emoji=":muscle_tone4:"]:before,em[data-emoji=muscle_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4aa-1f3fe.svg)}em[data-emoji=":muscle_tone5:"]:before,em[data-emoji=muscle_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4aa-1f3ff.svg)}em[data-emoji=":mechanical_arm:"]:before,em[data-emoji=mechanical_arm]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9be.svg)}em[data-emoji=":middle_finger:"]:before,em[data-emoji=middle_finger]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f595.svg)}em[data-emoji=":middle_finger_tone1:"]:before,em[data-emoji=middle_finger_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f595-1f3fb.svg)}em[data-emoji=":middle_finger_tone2:"]:before,em[data-emoji=middle_finger_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f595-1f3fc.svg)}em[data-emoji=":middle_finger_tone3:"]:before,em[data-emoji=middle_finger_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f595-1f3fd.svg)}em[data-emoji=":middle_finger_tone4:"]:before,em[data-emoji=middle_finger_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f595-1f3fe.svg)}em[data-emoji=":middle_finger_tone5:"]:before,em[data-emoji=middle_finger_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f595-1f3ff.svg)}em[data-emoji=":writing_hand:"]:before,em[data-emoji=writing_hand]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270d.svg)}em[data-emoji=":writing_hand_tone1:"]:before,em[data-emoji=writing_hand_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270d-1f3fb.svg)}em[data-emoji=":writing_hand_tone2:"]:before,em[data-emoji=writing_hand_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270d-1f3fc.svg)}em[data-emoji=":writing_hand_tone3:"]:before,em[data-emoji=writing_hand_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270d-1f3fd.svg)}em[data-emoji=":writing_hand_tone4:"]:before,em[data-emoji=writing_hand_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270d-1f3fe.svg)}em[data-emoji=":writing_hand_tone5:"]:before,em[data-emoji=writing_hand_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/270d-1f3ff.svg)}em[data-emoji=":pray:"]:before,em[data-emoji=pray]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64f.svg)}em[data-emoji=":pray_tone1:"]:before,em[data-emoji=pray_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64f-1f3fb.svg)}em[data-emoji=":pray_tone2:"]:before,em[data-emoji=pray_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64f-1f3fc.svg)}em[data-emoji=":pray_tone3:"]:before,em[data-emoji=pray_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64f-1f3fd.svg)}em[data-emoji=":pray_tone4:"]:before,em[data-emoji=pray_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64f-1f3fe.svg)}em[data-emoji=":pray_tone5:"]:before,em[data-emoji=pray_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64f-1f3ff.svg)}em[data-emoji=":foot:"]:before,em[data-emoji=foot]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b6.svg)}em[data-emoji=":foot_tone1:"]:before,em[data-emoji=foot_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b6-1f3fb.svg)}em[data-emoji=":foot_tone2:"]:before,em[data-emoji=foot_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b6-1f3fc.svg)}em[data-emoji=":foot_tone3:"]:before,em[data-emoji=foot_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b6-1f3fd.svg)}em[data-emoji=":foot_tone4:"]:before,em[data-emoji=foot_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b6-1f3fe.svg)}em[data-emoji=":foot_tone5:"]:before,em[data-emoji=foot_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b6-1f3ff.svg)}em[data-emoji=":leg:"]:before,em[data-emoji=leg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b5.svg)}em[data-emoji=":leg_tone1:"]:before,em[data-emoji=leg_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b5-1f3fb.svg)}em[data-emoji=":leg_tone2:"]:before,em[data-emoji=leg_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b5-1f3fc.svg)}em[data-emoji=":leg_tone3:"]:before,em[data-emoji=leg_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b5-1f3fd.svg)}em[data-emoji=":leg_tone4:"]:before,em[data-emoji=leg_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b5-1f3fe.svg)}em[data-emoji=":leg_tone5:"]:before,em[data-emoji=leg_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b5-1f3ff.svg)}em[data-emoji=":mechanical_leg:"]:before,em[data-emoji=mechanical_leg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9bf.svg)}em[data-emoji=":lipstick:"]:before,em[data-emoji=lipstick]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f484.svg)}em[data-emoji=":kiss:"]:before,em[data-emoji=kiss]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f48b.svg)}em[data-emoji=":lips:"]:before,em[data-emoji=lips]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f444.svg)}em[data-emoji=":tongue:"]:before,em[data-emoji=tongue]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f445.svg)}em[data-emoji=":tooth:"]:before,em[data-emoji=tooth]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b7.svg)}em[data-emoji=":bone:"]:before,em[data-emoji=bone]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b4.svg)}em[data-emoji=":ear:"]:before,em[data-emoji=ear]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f442.svg)}em[data-emoji=":ear_tone1:"]:before,em[data-emoji=ear_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f442-1f3fb.svg)}em[data-emoji=":ear_tone2:"]:before,em[data-emoji=ear_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f442-1f3fc.svg)}em[data-emoji=":ear_tone3:"]:before,em[data-emoji=ear_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f442-1f3fd.svg)}em[data-emoji=":ear_tone4:"]:before,em[data-emoji=ear_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f442-1f3fe.svg)}em[data-emoji=":ear_tone5:"]:before,em[data-emoji=ear_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f442-1f3ff.svg)}em[data-emoji=":ear_with_hearing_aid:"]:before,em[data-emoji=ear_with_hearing_aid]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9bb.svg)}em[data-emoji=":ear_with_hearing_aid_tone1:"]:before,em[data-emoji=ear_with_hearing_aid_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9bb-1f3fb.svg)}em[data-emoji=":ear_with_hearing_aid_tone2:"]:before,em[data-emoji=ear_with_hearing_aid_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9bb-1f3fc.svg)}em[data-emoji=":ear_with_hearing_aid_tone3:"]:before,em[data-emoji=ear_with_hearing_aid_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9bb-1f3fd.svg)}em[data-emoji=":ear_with_hearing_aid_tone4:"]:before,em[data-emoji=ear_with_hearing_aid_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9bb-1f3fe.svg)}em[data-emoji=":ear_with_hearing_aid_tone5:"]:before,em[data-emoji=ear_with_hearing_aid_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9bb-1f3ff.svg)}em[data-emoji=":nose:"]:before,em[data-emoji=nose]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f443.svg)}em[data-emoji=":nose_tone1:"]:before,em[data-emoji=nose_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f443-1f3fb.svg)}em[data-emoji=":nose_tone2:"]:before,em[data-emoji=nose_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f443-1f3fc.svg)}em[data-emoji=":nose_tone3:"]:before,em[data-emoji=nose_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f443-1f3fd.svg)}em[data-emoji=":nose_tone4:"]:before,em[data-emoji=nose_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f443-1f3fe.svg)}em[data-emoji=":nose_tone5:"]:before,em[data-emoji=nose_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f443-1f3ff.svg)}em[data-emoji=":footprints:"]:before,em[data-emoji=footprints]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f463.svg)}em[data-emoji=":eye:"]:before,em[data-emoji=eye]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f441.svg)}em[data-emoji=":eyes:"]:before,em[data-emoji=eyes]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f440.svg)}em[data-emoji=":brain:"]:before,em[data-emoji=brain]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9e0.svg)}em[data-emoji=":speaking_head:"]:before,em[data-emoji=speaking_head]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5e3.svg)}em[data-emoji=":bust_in_silhouette:"]:before,em[data-emoji=bust_in_silhouette]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f464.svg)}em[data-emoji=":busts_in_silhouette:"]:before,em[data-emoji=busts_in_silhouette]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f465.svg)}em[data-emoji=":baby:"]:before,em[data-emoji=baby]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f476.svg)}em[data-emoji=":baby_tone1:"]:before,em[data-emoji=baby_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f476-1f3fb.svg)}em[data-emoji=":baby_tone2:"]:before,em[data-emoji=baby_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f476-1f3fc.svg)}em[data-emoji=":baby_tone3:"]:before,em[data-emoji=baby_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f476-1f3fd.svg)}em[data-emoji=":baby_tone4:"]:before,em[data-emoji=baby_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f476-1f3fe.svg)}em[data-emoji=":baby_tone5:"]:before,em[data-emoji=baby_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f476-1f3ff.svg)}em[data-emoji=":girl:"]:before,em[data-emoji=girl]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f467.svg)}em[data-emoji=":girl_tone1:"]:before,em[data-emoji=girl_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f467-1f3fb.svg)}em[data-emoji=":girl_tone2:"]:before,em[data-emoji=girl_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f467-1f3fc.svg)}em[data-emoji=":girl_tone3:"]:before,em[data-emoji=girl_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f467-1f3fd.svg)}em[data-emoji=":girl_tone4:"]:before,em[data-emoji=girl_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f467-1f3fe.svg)}em[data-emoji=":girl_tone5:"]:before,em[data-emoji=girl_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f467-1f3ff.svg)}em[data-emoji=":child:"]:before,em[data-emoji=child]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d2.svg)}em[data-emoji=":child_tone1:"]:before,em[data-emoji=child_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d2-1f3fb.svg)}em[data-emoji=":child_tone2:"]:before,em[data-emoji=child_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d2-1f3fc.svg)}em[data-emoji=":child_tone3:"]:before,em[data-emoji=child_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d2-1f3fd.svg)}em[data-emoji=":child_tone4:"]:before,em[data-emoji=child_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d2-1f3fe.svg)}em[data-emoji=":child_tone5:"]:before,em[data-emoji=child_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d2-1f3ff.svg)}em[data-emoji=":boy:"]:before,em[data-emoji=boy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f466.svg)}em[data-emoji=":boy_tone1:"]:before,em[data-emoji=boy_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f466-1f3fb.svg)}em[data-emoji=":boy_tone2:"]:before,em[data-emoji=boy_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f466-1f3fc.svg)}em[data-emoji=":boy_tone3:"]:before,em[data-emoji=boy_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f466-1f3fd.svg)}em[data-emoji=":boy_tone4:"]:before,em[data-emoji=boy_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f466-1f3fe.svg)}em[data-emoji=":boy_tone5:"]:before,em[data-emoji=boy_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f466-1f3ff.svg)}em[data-emoji=":woman:"]:before,em[data-emoji=woman]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469.svg)}em[data-emoji=":woman_tone1:"]:before,em[data-emoji=woman_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb.svg)}em[data-emoji=":woman_tone2:"]:before,em[data-emoji=woman_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc.svg)}em[data-emoji=":woman_tone3:"]:before,em[data-emoji=woman_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd.svg)}em[data-emoji=":woman_tone4:"]:before,em[data-emoji=woman_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe.svg)}em[data-emoji=":woman_tone5:"]:before,em[data-emoji=woman_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff.svg)}em[data-emoji=":adult:"]:before,em[data-emoji=adult]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1.svg)}em[data-emoji=":adult_tone1:"]:before,em[data-emoji=adult_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3fb.svg)}em[data-emoji=":adult_tone2:"]:before,em[data-emoji=adult_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3fc.svg)}em[data-emoji=":adult_tone3:"]:before,em[data-emoji=adult_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3fd.svg)}em[data-emoji=":adult_tone4:"]:before,em[data-emoji=adult_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3fe.svg)}em[data-emoji=":adult_tone5:"]:before,em[data-emoji=adult_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3ff.svg)}em[data-emoji=":man:"]:before,em[data-emoji=man]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468.svg)}em[data-emoji=":man_tone1:"]:before,em[data-emoji=man_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb.svg)}em[data-emoji=":man_tone2:"]:before,em[data-emoji=man_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc.svg)}em[data-emoji=":man_tone3:"]:before,em[data-emoji=man_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd.svg)}em[data-emoji=":man_tone4:"]:before,em[data-emoji=man_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe.svg)}em[data-emoji=":man_tone5:"]:before,em[data-emoji=man_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff.svg)}em[data-emoji=":woman_curly_haired:"]:before,em[data-emoji=woman_curly_haired]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f9b1.svg)}em[data-emoji=":woman_curly_haired_tone1:"]:before,em[data-emoji=woman_curly_haired_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f9b1.svg)}em[data-emoji=":woman_curly_haired_tone2:"]:before,em[data-emoji=woman_curly_haired_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f9b1.svg)}em[data-emoji=":woman_curly_haired_tone3:"]:before,em[data-emoji=woman_curly_haired_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f9b1.svg)}em[data-emoji=":woman_curly_haired_tone4:"]:before,em[data-emoji=woman_curly_haired_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f9b1.svg)}em[data-emoji=":woman_curly_haired_tone5:"]:before,em[data-emoji=woman_curly_haired_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f9b1.svg)}em[data-emoji=":man_curly_haired:"]:before,em[data-emoji=man_curly_haired]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f9b1.svg)}em[data-emoji=":man_curly_haired_tone1:"]:before,em[data-emoji=man_curly_haired_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f9b1.svg)}em[data-emoji=":man_curly_haired_tone2:"]:before,em[data-emoji=man_curly_haired_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f9b1.svg)}em[data-emoji=":man_curly_haired_tone3:"]:before,em[data-emoji=man_curly_haired_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f9b1.svg)}em[data-emoji=":man_curly_haired_tone4:"]:before,em[data-emoji=man_curly_haired_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f9b1.svg)}em[data-emoji=":man_curly_haired_tone5:"]:before,em[data-emoji=man_curly_haired_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f9b1.svg)}em[data-emoji=":woman_red_haired:"]:before,em[data-emoji=woman_red_haired]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f9b0.svg)}em[data-emoji=":woman_red_haired_tone1:"]:before,em[data-emoji=woman_red_haired_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f9b0.svg)}em[data-emoji=":woman_red_haired_tone2:"]:before,em[data-emoji=woman_red_haired_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f9b0.svg)}em[data-emoji=":woman_red_haired_tone3:"]:before,em[data-emoji=woman_red_haired_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f9b0.svg)}em[data-emoji=":woman_red_haired_tone4:"]:before,em[data-emoji=woman_red_haired_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f9b0.svg)}em[data-emoji=":woman_red_haired_tone5:"]:before,em[data-emoji=woman_red_haired_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f9b0.svg)}em[data-emoji=":man_red_haired:"]:before,em[data-emoji=man_red_haired]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f9b0.svg)}em[data-emoji=":man_red_haired_tone1:"]:before,em[data-emoji=man_red_haired_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f9b0.svg)}em[data-emoji=":man_red_haired_tone2:"]:before,em[data-emoji=man_red_haired_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f9b0.svg)}em[data-emoji=":man_red_haired_tone3:"]:before,em[data-emoji=man_red_haired_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f9b0.svg)}em[data-emoji=":man_red_haired_tone4:"]:before,em[data-emoji=man_red_haired_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f9b0.svg)}em[data-emoji=":man_red_haired_tone5:"]:before,em[data-emoji=man_red_haired_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f9b0.svg)}em[data-emoji=":blond-haired_woman:"]:before,em[data-emoji=blond-haired_woman]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f471-200d-2640-fe0f.svg)}em[data-emoji=":blond-haired_woman_tone1:"]:before,em[data-emoji=blond-haired_woman_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f471-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":blond-haired_woman_tone2:"]:before,em[data-emoji=blond-haired_woman_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f471-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":blond-haired_woman_tone3:"]:before,em[data-emoji=blond-haired_woman_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f471-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":blond-haired_woman_tone4:"]:before,em[data-emoji=blond-haired_woman_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f471-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":blond-haired_woman_tone5:"]:before,em[data-emoji=blond-haired_woman_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f471-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":blond_haired_person:"]:before,em[data-emoji=blond_haired_person]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f471.svg)}em[data-emoji=":blond_haired_person_tone1:"]:before,em[data-emoji=blond_haired_person_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f471-1f3fb.svg)}em[data-emoji=":blond_haired_person_tone2:"]:before,em[data-emoji=blond_haired_person_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f471-1f3fc.svg)}em[data-emoji=":blond_haired_person_tone3:"]:before,em[data-emoji=blond_haired_person_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f471-1f3fd.svg)}em[data-emoji=":blond_haired_person_tone4:"]:before,em[data-emoji=blond_haired_person_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f471-1f3fe.svg)}em[data-emoji=":blond_haired_person_tone5:"]:before,em[data-emoji=blond_haired_person_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f471-1f3ff.svg)}em[data-emoji=":blond-haired_man:"]:before,em[data-emoji=blond-haired_man]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f471-200d-2642-fe0f.svg)}em[data-emoji=":blond-haired_man_tone1:"]:before,em[data-emoji=blond-haired_man_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f471-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":blond-haired_man_tone2:"]:before,em[data-emoji=blond-haired_man_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f471-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":blond-haired_man_tone3:"]:before,em[data-emoji=blond-haired_man_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f471-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":blond-haired_man_tone4:"]:before,em[data-emoji=blond-haired_man_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f471-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":blond-haired_man_tone5:"]:before,em[data-emoji=blond-haired_man_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f471-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":woman_white_haired:"]:before,em[data-emoji=woman_white_haired]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f9b3.svg)}em[data-emoji=":woman_white_haired_tone1:"]:before,em[data-emoji=woman_white_haired_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f9b3.svg)}em[data-emoji=":woman_white_haired_tone2:"]:before,em[data-emoji=woman_white_haired_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f9b3.svg)}em[data-emoji=":woman_white_haired_tone3:"]:before,em[data-emoji=woman_white_haired_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f9b3.svg)}em[data-emoji=":woman_white_haired_tone4:"]:before,em[data-emoji=woman_white_haired_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f9b3.svg)}em[data-emoji=":woman_white_haired_tone5:"]:before,em[data-emoji=woman_white_haired_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f9b3.svg)}em[data-emoji=":man_white_haired:"]:before,em[data-emoji=man_white_haired]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f9b3.svg)}em[data-emoji=":man_white_haired_tone1:"]:before,em[data-emoji=man_white_haired_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f9b3.svg)}em[data-emoji=":man_white_haired_tone2:"]:before,em[data-emoji=man_white_haired_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f9b3.svg)}em[data-emoji=":man_white_haired_tone3:"]:before,em[data-emoji=man_white_haired_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f9b3.svg)}em[data-emoji=":man_white_haired_tone4:"]:before,em[data-emoji=man_white_haired_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f9b3.svg)}em[data-emoji=":man_white_haired_tone5:"]:before,em[data-emoji=man_white_haired_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f9b3.svg)}em[data-emoji=":woman_bald:"]:before,em[data-emoji=woman_bald]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f9b2.svg)}em[data-emoji=":woman_bald_tone1:"]:before,em[data-emoji=woman_bald_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f9b2.svg)}em[data-emoji=":woman_bald_tone2:"]:before,em[data-emoji=woman_bald_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f9b2.svg)}em[data-emoji=":woman_bald_tone3:"]:before,em[data-emoji=woman_bald_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f9b2.svg)}em[data-emoji=":woman_bald_tone4:"]:before,em[data-emoji=woman_bald_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f9b2.svg)}em[data-emoji=":woman_bald_tone5:"]:before,em[data-emoji=woman_bald_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f9b2.svg)}em[data-emoji=":man_bald:"]:before,em[data-emoji=man_bald]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f9b2.svg)}em[data-emoji=":man_bald_tone1:"]:before,em[data-emoji=man_bald_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f9b2.svg)}em[data-emoji=":man_bald_tone2:"]:before,em[data-emoji=man_bald_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f9b2.svg)}em[data-emoji=":man_bald_tone3:"]:before,em[data-emoji=man_bald_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f9b2.svg)}em[data-emoji=":man_bald_tone4:"]:before,em[data-emoji=man_bald_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f9b2.svg)}em[data-emoji=":man_bald_tone5:"]:before,em[data-emoji=man_bald_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f9b2.svg)}em[data-emoji=":bearded_person:"]:before,em[data-emoji=bearded_person]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d4.svg)}em[data-emoji=":bearded_person_tone1:"]:before,em[data-emoji=bearded_person_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d4-1f3fb.svg)}em[data-emoji=":bearded_person_tone2:"]:before,em[data-emoji=bearded_person_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d4-1f3fc.svg)}em[data-emoji=":bearded_person_tone3:"]:before,em[data-emoji=bearded_person_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d4-1f3fd.svg)}em[data-emoji=":bearded_person_tone4:"]:before,em[data-emoji=bearded_person_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d4-1f3fe.svg)}em[data-emoji=":bearded_person_tone5:"]:before,em[data-emoji=bearded_person_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d4-1f3ff.svg)}em[data-emoji=":older_woman:"]:before,em[data-emoji=older_woman]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f475.svg)}em[data-emoji=":older_woman_tone1:"]:before,em[data-emoji=older_woman_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f475-1f3fb.svg)}em[data-emoji=":older_woman_tone2:"]:before,em[data-emoji=older_woman_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f475-1f3fc.svg)}em[data-emoji=":older_woman_tone3:"]:before,em[data-emoji=older_woman_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f475-1f3fd.svg)}em[data-emoji=":older_woman_tone4:"]:before,em[data-emoji=older_woman_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f475-1f3fe.svg)}em[data-emoji=":older_woman_tone5:"]:before,em[data-emoji=older_woman_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f475-1f3ff.svg)}em[data-emoji=":older_adult:"]:before,em[data-emoji=older_adult]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d3.svg)}em[data-emoji=":older_adult_tone1:"]:before,em[data-emoji=older_adult_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d3-1f3fb.svg)}em[data-emoji=":older_adult_tone2:"]:before,em[data-emoji=older_adult_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d3-1f3fc.svg)}em[data-emoji=":older_adult_tone3:"]:before,em[data-emoji=older_adult_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d3-1f3fd.svg)}em[data-emoji=":older_adult_tone4:"]:before,em[data-emoji=older_adult_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d3-1f3fe.svg)}em[data-emoji=":older_adult_tone5:"]:before,em[data-emoji=older_adult_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d3-1f3ff.svg)}em[data-emoji=":older_man:"]:before,em[data-emoji=older_man]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f474.svg)}em[data-emoji=":older_man_tone1:"]:before,em[data-emoji=older_man_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f474-1f3fb.svg)}em[data-emoji=":older_man_tone2:"]:before,em[data-emoji=older_man_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f474-1f3fc.svg)}em[data-emoji=":older_man_tone3:"]:before,em[data-emoji=older_man_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f474-1f3fd.svg)}em[data-emoji=":older_man_tone4:"]:before,em[data-emoji=older_man_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f474-1f3fe.svg)}em[data-emoji=":older_man_tone5:"]:before,em[data-emoji=older_man_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f474-1f3ff.svg)}em[data-emoji=":man_with_chinese_cap:"]:before,em[data-emoji=man_with_chinese_cap]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f472.svg)}em[data-emoji=":man_with_chinese_cap_tone1:"]:before,em[data-emoji=man_with_chinese_cap_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f472-1f3fb.svg)}em[data-emoji=":man_with_chinese_cap_tone2:"]:before,em[data-emoji=man_with_chinese_cap_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f472-1f3fc.svg)}em[data-emoji=":man_with_chinese_cap_tone3:"]:before,em[data-emoji=man_with_chinese_cap_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f472-1f3fd.svg)}em[data-emoji=":man_with_chinese_cap_tone4:"]:before,em[data-emoji=man_with_chinese_cap_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f472-1f3fe.svg)}em[data-emoji=":man_with_chinese_cap_tone5:"]:before,em[data-emoji=man_with_chinese_cap_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f472-1f3ff.svg)}em[data-emoji=":person_wearing_turban:"]:before,em[data-emoji=person_wearing_turban]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f473.svg)}em[data-emoji=":person_wearing_turban_tone1:"]:before,em[data-emoji=person_wearing_turban_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f473-1f3fb.svg)}em[data-emoji=":person_wearing_turban_tone2:"]:before,em[data-emoji=person_wearing_turban_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f473-1f3fc.svg)}em[data-emoji=":person_wearing_turban_tone3:"]:before,em[data-emoji=person_wearing_turban_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f473-1f3fd.svg)}em[data-emoji=":person_wearing_turban_tone4:"]:before,em[data-emoji=person_wearing_turban_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f473-1f3fe.svg)}em[data-emoji=":person_wearing_turban_tone5:"]:before,em[data-emoji=person_wearing_turban_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f473-1f3ff.svg)}em[data-emoji=":woman_wearing_turban:"]:before,em[data-emoji=woman_wearing_turban]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f473-200d-2640-fe0f.svg)}em[data-emoji=":woman_wearing_turban_tone1:"]:before,em[data-emoji=woman_wearing_turban_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f473-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_wearing_turban_tone2:"]:before,em[data-emoji=woman_wearing_turban_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f473-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_wearing_turban_tone3:"]:before,em[data-emoji=woman_wearing_turban_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f473-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_wearing_turban_tone4:"]:before,em[data-emoji=woman_wearing_turban_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f473-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_wearing_turban_tone5:"]:before,em[data-emoji=woman_wearing_turban_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f473-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_wearing_turban:"]:before,em[data-emoji=man_wearing_turban]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f473-200d-2642-fe0f.svg)}em[data-emoji=":man_wearing_turban_tone1:"]:before,em[data-emoji=man_wearing_turban_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f473-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_wearing_turban_tone2:"]:before,em[data-emoji=man_wearing_turban_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f473-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_wearing_turban_tone3:"]:before,em[data-emoji=man_wearing_turban_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f473-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_wearing_turban_tone4:"]:before,em[data-emoji=man_wearing_turban_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f473-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_wearing_turban_tone5:"]:before,em[data-emoji=man_wearing_turban_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f473-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":woman_with_headscarf:"]:before,em[data-emoji=woman_with_headscarf]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d5.svg)}em[data-emoji=":woman_with_headscarf_tone1:"]:before,em[data-emoji=woman_with_headscarf_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d5-1f3fb.svg)}em[data-emoji=":woman_with_headscarf_tone2:"]:before,em[data-emoji=woman_with_headscarf_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d5-1f3fc.svg)}em[data-emoji=":woman_with_headscarf_tone3:"]:before,em[data-emoji=woman_with_headscarf_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d5-1f3fd.svg)}em[data-emoji=":woman_with_headscarf_tone4:"]:before,em[data-emoji=woman_with_headscarf_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d5-1f3fe.svg)}em[data-emoji=":woman_with_headscarf_tone5:"]:before,em[data-emoji=woman_with_headscarf_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d5-1f3ff.svg)}em[data-emoji=":police_officer:"]:before,em[data-emoji=police_officer]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46e.svg)}em[data-emoji=":police_officer_tone1:"]:before,em[data-emoji=police_officer_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46e-1f3fb.svg)}em[data-emoji=":police_officer_tone2:"]:before,em[data-emoji=police_officer_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46e-1f3fc.svg)}em[data-emoji=":police_officer_tone3:"]:before,em[data-emoji=police_officer_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46e-1f3fd.svg)}em[data-emoji=":police_officer_tone4:"]:before,em[data-emoji=police_officer_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46e-1f3fe.svg)}em[data-emoji=":police_officer_tone5:"]:before,em[data-emoji=police_officer_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46e-1f3ff.svg)}em[data-emoji=":woman_police_officer:"]:before,em[data-emoji=woman_police_officer]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46e-200d-2640-fe0f.svg)}em[data-emoji=":woman_police_officer_tone1:"]:before,em[data-emoji=woman_police_officer_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46e-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_police_officer_tone2:"]:before,em[data-emoji=woman_police_officer_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46e-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_police_officer_tone3:"]:before,em[data-emoji=woman_police_officer_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46e-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_police_officer_tone4:"]:before,em[data-emoji=woman_police_officer_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46e-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_police_officer_tone5:"]:before,em[data-emoji=woman_police_officer_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46e-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_police_officer:"]:before,em[data-emoji=man_police_officer]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46e-200d-2642-fe0f.svg)}em[data-emoji=":man_police_officer_tone1:"]:before,em[data-emoji=man_police_officer_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46e-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_police_officer_tone2:"]:before,em[data-emoji=man_police_officer_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46e-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_police_officer_tone3:"]:before,em[data-emoji=man_police_officer_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46e-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_police_officer_tone4:"]:before,em[data-emoji=man_police_officer_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46e-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_police_officer_tone5:"]:before,em[data-emoji=man_police_officer_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46e-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":construction_worker:"]:before,em[data-emoji=construction_worker]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f477.svg)}em[data-emoji=":construction_worker_tone1:"]:before,em[data-emoji=construction_worker_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f477-1f3fb.svg)}em[data-emoji=":construction_worker_tone2:"]:before,em[data-emoji=construction_worker_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f477-1f3fc.svg)}em[data-emoji=":construction_worker_tone3:"]:before,em[data-emoji=construction_worker_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f477-1f3fd.svg)}em[data-emoji=":construction_worker_tone4:"]:before,em[data-emoji=construction_worker_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f477-1f3fe.svg)}em[data-emoji=":construction_worker_tone5:"]:before,em[data-emoji=construction_worker_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f477-1f3ff.svg)}em[data-emoji=":woman_construction_worker:"]:before,em[data-emoji=woman_construction_worker]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f477-200d-2640-fe0f.svg)}em[data-emoji=":woman_construction_worker_tone1:"]:before,em[data-emoji=woman_construction_worker_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f477-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_construction_worker_tone2:"]:before,em[data-emoji=woman_construction_worker_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f477-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_construction_worker_tone3:"]:before,em[data-emoji=woman_construction_worker_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f477-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_construction_worker_tone4:"]:before,em[data-emoji=woman_construction_worker_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f477-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_construction_worker_tone5:"]:before,em[data-emoji=woman_construction_worker_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f477-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_construction_worker:"]:before,em[data-emoji=man_construction_worker]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f477-200d-2642-fe0f.svg)}em[data-emoji=":man_construction_worker_tone1:"]:before,em[data-emoji=man_construction_worker_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f477-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_construction_worker_tone2:"]:before,em[data-emoji=man_construction_worker_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f477-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_construction_worker_tone3:"]:before,em[data-emoji=man_construction_worker_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f477-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_construction_worker_tone4:"]:before,em[data-emoji=man_construction_worker_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f477-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_construction_worker_tone5:"]:before,em[data-emoji=man_construction_worker_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f477-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":guard:"]:before,em[data-emoji=guard]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f482.svg)}em[data-emoji=":guard_tone1:"]:before,em[data-emoji=guard_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f482-1f3fb.svg)}em[data-emoji=":guard_tone2:"]:before,em[data-emoji=guard_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f482-1f3fc.svg)}em[data-emoji=":guard_tone3:"]:before,em[data-emoji=guard_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f482-1f3fd.svg)}em[data-emoji=":guard_tone4:"]:before,em[data-emoji=guard_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f482-1f3fe.svg)}em[data-emoji=":guard_tone5:"]:before,em[data-emoji=guard_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f482-1f3ff.svg)}em[data-emoji=":woman_guard:"]:before,em[data-emoji=woman_guard]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f482-200d-2640-fe0f.svg)}em[data-emoji=":woman_guard_tone1:"]:before,em[data-emoji=woman_guard_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f482-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_guard_tone2:"]:before,em[data-emoji=woman_guard_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f482-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_guard_tone3:"]:before,em[data-emoji=woman_guard_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f482-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_guard_tone4:"]:before,em[data-emoji=woman_guard_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f482-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_guard_tone5:"]:before,em[data-emoji=woman_guard_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f482-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_guard:"]:before,em[data-emoji=man_guard]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f482-200d-2642-fe0f.svg)}em[data-emoji=":man_guard_tone1:"]:before,em[data-emoji=man_guard_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f482-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_guard_tone2:"]:before,em[data-emoji=man_guard_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f482-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_guard_tone3:"]:before,em[data-emoji=man_guard_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f482-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_guard_tone4:"]:before,em[data-emoji=man_guard_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f482-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_guard_tone5:"]:before,em[data-emoji=man_guard_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f482-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":detective:"]:before,em[data-emoji=detective]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f575.svg)}em[data-emoji=":detective_tone1:"]:before,em[data-emoji=detective_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f575-1f3fb.svg)}em[data-emoji=":detective_tone2:"]:before,em[data-emoji=detective_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f575-1f3fc.svg)}em[data-emoji=":detective_tone3:"]:before,em[data-emoji=detective_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f575-1f3fd.svg)}em[data-emoji=":detective_tone4:"]:before,em[data-emoji=detective_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f575-1f3fe.svg)}em[data-emoji=":detective_tone5:"]:before,em[data-emoji=detective_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f575-1f3ff.svg)}em[data-emoji=":woman_detective:"]:before,em[data-emoji=woman_detective]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f575-fe0f-200d-2640-fe0f.svg)}em[data-emoji=":woman_detective_tone1:"]:before,em[data-emoji=woman_detective_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f575-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_detective_tone2:"]:before,em[data-emoji=woman_detective_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f575-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_detective_tone3:"]:before,em[data-emoji=woman_detective_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f575-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_detective_tone4:"]:before,em[data-emoji=woman_detective_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f575-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_detective_tone5:"]:before,em[data-emoji=woman_detective_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f575-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_detective:"]:before,em[data-emoji=man_detective]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f575-fe0f-200d-2642-fe0f.svg)}em[data-emoji=":man_detective_tone1:"]:before,em[data-emoji=man_detective_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f575-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_detective_tone2:"]:before,em[data-emoji=man_detective_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f575-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_detective_tone3:"]:before,em[data-emoji=man_detective_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f575-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_detective_tone4:"]:before,em[data-emoji=man_detective_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f575-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_detective_tone5:"]:before,em[data-emoji=man_detective_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f575-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":woman_health_worker:"]:before,em[data-emoji=woman_health_worker]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-2695-fe0f.svg)}em[data-emoji=":woman_health_worker_tone1:"]:before,em[data-emoji=woman_health_worker_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-2695-fe0f.svg)}em[data-emoji=":woman_health_worker_tone2:"]:before,em[data-emoji=woman_health_worker_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-2695-fe0f.svg)}em[data-emoji=":woman_health_worker_tone3:"]:before,em[data-emoji=woman_health_worker_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-2695-fe0f.svg)}em[data-emoji=":woman_health_worker_tone4:"]:before,em[data-emoji=woman_health_worker_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-2695-fe0f.svg)}em[data-emoji=":woman_health_worker_tone5:"]:before,em[data-emoji=woman_health_worker_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-2695-fe0f.svg)}em[data-emoji=":man_health_worker:"]:before,em[data-emoji=man_health_worker]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-2695-fe0f.svg)}em[data-emoji=":man_health_worker_tone1:"]:before,em[data-emoji=man_health_worker_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-2695-fe0f.svg)}em[data-emoji=":man_health_worker_tone2:"]:before,em[data-emoji=man_health_worker_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-2695-fe0f.svg)}em[data-emoji=":man_health_worker_tone3:"]:before,em[data-emoji=man_health_worker_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-2695-fe0f.svg)}em[data-emoji=":man_health_worker_tone4:"]:before,em[data-emoji=man_health_worker_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-2695-fe0f.svg)}em[data-emoji=":man_health_worker_tone5:"]:before,em[data-emoji=man_health_worker_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-2695-fe0f.svg)}em[data-emoji=":woman_farmer:"]:before,em[data-emoji=woman_farmer]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f33e.svg)}em[data-emoji=":woman_farmer_tone1:"]:before,em[data-emoji=woman_farmer_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f33e.svg)}em[data-emoji=":woman_farmer_tone2:"]:before,em[data-emoji=woman_farmer_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f33e.svg)}em[data-emoji=":woman_farmer_tone3:"]:before,em[data-emoji=woman_farmer_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f33e.svg)}em[data-emoji=":woman_farmer_tone4:"]:before,em[data-emoji=woman_farmer_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f33e.svg)}em[data-emoji=":woman_farmer_tone5:"]:before,em[data-emoji=woman_farmer_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f33e.svg)}em[data-emoji=":man_farmer:"]:before,em[data-emoji=man_farmer]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f33e.svg)}em[data-emoji=":man_farmer_tone1:"]:before,em[data-emoji=man_farmer_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f33e.svg)}em[data-emoji=":man_farmer_tone2:"]:before,em[data-emoji=man_farmer_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f33e.svg)}em[data-emoji=":man_farmer_tone3:"]:before,em[data-emoji=man_farmer_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f33e.svg)}em[data-emoji=":man_farmer_tone4:"]:before,em[data-emoji=man_farmer_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f33e.svg)}em[data-emoji=":man_farmer_tone5:"]:before,em[data-emoji=man_farmer_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f33e.svg)}em[data-emoji=":woman_cook:"]:before,em[data-emoji=woman_cook]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f373.svg)}em[data-emoji=":woman_cook_tone1:"]:before,em[data-emoji=woman_cook_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f373.svg)}em[data-emoji=":woman_cook_tone2:"]:before,em[data-emoji=woman_cook_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f373.svg)}em[data-emoji=":woman_cook_tone3:"]:before,em[data-emoji=woman_cook_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f373.svg)}em[data-emoji=":woman_cook_tone4:"]:before,em[data-emoji=woman_cook_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f373.svg)}em[data-emoji=":woman_cook_tone5:"]:before,em[data-emoji=woman_cook_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f373.svg)}em[data-emoji=":man_cook:"]:before,em[data-emoji=man_cook]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f373.svg)}em[data-emoji=":man_cook_tone1:"]:before,em[data-emoji=man_cook_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f373.svg)}em[data-emoji=":man_cook_tone2:"]:before,em[data-emoji=man_cook_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f373.svg)}em[data-emoji=":man_cook_tone3:"]:before,em[data-emoji=man_cook_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f373.svg)}em[data-emoji=":man_cook_tone4:"]:before,em[data-emoji=man_cook_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f373.svg)}em[data-emoji=":man_cook_tone5:"]:before,em[data-emoji=man_cook_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f373.svg)}em[data-emoji=":woman_student:"]:before,em[data-emoji=woman_student]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f393.svg)}em[data-emoji=":woman_student_tone1:"]:before,em[data-emoji=woman_student_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f393.svg)}em[data-emoji=":woman_student_tone2:"]:before,em[data-emoji=woman_student_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f393.svg)}em[data-emoji=":woman_student_tone3:"]:before,em[data-emoji=woman_student_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f393.svg)}em[data-emoji=":woman_student_tone4:"]:before,em[data-emoji=woman_student_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f393.svg)}em[data-emoji=":woman_student_tone5:"]:before,em[data-emoji=woman_student_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f393.svg)}em[data-emoji=":man_student:"]:before,em[data-emoji=man_student]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f393.svg)}em[data-emoji=":man_student_tone1:"]:before,em[data-emoji=man_student_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f393.svg)}em[data-emoji=":man_student_tone2:"]:before,em[data-emoji=man_student_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f393.svg)}em[data-emoji=":man_student_tone3:"]:before,em[data-emoji=man_student_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f393.svg)}em[data-emoji=":man_student_tone4:"]:before,em[data-emoji=man_student_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f393.svg)}em[data-emoji=":man_student_tone5:"]:before,em[data-emoji=man_student_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f393.svg)}em[data-emoji=":woman_singer:"]:before,em[data-emoji=woman_singer]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f3a4.svg)}em[data-emoji=":woman_singer_tone1:"]:before,em[data-emoji=woman_singer_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f3a4.svg)}em[data-emoji=":woman_singer_tone2:"]:before,em[data-emoji=woman_singer_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f3a4.svg)}em[data-emoji=":woman_singer_tone3:"]:before,em[data-emoji=woman_singer_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f3a4.svg)}em[data-emoji=":woman_singer_tone4:"]:before,em[data-emoji=woman_singer_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f3a4.svg)}em[data-emoji=":woman_singer_tone5:"]:before,em[data-emoji=woman_singer_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f3a4.svg)}em[data-emoji=":man_singer:"]:before,em[data-emoji=man_singer]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f3a4.svg)}em[data-emoji=":man_singer_tone1:"]:before,em[data-emoji=man_singer_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f3a4.svg)}em[data-emoji=":man_singer_tone2:"]:before,em[data-emoji=man_singer_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f3a4.svg)}em[data-emoji=":man_singer_tone3:"]:before,em[data-emoji=man_singer_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f3a4.svg)}em[data-emoji=":man_singer_tone4:"]:before,em[data-emoji=man_singer_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f3a4.svg)}em[data-emoji=":man_singer_tone5:"]:before,em[data-emoji=man_singer_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f3a4.svg)}em[data-emoji=":woman_teacher:"]:before,em[data-emoji=woman_teacher]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f3eb.svg)}em[data-emoji=":woman_teacher_tone1:"]:before,em[data-emoji=woman_teacher_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f3eb.svg)}em[data-emoji=":woman_teacher_tone2:"]:before,em[data-emoji=woman_teacher_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f3eb.svg)}em[data-emoji=":woman_teacher_tone3:"]:before,em[data-emoji=woman_teacher_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f3eb.svg)}em[data-emoji=":woman_teacher_tone4:"]:before,em[data-emoji=woman_teacher_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f3eb.svg)}em[data-emoji=":woman_teacher_tone5:"]:before,em[data-emoji=woman_teacher_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f3eb.svg)}em[data-emoji=":man_teacher:"]:before,em[data-emoji=man_teacher]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f3eb.svg)}em[data-emoji=":man_teacher_tone1:"]:before,em[data-emoji=man_teacher_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f3eb.svg)}em[data-emoji=":man_teacher_tone2:"]:before,em[data-emoji=man_teacher_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f3eb.svg)}em[data-emoji=":man_teacher_tone3:"]:before,em[data-emoji=man_teacher_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f3eb.svg)}em[data-emoji=":man_teacher_tone4:"]:before,em[data-emoji=man_teacher_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f3eb.svg)}em[data-emoji=":man_teacher_tone5:"]:before,em[data-emoji=man_teacher_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f3eb.svg)}em[data-emoji=":woman_factory_worker:"]:before,em[data-emoji=woman_factory_worker]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f3ed.svg)}em[data-emoji=":woman_factory_worker_tone1:"]:before,em[data-emoji=woman_factory_worker_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f3ed.svg)}em[data-emoji=":woman_factory_worker_tone2:"]:before,em[data-emoji=woman_factory_worker_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f3ed.svg)}em[data-emoji=":woman_factory_worker_tone3:"]:before,em[data-emoji=woman_factory_worker_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f3ed.svg)}em[data-emoji=":woman_factory_worker_tone4:"]:before,em[data-emoji=woman_factory_worker_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f3ed.svg)}em[data-emoji=":woman_factory_worker_tone5:"]:before,em[data-emoji=woman_factory_worker_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f3ed.svg)}em[data-emoji=":man_factory_worker:"]:before,em[data-emoji=man_factory_worker]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f3ed.svg)}em[data-emoji=":man_factory_worker_tone1:"]:before,em[data-emoji=man_factory_worker_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f3ed.svg)}em[data-emoji=":man_factory_worker_tone2:"]:before,em[data-emoji=man_factory_worker_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f3ed.svg)}em[data-emoji=":man_factory_worker_tone3:"]:before,em[data-emoji=man_factory_worker_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f3ed.svg)}em[data-emoji=":man_factory_worker_tone4:"]:before,em[data-emoji=man_factory_worker_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f3ed.svg)}em[data-emoji=":man_factory_worker_tone5:"]:before,em[data-emoji=man_factory_worker_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f3ed.svg)}em[data-emoji=":woman_technologist:"]:before,em[data-emoji=woman_technologist]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f4bb.svg)}em[data-emoji=":woman_technologist_tone1:"]:before,em[data-emoji=woman_technologist_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f4bb.svg)}em[data-emoji=":woman_technologist_tone2:"]:before,em[data-emoji=woman_technologist_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f4bb.svg)}em[data-emoji=":woman_technologist_tone3:"]:before,em[data-emoji=woman_technologist_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f4bb.svg)}em[data-emoji=":woman_technologist_tone4:"]:before,em[data-emoji=woman_technologist_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f4bb.svg)}em[data-emoji=":woman_technologist_tone5:"]:before,em[data-emoji=woman_technologist_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f4bb.svg)}em[data-emoji=":man_technologist:"]:before,em[data-emoji=man_technologist]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f4bb.svg)}em[data-emoji=":man_technologist_tone1:"]:before,em[data-emoji=man_technologist_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f4bb.svg)}em[data-emoji=":man_technologist_tone2:"]:before,em[data-emoji=man_technologist_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f4bb.svg)}em[data-emoji=":man_technologist_tone3:"]:before,em[data-emoji=man_technologist_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f4bb.svg)}em[data-emoji=":man_technologist_tone4:"]:before,em[data-emoji=man_technologist_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f4bb.svg)}em[data-emoji=":man_technologist_tone5:"]:before,em[data-emoji=man_technologist_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f4bb.svg)}em[data-emoji=":woman_office_worker:"]:before,em[data-emoji=woman_office_worker]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f4bc.svg)}em[data-emoji=":woman_office_worker_tone1:"]:before,em[data-emoji=woman_office_worker_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f4bc.svg)}em[data-emoji=":woman_office_worker_tone2:"]:before,em[data-emoji=woman_office_worker_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f4bc.svg)}em[data-emoji=":woman_office_worker_tone3:"]:before,em[data-emoji=woman_office_worker_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f4bc.svg)}em[data-emoji=":woman_office_worker_tone4:"]:before,em[data-emoji=woman_office_worker_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f4bc.svg)}em[data-emoji=":woman_office_worker_tone5:"]:before,em[data-emoji=woman_office_worker_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f4bc.svg)}em[data-emoji=":man_office_worker:"]:before,em[data-emoji=man_office_worker]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f4bc.svg)}em[data-emoji=":man_office_worker_tone1:"]:before,em[data-emoji=man_office_worker_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f4bc.svg)}em[data-emoji=":man_office_worker_tone2:"]:before,em[data-emoji=man_office_worker_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f4bc.svg)}em[data-emoji=":man_office_worker_tone3:"]:before,em[data-emoji=man_office_worker_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f4bc.svg)}em[data-emoji=":man_office_worker_tone4:"]:before,em[data-emoji=man_office_worker_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f4bc.svg)}em[data-emoji=":man_office_worker_tone5:"]:before,em[data-emoji=man_office_worker_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f4bc.svg)}em[data-emoji=":woman_mechanic:"]:before,em[data-emoji=woman_mechanic]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f527.svg)}em[data-emoji=":woman_mechanic_tone1:"]:before,em[data-emoji=woman_mechanic_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f527.svg)}em[data-emoji=":woman_mechanic_tone2:"]:before,em[data-emoji=woman_mechanic_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f527.svg)}em[data-emoji=":woman_mechanic_tone3:"]:before,em[data-emoji=woman_mechanic_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f527.svg)}em[data-emoji=":woman_mechanic_tone4:"]:before,em[data-emoji=woman_mechanic_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f527.svg)}em[data-emoji=":woman_mechanic_tone5:"]:before,em[data-emoji=woman_mechanic_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f527.svg)}em[data-emoji=":man_mechanic:"]:before,em[data-emoji=man_mechanic]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f527.svg)}em[data-emoji=":man_mechanic_tone1:"]:before,em[data-emoji=man_mechanic_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f527.svg)}em[data-emoji=":man_mechanic_tone2:"]:before,em[data-emoji=man_mechanic_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f527.svg)}em[data-emoji=":man_mechanic_tone3:"]:before,em[data-emoji=man_mechanic_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f527.svg)}em[data-emoji=":man_mechanic_tone4:"]:before,em[data-emoji=man_mechanic_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f527.svg)}em[data-emoji=":man_mechanic_tone5:"]:before,em[data-emoji=man_mechanic_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f527.svg)}em[data-emoji=":woman_scientist:"]:before,em[data-emoji=woman_scientist]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f52c.svg)}em[data-emoji=":woman_scientist_tone1:"]:before,em[data-emoji=woman_scientist_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f52c.svg)}em[data-emoji=":woman_scientist_tone2:"]:before,em[data-emoji=woman_scientist_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f52c.svg)}em[data-emoji=":woman_scientist_tone3:"]:before,em[data-emoji=woman_scientist_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f52c.svg)}em[data-emoji=":woman_scientist_tone4:"]:before,em[data-emoji=woman_scientist_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f52c.svg)}em[data-emoji=":woman_scientist_tone5:"]:before,em[data-emoji=woman_scientist_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f52c.svg)}em[data-emoji=":man_scientist:"]:before,em[data-emoji=man_scientist]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f52c.svg)}em[data-emoji=":man_scientist_tone1:"]:before,em[data-emoji=man_scientist_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f52c.svg)}em[data-emoji=":man_scientist_tone2:"]:before,em[data-emoji=man_scientist_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f52c.svg)}em[data-emoji=":man_scientist_tone3:"]:before,em[data-emoji=man_scientist_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f52c.svg)}em[data-emoji=":man_scientist_tone4:"]:before,em[data-emoji=man_scientist_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f52c.svg)}em[data-emoji=":man_scientist_tone5:"]:before,em[data-emoji=man_scientist_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f52c.svg)}em[data-emoji=":woman_artist:"]:before,em[data-emoji=woman_artist]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f3a8.svg)}em[data-emoji=":woman_artist_tone1:"]:before,em[data-emoji=woman_artist_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f3a8.svg)}em[data-emoji=":woman_artist_tone2:"]:before,em[data-emoji=woman_artist_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f3a8.svg)}em[data-emoji=":woman_artist_tone3:"]:before,em[data-emoji=woman_artist_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f3a8.svg)}em[data-emoji=":woman_artist_tone4:"]:before,em[data-emoji=woman_artist_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f3a8.svg)}em[data-emoji=":woman_artist_tone5:"]:before,em[data-emoji=woman_artist_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f3a8.svg)}em[data-emoji=":man_artist:"]:before,em[data-emoji=man_artist]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f3a8.svg)}em[data-emoji=":man_artist_tone1:"]:before,em[data-emoji=man_artist_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f3a8.svg)}em[data-emoji=":man_artist_tone2:"]:before,em[data-emoji=man_artist_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f3a8.svg)}em[data-emoji=":man_artist_tone3:"]:before,em[data-emoji=man_artist_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f3a8.svg)}em[data-emoji=":man_artist_tone4:"]:before,em[data-emoji=man_artist_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f3a8.svg)}em[data-emoji=":man_artist_tone5:"]:before,em[data-emoji=man_artist_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f3a8.svg)}em[data-emoji=":woman_firefighter:"]:before,em[data-emoji=woman_firefighter]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f692.svg)}em[data-emoji=":woman_firefighter_tone1:"]:before,em[data-emoji=woman_firefighter_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f692.svg)}em[data-emoji=":woman_firefighter_tone2:"]:before,em[data-emoji=woman_firefighter_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f692.svg)}em[data-emoji=":woman_firefighter_tone3:"]:before,em[data-emoji=woman_firefighter_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f692.svg)}em[data-emoji=":woman_firefighter_tone4:"]:before,em[data-emoji=woman_firefighter_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f692.svg)}em[data-emoji=":woman_firefighter_tone5:"]:before,em[data-emoji=woman_firefighter_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f692.svg)}em[data-emoji=":man_firefighter:"]:before,em[data-emoji=man_firefighter]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f692.svg)}em[data-emoji=":man_firefighter_tone1:"]:before,em[data-emoji=man_firefighter_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f692.svg)}em[data-emoji=":man_firefighter_tone2:"]:before,em[data-emoji=man_firefighter_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f692.svg)}em[data-emoji=":man_firefighter_tone3:"]:before,em[data-emoji=man_firefighter_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f692.svg)}em[data-emoji=":man_firefighter_tone4:"]:before,em[data-emoji=man_firefighter_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f692.svg)}em[data-emoji=":man_firefighter_tone5:"]:before,em[data-emoji=man_firefighter_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f692.svg)}em[data-emoji=":woman_pilot:"]:before,em[data-emoji=woman_pilot]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-2708-fe0f.svg)}em[data-emoji=":woman_pilot_tone1:"]:before,em[data-emoji=woman_pilot_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-2708-fe0f.svg)}em[data-emoji=":woman_pilot_tone2:"]:before,em[data-emoji=woman_pilot_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-2708-fe0f.svg)}em[data-emoji=":woman_pilot_tone3:"]:before,em[data-emoji=woman_pilot_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-2708-fe0f.svg)}em[data-emoji=":woman_pilot_tone4:"]:before,em[data-emoji=woman_pilot_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-2708-fe0f.svg)}em[data-emoji=":woman_pilot_tone5:"]:before,em[data-emoji=woman_pilot_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-2708-fe0f.svg)}em[data-emoji=":man_pilot:"]:before,em[data-emoji=man_pilot]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-2708-fe0f.svg)}em[data-emoji=":man_pilot_tone1:"]:before,em[data-emoji=man_pilot_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-2708-fe0f.svg)}em[data-emoji=":man_pilot_tone2:"]:before,em[data-emoji=man_pilot_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-2708-fe0f.svg)}em[data-emoji=":man_pilot_tone3:"]:before,em[data-emoji=man_pilot_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-2708-fe0f.svg)}em[data-emoji=":man_pilot_tone4:"]:before,em[data-emoji=man_pilot_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-2708-fe0f.svg)}em[data-emoji=":man_pilot_tone5:"]:before,em[data-emoji=man_pilot_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-2708-fe0f.svg)}em[data-emoji=":woman_astronaut:"]:before,em[data-emoji=woman_astronaut]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f680.svg)}em[data-emoji=":woman_astronaut_tone1:"]:before,em[data-emoji=woman_astronaut_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f680.svg)}em[data-emoji=":woman_astronaut_tone2:"]:before,em[data-emoji=woman_astronaut_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f680.svg)}em[data-emoji=":woman_astronaut_tone3:"]:before,em[data-emoji=woman_astronaut_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f680.svg)}em[data-emoji=":woman_astronaut_tone4:"]:before,em[data-emoji=woman_astronaut_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f680.svg)}em[data-emoji=":woman_astronaut_tone5:"]:before,em[data-emoji=woman_astronaut_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f680.svg)}em[data-emoji=":man_astronaut:"]:before,em[data-emoji=man_astronaut]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f680.svg)}em[data-emoji=":man_astronaut_tone1:"]:before,em[data-emoji=man_astronaut_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f680.svg)}em[data-emoji=":man_astronaut_tone2:"]:before,em[data-emoji=man_astronaut_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f680.svg)}em[data-emoji=":man_astronaut_tone3:"]:before,em[data-emoji=man_astronaut_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f680.svg)}em[data-emoji=":man_astronaut_tone4:"]:before,em[data-emoji=man_astronaut_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f680.svg)}em[data-emoji=":man_astronaut_tone5:"]:before,em[data-emoji=man_astronaut_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f680.svg)}em[data-emoji=":woman_judge:"]:before,em[data-emoji=woman_judge]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-2696-fe0f.svg)}em[data-emoji=":woman_judge_tone1:"]:before,em[data-emoji=woman_judge_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-2696-fe0f.svg)}em[data-emoji=":woman_judge_tone2:"]:before,em[data-emoji=woman_judge_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-2696-fe0f.svg)}em[data-emoji=":woman_judge_tone3:"]:before,em[data-emoji=woman_judge_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-2696-fe0f.svg)}em[data-emoji=":woman_judge_tone4:"]:before,em[data-emoji=woman_judge_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-2696-fe0f.svg)}em[data-emoji=":woman_judge_tone5:"]:before,em[data-emoji=woman_judge_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-2696-fe0f.svg)}em[data-emoji=":man_judge:"]:before,em[data-emoji=man_judge]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-2696-fe0f.svg)}em[data-emoji=":man_judge_tone1:"]:before,em[data-emoji=man_judge_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-2696-fe0f.svg)}em[data-emoji=":man_judge_tone2:"]:before,em[data-emoji=man_judge_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-2696-fe0f.svg)}em[data-emoji=":man_judge_tone3:"]:before,em[data-emoji=man_judge_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-2696-fe0f.svg)}em[data-emoji=":man_judge_tone4:"]:before,em[data-emoji=man_judge_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-2696-fe0f.svg)}em[data-emoji=":man_judge_tone5:"]:before,em[data-emoji=man_judge_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-2696-fe0f.svg)}em[data-emoji=":bride_with_veil:"]:before,em[data-emoji=bride_with_veil]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f470.svg)}em[data-emoji=":bride_with_veil_tone1:"]:before,em[data-emoji=bride_with_veil_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f470-1f3fb.svg)}em[data-emoji=":bride_with_veil_tone2:"]:before,em[data-emoji=bride_with_veil_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f470-1f3fc.svg)}em[data-emoji=":bride_with_veil_tone3:"]:before,em[data-emoji=bride_with_veil_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f470-1f3fd.svg)}em[data-emoji=":bride_with_veil_tone4:"]:before,em[data-emoji=bride_with_veil_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f470-1f3fe.svg)}em[data-emoji=":bride_with_veil_tone5:"]:before,em[data-emoji=bride_with_veil_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f470-1f3ff.svg)}em[data-emoji=":man_in_tuxedo:"]:before,em[data-emoji=man_in_tuxedo]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f935.svg)}em[data-emoji=":man_in_tuxedo_tone1:"]:before,em[data-emoji=man_in_tuxedo_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f935-1f3fb.svg)}em[data-emoji=":man_in_tuxedo_tone2:"]:before,em[data-emoji=man_in_tuxedo_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f935-1f3fc.svg)}em[data-emoji=":man_in_tuxedo_tone3:"]:before,em[data-emoji=man_in_tuxedo_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f935-1f3fd.svg)}em[data-emoji=":man_in_tuxedo_tone4:"]:before,em[data-emoji=man_in_tuxedo_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f935-1f3fe.svg)}em[data-emoji=":man_in_tuxedo_tone5:"]:before,em[data-emoji=man_in_tuxedo_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f935-1f3ff.svg)}em[data-emoji=":princess:"]:before,em[data-emoji=princess]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f478.svg)}em[data-emoji=":princess_tone1:"]:before,em[data-emoji=princess_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f478-1f3fb.svg)}em[data-emoji=":princess_tone2:"]:before,em[data-emoji=princess_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f478-1f3fc.svg)}em[data-emoji=":princess_tone3:"]:before,em[data-emoji=princess_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f478-1f3fd.svg)}em[data-emoji=":princess_tone4:"]:before,em[data-emoji=princess_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f478-1f3fe.svg)}em[data-emoji=":princess_tone5:"]:before,em[data-emoji=princess_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f478-1f3ff.svg)}em[data-emoji=":prince:"]:before,em[data-emoji=prince]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f934.svg)}em[data-emoji=":prince_tone1:"]:before,em[data-emoji=prince_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f934-1f3fb.svg)}em[data-emoji=":prince_tone2:"]:before,em[data-emoji=prince_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f934-1f3fc.svg)}em[data-emoji=":prince_tone3:"]:before,em[data-emoji=prince_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f934-1f3fd.svg)}em[data-emoji=":prince_tone4:"]:before,em[data-emoji=prince_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f934-1f3fe.svg)}em[data-emoji=":prince_tone5:"]:before,em[data-emoji=prince_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f934-1f3ff.svg)}em[data-emoji=":superhero:"]:before,em[data-emoji=superhero]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b8.svg)}em[data-emoji=":superhero_tone1:"]:before,em[data-emoji=superhero_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b8-1f3fb.svg)}em[data-emoji=":superhero_tone2:"]:before,em[data-emoji=superhero_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b8-1f3fc.svg)}em[data-emoji=":superhero_tone3:"]:before,em[data-emoji=superhero_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b8-1f3fd.svg)}em[data-emoji=":superhero_tone4:"]:before,em[data-emoji=superhero_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b8-1f3fe.svg)}em[data-emoji=":superhero_tone5:"]:before,em[data-emoji=superhero_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b8-1f3ff.svg)}em[data-emoji=":woman_superhero:"]:before,em[data-emoji=woman_superhero]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b8-200d-2640-fe0f.svg)}em[data-emoji=":woman_superhero_tone1:"]:before,em[data-emoji=woman_superhero_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b8-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_superhero_tone2:"]:before,em[data-emoji=woman_superhero_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b8-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_superhero_tone3:"]:before,em[data-emoji=woman_superhero_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b8-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_superhero_tone4:"]:before,em[data-emoji=woman_superhero_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b8-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_superhero_tone5:"]:before,em[data-emoji=woman_superhero_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b8-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_superhero:"]:before,em[data-emoji=man_superhero]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b8-200d-2642-fe0f.svg)}em[data-emoji=":man_superhero_tone1:"]:before,em[data-emoji=man_superhero_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b8-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_superhero_tone2:"]:before,em[data-emoji=man_superhero_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b8-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_superhero_tone3:"]:before,em[data-emoji=man_superhero_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b8-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_superhero_tone4:"]:before,em[data-emoji=man_superhero_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b8-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_superhero_tone5:"]:before,em[data-emoji=man_superhero_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b8-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":supervillain:"]:before,em[data-emoji=supervillain]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b9.svg)}em[data-emoji=":supervillain_tone1:"]:before,em[data-emoji=supervillain_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b9-1f3fb.svg)}em[data-emoji=":supervillain_tone2:"]:before,em[data-emoji=supervillain_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b9-1f3fc.svg)}em[data-emoji=":supervillain_tone3:"]:before,em[data-emoji=supervillain_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b9-1f3fd.svg)}em[data-emoji=":supervillain_tone4:"]:before,em[data-emoji=supervillain_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b9-1f3fe.svg)}em[data-emoji=":supervillain_tone5:"]:before,em[data-emoji=supervillain_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b9-1f3ff.svg)}em[data-emoji=":woman_supervillain:"]:before,em[data-emoji=woman_supervillain]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b9-200d-2640-fe0f.svg)}em[data-emoji=":woman_supervillain_tone1:"]:before,em[data-emoji=woman_supervillain_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b9-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_supervillain_tone2:"]:before,em[data-emoji=woman_supervillain_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b9-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_supervillain_tone3:"]:before,em[data-emoji=woman_supervillain_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b9-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_supervillain_tone4:"]:before,em[data-emoji=woman_supervillain_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b9-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_supervillain_tone5:"]:before,em[data-emoji=woman_supervillain_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b9-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_supervillain:"]:before,em[data-emoji=man_supervillain]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b9-200d-2642-fe0f.svg)}em[data-emoji=":man_supervillain_tone1:"]:before,em[data-emoji=man_supervillain_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b9-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_supervillain_tone2:"]:before,em[data-emoji=man_supervillain_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b9-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_supervillain_tone3:"]:before,em[data-emoji=man_supervillain_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b9-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_supervillain_tone4:"]:before,em[data-emoji=man_supervillain_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b9-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_supervillain_tone5:"]:before,em[data-emoji=man_supervillain_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b9-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":mrs_claus:"]:before,em[data-emoji=mrs_claus]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f936.svg)}em[data-emoji=":mrs_claus_tone1:"]:before,em[data-emoji=mrs_claus_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f936-1f3fb.svg)}em[data-emoji=":mrs_claus_tone2:"]:before,em[data-emoji=mrs_claus_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f936-1f3fc.svg)}em[data-emoji=":mrs_claus_tone3:"]:before,em[data-emoji=mrs_claus_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f936-1f3fd.svg)}em[data-emoji=":mrs_claus_tone4:"]:before,em[data-emoji=mrs_claus_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f936-1f3fe.svg)}em[data-emoji=":mrs_claus_tone5:"]:before,em[data-emoji=mrs_claus_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f936-1f3ff.svg)}em[data-emoji=":santa:"]:before,em[data-emoji=santa]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f385.svg)}em[data-emoji=":santa_tone1:"]:before,em[data-emoji=santa_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f385-1f3fb.svg)}em[data-emoji=":santa_tone2:"]:before,em[data-emoji=santa_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f385-1f3fc.svg)}em[data-emoji=":santa_tone3:"]:before,em[data-emoji=santa_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f385-1f3fd.svg)}em[data-emoji=":santa_tone4:"]:before,em[data-emoji=santa_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f385-1f3fe.svg)}em[data-emoji=":santa_tone5:"]:before,em[data-emoji=santa_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f385-1f3ff.svg)}em[data-emoji=":mage:"]:before,em[data-emoji=mage]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d9.svg)}em[data-emoji=":mage_tone1:"]:before,em[data-emoji=mage_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d9-1f3fb.svg)}em[data-emoji=":mage_tone2:"]:before,em[data-emoji=mage_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d9-1f3fc.svg)}em[data-emoji=":mage_tone3:"]:before,em[data-emoji=mage_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d9-1f3fd.svg)}em[data-emoji=":mage_tone4:"]:before,em[data-emoji=mage_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d9-1f3fe.svg)}em[data-emoji=":mage_tone5:"]:before,em[data-emoji=mage_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d9-1f3ff.svg)}em[data-emoji=":woman_mage:"]:before,em[data-emoji=woman_mage]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d9-200d-2640-fe0f.svg)}em[data-emoji=":woman_mage_tone1:"]:before,em[data-emoji=woman_mage_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d9-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_mage_tone2:"]:before,em[data-emoji=woman_mage_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d9-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_mage_tone3:"]:before,em[data-emoji=woman_mage_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d9-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_mage_tone4:"]:before,em[data-emoji=woman_mage_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d9-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_mage_tone5:"]:before,em[data-emoji=woman_mage_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d9-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_mage:"]:before,em[data-emoji=man_mage]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d9-200d-2642-fe0f.svg)}em[data-emoji=":man_mage_tone1:"]:before,em[data-emoji=man_mage_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d9-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_mage_tone2:"]:before,em[data-emoji=man_mage_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d9-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_mage_tone3:"]:before,em[data-emoji=man_mage_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d9-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_mage_tone4:"]:before,em[data-emoji=man_mage_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d9-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_mage_tone5:"]:before,em[data-emoji=man_mage_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d9-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":elf:"]:before,em[data-emoji=elf]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dd.svg)}em[data-emoji=":elf_tone1:"]:before,em[data-emoji=elf_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dd-1f3fb.svg)}em[data-emoji=":elf_tone2:"]:before,em[data-emoji=elf_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dd-1f3fc.svg)}em[data-emoji=":elf_tone3:"]:before,em[data-emoji=elf_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dd-1f3fd.svg)}em[data-emoji=":elf_tone4:"]:before,em[data-emoji=elf_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dd-1f3fe.svg)}em[data-emoji=":elf_tone5:"]:before,em[data-emoji=elf_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dd-1f3ff.svg)}em[data-emoji=":woman_elf:"]:before,em[data-emoji=woman_elf]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dd-200d-2640-fe0f.svg)}em[data-emoji=":woman_elf_tone1:"]:before,em[data-emoji=woman_elf_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dd-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_elf_tone2:"]:before,em[data-emoji=woman_elf_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dd-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_elf_tone3:"]:before,em[data-emoji=woman_elf_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dd-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_elf_tone4:"]:before,em[data-emoji=woman_elf_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dd-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_elf_tone5:"]:before,em[data-emoji=woman_elf_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dd-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_elf:"]:before,em[data-emoji=man_elf]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dd-200d-2642-fe0f.svg)}em[data-emoji=":man_elf_tone1:"]:before,em[data-emoji=man_elf_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dd-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_elf_tone2:"]:before,em[data-emoji=man_elf_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dd-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_elf_tone3:"]:before,em[data-emoji=man_elf_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dd-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_elf_tone4:"]:before,em[data-emoji=man_elf_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dd-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_elf_tone5:"]:before,em[data-emoji=man_elf_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dd-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":vampire:"]:before,em[data-emoji=vampire]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9db.svg)}em[data-emoji=":vampire_tone1:"]:before,em[data-emoji=vampire_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9db-1f3fb.svg)}em[data-emoji=":vampire_tone2:"]:before,em[data-emoji=vampire_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9db-1f3fc.svg)}em[data-emoji=":vampire_tone3:"]:before,em[data-emoji=vampire_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9db-1f3fd.svg)}em[data-emoji=":vampire_tone4:"]:before,em[data-emoji=vampire_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9db-1f3fe.svg)}em[data-emoji=":vampire_tone5:"]:before,em[data-emoji=vampire_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9db-1f3ff.svg)}em[data-emoji=":woman_vampire:"]:before,em[data-emoji=woman_vampire]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9db-200d-2640-fe0f.svg)}em[data-emoji=":woman_vampire_tone1:"]:before,em[data-emoji=woman_vampire_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9db-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_vampire_tone2:"]:before,em[data-emoji=woman_vampire_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9db-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_vampire_tone3:"]:before,em[data-emoji=woman_vampire_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9db-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_vampire_tone4:"]:before,em[data-emoji=woman_vampire_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9db-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_vampire_tone5:"]:before,em[data-emoji=woman_vampire_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9db-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_vampire:"]:before,em[data-emoji=man_vampire]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9db-200d-2642-fe0f.svg)}em[data-emoji=":man_vampire_tone1:"]:before,em[data-emoji=man_vampire_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9db-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_vampire_tone2:"]:before,em[data-emoji=man_vampire_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9db-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_vampire_tone3:"]:before,em[data-emoji=man_vampire_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9db-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_vampire_tone4:"]:before,em[data-emoji=man_vampire_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9db-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_vampire_tone5:"]:before,em[data-emoji=man_vampire_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9db-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":zombie:"]:before,em[data-emoji=zombie]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9df.svg)}em[data-emoji=":woman_zombie:"]:before,em[data-emoji=woman_zombie]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9df-200d-2640-fe0f.svg)}em[data-emoji=":man_zombie:"]:before,em[data-emoji=man_zombie]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9df-200d-2642-fe0f.svg)}em[data-emoji=":genie:"]:before,em[data-emoji=genie]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9de.svg)}em[data-emoji=":woman_genie:"]:before,em[data-emoji=woman_genie]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9de-200d-2640-fe0f.svg)}em[data-emoji=":man_genie:"]:before,em[data-emoji=man_genie]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9de-200d-2642-fe0f.svg)}em[data-emoji=":merperson:"]:before,em[data-emoji=merperson]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dc.svg)}em[data-emoji=":merperson_tone1:"]:before,em[data-emoji=merperson_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dc-1f3fb.svg)}em[data-emoji=":merperson_tone2:"]:before,em[data-emoji=merperson_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dc-1f3fc.svg)}em[data-emoji=":merperson_tone3:"]:before,em[data-emoji=merperson_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dc-1f3fd.svg)}em[data-emoji=":merperson_tone4:"]:before,em[data-emoji=merperson_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dc-1f3fe.svg)}em[data-emoji=":merperson_tone5:"]:before,em[data-emoji=merperson_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dc-1f3ff.svg)}em[data-emoji=":mermaid:"]:before,em[data-emoji=mermaid]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dc-200d-2640-fe0f.svg)}em[data-emoji=":mermaid_tone1:"]:before,em[data-emoji=mermaid_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dc-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":mermaid_tone2:"]:before,em[data-emoji=mermaid_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dc-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":mermaid_tone3:"]:before,em[data-emoji=mermaid_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dc-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":mermaid_tone4:"]:before,em[data-emoji=mermaid_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dc-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":mermaid_tone5:"]:before,em[data-emoji=mermaid_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dc-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":merman:"]:before,em[data-emoji=merman]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dc-200d-2642-fe0f.svg)}em[data-emoji=":merman_tone1:"]:before,em[data-emoji=merman_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dc-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":merman_tone2:"]:before,em[data-emoji=merman_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dc-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":merman_tone3:"]:before,em[data-emoji=merman_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dc-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":merman_tone4:"]:before,em[data-emoji=merman_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dc-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":merman_tone5:"]:before,em[data-emoji=merman_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9dc-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":fairy:"]:before,em[data-emoji=fairy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9da.svg)}em[data-emoji=":fairy_tone1:"]:before,em[data-emoji=fairy_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9da-1f3fb.svg)}em[data-emoji=":fairy_tone2:"]:before,em[data-emoji=fairy_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9da-1f3fc.svg)}em[data-emoji=":fairy_tone3:"]:before,em[data-emoji=fairy_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9da-1f3fd.svg)}em[data-emoji=":fairy_tone4:"]:before,em[data-emoji=fairy_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9da-1f3fe.svg)}em[data-emoji=":fairy_tone5:"]:before,em[data-emoji=fairy_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9da-1f3ff.svg)}em[data-emoji=":woman_fairy:"]:before,em[data-emoji=woman_fairy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9da-200d-2640-fe0f.svg)}em[data-emoji=":woman_fairy_tone1:"]:before,em[data-emoji=woman_fairy_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9da-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_fairy_tone2:"]:before,em[data-emoji=woman_fairy_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9da-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_fairy_tone3:"]:before,em[data-emoji=woman_fairy_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9da-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_fairy_tone4:"]:before,em[data-emoji=woman_fairy_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9da-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_fairy_tone5:"]:before,em[data-emoji=woman_fairy_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9da-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_fairy:"]:before,em[data-emoji=man_fairy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9da-200d-2642-fe0f.svg)}em[data-emoji=":man_fairy_tone1:"]:before,em[data-emoji=man_fairy_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9da-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_fairy_tone2:"]:before,em[data-emoji=man_fairy_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9da-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_fairy_tone3:"]:before,em[data-emoji=man_fairy_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9da-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_fairy_tone4:"]:before,em[data-emoji=man_fairy_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9da-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_fairy_tone5:"]:before,em[data-emoji=man_fairy_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9da-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":angel:"]:before,em[data-emoji=angel]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f47c.svg)}em[data-emoji=":angel_tone1:"]:before,em[data-emoji=angel_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f47c-1f3fb.svg)}em[data-emoji=":angel_tone2:"]:before,em[data-emoji=angel_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f47c-1f3fc.svg)}em[data-emoji=":angel_tone3:"]:before,em[data-emoji=angel_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f47c-1f3fd.svg)}em[data-emoji=":angel_tone4:"]:before,em[data-emoji=angel_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f47c-1f3fe.svg)}em[data-emoji=":angel_tone5:"]:before,em[data-emoji=angel_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f47c-1f3ff.svg)}em[data-emoji=":pregnant_woman:"]:before,em[data-emoji=pregnant_woman]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f930.svg)}em[data-emoji=":pregnant_woman_tone1:"]:before,em[data-emoji=pregnant_woman_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f930-1f3fb.svg)}em[data-emoji=":pregnant_woman_tone2:"]:before,em[data-emoji=pregnant_woman_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f930-1f3fc.svg)}em[data-emoji=":pregnant_woman_tone3:"]:before,em[data-emoji=pregnant_woman_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f930-1f3fd.svg)}em[data-emoji=":pregnant_woman_tone4:"]:before,em[data-emoji=pregnant_woman_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f930-1f3fe.svg)}em[data-emoji=":pregnant_woman_tone5:"]:before,em[data-emoji=pregnant_woman_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f930-1f3ff.svg)}em[data-emoji=":breast_feeding:"]:before,em[data-emoji=breast_feeding]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f931.svg)}em[data-emoji=":breast_feeding_tone1:"]:before,em[data-emoji=breast_feeding_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f931-1f3fb.svg)}em[data-emoji=":breast_feeding_tone2:"]:before,em[data-emoji=breast_feeding_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f931-1f3fc.svg)}em[data-emoji=":breast_feeding_tone3:"]:before,em[data-emoji=breast_feeding_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f931-1f3fd.svg)}em[data-emoji=":breast_feeding_tone4:"]:before,em[data-emoji=breast_feeding_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f931-1f3fe.svg)}em[data-emoji=":breast_feeding_tone5:"]:before,em[data-emoji=breast_feeding_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f931-1f3ff.svg)}em[data-emoji=":person_bowing:"]:before,em[data-emoji=person_bowing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f647.svg)}em[data-emoji=":person_bowing_tone1:"]:before,em[data-emoji=person_bowing_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f647-1f3fb.svg)}em[data-emoji=":person_bowing_tone2:"]:before,em[data-emoji=person_bowing_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f647-1f3fc.svg)}em[data-emoji=":person_bowing_tone3:"]:before,em[data-emoji=person_bowing_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f647-1f3fd.svg)}em[data-emoji=":person_bowing_tone4:"]:before,em[data-emoji=person_bowing_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f647-1f3fe.svg)}em[data-emoji=":person_bowing_tone5:"]:before,em[data-emoji=person_bowing_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f647-1f3ff.svg)}em[data-emoji=":woman_bowing:"]:before,em[data-emoji=woman_bowing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f647-200d-2640-fe0f.svg)}em[data-emoji=":woman_bowing_tone1:"]:before,em[data-emoji=woman_bowing_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f647-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_bowing_tone2:"]:before,em[data-emoji=woman_bowing_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f647-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_bowing_tone3:"]:before,em[data-emoji=woman_bowing_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f647-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_bowing_tone4:"]:before,em[data-emoji=woman_bowing_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f647-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_bowing_tone5:"]:before,em[data-emoji=woman_bowing_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f647-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_bowing:"]:before,em[data-emoji=man_bowing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f647-200d-2642-fe0f.svg)}em[data-emoji=":man_bowing_tone1:"]:before,em[data-emoji=man_bowing_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f647-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_bowing_tone2:"]:before,em[data-emoji=man_bowing_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f647-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_bowing_tone3:"]:before,em[data-emoji=man_bowing_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f647-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_bowing_tone4:"]:before,em[data-emoji=man_bowing_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f647-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_bowing_tone5:"]:before,em[data-emoji=man_bowing_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f647-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_tipping_hand:"]:before,em[data-emoji=person_tipping_hand]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f481.svg)}em[data-emoji=":person_tipping_hand_tone1:"]:before,em[data-emoji=person_tipping_hand_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f481-1f3fb.svg)}em[data-emoji=":person_tipping_hand_tone2:"]:before,em[data-emoji=person_tipping_hand_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f481-1f3fc.svg)}em[data-emoji=":person_tipping_hand_tone3:"]:before,em[data-emoji=person_tipping_hand_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f481-1f3fd.svg)}em[data-emoji=":person_tipping_hand_tone4:"]:before,em[data-emoji=person_tipping_hand_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f481-1f3fe.svg)}em[data-emoji=":person_tipping_hand_tone5:"]:before,em[data-emoji=person_tipping_hand_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f481-1f3ff.svg)}em[data-emoji=":woman_tipping_hand:"]:before,em[data-emoji=woman_tipping_hand]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f481-200d-2640-fe0f.svg)}em[data-emoji=":woman_tipping_hand_tone1:"]:before,em[data-emoji=woman_tipping_hand_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f481-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_tipping_hand_tone2:"]:before,em[data-emoji=woman_tipping_hand_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f481-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_tipping_hand_tone3:"]:before,em[data-emoji=woman_tipping_hand_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f481-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_tipping_hand_tone4:"]:before,em[data-emoji=woman_tipping_hand_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f481-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_tipping_hand_tone5:"]:before,em[data-emoji=woman_tipping_hand_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f481-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_tipping_hand:"]:before,em[data-emoji=man_tipping_hand]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f481-200d-2642-fe0f.svg)}em[data-emoji=":man_tipping_hand_tone1:"]:before,em[data-emoji=man_tipping_hand_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f481-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_tipping_hand_tone2:"]:before,em[data-emoji=man_tipping_hand_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f481-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_tipping_hand_tone3:"]:before,em[data-emoji=man_tipping_hand_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f481-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_tipping_hand_tone4:"]:before,em[data-emoji=man_tipping_hand_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f481-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_tipping_hand_tone5:"]:before,em[data-emoji=man_tipping_hand_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f481-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_gesturing_no:"]:before,em[data-emoji=person_gesturing_no]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f645.svg)}em[data-emoji=":person_gesturing_no_tone1:"]:before,em[data-emoji=person_gesturing_no_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f645-1f3fb.svg)}em[data-emoji=":person_gesturing_no_tone2:"]:before,em[data-emoji=person_gesturing_no_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f645-1f3fc.svg)}em[data-emoji=":person_gesturing_no_tone3:"]:before,em[data-emoji=person_gesturing_no_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f645-1f3fd.svg)}em[data-emoji=":person_gesturing_no_tone4:"]:before,em[data-emoji=person_gesturing_no_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f645-1f3fe.svg)}em[data-emoji=":person_gesturing_no_tone5:"]:before,em[data-emoji=person_gesturing_no_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f645-1f3ff.svg)}em[data-emoji=":woman_gesturing_no:"]:before,em[data-emoji=woman_gesturing_no]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f645-200d-2640-fe0f.svg)}em[data-emoji=":woman_gesturing_no_tone1:"]:before,em[data-emoji=woman_gesturing_no_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f645-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_gesturing_no_tone2:"]:before,em[data-emoji=woman_gesturing_no_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f645-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_gesturing_no_tone3:"]:before,em[data-emoji=woman_gesturing_no_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f645-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_gesturing_no_tone4:"]:before,em[data-emoji=woman_gesturing_no_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f645-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_gesturing_no_tone5:"]:before,em[data-emoji=woman_gesturing_no_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f645-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_gesturing_no:"]:before,em[data-emoji=man_gesturing_no]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f645-200d-2642-fe0f.svg)}em[data-emoji=":man_gesturing_no_tone1:"]:before,em[data-emoji=man_gesturing_no_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f645-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_gesturing_no_tone2:"]:before,em[data-emoji=man_gesturing_no_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f645-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_gesturing_no_tone3:"]:before,em[data-emoji=man_gesturing_no_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f645-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_gesturing_no_tone4:"]:before,em[data-emoji=man_gesturing_no_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f645-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_gesturing_no_tone5:"]:before,em[data-emoji=man_gesturing_no_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f645-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_gesturing_ok:"]:before,em[data-emoji=person_gesturing_ok]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f646.svg)}em[data-emoji=":person_gesturing_ok_tone1:"]:before,em[data-emoji=person_gesturing_ok_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f646-1f3fb.svg)}em[data-emoji=":person_gesturing_ok_tone2:"]:before,em[data-emoji=person_gesturing_ok_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f646-1f3fc.svg)}em[data-emoji=":person_gesturing_ok_tone3:"]:before,em[data-emoji=person_gesturing_ok_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f646-1f3fd.svg)}em[data-emoji=":person_gesturing_ok_tone4:"]:before,em[data-emoji=person_gesturing_ok_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f646-1f3fe.svg)}em[data-emoji=":person_gesturing_ok_tone5:"]:before,em[data-emoji=person_gesturing_ok_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f646-1f3ff.svg)}em[data-emoji=":woman_gesturing_ok:"]:before,em[data-emoji=woman_gesturing_ok]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f646-200d-2640-fe0f.svg)}em[data-emoji=":woman_gesturing_ok_tone1:"]:before,em[data-emoji=woman_gesturing_ok_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f646-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_gesturing_ok_tone2:"]:before,em[data-emoji=woman_gesturing_ok_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f646-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_gesturing_ok_tone3:"]:before,em[data-emoji=woman_gesturing_ok_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f646-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_gesturing_ok_tone4:"]:before,em[data-emoji=woman_gesturing_ok_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f646-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_gesturing_ok_tone5:"]:before,em[data-emoji=woman_gesturing_ok_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f646-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_gesturing_ok:"]:before,em[data-emoji=man_gesturing_ok]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f646-200d-2642-fe0f.svg)}em[data-emoji=":man_gesturing_ok_tone1:"]:before,em[data-emoji=man_gesturing_ok_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f646-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_gesturing_ok_tone2:"]:before,em[data-emoji=man_gesturing_ok_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f646-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_gesturing_ok_tone3:"]:before,em[data-emoji=man_gesturing_ok_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f646-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_gesturing_ok_tone4:"]:before,em[data-emoji=man_gesturing_ok_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f646-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_gesturing_ok_tone5:"]:before,em[data-emoji=man_gesturing_ok_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f646-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_raising_hand:"]:before,em[data-emoji=person_raising_hand]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64b.svg)}em[data-emoji=":person_raising_hand_tone1:"]:before,em[data-emoji=person_raising_hand_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64b-1f3fb.svg)}em[data-emoji=":person_raising_hand_tone2:"]:before,em[data-emoji=person_raising_hand_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64b-1f3fc.svg)}em[data-emoji=":person_raising_hand_tone3:"]:before,em[data-emoji=person_raising_hand_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64b-1f3fd.svg)}em[data-emoji=":person_raising_hand_tone4:"]:before,em[data-emoji=person_raising_hand_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64b-1f3fe.svg)}em[data-emoji=":person_raising_hand_tone5:"]:before,em[data-emoji=person_raising_hand_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64b-1f3ff.svg)}em[data-emoji=":woman_raising_hand:"]:before,em[data-emoji=woman_raising_hand]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64b-200d-2640-fe0f.svg)}em[data-emoji=":woman_raising_hand_tone1:"]:before,em[data-emoji=woman_raising_hand_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64b-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_raising_hand_tone2:"]:before,em[data-emoji=woman_raising_hand_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64b-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_raising_hand_tone3:"]:before,em[data-emoji=woman_raising_hand_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64b-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_raising_hand_tone4:"]:before,em[data-emoji=woman_raising_hand_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64b-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_raising_hand_tone5:"]:before,em[data-emoji=woman_raising_hand_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64b-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_raising_hand:"]:before,em[data-emoji=man_raising_hand]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64b-200d-2642-fe0f.svg)}em[data-emoji=":man_raising_hand_tone1:"]:before,em[data-emoji=man_raising_hand_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64b-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_raising_hand_tone2:"]:before,em[data-emoji=man_raising_hand_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64b-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_raising_hand_tone3:"]:before,em[data-emoji=man_raising_hand_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64b-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_raising_hand_tone4:"]:before,em[data-emoji=man_raising_hand_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64b-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_raising_hand_tone5:"]:before,em[data-emoji=man_raising_hand_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64b-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":deaf_person:"]:before,em[data-emoji=deaf_person]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cf.svg)}em[data-emoji=":deaf_person_tone1:"]:before,em[data-emoji=deaf_person_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cf-1f3fb.svg)}em[data-emoji=":deaf_person_tone2:"]:before,em[data-emoji=deaf_person_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cf-1f3fc.svg)}em[data-emoji=":deaf_person_tone3:"]:before,em[data-emoji=deaf_person_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cf-1f3fd.svg)}em[data-emoji=":deaf_person_tone4:"]:before,em[data-emoji=deaf_person_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cf-1f3fe.svg)}em[data-emoji=":deaf_person_tone5:"]:before,em[data-emoji=deaf_person_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cf-1f3ff.svg)}em[data-emoji=":deaf_woman:"]:before,em[data-emoji=deaf_woman]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cf-200d-2640-fe0f.svg)}em[data-emoji=":deaf_woman_tone1:"]:before,em[data-emoji=deaf_woman_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cf-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":deaf_woman_tone2:"]:before,em[data-emoji=deaf_woman_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cf-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":deaf_woman_tone3:"]:before,em[data-emoji=deaf_woman_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cf-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":deaf_woman_tone4:"]:before,em[data-emoji=deaf_woman_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cf-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":deaf_woman_tone5:"]:before,em[data-emoji=deaf_woman_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cf-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":deaf_man:"]:before,em[data-emoji=deaf_man]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cf-200d-2642-fe0f.svg)}em[data-emoji=":deaf_man_tone1:"]:before,em[data-emoji=deaf_man_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cf-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":deaf_man_tone2:"]:before,em[data-emoji=deaf_man_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cf-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":deaf_man_tone3:"]:before,em[data-emoji=deaf_man_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cf-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":deaf_man_tone4:"]:before,em[data-emoji=deaf_man_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cf-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":deaf_man_tone5:"]:before,em[data-emoji=deaf_man_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cf-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_facepalming:"]:before,em[data-emoji=person_facepalming]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f926.svg)}em[data-emoji=":person_facepalming_tone1:"]:before,em[data-emoji=person_facepalming_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f926-1f3fb.svg)}em[data-emoji=":person_facepalming_tone2:"]:before,em[data-emoji=person_facepalming_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f926-1f3fc.svg)}em[data-emoji=":person_facepalming_tone3:"]:before,em[data-emoji=person_facepalming_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f926-1f3fd.svg)}em[data-emoji=":person_facepalming_tone4:"]:before,em[data-emoji=person_facepalming_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f926-1f3fe.svg)}em[data-emoji=":person_facepalming_tone5:"]:before,em[data-emoji=person_facepalming_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f926-1f3ff.svg)}em[data-emoji=":woman_facepalming:"]:before,em[data-emoji=woman_facepalming]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f926-200d-2640-fe0f.svg)}em[data-emoji=":woman_facepalming_tone1:"]:before,em[data-emoji=woman_facepalming_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f926-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_facepalming_tone2:"]:before,em[data-emoji=woman_facepalming_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f926-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_facepalming_tone3:"]:before,em[data-emoji=woman_facepalming_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f926-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_facepalming_tone4:"]:before,em[data-emoji=woman_facepalming_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f926-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_facepalming_tone5:"]:before,em[data-emoji=woman_facepalming_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f926-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_facepalming:"]:before,em[data-emoji=man_facepalming]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f926-200d-2642-fe0f.svg)}em[data-emoji=":man_facepalming_tone1:"]:before,em[data-emoji=man_facepalming_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f926-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_facepalming_tone2:"]:before,em[data-emoji=man_facepalming_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f926-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_facepalming_tone3:"]:before,em[data-emoji=man_facepalming_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f926-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_facepalming_tone4:"]:before,em[data-emoji=man_facepalming_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f926-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_facepalming_tone5:"]:before,em[data-emoji=man_facepalming_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f926-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_shrugging:"]:before,em[data-emoji=person_shrugging]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f937.svg)}em[data-emoji=":person_shrugging_tone1:"]:before,em[data-emoji=person_shrugging_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f937-1f3fb.svg)}em[data-emoji=":person_shrugging_tone2:"]:before,em[data-emoji=person_shrugging_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f937-1f3fc.svg)}em[data-emoji=":person_shrugging_tone3:"]:before,em[data-emoji=person_shrugging_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f937-1f3fd.svg)}em[data-emoji=":person_shrugging_tone4:"]:before,em[data-emoji=person_shrugging_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f937-1f3fe.svg)}em[data-emoji=":person_shrugging_tone5:"]:before,em[data-emoji=person_shrugging_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f937-1f3ff.svg)}em[data-emoji=":woman_shrugging:"]:before,em[data-emoji=woman_shrugging]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f937-200d-2640-fe0f.svg)}em[data-emoji=":woman_shrugging_tone1:"]:before,em[data-emoji=woman_shrugging_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f937-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_shrugging_tone2:"]:before,em[data-emoji=woman_shrugging_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f937-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_shrugging_tone3:"]:before,em[data-emoji=woman_shrugging_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f937-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_shrugging_tone4:"]:before,em[data-emoji=woman_shrugging_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f937-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_shrugging_tone5:"]:before,em[data-emoji=woman_shrugging_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f937-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_shrugging:"]:before,em[data-emoji=man_shrugging]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f937-200d-2642-fe0f.svg)}em[data-emoji=":man_shrugging_tone1:"]:before,em[data-emoji=man_shrugging_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f937-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_shrugging_tone2:"]:before,em[data-emoji=man_shrugging_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f937-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_shrugging_tone3:"]:before,em[data-emoji=man_shrugging_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f937-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_shrugging_tone4:"]:before,em[data-emoji=man_shrugging_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f937-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_shrugging_tone5:"]:before,em[data-emoji=man_shrugging_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f937-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_pouting:"]:before,em[data-emoji=person_pouting]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64e.svg)}em[data-emoji=":person_pouting_tone1:"]:before,em[data-emoji=person_pouting_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64e-1f3fb.svg)}em[data-emoji=":person_pouting_tone2:"]:before,em[data-emoji=person_pouting_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64e-1f3fc.svg)}em[data-emoji=":person_pouting_tone3:"]:before,em[data-emoji=person_pouting_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64e-1f3fd.svg)}em[data-emoji=":person_pouting_tone4:"]:before,em[data-emoji=person_pouting_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64e-1f3fe.svg)}em[data-emoji=":person_pouting_tone5:"]:before,em[data-emoji=person_pouting_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64e-1f3ff.svg)}em[data-emoji=":woman_pouting:"]:before,em[data-emoji=woman_pouting]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64e-200d-2640-fe0f.svg)}em[data-emoji=":woman_pouting_tone1:"]:before,em[data-emoji=woman_pouting_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64e-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_pouting_tone2:"]:before,em[data-emoji=woman_pouting_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64e-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_pouting_tone3:"]:before,em[data-emoji=woman_pouting_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64e-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_pouting_tone4:"]:before,em[data-emoji=woman_pouting_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64e-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_pouting_tone5:"]:before,em[data-emoji=woman_pouting_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64e-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_pouting:"]:before,em[data-emoji=man_pouting]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64e-200d-2642-fe0f.svg)}em[data-emoji=":man_pouting_tone1:"]:before,em[data-emoji=man_pouting_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64e-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_pouting_tone2:"]:before,em[data-emoji=man_pouting_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64e-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_pouting_tone3:"]:before,em[data-emoji=man_pouting_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64e-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_pouting_tone4:"]:before,em[data-emoji=man_pouting_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64e-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_pouting_tone5:"]:before,em[data-emoji=man_pouting_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64e-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_frowning:"]:before,em[data-emoji=person_frowning]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64d.svg)}em[data-emoji=":person_frowning_tone1:"]:before,em[data-emoji=person_frowning_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64d-1f3fb.svg)}em[data-emoji=":person_frowning_tone2:"]:before,em[data-emoji=person_frowning_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64d-1f3fc.svg)}em[data-emoji=":person_frowning_tone3:"]:before,em[data-emoji=person_frowning_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64d-1f3fd.svg)}em[data-emoji=":person_frowning_tone4:"]:before,em[data-emoji=person_frowning_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64d-1f3fe.svg)}em[data-emoji=":person_frowning_tone5:"]:before,em[data-emoji=person_frowning_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64d-1f3ff.svg)}em[data-emoji=":woman_frowning:"]:before,em[data-emoji=woman_frowning]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64d-200d-2640-fe0f.svg)}em[data-emoji=":woman_frowning_tone1:"]:before,em[data-emoji=woman_frowning_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64d-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_frowning_tone2:"]:before,em[data-emoji=woman_frowning_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64d-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_frowning_tone3:"]:before,em[data-emoji=woman_frowning_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64d-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_frowning_tone4:"]:before,em[data-emoji=woman_frowning_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64d-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_frowning_tone5:"]:before,em[data-emoji=woman_frowning_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64d-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_frowning:"]:before,em[data-emoji=man_frowning]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64d-200d-2642-fe0f.svg)}em[data-emoji=":man_frowning_tone1:"]:before,em[data-emoji=man_frowning_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64d-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_frowning_tone2:"]:before,em[data-emoji=man_frowning_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64d-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_frowning_tone3:"]:before,em[data-emoji=man_frowning_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64d-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_frowning_tone4:"]:before,em[data-emoji=man_frowning_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64d-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_frowning_tone5:"]:before,em[data-emoji=man_frowning_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f64d-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_getting_haircut:"]:before,em[data-emoji=person_getting_haircut]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f487.svg)}em[data-emoji=":person_getting_haircut_tone1:"]:before,em[data-emoji=person_getting_haircut_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f487-1f3fb.svg)}em[data-emoji=":person_getting_haircut_tone2:"]:before,em[data-emoji=person_getting_haircut_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f487-1f3fc.svg)}em[data-emoji=":person_getting_haircut_tone3:"]:before,em[data-emoji=person_getting_haircut_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f487-1f3fd.svg)}em[data-emoji=":person_getting_haircut_tone4:"]:before,em[data-emoji=person_getting_haircut_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f487-1f3fe.svg)}em[data-emoji=":person_getting_haircut_tone5:"]:before,em[data-emoji=person_getting_haircut_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f487-1f3ff.svg)}em[data-emoji=":woman_getting_haircut:"]:before,em[data-emoji=woman_getting_haircut]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f487-200d-2640-fe0f.svg)}em[data-emoji=":woman_getting_haircut_tone1:"]:before,em[data-emoji=woman_getting_haircut_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f487-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_getting_haircut_tone2:"]:before,em[data-emoji=woman_getting_haircut_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f487-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_getting_haircut_tone3:"]:before,em[data-emoji=woman_getting_haircut_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f487-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_getting_haircut_tone4:"]:before,em[data-emoji=woman_getting_haircut_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f487-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_getting_haircut_tone5:"]:before,em[data-emoji=woman_getting_haircut_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f487-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_getting_haircut:"]:before,em[data-emoji=man_getting_haircut]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f487-200d-2642-fe0f.svg)}em[data-emoji=":man_getting_haircut_tone1:"]:before,em[data-emoji=man_getting_haircut_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f487-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_getting_haircut_tone2:"]:before,em[data-emoji=man_getting_haircut_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f487-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_getting_haircut_tone3:"]:before,em[data-emoji=man_getting_haircut_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f487-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_getting_haircut_tone4:"]:before,em[data-emoji=man_getting_haircut_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f487-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_getting_haircut_tone5:"]:before,em[data-emoji=man_getting_haircut_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f487-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_getting_massage:"]:before,em[data-emoji=person_getting_massage]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f486.svg)}em[data-emoji=":person_getting_massage_tone1:"]:before,em[data-emoji=person_getting_massage_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f486-1f3fb.svg)}em[data-emoji=":person_getting_massage_tone2:"]:before,em[data-emoji=person_getting_massage_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f486-1f3fc.svg)}em[data-emoji=":person_getting_massage_tone3:"]:before,em[data-emoji=person_getting_massage_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f486-1f3fd.svg)}em[data-emoji=":person_getting_massage_tone4:"]:before,em[data-emoji=person_getting_massage_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f486-1f3fe.svg)}em[data-emoji=":person_getting_massage_tone5:"]:before,em[data-emoji=person_getting_massage_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f486-1f3ff.svg)}em[data-emoji=":woman_getting_face_massage:"]:before,em[data-emoji=woman_getting_face_massage]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f486-200d-2640-fe0f.svg)}em[data-emoji=":woman_getting_face_massage_tone1:"]:before,em[data-emoji=woman_getting_face_massage_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f486-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_getting_face_massage_tone2:"]:before,em[data-emoji=woman_getting_face_massage_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f486-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_getting_face_massage_tone3:"]:before,em[data-emoji=woman_getting_face_massage_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f486-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_getting_face_massage_tone4:"]:before,em[data-emoji=woman_getting_face_massage_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f486-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_getting_face_massage_tone5:"]:before,em[data-emoji=woman_getting_face_massage_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f486-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_getting_face_massage:"]:before,em[data-emoji=man_getting_face_massage]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f486-200d-2642-fe0f.svg)}em[data-emoji=":man_getting_face_massage_tone1:"]:before,em[data-emoji=man_getting_face_massage_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f486-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_getting_face_massage_tone2:"]:before,em[data-emoji=man_getting_face_massage_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f486-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_getting_face_massage_tone3:"]:before,em[data-emoji=man_getting_face_massage_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f486-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_getting_face_massage_tone4:"]:before,em[data-emoji=man_getting_face_massage_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f486-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_getting_face_massage_tone5:"]:before,em[data-emoji=man_getting_face_massage_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f486-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_in_steamy_room:"]:before,em[data-emoji=person_in_steamy_room]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d6.svg)}em[data-emoji=":person_in_steamy_room_tone1:"]:before,em[data-emoji=person_in_steamy_room_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d6-1f3fb.svg)}em[data-emoji=":person_in_steamy_room_tone2:"]:before,em[data-emoji=person_in_steamy_room_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d6-1f3fc.svg)}em[data-emoji=":person_in_steamy_room_tone3:"]:before,em[data-emoji=person_in_steamy_room_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d6-1f3fd.svg)}em[data-emoji=":person_in_steamy_room_tone4:"]:before,em[data-emoji=person_in_steamy_room_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d6-1f3fe.svg)}em[data-emoji=":person_in_steamy_room_tone5:"]:before,em[data-emoji=person_in_steamy_room_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d6-1f3ff.svg)}em[data-emoji=":woman_in_steamy_room:"]:before,em[data-emoji=woman_in_steamy_room]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d6-200d-2640-fe0f.svg)}em[data-emoji=":woman_in_steamy_room_tone1:"]:before,em[data-emoji=woman_in_steamy_room_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d6-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_in_steamy_room_tone2:"]:before,em[data-emoji=woman_in_steamy_room_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d6-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_in_steamy_room_tone3:"]:before,em[data-emoji=woman_in_steamy_room_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d6-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_in_steamy_room_tone4:"]:before,em[data-emoji=woman_in_steamy_room_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d6-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_in_steamy_room_tone5:"]:before,em[data-emoji=woman_in_steamy_room_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d6-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_in_steamy_room:"]:before,em[data-emoji=man_in_steamy_room]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d6-200d-2642-fe0f.svg)}em[data-emoji=":man_in_steamy_room_tone1:"]:before,em[data-emoji=man_in_steamy_room_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d6-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_in_steamy_room_tone2:"]:before,em[data-emoji=man_in_steamy_room_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d6-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_in_steamy_room_tone3:"]:before,em[data-emoji=man_in_steamy_room_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d6-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_in_steamy_room_tone4:"]:before,em[data-emoji=man_in_steamy_room_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d6-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_in_steamy_room_tone5:"]:before,em[data-emoji=man_in_steamy_room_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d6-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":nail_care:"]:before,em[data-emoji=nail_care]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f485.svg)}em[data-emoji=":nail_care_tone1:"]:before,em[data-emoji=nail_care_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f485-1f3fb.svg)}em[data-emoji=":nail_care_tone2:"]:before,em[data-emoji=nail_care_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f485-1f3fc.svg)}em[data-emoji=":nail_care_tone3:"]:before,em[data-emoji=nail_care_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f485-1f3fd.svg)}em[data-emoji=":nail_care_tone4:"]:before,em[data-emoji=nail_care_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f485-1f3fe.svg)}em[data-emoji=":nail_care_tone5:"]:before,em[data-emoji=nail_care_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f485-1f3ff.svg)}em[data-emoji=":selfie:"]:before,em[data-emoji=selfie]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f933.svg)}em[data-emoji=":selfie_tone1:"]:before,em[data-emoji=selfie_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f933-1f3fb.svg)}em[data-emoji=":selfie_tone2:"]:before,em[data-emoji=selfie_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f933-1f3fc.svg)}em[data-emoji=":selfie_tone3:"]:before,em[data-emoji=selfie_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f933-1f3fd.svg)}em[data-emoji=":selfie_tone4:"]:before,em[data-emoji=selfie_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f933-1f3fe.svg)}em[data-emoji=":selfie_tone5:"]:before,em[data-emoji=selfie_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f933-1f3ff.svg)}em[data-emoji=":dancer:"]:before,em[data-emoji=dancer]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f483.svg)}em[data-emoji=":dancer_tone1:"]:before,em[data-emoji=dancer_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f483-1f3fb.svg)}em[data-emoji=":dancer_tone2:"]:before,em[data-emoji=dancer_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f483-1f3fc.svg)}em[data-emoji=":dancer_tone3:"]:before,em[data-emoji=dancer_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f483-1f3fd.svg)}em[data-emoji=":dancer_tone4:"]:before,em[data-emoji=dancer_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f483-1f3fe.svg)}em[data-emoji=":dancer_tone5:"]:before,em[data-emoji=dancer_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f483-1f3ff.svg)}em[data-emoji=":man_dancing:"]:before,em[data-emoji=man_dancing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f57a.svg)}em[data-emoji=":man_dancing_tone1:"]:before,em[data-emoji=man_dancing_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f57a-1f3fb.svg)}em[data-emoji=":man_dancing_tone2:"]:before,em[data-emoji=man_dancing_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f57a-1f3fc.svg)}em[data-emoji=":man_dancing_tone3:"]:before,em[data-emoji=man_dancing_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f57a-1f3fd.svg)}em[data-emoji=":man_dancing_tone5:"]:before,em[data-emoji=man_dancing_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f57a-1f3ff.svg)}em[data-emoji=":man_dancing_tone4:"]:before,em[data-emoji=man_dancing_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f57a-1f3fe.svg)}em[data-emoji=":people_with_bunny_ears_partying:"]:before,em[data-emoji=people_with_bunny_ears_partying]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46f.svg)}em[data-emoji=":women_with_bunny_ears_partying:"]:before,em[data-emoji=women_with_bunny_ears_partying]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46f-200d-2640-fe0f.svg)}em[data-emoji=":men_with_bunny_ears_partying:"]:before,em[data-emoji=men_with_bunny_ears_partying]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46f-200d-2642-fe0f.svg)}em[data-emoji=":levitate:"]:before,em[data-emoji=levitate]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f574.svg)}em[data-emoji=":levitate_tone1:"]:before,em[data-emoji=levitate_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f574-1f3fb.svg)}em[data-emoji=":levitate_tone2:"]:before,em[data-emoji=levitate_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f574-1f3fc.svg)}em[data-emoji=":levitate_tone3:"]:before,em[data-emoji=levitate_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f574-1f3fd.svg)}em[data-emoji=":levitate_tone4:"]:before,em[data-emoji=levitate_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f574-1f3fe.svg)}em[data-emoji=":levitate_tone5:"]:before,em[data-emoji=levitate_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f574-1f3ff.svg)}em[data-emoji=":person_walking:"]:before,em[data-emoji=person_walking]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b6.svg)}em[data-emoji=":person_walking_tone1:"]:before,em[data-emoji=person_walking_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b6-1f3fb.svg)}em[data-emoji=":person_walking_tone2:"]:before,em[data-emoji=person_walking_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b6-1f3fc.svg)}em[data-emoji=":person_walking_tone3:"]:before,em[data-emoji=person_walking_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b6-1f3fd.svg)}em[data-emoji=":person_walking_tone4:"]:before,em[data-emoji=person_walking_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b6-1f3fe.svg)}em[data-emoji=":person_walking_tone5:"]:before,em[data-emoji=person_walking_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b6-1f3ff.svg)}em[data-emoji=":woman_walking:"]:before,em[data-emoji=woman_walking]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b6-200d-2640-fe0f.svg)}em[data-emoji=":woman_walking_tone1:"]:before,em[data-emoji=woman_walking_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b6-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_walking_tone2:"]:before,em[data-emoji=woman_walking_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b6-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_walking_tone3:"]:before,em[data-emoji=woman_walking_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b6-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_walking_tone4:"]:before,em[data-emoji=woman_walking_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b6-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_walking_tone5:"]:before,em[data-emoji=woman_walking_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b6-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_walking:"]:before,em[data-emoji=man_walking]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b6-200d-2642-fe0f.svg)}em[data-emoji=":man_walking_tone1:"]:before,em[data-emoji=man_walking_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b6-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_walking_tone2:"]:before,em[data-emoji=man_walking_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b6-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_walking_tone3:"]:before,em[data-emoji=man_walking_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b6-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_walking_tone4:"]:before,em[data-emoji=man_walking_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b6-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_walking_tone5:"]:before,em[data-emoji=man_walking_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b6-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_running:"]:before,em[data-emoji=person_running]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c3.svg)}em[data-emoji=":person_running_tone1:"]:before,em[data-emoji=person_running_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c3-1f3fb.svg)}em[data-emoji=":person_running_tone2:"]:before,em[data-emoji=person_running_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c3-1f3fc.svg)}em[data-emoji=":person_running_tone3:"]:before,em[data-emoji=person_running_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c3-1f3fd.svg)}em[data-emoji=":person_running_tone4:"]:before,em[data-emoji=person_running_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c3-1f3fe.svg)}em[data-emoji=":person_running_tone5:"]:before,em[data-emoji=person_running_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c3-1f3ff.svg)}em[data-emoji=":woman_running:"]:before,em[data-emoji=woman_running]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c3-200d-2640-fe0f.svg)}em[data-emoji=":woman_running_tone1:"]:before,em[data-emoji=woman_running_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c3-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_running_tone2:"]:before,em[data-emoji=woman_running_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c3-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_running_tone3:"]:before,em[data-emoji=woman_running_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c3-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_running_tone4:"]:before,em[data-emoji=woman_running_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c3-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_running_tone5:"]:before,em[data-emoji=woman_running_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c3-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_running:"]:before,em[data-emoji=man_running]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c3-200d-2642-fe0f.svg)}em[data-emoji=":man_running_tone1:"]:before,em[data-emoji=man_running_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c3-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_running_tone2:"]:before,em[data-emoji=man_running_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c3-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_running_tone3:"]:before,em[data-emoji=man_running_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c3-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_running_tone4:"]:before,em[data-emoji=man_running_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c3-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_running_tone5:"]:before,em[data-emoji=man_running_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c3-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_standing:"]:before,em[data-emoji=person_standing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cd.svg)}em[data-emoji=":person_standing_tone1:"]:before,em[data-emoji=person_standing_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cd-1f3fb.svg)}em[data-emoji=":person_standing_tone2:"]:before,em[data-emoji=person_standing_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cd-1f3fc.svg)}em[data-emoji=":person_standing_tone3:"]:before,em[data-emoji=person_standing_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cd-1f3fd.svg)}em[data-emoji=":person_standing_tone4:"]:before,em[data-emoji=person_standing_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cd-1f3fe.svg)}em[data-emoji=":person_standing_tone5:"]:before,em[data-emoji=person_standing_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cd-1f3ff.svg)}em[data-emoji=":woman_standing:"]:before,em[data-emoji=woman_standing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cd-200d-2640-fe0f.svg)}em[data-emoji=":woman_standing_tone1:"]:before,em[data-emoji=woman_standing_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cd-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_standing_tone2:"]:before,em[data-emoji=woman_standing_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cd-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_standing_tone3:"]:before,em[data-emoji=woman_standing_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cd-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_standing_tone4:"]:before,em[data-emoji=woman_standing_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cd-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_standing_tone5:"]:before,em[data-emoji=woman_standing_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cd-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_standing:"]:before,em[data-emoji=man_standing]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cd-200d-2642-fe0f.svg)}em[data-emoji=":man_standing_tone1:"]:before,em[data-emoji=man_standing_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cd-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_standing_tone2:"]:before,em[data-emoji=man_standing_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cd-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_standing_tone3:"]:before,em[data-emoji=man_standing_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cd-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_standing_tone4:"]:before,em[data-emoji=man_standing_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cd-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_standing_tone5:"]:before,em[data-emoji=man_standing_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9cd-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":person_kneeling:"]:before,em[data-emoji=person_kneeling]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ce.svg)}em[data-emoji=":person_kneeling_tone1:"]:before,em[data-emoji=person_kneeling_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ce-1f3fb.svg)}em[data-emoji=":person_kneeling_tone2:"]:before,em[data-emoji=person_kneeling_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ce-1f3fc.svg)}em[data-emoji=":person_kneeling_tone3:"]:before,em[data-emoji=person_kneeling_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ce-1f3fd.svg)}em[data-emoji=":person_kneeling_tone4:"]:before,em[data-emoji=person_kneeling_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ce-1f3fe.svg)}em[data-emoji=":person_kneeling_tone5:"]:before,em[data-emoji=person_kneeling_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ce-1f3ff.svg)}em[data-emoji=":woman_kneeling:"]:before,em[data-emoji=woman_kneeling]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ce-200d-2640-fe0f.svg)}em[data-emoji=":woman_kneeling_tone1:"]:before,em[data-emoji=woman_kneeling_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ce-1f3fb-200d-2640-fe0f.svg)}em[data-emoji=":woman_kneeling_tone2:"]:before,em[data-emoji=woman_kneeling_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ce-1f3fc-200d-2640-fe0f.svg)}em[data-emoji=":woman_kneeling_tone3:"]:before,em[data-emoji=woman_kneeling_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ce-1f3fd-200d-2640-fe0f.svg)}em[data-emoji=":woman_kneeling_tone4:"]:before,em[data-emoji=woman_kneeling_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ce-1f3fe-200d-2640-fe0f.svg)}em[data-emoji=":woman_kneeling_tone5:"]:before,em[data-emoji=woman_kneeling_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ce-1f3ff-200d-2640-fe0f.svg)}em[data-emoji=":man_kneeling:"]:before,em[data-emoji=man_kneeling]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ce-200d-2642-fe0f.svg)}em[data-emoji=":man_kneeling_tone1:"]:before,em[data-emoji=man_kneeling_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ce-1f3fb-200d-2642-fe0f.svg)}em[data-emoji=":man_kneeling_tone2:"]:before,em[data-emoji=man_kneeling_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ce-1f3fc-200d-2642-fe0f.svg)}em[data-emoji=":man_kneeling_tone3:"]:before,em[data-emoji=man_kneeling_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ce-1f3fd-200d-2642-fe0f.svg)}em[data-emoji=":man_kneeling_tone4:"]:before,em[data-emoji=man_kneeling_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ce-1f3fe-200d-2642-fe0f.svg)}em[data-emoji=":man_kneeling_tone5:"]:before,em[data-emoji=man_kneeling_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ce-1f3ff-200d-2642-fe0f.svg)}em[data-emoji=":woman_with_probing_cane:"]:before,em[data-emoji=woman_with_probing_cane]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f9af.svg)}em[data-emoji=":woman_with_probing_cane_tone1:"]:before,em[data-emoji=woman_with_probing_cane_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f9af.svg)}em[data-emoji=":woman_with_probing_cane_tone2:"]:before,em[data-emoji=woman_with_probing_cane_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f9af.svg)}em[data-emoji=":woman_with_probing_cane_tone3:"]:before,em[data-emoji=woman_with_probing_cane_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f9af.svg)}em[data-emoji=":woman_with_probing_cane_tone4:"]:before,em[data-emoji=woman_with_probing_cane_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f9af.svg)}em[data-emoji=":woman_with_probing_cane_tone5:"]:before,em[data-emoji=woman_with_probing_cane_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f9af.svg)}em[data-emoji=":man_with_probing_cane:"]:before,em[data-emoji=man_with_probing_cane]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f9af.svg)}em[data-emoji=":man_with_probing_cane_tone1:"]:before,em[data-emoji=man_with_probing_cane_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f9af.svg)}em[data-emoji=":man_with_probing_cane_tone2:"]:before,em[data-emoji=man_with_probing_cane_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f9af.svg)}em[data-emoji=":man_with_probing_cane_tone3:"]:before,em[data-emoji=man_with_probing_cane_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f9af.svg)}em[data-emoji=":man_with_probing_cane_tone4:"]:before,em[data-emoji=man_with_probing_cane_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f9af.svg)}em[data-emoji=":man_with_probing_cane_tone5:"]:before,em[data-emoji=man_with_probing_cane_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f9af.svg)}em[data-emoji=":woman_in_motorized_wheelchair:"]:before,em[data-emoji=woman_in_motorized_wheelchair]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f9bc.svg)}em[data-emoji=":woman_in_motorized_wheelchair_tone1:"]:before,em[data-emoji=woman_in_motorized_wheelchair_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f9bc.svg)}em[data-emoji=":woman_in_motorized_wheelchair_tone2:"]:before,em[data-emoji=woman_in_motorized_wheelchair_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f9bc.svg)}em[data-emoji=":woman_in_motorized_wheelchair_tone3:"]:before,em[data-emoji=woman_in_motorized_wheelchair_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f9bc.svg)}em[data-emoji=":woman_in_motorized_wheelchair_tone4:"]:before,em[data-emoji=woman_in_motorized_wheelchair_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f9bc.svg)}em[data-emoji=":woman_in_motorized_wheelchair_tone5:"]:before,em[data-emoji=woman_in_motorized_wheelchair_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f9bc.svg)}em[data-emoji=":man_in_motorized_wheelchair:"]:before,em[data-emoji=man_in_motorized_wheelchair]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f9bc.svg)}em[data-emoji=":man_in_motorized_wheelchair_tone1:"]:before,em[data-emoji=man_in_motorized_wheelchair_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f9bc.svg)}em[data-emoji=":man_in_motorized_wheelchair_tone2:"]:before,em[data-emoji=man_in_motorized_wheelchair_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f9bc.svg)}em[data-emoji=":man_in_motorized_wheelchair_tone3:"]:before,em[data-emoji=man_in_motorized_wheelchair_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f9bc.svg)}em[data-emoji=":man_in_motorized_wheelchair_tone4:"]:before,em[data-emoji=man_in_motorized_wheelchair_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f9bc.svg)}em[data-emoji=":man_in_motorized_wheelchair_tone5:"]:before,em[data-emoji=man_in_motorized_wheelchair_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f9bc.svg)}em[data-emoji=":woman_in_manual_wheelchair:"]:before,em[data-emoji=woman_in_manual_wheelchair]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f9bd.svg)}em[data-emoji=":woman_in_manual_wheelchair_tone1:"]:before,em[data-emoji=woman_in_manual_wheelchair_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f9bd.svg)}em[data-emoji=":woman_in_manual_wheelchair_tone2:"]:before,em[data-emoji=woman_in_manual_wheelchair_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f9bd.svg)}em[data-emoji=":woman_in_manual_wheelchair_tone3:"]:before,em[data-emoji=woman_in_manual_wheelchair_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f9bd.svg)}em[data-emoji=":woman_in_manual_wheelchair_tone4:"]:before,em[data-emoji=woman_in_manual_wheelchair_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f9bd.svg)}em[data-emoji=":woman_in_manual_wheelchair_tone5:"]:before,em[data-emoji=woman_in_manual_wheelchair_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f9bd.svg)}em[data-emoji=":man_in_manual_wheelchair:"]:before,em[data-emoji=man_in_manual_wheelchair]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f9bd.svg)}em[data-emoji=":man_in_manual_wheelchair_tone1:"]:before,em[data-emoji=man_in_manual_wheelchair_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fb-200d-1f9bd.svg)}em[data-emoji=":man_in_manual_wheelchair_tone2:"]:before,em[data-emoji=man_in_manual_wheelchair_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f9bd.svg)}em[data-emoji=":man_in_manual_wheelchair_tone3:"]:before,em[data-emoji=man_in_manual_wheelchair_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f9bd.svg)}em[data-emoji=":man_in_manual_wheelchair_tone4:"]:before,em[data-emoji=man_in_manual_wheelchair_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f9bd.svg)}em[data-emoji=":man_in_manual_wheelchair_tone5:"]:before,em[data-emoji=man_in_manual_wheelchair_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f9bd.svg)}em[data-emoji=":people_holding_hands:"]:before,em[data-emoji=people_holding_hands]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-200d-1f91d-200d-1f9d1.svg)}em[data-emoji=":people_holding_hands_tone1:"]:before,em[data-emoji=people_holding_hands_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb.svg)}em[data-emoji=":people_holding_hands_tone2:"]:before,em[data-emoji=people_holding_hands_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc.svg)}em[data-emoji=":people_holding_hands_tone2_tone1:"]:before,em[data-emoji=people_holding_hands_tone2_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb.svg)}em[data-emoji=":people_holding_hands_tone3:"]:before,em[data-emoji=people_holding_hands_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd.svg)}em[data-emoji=":people_holding_hands_tone3_tone1:"]:before,em[data-emoji=people_holding_hands_tone3_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb.svg)}em[data-emoji=":people_holding_hands_tone3_tone2:"]:before,em[data-emoji=people_holding_hands_tone3_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc.svg)}em[data-emoji=":people_holding_hands_tone4:"]:before,em[data-emoji=people_holding_hands_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe.svg)}em[data-emoji=":people_holding_hands_tone4_tone1:"]:before,em[data-emoji=people_holding_hands_tone4_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb.svg)}em[data-emoji=":people_holding_hands_tone4_tone2:"]:before,em[data-emoji=people_holding_hands_tone4_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc.svg)}em[data-emoji=":people_holding_hands_tone4_tone3:"]:before,em[data-emoji=people_holding_hands_tone4_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd.svg)}em[data-emoji=":people_holding_hands_tone5:"]:before,em[data-emoji=people_holding_hands_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff.svg)}em[data-emoji=":people_holding_hands_tone5_tone1:"]:before,em[data-emoji=people_holding_hands_tone5_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb.svg)}em[data-emoji=":people_holding_hands_tone5_tone2:"]:before,em[data-emoji=people_holding_hands_tone5_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc.svg)}em[data-emoji=":people_holding_hands_tone5_tone3:"]:before,em[data-emoji=people_holding_hands_tone5_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd.svg)}em[data-emoji=":people_holding_hands_tone5_tone4:"]:before,em[data-emoji=people_holding_hands_tone5_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe.svg)}em[data-emoji=":couple:"]:before,em[data-emoji=couple]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46b.svg)}em[data-emoji=":woman_and_man_holding_hands_tone1:"]:before,em[data-emoji=woman_and_man_holding_hands_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46b-1f3fb.svg)}em[data-emoji=":woman_and_man_holding_hands_tone1_tone2:"]:before,em[data-emoji=woman_and_man_holding_hands_tone1_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc.svg)}em[data-emoji=":woman_and_man_holding_hands_tone1_tone3:"]:before,em[data-emoji=woman_and_man_holding_hands_tone1_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd.svg)}em[data-emoji=":woman_and_man_holding_hands_tone1_tone4:"]:before,em[data-emoji=woman_and_man_holding_hands_tone1_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe.svg)}em[data-emoji=":woman_and_man_holding_hands_tone1_tone5:"]:before,em[data-emoji=woman_and_man_holding_hands_tone1_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff.svg)}em[data-emoji=":woman_and_man_holding_hands_tone2:"]:before,em[data-emoji=woman_and_man_holding_hands_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46b-1f3fc.svg)}em[data-emoji=":woman_and_man_holding_hands_tone2_tone1:"]:before,em[data-emoji=woman_and_man_holding_hands_tone2_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb.svg)}em[data-emoji=":woman_and_man_holding_hands_tone2_tone3:"]:before,em[data-emoji=woman_and_man_holding_hands_tone2_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd.svg)}em[data-emoji=":woman_and_man_holding_hands_tone2_tone4:"]:before,em[data-emoji=woman_and_man_holding_hands_tone2_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe.svg)}em[data-emoji=":woman_and_man_holding_hands_tone2_tone5:"]:before,em[data-emoji=woman_and_man_holding_hands_tone2_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff.svg)}em[data-emoji=":woman_and_man_holding_hands_tone3:"]:before,em[data-emoji=woman_and_man_holding_hands_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46b-1f3fd.svg)}em[data-emoji=":woman_and_man_holding_hands_tone3_tone1:"]:before,em[data-emoji=woman_and_man_holding_hands_tone3_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb.svg)}em[data-emoji=":woman_and_man_holding_hands_tone3_tone2:"]:before,em[data-emoji=woman_and_man_holding_hands_tone3_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc.svg)}em[data-emoji=":woman_and_man_holding_hands_tone3_tone4:"]:before,em[data-emoji=woman_and_man_holding_hands_tone3_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe.svg)}em[data-emoji=":woman_and_man_holding_hands_tone3_tone5:"]:before,em[data-emoji=woman_and_man_holding_hands_tone3_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff.svg)}em[data-emoji=":woman_and_man_holding_hands_tone4:"]:before,em[data-emoji=woman_and_man_holding_hands_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46b-1f3fe.svg)}em[data-emoji=":woman_and_man_holding_hands_tone4_tone1:"]:before,em[data-emoji=woman_and_man_holding_hands_tone4_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb.svg)}em[data-emoji=":woman_and_man_holding_hands_tone4_tone2:"]:before,em[data-emoji=woman_and_man_holding_hands_tone4_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc.svg)}em[data-emoji=":woman_and_man_holding_hands_tone4_tone3:"]:before,em[data-emoji=woman_and_man_holding_hands_tone4_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd.svg)}em[data-emoji=":woman_and_man_holding_hands_tone4_tone5:"]:before,em[data-emoji=woman_and_man_holding_hands_tone4_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff.svg)}em[data-emoji=":woman_and_man_holding_hands_tone5:"]:before,em[data-emoji=woman_and_man_holding_hands_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46b-1f3ff.svg)}em[data-emoji=":woman_and_man_holding_hands_tone5_tone1:"]:before,em[data-emoji=woman_and_man_holding_hands_tone5_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb.svg)}em[data-emoji=":woman_and_man_holding_hands_tone5_tone2:"]:before,em[data-emoji=woman_and_man_holding_hands_tone5_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc.svg)}em[data-emoji=":woman_and_man_holding_hands_tone5_tone3:"]:before,em[data-emoji=woman_and_man_holding_hands_tone5_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd.svg)}em[data-emoji=":woman_and_man_holding_hands_tone5_tone4:"]:before,em[data-emoji=woman_and_man_holding_hands_tone5_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe.svg)}em[data-emoji=":two_women_holding_hands:"]:before,em[data-emoji=two_women_holding_hands]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46d.svg)}em[data-emoji=":women_holding_hands_tone1:"]:before,em[data-emoji=women_holding_hands_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46d-1f3fb.svg)}em[data-emoji=":women_holding_hands_tone2:"]:before,em[data-emoji=women_holding_hands_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46d-1f3fc.svg)}em[data-emoji=":women_holding_hands_tone2_tone1:"]:before,em[data-emoji=women_holding_hands_tone2_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb.svg)}em[data-emoji=":women_holding_hands_tone3:"]:before,em[data-emoji=women_holding_hands_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46d-1f3fd.svg)}em[data-emoji=":women_holding_hands_tone3_tone1:"]:before,em[data-emoji=women_holding_hands_tone3_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb.svg)}em[data-emoji=":women_holding_hands_tone3_tone2:"]:before,em[data-emoji=women_holding_hands_tone3_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc.svg)}em[data-emoji=":women_holding_hands_tone4:"]:before,em[data-emoji=women_holding_hands_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46d-1f3fe.svg)}em[data-emoji=":women_holding_hands_tone4_tone1:"]:before,em[data-emoji=women_holding_hands_tone4_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb.svg)}em[data-emoji=":women_holding_hands_tone4_tone2:"]:before,em[data-emoji=women_holding_hands_tone4_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc.svg)}em[data-emoji=":women_holding_hands_tone4_tone3:"]:before,em[data-emoji=women_holding_hands_tone4_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd.svg)}em[data-emoji=":women_holding_hands_tone5:"]:before,em[data-emoji=women_holding_hands_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46d-1f3ff.svg)}em[data-emoji=":women_holding_hands_tone5_tone1:"]:before,em[data-emoji=women_holding_hands_tone5_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb.svg)}em[data-emoji=":women_holding_hands_tone5_tone2:"]:before,em[data-emoji=women_holding_hands_tone5_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc.svg)}em[data-emoji=":women_holding_hands_tone5_tone3:"]:before,em[data-emoji=women_holding_hands_tone5_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd.svg)}em[data-emoji=":women_holding_hands_tone5_tone4:"]:before,em[data-emoji=women_holding_hands_tone5_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe.svg)}em[data-emoji=":two_men_holding_hands:"]:before,em[data-emoji=two_men_holding_hands]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46c.svg)}em[data-emoji=":men_holding_hands_tone1:"]:before,em[data-emoji=men_holding_hands_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46c-1f3fb.svg)}em[data-emoji=":men_holding_hands_tone2:"]:before,em[data-emoji=men_holding_hands_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46c-1f3fc.svg)}em[data-emoji=":men_holding_hands_tone2_tone1:"]:before,em[data-emoji=men_holding_hands_tone2_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb.svg)}em[data-emoji=":men_holding_hands_tone3:"]:before,em[data-emoji=men_holding_hands_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46c-1f3fd.svg)}em[data-emoji=":men_holding_hands_tone3_tone1:"]:before,em[data-emoji=men_holding_hands_tone3_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb.svg)}em[data-emoji=":men_holding_hands_tone3_tone2:"]:before,em[data-emoji=men_holding_hands_tone3_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc.svg)}em[data-emoji=":men_holding_hands_tone4:"]:before,em[data-emoji=men_holding_hands_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46c-1f3fe.svg)}em[data-emoji=":men_holding_hands_tone4_tone1:"]:before,em[data-emoji=men_holding_hands_tone4_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb.svg)}em[data-emoji=":men_holding_hands_tone4_tone2:"]:before,em[data-emoji=men_holding_hands_tone4_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc.svg)}em[data-emoji=":men_holding_hands_tone4_tone3:"]:before,em[data-emoji=men_holding_hands_tone4_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd.svg)}em[data-emoji=":men_holding_hands_tone5:"]:before,em[data-emoji=men_holding_hands_tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46c-1f3ff.svg)}em[data-emoji=":men_holding_hands_tone5_tone1:"]:before,em[data-emoji=men_holding_hands_tone5_tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb.svg)}em[data-emoji=":men_holding_hands_tone5_tone2:"]:before,em[data-emoji=men_holding_hands_tone5_tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc.svg)}em[data-emoji=":men_holding_hands_tone5_tone3:"]:before,em[data-emoji=men_holding_hands_tone5_tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd.svg)}em[data-emoji=":men_holding_hands_tone5_tone4:"]:before,em[data-emoji=men_holding_hands_tone5_tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe.svg)}em[data-emoji=":couple_with_heart:"]:before,em[data-emoji=couple_with_heart]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f491.svg)}em[data-emoji=":couple_with_heart_woman_man:"]:before,em[data-emoji=couple_with_heart_woman_man]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-2764-fe0f-200d-1f468.svg)}em[data-emoji=":couple_ww:"]:before,em[data-emoji=couple_ww]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-2764-fe0f-200d-1f469.svg)}em[data-emoji=":couple_mm:"]:before,em[data-emoji=couple_mm]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-2764-fe0f-200d-1f468.svg)}em[data-emoji=":couplekiss:"]:before,em[data-emoji=couplekiss]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f48f.svg)}em[data-emoji=":kiss_woman_man:"]:before,em[data-emoji=kiss_woman_man]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.svg)}em[data-emoji=":kiss_ww:"]:before,em[data-emoji=kiss_ww]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.svg)}em[data-emoji=":kiss_mm:"]:before,em[data-emoji=kiss_mm]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.svg)}em[data-emoji=":family:"]:before,em[data-emoji=family]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f46a.svg)}em[data-emoji=":family_man_woman_boy:"]:before,em[data-emoji=family_man_woman_boy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f469-200d-1f466.svg)}em[data-emoji=":family_mwg:"]:before,em[data-emoji=family_mwg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f469-200d-1f467.svg)}em[data-emoji=":family_mwgb:"]:before,em[data-emoji=family_mwgb]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f469-200d-1f467-200d-1f466.svg)}em[data-emoji=":family_mwbb:"]:before,em[data-emoji=family_mwbb]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f469-200d-1f466-200d-1f466.svg)}em[data-emoji=":family_mwgg:"]:before,em[data-emoji=family_mwgg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f469-200d-1f467-200d-1f467.svg)}em[data-emoji=":family_wwb:"]:before,em[data-emoji=family_wwb]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f469-200d-1f466.svg)}em[data-emoji=":family_wwg:"]:before,em[data-emoji=family_wwg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f469-200d-1f467.svg)}em[data-emoji=":family_wwgb:"]:before,em[data-emoji=family_wwgb]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f469-200d-1f467-200d-1f466.svg)}em[data-emoji=":family_wwbb:"]:before,em[data-emoji=family_wwbb]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f469-200d-1f466-200d-1f466.svg)}em[data-emoji=":family_wwgg:"]:before,em[data-emoji=family_wwgg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f469-200d-1f467-200d-1f467.svg)}em[data-emoji=":family_mmb:"]:before,em[data-emoji=family_mmb]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f468-200d-1f466.svg)}em[data-emoji=":family_mmg:"]:before,em[data-emoji=family_mmg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f468-200d-1f467.svg)}em[data-emoji=":family_mmgb:"]:before,em[data-emoji=family_mmgb]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f468-200d-1f467-200d-1f466.svg)}em[data-emoji=":family_mmbb:"]:before,em[data-emoji=family_mmbb]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f468-200d-1f466-200d-1f466.svg)}em[data-emoji=":family_mmgg:"]:before,em[data-emoji=family_mmgg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f468-200d-1f467-200d-1f467.svg)}em[data-emoji=":family_woman_boy:"]:before,em[data-emoji=family_woman_boy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f466.svg)}em[data-emoji=":family_woman_girl:"]:before,em[data-emoji=family_woman_girl]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f467.svg)}em[data-emoji=":family_woman_girl_boy:"]:before,em[data-emoji=family_woman_girl_boy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f467-200d-1f466.svg)}em[data-emoji=":family_woman_boy_boy:"]:before,em[data-emoji=family_woman_boy_boy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f466-200d-1f466.svg)}em[data-emoji=":family_woman_girl_girl:"]:before,em[data-emoji=family_woman_girl_girl]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f469-200d-1f467-200d-1f467.svg)}em[data-emoji=":family_man_boy:"]:before,em[data-emoji=family_man_boy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f466.svg)}em[data-emoji=":family_man_girl:"]:before,em[data-emoji=family_man_girl]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f467.svg)}em[data-emoji=":family_man_girl_boy:"]:before,em[data-emoji=family_man_girl_boy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f467-200d-1f466.svg)}em[data-emoji=":family_man_boy_boy:"]:before,em[data-emoji=family_man_boy_boy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f466-200d-1f466.svg)}em[data-emoji=":family_man_girl_girl:"]:before,em[data-emoji=family_man_girl_girl]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f468-200d-1f467-200d-1f467.svg)}em[data-emoji=":yarn:"]:before,em[data-emoji=yarn]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9f6.svg)}em[data-emoji=":thread:"]:before,em[data-emoji=thread]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9f5.svg)}em[data-emoji=":coat:"]:before,em[data-emoji=coat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9e5.svg)}em[data-emoji=":lab_coat:"]:before,em[data-emoji=lab_coat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f97c.svg)}em[data-emoji=":safety_vest:"]:before,em[data-emoji=safety_vest]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9ba.svg)}em[data-emoji=":womans_clothes:"]:before,em[data-emoji=womans_clothes]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f45a.svg)}em[data-emoji=":shirt:"]:before,em[data-emoji=shirt]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f455.svg)}em[data-emoji=":jeans:"]:before,em[data-emoji=jeans]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f456.svg)}em[data-emoji=":shorts:"]:before,em[data-emoji=shorts]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1fa73.svg)}em[data-emoji=":necktie:"]:before,em[data-emoji=necktie]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f454.svg)}em[data-emoji=":dress:"]:before,em[data-emoji=dress]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f457.svg)}em[data-emoji=":bikini:"]:before,em[data-emoji=bikini]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f459.svg)}em[data-emoji=":one_piece_swimsuit:"]:before,em[data-emoji=one_piece_swimsuit]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1fa71.svg)}em[data-emoji=":kimono:"]:before,em[data-emoji=kimono]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f458.svg)}em[data-emoji=":sari:"]:before,em[data-emoji=sari]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f97b.svg)}em[data-emoji=":womans_flat_shoe:"]:before,em[data-emoji=womans_flat_shoe]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f97f.svg)}em[data-emoji=":high_heel:"]:before,em[data-emoji=high_heel]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f460.svg)}em[data-emoji=":sandal:"]:before,em[data-emoji=sandal]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f461.svg)}em[data-emoji=":boot:"]:before,em[data-emoji=boot]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f462.svg)}em[data-emoji=":ballet_shoes:"]:before,em[data-emoji=ballet_shoes]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1fa70.svg)}em[data-emoji=":mans_shoe:"]:before,em[data-emoji=mans_shoe]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f45e.svg)}em[data-emoji=":athletic_shoe:"]:before,em[data-emoji=athletic_shoe]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f45f.svg)}em[data-emoji=":hiking_boot:"]:before,em[data-emoji=hiking_boot]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f97e.svg)}em[data-emoji=":briefs:"]:before,em[data-emoji=briefs]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1fa72.svg)}em[data-emoji=":socks:"]:before,em[data-emoji=socks]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9e6.svg)}em[data-emoji=":gloves:"]:before,em[data-emoji=gloves]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9e4.svg)}em[data-emoji=":scarf:"]:before,em[data-emoji=scarf]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9e3.svg)}em[data-emoji=":tophat:"]:before,em[data-emoji=tophat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3a9.svg)}em[data-emoji=":billed_cap:"]:before,em[data-emoji=billed_cap]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9e2.svg)}em[data-emoji=":womans_hat:"]:before,em[data-emoji=womans_hat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f452.svg)}em[data-emoji=":mortar_board:"]:before,em[data-emoji=mortar_board]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f393.svg)}em[data-emoji=":helmet_with_cross:"]:before,em[data-emoji=helmet_with_cross]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26d1.svg)}em[data-emoji=":crown:"]:before,em[data-emoji=crown]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f451.svg)}em[data-emoji=":ring:"]:before,em[data-emoji=ring]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f48d.svg)}em[data-emoji=":pouch:"]:before,em[data-emoji=pouch]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f45d.svg)}em[data-emoji=":purse:"]:before,em[data-emoji=purse]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f45b.svg)}em[data-emoji=":handbag:"]:before,em[data-emoji=handbag]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f45c.svg)}em[data-emoji=":briefcase:"]:before,em[data-emoji=briefcase]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4bc.svg)}em[data-emoji=":school_satchel:"]:before,em[data-emoji=school_satchel]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f392.svg)}em[data-emoji=":luggage:"]:before,em[data-emoji=luggage]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9f3.svg)}em[data-emoji=":eyeglasses:"]:before,em[data-emoji=eyeglasses]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f453.svg)}em[data-emoji=":dark_sunglasses:"]:before,em[data-emoji=dark_sunglasses]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f576.svg)}em[data-emoji=":goggles:"]:before,em[data-emoji=goggles]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f97d.svg)}em[data-emoji=":diving_mask:"]:before,em[data-emoji=diving_mask]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f93f.svg)}em[data-emoji=":closed_umbrella:"]:before,em[data-emoji=closed_umbrella]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f302.svg)}em[data-emoji=":curly_haired:"]:before,em[data-emoji=curly_haired]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b1.svg)}em[data-emoji=":red_haired:"]:before,em[data-emoji=red_haired]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b0.svg)}em[data-emoji=":white_haired:"]:before,em[data-emoji=white_haired]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b3.svg)}em[data-emoji=":bald:"]:before,em[data-emoji=bald]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9b2.svg)}em[data-emoji=":red_car:"]:before,em[data-emoji=red_car]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f697.svg)}em[data-emoji=":taxi:"]:before,em[data-emoji=taxi]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f695.svg)}em[data-emoji=":blue_car:"]:before,em[data-emoji=blue_car]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f699.svg)}em[data-emoji=":bus:"]:before,em[data-emoji=bus]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f68c.svg)}em[data-emoji=":trolleybus:"]:before,em[data-emoji=trolleybus]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f68e.svg)}em[data-emoji=":race_car:"]:before,em[data-emoji=race_car]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ce.svg)}em[data-emoji=":police_car:"]:before,em[data-emoji=police_car]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f693.svg)}em[data-emoji=":ambulance:"]:before,em[data-emoji=ambulance]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f691.svg)}em[data-emoji=":fire_engine:"]:before,em[data-emoji=fire_engine]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f692.svg)}em[data-emoji=":minibus:"]:before,em[data-emoji=minibus]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f690.svg)}em[data-emoji=":truck:"]:before,em[data-emoji=truck]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f69a.svg)}em[data-emoji=":articulated_lorry:"]:before,em[data-emoji=articulated_lorry]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f69b.svg)}em[data-emoji=":tractor:"]:before,em[data-emoji=tractor]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f69c.svg)}em[data-emoji=":auto_rickshaw:"]:before,em[data-emoji=auto_rickshaw]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6fa.svg)}em[data-emoji=":motor_scooter:"]:before,em[data-emoji=motor_scooter]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6f5.svg)}em[data-emoji=":motorcycle:"]:before,em[data-emoji=motorcycle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3cd.svg)}em[data-emoji=":scooter:"]:before,em[data-emoji=scooter]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6f4.svg)}em[data-emoji=":bike:"]:before,em[data-emoji=bike]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6b2.svg)}em[data-emoji=":motorized_wheelchair:"]:before,em[data-emoji=motorized_wheelchair]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9bc.svg)}em[data-emoji=":manual_wheelchair:"]:before,em[data-emoji=manual_wheelchair]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f9bd.svg)}em[data-emoji=":rotating_light:"]:before,em[data-emoji=rotating_light]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a8.svg)}em[data-emoji=":oncoming_police_car:"]:before,em[data-emoji=oncoming_police_car]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f694.svg)}em[data-emoji=":oncoming_bus:"]:before,em[data-emoji=oncoming_bus]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f68d.svg)}em[data-emoji=":oncoming_automobile:"]:before,em[data-emoji=oncoming_automobile]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f698.svg)}em[data-emoji=":oncoming_taxi:"]:before,em[data-emoji=oncoming_taxi]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f696.svg)}em[data-emoji=":aerial_tramway:"]:before,em[data-emoji=aerial_tramway]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a1.svg)}em[data-emoji=":mountain_cableway:"]:before,em[data-emoji=mountain_cableway]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a0.svg)}em[data-emoji=":suspension_railway:"]:before,em[data-emoji=suspension_railway]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f69f.svg)}em[data-emoji=":railway_car:"]:before,em[data-emoji=railway_car]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f683.svg)}em[data-emoji=":train:"]:before,em[data-emoji=train]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f68b.svg)}em[data-emoji=":mountain_railway:"]:before,em[data-emoji=mountain_railway]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f69e.svg)}em[data-emoji=":monorail:"]:before,em[data-emoji=monorail]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f69d.svg)}em[data-emoji=":bullettrain_side:"]:before,em[data-emoji=bullettrain_side]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f684.svg)}em[data-emoji=":bullettrain_front:"]:before,em[data-emoji=bullettrain_front]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f685.svg)}em[data-emoji=":light_rail:"]:before,em[data-emoji=light_rail]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f688.svg)}em[data-emoji=":steam_locomotive:"]:before,em[data-emoji=steam_locomotive]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f682.svg)}em[data-emoji=":train2:"]:before,em[data-emoji=train2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f686.svg)}em[data-emoji=":metro:"]:before,em[data-emoji=metro]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f687.svg)}em[data-emoji=":tram:"]:before,em[data-emoji=tram]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f68a.svg)}em[data-emoji=":station:"]:before,em[data-emoji=station]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f689.svg)}em[data-emoji=":airplane_departure:"]:before,em[data-emoji=airplane_departure]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6eb.svg)}em[data-emoji=":airplane_arriving:"]:before,em[data-emoji=airplane_arriving]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6ec.svg)}em[data-emoji=":airplane_small:"]:before,em[data-emoji=airplane_small]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6e9.svg)}em[data-emoji=":seat:"]:before,em[data-emoji=seat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f4ba.svg)}em[data-emoji=":satellite_orbital:"]:before,em[data-emoji=satellite_orbital]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6f0.svg)}em[data-emoji=":rocket:"]:before,em[data-emoji=rocket]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f680.svg)}em[data-emoji=":flying_saucer:"]:before,em[data-emoji=flying_saucer]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6f8.svg)}em[data-emoji=":helicopter:"]:before,em[data-emoji=helicopter]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f681.svg)}em[data-emoji=":canoe:"]:before,em[data-emoji=canoe]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6f6.svg)}em[data-emoji=":sailboat:"]:before,em[data-emoji=sailboat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f5.svg)}em[data-emoji=":speedboat:"]:before,em[data-emoji=speedboat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a4.svg)}em[data-emoji=":motorboat:"]:before,em[data-emoji=motorboat]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6e5.svg)}em[data-emoji=":cruise_ship:"]:before,em[data-emoji=cruise_ship]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6f3.svg)}em[data-emoji=":ferry:"]:before,em[data-emoji=ferry]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f4.svg)}em[data-emoji=":ship:"]:before,em[data-emoji=ship]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a2.svg)}em[data-emoji=":fuelpump:"]:before,em[data-emoji=fuelpump]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26fd.svg)}em[data-emoji=":construction:"]:before,em[data-emoji=construction]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a7.svg)}em[data-emoji=":vertical_traffic_light:"]:before,em[data-emoji=vertical_traffic_light]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a6.svg)}em[data-emoji=":traffic_light:"]:before,em[data-emoji=traffic_light]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a5.svg)}em[data-emoji=":busstop:"]:before,em[data-emoji=busstop]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f68f.svg)}em[data-emoji=":map:"]:before,em[data-emoji=map]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5fa.svg)}em[data-emoji=":moyai:"]:before,em[data-emoji=moyai]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5ff.svg)}em[data-emoji=":statue_of_liberty:"]:before,em[data-emoji=statue_of_liberty]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5fd.svg)}em[data-emoji=":tokyo_tower:"]:before,em[data-emoji=tokyo_tower]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5fc.svg)}em[data-emoji=":european_castle:"]:before,em[data-emoji=european_castle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3f0.svg)}em[data-emoji=":japanese_castle:"]:before,em[data-emoji=japanese_castle]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ef.svg)}em[data-emoji=":stadium:"]:before,em[data-emoji=stadium]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3df.svg)}em[data-emoji=":ferris_wheel:"]:before,em[data-emoji=ferris_wheel]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3a1.svg)}em[data-emoji=":roller_coaster:"]:before,em[data-emoji=roller_coaster]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3a2.svg)}em[data-emoji=":carousel_horse:"]:before,em[data-emoji=carousel_horse]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3a0.svg)}em[data-emoji=":fountain:"]:before,em[data-emoji=fountain]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f2.svg)}em[data-emoji=":beach_umbrella:"]:before,em[data-emoji=beach_umbrella]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f1.svg)}em[data-emoji=":beach:"]:before,em[data-emoji=beach]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3d6.svg)}em[data-emoji=":island:"]:before,em[data-emoji=island]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3dd.svg)}em[data-emoji=":desert:"]:before,em[data-emoji=desert]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3dc.svg)}em[data-emoji=":volcano:"]:before,em[data-emoji=volcano]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f30b.svg)}em[data-emoji=":mountain:"]:before,em[data-emoji=mountain]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26f0.svg)}em[data-emoji=":mountain_snow:"]:before,em[data-emoji=mountain_snow]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3d4.svg)}em[data-emoji=":mount_fuji:"]:before,em[data-emoji=mount_fuji]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5fb.svg)}em[data-emoji=":camping:"]:before,em[data-emoji=camping]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3d5.svg)}em[data-emoji=":tent:"]:before,em[data-emoji=tent]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26fa.svg)}em[data-emoji=":house:"]:before,em[data-emoji=house]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3e0.svg)}em[data-emoji=":house_with_garden:"]:before,em[data-emoji=house_with_garden]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3e1.svg)}em[data-emoji=":homes:"]:before,em[data-emoji=homes]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3d8.svg)}em[data-emoji=":house_abandoned:"]:before,em[data-emoji=house_abandoned]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3da.svg)}em[data-emoji=":construction_site:"]:before,em[data-emoji=construction_site]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3d7.svg)}em[data-emoji=":factory:"]:before,em[data-emoji=factory]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ed.svg)}em[data-emoji=":office:"]:before,em[data-emoji=office]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3e2.svg)}em[data-emoji=":department_store:"]:before,em[data-emoji=department_store]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ec.svg)}em[data-emoji=":post_office:"]:before,em[data-emoji=post_office]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3e3.svg)}em[data-emoji=":european_post_office:"]:before,em[data-emoji=european_post_office]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3e4.svg)}em[data-emoji=":hospital:"]:before,em[data-emoji=hospital]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3e5.svg)}em[data-emoji=":bank:"]:before,em[data-emoji=bank]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3e6.svg)}em[data-emoji=":hotel:"]:before,em[data-emoji=hotel]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3e8.svg)}em[data-emoji=":convenience_store:"]:before,em[data-emoji=convenience_store]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ea.svg)}em[data-emoji=":school:"]:before,em[data-emoji=school]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3eb.svg)}em[data-emoji=":love_hotel:"]:before,em[data-emoji=love_hotel]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3e9.svg)}em[data-emoji=":wedding:"]:before,em[data-emoji=wedding]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f492.svg)}em[data-emoji=":classical_building:"]:before,em[data-emoji=classical_building]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3db.svg)}em[data-emoji=":church:"]:before,em[data-emoji=church]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26ea.svg)}em[data-emoji=":mosque:"]:before,em[data-emoji=mosque]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f54c.svg)}em[data-emoji=":hindu_temple:"]:before,em[data-emoji=hindu_temple]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6d5.svg)}em[data-emoji=":synagogue:"]:before,em[data-emoji=synagogue]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f54d.svg)}em[data-emoji=":kaaba:"]:before,em[data-emoji=kaaba]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f54b.svg)}em[data-emoji=":shinto_shrine:"]:before,em[data-emoji=shinto_shrine]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/26e9.svg)}em[data-emoji=":railway_track:"]:before,em[data-emoji=railway_track]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6e4.svg)}em[data-emoji=":motorway:"]:before,em[data-emoji=motorway]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6e3.svg)}em[data-emoji=":japan:"]:before,em[data-emoji=japan]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f5fe.svg)}em[data-emoji=":rice_scene:"]:before,em[data-emoji=rice_scene]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f391.svg)}em[data-emoji=":park:"]:before,em[data-emoji=park]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3de.svg)}em[data-emoji=":sunrise:"]:before,em[data-emoji=sunrise]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f305.svg)}em[data-emoji=":sunrise_over_mountains:"]:before,em[data-emoji=sunrise_over_mountains]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f304.svg)}em[data-emoji=":stars:"]:before,em[data-emoji=stars]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f320.svg)}em[data-emoji=":sparkler:"]:before,em[data-emoji=sparkler]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f387.svg)}em[data-emoji=":fireworks:"]:before,em[data-emoji=fireworks]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f386.svg)}em[data-emoji=":city_sunset:"]:before,em[data-emoji=city_sunset]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f307.svg)}em[data-emoji=":city_dusk:"]:before,em[data-emoji=city_dusk]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f306.svg)}em[data-emoji=":cityscape:"]:before,em[data-emoji=cityscape]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3d9.svg)}em[data-emoji=":night_with_stars:"]:before,em[data-emoji=night_with_stars]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f303.svg)}em[data-emoji=":milky_way:"]:before,em[data-emoji=milky_way]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f30c.svg)}em[data-emoji=":bridge_at_night:"]:before,em[data-emoji=bridge_at_night]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f309.svg)}em[data-emoji=":foggy:"]:before,em[data-emoji=foggy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f301.svg)}em[data-emoji=":regional_indicator_z:"]:before,em[data-emoji=regional_indicator_z]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ff.svg)}em[data-emoji=":regional_indicator_y:"]:before,em[data-emoji=regional_indicator_y]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fe.svg)}em[data-emoji=":regional_indicator_x:"]:before,em[data-emoji=regional_indicator_x]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fd.svg)}em[data-emoji=":regional_indicator_w:"]:before,em[data-emoji=regional_indicator_w]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fc.svg)}em[data-emoji=":regional_indicator_v:"]:before,em[data-emoji=regional_indicator_v]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fb.svg)}em[data-emoji=":regional_indicator_u:"]:before,em[data-emoji=regional_indicator_u]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fa.svg)}em[data-emoji=":regional_indicator_t:"]:before,em[data-emoji=regional_indicator_t]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f9.svg)}em[data-emoji=":regional_indicator_s:"]:before,em[data-emoji=regional_indicator_s]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8.svg)}em[data-emoji=":regional_indicator_r:"]:before,em[data-emoji=regional_indicator_r]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f7.svg)}em[data-emoji=":regional_indicator_q:"]:before,em[data-emoji=regional_indicator_q]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f6.svg)}em[data-emoji=":regional_indicator_p:"]:before,em[data-emoji=regional_indicator_p]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f5.svg)}em[data-emoji=":regional_indicator_o:"]:before,em[data-emoji=regional_indicator_o]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f4.svg)}em[data-emoji=":regional_indicator_n:"]:before,em[data-emoji=regional_indicator_n]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f3.svg)}em[data-emoji=":regional_indicator_m:"]:before,em[data-emoji=regional_indicator_m]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2.svg)}em[data-emoji=":regional_indicator_l:"]:before,em[data-emoji=regional_indicator_l]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f1.svg)}em[data-emoji=":regional_indicator_k:"]:before,em[data-emoji=regional_indicator_k]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f0.svg)}em[data-emoji=":regional_indicator_j:"]:before,em[data-emoji=regional_indicator_j]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ef.svg)}em[data-emoji=":regional_indicator_i:"]:before,em[data-emoji=regional_indicator_i]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ee.svg)}em[data-emoji=":regional_indicator_h:"]:before,em[data-emoji=regional_indicator_h]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ed.svg)}em[data-emoji=":regional_indicator_g:"]:before,em[data-emoji=regional_indicator_g]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec.svg)}em[data-emoji=":regional_indicator_f:"]:before,em[data-emoji=regional_indicator_f]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1eb.svg)}em[data-emoji=":regional_indicator_e:"]:before,em[data-emoji=regional_indicator_e]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ea.svg)}em[data-emoji=":regional_indicator_d:"]:before,em[data-emoji=regional_indicator_d]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e9.svg)}em[data-emoji=":regional_indicator_c:"]:before,em[data-emoji=regional_indicator_c]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8.svg)}em[data-emoji=":regional_indicator_b:"]:before,em[data-emoji=regional_indicator_b]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7.svg)}em[data-emoji=":regional_indicator_a:"]:before,em[data-emoji=regional_indicator_a]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e6.svg)}em[data-emoji=":flag_white:"]:before,em[data-emoji=flag_white]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3f3.svg)}em[data-emoji=":flag_black:"]:before,em[data-emoji=flag_black]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3f4.svg)}em[data-emoji=":checkered_flag:"]:before,em[data-emoji=checkered_flag]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3c1.svg)}em[data-emoji=":triangular_flag_on_post:"]:before,em[data-emoji=triangular_flag_on_post]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f6a9.svg)}em[data-emoji=":rainbow_flag:"]:before,em[data-emoji=rainbow_flag]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3f3-fe0f-200d-1f308.svg)}em[data-emoji=":pirate_flag:"]:before,em[data-emoji=pirate_flag]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3f4-200d-2620-fe0f.svg)}em[data-emoji=":flag_af:"]:before,em[data-emoji=flag_af]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e6-1f1eb.svg)}em[data-emoji=":flag_ax:"]:before,em[data-emoji=flag_ax]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e6-1f1fd.svg)}em[data-emoji=":flag_al:"]:before,em[data-emoji=flag_al]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e6-1f1f1.svg)}em[data-emoji=":flag_dz:"]:before,em[data-emoji=flag_dz]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e9-1f1ff.svg)}em[data-emoji=":flag_as:"]:before,em[data-emoji=flag_as]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e6-1f1f8.svg)}em[data-emoji=":flag_ad:"]:before,em[data-emoji=flag_ad]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e6-1f1e9.svg)}em[data-emoji=":flag_ao:"]:before,em[data-emoji=flag_ao]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e6-1f1f4.svg)}em[data-emoji=":flag_ai:"]:before,em[data-emoji=flag_ai]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e6-1f1ee.svg)}em[data-emoji=":flag_aq:"]:before,em[data-emoji=flag_aq]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e6-1f1f6.svg)}em[data-emoji=":flag_ag:"]:before,em[data-emoji=flag_ag]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e6-1f1ec.svg)}em[data-emoji=":flag_ar:"]:before,em[data-emoji=flag_ar]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e6-1f1f7.svg)}em[data-emoji=":flag_am:"]:before,em[data-emoji=flag_am]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e6-1f1f2.svg)}em[data-emoji=":flag_aw:"]:before,em[data-emoji=flag_aw]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e6-1f1fc.svg)}em[data-emoji=":flag_au:"]:before,em[data-emoji=flag_au]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e6-1f1fa.svg)}em[data-emoji=":flag_at:"]:before,em[data-emoji=flag_at]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e6-1f1f9.svg)}em[data-emoji=":flag_az:"]:before,em[data-emoji=flag_az]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e6-1f1ff.svg)}em[data-emoji=":flag_bs:"]:before,em[data-emoji=flag_bs]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1f8.svg)}em[data-emoji=":flag_bh:"]:before,em[data-emoji=flag_bh]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1ed.svg)}em[data-emoji=":flag_bd:"]:before,em[data-emoji=flag_bd]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1e9.svg)}em[data-emoji=":flag_bb:"]:before,em[data-emoji=flag_bb]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1e7.svg)}em[data-emoji=":flag_by:"]:before,em[data-emoji=flag_by]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1fe.svg)}em[data-emoji=":flag_be:"]:before,em[data-emoji=flag_be]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1ea.svg)}em[data-emoji=":flag_bz:"]:before,em[data-emoji=flag_bz]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1ff.svg)}em[data-emoji=":flag_bj:"]:before,em[data-emoji=flag_bj]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1ef.svg)}em[data-emoji=":flag_bm:"]:before,em[data-emoji=flag_bm]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1f2.svg)}em[data-emoji=":flag_bt:"]:before,em[data-emoji=flag_bt]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1f9.svg)}em[data-emoji=":flag_bo:"]:before,em[data-emoji=flag_bo]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1f4.svg)}em[data-emoji=":flag_ba:"]:before,em[data-emoji=flag_ba]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1e6.svg)}em[data-emoji=":flag_bw:"]:before,em[data-emoji=flag_bw]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1fc.svg)}em[data-emoji=":flag_br:"]:before,em[data-emoji=flag_br]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1f7.svg)}em[data-emoji=":flag_io:"]:before,em[data-emoji=flag_io]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ee-1f1f4.svg)}em[data-emoji=":flag_vg:"]:before,em[data-emoji=flag_vg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fb-1f1ec.svg)}em[data-emoji=":flag_bn:"]:before,em[data-emoji=flag_bn]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1f3.svg)}em[data-emoji=":flag_bg:"]:before,em[data-emoji=flag_bg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1ec.svg)}em[data-emoji=":flag_bf:"]:before,em[data-emoji=flag_bf]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1eb.svg)}em[data-emoji=":flag_bi:"]:before,em[data-emoji=flag_bi]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1ee.svg)}em[data-emoji=":flag_kh:"]:before,em[data-emoji=flag_kh]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f0-1f1ed.svg)}em[data-emoji=":flag_cm:"]:before,em[data-emoji=flag_cm]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1f2.svg)}em[data-emoji=":flag_ca:"]:before,em[data-emoji=flag_ca]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1e6.svg)}em[data-emoji=":flag_ic:"]:before,em[data-emoji=flag_ic]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ee-1f1e8.svg)}em[data-emoji=":flag_cv:"]:before,em[data-emoji=flag_cv]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1fb.svg)}em[data-emoji=":flag_bq:"]:before,em[data-emoji=flag_bq]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1f6.svg)}em[data-emoji=":flag_ky:"]:before,em[data-emoji=flag_ky]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f0-1f1fe.svg)}em[data-emoji=":flag_cf:"]:before,em[data-emoji=flag_cf]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1eb.svg)}em[data-emoji=":flag_td:"]:before,em[data-emoji=flag_td]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f9-1f1e9.svg)}em[data-emoji=":flag_cl:"]:before,em[data-emoji=flag_cl]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1f1.svg)}em[data-emoji=":flag_cn:"]:before,em[data-emoji=flag_cn]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1f3.svg)}em[data-emoji=":flag_cx:"]:before,em[data-emoji=flag_cx]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1fd.svg)}em[data-emoji=":flag_cc:"]:before,em[data-emoji=flag_cc]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1e8.svg)}em[data-emoji=":flag_co:"]:before,em[data-emoji=flag_co]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1f4.svg)}em[data-emoji=":flag_km:"]:before,em[data-emoji=flag_km]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f0-1f1f2.svg)}em[data-emoji=":flag_cg:"]:before,em[data-emoji=flag_cg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1ec.svg)}em[data-emoji=":flag_cd:"]:before,em[data-emoji=flag_cd]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1e9.svg)}em[data-emoji=":flag_ck:"]:before,em[data-emoji=flag_ck]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1f0.svg)}em[data-emoji=":flag_cr:"]:before,em[data-emoji=flag_cr]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1f7.svg)}em[data-emoji=":flag_ci:"]:before,em[data-emoji=flag_ci]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1ee.svg)}em[data-emoji=":flag_hr:"]:before,em[data-emoji=flag_hr]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ed-1f1f7.svg)}em[data-emoji=":flag_cu:"]:before,em[data-emoji=flag_cu]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1fa.svg)}em[data-emoji=":flag_cw:"]:before,em[data-emoji=flag_cw]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1fc.svg)}em[data-emoji=":flag_cy:"]:before,em[data-emoji=flag_cy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1fe.svg)}em[data-emoji=":flag_cz:"]:before,em[data-emoji=flag_cz]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1ff.svg)}em[data-emoji=":flag_dk:"]:before,em[data-emoji=flag_dk]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e9-1f1f0.svg)}em[data-emoji=":flag_dj:"]:before,em[data-emoji=flag_dj]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e9-1f1ef.svg)}em[data-emoji=":flag_dm:"]:before,em[data-emoji=flag_dm]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e9-1f1f2.svg)}em[data-emoji=":flag_do:"]:before,em[data-emoji=flag_do]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e9-1f1f4.svg)}em[data-emoji=":flag_ec:"]:before,em[data-emoji=flag_ec]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ea-1f1e8.svg)}em[data-emoji=":flag_eg:"]:before,em[data-emoji=flag_eg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ea-1f1ec.svg)}em[data-emoji=":flag_sv:"]:before,em[data-emoji=flag_sv]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1fb.svg)}em[data-emoji=":flag_gq:"]:before,em[data-emoji=flag_gq]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1f6.svg)}em[data-emoji=":flag_er:"]:before,em[data-emoji=flag_er]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ea-1f1f7.svg)}em[data-emoji=":flag_ee:"]:before,em[data-emoji=flag_ee]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ea-1f1ea.svg)}em[data-emoji=":flag_et:"]:before,em[data-emoji=flag_et]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ea-1f1f9.svg)}em[data-emoji=":flag_eu:"]:before,em[data-emoji=flag_eu]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ea-1f1fa.svg)}em[data-emoji=":flag_fk:"]:before,em[data-emoji=flag_fk]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1eb-1f1f0.svg)}em[data-emoji=":flag_fo:"]:before,em[data-emoji=flag_fo]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1eb-1f1f4.svg)}em[data-emoji=":flag_fj:"]:before,em[data-emoji=flag_fj]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1eb-1f1ef.svg)}em[data-emoji=":flag_fi:"]:before,em[data-emoji=flag_fi]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1eb-1f1ee.svg)}em[data-emoji=":flag_fr:"]:before,em[data-emoji=flag_fr]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1eb-1f1f7.svg)}em[data-emoji=":flag_gf:"]:before,em[data-emoji=flag_gf]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1eb.svg)}em[data-emoji=":flag_pf:"]:before,em[data-emoji=flag_pf]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f5-1f1eb.svg)}em[data-emoji=":flag_tf:"]:before,em[data-emoji=flag_tf]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f9-1f1eb.svg)}em[data-emoji=":flag_ga:"]:before,em[data-emoji=flag_ga]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1e6.svg)}em[data-emoji=":flag_gm:"]:before,em[data-emoji=flag_gm]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1f2.svg)}em[data-emoji=":flag_ge:"]:before,em[data-emoji=flag_ge]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1ea.svg)}em[data-emoji=":flag_de:"]:before,em[data-emoji=flag_de]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e9-1f1ea.svg)}em[data-emoji=":flag_gh:"]:before,em[data-emoji=flag_gh]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1ed.svg)}em[data-emoji=":flag_gi:"]:before,em[data-emoji=flag_gi]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1ee.svg)}em[data-emoji=":flag_gr:"]:before,em[data-emoji=flag_gr]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1f7.svg)}em[data-emoji=":flag_gl:"]:before,em[data-emoji=flag_gl]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1f1.svg)}em[data-emoji=":flag_gd:"]:before,em[data-emoji=flag_gd]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1e9.svg)}em[data-emoji=":flag_gp:"]:before,em[data-emoji=flag_gp]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1f5.svg)}em[data-emoji=":flag_gu:"]:before,em[data-emoji=flag_gu]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1fa.svg)}em[data-emoji=":flag_gt:"]:before,em[data-emoji=flag_gt]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1f9.svg)}em[data-emoji=":flag_gg:"]:before,em[data-emoji=flag_gg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1ec.svg)}em[data-emoji=":flag_gn:"]:before,em[data-emoji=flag_gn]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1f3.svg)}em[data-emoji=":flag_gw:"]:before,em[data-emoji=flag_gw]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1fc.svg)}em[data-emoji=":flag_gy:"]:before,em[data-emoji=flag_gy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1fe.svg)}em[data-emoji=":flag_ht:"]:before,em[data-emoji=flag_ht]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ed-1f1f9.svg)}em[data-emoji=":flag_hn:"]:before,em[data-emoji=flag_hn]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ed-1f1f3.svg)}em[data-emoji=":flag_hk:"]:before,em[data-emoji=flag_hk]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ed-1f1f0.svg)}em[data-emoji=":flag_hu:"]:before,em[data-emoji=flag_hu]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ed-1f1fa.svg)}em[data-emoji=":flag_is:"]:before,em[data-emoji=flag_is]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ee-1f1f8.svg)}em[data-emoji=":flag_in:"]:before,em[data-emoji=flag_in]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ee-1f1f3.svg)}em[data-emoji=":flag_id:"]:before,em[data-emoji=flag_id]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ee-1f1e9.svg)}em[data-emoji=":flag_ir:"]:before,em[data-emoji=flag_ir]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ee-1f1f7.svg)}em[data-emoji=":flag_iq:"]:before,em[data-emoji=flag_iq]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ee-1f1f6.svg)}em[data-emoji=":flag_ie:"]:before,em[data-emoji=flag_ie]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ee-1f1ea.svg)}em[data-emoji=":flag_im:"]:before,em[data-emoji=flag_im]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ee-1f1f2.svg)}em[data-emoji=":flag_il:"]:before,em[data-emoji=flag_il]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ee-1f1f1.svg)}em[data-emoji=":flag_it:"]:before,em[data-emoji=flag_it]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ee-1f1f9.svg)}em[data-emoji=":flag_jm:"]:before,em[data-emoji=flag_jm]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ef-1f1f2.svg)}em[data-emoji=":flag_jp:"]:before,em[data-emoji=flag_jp]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ef-1f1f5.svg)}em[data-emoji=":crossed_flags:"]:before,em[data-emoji=crossed_flags]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f38c.svg)}em[data-emoji=":flag_je:"]:before,em[data-emoji=flag_je]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ef-1f1ea.svg)}em[data-emoji=":flag_jo:"]:before,em[data-emoji=flag_jo]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ef-1f1f4.svg)}em[data-emoji=":flag_kz:"]:before,em[data-emoji=flag_kz]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f0-1f1ff.svg)}em[data-emoji=":flag_ke:"]:before,em[data-emoji=flag_ke]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f0-1f1ea.svg)}em[data-emoji=":flag_ki:"]:before,em[data-emoji=flag_ki]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f0-1f1ee.svg)}em[data-emoji=":flag_xk:"]:before,em[data-emoji=flag_xk]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fd-1f1f0.svg)}em[data-emoji=":flag_kw:"]:before,em[data-emoji=flag_kw]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f0-1f1fc.svg)}em[data-emoji=":flag_kg:"]:before,em[data-emoji=flag_kg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f0-1f1ec.svg)}em[data-emoji=":flag_la:"]:before,em[data-emoji=flag_la]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f1-1f1e6.svg)}em[data-emoji=":flag_lv:"]:before,em[data-emoji=flag_lv]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f1-1f1fb.svg)}em[data-emoji=":flag_lb:"]:before,em[data-emoji=flag_lb]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f1-1f1e7.svg)}em[data-emoji=":flag_ls:"]:before,em[data-emoji=flag_ls]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f1-1f1f8.svg)}em[data-emoji=":flag_lr:"]:before,em[data-emoji=flag_lr]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f1-1f1f7.svg)}em[data-emoji=":flag_ly:"]:before,em[data-emoji=flag_ly]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f1-1f1fe.svg)}em[data-emoji=":flag_li:"]:before,em[data-emoji=flag_li]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f1-1f1ee.svg)}em[data-emoji=":flag_lt:"]:before,em[data-emoji=flag_lt]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f1-1f1f9.svg)}em[data-emoji=":flag_lu:"]:before,em[data-emoji=flag_lu]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f1-1f1fa.svg)}em[data-emoji=":flag_mo:"]:before,em[data-emoji=flag_mo]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1f4.svg)}em[data-emoji=":flag_mk:"]:before,em[data-emoji=flag_mk]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1f0.svg)}em[data-emoji=":flag_mg:"]:before,em[data-emoji=flag_mg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1ec.svg)}em[data-emoji=":flag_mw:"]:before,em[data-emoji=flag_mw]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1fc.svg)}em[data-emoji=":flag_my:"]:before,em[data-emoji=flag_my]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1fe.svg)}em[data-emoji=":flag_mv:"]:before,em[data-emoji=flag_mv]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1fb.svg)}em[data-emoji=":flag_ml:"]:before,em[data-emoji=flag_ml]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1f1.svg)}em[data-emoji=":flag_mt:"]:before,em[data-emoji=flag_mt]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1f9.svg)}em[data-emoji=":flag_mh:"]:before,em[data-emoji=flag_mh]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1ed.svg)}em[data-emoji=":flag_mq:"]:before,em[data-emoji=flag_mq]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1f6.svg)}em[data-emoji=":flag_mr:"]:before,em[data-emoji=flag_mr]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1f7.svg)}em[data-emoji=":flag_mu:"]:before,em[data-emoji=flag_mu]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1fa.svg)}em[data-emoji=":flag_yt:"]:before,em[data-emoji=flag_yt]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fe-1f1f9.svg)}em[data-emoji=":flag_mx:"]:before,em[data-emoji=flag_mx]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1fd.svg)}em[data-emoji=":flag_fm:"]:before,em[data-emoji=flag_fm]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1eb-1f1f2.svg)}em[data-emoji=":flag_md:"]:before,em[data-emoji=flag_md]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1e9.svg)}em[data-emoji=":flag_mc:"]:before,em[data-emoji=flag_mc]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1e8.svg)}em[data-emoji=":flag_mn:"]:before,em[data-emoji=flag_mn]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1f3.svg)}em[data-emoji=":flag_me:"]:before,em[data-emoji=flag_me]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1ea.svg)}em[data-emoji=":flag_ms:"]:before,em[data-emoji=flag_ms]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1f8.svg)}em[data-emoji=":flag_ma:"]:before,em[data-emoji=flag_ma]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1e6.svg)}em[data-emoji=":flag_mz:"]:before,em[data-emoji=flag_mz]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1ff.svg)}em[data-emoji=":flag_mm:"]:before,em[data-emoji=flag_mm]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1f2.svg)}em[data-emoji=":flag_na:"]:before,em[data-emoji=flag_na]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f3-1f1e6.svg)}em[data-emoji=":flag_nr:"]:before,em[data-emoji=flag_nr]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f3-1f1f7.svg)}em[data-emoji=":flag_np:"]:before,em[data-emoji=flag_np]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f3-1f1f5.svg)}em[data-emoji=":flag_nl:"]:before,em[data-emoji=flag_nl]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f3-1f1f1.svg)}em[data-emoji=":flag_nc:"]:before,em[data-emoji=flag_nc]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f3-1f1e8.svg)}em[data-emoji=":flag_nz:"]:before,em[data-emoji=flag_nz]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f3-1f1ff.svg)}em[data-emoji=":flag_ni:"]:before,em[data-emoji=flag_ni]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f3-1f1ee.svg)}em[data-emoji=":flag_ne:"]:before,em[data-emoji=flag_ne]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f3-1f1ea.svg)}em[data-emoji=":flag_ng:"]:before,em[data-emoji=flag_ng]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f3-1f1ec.svg)}em[data-emoji=":flag_nu:"]:before,em[data-emoji=flag_nu]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f3-1f1fa.svg)}em[data-emoji=":flag_nf:"]:before,em[data-emoji=flag_nf]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f3-1f1eb.svg)}em[data-emoji=":flag_kp:"]:before,em[data-emoji=flag_kp]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f0-1f1f5.svg)}em[data-emoji=":flag_mp:"]:before,em[data-emoji=flag_mp]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1f5.svg)}em[data-emoji=":flag_no:"]:before,em[data-emoji=flag_no]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f3-1f1f4.svg)}em[data-emoji=":flag_om:"]:before,em[data-emoji=flag_om]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f4-1f1f2.svg)}em[data-emoji=":flag_pk:"]:before,em[data-emoji=flag_pk]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f5-1f1f0.svg)}em[data-emoji=":flag_pw:"]:before,em[data-emoji=flag_pw]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f5-1f1fc.svg)}em[data-emoji=":flag_ps:"]:before,em[data-emoji=flag_ps]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f5-1f1f8.svg)}em[data-emoji=":flag_pa:"]:before,em[data-emoji=flag_pa]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f5-1f1e6.svg)}em[data-emoji=":flag_pg:"]:before,em[data-emoji=flag_pg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f5-1f1ec.svg)}em[data-emoji=":flag_py:"]:before,em[data-emoji=flag_py]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f5-1f1fe.svg)}em[data-emoji=":flag_pe:"]:before,em[data-emoji=flag_pe]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f5-1f1ea.svg)}em[data-emoji=":flag_ph:"]:before,em[data-emoji=flag_ph]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f5-1f1ed.svg)}em[data-emoji=":flag_pn:"]:before,em[data-emoji=flag_pn]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f5-1f1f3.svg)}em[data-emoji=":flag_pl:"]:before,em[data-emoji=flag_pl]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f5-1f1f1.svg)}em[data-emoji=":flag_pt:"]:before,em[data-emoji=flag_pt]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f5-1f1f9.svg)}em[data-emoji=":flag_pr:"]:before,em[data-emoji=flag_pr]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f5-1f1f7.svg)}em[data-emoji=":flag_qa:"]:before,em[data-emoji=flag_qa]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f6-1f1e6.svg)}em[data-emoji=":flag_re:"]:before,em[data-emoji=flag_re]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f7-1f1ea.svg)}em[data-emoji=":flag_ro:"]:before,em[data-emoji=flag_ro]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f7-1f1f4.svg)}em[data-emoji=":flag_ru:"]:before,em[data-emoji=flag_ru]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f7-1f1fa.svg)}em[data-emoji=":flag_rw:"]:before,em[data-emoji=flag_rw]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f7-1f1fc.svg)}em[data-emoji=":flag_ws:"]:before,em[data-emoji=flag_ws]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fc-1f1f8.svg)}em[data-emoji=":flag_sm:"]:before,em[data-emoji=flag_sm]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1f2.svg)}em[data-emoji=":flag_st:"]:before,em[data-emoji=flag_st]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1f9.svg)}em[data-emoji=":flag_sa:"]:before,em[data-emoji=flag_sa]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1e6.svg)}em[data-emoji=":flag_sn:"]:before,em[data-emoji=flag_sn]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1f3.svg)}em[data-emoji=":flag_rs:"]:before,em[data-emoji=flag_rs]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f7-1f1f8.svg)}em[data-emoji=":flag_sc:"]:before,em[data-emoji=flag_sc]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1e8.svg)}em[data-emoji=":flag_sl:"]:before,em[data-emoji=flag_sl]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1f1.svg)}em[data-emoji=":flag_sg:"]:before,em[data-emoji=flag_sg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1ec.svg)}em[data-emoji=":flag_sx:"]:before,em[data-emoji=flag_sx]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1fd.svg)}em[data-emoji=":flag_sk:"]:before,em[data-emoji=flag_sk]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1f0.svg)}em[data-emoji=":flag_si:"]:before,em[data-emoji=flag_si]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1ee.svg)}em[data-emoji=":flag_gs:"]:before,em[data-emoji=flag_gs]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1f8.svg)}em[data-emoji=":flag_sb:"]:before,em[data-emoji=flag_sb]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1e7.svg)}em[data-emoji=":flag_so:"]:before,em[data-emoji=flag_so]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1f4.svg)}em[data-emoji=":flag_za:"]:before,em[data-emoji=flag_za]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ff-1f1e6.svg)}em[data-emoji=":flag_kr:"]:before,em[data-emoji=flag_kr]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f0-1f1f7.svg)}em[data-emoji=":flag_ss:"]:before,em[data-emoji=flag_ss]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1f8.svg)}em[data-emoji=":flag_es:"]:before,em[data-emoji=flag_es]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ea-1f1f8.svg)}em[data-emoji=":flag_lk:"]:before,em[data-emoji=flag_lk]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f1-1f1f0.svg)}em[data-emoji=":flag_bl:"]:before,em[data-emoji=flag_bl]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1f1.svg)}em[data-emoji=":flag_sh:"]:before,em[data-emoji=flag_sh]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1ed.svg)}em[data-emoji=":flag_kn:"]:before,em[data-emoji=flag_kn]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f0-1f1f3.svg)}em[data-emoji=":flag_lc:"]:before,em[data-emoji=flag_lc]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f1-1f1e8.svg)}em[data-emoji=":flag_pm:"]:before,em[data-emoji=flag_pm]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f5-1f1f2.svg)}em[data-emoji=":flag_vc:"]:before,em[data-emoji=flag_vc]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fb-1f1e8.svg)}em[data-emoji=":flag_sd:"]:before,em[data-emoji=flag_sd]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1e9.svg)}em[data-emoji=":flag_sr:"]:before,em[data-emoji=flag_sr]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1f7.svg)}em[data-emoji=":flag_sz:"]:before,em[data-emoji=flag_sz]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1ff.svg)}em[data-emoji=":flag_se:"]:before,em[data-emoji=flag_se]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1ea.svg)}em[data-emoji=":flag_ch:"]:before,em[data-emoji=flag_ch]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1ed.svg)}em[data-emoji=":flag_sy:"]:before,em[data-emoji=flag_sy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1fe.svg)}em[data-emoji=":flag_tw:"]:before,em[data-emoji=flag_tw]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f9-1f1fc.svg)}em[data-emoji=":flag_tj:"]:before,em[data-emoji=flag_tj]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f9-1f1ef.svg)}em[data-emoji=":flag_tz:"]:before,em[data-emoji=flag_tz]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f9-1f1ff.svg)}em[data-emoji=":flag_th:"]:before,em[data-emoji=flag_th]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f9-1f1ed.svg)}em[data-emoji=":flag_tl:"]:before,em[data-emoji=flag_tl]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f9-1f1f1.svg)}em[data-emoji=":flag_tg:"]:before,em[data-emoji=flag_tg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f9-1f1ec.svg)}em[data-emoji=":flag_tk:"]:before,em[data-emoji=flag_tk]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f9-1f1f0.svg)}em[data-emoji=":flag_to:"]:before,em[data-emoji=flag_to]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f9-1f1f4.svg)}em[data-emoji=":flag_tt:"]:before,em[data-emoji=flag_tt]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f9-1f1f9.svg)}em[data-emoji=":flag_tn:"]:before,em[data-emoji=flag_tn]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f9-1f1f3.svg)}em[data-emoji=":flag_tr:"]:before,em[data-emoji=flag_tr]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f9-1f1f7.svg)}em[data-emoji=":flag_tm:"]:before,em[data-emoji=flag_tm]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f9-1f1f2.svg)}em[data-emoji=":flag_tc:"]:before,em[data-emoji=flag_tc]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f9-1f1e8.svg)}em[data-emoji=":flag_vi:"]:before,em[data-emoji=flag_vi]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fb-1f1ee.svg)}em[data-emoji=":flag_tv:"]:before,em[data-emoji=flag_tv]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f9-1f1fb.svg)}em[data-emoji=":flag_ug:"]:before,em[data-emoji=flag_ug]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fa-1f1ec.svg)}em[data-emoji=":flag_ua:"]:before,em[data-emoji=flag_ua]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fa-1f1e6.svg)}em[data-emoji=":flag_ae:"]:before,em[data-emoji=flag_ae]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e6-1f1ea.svg)}em[data-emoji=":flag_gb:"]:before,em[data-emoji=flag_gb]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ec-1f1e7.svg)}em[data-emoji=":england:"]:before,em[data-emoji=england]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.svg)}em[data-emoji=":scotland:"]:before,em[data-emoji=scotland]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.svg)}em[data-emoji=":wales:"]:before,em[data-emoji=wales]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.svg)}em[data-emoji=":flag_us:"]:before,em[data-emoji=flag_us]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fa-1f1f8.svg)}em[data-emoji=":flag_uy:"]:before,em[data-emoji=flag_uy]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fa-1f1fe.svg)}em[data-emoji=":flag_uz:"]:before,em[data-emoji=flag_uz]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fa-1f1ff.svg)}em[data-emoji=":flag_vu:"]:before,em[data-emoji=flag_vu]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fb-1f1fa.svg)}em[data-emoji=":flag_va:"]:before,em[data-emoji=flag_va]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fb-1f1e6.svg)}em[data-emoji=":flag_ve:"]:before,em[data-emoji=flag_ve]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fb-1f1ea.svg)}em[data-emoji=":flag_vn:"]:before,em[data-emoji=flag_vn]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fb-1f1f3.svg)}em[data-emoji=":flag_wf:"]:before,em[data-emoji=flag_wf]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fc-1f1eb.svg)}em[data-emoji=":flag_eh:"]:before,em[data-emoji=flag_eh]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ea-1f1ed.svg)}em[data-emoji=":flag_ye:"]:before,em[data-emoji=flag_ye]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fe-1f1ea.svg)}em[data-emoji=":flag_zm:"]:before,em[data-emoji=flag_zm]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ff-1f1f2.svg)}em[data-emoji=":flag_zw:"]:before,em[data-emoji=flag_zw]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ff-1f1fc.svg)}em[data-emoji=":flag_ac:"]:before,em[data-emoji=flag_ac]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e6-1f1e8.svg)}em[data-emoji=":flag_bv:"]:before,em[data-emoji=flag_bv]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e7-1f1fb.svg)}em[data-emoji=":flag_cp:"]:before,em[data-emoji=flag_cp]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e8-1f1f5.svg)}em[data-emoji=":flag_ea:"]:before,em[data-emoji=flag_ea]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ea-1f1e6.svg)}em[data-emoji=":flag_dg:"]:before,em[data-emoji=flag_dg]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1e9-1f1ec.svg)}em[data-emoji=":flag_hm:"]:before,em[data-emoji=flag_hm]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1ed-1f1f2.svg)}em[data-emoji=":flag_mf:"]:before,em[data-emoji=flag_mf]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f2-1f1eb.svg)}em[data-emoji=":flag_sj:"]:before,em[data-emoji=flag_sj]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f8-1f1ef.svg)}em[data-emoji=":flag_ta:"]:before,em[data-emoji=flag_ta]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1f9-1f1e6.svg)}em[data-emoji=":flag_um:"]:before,em[data-emoji=flag_um]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fa-1f1f2.svg)}em[data-emoji=":united_nations:"]:before,em[data-emoji=united_nations]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f1fa-1f1f3.svg)}em[data-emoji=":tone1:"]:before,em[data-emoji=tone1]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3fb.svg)}em[data-emoji=":tone2:"]:before,em[data-emoji=tone2]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3fc.svg)}em[data-emoji=":tone3:"]:before,em[data-emoji=tone3]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3fd.svg)}em[data-emoji=":tone4:"]:before,em[data-emoji=tone4]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3fe.svg)}em[data-emoji=":tone5:"]:before,em[data-emoji=tone5]:before{background-image:url(https://twemoji.maxcdn.com/v/latest/svg/1f3ff.svg)}/*! + * # Fomantic-UI - Flag + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */i.flag:not(.icon){display:inline-block;width:16px;height:11px;line-height:11px;vertical-align:baseline;margin:0 .5em 0 0;text-decoration:inherit;speak:none;-webkit-font-smoothing:antialiased;-webkit-backface-visibility:hidden;backface-visibility:hidden}i.flag:not(.icon):before{display:inline-block;content:'';background:url(themes/default/assets/images/flags.png) no-repeat -108px -1976px;width:16px;height:11px}i.flag.ad:before,i.flag.andorra:before{background-position:0 0}i.flag.ae:before,i.flag.uae:before,i.flag.united.arab.emirates:before{background-position:0 -26px}i.flag.af:before,i.flag.afghanistan:before{background-position:0 -52px}i.flag.ag:before,i.flag.antigua:before{background-position:0 -78px}i.flag.ai:before,i.flag.anguilla:before{background-position:0 -104px}i.flag.al:before,i.flag.albania:before{background-position:0 -130px}i.flag.am:before,i.flag.armenia:before{background-position:0 -156px}i.flag.an:before,i.flag.netherlands.antilles:before{background-position:0 -182px}i.flag.angola:before,i.flag.ao:before{background-position:0 -208px}i.flag.ar:before,i.flag.argentina:before{background-position:0 -234px}i.flag.american.samoa:before,i.flag.as:before{background-position:0 -260px}i.flag.at:before,i.flag.austria:before{background-position:0 -286px}i.flag.au:before,i.flag.australia:before{background-position:0 -312px}i.flag.aruba:before,i.flag.aw:before{background-position:0 -338px}i.flag.aland.islands:before,i.flag.ax:before{background-position:0 -364px}i.flag.az:before,i.flag.azerbaijan:before{background-position:0 -390px}i.flag.ba:before,i.flag.bosnia:before{background-position:0 -416px}i.flag.barbados:before,i.flag.bb:before{background-position:0 -442px}i.flag.bangladesh:before,i.flag.bd:before{background-position:0 -468px}i.flag.be:before,i.flag.belgium:before{background-position:0 -494px}i.flag.bf:before,i.flag.burkina.faso:before{background-position:0 -520px}i.flag.bg:before,i.flag.bulgaria:before{background-position:0 -546px}i.flag.bahrain:before,i.flag.bh:before{background-position:0 -572px}i.flag.bi:before,i.flag.burundi:before{background-position:0 -598px}i.flag.benin:before,i.flag.bj:before{background-position:0 -624px}i.flag.bermuda:before,i.flag.bm:before{background-position:0 -650px}i.flag.bn:before,i.flag.brunei:before{background-position:0 -676px}i.flag.bo:before,i.flag.bolivia:before{background-position:0 -702px}i.flag.br:before,i.flag.brazil:before{background-position:0 -728px}i.flag.bahamas:before,i.flag.bs:before{background-position:0 -754px}i.flag.bhutan:before,i.flag.bt:before{background-position:0 -780px}i.flag.bouvet.island:before,i.flag.bv:before{background-position:0 -806px}i.flag.botswana:before,i.flag.bw:before{background-position:0 -832px}i.flag.belarus:before,i.flag.by:before{background-position:0 -858px}i.flag.belize:before,i.flag.bz:before{background-position:0 -884px}i.flag.ca:before,i.flag.canada:before{background-position:0 -910px}i.flag.cc:before,i.flag.cocos.islands:before{background-position:0 -962px}i.flag.cd:before,i.flag.congo:before{background-position:0 -988px}i.flag.central.african.republic:before,i.flag.cf:before{background-position:0 -1014px}i.flag.cg:before,i.flag.congo.brazzaville:before{background-position:0 -1040px}i.flag.ch:before,i.flag.switzerland:before{background-position:0 -1066px}i.flag.ci:before,i.flag.cote.divoire:before{background-position:0 -1092px}i.flag.ck:before,i.flag.cook.islands:before{background-position:0 -1118px}i.flag.chile:before,i.flag.cl:before{background-position:0 -1144px}i.flag.cameroon:before,i.flag.cm:before{background-position:0 -1170px}i.flag.china:before,i.flag.cn:before{background-position:0 -1196px}i.flag.co:before,i.flag.colombia:before{background-position:0 -1222px}i.flag.costa.rica:before,i.flag.cr:before{background-position:0 -1248px}i.flag.cs:before,i.flag.serbia:before{background-position:0 -1274px}i.flag.cu:before,i.flag.cuba:before{background-position:0 -1300px}i.flag.cape.verde:before,i.flag.cv:before{background-position:0 -1326px}i.flag.christmas.island:before,i.flag.cx:before{background-position:0 -1352px}i.flag.cy:before,i.flag.cyprus:before{background-position:0 -1378px}i.flag.cz:before,i.flag.czech.republic:before{background-position:0 -1404px}i.flag.de:before,i.flag.germany:before{background-position:0 -1430px}i.flag.dj:before,i.flag.djibouti:before{background-position:0 -1456px}i.flag.denmark:before,i.flag.dk:before{background-position:0 -1482px}i.flag.dm:before,i.flag.dominica:before{background-position:0 -1508px}i.flag.do:before,i.flag.dominican.republic:before{background-position:0 -1534px}i.flag.algeria:before,i.flag.dz:before{background-position:0 -1560px}i.flag.ec:before,i.flag.ecuador:before{background-position:0 -1586px}i.flag.ee:before,i.flag.estonia:before{background-position:0 -1612px}i.flag.eg:before,i.flag.egypt:before{background-position:0 -1638px}i.flag.eh:before,i.flag.western.sahara:before{background-position:0 -1664px}i.flag.england:before,i.flag.gb.eng:before{background-position:0 -1690px}i.flag.er:before,i.flag.eritrea:before{background-position:0 -1716px}i.flag.es:before,i.flag.spain:before{background-position:0 -1742px}i.flag.et:before,i.flag.ethiopia:before{background-position:0 -1768px}i.flag.eu:before,i.flag.european.union:before{background-position:0 -1794px}i.flag.fi:before,i.flag.finland:before{background-position:0 -1846px}i.flag.fiji:before,i.flag.fj:before{background-position:0 -1872px}i.flag.falkland.islands:before,i.flag.fk:before{background-position:0 -1898px}i.flag.fm:before,i.flag.micronesia:before{background-position:0 -1924px}i.flag.faroe.islands:before,i.flag.fo:before{background-position:0 -1950px}i.flag.fr:before,i.flag.france:before{background-position:0 -1976px}i.flag.ga:before,i.flag.gabon:before{background-position:-36px 0}i.flag.gb:before,i.flag.uk:before,i.flag.united.kingdom:before{background-position:-36px -26px}i.flag.gd:before,i.flag.grenada:before{background-position:-36px -52px}i.flag.ge:before,i.flag.georgia:before{background-position:-36px -78px}i.flag.french.guiana:before,i.flag.gf:before{background-position:-36px -104px}i.flag.gh:before,i.flag.ghana:before{background-position:-36px -130px}i.flag.gi:before,i.flag.gibraltar:before{background-position:-36px -156px}i.flag.gl:before,i.flag.greenland:before{background-position:-36px -182px}i.flag.gambia:before,i.flag.gm:before{background-position:-36px -208px}i.flag.gn:before,i.flag.guinea:before{background-position:-36px -234px}i.flag.gp:before,i.flag.guadeloupe:before{background-position:-36px -260px}i.flag.equatorial.guinea:before,i.flag.gq:before{background-position:-36px -286px}i.flag.gr:before,i.flag.greece:before{background-position:-36px -312px}i.flag.gs:before,i.flag.sandwich.islands:before{background-position:-36px -338px}i.flag.gt:before,i.flag.guatemala:before{background-position:-36px -364px}i.flag.gu:before,i.flag.guam:before{background-position:-36px -390px}i.flag.guinea-bissau:before,i.flag.gw:before{background-position:-36px -416px}i.flag.guyana:before,i.flag.gy:before{background-position:-36px -442px}i.flag.hk:before,i.flag.hong.kong:before{background-position:-36px -468px}i.flag.heard.island:before,i.flag.hm:before{background-position:-36px -494px}i.flag.hn:before,i.flag.honduras:before{background-position:-36px -520px}i.flag.croatia:before,i.flag.hr:before{background-position:-36px -546px}i.flag.haiti:before,i.flag.ht:before{background-position:-36px -572px}i.flag.hu:before,i.flag.hungary:before{background-position:-36px -598px}i.flag.id:before,i.flag.indonesia:before{background-position:-36px -624px}i.flag.ie:before,i.flag.ireland:before{background-position:-36px -650px}i.flag.il:before,i.flag.israel:before{background-position:-36px -676px}i.flag.in:before,i.flag.india:before{background-position:-36px -702px}i.flag.indian.ocean.territory:before,i.flag.io:before{background-position:-36px -728px}i.flag.iq:before,i.flag.iraq:before{background-position:-36px -754px}i.flag.ir:before,i.flag.iran:before{background-position:-36px -780px}i.flag.iceland:before,i.flag.is:before{background-position:-36px -806px}i.flag.it:before,i.flag.italy:before{background-position:-36px -832px}i.flag.jamaica:before,i.flag.jm:before{background-position:-36px -858px}i.flag.jo:before,i.flag.jordan:before{background-position:-36px -884px}i.flag.japan:before,i.flag.jp:before{background-position:-36px -910px}i.flag.ke:before,i.flag.kenya:before{background-position:-36px -936px}i.flag.kg:before,i.flag.kyrgyzstan:before{background-position:-36px -962px}i.flag.cambodia:before,i.flag.kh:before{background-position:-36px -988px}i.flag.ki:before,i.flag.kiribati:before{background-position:-36px -1014px}i.flag.comoros:before,i.flag.km:before{background-position:-36px -1040px}i.flag.kn:before,i.flag.saint.kitts.and.nevis:before{background-position:-36px -1066px}i.flag.kp:before,i.flag.north.korea:before{background-position:-36px -1092px}i.flag.kr:before,i.flag.south.korea:before{background-position:-36px -1118px}i.flag.kuwait:before,i.flag.kw:before{background-position:-36px -1144px}i.flag.cayman.islands:before,i.flag.ky:before{background-position:-36px -1170px}i.flag.kazakhstan:before,i.flag.kz:before{background-position:-36px -1196px}i.flag.la:before,i.flag.laos:before{background-position:-36px -1222px}i.flag.lb:before,i.flag.lebanon:before{background-position:-36px -1248px}i.flag.lc:before,i.flag.saint.lucia:before{background-position:-36px -1274px}i.flag.li:before,i.flag.liechtenstein:before{background-position:-36px -1300px}i.flag.lk:before,i.flag.sri.lanka:before{background-position:-36px -1326px}i.flag.liberia:before,i.flag.lr:before{background-position:-36px -1352px}i.flag.lesotho:before,i.flag.ls:before{background-position:-36px -1378px}i.flag.lithuania:before,i.flag.lt:before{background-position:-36px -1404px}i.flag.lu:before,i.flag.luxembourg:before{background-position:-36px -1430px}i.flag.latvia:before,i.flag.lv:before{background-position:-36px -1456px}i.flag.libya:before,i.flag.ly:before{background-position:-36px -1482px}i.flag.ma:before,i.flag.morocco:before{background-position:-36px -1508px}i.flag.mc:before,i.flag.monaco:before{background-position:-36px -1534px}i.flag.md:before,i.flag.moldova:before{background-position:-36px -1560px}i.flag.me:before,i.flag.montenegro:before{background-position:-36px -1586px}i.flag.madagascar:before,i.flag.mg:before{background-position:-36px -1613px}i.flag.marshall.islands:before,i.flag.mh:before{background-position:-36px -1639px}i.flag.macedonia:before,i.flag.mk:before{background-position:-36px -1665px}i.flag.mali:before,i.flag.ml:before{background-position:-36px -1691px}i.flag.burma:before,i.flag.mm:before,i.flag.myanmar:before{background-position:-36px -1717px}i.flag.mn:before,i.flag.mongolia:before{background-position:-36px -1743px}i.flag.macau:before,i.flag.mo:before{background-position:-36px -1769px}i.flag.mp:before,i.flag.northern.mariana.islands:before{background-position:-36px -1795px}i.flag.martinique:before,i.flag.mq:before{background-position:-36px -1821px}i.flag.mauritania:before,i.flag.mr:before{background-position:-36px -1847px}i.flag.montserrat:before,i.flag.ms:before{background-position:-36px -1873px}i.flag.malta:before,i.flag.mt:before{background-position:-36px -1899px}i.flag.mauritius:before,i.flag.mu:before{background-position:-36px -1925px}i.flag.maldives:before,i.flag.mv:before{background-position:-36px -1951px}i.flag.malawi:before,i.flag.mw:before{background-position:-36px -1977px}i.flag.mexico:before,i.flag.mx:before{background-position:-72px 0}i.flag.malaysia:before,i.flag.my:before{background-position:-72px -26px}i.flag.mozambique:before,i.flag.mz:before{background-position:-72px -52px}i.flag.na:before,i.flag.namibia:before{background-position:-72px -78px}i.flag.nc:before,i.flag.new.caledonia:before{background-position:-72px -104px}i.flag.ne:before,i.flag.niger:before{background-position:-72px -130px}i.flag.nf:before,i.flag.norfolk.island:before{background-position:-72px -156px}i.flag.ng:before,i.flag.nigeria:before{background-position:-72px -182px}i.flag.ni:before,i.flag.nicaragua:before{background-position:-72px -208px}i.flag.netherlands:before,i.flag.nl:before{background-position:-72px -234px}i.flag.no:before,i.flag.norway:before{background-position:-72px -260px}i.flag.nepal:before,i.flag.np:before{background-position:-72px -286px}i.flag.nauru:before,i.flag.nr:before{background-position:-72px -312px}i.flag.niue:before,i.flag.nu:before{background-position:-72px -338px}i.flag.new.zealand:before,i.flag.nz:before{background-position:-72px -364px}i.flag.om:before,i.flag.oman:before{background-position:-72px -390px}i.flag.pa:before,i.flag.panama:before{background-position:-72px -416px}i.flag.pe:before,i.flag.peru:before{background-position:-72px -442px}i.flag.french.polynesia:before,i.flag.pf:before{background-position:-72px -468px}i.flag.new.guinea:before,i.flag.pg:before{background-position:-72px -494px}i.flag.ph:before,i.flag.philippines:before{background-position:-72px -520px}i.flag.pakistan:before,i.flag.pk:before{background-position:-72px -546px}i.flag.pl:before,i.flag.poland:before{background-position:-72px -572px}i.flag.pm:before,i.flag.saint.pierre:before{background-position:-72px -598px}i.flag.pitcairn.islands:before,i.flag.pn:before{background-position:-72px -624px}i.flag.pr:before,i.flag.puerto.rico:before{background-position:-72px -650px}i.flag.palestine:before,i.flag.ps:before{background-position:-72px -676px}i.flag.portugal:before,i.flag.pt:before{background-position:-72px -702px}i.flag.palau:before,i.flag.pw:before{background-position:-72px -728px}i.flag.paraguay:before,i.flag.py:before{background-position:-72px -754px}i.flag.qa:before,i.flag.qatar:before{background-position:-72px -780px}i.flag.re:before,i.flag.reunion:before{background-position:-72px -806px}i.flag.ro:before,i.flag.romania:before{background-position:-72px -832px}i.flag.rs:before,i.flag.serbia:before{background-position:-72px -858px}i.flag.ru:before,i.flag.russia:before{background-position:-72px -884px}i.flag.rw:before,i.flag.rwanda:before{background-position:-72px -910px}i.flag.sa:before,i.flag.saudi.arabia:before{background-position:-72px -936px}i.flag.sb:before,i.flag.solomon.islands:before{background-position:-72px -962px}i.flag.sc:before,i.flag.seychelles:before{background-position:-72px -988px}i.flag.gb.sct:before,i.flag.scotland:before{background-position:-72px -1014px}i.flag.sd:before,i.flag.sudan:before{background-position:-72px -1040px}i.flag.se:before,i.flag.sweden:before{background-position:-72px -1066px}i.flag.sg:before,i.flag.singapore:before{background-position:-72px -1092px}i.flag.saint.helena:before,i.flag.sh:before{background-position:-72px -1118px}i.flag.si:before,i.flag.slovenia:before{background-position:-72px -1144px}i.flag.jan.mayen:before,i.flag.sj:before,i.flag.svalbard:before{background-position:-72px -1170px}i.flag.sk:before,i.flag.slovakia:before{background-position:-72px -1196px}i.flag.sierra.leone:before,i.flag.sl:before{background-position:-72px -1222px}i.flag.san.marino:before,i.flag.sm:before{background-position:-72px -1248px}i.flag.senegal:before,i.flag.sn:before{background-position:-72px -1274px}i.flag.so:before,i.flag.somalia:before{background-position:-72px -1300px}i.flag.sr:before,i.flag.suriname:before{background-position:-72px -1326px}i.flag.sao.tome:before,i.flag.st:before{background-position:-72px -1352px}i.flag.el.salvador:before,i.flag.sv:before{background-position:-72px -1378px}i.flag.sy:before,i.flag.syria:before{background-position:-72px -1404px}i.flag.swaziland:before,i.flag.sz:before{background-position:-72px -1430px}i.flag.caicos.islands:before,i.flag.tc:before{background-position:-72px -1456px}i.flag.chad:before,i.flag.td:before{background-position:-72px -1482px}i.flag.french.territories:before,i.flag.tf:before{background-position:-72px -1508px}i.flag.tg:before,i.flag.togo:before{background-position:-72px -1534px}i.flag.th:before,i.flag.thailand:before{background-position:-72px -1560px}i.flag.tajikistan:before,i.flag.tj:before{background-position:-72px -1586px}i.flag.tk:before,i.flag.tokelau:before{background-position:-72px -1612px}i.flag.timorleste:before,i.flag.tl:before{background-position:-72px -1638px}i.flag.tm:before,i.flag.turkmenistan:before{background-position:-72px -1664px}i.flag.tn:before,i.flag.tunisia:before{background-position:-72px -1690px}i.flag.to:before,i.flag.tonga:before{background-position:-72px -1716px}i.flag.tr:before,i.flag.turkey:before{background-position:-72px -1742px}i.flag.trinidad:before,i.flag.tt:before{background-position:-72px -1768px}i.flag.tuvalu:before,i.flag.tv:before{background-position:-72px -1794px}i.flag.taiwan:before,i.flag.tw:before{background-position:-72px -1820px}i.flag.tanzania:before,i.flag.tz:before{background-position:-72px -1846px}i.flag.ua:before,i.flag.ukraine:before{background-position:-72px -1872px}i.flag.ug:before,i.flag.uganda:before{background-position:-72px -1898px}i.flag.um:before,i.flag.us.minor.islands:before{background-position:-72px -1924px}i.flag.america:before,i.flag.united.states:before,i.flag.us:before{background-position:-72px -1950px}i.flag.uruguay:before,i.flag.uy:before{background-position:-72px -1976px}i.flag.uz:before,i.flag.uzbekistan:before{background-position:-108px 0}i.flag.va:before,i.flag.vatican.city:before{background-position:-108px -26px}i.flag.saint.vincent:before,i.flag.vc:before{background-position:-108px -52px}i.flag.ve:before,i.flag.venezuela:before{background-position:-108px -78px}i.flag.british.virgin.islands:before,i.flag.vg:before{background-position:-108px -104px}i.flag.us.virgin.islands:before,i.flag.vi:before{background-position:-108px -130px}i.flag.vietnam:before,i.flag.vn:before{background-position:-108px -156px}i.flag.vanuatu:before,i.flag.vu:before{background-position:-108px -182px}i.flag.gb.wls:before,i.flag.wales:before{background-position:-108px -208px}i.flag.wallis.and.futuna:before,i.flag.wf:before{background-position:-108px -234px}i.flag.samoa:before,i.flag.ws:before{background-position:-108px -260px}i.flag.ye:before,i.flag.yemen:before{background-position:-108px -286px}i.flag.mayotte:before,i.flag.yt:before{background-position:-108px -312px}i.flag.south.africa:before,i.flag.za:before{background-position:-108px -338px}i.flag.zambia:before,i.flag.zm:before{background-position:-108px -364px}i.flag.zimbabwe:before,i.flag.zw:before{background-position:-108px -390px}/*! + * # Fomantic-UI - Header + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.header{border:none;margin:calc(2rem - .1428571428571429em) 0 1rem;padding:0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;line-height:1.28571429em;text-transform:none;color:rgba(0,0,0,.87)}.ui.header:first-child{margin-top:-.14285714em}.ui.header:last-child{margin-bottom:0}.ui.header .sub.header{display:block;font-weight:400;padding:0;margin:0;font-size:1rem;line-height:1.2em;color:rgba(0,0,0,.6)}.ui.header>.icon{display:table-cell;opacity:1;font-size:1.5em;padding-top:0;vertical-align:middle}.ui.header .icon:only-child{display:inline-block;padding:0;margin-right:.75rem}.ui.header>.image:not(.icon),.ui.header>img{display:inline-block;margin-top:.14285714em;width:2.5em;height:auto;vertical-align:middle}.ui.header>.image:not(.icon):only-child,.ui.header>img:only-child{margin-right:.75rem}.ui.header .content{display:inline-block;vertical-align:top}.ui.header>.image+.content,.ui.header>img+.content{padding-left:.75rem;vertical-align:middle}.ui.header>.icon+.content{padding-left:.75rem;display:table-cell;vertical-align:middle}.ui.header .ui.label{font-size:'';margin-left:.5rem;vertical-align:middle}.ui.header+p{margin-top:0}h1.ui.header{font-size:2rem}h1.ui.header .sub.header{font-size:1.14285714rem}h2.ui.header{font-size:1.71428571rem}h2.ui.header .sub.header{font-size:1.14285714rem}h3.ui.header{font-size:1.28571429rem}h3.ui.header .sub.header{font-size:1rem}h4.ui.header{font-size:1.07142857rem}h4.ui.header .sub.header{font-size:1rem}h5.ui.header{font-size:1rem}h5.ui.header .sub.header{font-size:.92857143rem}h6.ui.header{font-size:.85714286rem}h6.ui.header .sub.header{font-size:.92857143rem}.ui.mini.header{font-size:.85714286em}.ui.mini.header .sub.header{font-size:.92857143rem}.ui.mini.sub.header{font-size:.78571429em}.ui.tiny.header{font-size:1em}.ui.tiny.header .sub.header{font-size:.92857143rem}.ui.tiny.sub.header{font-size:.78571429em}.ui.small.header{font-size:1.07142857em}.ui.small.header .sub.header{font-size:1rem}.ui.small.sub.header{font-size:.78571429em}.ui.large.header{font-size:1.71428571em}.ui.large.header .sub.header{font-size:1.14285714rem}.ui.large.sub.header{font-size:.92857143em}.ui.big.header{font-size:1.85714286em}.ui.big.header .sub.header{font-size:1.14285714rem}.ui.big.sub.header{font-size:1em}.ui.huge.header{font-size:2em;min-height:1em}.ui.huge.header .sub.header{font-size:1.14285714rem}.ui.huge.sub.header{font-size:1em}.ui.massive.header{font-size:2.28571429em;min-height:1em}.ui.massive.header .sub.header{font-size:1.42857143rem}.ui.massive.sub.header{font-size:1.14285714em}.ui.sub.header{padding:0;margin-bottom:.14285714rem;font-weight:700;font-size:.85714286em;text-transform:uppercase;color:''}.ui.icon.header{display:inline-block;text-align:center;margin:2rem 0 1rem}.ui.icon.header:after{content:'';display:block;height:0;clear:both;visibility:hidden}.ui.icon.header:first-child{margin-top:0}.ui.icon.header .icon{float:none;display:block;width:auto;height:auto;line-height:1;padding:0;font-size:3em;margin:0 auto .5rem;opacity:1}.ui.icon.header .corner.icon{font-size:calc(3em * .45)}.ui.icon.header .content{display:block;padding:0}.ui.icon.header .circular.icon{font-size:2em}.ui.icon.header .square.icon{font-size:2em}.ui.block.icon.header .icon{margin-bottom:0}.ui.icon.header.aligned{margin-left:auto;margin-right:auto;display:block}.ui.disabled.header{opacity:.45}.ui.inverted.header{color:#fff}.ui.inverted.header .sub.header{color:rgba(255,255,255,.8)}.ui.inverted.attached.header{background:#1b1c1d;-webkit-box-shadow:none;box-shadow:none;border-color:transparent}.ui.inverted.block.header{background:#545454 -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#545454 -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#545454 linear-gradient(transparent,rgba(0,0,0,.05));-webkit-box-shadow:none;box-shadow:none;border-bottom:none}.ui.primary.header{color:#2185d0}a.ui.primary.header:hover{color:#1678c2}.ui.primary.dividing.header{border-bottom:2px solid #2185d0}.ui.inverted.primary.header.header.header{color:#54c8ff}a.ui.inverted.primary.header.header.header:hover{color:#21b8ff}.ui.inverted.primary.dividing.header{border-bottom:2px solid #54c8ff}.ui.secondary.header{color:#1b1c1d}a.ui.secondary.header:hover{color:#27292a}.ui.secondary.dividing.header{border-bottom:2px solid #1b1c1d}.ui.inverted.secondary.header.header.header{color:#545454}a.ui.inverted.secondary.header.header.header:hover{color:#6e6e6e}.ui.inverted.secondary.dividing.header{border-bottom:2px solid #545454}.ui.red.header{color:#db2828}a.ui.red.header:hover{color:#d01919}.ui.red.dividing.header{border-bottom:2px solid #db2828}.ui.inverted.red.header.header.header{color:#ff695e}a.ui.inverted.red.header.header.header:hover{color:#ff392b}.ui.inverted.red.dividing.header{border-bottom:2px solid #ff695e}.ui.orange.header{color:#f2711c}a.ui.orange.header:hover{color:#f26202}.ui.orange.dividing.header{border-bottom:2px solid #f2711c}.ui.inverted.orange.header.header.header{color:#ff851b}a.ui.inverted.orange.header.header.header:hover{color:#e76b00}.ui.inverted.orange.dividing.header{border-bottom:2px solid #ff851b}.ui.yellow.header{color:#fbbd08}a.ui.yellow.header:hover{color:#eaae00}.ui.yellow.dividing.header{border-bottom:2px solid #fbbd08}.ui.inverted.yellow.header.header.header{color:#ffe21f}a.ui.inverted.yellow.header.header.header:hover{color:#ebcd00}.ui.inverted.yellow.dividing.header{border-bottom:2px solid #ffe21f}.ui.olive.header{color:#b5cc18}a.ui.olive.header:hover{color:#a7bd0d}.ui.olive.dividing.header{border-bottom:2px solid #b5cc18}.ui.inverted.olive.header.header.header{color:#d9e778}a.ui.inverted.olive.header.header.header:hover{color:#d2e745}.ui.inverted.olive.dividing.header{border-bottom:2px solid #d9e778}.ui.green.header{color:#21ba45}a.ui.green.header:hover{color:#16ab39}.ui.green.dividing.header{border-bottom:2px solid #21ba45}.ui.inverted.green.header.header.header{color:#2ecc40}a.ui.inverted.green.header.header.header:hover{color:#1ea92e}.ui.inverted.green.dividing.header{border-bottom:2px solid #2ecc40}.ui.teal.header{color:#00b5ad}a.ui.teal.header:hover{color:#009c95}.ui.teal.dividing.header{border-bottom:2px solid #00b5ad}.ui.inverted.teal.header.header.header{color:#6dffff}a.ui.inverted.teal.header.header.header:hover{color:#3affff}.ui.inverted.teal.dividing.header{border-bottom:2px solid #6dffff}.ui.blue.header{color:#2185d0}a.ui.blue.header:hover{color:#1678c2}.ui.blue.dividing.header{border-bottom:2px solid #2185d0}.ui.inverted.blue.header.header.header{color:#54c8ff}a.ui.inverted.blue.header.header.header:hover{color:#21b8ff}.ui.inverted.blue.dividing.header{border-bottom:2px solid #54c8ff}.ui.violet.header{color:#6435c9}a.ui.violet.header:hover{color:#5829bb}.ui.violet.dividing.header{border-bottom:2px solid #6435c9}.ui.inverted.violet.header.header.header{color:#a291fb}a.ui.inverted.violet.header.header.header:hover{color:#745aff}.ui.inverted.violet.dividing.header{border-bottom:2px solid #a291fb}.ui.purple.header{color:#a333c8}a.ui.purple.header:hover{color:#9627ba}.ui.purple.dividing.header{border-bottom:2px solid #a333c8}.ui.inverted.purple.header.header.header{color:#dc73ff}a.ui.inverted.purple.header.header.header:hover{color:#cf40ff}.ui.inverted.purple.dividing.header{border-bottom:2px solid #dc73ff}.ui.pink.header{color:#e03997}a.ui.pink.header:hover{color:#e61a8d}.ui.pink.dividing.header{border-bottom:2px solid #e03997}.ui.inverted.pink.header.header.header{color:#ff8edf}a.ui.inverted.pink.header.header.header:hover{color:#ff5bd1}.ui.inverted.pink.dividing.header{border-bottom:2px solid #ff8edf}.ui.brown.header{color:#a5673f}a.ui.brown.header:hover{color:#975b33}.ui.brown.dividing.header{border-bottom:2px solid #a5673f}.ui.inverted.brown.header.header.header{color:#d67c1c}a.ui.inverted.brown.header.header.header:hover{color:#b0620f}.ui.inverted.brown.dividing.header{border-bottom:2px solid #d67c1c}.ui.grey.header{color:#767676}a.ui.grey.header:hover{color:#838383}.ui.grey.dividing.header{border-bottom:2px solid #767676}.ui.inverted.grey.header.header.header{color:#dcddde}a.ui.inverted.grey.header.header.header:hover{color:#c2c4c5}.ui.inverted.grey.dividing.header{border-bottom:2px solid #dcddde}.ui.black.header{color:#1b1c1d}a.ui.black.header:hover{color:#27292a}.ui.black.dividing.header{border-bottom:2px solid #1b1c1d}.ui.inverted.black.header.header.header{color:#545454}a.ui.inverted.black.header.header.header:hover{color:#000}.ui.inverted.black.dividing.header{border-bottom:2px solid #545454}.ui.left.aligned.header{text-align:left}.ui.right.aligned.header{text-align:right}.ui.center.aligned.header,.ui.centered.header{text-align:center}.ui.justified.header{text-align:justify}.ui.justified.header:after{display:inline-block;content:'';width:100%}.ui.floated.header,.ui[class*="left floated"].header{float:left;margin-top:0;margin-right:.5em}.ui[class*="right floated"].header{float:right;margin-top:0;margin-left:.5em}.ui.fitted.header{padding:0}.ui.dividing.header{padding-bottom:.21428571rem;border-bottom:1px solid rgba(34,36,38,.15)}.ui.dividing.header .sub.header{padding-bottom:.21428571rem}.ui.dividing.header .icon{margin-bottom:0}.ui.inverted.dividing.header{border-bottom-color:rgba(255,255,255,.1)}.ui.block.header{background:#f3f4f5;padding:.78571429rem 1rem;-webkit-box-shadow:none;box-shadow:none;border:1px solid #d4d4d5;border-radius:.28571429rem}.ui.block.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6){font-size:1rem}.ui.mini.block.header{font-size:.78571429rem}.ui.tiny.block.header{font-size:.85714286rem}.ui.small.block.header{font-size:.92857143rem}.ui.large.block.header{font-size:1.14285714rem}.ui.big.block.header{font-size:1.28571429rem}.ui.huge.block.header{font-size:1.42857143rem}.ui.massive.block.header{font-size:1.71428571rem}.ui.attached.header{background:#fff;padding:.78571429rem 1rem;margin:0 -1px 0 -1px;-webkit-box-shadow:none;box-shadow:none;border:1px solid #d4d4d5;border-radius:0}.ui.attached.block.header{background:#f3f4f5}.ui.attached:not(.top).header{border-top:none}.ui.top.attached.header{border-radius:.28571429rem .28571429rem 0 0}.ui.bottom.attached.header{border-radius:0 0 .28571429rem .28571429rem}.ui.attached.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6){font-size:1em}.ui.mini.attached.header{font-size:.78571429em}.ui.tiny.attached.header{font-size:.85714286em}.ui.small.attached.header{font-size:.92857143em}.ui.large.attached.header{font-size:1.14285714em}.ui.big.attached.header{font-size:1.28571429em}.ui.huge.attached.header{font-size:1.42857143em}.ui.massive.attached.header{font-size:1.71428571em}.ui.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6){font-size:1.28571429em}/*! + * # Fomantic-UI - Icon + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */@font-face{font-family:Icons;src:url(themes/default/assets/fonts/icons.eot);src:url(themes/default/assets/fonts/icons.eot?#iefix) format('embedded-opentype'),url(themes/default/assets/fonts/icons.woff2) format('woff2'),url(themes/default/assets/fonts/icons.woff) format('woff'),url(themes/default/assets/fonts/icons.ttf) format('truetype'),url(themes/default/assets/fonts/icons.svg#icons) format('svg');font-style:normal;font-weight:400;font-variant:normal;text-decoration:inherit;text-transform:none}i.icon{display:inline-block;opacity:1;margin:0 .25rem 0 0;width:1.18em;height:1em;font-family:Icons;font-style:normal;font-weight:400;text-decoration:inherit;text-align:center;speak:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;-webkit-backface-visibility:hidden;backface-visibility:hidden}i.icon:before{background:0 0!important}i.icon.loading{height:1em;line-height:1;-webkit-animation:loader 2s linear infinite;animation:loader 2s linear infinite}i.emphasized.icon:not(.disabled),i.emphasized.icons:not(.disabled),i.icon:active,i.icon:hover,i.icons:active,i.icons:hover{opacity:1}i.disabled.icon,i.disabled.icons{opacity:.45;cursor:default;pointer-events:none}i.fitted.icon{width:auto;margin:0!important}i.link.icon:not(.disabled),i.link.icons:not(.disabled){cursor:pointer;opacity:.8;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}i.link.icon:hover,i.link.icons:hover{opacity:1}i.circular.icon{border-radius:500em!important;line-height:1!important;padding:.5em 0!important;-webkit-box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset;box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset;width:2em!important;height:2em!important}i.circular.inverted.icon{border:none;-webkit-box-shadow:none;box-shadow:none}i.flipped.icon,i.horizontally.flipped.icon{-webkit-transform:scale(-1,1);transform:scale(-1,1)}i.vertically.flipped.icon{-webkit-transform:scale(1,-1);transform:scale(1,-1)}i.clockwise.rotated.icon,i.right.rotated.icon,i.rotated.icon{-webkit-transform:rotate(90deg);transform:rotate(90deg)}i.counterclockwise.rotated.icon,i.left.rotated.icon{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}i.halfway.rotated.icon{-webkit-transform:rotate(180deg);transform:rotate(180deg)}i.clockwise.rotated.flipped.icon,i.right.rotated.flipped.icon,i.rotated.flipped.icon{-webkit-transform:scale(-1,1) rotate(90deg);transform:scale(-1,1) rotate(90deg)}i.counterclockwise.rotated.flipped.icon,i.left.rotated.flipped.icon{-webkit-transform:scale(-1,1) rotate(-90deg);transform:scale(-1,1) rotate(-90deg)}i.halfway.rotated.flipped.icon{-webkit-transform:scale(-1,1) rotate(180deg);transform:scale(-1,1) rotate(180deg)}i.clockwise.rotated.vertically.flipped.icon,i.right.rotated.vertically.flipped.icon,i.rotated.vertically.flipped.icon{-webkit-transform:scale(1,-1) rotate(90deg);transform:scale(1,-1) rotate(90deg)}i.counterclockwise.rotated.vertically.flipped.icon,i.left.rotated.vertically.flipped.icon{-webkit-transform:scale(1,-1) rotate(-90deg);transform:scale(1,-1) rotate(-90deg)}i.halfway.rotated.vertically.flipped.icon{-webkit-transform:scale(1,-1) rotate(180deg);transform:scale(1,-1) rotate(180deg)}i.bordered.icon{line-height:1;vertical-align:baseline;width:2em;height:2em;padding:.5em 0!important;-webkit-box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset;box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset}i.bordered.inverted.icon{border:none;-webkit-box-shadow:none;box-shadow:none}i.inverted.bordered.icon,i.inverted.circular.icon{background-color:#1b1c1d;color:#fff}i.inverted.icon{color:#fff}i.primary.icon.icon.icon.icon{color:#2185d0}i.inverted.primary.icon.icon.icon.icon{color:#54c8ff}i.inverted.bordered.primary.icon.icon.icon.icon,i.inverted.circular.primary.icon.icon.icon.icon{background-color:#2185d0;color:#fff}i.secondary.icon.icon.icon.icon{color:#1b1c1d}i.inverted.secondary.icon.icon.icon.icon{color:#545454}i.inverted.bordered.secondary.icon.icon.icon.icon,i.inverted.circular.secondary.icon.icon.icon.icon{background-color:#1b1c1d;color:#fff}i.red.icon.icon.icon.icon{color:#db2828}i.inverted.red.icon.icon.icon.icon{color:#ff695e}i.inverted.bordered.red.icon.icon.icon.icon,i.inverted.circular.red.icon.icon.icon.icon{background-color:#db2828;color:#fff}i.orange.icon.icon.icon.icon{color:#f2711c}i.inverted.orange.icon.icon.icon.icon{color:#ff851b}i.inverted.bordered.orange.icon.icon.icon.icon,i.inverted.circular.orange.icon.icon.icon.icon{background-color:#f2711c;color:#fff}i.yellow.icon.icon.icon.icon{color:#fbbd08}i.inverted.yellow.icon.icon.icon.icon{color:#ffe21f}i.inverted.bordered.yellow.icon.icon.icon.icon,i.inverted.circular.yellow.icon.icon.icon.icon{background-color:#fbbd08;color:#fff}i.olive.icon.icon.icon.icon{color:#b5cc18}i.inverted.olive.icon.icon.icon.icon{color:#d9e778}i.inverted.bordered.olive.icon.icon.icon.icon,i.inverted.circular.olive.icon.icon.icon.icon{background-color:#b5cc18;color:#fff}i.green.icon.icon.icon.icon{color:#21ba45}i.inverted.green.icon.icon.icon.icon{color:#2ecc40}i.inverted.bordered.green.icon.icon.icon.icon,i.inverted.circular.green.icon.icon.icon.icon{background-color:#21ba45;color:#fff}i.teal.icon.icon.icon.icon{color:#00b5ad}i.inverted.teal.icon.icon.icon.icon{color:#6dffff}i.inverted.bordered.teal.icon.icon.icon.icon,i.inverted.circular.teal.icon.icon.icon.icon{background-color:#00b5ad;color:#fff}i.blue.icon.icon.icon.icon{color:#2185d0}i.inverted.blue.icon.icon.icon.icon{color:#54c8ff}i.inverted.bordered.blue.icon.icon.icon.icon,i.inverted.circular.blue.icon.icon.icon.icon{background-color:#2185d0;color:#fff}i.violet.icon.icon.icon.icon{color:#6435c9}i.inverted.violet.icon.icon.icon.icon{color:#a291fb}i.inverted.bordered.violet.icon.icon.icon.icon,i.inverted.circular.violet.icon.icon.icon.icon{background-color:#6435c9;color:#fff}i.purple.icon.icon.icon.icon{color:#a333c8}i.inverted.purple.icon.icon.icon.icon{color:#dc73ff}i.inverted.bordered.purple.icon.icon.icon.icon,i.inverted.circular.purple.icon.icon.icon.icon{background-color:#a333c8;color:#fff}i.pink.icon.icon.icon.icon{color:#e03997}i.inverted.pink.icon.icon.icon.icon{color:#ff8edf}i.inverted.bordered.pink.icon.icon.icon.icon,i.inverted.circular.pink.icon.icon.icon.icon{background-color:#e03997;color:#fff}i.brown.icon.icon.icon.icon{color:#a5673f}i.inverted.brown.icon.icon.icon.icon{color:#d67c1c}i.inverted.bordered.brown.icon.icon.icon.icon,i.inverted.circular.brown.icon.icon.icon.icon{background-color:#a5673f;color:#fff}i.grey.icon.icon.icon.icon{color:#767676}i.inverted.grey.icon.icon.icon.icon{color:#dcddde}i.inverted.bordered.grey.icon.icon.icon.icon,i.inverted.circular.grey.icon.icon.icon.icon{background-color:#767676;color:#fff}i.black.icon.icon.icon.icon{color:#1b1c1d}i.inverted.black.icon.icon.icon.icon{color:#545454}i.inverted.bordered.black.icon.icon.icon.icon,i.inverted.circular.black.icon.icon.icon.icon{background-color:#1b1c1d;color:#fff}i.icon,i.icons{font-size:1em}i.mini.mini.mini.icon,i.mini.mini.mini.icons{line-height:1;vertical-align:middle;font-size:.4em}i.tiny.tiny.tiny.icon,i.tiny.tiny.tiny.icons{line-height:1;vertical-align:middle;font-size:.5em}i.small.small.small.icon,i.small.small.small.icons{line-height:1;vertical-align:middle;font-size:.75em}i.large.large.large.icon,i.large.large.large.icons{line-height:1;vertical-align:middle;font-size:1.5em}i.big.big.big.icon,i.big.big.big.icons{line-height:1;vertical-align:middle;font-size:2em}i.huge.huge.huge.icon,i.huge.huge.huge.icons{line-height:1;vertical-align:middle;font-size:4em}i.massive.massive.massive.icon,i.massive.massive.massive.icons{line-height:1;vertical-align:middle;font-size:8em}i.icons{display:inline-block;position:relative;line-height:1}i.icons .icon{position:absolute;top:50%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);margin:0}i.icons .icon:first-child{position:static;width:auto;height:auto;vertical-align:top;-webkit-transform:none;transform:none}i.icons .corner.icon{top:auto;left:auto;right:0;bottom:0;-webkit-transform:none;transform:none;font-size:.45em;text-shadow:-1px -1px 0 #fff,1px -1px 0 #fff,-1px 1px 0 #fff,1px 1px 0 #fff}i.icons .icon.corner[class*="top right"]{top:0;left:auto;right:0;bottom:auto}i.icons .icon.corner[class*="top left"]{top:0;left:0;right:auto;bottom:auto}i.icons .icon.corner[class*="bottom left"]{top:auto;left:0;right:auto;bottom:0}i.icons .icon.corner[class*="bottom right"]{top:auto;left:auto;right:0;bottom:0}i.icons .inverted.corner.icon{text-shadow:-1px -1px 0 #1b1c1d,1px -1px 0 #1b1c1d,-1px 1px 0 #1b1c1d,1px 1px 0 #1b1c1d}i.icon.linkedin.in:before{content:"\f0e1"}i.icon.zoom.in:before{content:"\f00e"}i.icon.zoom.out:before{content:"\f010"}i.icon.sign.in:before{content:"\f2f6"}i.icon.in.cart:before{content:"\f218"}i.icon.log.out:before{content:"\f2f5"}i.icon.sign.out:before{content:"\f2f5"}i.icon.ad:before{content:"\f641"}i.icon.address.book:before{content:"\f2b9"}i.icon.address.card:before{content:"\f2bb"}i.icon.adjust:before{content:"\f042"}i.icon.air.freshener:before{content:"\f5d0"}i.icon.align.center:before{content:"\f037"}i.icon.align.justify:before{content:"\f039"}i.icon.align.left:before{content:"\f036"}i.icon.align.right:before{content:"\f038"}i.icon.allergies:before{content:"\f461"}i.icon.ambulance:before{content:"\f0f9"}i.icon.american.sign.language.interpreting:before{content:"\f2a3"}i.icon.anchor:before{content:"\f13d"}i.icon.angle.double.down:before{content:"\f103"}i.icon.angle.double.left:before{content:"\f100"}i.icon.angle.double.right:before{content:"\f101"}i.icon.angle.double.up:before{content:"\f102"}i.icon.angle.down:before{content:"\f107"}i.icon.angle.left:before{content:"\f104"}i.icon.angle.right:before{content:"\f105"}i.icon.angle.up:before{content:"\f106"}i.icon.angry:before{content:"\f556"}i.icon.ankh:before{content:"\f644"}i.icon.archive:before{content:"\f187"}i.icon.archway:before{content:"\f557"}i.icon.arrow.alternate.circle.down:before{content:"\f358"}i.icon.arrow.alternate.circle.left:before{content:"\f359"}i.icon.arrow.alternate.circle.right:before{content:"\f35a"}i.icon.arrow.alternate.circle.up:before{content:"\f35b"}i.icon.arrow.circle.down:before{content:"\f0ab"}i.icon.arrow.circle.left:before{content:"\f0a8"}i.icon.arrow.circle.right:before{content:"\f0a9"}i.icon.arrow.circle.up:before{content:"\f0aa"}i.icon.arrow.left:before{content:"\f060"}i.icon.arrow.right:before{content:"\f061"}i.icon.arrow.up:before{content:"\f062"}i.icon.arrow.down:before{content:"\f063"}i.icon.arrows.alternate:before{content:"\f0b2"}i.icon.arrows.alternate.horizontal:before{content:"\f337"}i.icon.arrows.alternate.vertical:before{content:"\f338"}i.icon.assistive.listening.systems:before{content:"\f2a2"}i.icon.asterisk:before{content:"\f069"}i.icon.at:before{content:"\f1fa"}i.icon.atlas:before{content:"\f558"}i.icon.atom:before{content:"\f5d2"}i.icon.audio.description:before{content:"\f29e"}i.icon.award:before{content:"\f559"}i.icon.baby:before{content:"\f77c"}i.icon.baby.carriage:before{content:"\f77d"}i.icon.backspace:before{content:"\f55a"}i.icon.backward:before{content:"\f04a"}i.icon.bacon:before{content:"\f7e5"}i.icon.bahai:before{content:"\f666"}i.icon.balance.scale:before{content:"\f24e"}i.icon.balance.scale.left:before{content:"\f515"}i.icon.balance.scale.right:before{content:"\f516"}i.icon.ban:before{content:"\f05e"}i.icon.band.aid:before{content:"\f462"}i.icon.barcode:before{content:"\f02a"}i.icon.bars:before{content:"\f0c9"}i.icon.baseball.ball:before{content:"\f433"}i.icon.basketball.ball:before{content:"\f434"}i.icon.bath:before{content:"\f2cd"}i.icon.battery.empty:before{content:"\f244"}i.icon.battery.full:before{content:"\f240"}i.icon.battery.half:before{content:"\f242"}i.icon.battery.quarter:before{content:"\f243"}i.icon.battery.three.quarters:before{content:"\f241"}i.icon.bed:before{content:"\f236"}i.icon.beer:before{content:"\f0fc"}i.icon.bell:before{content:"\f0f3"}i.icon.bell.slash:before{content:"\f1f6"}i.icon.bezier.curve:before{content:"\f55b"}i.icon.bible:before{content:"\f647"}i.icon.bicycle:before{content:"\f206"}i.icon.biking:before{content:"\f84a"}i.icon.binoculars:before{content:"\f1e5"}i.icon.biohazard:before{content:"\f780"}i.icon.birthday.cake:before{content:"\f1fd"}i.icon.blender:before{content:"\f517"}i.icon.blender.phone:before{content:"\f6b6"}i.icon.blind:before{content:"\f29d"}i.icon.blog:before{content:"\f781"}i.icon.bold:before{content:"\f032"}i.icon.bolt:before{content:"\f0e7"}i.icon.bomb:before{content:"\f1e2"}i.icon.bone:before{content:"\f5d7"}i.icon.bong:before{content:"\f55c"}i.icon.book:before{content:"\f02d"}i.icon.book.dead:before{content:"\f6b7"}i.icon.book.medical:before{content:"\f7e6"}i.icon.book.open:before{content:"\f518"}i.icon.book.reader:before{content:"\f5da"}i.icon.bookmark:before{content:"\f02e"}i.icon.border.all:before{content:"\f84c"}i.icon.border.none:before{content:"\f850"}i.icon.border.style:before{content:"\f853"}i.icon.bowling.ball:before{content:"\f436"}i.icon.box:before{content:"\f466"}i.icon.box.open:before{content:"\f49e"}i.icon.boxes:before{content:"\f468"}i.icon.braille:before{content:"\f2a1"}i.icon.brain:before{content:"\f5dc"}i.icon.bread.slice:before{content:"\f7ec"}i.icon.briefcase:before{content:"\f0b1"}i.icon.briefcase.medical:before{content:"\f469"}i.icon.broadcast.tower:before{content:"\f519"}i.icon.broom:before{content:"\f51a"}i.icon.brush:before{content:"\f55d"}i.icon.bug:before{content:"\f188"}i.icon.building:before{content:"\f1ad"}i.icon.bullhorn:before{content:"\f0a1"}i.icon.bullseye:before{content:"\f140"}i.icon.burn:before{content:"\f46a"}i.icon.bus:before{content:"\f207"}i.icon.bus.alternate:before{content:"\f55e"}i.icon.business.time:before{content:"\f64a"}i.icon.calculator:before{content:"\f1ec"}i.icon.calendar:before{content:"\f133"}i.icon.calendar.alternate:before{content:"\f073"}i.icon.calendar.check:before{content:"\f274"}i.icon.calendar.day:before{content:"\f783"}i.icon.calendar.minus:before{content:"\f272"}i.icon.calendar.plus:before{content:"\f271"}i.icon.calendar.times:before{content:"\f273"}i.icon.calendar.week:before{content:"\f784"}i.icon.camera:before{content:"\f030"}i.icon.camera.retro:before{content:"\f083"}i.icon.campground:before{content:"\f6bb"}i.icon.candy.cane:before{content:"\f786"}i.icon.cannabis:before{content:"\f55f"}i.icon.capsules:before{content:"\f46b"}i.icon.car:before{content:"\f1b9"}i.icon.car.alternate:before{content:"\f5de"}i.icon.car.battery:before{content:"\f5df"}i.icon.car.crash:before{content:"\f5e1"}i.icon.car.side:before{content:"\f5e4"}i.icon.caravan:before{content:"\f8ff"}i.icon.caret.down:before{content:"\f0d7"}i.icon.caret.left:before{content:"\f0d9"}i.icon.caret.right:before{content:"\f0da"}i.icon.caret.square.down:before{content:"\f150"}i.icon.caret.square.left:before{content:"\f191"}i.icon.caret.square.right:before{content:"\f152"}i.icon.caret.square.up:before{content:"\f151"}i.icon.caret.up:before{content:"\f0d8"}i.icon.carrot:before{content:"\f787"}i.icon.cart.arrow.down:before{content:"\f218"}i.icon.cart.plus:before{content:"\f217"}i.icon.cash.register:before{content:"\f788"}i.icon.cat:before{content:"\f6be"}i.icon.certificate:before{content:"\f0a3"}i.icon.chair:before{content:"\f6c0"}i.icon.chalkboard:before{content:"\f51b"}i.icon.chalkboard.teacher:before{content:"\f51c"}i.icon.charging.station:before{content:"\f5e7"}i.icon.chart.area:before{content:"\f1fe"}i.icon.chart.bar:before{content:"\f080"}i.icon.chart.line:before{content:"\f201"}i.icon.chart.pie:before{content:"\f200"}i.icon.check:before{content:"\f00c"}i.icon.check.circle:before{content:"\f058"}i.icon.check.double:before{content:"\f560"}i.icon.check.square:before{content:"\f14a"}i.icon.cheese:before{content:"\f7ef"}i.icon.chess:before{content:"\f439"}i.icon.chess.bishop:before{content:"\f43a"}i.icon.chess.board:before{content:"\f43c"}i.icon.chess.king:before{content:"\f43f"}i.icon.chess.knight:before{content:"\f441"}i.icon.chess.pawn:before{content:"\f443"}i.icon.chess.queen:before{content:"\f445"}i.icon.chess.rook:before{content:"\f447"}i.icon.chevron.circle.down:before{content:"\f13a"}i.icon.chevron.circle.left:before{content:"\f137"}i.icon.chevron.circle.right:before{content:"\f138"}i.icon.chevron.circle.up:before{content:"\f139"}i.icon.chevron.down:before{content:"\f078"}i.icon.chevron.left:before{content:"\f053"}i.icon.chevron.right:before{content:"\f054"}i.icon.chevron.up:before{content:"\f077"}i.icon.child:before{content:"\f1ae"}i.icon.church:before{content:"\f51d"}i.icon.circle:before{content:"\f111"}i.icon.circle.notch:before{content:"\f1ce"}i.icon.city:before{content:"\f64f"}i.icon.clinic.medical:before{content:"\f7f2"}i.icon.clipboard:before{content:"\f328"}i.icon.clipboard.check:before{content:"\f46c"}i.icon.clipboard.list:before{content:"\f46d"}i.icon.clock:before{content:"\f017"}i.icon.clone:before{content:"\f24d"}i.icon.closed.captioning:before{content:"\f20a"}i.icon.cloud:before{content:"\f0c2"}i.icon.cloud.download.alternate:before{content:"\f381"}i.icon.cloud.meatball:before{content:"\f73b"}i.icon.cloud.moon:before{content:"\f6c3"}i.icon.cloud.moon.rain:before{content:"\f73c"}i.icon.cloud.rain:before{content:"\f73d"}i.icon.cloud.showers.heavy:before{content:"\f740"}i.icon.cloud.sun:before{content:"\f6c4"}i.icon.cloud.sun.rain:before{content:"\f743"}i.icon.cloud.upload.alternate:before{content:"\f382"}i.icon.cocktail:before{content:"\f561"}i.icon.code:before{content:"\f121"}i.icon.code.branch:before{content:"\f126"}i.icon.coffee:before{content:"\f0f4"}i.icon.cog:before{content:"\f013"}i.icon.cogs:before{content:"\f085"}i.icon.coins:before{content:"\f51e"}i.icon.columns:before{content:"\f0db"}i.icon.comment:before{content:"\f075"}i.icon.comment.alternate:before{content:"\f27a"}i.icon.comment.dollar:before{content:"\f651"}i.icon.comment.dots:before{content:"\f4ad"}i.icon.comment.medical:before{content:"\f7f5"}i.icon.comment.slash:before{content:"\f4b3"}i.icon.comments:before{content:"\f086"}i.icon.comments.dollar:before{content:"\f653"}i.icon.compact.disc:before{content:"\f51f"}i.icon.compass:before{content:"\f14e"}i.icon.compress:before{content:"\f066"}i.icon.compress.alternate:before{content:"\f422"}i.icon.compress.arrows.alternate:before{content:"\f78c"}i.icon.concierge.bell:before{content:"\f562"}i.icon.cookie:before{content:"\f563"}i.icon.cookie.bite:before{content:"\f564"}i.icon.copy:before{content:"\f0c5"}i.icon.copyright:before{content:"\f1f9"}i.icon.couch:before{content:"\f4b8"}i.icon.credit.card:before{content:"\f09d"}i.icon.crop:before{content:"\f125"}i.icon.crop.alternate:before{content:"\f565"}i.icon.cross:before{content:"\f654"}i.icon.crosshairs:before{content:"\f05b"}i.icon.crow:before{content:"\f520"}i.icon.crown:before{content:"\f521"}i.icon.crutch:before{content:"\f7f7"}i.icon.cube:before{content:"\f1b2"}i.icon.cubes:before{content:"\f1b3"}i.icon.cut:before{content:"\f0c4"}i.icon.database:before{content:"\f1c0"}i.icon.deaf:before{content:"\f2a4"}i.icon.democrat:before{content:"\f747"}i.icon.desktop:before{content:"\f108"}i.icon.dharmachakra:before{content:"\f655"}i.icon.diagnoses:before{content:"\f470"}i.icon.dice:before{content:"\f522"}i.icon.dice.d20:before{content:"\f6cf"}i.icon.dice.d6:before{content:"\f6d1"}i.icon.dice.five:before{content:"\f523"}i.icon.dice.four:before{content:"\f524"}i.icon.dice.one:before{content:"\f525"}i.icon.dice.six:before{content:"\f526"}i.icon.dice.three:before{content:"\f527"}i.icon.dice.two:before{content:"\f528"}i.icon.digital.tachograph:before{content:"\f566"}i.icon.directions:before{content:"\f5eb"}i.icon.divide:before{content:"\f529"}i.icon.dizzy:before{content:"\f567"}i.icon.dna:before{content:"\f471"}i.icon.dog:before{content:"\f6d3"}i.icon.dollar.sign:before{content:"\f155"}i.icon.dolly:before{content:"\f472"}i.icon.dolly.flatbed:before{content:"\f474"}i.icon.donate:before{content:"\f4b9"}i.icon.door.closed:before{content:"\f52a"}i.icon.door.open:before{content:"\f52b"}i.icon.dot.circle:before{content:"\f192"}i.icon.dove:before{content:"\f4ba"}i.icon.download:before{content:"\f019"}i.icon.drafting.compass:before{content:"\f568"}i.icon.dragon:before{content:"\f6d5"}i.icon.draw.polygon:before{content:"\f5ee"}i.icon.drum:before{content:"\f569"}i.icon.drum.steelpan:before{content:"\f56a"}i.icon.drumstick.bite:before{content:"\f6d7"}i.icon.dumbbell:before{content:"\f44b"}i.icon.dumpster:before{content:"\f793"}i.icon.dumpster.fire:before{content:"\f794"}i.icon.dungeon:before{content:"\f6d9"}i.icon.edit:before{content:"\f044"}i.icon.egg:before{content:"\f7fb"}i.icon.eject:before{content:"\f052"}i.icon.ellipsis.horizontal:before{content:"\f141"}i.icon.ellipsis.vertical:before{content:"\f142"}i.icon.envelope:before{content:"\f0e0"}i.icon.envelope.open:before{content:"\f2b6"}i.icon.envelope.open.text:before{content:"\f658"}i.icon.envelope.square:before{content:"\f199"}i.icon.equals:before{content:"\f52c"}i.icon.eraser:before{content:"\f12d"}i.icon.ethernet:before{content:"\f796"}i.icon.euro.sign:before{content:"\f153"}i.icon.exchange.alternate:before{content:"\f362"}i.icon.exclamation:before{content:"\f12a"}i.icon.exclamation.circle:before{content:"\f06a"}i.icon.exclamation.triangle:before{content:"\f071"}i.icon.expand:before{content:"\f065"}i.icon.expand.alternate:before{content:"\f424"}i.icon.expand.arrows.alternate:before{content:"\f31e"}i.icon.external.alternate:before{content:"\f35d"}i.icon.external.link.square.alternate:before{content:"\f360"}i.icon.eye:before{content:"\f06e"}i.icon.eye.dropper:before{content:"\f1fb"}i.icon.eye.slash:before{content:"\f070"}i.icon.fan:before{content:"\f863"}i.icon.fast.backward:before{content:"\f049"}i.icon.fast.forward:before{content:"\f050"}i.icon.fax:before{content:"\f1ac"}i.icon.feather:before{content:"\f52d"}i.icon.feather.alternate:before{content:"\f56b"}i.icon.female:before{content:"\f182"}i.icon.fighter.jet:before{content:"\f0fb"}i.icon.file:before{content:"\f15b"}i.icon.file.alternate:before{content:"\f15c"}i.icon.file.archive:before{content:"\f1c6"}i.icon.file.audio:before{content:"\f1c7"}i.icon.file.code:before{content:"\f1c9"}i.icon.file.contract:before{content:"\f56c"}i.icon.file.csv:before{content:"\f6dd"}i.icon.file.download:before{content:"\f56d"}i.icon.file.excel:before{content:"\f1c3"}i.icon.file.export:before{content:"\f56e"}i.icon.file.image:before{content:"\f1c5"}i.icon.file.import:before{content:"\f56f"}i.icon.file.invoice:before{content:"\f570"}i.icon.file.invoice.dollar:before{content:"\f571"}i.icon.file.medical:before{content:"\f477"}i.icon.file.medical.alternate:before{content:"\f478"}i.icon.file.pdf:before{content:"\f1c1"}i.icon.file.powerpoint:before{content:"\f1c4"}i.icon.file.prescription:before{content:"\f572"}i.icon.file.signature:before{content:"\f573"}i.icon.file.upload:before{content:"\f574"}i.icon.file.video:before{content:"\f1c8"}i.icon.file.word:before{content:"\f1c2"}i.icon.fill:before{content:"\f575"}i.icon.fill.drip:before{content:"\f576"}i.icon.film:before{content:"\f008"}i.icon.filter:before{content:"\f0b0"}i.icon.fingerprint:before{content:"\f577"}i.icon.fire:before{content:"\f06d"}i.icon.fire.alternate:before{content:"\f7e4"}i.icon.fire.extinguisher:before{content:"\f134"}i.icon.first.aid:before{content:"\f479"}i.icon.fish:before{content:"\f578"}i.icon.fist.raised:before{content:"\f6de"}i.icon.flag:before{content:"\f024"}i.icon.flag.checkered:before{content:"\f11e"}i.icon.flag.usa:before{content:"\f74d"}i.icon.flask:before{content:"\f0c3"}i.icon.flushed:before{content:"\f579"}i.icon.folder:before{content:"\f07b"}i.icon.folder.minus:before{content:"\f65d"}i.icon.folder.open:before{content:"\f07c"}i.icon.folder.plus:before{content:"\f65e"}i.icon.font:before{content:"\f031"}i.icon.football.ball:before{content:"\f44e"}i.icon.forward:before{content:"\f04e"}i.icon.frog:before{content:"\f52e"}i.icon.frown:before{content:"\f119"}i.icon.frown.open:before{content:"\f57a"}i.icon.fruit-apple:before{content:"\f5d1"}i.icon.funnel.dollar:before{content:"\f662"}i.icon.futbol:before{content:"\f1e3"}i.icon.gamepad:before{content:"\f11b"}i.icon.gas.pump:before{content:"\f52f"}i.icon.gavel:before{content:"\f0e3"}i.icon.gem:before{content:"\f3a5"}i.icon.genderless:before{content:"\f22d"}i.icon.ghost:before{content:"\f6e2"}i.icon.gift:before{content:"\f06b"}i.icon.gifts:before{content:"\f79c"}i.icon.glass.cheers:before{content:"\f79f"}i.icon.glass.martini:before{content:"\f000"}i.icon.glass.martini.alternate:before{content:"\f57b"}i.icon.glass.whiskey:before{content:"\f7a0"}i.icon.glasses:before{content:"\f530"}i.icon.globe:before{content:"\f0ac"}i.icon.globe.africa:before{content:"\f57c"}i.icon.globe.americas:before{content:"\f57d"}i.icon.globe.asia:before{content:"\f57e"}i.icon.globe.europe:before{content:"\f7a2"}i.icon.golf.ball:before{content:"\f450"}i.icon.gopuram:before{content:"\f664"}i.icon.graduation.cap:before{content:"\f19d"}i.icon.greater.than:before{content:"\f531"}i.icon.greater.than.equal:before{content:"\f532"}i.icon.grimace:before{content:"\f57f"}i.icon.grin:before{content:"\f580"}i.icon.grin.alternate:before{content:"\f581"}i.icon.grin.beam:before{content:"\f582"}i.icon.grin.beam.sweat:before{content:"\f583"}i.icon.grin.hearts:before{content:"\f584"}i.icon.grin.squint:before{content:"\f585"}i.icon.grin.squint.tears:before{content:"\f586"}i.icon.grin.stars:before{content:"\f587"}i.icon.grin.tears:before{content:"\f588"}i.icon.grin.tongue:before{content:"\f589"}i.icon.grin.tongue.squint:before{content:"\f58a"}i.icon.grin.tongue.wink:before{content:"\f58b"}i.icon.grin.wink:before{content:"\f58c"}i.icon.grip.horizontal:before{content:"\f58d"}i.icon.grip.lines:before{content:"\f7a4"}i.icon.grip.lines.vertical:before{content:"\f7a5"}i.icon.grip.vertical:before{content:"\f58e"}i.icon.guitar:before{content:"\f7a6"}i.icon.h.square:before{content:"\f0fd"}i.icon.hamburger:before{content:"\f805"}i.icon.hammer:before{content:"\f6e3"}i.icon.hamsa:before{content:"\f665"}i.icon.hand.holding:before{content:"\f4bd"}i.icon.hand.holding.heart:before{content:"\f4be"}i.icon.hand.holding.usd:before{content:"\f4c0"}i.icon.hand.lizard:before{content:"\f258"}i.icon.hand.middle.finger:before{content:"\f806"}i.icon.hand.paper:before{content:"\f256"}i.icon.hand.peace:before{content:"\f25b"}i.icon.hand.point.down:before{content:"\f0a7"}i.icon.hand.point.left:before{content:"\f0a5"}i.icon.hand.point.right:before{content:"\f0a4"}i.icon.hand.point.up:before{content:"\f0a6"}i.icon.hand.pointer:before{content:"\f25a"}i.icon.hand.rock:before{content:"\f255"}i.icon.hand.scissors:before{content:"\f257"}i.icon.hand.spock:before{content:"\f259"}i.icon.hands:before{content:"\f4c2"}i.icon.hands.helping:before{content:"\f4c4"}i.icon.handshake:before{content:"\f2b5"}i.icon.hanukiah:before{content:"\f6e6"}i.icon.hard.hat:before{content:"\f807"}i.icon.hashtag:before{content:"\f292"}i.icon.hat.cowboy:before{content:"\f8c0"}i.icon.hat.cowboy.side:before{content:"\f8c1"}i.icon.hat.wizard:before{content:"\f6e8"}i.icon.hdd:before{content:"\f0a0"}i.icon.heading:before{content:"\f1dc"}i.icon.headphones:before{content:"\f025"}i.icon.headphones.alternate:before{content:"\f58f"}i.icon.headset:before{content:"\f590"}i.icon.heart:before{content:"\f004"}i.icon.heart.broken:before{content:"\f7a9"}i.icon.heartbeat:before{content:"\f21e"}i.icon.helicopter:before{content:"\f533"}i.icon.highlighter:before{content:"\f591"}i.icon.hiking:before{content:"\f6ec"}i.icon.hippo:before{content:"\f6ed"}i.icon.history:before{content:"\f1da"}i.icon.hockey.puck:before{content:"\f453"}i.icon.holly.berry:before{content:"\f7aa"}i.icon.home:before{content:"\f015"}i.icon.horse:before{content:"\f6f0"}i.icon.horse.head:before{content:"\f7ab"}i.icon.hospital:before{content:"\f0f8"}i.icon.hospital.alternate:before{content:"\f47d"}i.icon.hospital.symbol:before{content:"\f47e"}i.icon.hot.tub:before{content:"\f593"}i.icon.hotdog:before{content:"\f80f"}i.icon.hotel:before{content:"\f594"}i.icon.hourglass:before{content:"\f254"}i.icon.hourglass.end:before{content:"\f253"}i.icon.hourglass.half:before{content:"\f252"}i.icon.hourglass.start:before{content:"\f251"}i.icon.house.damage:before{content:"\f6f1"}i.icon.hryvnia:before{content:"\f6f2"}i.icon.i.cursor:before{content:"\f246"}i.icon.ice.cream:before{content:"\f810"}i.icon.icicles:before{content:"\f7ad"}i.icon.icons:before{content:"\f86d"}i.icon.id.badge:before{content:"\f2c1"}i.icon.id.card:before{content:"\f2c2"}i.icon.id.card.alternate:before{content:"\f47f"}i.icon.igloo:before{content:"\f7ae"}i.icon.image:before{content:"\f03e"}i.icon.images:before{content:"\f302"}i.icon.inbox:before{content:"\f01c"}i.icon.indent:before{content:"\f03c"}i.icon.industry:before{content:"\f275"}i.icon.infinity:before{content:"\f534"}i.icon.info:before{content:"\f129"}i.icon.info.circle:before{content:"\f05a"}i.icon.italic:before{content:"\f033"}i.icon.jedi:before{content:"\f669"}i.icon.joint:before{content:"\f595"}i.icon.journal.whills:before{content:"\f66a"}i.icon.kaaba:before{content:"\f66b"}i.icon.key:before{content:"\f084"}i.icon.keyboard:before{content:"\f11c"}i.icon.khanda:before{content:"\f66d"}i.icon.kiss:before{content:"\f596"}i.icon.kiss.beam:before{content:"\f597"}i.icon.kiss.wink.heart:before{content:"\f598"}i.icon.kiwi.bird:before{content:"\f535"}i.icon.landmark:before{content:"\f66f"}i.icon.language:before{content:"\f1ab"}i.icon.laptop:before{content:"\f109"}i.icon.laptop.code:before{content:"\f5fc"}i.icon.laptop.medical:before{content:"\f812"}i.icon.laugh:before{content:"\f599"}i.icon.laugh.beam:before{content:"\f59a"}i.icon.laugh.squint:before{content:"\f59b"}i.icon.laugh.wink:before{content:"\f59c"}i.icon.layer.group:before{content:"\f5fd"}i.icon.leaf:before{content:"\f06c"}i.icon.lemon:before{content:"\f094"}i.icon.less.than:before{content:"\f536"}i.icon.less.than.equal:before{content:"\f537"}i.icon.level.down.alternate:before{content:"\f3be"}i.icon.level.up.alternate:before{content:"\f3bf"}i.icon.life.ring:before{content:"\f1cd"}i.icon.lightbulb:before{content:"\f0eb"}i.icon.linkify:before{content:"\f0c1"}i.icon.lira.sign:before{content:"\f195"}i.icon.list:before{content:"\f03a"}i.icon.list.alternate:before{content:"\f022"}i.icon.list.ol:before{content:"\f0cb"}i.icon.list.ul:before{content:"\f0ca"}i.icon.location.arrow:before{content:"\f124"}i.icon.lock:before{content:"\f023"}i.icon.lock.open:before{content:"\f3c1"}i.icon.long.arrow.alternate.down:before{content:"\f309"}i.icon.long.arrow.alternate.left:before{content:"\f30a"}i.icon.long.arrow.alternate.right:before{content:"\f30b"}i.icon.long.arrow.alternate.up:before{content:"\f30c"}i.icon.low.vision:before{content:"\f2a8"}i.icon.luggage.cart:before{content:"\f59d"}i.icon.magic:before{content:"\f0d0"}i.icon.magnet:before{content:"\f076"}i.icon.mail.bulk:before{content:"\f674"}i.icon.male:before{content:"\f183"}i.icon.map:before{content:"\f279"}i.icon.map.marked:before{content:"\f59f"}i.icon.map.marked.alternate:before{content:"\f5a0"}i.icon.map.marker:before{content:"\f041"}i.icon.map.marker.alternate:before{content:"\f3c5"}i.icon.map.pin:before{content:"\f276"}i.icon.map.signs:before{content:"\f277"}i.icon.marker:before{content:"\f5a1"}i.icon.mars:before{content:"\f222"}i.icon.mars.double:before{content:"\f227"}i.icon.mars.stroke:before{content:"\f229"}i.icon.mars.stroke.horizontal:before{content:"\f22b"}i.icon.mars.stroke.vertical:before{content:"\f22a"}i.icon.mask:before{content:"\f6fa"}i.icon.medal:before{content:"\f5a2"}i.icon.medkit:before{content:"\f0fa"}i.icon.meh:before{content:"\f11a"}i.icon.meh.blank:before{content:"\f5a4"}i.icon.meh.rolling.eyes:before{content:"\f5a5"}i.icon.memory:before{content:"\f538"}i.icon.menorah:before{content:"\f676"}i.icon.mercury:before{content:"\f223"}i.icon.meteor:before{content:"\f753"}i.icon.microchip:before{content:"\f2db"}i.icon.microphone:before{content:"\f130"}i.icon.microphone.alternate:before{content:"\f3c9"}i.icon.microphone.alternate.slash:before{content:"\f539"}i.icon.microphone.slash:before{content:"\f131"}i.icon.microscope:before{content:"\f610"}i.icon.minus:before{content:"\f068"}i.icon.minus.circle:before{content:"\f056"}i.icon.minus.square:before{content:"\f146"}i.icon.mitten:before{content:"\f7b5"}i.icon.mobile:before{content:"\f10b"}i.icon.mobile.alternate:before{content:"\f3cd"}i.icon.money.bill:before{content:"\f0d6"}i.icon.money.bill.alternate:before{content:"\f3d1"}i.icon.money.bill.wave:before{content:"\f53a"}i.icon.money.bill.wave.alternate:before{content:"\f53b"}i.icon.money.check:before{content:"\f53c"}i.icon.money.check.alternate:before{content:"\f53d"}i.icon.monument:before{content:"\f5a6"}i.icon.moon:before{content:"\f186"}i.icon.mortar.pestle:before{content:"\f5a7"}i.icon.mosque:before{content:"\f678"}i.icon.motorcycle:before{content:"\f21c"}i.icon.mountain:before{content:"\f6fc"}i.icon.mouse:before{content:"\f8cc"}i.icon.mouse.pointer:before{content:"\f245"}i.icon.mug.hot:before{content:"\f7b6"}i.icon.music:before{content:"\f001"}i.icon.network.wired:before{content:"\f6ff"}i.icon.neuter:before{content:"\f22c"}i.icon.newspaper:before{content:"\f1ea"}i.icon.not.equal:before{content:"\f53e"}i.icon.notes.medical:before{content:"\f481"}i.icon.object.group:before{content:"\f247"}i.icon.object.ungroup:before{content:"\f248"}i.icon.oil.can:before{content:"\f613"}i.icon.om:before{content:"\f679"}i.icon.otter:before{content:"\f700"}i.icon.outdent:before{content:"\f03b"}i.icon.pager:before{content:"\f815"}i.icon.paint.brush:before{content:"\f1fc"}i.icon.paint.roller:before{content:"\f5aa"}i.icon.palette:before{content:"\f53f"}i.icon.pallet:before{content:"\f482"}i.icon.paper.plane:before{content:"\f1d8"}i.icon.paperclip:before{content:"\f0c6"}i.icon.parachute.box:before{content:"\f4cd"}i.icon.paragraph:before{content:"\f1dd"}i.icon.parking:before{content:"\f540"}i.icon.passport:before{content:"\f5ab"}i.icon.pastafarianism:before{content:"\f67b"}i.icon.paste:before{content:"\f0ea"}i.icon.pause:before{content:"\f04c"}i.icon.pause.circle:before{content:"\f28b"}i.icon.paw:before{content:"\f1b0"}i.icon.peace:before{content:"\f67c"}i.icon.pen:before{content:"\f304"}i.icon.pen.alternate:before{content:"\f305"}i.icon.pen.fancy:before{content:"\f5ac"}i.icon.pen.nib:before{content:"\f5ad"}i.icon.pen.square:before{content:"\f14b"}i.icon.pencil.alternate:before{content:"\f303"}i.icon.pencil.ruler:before{content:"\f5ae"}i.icon.people.carry:before{content:"\f4ce"}i.icon.pepper.hot:before{content:"\f816"}i.icon.percent:before{content:"\f295"}i.icon.percentage:before{content:"\f541"}i.icon.person.booth:before{content:"\f756"}i.icon.phone:before{content:"\f095"}i.icon.phone.alternate:before{content:"\f879"}i.icon.phone.slash:before{content:"\f3dd"}i.icon.phone.square:before{content:"\f098"}i.icon.phone.square.alternate:before{content:"\f87b"}i.icon.phone.volume:before{content:"\f2a0"}i.icon.photo.video:before{content:"\f87c"}i.icon.piggy.bank:before{content:"\f4d3"}i.icon.pills:before{content:"\f484"}i.icon.pizza.slice:before{content:"\f818"}i.icon.place.of.worship:before{content:"\f67f"}i.icon.plane:before{content:"\f072"}i.icon.plane.arrival:before{content:"\f5af"}i.icon.plane.departure:before{content:"\f5b0"}i.icon.play:before{content:"\f04b"}i.icon.play.circle:before{content:"\f144"}i.icon.plug:before{content:"\f1e6"}i.icon.plus:before{content:"\f067"}i.icon.plus.circle:before{content:"\f055"}i.icon.plus.square:before{content:"\f0fe"}i.icon.podcast:before{content:"\f2ce"}i.icon.poll:before{content:"\f681"}i.icon.poll.horizontal:before{content:"\f682"}i.icon.poo:before{content:"\f2fe"}i.icon.poo.storm:before{content:"\f75a"}i.icon.poop:before{content:"\f619"}i.icon.portrait:before{content:"\f3e0"}i.icon.pound.sign:before{content:"\f154"}i.icon.power.off:before{content:"\f011"}i.icon.pray:before{content:"\f683"}i.icon.praying.hands:before{content:"\f684"}i.icon.prescription:before{content:"\f5b1"}i.icon.prescription.bottle:before{content:"\f485"}i.icon.prescription.bottle.alternate:before{content:"\f486"}i.icon.print:before{content:"\f02f"}i.icon.procedures:before{content:"\f487"}i.icon.project.diagram:before{content:"\f542"}i.icon.puzzle.piece:before{content:"\f12e"}i.icon.qrcode:before{content:"\f029"}i.icon.question:before{content:"\f128"}i.icon.question.circle:before{content:"\f059"}i.icon.quidditch:before{content:"\f458"}i.icon.quote.left:before{content:"\f10d"}i.icon.quote.right:before{content:"\f10e"}i.icon.quran:before{content:"\f687"}i.icon.radiation:before{content:"\f7b9"}i.icon.radiation.alternate:before{content:"\f7ba"}i.icon.rainbow:before{content:"\f75b"}i.icon.random:before{content:"\f074"}i.icon.receipt:before{content:"\f543"}i.icon.record.vinyl:before{content:"\f8d9"}i.icon.recycle:before{content:"\f1b8"}i.icon.redo:before{content:"\f01e"}i.icon.redo.alternate:before{content:"\f2f9"}i.icon.registered:before{content:"\f25d"}i.icon.remove.format:before{content:"\f87d"}i.icon.reply:before{content:"\f3e5"}i.icon.reply.all:before{content:"\f122"}i.icon.republican:before{content:"\f75e"}i.icon.restroom:before{content:"\f7bd"}i.icon.retweet:before{content:"\f079"}i.icon.ribbon:before{content:"\f4d6"}i.icon.ring:before{content:"\f70b"}i.icon.road:before{content:"\f018"}i.icon.robot:before{content:"\f544"}i.icon.rocket:before{content:"\f135"}i.icon.route:before{content:"\f4d7"}i.icon.rss:before{content:"\f09e"}i.icon.rss.square:before{content:"\f143"}i.icon.ruble.sign:before{content:"\f158"}i.icon.ruler:before{content:"\f545"}i.icon.ruler.combined:before{content:"\f546"}i.icon.ruler.horizontal:before{content:"\f547"}i.icon.ruler.vertical:before{content:"\f548"}i.icon.running:before{content:"\f70c"}i.icon.rupee.sign:before{content:"\f156"}i.icon.sad.cry:before{content:"\f5b3"}i.icon.sad.tear:before{content:"\f5b4"}i.icon.satellite:before{content:"\f7bf"}i.icon.satellite.dish:before{content:"\f7c0"}i.icon.save:before{content:"\f0c7"}i.icon.school:before{content:"\f549"}i.icon.screwdriver:before{content:"\f54a"}i.icon.scroll:before{content:"\f70e"}i.icon.sd.card:before{content:"\f7c2"}i.icon.search:before{content:"\f002"}i.icon.search.dollar:before{content:"\f688"}i.icon.search.location:before{content:"\f689"}i.icon.search.minus:before{content:"\f010"}i.icon.search.plus:before{content:"\f00e"}i.icon.seedling:before{content:"\f4d8"}i.icon.server:before{content:"\f233"}i.icon.shapes:before{content:"\f61f"}i.icon.share:before{content:"\f064"}i.icon.share.alternate:before{content:"\f1e0"}i.icon.share.alternate.square:before{content:"\f1e1"}i.icon.share.square:before{content:"\f14d"}i.icon.shekel.sign:before{content:"\f20b"}i.icon.shield.alternate:before{content:"\f3ed"}i.icon.ship:before{content:"\f21a"}i.icon.shipping.fast:before{content:"\f48b"}i.icon.shoe.prints:before{content:"\f54b"}i.icon.shopping.bag:before{content:"\f290"}i.icon.shopping.basket:before{content:"\f291"}i.icon.shopping.cart:before{content:"\f07a"}i.icon.shower:before{content:"\f2cc"}i.icon.shuttle.van:before{content:"\f5b6"}i.icon.sign:before{content:"\f4d9"}i.icon.sign.in.alternate:before{content:"\f2f6"}i.icon.sign.language:before{content:"\f2a7"}i.icon.sign.out.alternate:before{content:"\f2f5"}i.icon.signal:before{content:"\f012"}i.icon.signature:before{content:"\f5b7"}i.icon.sim.card:before{content:"\f7c4"}i.icon.sitemap:before{content:"\f0e8"}i.icon.skating:before{content:"\f7c5"}i.icon.skiing:before{content:"\f7c9"}i.icon.skiing.nordic:before{content:"\f7ca"}i.icon.skull:before{content:"\f54c"}i.icon.skull.crossbones:before{content:"\f714"}i.icon.slash:before{content:"\f715"}i.icon.sleigh:before{content:"\f7cc"}i.icon.sliders.horizontal:before{content:"\f1de"}i.icon.smile:before{content:"\f118"}i.icon.smile.beam:before{content:"\f5b8"}i.icon.smile.wink:before{content:"\f4da"}i.icon.smog:before{content:"\f75f"}i.icon.smoking:before{content:"\f48d"}i.icon.smoking.ban:before{content:"\f54d"}i.icon.sms:before{content:"\f7cd"}i.icon.snowboarding:before{content:"\f7ce"}i.icon.snowflake:before{content:"\f2dc"}i.icon.snowman:before{content:"\f7d0"}i.icon.snowplow:before{content:"\f7d2"}i.icon.socks:before{content:"\f696"}i.icon.solar.panel:before{content:"\f5ba"}i.icon.sort:before{content:"\f0dc"}i.icon.sort.alphabet.down:before{content:"\f15d"}i.icon.sort.alphabet.down.alternate:before{content:"\f881"}i.icon.sort.alphabet.up:before{content:"\f15e"}i.icon.sort.alphabet.up.alternate:before{content:"\f882"}i.icon.sort.amount.down:before{content:"\f160"}i.icon.sort.amount.down.alternate:before{content:"\f884"}i.icon.sort.amount.up:before{content:"\f161"}i.icon.sort.amount.up.alternate:before{content:"\f885"}i.icon.sort.down:before{content:"\f0dd"}i.icon.sort.numeric.down:before{content:"\f162"}i.icon.sort.numeric.down.alternate:before{content:"\f886"}i.icon.sort.numeric.up:before{content:"\f163"}i.icon.sort.numeric.up.alternate:before{content:"\f887"}i.icon.sort.up:before{content:"\f0de"}i.icon.spa:before{content:"\f5bb"}i.icon.space.shuttle:before{content:"\f197"}i.icon.spell.check:before{content:"\f891"}i.icon.spider:before{content:"\f717"}i.icon.spinner:before{content:"\f110"}i.icon.splotch:before{content:"\f5bc"}i.icon.spray.can:before{content:"\f5bd"}i.icon.square:before{content:"\f0c8"}i.icon.square.full:before{content:"\f45c"}i.icon.square.root.alternate:before{content:"\f698"}i.icon.stamp:before{content:"\f5bf"}i.icon.star:before{content:"\f005"}i.icon.star.and.crescent:before{content:"\f699"}i.icon.star.half:before{content:"\f089"}i.icon.star.half.alternate:before{content:"\f5c0"}i.icon.star.of.david:before{content:"\f69a"}i.icon.star.of.life:before{content:"\f621"}i.icon.step.backward:before{content:"\f048"}i.icon.step.forward:before{content:"\f051"}i.icon.stethoscope:before{content:"\f0f1"}i.icon.sticky.note:before{content:"\f249"}i.icon.stop:before{content:"\f04d"}i.icon.stop.circle:before{content:"\f28d"}i.icon.stopwatch:before{content:"\f2f2"}i.icon.store:before{content:"\f54e"}i.icon.store.alternate:before{content:"\f54f"}i.icon.stream:before{content:"\f550"}i.icon.street.view:before{content:"\f21d"}i.icon.strikethrough:before{content:"\f0cc"}i.icon.stroopwafel:before{content:"\f551"}i.icon.subscript:before{content:"\f12c"}i.icon.subway:before{content:"\f239"}i.icon.suitcase:before{content:"\f0f2"}i.icon.suitcase.rolling:before{content:"\f5c1"}i.icon.sun:before{content:"\f185"}i.icon.superscript:before{content:"\f12b"}i.icon.surprise:before{content:"\f5c2"}i.icon.swatchbook:before{content:"\f5c3"}i.icon.swimmer:before{content:"\f5c4"}i.icon.swimming.pool:before{content:"\f5c5"}i.icon.synagogue:before{content:"\f69b"}i.icon.sync:before{content:"\f021"}i.icon.sync.alternate:before{content:"\f2f1"}i.icon.syringe:before{content:"\f48e"}i.icon.table:before{content:"\f0ce"}i.icon.table.tennis:before{content:"\f45d"}i.icon.tablet:before{content:"\f10a"}i.icon.tablet.alternate:before{content:"\f3fa"}i.icon.tablets:before{content:"\f490"}i.icon.tachometer.alternate:before{content:"\f3fd"}i.icon.tag:before{content:"\f02b"}i.icon.tags:before{content:"\f02c"}i.icon.tape:before{content:"\f4db"}i.icon.tasks:before{content:"\f0ae"}i.icon.taxi:before{content:"\f1ba"}i.icon.teeth:before{content:"\f62e"}i.icon.teeth.open:before{content:"\f62f"}i.icon.temperature.high:before{content:"\f769"}i.icon.temperature.low:before{content:"\f76b"}i.icon.tenge:before{content:"\f7d7"}i.icon.terminal:before{content:"\f120"}i.icon.text.height:before{content:"\f034"}i.icon.text.width:before{content:"\f035"}i.icon.th:before{content:"\f00a"}i.icon.th.large:before{content:"\f009"}i.icon.th.list:before{content:"\f00b"}i.icon.theater.masks:before{content:"\f630"}i.icon.thermometer:before{content:"\f491"}i.icon.thermometer.empty:before{content:"\f2cb"}i.icon.thermometer.full:before{content:"\f2c7"}i.icon.thermometer.half:before{content:"\f2c9"}i.icon.thermometer.quarter:before{content:"\f2ca"}i.icon.thermometer.three.quarters:before{content:"\f2c8"}i.icon.thumbs.down:before{content:"\f165"}i.icon.thumbs.up:before{content:"\f164"}i.icon.thumbtack:before{content:"\f08d"}i.icon.ticket.alternate:before{content:"\f3ff"}i.icon.times:before{content:"\f00d"}i.icon.times.circle:before{content:"\f057"}i.icon.tint:before{content:"\f043"}i.icon.tint.slash:before{content:"\f5c7"}i.icon.tired:before{content:"\f5c8"}i.icon.toggle.off:before{content:"\f204"}i.icon.toggle.on:before{content:"\f205"}i.icon.toilet:before{content:"\f7d8"}i.icon.toilet.paper:before{content:"\f71e"}i.icon.toolbox:before{content:"\f552"}i.icon.tools:before{content:"\f7d9"}i.icon.tooth:before{content:"\f5c9"}i.icon.torah:before{content:"\f6a0"}i.icon.torii.gate:before{content:"\f6a1"}i.icon.tractor:before{content:"\f722"}i.icon.trademark:before{content:"\f25c"}i.icon.traffic.light:before{content:"\f637"}i.icon.trailer:before{content:"\f941"}i.icon.train:before{content:"\f238"}i.icon.tram:before{content:"\f7da"}i.icon.transgender:before{content:"\f224"}i.icon.transgender.alternate:before{content:"\f225"}i.icon.trash:before{content:"\f1f8"}i.icon.trash.alternate:before{content:"\f2ed"}i.icon.trash.restore:before{content:"\f829"}i.icon.trash.restore.alternate:before{content:"\f82a"}i.icon.tree:before{content:"\f1bb"}i.icon.trophy:before{content:"\f091"}i.icon.truck:before{content:"\f0d1"}i.icon.truck.monster:before{content:"\f63b"}i.icon.truck.moving:before{content:"\f4df"}i.icon.truck.packing:before{content:"\f4de"}i.icon.truck.pickup:before{content:"\f63c"}i.icon.tshirt:before{content:"\f553"}i.icon.tty:before{content:"\f1e4"}i.icon.tv:before{content:"\f26c"}i.icon.umbrella:before{content:"\f0e9"}i.icon.umbrella.beach:before{content:"\f5ca"}i.icon.underline:before{content:"\f0cd"}i.icon.undo:before{content:"\f0e2"}i.icon.undo.alternate:before{content:"\f2ea"}i.icon.universal.access:before{content:"\f29a"}i.icon.university:before{content:"\f19c"}i.icon.unlink:before{content:"\f127"}i.icon.unlock:before{content:"\f09c"}i.icon.unlock.alternate:before{content:"\f13e"}i.icon.upload:before{content:"\f093"}i.icon.user:before{content:"\f007"}i.icon.user.alternate:before{content:"\f406"}i.icon.user.alternate.slash:before{content:"\f4fa"}i.icon.user.astronaut:before{content:"\f4fb"}i.icon.user.check:before{content:"\f4fc"}i.icon.user.circle:before{content:"\f2bd"}i.icon.user.clock:before{content:"\f4fd"}i.icon.user.cog:before{content:"\f4fe"}i.icon.user.edit:before{content:"\f4ff"}i.icon.user.friends:before{content:"\f500"}i.icon.user.graduate:before{content:"\f501"}i.icon.user.injured:before{content:"\f728"}i.icon.user.lock:before{content:"\f502"}i.icon.user.md:before{content:"\f0f0"}i.icon.user.minus:before{content:"\f503"}i.icon.user.ninja:before{content:"\f504"}i.icon.user.nurse:before{content:"\f82f"}i.icon.user.plus:before{content:"\f234"}i.icon.user.secret:before{content:"\f21b"}i.icon.user.shield:before{content:"\f505"}i.icon.user.slash:before{content:"\f506"}i.icon.user.tag:before{content:"\f507"}i.icon.user.tie:before{content:"\f508"}i.icon.user.times:before{content:"\f235"}i.icon.users:before{content:"\f0c0"}i.icon.users.cog:before{content:"\f509"}i.icon.utensil.spoon:before{content:"\f2e5"}i.icon.utensils:before{content:"\f2e7"}i.icon.vector.square:before{content:"\f5cb"}i.icon.venus:before{content:"\f221"}i.icon.venus.double:before{content:"\f226"}i.icon.venus.mars:before{content:"\f228"}i.icon.vial:before{content:"\f492"}i.icon.vials:before{content:"\f493"}i.icon.video:before{content:"\f03d"}i.icon.video.slash:before{content:"\f4e2"}i.icon.vihara:before{content:"\f6a7"}i.icon.voicemail:before{content:"\f897"}i.icon.volleyball.ball:before{content:"\f45f"}i.icon.volume.down:before{content:"\f027"}i.icon.volume.mute:before{content:"\f6a9"}i.icon.volume.off:before{content:"\f026"}i.icon.volume.up:before{content:"\f028"}i.icon.vote.yea:before{content:"\f772"}i.icon.vr.cardboard:before{content:"\f729"}i.icon.walking:before{content:"\f554"}i.icon.wallet:before{content:"\f555"}i.icon.warehouse:before{content:"\f494"}i.icon.water:before{content:"\f773"}i.icon.wave.square:before{content:"\f83e"}i.icon.weight:before{content:"\f496"}i.icon.weight.hanging:before{content:"\f5cd"}i.icon.wheelchair:before{content:"\f193"}i.icon.wifi:before{content:"\f1eb"}i.icon.wind:before{content:"\f72e"}i.icon.window.close:before{content:"\f410"}i.icon.window.maximize:before{content:"\f2d0"}i.icon.window.minimize:before{content:"\f2d1"}i.icon.window.restore:before{content:"\f2d2"}i.icon.wine.bottle:before{content:"\f72f"}i.icon.wine.glass:before{content:"\f4e3"}i.icon.wine.glass.alternate:before{content:"\f5ce"}i.icon.won.sign:before{content:"\f159"}i.icon.wrench:before{content:"\f0ad"}i.icon.x.ray:before{content:"\f497"}i.icon.yen.sign:before{content:"\f157"}i.icon.yin.yang:before{content:"\f6ad"}i.icon.add:before{content:"\f067"}i.icon.add.circle:before{content:"\f055"}i.icon.add.square:before{content:"\f0fe"}i.icon.add.to.calendar:before{content:"\f271"}i.icon.add.to.cart:before{content:"\f217"}i.icon.add.user:before{content:"\f234"}i.icon.alarm:before{content:"\f0f3"}i.icon.alarm.mute:before{content:"\f1f6"}i.icon.ald:before{content:"\f2a2"}i.icon.als:before{content:"\f2a2"}i.icon.announcement:before{content:"\f0a1"}i.icon.area.chart:before{content:"\f1fe"}i.icon.area.graph:before{content:"\f1fe"}i.icon.arrow.down.cart:before{content:"\f218"}i.icon.asexual:before{content:"\f22d"}i.icon.asl:before{content:"\f2a3"}i.icon.asl.interpreting:before{content:"\f2a3"}i.icon.assistive.listening.devices:before{content:"\f2a2"}i.icon.attach:before{content:"\f0c6"}i.icon.attention:before{content:"\f06a"}i.icon.balance:before{content:"\f24e"}i.icon.bar:before{content:"\f0fc"}i.icon.bathtub:before{content:"\f2cd"}i.icon.battery.four:before{content:"\f240"}i.icon.battery.high:before{content:"\f241"}i.icon.battery.low:before{content:"\f243"}i.icon.battery.medium:before{content:"\f242"}i.icon.battery.one:before{content:"\f243"}i.icon.battery.three:before{content:"\f241"}i.icon.battery.two:before{content:"\f242"}i.icon.battery.zero:before{content:"\f244"}i.icon.birthday:before{content:"\f1fd"}i.icon.block.layout:before{content:"\f009"}i.icon.broken.chain:before{content:"\f127"}i.icon.browser:before{content:"\f022"}i.icon.call:before{content:"\f095"}i.icon.call.square:before{content:"\f098"}i.icon.cancel:before{content:"\f00d"}i.icon.cart:before{content:"\f07a"}i.icon.cc:before{content:"\f20a"}i.icon.chain:before{content:"\f0c1"}i.icon.chat:before{content:"\f075"}i.icon.checked.calendar:before{content:"\f274"}i.icon.checkmark:before{content:"\f00c"}i.icon.checkmark.box:before{content:"\f14a"}i.icon.chess.rock:before{content:"\f447"}i.icon.circle.notched:before{content:"\f1ce"}i.icon.circle.thin:before{content:"\f111"}i.icon.close:before{content:"\f00d"}i.icon.cloud.download:before{content:"\f381"}i.icon.cloud.upload:before{content:"\f382"}i.icon.cny:before{content:"\f157"}i.icon.cocktail:before{content:"\f000"}i.icon.commenting:before{content:"\f27a"}i.icon.compose:before{content:"\f303"}i.icon.computer:before{content:"\f108"}i.icon.configure:before{content:"\f0ad"}i.icon.content:before{content:"\f0c9"}i.icon.conversation:before{content:"\f086"}i.icon.credit.card.alternative:before{content:"\f09d"}i.icon.currency:before{content:"\f3d1"}i.icon.dashboard:before{content:"\f3fd"}i.icon.deafness:before{content:"\f2a4"}i.icon.delete:before{content:"\f00d"}i.icon.delete.calendar:before{content:"\f273"}i.icon.detective:before{content:"\f21b"}i.icon.diamond:before{content:"\f3a5"}i.icon.discussions:before{content:"\f086"}i.icon.disk:before{content:"\f0a0"}i.icon.doctor:before{content:"\f0f0"}i.icon.dollar:before{content:"\f155"}i.icon.dont:before{content:"\f05e"}i.icon.drivers.license:before{content:"\f2c2"}i.icon.dropdown:before{content:"\f0d7"}i.icon.emergency:before{content:"\f0f9"}i.icon.erase:before{content:"\f12d"}i.icon.eur:before{content:"\f153"}i.icon.euro:before{content:"\f153"}i.icon.exchange:before{content:"\f362"}i.icon.external:before{content:"\f35d"}i.icon.external.share:before{content:"\f14d"}i.icon.external.square:before{content:"\f360"}i.icon.eyedropper:before{content:"\f1fb"}i.icon.factory:before{content:"\f275"}i.icon.favorite:before{content:"\f005"}i.icon.feed:before{content:"\f09e"}i.icon.female.homosexual:before{content:"\f226"}i.icon.file.text:before{content:"\f15c"}i.icon.find:before{content:"\f1e5"}i.icon.first.aid:before{content:"\f0fa"}i.icon.food:before{content:"\f2e7"}i.icon.fork:before{content:"\f126"}i.icon.game:before{content:"\f11b"}i.icon.gay:before{content:"\f227"}i.icon.gbp:before{content:"\f154"}i.icon.grab:before{content:"\f255"}i.icon.graduation:before{content:"\f19d"}i.icon.grid.layout:before{content:"\f00a"}i.icon.group:before{content:"\f0c0"}i.icon.h:before{content:"\f0fd"}i.icon.hamburger:before{content:"\f0c9"}i.icon.hand.victory:before{content:"\f25b"}i.icon.handicap:before{content:"\f193"}i.icon.hard.of.hearing:before{content:"\f2a4"}i.icon.header:before{content:"\f1dc"}i.icon.heart.empty:before{content:"\f004"}i.icon.help:before{content:"\f128"}i.icon.help.circle:before{content:"\f059"}i.icon.heterosexual:before{content:"\f228"}i.icon.hide:before{content:"\f070"}i.icon.hotel:before{content:"\f236"}i.icon.hourglass.four:before{content:"\f254"}i.icon.hourglass.full:before{content:"\f254"}i.icon.hourglass.one:before{content:"\f251"}i.icon.hourglass.three:before{content:"\f253"}i.icon.hourglass.two:before{content:"\f252"}i.icon.hourglass.zero:before{content:"\f253"}i.icon.idea:before{content:"\f0eb"}i.icon.ils:before{content:"\f20b"}i.icon.in.cart:before{content:"\f218"}i.icon.inr:before{content:"\f156"}i.icon.intergender:before{content:"\f224"}i.icon.intersex:before{content:"\f224"}i.icon.jpy:before{content:"\f157"}i.icon.krw:before{content:"\f159"}i.icon.lab:before{content:"\f0c3"}i.icon.law:before{content:"\f24e"}i.icon.legal:before{content:"\f0e3"}i.icon.lesbian:before{content:"\f226"}i.icon.level.down:before{content:"\f3be"}i.icon.level.up:before{content:"\f3bf"}i.icon.lightning:before{content:"\f0e7"}i.icon.like:before{content:"\f004"}i.icon.line.graph:before{content:"\f201"}i.icon.linkify:before{content:"\f0c1"}i.icon.lira:before{content:"\f195"}i.icon.list.layout:before{content:"\f00b"}i.icon.log.out:before{content:"\f2f5"}i.icon.magnify:before{content:"\f00e"}i.icon.mail:before{content:"\f0e0"}i.icon.mail.forward:before{content:"\f064"}i.icon.mail.square:before{content:"\f199"}i.icon.male.homosexual:before{content:"\f227"}i.icon.man:before{content:"\f222"}i.icon.marker:before{content:"\f041"}i.icon.mars.alternate:before{content:"\f229"}i.icon.mars.horizontal:before{content:"\f22b"}i.icon.mars.vertical:before{content:"\f22a"}i.icon.meanpath:before{content:"\f0c8"}i.icon.military:before{content:"\f0fb"}i.icon.money:before{content:"\f3d1"}i.icon.move:before{content:"\f0b2"}i.icon.mute:before{content:"\f131"}i.icon.non.binary.transgender:before{content:"\f223"}i.icon.numbered.list:before{content:"\f0cb"}i.icon.options:before{content:"\f1de"}i.icon.ordered.list:before{content:"\f0cb"}i.icon.other.gender:before{content:"\f229"}i.icon.other.gender.horizontal:before{content:"\f22b"}i.icon.other.gender.vertical:before{content:"\f22a"}i.icon.payment:before{content:"\f09d"}i.icon.pencil:before{content:"\f303"}i.icon.pencil.square:before{content:"\f14b"}i.icon.photo:before{content:"\f030"}i.icon.picture:before{content:"\f03e"}i.icon.pie.chart:before{content:"\f200"}i.icon.pie.graph:before{content:"\f200"}i.icon.pin:before{content:"\f08d"}i.icon.plus.cart:before{content:"\f217"}i.icon.point:before{content:"\f041"}i.icon.pointing.down:before{content:"\f0a7"}i.icon.pointing.left:before{content:"\f0a5"}i.icon.pointing.right:before{content:"\f0a4"}i.icon.pointing.up:before{content:"\f0a6"}i.icon.pound:before{content:"\f154"}i.icon.power:before{content:"\f011"}i.icon.power.cord:before{content:"\f1e6"}i.icon.privacy:before{content:"\f084"}i.icon.protect:before{content:"\f023"}i.icon.puzzle:before{content:"\f12e"}i.icon.r.circle:before{content:"\f25d"}i.icon.radio:before{content:"\f192"}i.icon.rain:before{content:"\f0e9"}i.icon.record:before{content:"\f03d"}i.icon.refresh:before{content:"\f021"}i.icon.remove:before{content:"\f00d"}i.icon.remove.bookmark:before{content:"\f02e"}i.icon.remove.circle:before{content:"\f057"}i.icon.remove.from.calendar:before{content:"\f272"}i.icon.remove.user:before{content:"\f235"}i.icon.repeat:before{content:"\f01e"}i.icon.resize.horizontal:before{content:"\f337"}i.icon.resize.vertical:before{content:"\f338"}i.icon.rmb:before{content:"\f157"}i.icon.rouble:before{content:"\f158"}i.icon.rub:before{content:"\f158"}i.icon.ruble:before{content:"\f158"}i.icon.rupee:before{content:"\f156"}i.icon.s15:before{content:"\f2cd"}i.icon.selected.radio:before{content:"\f192"}i.icon.send:before{content:"\f1d8"}i.icon.setting:before{content:"\f013"}i.icon.settings:before{content:"\f085"}i.icon.shekel:before{content:"\f20b"}i.icon.sheqel:before{content:"\f20b"}i.icon.shield:before{content:"\f3ed"}i.icon.shipping:before{content:"\f0d1"}i.icon.shop:before{content:"\f07a"}i.icon.shuffle:before{content:"\f074"}i.icon.shutdown:before{content:"\f011"}i.icon.sidebar:before{content:"\f0c9"}i.icon.sign.in:before{content:"\f2f6"}i.icon.sign.out:before{content:"\f2f5"}i.icon.signing:before{content:"\f2a7"}i.icon.signup:before{content:"\f044"}i.icon.sliders:before{content:"\f1de"}i.icon.soccer:before{content:"\f1e3"}i.icon.sort.alphabet.ascending:before{content:"\f15d"}i.icon.sort.alphabet.descending:before{content:"\f15e"}i.icon.sort.ascending:before{content:"\f0de"}i.icon.sort.content.ascending:before{content:"\f160"}i.icon.sort.content.descending:before{content:"\f161"}i.icon.sort.descending:before{content:"\f0dd"}i.icon.sort.numeric.ascending:before{content:"\f162"}i.icon.sort.numeric.descending:before{content:"\f163"}i.icon.sound:before{content:"\f025"}i.icon.spoon:before{content:"\f2e5"}i.icon.spy:before{content:"\f21b"}i.icon.star.empty:before{content:"\f005"}i.icon.star.half.empty:before{content:"\f089"}i.icon.star.half.full:before{content:"\f089"}i.icon.student:before{content:"\f19d"}i.icon.talk:before{content:"\f27a"}i.icon.target:before{content:"\f140"}i.icon.teletype:before{content:"\f1e4"}i.icon.television:before{content:"\f26c"}i.icon.text.cursor:before{content:"\f246"}i.icon.text.telephone:before{content:"\f1e4"}i.icon.theme:before{content:"\f043"}i.icon.thermometer:before{content:"\f2c7"}i.icon.thumb.tack:before{content:"\f08d"}i.icon.ticket:before{content:"\f3ff"}i.icon.time:before{content:"\f017"}i.icon.times.rectangle:before{content:"\f410"}i.icon.tm:before{content:"\f25c"}i.icon.toggle.down:before{content:"\f150"}i.icon.toggle.left:before{content:"\f191"}i.icon.toggle.right:before{content:"\f152"}i.icon.toggle.up:before{content:"\f151"}i.icon.translate:before{content:"\f1ab"}i.icon.travel:before{content:"\f0b1"}i.icon.treatment:before{content:"\f0f1"}i.icon.triangle.down:before{content:"\f0d7"}i.icon.triangle.left:before{content:"\f0d9"}i.icon.triangle.right:before{content:"\f0da"}i.icon.triangle.up:before{content:"\f0d8"}i.icon.try:before{content:"\f195"}i.icon.unhide:before{content:"\f06e"}i.icon.unlinkify:before{content:"\f127"}i.icon.unmute:before{content:"\f130"}i.icon.unordered.list:before{content:"\f0ca"}i.icon.usd:before{content:"\f155"}i.icon.user.cancel:before{content:"\f235"}i.icon.user.close:before{content:"\f235"}i.icon.user.delete:before{content:"\f235"}i.icon.user.doctor:before{content:"\f0f0"}i.icon.user.x:before{content:"\f235"}i.icon.vcard:before{content:"\f2bb"}i.icon.video.camera:before{content:"\f03d"}i.icon.video.play:before{content:"\f144"}i.icon.volume.control.phone:before{content:"\f2a0"}i.icon.wait:before{content:"\f017"}i.icon.warning:before{content:"\f12a"}i.icon.warning.circle:before{content:"\f06a"}i.icon.warning.sign:before{content:"\f071"}i.icon.wi.fi:before{content:"\f1eb"}i.icon.winner:before{content:"\f091"}i.icon.wizard:before{content:"\f0d0"}i.icon.woman:before{content:"\f221"}i.icon.won:before{content:"\f159"}i.icon.world:before{content:"\f0ac"}i.icon.write:before{content:"\f303"}i.icon.write.square:before{content:"\f14b"}i.icon.x:before{content:"\f00d"}i.icon.yen:before{content:"\f157"}i.icon.zip:before{content:"\f187"}i.icon.zoom:before{content:"\f00e"}i.icon.zoom.in:before{content:"\f00e"}i.icon.zoom.out:before{content:"\f010"}@font-face{font-family:outline-icons;src:url(themes/default/assets/fonts/outline-icons.eot);src:url(themes/default/assets/fonts/outline-icons.eot?#iefix) format('embedded-opentype'),url(themes/default/assets/fonts/outline-icons.woff2) format('woff2'),url(themes/default/assets/fonts/outline-icons.woff) format('woff'),url(themes/default/assets/fonts/outline-icons.ttf) format('truetype'),url(themes/default/assets/fonts/outline-icons.svg#icons) format('svg');font-style:normal;font-weight:400;font-variant:normal;text-decoration:inherit;text-transform:none}i.icon.outline{font-family:outline-icons}i.icon.address.book.outline:before{content:"\f2b9"}i.icon.address.card.outline:before{content:"\f2bb"}i.icon.angry.outline:before{content:"\f556"}i.icon.arrow.alternate.circle.down.outline:before{content:"\f358"}i.icon.arrow.alternate.circle.left.outline:before{content:"\f359"}i.icon.arrow.alternate.circle.right.outline:before{content:"\f35a"}i.icon.arrow.alternate.circle.up.outline:before{content:"\f35b"}i.icon.bell.outline:before{content:"\f0f3"}i.icon.bell.slash.outline:before{content:"\f1f6"}i.icon.bookmark.outline:before{content:"\f02e"}i.icon.building.outline:before{content:"\f1ad"}i.icon.calendar.alternate.outline:before{content:"\f073"}i.icon.calendar.check.outline:before{content:"\f274"}i.icon.calendar.minus.outline:before{content:"\f272"}i.icon.calendar.outline:before{content:"\f133"}i.icon.calendar.plus.outline:before{content:"\f271"}i.icon.calendar.times.outline:before{content:"\f273"}i.icon.caret.square.down.outline:before{content:"\f150"}i.icon.caret.square.left.outline:before{content:"\f191"}i.icon.caret.square.right.outline:before{content:"\f152"}i.icon.caret.square.up.outline:before{content:"\f151"}i.icon.chart.bar.outline:before{content:"\f080"}i.icon.check.circle.outline:before{content:"\f058"}i.icon.check.square.outline:before{content:"\f14a"}i.icon.circle.outline:before{content:"\f111"}i.icon.clipboard.outline:before{content:"\f328"}i.icon.clock.outline:before{content:"\f017"}i.icon.clone.outline:before{content:"\f24d"}i.icon.closed.captioning.outline:before{content:"\f20a"}i.icon.comment.alternate.outline:before{content:"\f27a"}i.icon.comment.dots.outline:before{content:"\f4ad"}i.icon.comment.outline:before{content:"\f075"}i.icon.comments.outline:before{content:"\f086"}i.icon.compass.outline:before{content:"\f14e"}i.icon.copy.outline:before{content:"\f0c5"}i.icon.copyright.outline:before{content:"\f1f9"}i.icon.credit.card.outline:before{content:"\f09d"}i.icon.dizzy.outline:before{content:"\f567"}i.icon.dot.circle.outline:before{content:"\f192"}i.icon.edit.outline:before{content:"\f044"}i.icon.envelope.open.outline:before{content:"\f2b6"}i.icon.envelope.outline:before{content:"\f0e0"}i.icon.eye.outline:before{content:"\f06e"}i.icon.eye.slash.outline:before{content:"\f070"}i.icon.file.alternate.outline:before{content:"\f15c"}i.icon.file.archive.outline:before{content:"\f1c6"}i.icon.file.audio.outline:before{content:"\f1c7"}i.icon.file.code.outline:before{content:"\f1c9"}i.icon.file.excel.outline:before{content:"\f1c3"}i.icon.file.image.outline:before{content:"\f1c5"}i.icon.file.outline:before{content:"\f15b"}i.icon.file.pdf.outline:before{content:"\f1c1"}i.icon.file.powerpoint.outline:before{content:"\f1c4"}i.icon.file.video.outline:before{content:"\f1c8"}i.icon.file.word.outline:before{content:"\f1c2"}i.icon.flag.outline:before{content:"\f024"}i.icon.flushed.outline:before{content:"\f579"}i.icon.folder.open.outline:before{content:"\f07c"}i.icon.folder.outline:before{content:"\f07b"}i.icon.frown.open.outline:before{content:"\f57a"}i.icon.frown.outline:before{content:"\f119"}i.icon.futbol.outline:before{content:"\f1e3"}i.icon.gem.outline:before{content:"\f3a5"}i.icon.grimace.outline:before{content:"\f57f"}i.icon.grin.alternate.outline:before{content:"\f581"}i.icon.grin.beam.outline:before{content:"\f582"}i.icon.grin.beam.sweat.outline:before{content:"\f583"}i.icon.grin.hearts.outline:before{content:"\f584"}i.icon.grin.outline:before{content:"\f580"}i.icon.grin.squint.outline:before{content:"\f585"}i.icon.grin.squint.tears.outline:before{content:"\f586"}i.icon.grin.stars.outline:before{content:"\f587"}i.icon.grin.tears.outline:before{content:"\f588"}i.icon.grin.tongue.outline:before{content:"\f589"}i.icon.grin.tongue.squint.outline:before{content:"\f58a"}i.icon.grin.tongue.wink.outline:before{content:"\f58b"}i.icon.grin.wink.outline:before{content:"\f58c"}i.icon.hand.lizard.outline:before{content:"\f258"}i.icon.hand.paper.outline:before{content:"\f256"}i.icon.hand.peace.outline:before{content:"\f25b"}i.icon.hand.point.down.outline:before{content:"\f0a7"}i.icon.hand.point.left.outline:before{content:"\f0a5"}i.icon.hand.point.right.outline:before{content:"\f0a4"}i.icon.hand.point.up.outline:before{content:"\f0a6"}i.icon.hand.pointer.outline:before{content:"\f25a"}i.icon.hand.rock.outline:before{content:"\f255"}i.icon.hand.scissors.outline:before{content:"\f257"}i.icon.hand.spock.outline:before{content:"\f259"}i.icon.handshake.outline:before{content:"\f2b5"}i.icon.hdd.outline:before{content:"\f0a0"}i.icon.heart.outline:before{content:"\f004"}i.icon.hospital.outline:before{content:"\f0f8"}i.icon.hourglass.outline:before{content:"\f254"}i.icon.id.badge.outline:before{content:"\f2c1"}i.icon.id.card.outline:before{content:"\f2c2"}i.icon.image.outline:before{content:"\f03e"}i.icon.images.outline:before{content:"\f302"}i.icon.keyboard.outline:before{content:"\f11c"}i.icon.kiss.beam.outline:before{content:"\f597"}i.icon.kiss.outline:before{content:"\f596"}i.icon.kiss.wink.heart.outline:before{content:"\f598"}i.icon.laugh.beam.outline:before{content:"\f59a"}i.icon.laugh.outline:before{content:"\f599"}i.icon.laugh.squint.outline:before{content:"\f59b"}i.icon.laugh.wink.outline:before{content:"\f59c"}i.icon.lemon.outline:before{content:"\f094"}i.icon.life.ring.outline:before{content:"\f1cd"}i.icon.lightbulb.outline:before{content:"\f0eb"}i.icon.list.alternate.outline:before{content:"\f022"}i.icon.map.outline:before{content:"\f279"}i.icon.meh.blank.outline:before{content:"\f5a4"}i.icon.meh.outline:before{content:"\f11a"}i.icon.meh.rolling.eyes.outline:before{content:"\f5a5"}i.icon.minus.square.outline:before{content:"\f146"}i.icon.money.bill.alternate.outline:before{content:"\f3d1"}i.icon.moon.outline:before{content:"\f186"}i.icon.newspaper.outline:before{content:"\f1ea"}i.icon.object.group.outline:before{content:"\f247"}i.icon.object.ungroup.outline:before{content:"\f248"}i.icon.paper.plane.outline:before{content:"\f1d8"}i.icon.pause.circle.outline:before{content:"\f28b"}i.icon.play.circle.outline:before{content:"\f144"}i.icon.plus.square.outline:before{content:"\f0fe"}i.icon.question.circle.outline:before{content:"\f059"}i.icon.registered.outline:before{content:"\f25d"}i.icon.sad.cry.outline:before{content:"\f5b3"}i.icon.sad.tear.outline:before{content:"\f5b4"}i.icon.save.outline:before{content:"\f0c7"}i.icon.share.square.outline:before{content:"\f14d"}i.icon.smile.beam.outline:before{content:"\f5b8"}i.icon.smile.outline:before{content:"\f118"}i.icon.smile.wink.outline:before{content:"\f4da"}i.icon.snowflake.outline:before{content:"\f2dc"}i.icon.square.outline:before{content:"\f0c8"}i.icon.star.half.outline:before{content:"\f089"}i.icon.star.outline:before{content:"\f005"}i.icon.sticky.note.outline:before{content:"\f249"}i.icon.stop.circle.outline:before{content:"\f28d"}i.icon.sun.outline:before{content:"\f185"}i.icon.surprise.outline:before{content:"\f5c2"}i.icon.thumbs.down.outline:before{content:"\f165"}i.icon.thumbs.up.outline:before{content:"\f164"}i.icon.times.circle.outline:before{content:"\f057"}i.icon.tired.outline:before{content:"\f5c8"}i.icon.trash.alternate.outline:before{content:"\f2ed"}i.icon.user.circle.outline:before{content:"\f2bd"}i.icon.user.outline:before{content:"\f007"}i.icon.window.close.outline:before{content:"\f410"}i.icon.window.maximize.outline:before{content:"\f2d0"}i.icon.window.minimize.outline:before{content:"\f2d1"}i.icon.window.restore.outline:before{content:"\f2d2"}@font-face{font-family:brand-icons;src:url(themes/default/assets/fonts/brand-icons.eot);src:url(themes/default/assets/fonts/brand-icons.eot?#iefix) format('embedded-opentype'),url(themes/default/assets/fonts/brand-icons.woff2) format('woff2'),url(themes/default/assets/fonts/brand-icons.woff) format('woff'),url(themes/default/assets/fonts/brand-icons.ttf) format('truetype'),url(themes/default/assets/fonts/brand-icons.svg#icons) format('svg');font-style:normal;font-weight:400;font-variant:normal;text-decoration:inherit;text-transform:none}i.icon.\35 00px:before{content:"\f26e";font-family:brand-icons}i.icon.accessible:before{content:"\f368";font-family:brand-icons}i.icon.accusoft:before{content:"\f369";font-family:brand-icons}i.icon.acquisitions.incorporated:before{content:"\f6af";font-family:brand-icons}i.icon.adn:before{content:"\f170";font-family:brand-icons}i.icon.adobe:before{content:"\f778";font-family:brand-icons}i.icon.adversal:before{content:"\f36a";font-family:brand-icons}i.icon.affiliatetheme:before{content:"\f36b";font-family:brand-icons}i.icon.airbnb:before{content:"\f834";font-family:brand-icons}i.icon.algolia:before{content:"\f36c";font-family:brand-icons}i.icon.alipay:before{content:"\f642";font-family:brand-icons}i.icon.amazon:before{content:"\f270";font-family:brand-icons}i.icon.amazon.pay:before{content:"\f42c";font-family:brand-icons}i.icon.amilia:before{content:"\f36d";font-family:brand-icons}i.icon.android:before{content:"\f17b";font-family:brand-icons}i.icon.angellist:before{content:"\f209";font-family:brand-icons}i.icon.angrycreative:before{content:"\f36e";font-family:brand-icons}i.icon.angular:before{content:"\f420";font-family:brand-icons}i.icon.app.store:before{content:"\f36f";font-family:brand-icons}i.icon.app.store.ios:before{content:"\f370";font-family:brand-icons}i.icon.apper:before{content:"\f371";font-family:brand-icons}i.icon.apple:before{content:"\f179";font-family:brand-icons}i.icon.apple.pay:before{content:"\f415";font-family:brand-icons}i.icon.artstation:before{content:"\f77a";font-family:brand-icons}i.icon.asymmetrik:before{content:"\f372";font-family:brand-icons}i.icon.atlassian:before{content:"\f77b";font-family:brand-icons}i.icon.audible:before{content:"\f373";font-family:brand-icons}i.icon.autoprefixer:before{content:"\f41c";font-family:brand-icons}i.icon.avianex:before{content:"\f374";font-family:brand-icons}i.icon.aviato:before{content:"\f421";font-family:brand-icons}i.icon.aws:before{content:"\f375";font-family:brand-icons}i.icon.bandcamp:before{content:"\f2d5";font-family:brand-icons}i.icon.battle.net:before{content:"\f835";font-family:brand-icons}i.icon.behance:before{content:"\f1b4";font-family:brand-icons}i.icon.behance.square:before{content:"\f1b5";font-family:brand-icons}i.icon.bimobject:before{content:"\f378";font-family:brand-icons}i.icon.bitbucket:before{content:"\f171";font-family:brand-icons}i.icon.bitcoin:before{content:"\f379";font-family:brand-icons}i.icon.bity:before{content:"\f37a";font-family:brand-icons}i.icon.black.tie:before{content:"\f27e";font-family:brand-icons}i.icon.blackberry:before{content:"\f37b";font-family:brand-icons}i.icon.blogger:before{content:"\f37c";font-family:brand-icons}i.icon.blogger.b:before{content:"\f37d";font-family:brand-icons}i.icon.bluetooth:before{content:"\f293";font-family:brand-icons}i.icon.bluetooth.b:before{content:"\f294";font-family:brand-icons}i.icon.bootstrap:before{content:"\f836";font-family:brand-icons}i.icon.btc:before{content:"\f15a";font-family:brand-icons}i.icon.buffer:before{content:"\f837";font-family:brand-icons}i.icon.buromobelexperte:before{content:"\f37f";font-family:brand-icons}i.icon.buy.n.large:before{content:"\f8a6";font-family:brand-icons}i.icon.buysellads:before{content:"\f20d";font-family:brand-icons}i.icon.canadian.maple.leaf:before{content:"\f785";font-family:brand-icons}i.icon.cc.amazon.pay:before{content:"\f42d";font-family:brand-icons}i.icon.cc.amex:before{content:"\f1f3";font-family:brand-icons}i.icon.cc.apple.pay:before{content:"\f416";font-family:brand-icons}i.icon.cc.diners.club:before{content:"\f24c";font-family:brand-icons}i.icon.cc.discover:before{content:"\f1f2";font-family:brand-icons}i.icon.cc.jcb:before{content:"\f24b";font-family:brand-icons}i.icon.cc.mastercard:before{content:"\f1f1";font-family:brand-icons}i.icon.cc.paypal:before{content:"\f1f4";font-family:brand-icons}i.icon.cc.stripe:before{content:"\f1f5";font-family:brand-icons}i.icon.cc.visa:before{content:"\f1f0";font-family:brand-icons}i.icon.centercode:before{content:"\f380";font-family:brand-icons}i.icon.centos:before{content:"\f789";font-family:brand-icons}i.icon.chrome:before{content:"\f268";font-family:brand-icons}i.icon.chromecast:before{content:"\f838";font-family:brand-icons}i.icon.cloudscale:before{content:"\f383";font-family:brand-icons}i.icon.cloudsmith:before{content:"\f384";font-family:brand-icons}i.icon.cloudversify:before{content:"\f385";font-family:brand-icons}i.icon.codepen:before{content:"\f1cb";font-family:brand-icons}i.icon.codiepie:before{content:"\f284";font-family:brand-icons}i.icon.confluence:before{content:"\f78d";font-family:brand-icons}i.icon.connectdevelop:before{content:"\f20e";font-family:brand-icons}i.icon.contao:before{content:"\f26d";font-family:brand-icons}i.icon.cotton.bureau:before{content:"\f89e";font-family:brand-icons}i.icon.cpanel:before{content:"\f388";font-family:brand-icons}i.icon.creative.commons:before{content:"\f25e";font-family:brand-icons}i.icon.creative.commons.by:before{content:"\f4e7";font-family:brand-icons}i.icon.creative.commons.nc:before{content:"\f4e8";font-family:brand-icons}i.icon.creative.commons.nc.eu:before{content:"\f4e9";font-family:brand-icons}i.icon.creative.commons.nc.jp:before{content:"\f4ea";font-family:brand-icons}i.icon.creative.commons.nd:before{content:"\f4eb";font-family:brand-icons}i.icon.creative.commons.pd:before{content:"\f4ec";font-family:brand-icons}i.icon.creative.commons.pd.alternate:before{content:"\f4ed";font-family:brand-icons}i.icon.creative.commons.remix:before{content:"\f4ee";font-family:brand-icons}i.icon.creative.commons.sa:before{content:"\f4ef";font-family:brand-icons}i.icon.creative.commons.sampling:before{content:"\f4f0";font-family:brand-icons}i.icon.creative.commons.sampling.plus:before{content:"\f4f1";font-family:brand-icons}i.icon.creative.commons.share:before{content:"\f4f2";font-family:brand-icons}i.icon.creative.commons.zero:before{content:"\f4f3";font-family:brand-icons}i.icon.critical.role:before{content:"\f6c9";font-family:brand-icons}i.icon.css3:before{content:"\f13c";font-family:brand-icons}i.icon.css3.alternate:before{content:"\f38b";font-family:brand-icons}i.icon.cuttlefish:before{content:"\f38c";font-family:brand-icons}i.icon.d.and.d:before{content:"\f38d";font-family:brand-icons}i.icon.d.and.d.beyond:before{content:"\f6ca";font-family:brand-icons}i.icon.dashcube:before{content:"\f210";font-family:brand-icons}i.icon.delicious:before{content:"\f1a5";font-family:brand-icons}i.icon.deploydog:before{content:"\f38e";font-family:brand-icons}i.icon.deskpro:before{content:"\f38f";font-family:brand-icons}i.icon.dev:before{content:"\f6cc";font-family:brand-icons}i.icon.deviantart:before{content:"\f1bd";font-family:brand-icons}i.icon.dhl:before{content:"\f790";font-family:brand-icons}i.icon.diaspora:before{content:"\f791";font-family:brand-icons}i.icon.digg:before{content:"\f1a6";font-family:brand-icons}i.icon.digital.ocean:before{content:"\f391";font-family:brand-icons}i.icon.discord:before{content:"\f392";font-family:brand-icons}i.icon.discourse:before{content:"\f393";font-family:brand-icons}i.icon.dochub:before{content:"\f394";font-family:brand-icons}i.icon.docker:before{content:"\f395";font-family:brand-icons}i.icon.draft2digital:before{content:"\f396";font-family:brand-icons}i.icon.dribbble:before{content:"\f17d";font-family:brand-icons}i.icon.dribbble.square:before{content:"\f397";font-family:brand-icons}i.icon.dropbox:before{content:"\f16b";font-family:brand-icons}i.icon.drupal:before{content:"\f1a9";font-family:brand-icons}i.icon.dyalog:before{content:"\f399";font-family:brand-icons}i.icon.earlybirds:before{content:"\f39a";font-family:brand-icons}i.icon.ebay:before{content:"\f4f4";font-family:brand-icons}i.icon.edge:before{content:"\f282";font-family:brand-icons}i.icon.elementor:before{content:"\f430";font-family:brand-icons}i.icon.ello:before{content:"\f5f1";font-family:brand-icons}i.icon.ember:before{content:"\f423";font-family:brand-icons}i.icon.empire:before{content:"\f1d1";font-family:brand-icons}i.icon.envira:before{content:"\f299";font-family:brand-icons}i.icon.erlang:before{content:"\f39d";font-family:brand-icons}i.icon.ethereum:before{content:"\f42e";font-family:brand-icons}i.icon.etsy:before{content:"\f2d7";font-family:brand-icons}i.icon.evernote:before{content:"\f839";font-family:brand-icons}i.icon.expeditedssl:before{content:"\f23e";font-family:brand-icons}i.icon.facebook:before{content:"\f09a";font-family:brand-icons}i.icon.facebook.f:before{content:"\f39e";font-family:brand-icons}i.icon.facebook.messenger:before{content:"\f39f";font-family:brand-icons}i.icon.facebook.square:before{content:"\f082";font-family:brand-icons}i.icon.fantasy.flight.games:before{content:"\f6dc";font-family:brand-icons}i.icon.fedex:before{content:"\f797";font-family:brand-icons}i.icon.fedora:before{content:"\f798";font-family:brand-icons}i.icon.figma:before{content:"\f799";font-family:brand-icons}i.icon.firefox:before{content:"\f269";font-family:brand-icons}i.icon.firefox.browser:before{content:"\f907";font-family:brand-icons}i.icon.first.order:before{content:"\f2b0";font-family:brand-icons}i.icon.first.order.alternate:before{content:"\f50a";font-family:brand-icons}i.icon.firstdraft:before{content:"\f3a1";font-family:brand-icons}i.icon.flickr:before{content:"\f16e";font-family:brand-icons}i.icon.flipboard:before{content:"\f44d";font-family:brand-icons}i.icon.fly:before{content:"\f417";font-family:brand-icons}i.icon.font.awesome:before{content:"\f2b4";font-family:brand-icons}i.icon.font.awesome.alternate:before{content:"\f35c";font-family:brand-icons}i.icon.font.awesome.flag:before{content:"\f425";font-family:brand-icons}i.icon.fonticons:before{content:"\f280";font-family:brand-icons}i.icon.fonticons.fi:before{content:"\f3a2";font-family:brand-icons}i.icon.fort.awesome:before{content:"\f286";font-family:brand-icons}i.icon.fort.awesome.alternate:before{content:"\f3a3";font-family:brand-icons}i.icon.forumbee:before{content:"\f211";font-family:brand-icons}i.icon.foursquare:before{content:"\f180";font-family:brand-icons}i.icon.free.code.camp:before{content:"\f2c5";font-family:brand-icons}i.icon.freebsd:before{content:"\f3a4";font-family:brand-icons}i.icon.fulcrum:before{content:"\f50b";font-family:brand-icons}i.icon.galactic.republic:before{content:"\f50c";font-family:brand-icons}i.icon.galactic.senate:before{content:"\f50d";font-family:brand-icons}i.icon.get.pocket:before{content:"\f265";font-family:brand-icons}i.icon.gg:before{content:"\f260";font-family:brand-icons}i.icon.gg.circle:before{content:"\f261";font-family:brand-icons}i.icon.git:before{content:"\f1d3";font-family:brand-icons}i.icon.git.alternate:before{content:"\f841";font-family:brand-icons}i.icon.git.square:before{content:"\f1d2";font-family:brand-icons}i.icon.github:before{content:"\f09b";font-family:brand-icons}i.icon.github.alternate:before{content:"\f113";font-family:brand-icons}i.icon.github.square:before{content:"\f092";font-family:brand-icons}i.icon.gitkraken:before{content:"\f3a6";font-family:brand-icons}i.icon.gitlab:before{content:"\f296";font-family:brand-icons}i.icon.gitter:before{content:"\f426";font-family:brand-icons}i.icon.glide:before{content:"\f2a5";font-family:brand-icons}i.icon.glide.g:before{content:"\f2a6";font-family:brand-icons}i.icon.gofore:before{content:"\f3a7";font-family:brand-icons}i.icon.goodreads:before{content:"\f3a8";font-family:brand-icons}i.icon.goodreads.g:before{content:"\f3a9";font-family:brand-icons}i.icon.google:before{content:"\f1a0";font-family:brand-icons}i.icon.google.drive:before{content:"\f3aa";font-family:brand-icons}i.icon.google.play:before{content:"\f3ab";font-family:brand-icons}i.icon.google.plus:before{content:"\f2b3";font-family:brand-icons}i.icon.google.plus.g:before{content:"\f0d5";font-family:brand-icons}i.icon.google.plus.square:before{content:"\f0d4";font-family:brand-icons}i.icon.google.wallet:before{content:"\f1ee";font-family:brand-icons}i.icon.gratipay:before{content:"\f184";font-family:brand-icons}i.icon.grav:before{content:"\f2d6";font-family:brand-icons}i.icon.gripfire:before{content:"\f3ac";font-family:brand-icons}i.icon.grunt:before{content:"\f3ad";font-family:brand-icons}i.icon.gulp:before{content:"\f3ae";font-family:brand-icons}i.icon.hacker.news:before{content:"\f1d4";font-family:brand-icons}i.icon.hacker.news.square:before{content:"\f3af";font-family:brand-icons}i.icon.hackerrank:before{content:"\f5f7";font-family:brand-icons}i.icon.hips:before{content:"\f452";font-family:brand-icons}i.icon.hire.a.helper:before{content:"\f3b0";font-family:brand-icons}i.icon.hooli:before{content:"\f427";font-family:brand-icons}i.icon.hornbill:before{content:"\f592";font-family:brand-icons}i.icon.hotjar:before{content:"\f3b1";font-family:brand-icons}i.icon.houzz:before{content:"\f27c";font-family:brand-icons}i.icon.html5:before{content:"\f13b";font-family:brand-icons}i.icon.hubspot:before{content:"\f3b2";font-family:brand-icons}i.icon.ideal:before{content:"\f913";font-family:brand-icons}i.icon.imdb:before{content:"\f2d8";font-family:brand-icons}i.icon.instagram:before{content:"\f16d";font-family:brand-icons}i.icon.intercom:before{content:"\f7af";font-family:brand-icons}i.icon.internet.explorer:before{content:"\f26b";font-family:brand-icons}i.icon.invision:before{content:"\f7b0";font-family:brand-icons}i.icon.ioxhost:before{content:"\f208";font-family:brand-icons}i.icon.itch.io:before{content:"\f83a";font-family:brand-icons}i.icon.itunes:before{content:"\f3b4";font-family:brand-icons}i.icon.itunes.note:before{content:"\f3b5";font-family:brand-icons}i.icon.java:before{content:"\f4e4";font-family:brand-icons}i.icon.jedi.order:before{content:"\f50e";font-family:brand-icons}i.icon.jenkins:before{content:"\f3b6";font-family:brand-icons}i.icon.jira:before{content:"\f7b1";font-family:brand-icons}i.icon.joget:before{content:"\f3b7";font-family:brand-icons}i.icon.joomla:before{content:"\f1aa";font-family:brand-icons}i.icon.js:before{content:"\f3b8";font-family:brand-icons}i.icon.js.square:before{content:"\f3b9";font-family:brand-icons}i.icon.jsfiddle:before{content:"\f1cc";font-family:brand-icons}i.icon.kaggle:before{content:"\f5fa";font-family:brand-icons}i.icon.keybase:before{content:"\f4f5";font-family:brand-icons}i.icon.keycdn:before{content:"\f3ba";font-family:brand-icons}i.icon.kickstarter:before{content:"\f3bb";font-family:brand-icons}i.icon.kickstarter.k:before{content:"\f3bc";font-family:brand-icons}i.icon.korvue:before{content:"\f42f";font-family:brand-icons}i.icon.laravel:before{content:"\f3bd";font-family:brand-icons}i.icon.lastfm:before{content:"\f202";font-family:brand-icons}i.icon.lastfm.square:before{content:"\f203";font-family:brand-icons}i.icon.leanpub:before{content:"\f212";font-family:brand-icons}i.icon.lesscss:before{content:"\f41d";font-family:brand-icons}i.icon.linechat:before{content:"\f3c0";font-family:brand-icons}i.icon.linkedin:before{content:"\f08c";font-family:brand-icons}i.icon.linkedin.in:before{content:"\f0e1";font-family:brand-icons}i.icon.linode:before{content:"\f2b8";font-family:brand-icons}i.icon.linux:before{content:"\f17c";font-family:brand-icons}i.icon.lyft:before{content:"\f3c3";font-family:brand-icons}i.icon.magento:before{content:"\f3c4";font-family:brand-icons}i.icon.mailchimp:before{content:"\f59e";font-family:brand-icons}i.icon.mandalorian:before{content:"\f50f";font-family:brand-icons}i.icon.markdown:before{content:"\f60f";font-family:brand-icons}i.icon.mastodon:before{content:"\f4f6";font-family:brand-icons}i.icon.maxcdn:before{content:"\f136";font-family:brand-icons}i.icon.mdb:before{content:"\f8ca";font-family:brand-icons}i.icon.medapps:before{content:"\f3c6";font-family:brand-icons}i.icon.medium:before{content:"\f23a";font-family:brand-icons}i.icon.medium.m:before{content:"\f3c7";font-family:brand-icons}i.icon.medrt:before{content:"\f3c8";font-family:brand-icons}i.icon.meetup:before{content:"\f2e0";font-family:brand-icons}i.icon.megaport:before{content:"\f5a3";font-family:brand-icons}i.icon.mendeley:before{content:"\f7b3";font-family:brand-icons}i.icon.microblog:before{content:"\f91a";font-family:brand-icons}i.icon.microsoft:before{content:"\f3ca";font-family:brand-icons}i.icon.mix:before{content:"\f3cb";font-family:brand-icons}i.icon.mixcloud:before{content:"\f289";font-family:brand-icons}i.icon.mizuni:before{content:"\f3cc";font-family:brand-icons}i.icon.modx:before{content:"\f285";font-family:brand-icons}i.icon.monero:before{content:"\f3d0";font-family:brand-icons}i.icon.napster:before{content:"\f3d2";font-family:brand-icons}i.icon.neos:before{content:"\f612";font-family:brand-icons}i.icon.nimblr:before{content:"\f5a8";font-family:brand-icons}i.icon.node:before{content:"\f419";font-family:brand-icons}i.icon.node.js:before{content:"\f3d3";font-family:brand-icons}i.icon.npm:before{content:"\f3d4";font-family:brand-icons}i.icon.ns8:before{content:"\f3d5";font-family:brand-icons}i.icon.nutritionix:before{content:"\f3d6";font-family:brand-icons}i.icon.odnoklassniki:before{content:"\f263";font-family:brand-icons}i.icon.odnoklassniki.square:before{content:"\f264";font-family:brand-icons}i.icon.old.republic:before{content:"\f510";font-family:brand-icons}i.icon.opencart:before{content:"\f23d";font-family:brand-icons}i.icon.openid:before{content:"\f19b";font-family:brand-icons}i.icon.opera:before{content:"\f26a";font-family:brand-icons}i.icon.optin.monster:before{content:"\f23c";font-family:brand-icons}i.icon.orcid:before{content:"\f8d2";font-family:brand-icons}i.icon.osi:before{content:"\f41a";font-family:brand-icons}i.icon.page4:before{content:"\f3d7";font-family:brand-icons}i.icon.pagelines:before{content:"\f18c";font-family:brand-icons}i.icon.palfed:before{content:"\f3d8";font-family:brand-icons}i.icon.patreon:before{content:"\f3d9";font-family:brand-icons}i.icon.paypal:before{content:"\f1ed";font-family:brand-icons}i.icon.penny.arcade:before{content:"\f704";font-family:brand-icons}i.icon.periscope:before{content:"\f3da";font-family:brand-icons}i.icon.phabricator:before{content:"\f3db";font-family:brand-icons}i.icon.phoenix.framework:before{content:"\f3dc";font-family:brand-icons}i.icon.phoenix.squadron:before{content:"\f511";font-family:brand-icons}i.icon.php:before{content:"\f457";font-family:brand-icons}i.icon.pied.piper:before{content:"\f2ae";font-family:brand-icons}i.icon.pied.piper.alternate:before{content:"\f1a8";font-family:brand-icons}i.icon.pied.piper.hat:before{content:"\f4e5";font-family:brand-icons}i.icon.pied.piper.pp:before{content:"\f1a7";font-family:brand-icons}i.icon.pied.piper.square:before{content:"\f91e";font-family:brand-icons}i.icon.pinterest:before{content:"\f0d2";font-family:brand-icons}i.icon.pinterest.p:before{content:"\f231";font-family:brand-icons}i.icon.pinterest.square:before{content:"\f0d3";font-family:brand-icons}i.icon.playstation:before{content:"\f3df";font-family:brand-icons}i.icon.product.hunt:before{content:"\f288";font-family:brand-icons}i.icon.pushed:before{content:"\f3e1";font-family:brand-icons}i.icon.python:before{content:"\f3e2";font-family:brand-icons}i.icon.qq:before{content:"\f1d6";font-family:brand-icons}i.icon.quinscape:before{content:"\f459";font-family:brand-icons}i.icon.quora:before{content:"\f2c4";font-family:brand-icons}i.icon.r.project:before{content:"\f4f7";font-family:brand-icons}i.icon.raspberry.pi:before{content:"\f7bb";font-family:brand-icons}i.icon.ravelry:before{content:"\f2d9";font-family:brand-icons}i.icon.react:before{content:"\f41b";font-family:brand-icons}i.icon.reacteurope:before{content:"\f75d";font-family:brand-icons}i.icon.readme:before{content:"\f4d5";font-family:brand-icons}i.icon.rebel:before{content:"\f1d0";font-family:brand-icons}i.icon.reddit:before{content:"\f1a1";font-family:brand-icons}i.icon.reddit.alien:before{content:"\f281";font-family:brand-icons}i.icon.reddit.square:before{content:"\f1a2";font-family:brand-icons}i.icon.redhat:before{content:"\f7bc";font-family:brand-icons}i.icon.redriver:before{content:"\f3e3";font-family:brand-icons}i.icon.redyeti:before{content:"\f69d";font-family:brand-icons}i.icon.renren:before{content:"\f18b";font-family:brand-icons}i.icon.replyd:before{content:"\f3e6";font-family:brand-icons}i.icon.researchgate:before{content:"\f4f8";font-family:brand-icons}i.icon.resolving:before{content:"\f3e7";font-family:brand-icons}i.icon.rev:before{content:"\f5b2";font-family:brand-icons}i.icon.rocketchat:before{content:"\f3e8";font-family:brand-icons}i.icon.rockrms:before{content:"\f3e9";font-family:brand-icons}i.icon.safari:before{content:"\f267";font-family:brand-icons}i.icon.salesforce:before{content:"\f83b";font-family:brand-icons}i.icon.sass:before{content:"\f41e";font-family:brand-icons}i.icon.schlix:before{content:"\f3ea";font-family:brand-icons}i.icon.scribd:before{content:"\f28a";font-family:brand-icons}i.icon.searchengin:before{content:"\f3eb";font-family:brand-icons}i.icon.sellcast:before{content:"\f2da";font-family:brand-icons}i.icon.sellsy:before{content:"\f213";font-family:brand-icons}i.icon.servicestack:before{content:"\f3ec";font-family:brand-icons}i.icon.shirtsinbulk:before{content:"\f214";font-family:brand-icons}i.icon.shopware:before{content:"\f5b5";font-family:brand-icons}i.icon.simplybuilt:before{content:"\f215";font-family:brand-icons}i.icon.sistrix:before{content:"\f3ee";font-family:brand-icons}i.icon.sith:before{content:"\f512";font-family:brand-icons}i.icon.sketch:before{content:"\f7c6";font-family:brand-icons}i.icon.skyatlas:before{content:"\f216";font-family:brand-icons}i.icon.skype:before{content:"\f17e";font-family:brand-icons}i.icon.slack:before{content:"\f198";font-family:brand-icons}i.icon.slack.hash:before{content:"\f3ef";font-family:brand-icons}i.icon.slideshare:before{content:"\f1e7";font-family:brand-icons}i.icon.snapchat:before{content:"\f2ab";font-family:brand-icons}i.icon.snapchat.ghost:before{content:"\f2ac";font-family:brand-icons}i.icon.snapchat.square:before{content:"\f2ad";font-family:brand-icons}i.icon.soundcloud:before{content:"\f1be";font-family:brand-icons}i.icon.sourcetree:before{content:"\f7d3";font-family:brand-icons}i.icon.speakap:before{content:"\f3f3";font-family:brand-icons}i.icon.speaker.deck:before{content:"\f83c";font-family:brand-icons}i.icon.spotify:before{content:"\f1bc";font-family:brand-icons}i.icon.squarespace:before{content:"\f5be";font-family:brand-icons}i.icon.stack.exchange:before{content:"\f18d";font-family:brand-icons}i.icon.stack.overflow:before{content:"\f16c";font-family:brand-icons}i.icon.stackpath:before{content:"\f842";font-family:brand-icons}i.icon.staylinked:before{content:"\f3f5";font-family:brand-icons}i.icon.steam:before{content:"\f1b6";font-family:brand-icons}i.icon.steam.square:before{content:"\f1b7";font-family:brand-icons}i.icon.steam.symbol:before{content:"\f3f6";font-family:brand-icons}i.icon.sticker.mule:before{content:"\f3f7";font-family:brand-icons}i.icon.strava:before{content:"\f428";font-family:brand-icons}i.icon.stripe:before{content:"\f429";font-family:brand-icons}i.icon.stripe.s:before{content:"\f42a";font-family:brand-icons}i.icon.studiovinari:before{content:"\f3f8";font-family:brand-icons}i.icon.stumbleupon:before{content:"\f1a4";font-family:brand-icons}i.icon.stumbleupon.circle:before{content:"\f1a3";font-family:brand-icons}i.icon.superpowers:before{content:"\f2dd";font-family:brand-icons}i.icon.supple:before{content:"\f3f9";font-family:brand-icons}i.icon.suse:before{content:"\f7d6";font-family:brand-icons}i.icon.swift:before{content:"\f8e1";font-family:brand-icons}i.icon.symfony:before{content:"\f83d";font-family:brand-icons}i.icon.teamspeak:before{content:"\f4f9";font-family:brand-icons}i.icon.telegram:before{content:"\f2c6";font-family:brand-icons}i.icon.telegram.plane:before{content:"\f3fe";font-family:brand-icons}i.icon.tencent.weibo:before{content:"\f1d5";font-family:brand-icons}i.icon.themeco:before{content:"\f5c6";font-family:brand-icons}i.icon.themeisle:before{content:"\f2b2";font-family:brand-icons}i.icon.think.peaks:before{content:"\f731";font-family:brand-icons}i.icon.trade.federation:before{content:"\f513";font-family:brand-icons}i.icon.trello:before{content:"\f181";font-family:brand-icons}i.icon.tripadvisor:before{content:"\f262";font-family:brand-icons}i.icon.tumblr:before{content:"\f173";font-family:brand-icons}i.icon.tumblr.square:before{content:"\f174";font-family:brand-icons}i.icon.twitch:before{content:"\f1e8";font-family:brand-icons}i.icon.twitter:before{content:"\f099";font-family:brand-icons}i.icon.twitter.square:before{content:"\f081";font-family:brand-icons}i.icon.typo3:before{content:"\f42b";font-family:brand-icons}i.icon.uber:before{content:"\f402";font-family:brand-icons}i.icon.ubuntu:before{content:"\f7df";font-family:brand-icons}i.icon.uikit:before{content:"\f403";font-family:brand-icons}i.icon.umbraco:before{content:"\f8e8";font-family:brand-icons}i.icon.uniregistry:before{content:"\f404";font-family:brand-icons}i.icon.unity:before{content:"\f949";font-family:brand-icons}i.icon.untappd:before{content:"\f405";font-family:brand-icons}i.icon.ups:before{content:"\f7e0";font-family:brand-icons}i.icon.usb:before{content:"\f287";font-family:brand-icons}i.icon.usps:before{content:"\f7e1";font-family:brand-icons}i.icon.ussunnah:before{content:"\f407";font-family:brand-icons}i.icon.vaadin:before{content:"\f408";font-family:brand-icons}i.icon.viacoin:before{content:"\f237";font-family:brand-icons}i.icon.viadeo:before{content:"\f2a9";font-family:brand-icons}i.icon.viadeo.square:before{content:"\f2aa";font-family:brand-icons}i.icon.viber:before{content:"\f409";font-family:brand-icons}i.icon.vimeo:before{content:"\f40a";font-family:brand-icons}i.icon.vimeo.square:before{content:"\f194";font-family:brand-icons}i.icon.vimeo.v:before{content:"\f27d";font-family:brand-icons}i.icon.vine:before{content:"\f1ca";font-family:brand-icons}i.icon.vk:before{content:"\f189";font-family:brand-icons}i.icon.vnv:before{content:"\f40b";font-family:brand-icons}i.icon.vuejs:before{content:"\f41f";font-family:brand-icons}i.icon.waze:before{content:"\f83f";font-family:brand-icons}i.icon.weebly:before{content:"\f5cc";font-family:brand-icons}i.icon.weibo:before{content:"\f18a";font-family:brand-icons}i.icon.weixin:before{content:"\f1d7";font-family:brand-icons}i.icon.whatsapp:before{content:"\f232";font-family:brand-icons}i.icon.whatsapp.square:before{content:"\f40c";font-family:brand-icons}i.icon.whmcs:before{content:"\f40d";font-family:brand-icons}i.icon.wikipedia.w:before{content:"\f266";font-family:brand-icons}i.icon.windows:before{content:"\f17a";font-family:brand-icons}i.icon.wix:before{content:"\f5cf";font-family:brand-icons}i.icon.wizards.of.the.coast:before{content:"\f730";font-family:brand-icons}i.icon.wolf.pack.battalion:before{content:"\f514";font-family:brand-icons}i.icon.wordpress:before{content:"\f19a";font-family:brand-icons}i.icon.wordpress.simple:before{content:"\f411";font-family:brand-icons}i.icon.wpbeginner:before{content:"\f297";font-family:brand-icons}i.icon.wpexplorer:before{content:"\f2de";font-family:brand-icons}i.icon.wpforms:before{content:"\f298";font-family:brand-icons}i.icon.wpressr:before{content:"\f3e4";font-family:brand-icons}i.icon.xbox:before{content:"\f412";font-family:brand-icons}i.icon.xing:before{content:"\f168";font-family:brand-icons}i.icon.xing.square:before{content:"\f169";font-family:brand-icons}i.icon.y.combinator:before{content:"\f23b";font-family:brand-icons}i.icon.yahoo:before{content:"\f19e";font-family:brand-icons}i.icon.yammer:before{content:"\f840";font-family:brand-icons}i.icon.yandex:before{content:"\f413";font-family:brand-icons}i.icon.yandex.international:before{content:"\f414";font-family:brand-icons}i.icon.yarn:before{content:"\f7e3";font-family:brand-icons}i.icon.yelp:before{content:"\f1e9";font-family:brand-icons}i.icon.yoast:before{content:"\f2b1";font-family:brand-icons}i.icon.youtube:before{content:"\f167";font-family:brand-icons}i.icon.youtube.square:before{content:"\f431";font-family:brand-icons}i.icon.zhihu:before{content:"\f63f";font-family:brand-icons}i.icon.american.express:before{content:"\f1f3";font-family:brand-icons}i.icon.american.express.card:before{content:"\f1f3";font-family:brand-icons}i.icon.amex:before{content:"\f1f3";font-family:brand-icons}i.icon.bitbucket.square:before{content:"\f171";font-family:brand-icons}i.icon.bluetooth.alternative:before{content:"\f294";font-family:brand-icons}i.icon.credit.card.amazon.pay:before{content:"\f42d";font-family:brand-icons}i.icon.credit.card.american.express:before{content:"\f1f3";font-family:brand-icons}i.icon.credit.card.diners.club:before{content:"\f24c";font-family:brand-icons}i.icon.credit.card.discover:before{content:"\f1f2";font-family:brand-icons}i.icon.credit.card.jcb:before{content:"\f24b";font-family:brand-icons}i.icon.credit.card.mastercard:before{content:"\f1f1";font-family:brand-icons}i.icon.credit.card.paypal:before{content:"\f1f4";font-family:brand-icons}i.icon.credit.card.stripe:before{content:"\f1f5";font-family:brand-icons}i.icon.credit.card.visa:before{content:"\f1f0";font-family:brand-icons}i.icon.diners.club:before{content:"\f24c";font-family:brand-icons}i.icon.diners.club.card:before{content:"\f24c";font-family:brand-icons}i.icon.discover:before{content:"\f1f2";font-family:brand-icons}i.icon.discover.card:before{content:"\f1f2";font-family:brand-icons}i.icon.disk.outline:before{content:"\f369";font-family:brand-icons}i.icon.dribble:before{content:"\f17d";font-family:brand-icons}i.icon.eercast:before{content:"\f2da";font-family:brand-icons}i.icon.envira.gallery:before{content:"\f299";font-family:brand-icons}i.icon.fa:before{content:"\f2b4";font-family:brand-icons}i.icon.facebook.official:before{content:"\f082";font-family:brand-icons}i.icon.five.hundred.pixels:before{content:"\f26e";font-family:brand-icons}i.icon.gittip:before{content:"\f184";font-family:brand-icons}i.icon.google.plus.circle:before{content:"\f2b3";font-family:brand-icons}i.icon.google.plus.official:before{content:"\f2b3";font-family:brand-icons}i.icon.japan.credit.bureau:before{content:"\f24b";font-family:brand-icons}i.icon.japan.credit.bureau.card:before{content:"\f24b";font-family:brand-icons}i.icon.jcb:before{content:"\f24b";font-family:brand-icons}i.icon.linkedin.square:before{content:"\f08c";font-family:brand-icons}i.icon.mastercard:before{content:"\f1f1";font-family:brand-icons}i.icon.mastercard.card:before{content:"\f1f1";font-family:brand-icons}i.icon.microsoft.edge:before{content:"\f282";font-family:brand-icons}i.icon.ms.edge:before{content:"\f282";font-family:brand-icons}i.icon.new.pied.piper:before{content:"\f2ae";font-family:brand-icons}i.icon.optinmonster:before{content:"\f23c";font-family:brand-icons}i.icon.paypal.card:before{content:"\f1f4";font-family:brand-icons}i.icon.pied.piper.hat:before{content:"\f2ae";font-family:brand-icons}i.icon.pocket:before{content:"\f265";font-family:brand-icons}i.icon.stripe.card:before{content:"\f1f5";font-family:brand-icons}i.icon.theme.isle:before{content:"\f2b2";font-family:brand-icons}i.icon.visa:before{content:"\f1f0";font-family:brand-icons}i.icon.visa.card:before{content:"\f1f0";font-family:brand-icons}i.icon.wechat:before{content:"\f1d7";font-family:brand-icons}i.icon.wikipedia:before{content:"\f266";font-family:brand-icons}i.icon.wordpress.beginner:before{content:"\f297";font-family:brand-icons}i.icon.wordpress.forms:before{content:"\f298";font-family:brand-icons}i.icon.yc:before{content:"\f23b";font-family:brand-icons}i.icon.ycombinator:before{content:"\f23b";font-family:brand-icons}i.icon.youtube.play:before{content:"\f167";font-family:brand-icons}/*! + * # Fomantic-UI - Image + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.image{position:relative;display:inline-block;vertical-align:middle;max-width:100%;background-color:transparent}img.ui.image{display:block}.ui.image img,.ui.image svg{display:block;max-width:100%;height:auto}.ui.hidden.images,.ui.ui.hidden.image{display:none}.ui.hidden.transition.image,.ui.hidden.transition.images{display:block;visibility:hidden}.ui.images>.hidden.transition{display:inline-block;visibility:hidden}.ui.disabled.image,.ui.disabled.images{cursor:default;opacity:.45}.ui.inline.image,.ui.inline.image img,.ui.inline.image svg{display:inline-block}.ui.top.aligned.image,.ui.top.aligned.image img,.ui.top.aligned.image svg,.ui.top.aligned.images .image{display:inline-block;vertical-align:top}.ui.middle.aligned.image,.ui.middle.aligned.image img,.ui.middle.aligned.image svg,.ui.middle.aligned.images .image{display:inline-block;vertical-align:middle}.ui.bottom.aligned.image,.ui.bottom.aligned.image img,.ui.bottom.aligned.image svg,.ui.bottom.aligned.images .image{display:inline-block;vertical-align:bottom}.ui.rounded.image,.ui.rounded.image>*,.ui.rounded.images .image,.ui.rounded.images .image>*{border-radius:.3125em}.ui.bordered.image img,.ui.bordered.image svg,.ui.bordered.images .image,.ui.bordered.images img,.ui.bordered.images svg,img.ui.bordered.image{border:1px solid rgba(0,0,0,.1)}.ui.circular.image,.ui.circular.images{overflow:hidden}.ui.circular.image,.ui.circular.image>*,.ui.circular.images .image,.ui.circular.images .image>*{border-radius:500rem}.ui.fluid.image,.ui.fluid.image img,.ui.fluid.image svg,.ui.fluid.images,.ui.fluid.images img,.ui.fluid.images svg{display:block;width:100%;height:auto}.ui.avatar.image,.ui.avatar.image img,.ui.avatar.image svg,.ui.avatar.images .image,.ui.avatar.images img,.ui.avatar.images svg{margin-right:.25em;display:inline-block;width:2em;height:2em;border-radius:500rem}.ui.spaced.image{display:inline-block!important;margin-left:.5em;margin-right:.5em}.ui[class*="left spaced"].image{margin-left:.5em;margin-right:0}.ui[class*="right spaced"].image{margin-left:0;margin-right:.5em}.ui.floated.image,.ui.floated.images{float:left;margin-right:1em;margin-bottom:1em}.ui.right.floated.image,.ui.right.floated.images{float:right;margin-right:0;margin-bottom:1em;margin-left:1em}.ui.floated.image:last-child,.ui.floated.images:last-child{margin-bottom:0}.ui.centered.image,.ui.centered.images{margin-left:auto;margin-right:auto}.ui.medium.image,.ui.medium.images .image,.ui.medium.images img,.ui.medium.images svg{width:300px;height:auto;font-size:1rem}.ui.mini.image,.ui.mini.images .image,.ui.mini.images img,.ui.mini.images svg{width:35px;height:auto;font-size:.78571429rem}.ui.tiny.image,.ui.tiny.images .image,.ui.tiny.images img,.ui.tiny.images svg{width:80px;height:auto;font-size:.85714286rem}.ui.small.image,.ui.small.images .image,.ui.small.images img,.ui.small.images svg{width:150px;height:auto;font-size:.92857143rem}.ui.large.image,.ui.large.images .image,.ui.large.images img,.ui.large.images svg{width:450px;height:auto;font-size:1.14285714rem}.ui.big.image,.ui.big.images .image,.ui.big.images img,.ui.big.images svg{width:600px;height:auto;font-size:1.28571429rem}.ui.huge.image,.ui.huge.images .image,.ui.huge.images img,.ui.huge.images svg{width:800px;height:auto;font-size:1.42857143rem}.ui.massive.image,.ui.massive.images .image,.ui.massive.images img,.ui.massive.images svg{width:960px;height:auto;font-size:1.71428571rem}.ui.images{font-size:0;margin:0 -.25rem 0}.ui.images .image,.ui.images>img,.ui.images>svg{display:inline-block;margin:0 .25rem .5rem}/*! + * # Fomantic-UI - Input + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.input{position:relative;font-weight:400;font-style:normal;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;color:rgba(0,0,0,.87)}.ui.input>input{margin:0;max-width:100%;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;outline:0;-webkit-tap-highlight-color:rgba(255,255,255,0);text-align:left;line-height:1.21428571em;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;padding:.67857143em 1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-transition:border-color .1s ease,-webkit-box-shadow .1s ease;transition:border-color .1s ease,-webkit-box-shadow .1s ease;transition:box-shadow .1s ease,border-color .1s ease;transition:box-shadow .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;-webkit-box-shadow:none;box-shadow:none}.ui.input>input::-webkit-input-placeholder{color:rgba(191,191,191,.87)}.ui.input>input::-moz-placeholder{color:rgba(191,191,191,.87)}.ui.input>input:-ms-input-placeholder{color:rgba(191,191,191,.87)}.ui.disabled.input,.ui.input:not(.disabled) input[disabled]{opacity:.45}.ui.disabled.input>input,.ui.input:not(.disabled) input[disabled]{pointer-events:none}.ui.input.down input,.ui.input>input:active{border-color:rgba(0,0,0,.3);background:#fafafa;color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none}.ui.loading.loading.input>i.icon:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loading.loading.input>i.icon:after{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;-webkit-animation:loader .6s infinite linear;animation:loader .6s infinite linear;border:.2em solid #767676;border-radius:500rem;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}.ui.input.focus>input,.ui.input>input:focus{border-color:#85b7d9;background:#fff;color:rgba(0,0,0,.8);-webkit-box-shadow:none;box-shadow:none}.ui.input.focus>input::-webkit-input-placeholder,.ui.input>input:focus::-webkit-input-placeholder{color:rgba(115,115,115,.87)}.ui.input.focus>input::-moz-placeholder,.ui.input>input:focus::-moz-placeholder{color:rgba(115,115,115,.87)}.ui.input.focus>input:-ms-input-placeholder,.ui.input>input:focus:-ms-input-placeholder{color:rgba(115,115,115,.87)}.ui.input.error>input{background-color:#fff6f6;border-color:#e0b4b4;color:#9f3a38;-webkit-box-shadow:none;box-shadow:none}.ui.input.error>input::-webkit-input-placeholder{color:#e7bdbc}.ui.input.error>input::-moz-placeholder{color:#e7bdbc}.ui.input.error>input:-ms-input-placeholder{color:#e7bdbc}.ui.input.error>input:focus::-webkit-input-placeholder{color:#da9796}.ui.input.error>input:focus::-moz-placeholder{color:#da9796}.ui.input.error>input:focus:-ms-input-placeholder{color:#da9796}.ui.input.info>input{background-color:#f8ffff;border-color:#a9d5de;color:#276f86;-webkit-box-shadow:none;box-shadow:none}.ui.input.info>input::-webkit-input-placeholder{color:#98cfe1}.ui.input.info>input::-moz-placeholder{color:#98cfe1}.ui.input.info>input:-ms-input-placeholder{color:#98cfe1}.ui.input.info>input:focus::-webkit-input-placeholder{color:#70bdd6}.ui.input.info>input:focus::-moz-placeholder{color:#70bdd6}.ui.input.info>input:focus:-ms-input-placeholder{color:#70bdd6}.ui.input.success>input{background-color:#fcfff5;border-color:#a3c293;color:#2c662d;-webkit-box-shadow:none;box-shadow:none}.ui.input.success>input::-webkit-input-placeholder{color:#8fcf90}.ui.input.success>input::-moz-placeholder{color:#8fcf90}.ui.input.success>input:-ms-input-placeholder{color:#8fcf90}.ui.input.success>input:focus::-webkit-input-placeholder{color:#6cbf6d}.ui.input.success>input:focus::-moz-placeholder{color:#6cbf6d}.ui.input.success>input:focus:-ms-input-placeholder{color:#6cbf6d}.ui.input.warning>input{background-color:#fffaf3;border-color:#c9ba9b;color:#573a08;-webkit-box-shadow:none;box-shadow:none}.ui.input.warning>input::-webkit-input-placeholder{color:#edad3e}.ui.input.warning>input::-moz-placeholder{color:#edad3e}.ui.input.warning>input:-ms-input-placeholder{color:#edad3e}.ui.input.warning>input:focus::-webkit-input-placeholder{color:#e39715}.ui.input.warning>input:focus::-moz-placeholder{color:#e39715}.ui.input.warning>input:focus:-ms-input-placeholder{color:#e39715}.ui.transparent.input>input,.ui.transparent.input>textarea{border-color:transparent!important;background-color:transparent!important;padding:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-radius:0!important}.field .ui.transparent.input>textarea{padding:.67857143em 1em}:not(.field)>.ui.transparent.icon.input>i.icon{width:1.1em}:not(.field)>.ui.ui.ui.transparent.icon.input>input{padding-left:0;padding-right:2em}:not(.field)>.ui.ui.ui.transparent[class*="left icon"].input>input{padding-left:2em;padding-right:0}.ui.transparent.inverted.input{color:#fff}.ui.ui.transparent.inverted.input>input,.ui.ui.transparent.inverted.input>textarea{color:inherit}.ui.transparent.inverted.input>input::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.ui.transparent.inverted.input>input::-moz-placeholder{color:rgba(255,255,255,.5)}.ui.transparent.inverted.input>input:-ms-input-placeholder{color:rgba(255,255,255,.5)}.ui.icon.input>i.icon{cursor:default;position:absolute;line-height:1;text-align:center;top:0;right:0;margin:0;height:100%;width:2.67142857em;opacity:.5;border-radius:0 .28571429rem .28571429rem 0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.ui.icon.input>i.icon:not(.link){pointer-events:none}.ui.ui.ui.ui.icon.input>input,.ui.ui.ui.ui.icon.input>textarea{padding-right:2.67142857em}.ui.icon.input>i.icon:after,.ui.icon.input>i.icon:before{left:0;position:absolute;text-align:center;top:50%;width:100%;margin-top:-.5em}.ui.icon.input>i.link.icon{cursor:pointer}.ui.icon.input>i.circular.icon{top:.35em;right:.5em}.ui[class*="left icon"].input>i.icon{right:auto;left:1px;border-radius:.28571429rem 0 0 .28571429rem}.ui[class*="left icon"].input>i.circular.icon{right:auto;left:.5em}.ui.ui.ui.ui[class*="left icon"].input>input,.ui.ui.ui.ui[class*="left icon"].input>textarea{padding-left:2.67142857em;padding-right:1em}.ui.icon.input>input:focus~i.icon,.ui.icon.input>textarea:focus~i.icon{opacity:1}.ui.labeled.input>.label{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin:0;font-size:1em}.ui.labeled.input>.label:not(.corner){padding-top:.78571429em;padding-bottom:.78571429em}.ui.labeled.input:not([class*="corner labeled"]) .label:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.ui.labeled.input:not([class*="corner labeled"]) .label:first-child+input{border-top-left-radius:0;border-bottom-left-radius:0;border-left-color:transparent}.ui.labeled.input:not([class*="corner labeled"]) .label:first-child+input:focus{border-left-color:#85b7d9}.ui[class*="right labeled"].input>input{border-top-right-radius:0!important;border-bottom-right-radius:0!important;border-right-color:transparent!important}.ui[class*="right labeled"].input>input+.label{border-top-left-radius:0;border-bottom-left-radius:0}.ui[class*="right labeled"].input>input:focus{border-right-color:#85b7d9!important}.ui.labeled.input .corner.label{top:1px;right:1px;font-size:.64285714em;border-radius:0 .28571429rem 0 0}.ui[class*="corner labeled"]:not([class*="left corner labeled"]).labeled.input>input,.ui[class*="corner labeled"]:not([class*="left corner labeled"]).labeled.input>textarea{padding-right:2.5em!important}.ui[class*="corner labeled"].icon.input:not([class*="left corner labeled"])>input,.ui[class*="corner labeled"].icon.input:not([class*="left corner labeled"])>textarea{padding-right:3.25em!important}.ui[class*="corner labeled"].icon.input:not([class*="left corner labeled"])>.icon{margin-right:1.25em}.ui[class*="left corner labeled"].labeled.input>input,.ui[class*="left corner labeled"].labeled.input>textarea{padding-left:2.5em!important}.ui[class*="left corner labeled"].icon.input>input,.ui[class*="left corner labeled"].icon.input>textarea{padding-left:3.25em!important}.ui[class*="left corner labeled"].icon.input>.icon{margin-left:1.25em}.ui.icon.input>textarea~.icon{height:3em}:not(.field)>.ui.transparent.icon.input>textarea~.icon{height:1.3em}.ui.input>.ui.corner.label{top:1px;right:1px}.ui.input>.ui.left.corner.label{right:auto;left:1px}.ui.action.input.error>.ui.button,.ui.form>.field.error>.ui.action.input>.ui.button,.ui.form>.field.error>.ui.labeled.input:not([class*="corner labeled"])>.ui.label,.ui.labeled.input.error:not([class*="corner labeled"])>.ui.label{border-top:1px solid #e0b4b4;border-bottom:1px solid #e0b4b4}.ui.form>.field.error>.ui.labeled.input:not(.right):not([class*="corner labeled"])>.ui.label,.ui.form>.field.error>.ui.left.action.input>.ui.button,.ui.labeled.input.error:not(.right):not([class*="corner labeled"])>.ui.label,.ui.left.action.input.error>.ui.button{border-left:1px solid #e0b4b4}.ui.action.input.error:not(.left)>input+.ui.button,.ui.form>.field.error>.ui.action.input:not(.left)>input+.ui.button,.ui.form>.field.error>.ui.right.labeled.input:not([class*="corner labeled"])>input+.ui.label,.ui.right.labeled.input.error:not([class*="corner labeled"])>input+.ui.label{border-right:1px solid #e0b4b4}.ui.form>.field.error>.ui.right.labeled.input:not([class*="corner labeled"])>.ui.label:first-child,.ui.right.labeled.input.error:not([class*="corner labeled"])>.ui.label:first-child{border-left:1px solid #e0b4b4}.ui.action.input.info>.ui.button,.ui.form>.field.info>.ui.action.input>.ui.button,.ui.form>.field.info>.ui.labeled.input:not([class*="corner labeled"])>.ui.label,.ui.labeled.input.info:not([class*="corner labeled"])>.ui.label{border-top:1px solid #a9d5de;border-bottom:1px solid #a9d5de}.ui.form>.field.info>.ui.labeled.input:not(.right):not([class*="corner labeled"])>.ui.label,.ui.form>.field.info>.ui.left.action.input>.ui.button,.ui.labeled.input.info:not(.right):not([class*="corner labeled"])>.ui.label,.ui.left.action.input.info>.ui.button{border-left:1px solid #a9d5de}.ui.action.input.info:not(.left)>input+.ui.button,.ui.form>.field.info>.ui.action.input:not(.left)>input+.ui.button,.ui.form>.field.info>.ui.right.labeled.input:not([class*="corner labeled"])>input+.ui.label,.ui.right.labeled.input.info:not([class*="corner labeled"])>input+.ui.label{border-right:1px solid #a9d5de}.ui.form>.field.info>.ui.right.labeled.input:not([class*="corner labeled"])>.ui.label:first-child,.ui.right.labeled.input.info:not([class*="corner labeled"])>.ui.label:first-child{border-left:1px solid #a9d5de}.ui.action.input.success>.ui.button,.ui.form>.field.success>.ui.action.input>.ui.button,.ui.form>.field.success>.ui.labeled.input:not([class*="corner labeled"])>.ui.label,.ui.labeled.input.success:not([class*="corner labeled"])>.ui.label{border-top:1px solid #a3c293;border-bottom:1px solid #a3c293}.ui.form>.field.success>.ui.labeled.input:not(.right):not([class*="corner labeled"])>.ui.label,.ui.form>.field.success>.ui.left.action.input>.ui.button,.ui.labeled.input.success:not(.right):not([class*="corner labeled"])>.ui.label,.ui.left.action.input.success>.ui.button{border-left:1px solid #a3c293}.ui.action.input.success:not(.left)>input+.ui.button,.ui.form>.field.success>.ui.action.input:not(.left)>input+.ui.button,.ui.form>.field.success>.ui.right.labeled.input:not([class*="corner labeled"])>input+.ui.label,.ui.right.labeled.input.success:not([class*="corner labeled"])>input+.ui.label{border-right:1px solid #a3c293}.ui.form>.field.success>.ui.right.labeled.input:not([class*="corner labeled"])>.ui.label:first-child,.ui.right.labeled.input.success:not([class*="corner labeled"])>.ui.label:first-child{border-left:1px solid #a3c293}.ui.action.input.warning>.ui.button,.ui.form>.field.warning>.ui.action.input>.ui.button,.ui.form>.field.warning>.ui.labeled.input:not([class*="corner labeled"])>.ui.label,.ui.labeled.input.warning:not([class*="corner labeled"])>.ui.label{border-top:1px solid #c9ba9b;border-bottom:1px solid #c9ba9b}.ui.form>.field.warning>.ui.labeled.input:not(.right):not([class*="corner labeled"])>.ui.label,.ui.form>.field.warning>.ui.left.action.input>.ui.button,.ui.labeled.input.warning:not(.right):not([class*="corner labeled"])>.ui.label,.ui.left.action.input.warning>.ui.button{border-left:1px solid #c9ba9b}.ui.action.input.warning:not(.left)>input+.ui.button,.ui.form>.field.warning>.ui.action.input:not(.left)>input+.ui.button,.ui.form>.field.warning>.ui.right.labeled.input:not([class*="corner labeled"])>input+.ui.label,.ui.right.labeled.input.warning:not([class*="corner labeled"])>input+.ui.label{border-right:1px solid #c9ba9b}.ui.form>.field.warning>.ui.right.labeled.input:not([class*="corner labeled"])>.ui.label:first-child,.ui.right.labeled.input.warning:not([class*="corner labeled"])>.ui.label:first-child{border-left:1px solid #c9ba9b}.ui.action.input>.button,.ui.action.input>.buttons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.ui.action.input>.button,.ui.action.input>.buttons>.button{padding-top:.78571429em;padding-bottom:.78571429em;margin:0}.ui[class*="left action"].input>input{border-top-left-radius:0;border-bottom-left-radius:0;border-left-color:transparent}.ui.action.input:not([class*="left action"])>input{border-top-right-radius:0;border-bottom-right-radius:0;border-right-color:transparent}.ui.action.input>.button:first-child,.ui.action.input>.buttons:first-child>.button,.ui.action.input>.dropdown:first-child{border-radius:.28571429rem 0 0 .28571429rem}.ui.action.input>.button:not(:first-child),.ui.action.input>.buttons:not(:first-child)>.button,.ui.action.input>.dropdown:not(:first-child){border-radius:0}.ui.action.input>.button:last-child,.ui.action.input>.buttons:last-child>.button,.ui.action.input>.dropdown:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.action.input:not([class*="left action"])>input:focus{border-right-color:#85b7d9}.ui.ui[class*="left action"].input>input:focus{border-left-color:#85b7d9}.ui.inverted.input>input{border:none}.ui.fluid.input{display:-webkit-box;display:-ms-flexbox;display:flex}.ui.fluid.input>input{width:0!important}.ui.input{font-size:1em}.ui.mini.input{font-size:.78571429em}.ui.tiny.input{font-size:.85714286em}.ui.small.input{font-size:.92857143em}.ui.large.input{font-size:1.14285714em}.ui.big.input{font-size:1.28571429em}.ui.huge.input{font-size:1.42857143em}.ui.massive.input{font-size:1.71428571em}/*! + * # Fomantic-UI - Label + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.label{display:inline-block;line-height:1;vertical-align:baseline;margin:0 .14285714em;background-color:#e8e8e8;background-image:none;padding:.5833em .833em;color:rgba(0,0,0,.6);text-transform:none;font-weight:700;border:0 solid transparent;border-radius:.28571429rem;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.label:first-child{margin-left:0}.ui.label:last-child{margin-right:0}a.ui.label{cursor:pointer}.ui.label>a{cursor:pointer;color:inherit;opacity:.5;-webkit-transition:.1s opacity ease;transition:.1s opacity ease}.ui.label>a:hover{opacity:1}.ui.label>img{width:auto!important;vertical-align:middle;height:2.1666em}.ui.label>.icon,.ui.left.icon.label>.icon{width:auto;margin:0 .75em 0 0}.ui.label>.detail{display:inline-block;vertical-align:top;font-weight:700;margin-left:1em;opacity:.8}.ui.label>.detail .icon{margin:0 .25em 0 0}.ui.label>.close.icon,.ui.label>.delete.icon{cursor:pointer;font-size:.92857143em;opacity:.5;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.label>.close.icon:hover,.ui.label>.delete.icon:hover{opacity:1}.ui.label.left.icon>.close.icon,.ui.label.left.icon>.delete.icon{margin:0 .5em 0 0}.ui.label:not(.icon)>.close.icon,.ui.label:not(.icon)>.delete.icon{margin:0 0 0 .5em}.ui.icon.label>.icon{margin:0 auto}.ui.right.icon.label>.icon{margin:0 0 0 .75em}.ui.labels>.label{margin:0 .5em .5em 0}.ui.header>.ui.label{margin-top:-.29165em}.ui.attached.segment>.ui.top.left.attached.label,.ui.bottom.attached.segment>.ui.top.left.attached.label{border-top-left-radius:0}.ui.attached.segment>.ui.top.right.attached.label,.ui.bottom.attached.segment>.ui.top.right.attached.label{border-top-right-radius:0}.ui.top.attached.segment>.ui.bottom.left.attached.label{border-bottom-left-radius:0}.ui.top.attached.segment>.ui.bottom.right.attached.label{border-bottom-right-radius:0}.ui.top.attached.label+:not(.attached),.ui.top.attached.label~.ui.bottom.attached.label+:not(.attached){margin-top:2rem!important}.ui.bottom.attached.label~:last-child:not(.attached){margin-top:0;margin-bottom:2rem!important}.ui.image.label{width:auto!important;margin-top:0;margin-bottom:0;max-width:9999px;vertical-align:baseline;text-transform:none;background:#e8e8e8;padding:.5833em .833em .5833em .5em;border-radius:.28571429rem;-webkit-box-shadow:none;box-shadow:none}.ui.image.label img{display:inline-block;vertical-align:top;height:2.1666em;margin:-.5833em .5em -.5833em -.5em;border-radius:.28571429rem 0 0 .28571429rem}.ui.image.label .detail{background:rgba(0,0,0,.1);margin:-.5833em -.833em -.5833em .5em;padding:.5833em .833em;border-radius:0 .28571429rem .28571429rem 0}.ui.tag.label,.ui.tag.labels .label{margin-left:1em;position:relative;padding-left:1.5em;padding-right:1.5em;border-radius:0 .28571429rem .28571429rem 0;-webkit-transition:none;transition:none}.ui.tag.label:before,.ui.tag.labels .label:before{position:absolute;-webkit-transform:translateY(-50%) translateX(50%) rotate(-45deg);transform:translateY(-50%) translateX(50%) rotate(-45deg);top:50%;right:100%;content:'';background-color:inherit;background-image:none;width:1.56em;height:1.56em;-webkit-transition:none;transition:none}.ui.tag.label:after,.ui.tag.labels .label:after{position:absolute;content:'';top:50%;left:-.25em;margin-top:-.25em;background-color:#fff;width:.5em;height:.5em;-webkit-box-shadow:0 -1px 1px 0 rgba(0,0,0,.3);box-shadow:0 -1px 1px 0 rgba(0,0,0,.3);border-radius:500rem}.ui.basic.tag.label:before,.ui.basic.tag.labels .label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;right:calc(100% + 1px)}.ui.basic.tag.label:after,.ui.basic.tag.labels .label:after{-webkit-box-shadow:0 -1px 3px 0 rgba(0,0,0,.8);box-shadow:0 -1px 3px 0 rgba(0,0,0,.8)}.ui.corner.label{position:absolute;top:0;right:0;margin:0;padding:0;text-align:center;border-color:#e8e8e8;width:4em;height:4em;z-index:1;-webkit-transition:border-color .1s ease;transition:border-color .1s ease}.ui.corner.label{background-color:transparent!important}.ui.corner.label:after{position:absolute;content:"";right:0;top:0;z-index:-1;width:0;height:0;background-color:transparent;border-top:0 solid transparent;border-right:4em solid transparent;border-bottom:4em solid transparent;border-left:0 solid transparent;border-right-color:inherit;-webkit-transition:border-color .1s ease;transition:border-color .1s ease}.ui.corner.label .icon{cursor:inherit;position:absolute;top:.64285714em;left:auto;right:.57142857em;font-size:1.14285714em;margin:0}.ui.left.corner.label,.ui.left.corner.label:after{right:auto;left:0}.ui.left.corner.label:after{border-top:4em solid transparent;border-right:4em solid transparent;border-bottom:0 solid transparent;border-left:0 solid transparent;border-top-color:inherit}.ui.left.corner.label .icon{left:.57142857em;right:auto}.ui.segment>.ui.corner.label{top:-1px;right:-1px}.ui.segment>.ui.left.corner.label{right:auto;left:-1px}.ui.ribbon.label{position:relative;margin:0;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;border-radius:0 .28571429rem .28571429rem 0;border-color:rgba(0,0,0,.15)}.ui.ribbon.label:after{position:absolute;content:'';top:100%;left:0;background-color:transparent;border-style:solid;border-width:0 1.2em 1.2em 0;border-color:transparent;border-right-color:inherit;width:0;height:0}.ui.ribbon.label{left:calc(-1rem - 1.2em);margin-right:-1.2em;padding-left:calc(1rem + 1.2em);padding-right:1.2em}.ui[class*="right ribbon"].label{left:calc(100% + 1rem + 1.2em);padding-left:1.2em;padding-right:calc(1rem + 1.2em)}.ui.basic.ribbon.label{padding-top:calc(.5833em - 1px);padding-bottom:calc(.5833em - 1px)}.ui.basic.ribbon.label:not([class*="right ribbon"]){padding-left:calc(1rem + 1.2em - 1px);padding-right:calc(1.2em - 1px)}.ui.basic[class*="right ribbon"].label{padding-left:calc(1.2em - 1px);padding-right:calc(1rem + 1.2em - 1px)}.ui.basic.ribbon.label::after{top:calc(100% + 1px)}.ui.basic.ribbon.label:not([class*="right ribbon"])::after{left:-1px}.ui.basic[class*="right ribbon"].label::after{right:-1px}.ui[class*="right ribbon"].label{text-align:left;-webkit-transform:translateX(-100%);transform:translateX(-100%);border-radius:.28571429rem 0 0 .28571429rem}.ui[class*="right ribbon"].label:after{left:auto;right:0;border-style:solid;border-width:1.2em 1.2em 0 0;border-color:transparent;border-top-color:inherit}.ui.card .image>.ribbon.label,.ui.image>.ribbon.label{position:absolute;top:1rem}.ui.card .image>.ui.ribbon.label,.ui.image>.ui.ribbon.label{left:calc(.05rem - 1.2em)}.ui.card .image>.ui[class*="right ribbon"].label,.ui.image>.ui[class*="right ribbon"].label{left:calc(100% + -.05rem + 1.2em);padding-left:.833em}.ui.table td>.ui.ribbon.label{left:calc(-1em - 1.2em)}.ui.table td>.ui[class*="right ribbon"].label{left:calc(100% + 1em + 1.2em);padding-left:.833em}.ui.attached.label,.ui[class*="top attached"].label{width:100%;position:absolute;margin:0;top:0;left:0;padding:.75em 1em;border-radius:.21428571rem .21428571rem 0 0}.ui[class*="bottom attached"].label{top:auto;bottom:0;border-radius:0 0 .21428571rem .21428571rem}.ui[class*="top left attached"].label{width:auto;margin-top:0!important;border-radius:.21428571rem 0 .28571429rem 0}.ui[class*="top right attached"].label{width:auto;left:auto;right:0;border-radius:0 .21428571rem 0 .28571429rem}.ui[class*="bottom left attached"].label{width:auto;top:auto;bottom:0;border-radius:0 .28571429rem 0 .21428571rem}.ui[class*="bottom right attached"].label{top:auto;bottom:0;left:auto;right:0;width:auto;border-radius:.28571429rem 0 .21428571rem 0}.ui.label.disabled{opacity:.5}.ui.labels a.label:hover,a.ui.label:hover{background-color:#e0e0e0;border-color:#e0e0e0;background-image:none;color:rgba(0,0,0,.8)}.ui.labels a.label:hover:before,a.ui.label:hover:before{color:rgba(0,0,0,.8)}.ui.active.label{background-color:#d0d0d0;border-color:#d0d0d0;background-image:none;color:rgba(0,0,0,.95)}.ui.active.label:before{background-color:#d0d0d0;background-image:none;color:rgba(0,0,0,.95)}.ui.labels a.active.label:hover,a.ui.active.label:hover{background-color:#c8c8c8;border-color:#c8c8c8;background-image:none;color:rgba(0,0,0,.95)}.ui.labels a.active.label:hover:before,a.ui.active.label:hover:before{background-color:#c8c8c8;background-image:none;color:rgba(0,0,0,.95)}.ui.label.visible:not(.dropdown),.ui.labels.visible .label{display:inline-block!important}.ui.label.hidden,.ui.labels.hidden .label{display:none!important}.ui.basic.label,.ui.basic.labels .label{background:none #fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none}.ui.basic.labels a.label:hover,a.ui.basic.label:hover{text-decoration:none;background:none #fff;color:#1e70bf;-webkit-box-shadow:none;box-shadow:none}.ui.basic.pointing.label:before{border-color:inherit}.ui.fluid.labels>.label,.ui.label.fluid{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.ui.inverted.label,.ui.inverted.labels .label{color:rgba(255,255,255,.9);background-color:#b5b5b5}.ui.inverted.corner.label{border-color:#b5b5b5}.ui.inverted.corner.label:hover{border-color:#e8e8e8;-webkit-transition:none;transition:none}.ui.inverted.basic.label,.ui.inverted.basic.label:hover,.ui.inverted.basic.labels .label{border-color:rgba(255,255,255,.5);background:#1b1c1d}.ui.inverted.basic.label:hover{color:#4183c4}.ui.primary.labels .label,.ui.ui.ui.primary.label{background-color:#2185d0;border-color:#2185d0;color:rgba(255,255,255,.9)}.ui.primary.labels a.label:hover,a.ui.ui.ui.primary.label:hover{background-color:#1678c2;border-color:#1678c2;color:#fff}.ui.ui.ui.primary.ribbon.label{border-color:#1a69a4}.ui.basic.labels .primary.label,.ui.ui.ui.basic.primary.label{background:none #fff;border-color:#2185d0;color:#2185d0}.ui.basic.labels a.primary.label:hover,a.ui.ui.ui.basic.primary.label:hover{background:none #fff;border-color:#1678c2;color:#1678c2}.ui.inverted.labels .primary.label,.ui.ui.ui.inverted.primary.label{background-color:#54c8ff;border-color:#54c8ff;color:#1b1c1d}.ui.inverted.labels a.primary.label:hover,a.ui.ui.ui.inverted.primary.label:hover{background-color:#21b8ff;border-color:#21b8ff;color:#1b1c1d}.ui.ui.ui.inverted.primary.ribbon.label{border-color:#21b8ff}.ui.inverted.basic.labels .primary.label,.ui.ui.ui.inverted.basic.primary.label{background-color:#1b1c1d;border-color:#54c8ff;color:#54c8ff}.ui.inverted.basic.labels a.primary.label:hover,a.ui.ui.ui.inverted.basic.primary.label:hover{border-color:#21b8ff;background-color:#1b1c1d;color:#21b8ff}.ui.inverted.basic.tag.labels .primary.label,.ui.ui.ui.inverted.primary.basic.tag.label{border:1px solid #54c8ff}.ui.inverted.basic.tag.labels .primary.label:before,.ui.ui.ui.inverted.primary.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.secondary.labels .label,.ui.ui.ui.secondary.label{background-color:#1b1c1d;border-color:#1b1c1d;color:rgba(255,255,255,.9)}.ui.secondary.labels a.label:hover,a.ui.ui.ui.secondary.label:hover{background-color:#27292a;border-color:#27292a;color:#fff}.ui.ui.ui.secondary.ribbon.label{border-color:#020203}.ui.basic.labels .secondary.label,.ui.ui.ui.basic.secondary.label{background:none #fff;border-color:#1b1c1d;color:#1b1c1d}.ui.basic.labels a.secondary.label:hover,a.ui.ui.ui.basic.secondary.label:hover{background:none #fff;border-color:#27292a;color:#27292a}.ui.inverted.labels .secondary.label,.ui.ui.ui.inverted.secondary.label{background-color:#545454;border-color:#545454;color:#1b1c1d}.ui.inverted.labels a.secondary.label:hover,a.ui.ui.ui.inverted.secondary.label:hover{background-color:#6e6e6e;border-color:#6e6e6e;color:#1b1c1d}.ui.ui.ui.inverted.secondary.ribbon.label{border-color:#3b3b3b}.ui.inverted.basic.labels .secondary.label,.ui.ui.ui.inverted.basic.secondary.label{background-color:#1b1c1d;border-color:#545454;color:#545454}.ui.inverted.basic.labels a.secondary.label:hover,a.ui.ui.ui.inverted.basic.secondary.label:hover{border-color:#6e6e6e;background-color:#1b1c1d;color:#6e6e6e}.ui.inverted.basic.tag.labels .secondary.label,.ui.ui.ui.inverted.secondary.basic.tag.label{border:1px solid #545454}.ui.inverted.basic.tag.labels .secondary.label:before,.ui.ui.ui.inverted.secondary.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.red.labels .label,.ui.ui.ui.red.label{background-color:#db2828;border-color:#db2828;color:#fff}.ui.red.labels a.label:hover,a.ui.ui.ui.red.label:hover{background-color:#d01919;border-color:#d01919;color:#fff}.ui.ui.ui.red.ribbon.label{border-color:#b21e1e}.ui.basic.labels .red.label,.ui.ui.ui.basic.red.label{background:none #fff;border-color:#db2828;color:#db2828}.ui.basic.labels a.red.label:hover,a.ui.ui.ui.basic.red.label:hover{background:none #fff;border-color:#d01919;color:#d01919}.ui.inverted.labels .red.label,.ui.ui.ui.inverted.red.label{background-color:#ff695e;border-color:#ff695e;color:#1b1c1d}.ui.inverted.labels a.red.label:hover,a.ui.ui.ui.inverted.red.label:hover{background-color:#ff392b;border-color:#ff392b;color:#1b1c1d}.ui.ui.ui.inverted.red.ribbon.label{border-color:#ff392b}.ui.inverted.basic.labels .red.label,.ui.ui.ui.inverted.basic.red.label{background-color:#1b1c1d;border-color:#ff695e;color:#ff695e}.ui.inverted.basic.labels a.red.label:hover,a.ui.ui.ui.inverted.basic.red.label:hover{border-color:#ff392b;background-color:#1b1c1d;color:#ff392b}.ui.inverted.basic.tag.labels .red.label,.ui.ui.ui.inverted.red.basic.tag.label{border:1px solid #ff695e}.ui.inverted.basic.tag.labels .red.label:before,.ui.ui.ui.inverted.red.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.orange.labels .label,.ui.ui.ui.orange.label{background-color:#f2711c;border-color:#f2711c;color:#fff}.ui.orange.labels a.label:hover,a.ui.ui.ui.orange.label:hover{background-color:#f26202;border-color:#f26202;color:#fff}.ui.ui.ui.orange.ribbon.label{border-color:#cf590c}.ui.basic.labels .orange.label,.ui.ui.ui.basic.orange.label{background:none #fff;border-color:#f2711c;color:#f2711c}.ui.basic.labels a.orange.label:hover,a.ui.ui.ui.basic.orange.label:hover{background:none #fff;border-color:#f26202;color:#f26202}.ui.inverted.labels .orange.label,.ui.ui.ui.inverted.orange.label{background-color:#ff851b;border-color:#ff851b;color:#1b1c1d}.ui.inverted.labels a.orange.label:hover,a.ui.ui.ui.inverted.orange.label:hover{background-color:#e76b00;border-color:#e76b00;color:#1b1c1d}.ui.ui.ui.inverted.orange.ribbon.label{border-color:#e76b00}.ui.inverted.basic.labels .orange.label,.ui.ui.ui.inverted.basic.orange.label{background-color:#1b1c1d;border-color:#ff851b;color:#ff851b}.ui.inverted.basic.labels a.orange.label:hover,a.ui.ui.ui.inverted.basic.orange.label:hover{border-color:#e76b00;background-color:#1b1c1d;color:#e76b00}.ui.inverted.basic.tag.labels .orange.label,.ui.ui.ui.inverted.orange.basic.tag.label{border:1px solid #ff851b}.ui.inverted.basic.tag.labels .orange.label:before,.ui.ui.ui.inverted.orange.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.ui.ui.yellow.label,.ui.yellow.labels .label{background-color:#fbbd08;border-color:#fbbd08;color:#fff}.ui.yellow.labels a.label:hover,a.ui.ui.ui.yellow.label:hover{background-color:#eaae00;border-color:#eaae00;color:#fff}.ui.ui.ui.yellow.ribbon.label{border-color:#cd9903}.ui.basic.labels .yellow.label,.ui.ui.ui.basic.yellow.label{background:none #fff;border-color:#fbbd08;color:#fbbd08}.ui.basic.labels a.yellow.label:hover,a.ui.ui.ui.basic.yellow.label:hover{background:none #fff;border-color:#eaae00;color:#eaae00}.ui.inverted.labels .yellow.label,.ui.ui.ui.inverted.yellow.label{background-color:#ffe21f;border-color:#ffe21f;color:#1b1c1d}.ui.inverted.labels a.yellow.label:hover,a.ui.ui.ui.inverted.yellow.label:hover{background-color:#ebcd00;border-color:#ebcd00;color:#1b1c1d}.ui.ui.ui.inverted.yellow.ribbon.label{border-color:#ebcd00}.ui.inverted.basic.labels .yellow.label,.ui.ui.ui.inverted.basic.yellow.label{background-color:#1b1c1d;border-color:#ffe21f;color:#ffe21f}.ui.inverted.basic.labels a.yellow.label:hover,a.ui.ui.ui.inverted.basic.yellow.label:hover{border-color:#ebcd00;background-color:#1b1c1d;color:#ebcd00}.ui.inverted.basic.tag.labels .yellow.label,.ui.ui.ui.inverted.yellow.basic.tag.label{border:1px solid #ffe21f}.ui.inverted.basic.tag.labels .yellow.label:before,.ui.ui.ui.inverted.yellow.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.olive.labels .label,.ui.ui.ui.olive.label{background-color:#b5cc18;border-color:#b5cc18;color:#fff}.ui.olive.labels a.label:hover,a.ui.ui.ui.olive.label:hover{background-color:#a7bd0d;border-color:#a7bd0d;color:#fff}.ui.ui.ui.olive.ribbon.label{border-color:#8d9e13}.ui.basic.labels .olive.label,.ui.ui.ui.basic.olive.label{background:none #fff;border-color:#b5cc18;color:#b5cc18}.ui.basic.labels a.olive.label:hover,a.ui.ui.ui.basic.olive.label:hover{background:none #fff;border-color:#a7bd0d;color:#a7bd0d}.ui.inverted.labels .olive.label,.ui.ui.ui.inverted.olive.label{background-color:#d9e778;border-color:#d9e778;color:#1b1c1d}.ui.inverted.labels a.olive.label:hover,a.ui.ui.ui.inverted.olive.label:hover{background-color:#d2e745;border-color:#d2e745;color:#1b1c1d}.ui.ui.ui.inverted.olive.ribbon.label{border-color:#cddf4d}.ui.inverted.basic.labels .olive.label,.ui.ui.ui.inverted.basic.olive.label{background-color:#1b1c1d;border-color:#d9e778;color:#d9e778}.ui.inverted.basic.labels a.olive.label:hover,a.ui.ui.ui.inverted.basic.olive.label:hover{border-color:#d2e745;background-color:#1b1c1d;color:#d2e745}.ui.inverted.basic.tag.labels .olive.label,.ui.ui.ui.inverted.olive.basic.tag.label{border:1px solid #d9e778}.ui.inverted.basic.tag.labels .olive.label:before,.ui.ui.ui.inverted.olive.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.green.labels .label,.ui.ui.ui.green.label{background-color:#21ba45;border-color:#21ba45;color:#fff}.ui.green.labels a.label:hover,a.ui.ui.ui.green.label:hover{background-color:#16ab39;border-color:#16ab39;color:#fff}.ui.ui.ui.green.ribbon.label{border-color:#198f35}.ui.basic.labels .green.label,.ui.ui.ui.basic.green.label{background:none #fff;border-color:#21ba45;color:#21ba45}.ui.basic.labels a.green.label:hover,a.ui.ui.ui.basic.green.label:hover{background:none #fff;border-color:#16ab39;color:#16ab39}.ui.inverted.labels .green.label,.ui.ui.ui.inverted.green.label{background-color:#2ecc40;border-color:#2ecc40;color:#1b1c1d}.ui.inverted.labels a.green.label:hover,a.ui.ui.ui.inverted.green.label:hover{background-color:#1ea92e;border-color:#1ea92e;color:#1b1c1d}.ui.ui.ui.inverted.green.ribbon.label{border-color:#25a233}.ui.inverted.basic.labels .green.label,.ui.ui.ui.inverted.basic.green.label{background-color:#1b1c1d;border-color:#2ecc40;color:#2ecc40}.ui.inverted.basic.labels a.green.label:hover,a.ui.ui.ui.inverted.basic.green.label:hover{border-color:#1ea92e;background-color:#1b1c1d;color:#1ea92e}.ui.inverted.basic.tag.labels .green.label,.ui.ui.ui.inverted.green.basic.tag.label{border:1px solid #2ecc40}.ui.inverted.basic.tag.labels .green.label:before,.ui.ui.ui.inverted.green.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.teal.labels .label,.ui.ui.ui.teal.label{background-color:#00b5ad;border-color:#00b5ad;color:#fff}.ui.teal.labels a.label:hover,a.ui.ui.ui.teal.label:hover{background-color:#009c95;border-color:#009c95;color:#fff}.ui.ui.ui.teal.ribbon.label{border-color:#00827c}.ui.basic.labels .teal.label,.ui.ui.ui.basic.teal.label{background:none #fff;border-color:#00b5ad;color:#00b5ad}.ui.basic.labels a.teal.label:hover,a.ui.ui.ui.basic.teal.label:hover{background:none #fff;border-color:#009c95;color:#009c95}.ui.inverted.labels .teal.label,.ui.ui.ui.inverted.teal.label{background-color:#6dffff;border-color:#6dffff;color:#1b1c1d}.ui.inverted.labels a.teal.label:hover,a.ui.ui.ui.inverted.teal.label:hover{background-color:#3affff;border-color:#3affff;color:#1b1c1d}.ui.ui.ui.inverted.teal.ribbon.label{border-color:#3affff}.ui.inverted.basic.labels .teal.label,.ui.ui.ui.inverted.basic.teal.label{background-color:#1b1c1d;border-color:#6dffff;color:#6dffff}.ui.inverted.basic.labels a.teal.label:hover,a.ui.ui.ui.inverted.basic.teal.label:hover{border-color:#3affff;background-color:#1b1c1d;color:#3affff}.ui.inverted.basic.tag.labels .teal.label,.ui.ui.ui.inverted.teal.basic.tag.label{border:1px solid #6dffff}.ui.inverted.basic.tag.labels .teal.label:before,.ui.ui.ui.inverted.teal.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.blue.labels .label,.ui.ui.ui.blue.label{background-color:#2185d0;border-color:#2185d0;color:#fff}.ui.blue.labels a.label:hover,a.ui.ui.ui.blue.label:hover{background-color:#1678c2;border-color:#1678c2;color:#fff}.ui.ui.ui.blue.ribbon.label{border-color:#1a69a4}.ui.basic.labels .blue.label,.ui.ui.ui.basic.blue.label{background:none #fff;border-color:#2185d0;color:#2185d0}.ui.basic.labels a.blue.label:hover,a.ui.ui.ui.basic.blue.label:hover{background:none #fff;border-color:#1678c2;color:#1678c2}.ui.inverted.labels .blue.label,.ui.ui.ui.inverted.blue.label{background-color:#54c8ff;border-color:#54c8ff;color:#1b1c1d}.ui.inverted.labels a.blue.label:hover,a.ui.ui.ui.inverted.blue.label:hover{background-color:#21b8ff;border-color:#21b8ff;color:#1b1c1d}.ui.ui.ui.inverted.blue.ribbon.label{border-color:#21b8ff}.ui.inverted.basic.labels .blue.label,.ui.ui.ui.inverted.basic.blue.label{background-color:#1b1c1d;border-color:#54c8ff;color:#54c8ff}.ui.inverted.basic.labels a.blue.label:hover,a.ui.ui.ui.inverted.basic.blue.label:hover{border-color:#21b8ff;background-color:#1b1c1d;color:#21b8ff}.ui.inverted.basic.tag.labels .blue.label,.ui.ui.ui.inverted.blue.basic.tag.label{border:1px solid #54c8ff}.ui.inverted.basic.tag.labels .blue.label:before,.ui.ui.ui.inverted.blue.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.ui.ui.violet.label,.ui.violet.labels .label{background-color:#6435c9;border-color:#6435c9;color:#fff}.ui.violet.labels a.label:hover,a.ui.ui.ui.violet.label:hover{background-color:#5829bb;border-color:#5829bb;color:#fff}.ui.ui.ui.violet.ribbon.label{border-color:#502aa1}.ui.basic.labels .violet.label,.ui.ui.ui.basic.violet.label{background:none #fff;border-color:#6435c9;color:#6435c9}.ui.basic.labels a.violet.label:hover,a.ui.ui.ui.basic.violet.label:hover{background:none #fff;border-color:#5829bb;color:#5829bb}.ui.inverted.labels .violet.label,.ui.ui.ui.inverted.violet.label{background-color:#a291fb;border-color:#a291fb;color:#1b1c1d}.ui.inverted.labels a.violet.label:hover,a.ui.ui.ui.inverted.violet.label:hover{background-color:#745aff;border-color:#745aff;color:#1b1c1d}.ui.ui.ui.inverted.violet.ribbon.label{border-color:#7860f9}.ui.inverted.basic.labels .violet.label,.ui.ui.ui.inverted.basic.violet.label{background-color:#1b1c1d;border-color:#a291fb;color:#a291fb}.ui.inverted.basic.labels a.violet.label:hover,a.ui.ui.ui.inverted.basic.violet.label:hover{border-color:#745aff;background-color:#1b1c1d;color:#745aff}.ui.inverted.basic.tag.labels .violet.label,.ui.ui.ui.inverted.violet.basic.tag.label{border:1px solid #a291fb}.ui.inverted.basic.tag.labels .violet.label:before,.ui.ui.ui.inverted.violet.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.purple.labels .label,.ui.ui.ui.purple.label{background-color:#a333c8;border-color:#a333c8;color:#fff}.ui.purple.labels a.label:hover,a.ui.ui.ui.purple.label:hover{background-color:#9627ba;border-color:#9627ba;color:#fff}.ui.ui.ui.purple.ribbon.label{border-color:#82299f}.ui.basic.labels .purple.label,.ui.ui.ui.basic.purple.label{background:none #fff;border-color:#a333c8;color:#a333c8}.ui.basic.labels a.purple.label:hover,a.ui.ui.ui.basic.purple.label:hover{background:none #fff;border-color:#9627ba;color:#9627ba}.ui.inverted.labels .purple.label,.ui.ui.ui.inverted.purple.label{background-color:#dc73ff;border-color:#dc73ff;color:#1b1c1d}.ui.inverted.labels a.purple.label:hover,a.ui.ui.ui.inverted.purple.label:hover{background-color:#cf40ff;border-color:#cf40ff;color:#1b1c1d}.ui.ui.ui.inverted.purple.ribbon.label{border-color:#cf40ff}.ui.inverted.basic.labels .purple.label,.ui.ui.ui.inverted.basic.purple.label{background-color:#1b1c1d;border-color:#dc73ff;color:#dc73ff}.ui.inverted.basic.labels a.purple.label:hover,a.ui.ui.ui.inverted.basic.purple.label:hover{border-color:#cf40ff;background-color:#1b1c1d;color:#cf40ff}.ui.inverted.basic.tag.labels .purple.label,.ui.ui.ui.inverted.purple.basic.tag.label{border:1px solid #dc73ff}.ui.inverted.basic.tag.labels .purple.label:before,.ui.ui.ui.inverted.purple.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.pink.labels .label,.ui.ui.ui.pink.label{background-color:#e03997;border-color:#e03997;color:#fff}.ui.pink.labels a.label:hover,a.ui.ui.ui.pink.label:hover{background-color:#e61a8d;border-color:#e61a8d;color:#fff}.ui.ui.ui.pink.ribbon.label{border-color:#c71f7e}.ui.basic.labels .pink.label,.ui.ui.ui.basic.pink.label{background:none #fff;border-color:#e03997;color:#e03997}.ui.basic.labels a.pink.label:hover,a.ui.ui.ui.basic.pink.label:hover{background:none #fff;border-color:#e61a8d;color:#e61a8d}.ui.inverted.labels .pink.label,.ui.ui.ui.inverted.pink.label{background-color:#ff8edf;border-color:#ff8edf;color:#1b1c1d}.ui.inverted.labels a.pink.label:hover,a.ui.ui.ui.inverted.pink.label:hover{background-color:#ff5bd1;border-color:#ff5bd1;color:#1b1c1d}.ui.ui.ui.inverted.pink.ribbon.label{border-color:#ff5bd1}.ui.inverted.basic.labels .pink.label,.ui.ui.ui.inverted.basic.pink.label{background-color:#1b1c1d;border-color:#ff8edf;color:#ff8edf}.ui.inverted.basic.labels a.pink.label:hover,a.ui.ui.ui.inverted.basic.pink.label:hover{border-color:#ff5bd1;background-color:#1b1c1d;color:#ff5bd1}.ui.inverted.basic.tag.labels .pink.label,.ui.ui.ui.inverted.pink.basic.tag.label{border:1px solid #ff8edf}.ui.inverted.basic.tag.labels .pink.label:before,.ui.ui.ui.inverted.pink.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.brown.labels .label,.ui.ui.ui.brown.label{background-color:#a5673f;border-color:#a5673f;color:#fff}.ui.brown.labels a.label:hover,a.ui.ui.ui.brown.label:hover{background-color:#975b33;border-color:#975b33;color:#fff}.ui.ui.ui.brown.ribbon.label{border-color:#805031}.ui.basic.labels .brown.label,.ui.ui.ui.basic.brown.label{background:none #fff;border-color:#a5673f;color:#a5673f}.ui.basic.labels a.brown.label:hover,a.ui.ui.ui.basic.brown.label:hover{background:none #fff;border-color:#975b33;color:#975b33}.ui.inverted.labels .brown.label,.ui.ui.ui.inverted.brown.label{background-color:#d67c1c;border-color:#d67c1c;color:#1b1c1d}.ui.inverted.labels a.brown.label:hover,a.ui.ui.ui.inverted.brown.label:hover{background-color:#b0620f;border-color:#b0620f;color:#1b1c1d}.ui.ui.ui.inverted.brown.ribbon.label{border-color:#a96216}.ui.inverted.basic.labels .brown.label,.ui.ui.ui.inverted.basic.brown.label{background-color:#1b1c1d;border-color:#d67c1c;color:#d67c1c}.ui.inverted.basic.labels a.brown.label:hover,a.ui.ui.ui.inverted.basic.brown.label:hover{border-color:#b0620f;background-color:#1b1c1d;color:#b0620f}.ui.inverted.basic.tag.labels .brown.label,.ui.ui.ui.inverted.brown.basic.tag.label{border:1px solid #d67c1c}.ui.inverted.basic.tag.labels .brown.label:before,.ui.ui.ui.inverted.brown.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.grey.labels .label,.ui.ui.ui.grey.label{background-color:#767676;border-color:#767676;color:#fff}.ui.grey.labels a.label:hover,a.ui.ui.ui.grey.label:hover{background-color:#838383;border-color:#838383;color:#fff}.ui.ui.ui.grey.ribbon.label{border-color:#5d5d5d}.ui.basic.labels .grey.label,.ui.ui.ui.basic.grey.label{background:none #fff;border-color:#767676;color:#767676}.ui.basic.labels a.grey.label:hover,a.ui.ui.ui.basic.grey.label:hover{background:none #fff;border-color:#838383;color:#838383}.ui.inverted.labels .grey.label,.ui.ui.ui.inverted.grey.label{background-color:#dcddde;border-color:#dcddde;color:#1b1c1d}.ui.inverted.labels a.grey.label:hover,a.ui.ui.ui.inverted.grey.label:hover{background-color:#c2c4c5;border-color:#c2c4c5;color:#fff}.ui.ui.ui.inverted.grey.ribbon.label{border-color:#e9eaea}.ui.inverted.basic.labels .grey.label,.ui.ui.ui.inverted.basic.grey.label{background-color:#1b1c1d;border-color:#dcddde;color:rgba(255,255,255,.9)}.ui.inverted.basic.labels a.grey.label:hover,a.ui.ui.ui.inverted.basic.grey.label:hover{border-color:#c2c4c5;background-color:#1b1c1d}.ui.inverted.basic.tag.labels .grey.label,.ui.ui.ui.inverted.grey.basic.tag.label{border:1px solid #dcddde}.ui.inverted.basic.tag.labels .grey.label:before,.ui.ui.ui.inverted.grey.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.black.labels .label,.ui.ui.ui.black.label{background-color:#1b1c1d;border-color:#1b1c1d;color:#fff}.ui.black.labels a.label:hover,a.ui.ui.ui.black.label:hover{background-color:#27292a;border-color:#27292a;color:#fff}.ui.ui.ui.black.ribbon.label{border-color:#020203}.ui.basic.labels .black.label,.ui.ui.ui.basic.black.label{background:none #fff;border-color:#1b1c1d;color:#1b1c1d}.ui.basic.labels a.black.label:hover,a.ui.ui.ui.basic.black.label:hover{background:none #fff;border-color:#27292a;color:#27292a}.ui.inverted.labels .black.label,.ui.ui.ui.inverted.black.label{background-color:#545454;border-color:#545454;color:#1b1c1d}.ui.inverted.labels a.black.label:hover,a.ui.ui.ui.inverted.black.label:hover{background-color:#000;border-color:#000;color:#fff}.ui.ui.ui.inverted.black.ribbon.label{border-color:#616161}.ui.inverted.basic.labels .black.label,.ui.ui.ui.inverted.basic.black.label{background-color:#1b1c1d;border-color:#545454;color:rgba(255,255,255,.9)}.ui.inverted.basic.labels a.black.label:hover,a.ui.ui.ui.inverted.basic.black.label:hover{border-color:#000;background-color:#1b1c1d}.ui.inverted.basic.tag.labels .black.label,.ui.ui.ui.inverted.black.basic.tag.label{border:1px solid #545454}.ui.inverted.basic.tag.labels .black.label:before,.ui.ui.ui.inverted.black.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.horizontal.label,.ui.horizontal.labels .label{margin:0 .5em 0 0;padding:.4em .833em;min-width:3em;text-align:center}.ui.circular.label,.ui.circular.labels .label{min-width:2em;min-height:2em;padding:.5em!important;line-height:1em;text-align:center;border-radius:500rem}.ui.empty.circular.label,.ui.empty.circular.labels .label{min-width:0;min-height:0;overflow:hidden;width:.5em;height:.5em;vertical-align:baseline}.ui.pointing.label{position:relative}.ui.attached.pointing.label{position:absolute}.ui.pointing.label:before{background-color:inherit;background-image:inherit;border-width:0;border-style:solid;border-color:inherit}.ui.pointing.label:before{position:absolute;content:'';-webkit-transform:rotate(45deg);transform:rotate(45deg);background-image:none;z-index:2;width:.6666em;height:.6666em;-webkit-transition:none;transition:none}.ui.pointing.label,.ui[class*="pointing above"].label{margin-top:1em}.ui.pointing.label:before,.ui[class*="pointing above"].label:before{border-width:1px 0 0 1px;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);top:0;left:50%}.ui[class*="bottom pointing"].label,.ui[class*="pointing below"].label{margin-top:0;margin-bottom:1em}.ui[class*="bottom pointing"].label:before,.ui[class*="pointing below"].label:before{border-width:0 1px 1px 0;top:auto;right:auto;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);top:100%;left:50%}.ui[class*="left pointing"].label{margin-top:0;margin-left:.6666em}.ui[class*="left pointing"].label:before{border-width:0 0 1px 1px;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);bottom:auto;right:auto;top:50%;left:0}.ui[class*="right pointing"].label{margin-top:0;margin-right:.6666em}.ui[class*="right pointing"].label:before{border-width:1px 1px 0 0;-webkit-transform:translateX(50%) translateY(-50%) rotate(45deg);transform:translateX(50%) translateY(-50%) rotate(45deg);top:50%;right:0;bottom:auto;left:auto}.ui.basic.pointing.label:before,.ui.basic[class*="pointing above"].label:before{margin-top:-1px}.ui.basic[class*="bottom pointing"].label:before,.ui.basic[class*="pointing below"].label:before{bottom:auto;top:100%;margin-top:1px}.ui.basic[class*="left pointing"].label:before{top:50%;left:-1px}.ui.basic[class*="right pointing"].label:before{top:50%;right:-1px}.ui.floating.label{position:absolute;z-index:100;top:-1em;right:0;white-space:nowrap;-webkit-transform:translateX(50%);transform:translateX(50%)}.ui.right.aligned.floating.label{-webkit-transform:translateX(1.2em);transform:translateX(1.2em)}.ui.left.floating.label{left:0;right:auto;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.ui.left.aligned.floating.label{-webkit-transform:translateX(-1.2em);transform:translateX(-1.2em)}.ui.bottom.floating.label{top:auto;bottom:-1em}.ui.label,.ui.labels .label{font-size:.85714286rem}.ui.mini.label,.ui.mini.labels .label{font-size:.64285714rem}.ui.tiny.label,.ui.tiny.labels .label{font-size:.71428571rem}.ui.small.label,.ui.small.labels .label{font-size:.78571429rem}.ui.large.label,.ui.large.labels .label{font-size:1rem}.ui.big.label,.ui.big.labels .label{font-size:1.28571429rem}.ui.huge.label,.ui.huge.labels .label{font-size:1.42857143rem}.ui.massive.label,.ui.massive.labels .label{font-size:1.71428571rem}/*! + * # Fomantic-UI - List + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.list,ol.ui.list,ul.ui.list{list-style-type:none;margin:1em 0;padding:0 0}.ui.list:first-child,ol.ui.list:first-child,ul.ui.list:first-child{margin-top:0;padding-top:0}.ui.list:last-child,ol.ui.list:last-child,ul.ui.list:last-child{margin-bottom:0;padding-bottom:0}.ui.list .list>.item,.ui.list>.item,ol.ui.list li,ul.ui.list li{display:list-item;table-layout:fixed;list-style-type:none;list-style-position:outside;padding:.21428571em 0;line-height:1.14285714em}.ui.list>.item:after,.ui.list>.list>.item:after,ol.ui.list>li:first-child:after,ul.ui.list>li:first-child:after{content:'';display:block;height:0;clear:both;visibility:hidden}.ui.list .list>.item:first-child,.ui.list>.item:first-child,ol.ui.list li:first-child,ul.ui.list li:first-child{padding-top:0}.ui.list .list>.item:last-child,.ui.list>.item:last-child,ol.ui.list li:last-child,ul.ui.list li:last-child{padding-bottom:0}.ui.list .list:not(.icon),ol.ui.list ol,ul.ui.list ul{clear:both;margin:0;padding:.75em 0 .25em .5em}.ui.list .list>.item,ol.ui.list ol li,ul.ui.list ul li{padding:.14285714em 0;line-height:inherit}.ui.list .list>.item>i.icon,.ui.list>.item>i.icon{display:table-cell;min-width:1.55em;margin:0;padding-top:0;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.list .list>.item>i.icon:not(.loading),.ui.list>.item>i.icon:not(.loading){padding-right:.28571429em;vertical-align:top}.ui.list .list>.item>i.icon:only-child,.ui.list>.item>i.icon:only-child{display:inline-block;min-width:auto;vertical-align:top}.ui.list .list>.item>.image,.ui.list>.item>.image{display:table-cell;background-color:transparent;margin:0;vertical-align:top}.ui.list .list>.item>.image:not(:only-child):not(img),.ui.list>.item>.image:not(:only-child):not(img){padding-right:.5em}.ui.list .list>.item>.image img,.ui.list>.item>.image img{vertical-align:top}.ui.list .list>.item>.image:only-child,.ui.list .list>.item>img.image,.ui.list>.item>.image:only-child,.ui.list>.item>img.image{display:inline-block}.ui.list .list>.item>.content,.ui.list>.item>.content{line-height:1.14285714em;color:rgba(0,0,0,.87)}.ui.list .list>.item>.icon+.content,.ui.list .list>.item>.image+.content,.ui.list>.item>.icon+.content,.ui.list>.item>.image+.content{display:table-cell;width:100%;padding:0 0 0 .5em;vertical-align:top}.ui.list .list>.item>.loading.icon+.content,.ui.list>.item>.loading.icon+.content{padding-left:calc(.2857142857142857em + .5em)}.ui.list .list>.item>img.image+.content,.ui.list>.item>img.image+.content{display:inline-block;width:auto}.ui.list .list>.item>.content>.list,.ui.list>.item>.content>.list{margin-left:0;padding-left:0}.ui.list .list>.item .header,.ui.list>.item .header{display:block;margin:0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;color:rgba(0,0,0,.87)}.ui.list .list>.item .description,.ui.list>.item .description{display:block;color:rgba(0,0,0,.7)}.ui.list .list>.item a,.ui.list>.item a{cursor:pointer}.ui.list .list>a.item,.ui.list>a.item{cursor:pointer;color:#4183c4}.ui.list .list>a.item:hover,.ui.list>a.item:hover{color:#1e70bf}.ui.list .list>a.item>i.icon,.ui.list .list>a.item>i.icons,.ui.list>a.item>i.icon,.ui.list>a.item>i.icons{color:rgba(0,0,0,.4)}.ui.list .list>.item a.header,.ui.list>.item a.header{cursor:pointer;color:#4183c4!important}.ui.list .list>.item>a.header:hover,.ui.list>.item>a.header:hover{color:#1e70bf!important}.ui[class*="left floated"].list{float:left}.ui[class*="right floated"].list{float:right}.ui.list .list>.item [class*="left floated"],.ui.list>.item [class*="left floated"]{float:left;margin:0 1em 0 0}.ui.list .list>.item [class*="right floated"],.ui.list>.item [class*="right floated"]{float:right;margin:0 0 0 1em}.ui.menu .ui.list .list>.item,.ui.menu .ui.list>.item{display:list-item;table-layout:fixed;background-color:transparent;list-style-type:none;list-style-position:outside;padding:.21428571em 0;line-height:1.14285714em}.ui.menu .ui.list .list>.item:before,.ui.menu .ui.list>.item:before{border:none;background:0 0}.ui.menu .ui.list .list>.item:first-child,.ui.menu .ui.list>.item:first-child{padding-top:0}.ui.menu .ui.list .list>.item:last-child,.ui.menu .ui.list>.item:last-child{padding-bottom:0}.ui.horizontal.list{display:inline-block;font-size:0}.ui.horizontal.list>.item{display:inline-block;margin-right:1em;font-size:1rem}.ui.horizontal.list:not(.celled)>.item:last-child{margin-right:0;padding-right:0}.ui.horizontal.list .list:not(.icon){padding-left:0;padding-bottom:0}.ui.horizontal.list .list>.item>.content,.ui.horizontal.list .list>.item>.icon,.ui.horizontal.list .list>.item>.image,.ui.horizontal.list>.item>.content,.ui.horizontal.list>.item>.icon,.ui.horizontal.list>.item>.image{vertical-align:middle}.ui.horizontal.list>.item:first-child,.ui.horizontal.list>.item:last-child{padding-top:.21428571em;padding-bottom:.21428571em}.ui.horizontal.list .item>i.icons>i.icon,.ui.horizontal.list>.item>i.icon{margin:0;padding:0 .25em 0 0}.ui.horizontal.list>.item>.icon,.ui.horizontal.list>.item>.icon+.content,.ui.horizontal.list>.item>.image+.content{float:none;display:inline-block;width:auto}.ui.horizontal.list>.item>.image{display:inline-block}.ui.list .list>.disabled.item,.ui.list>.disabled.item{pointer-events:none;color:rgba(40,40,40,.3)!important}.ui.inverted.list .list>.disabled.item,.ui.inverted.list>.disabled.item{color:rgba(225,225,225,.3)!important}.ui.list .list>a.item:hover>.icon,.ui.list .list>a.item:hover>.icons,.ui.list>a.item:hover>.icon,.ui.list>a.item:hover>.icons{color:rgba(0,0,0,.87)}.ui.inverted.list .list>a.item>.icon,.ui.inverted.list>a.item>.icon{color:rgba(255,255,255,.7)}.ui.inverted.list .list>.item .header,.ui.inverted.list>.item .header{color:rgba(255,255,255,.9)}.ui.inverted.list .list>.item .description,.ui.inverted.list>.item .description{color:rgba(255,255,255,.7)}.ui.inverted.list .list>.item>.content,.ui.inverted.list>.item>.content{color:rgba(255,255,255,.7)}.ui.inverted.list .list>a.item,.ui.inverted.list>a.item{cursor:pointer;color:rgba(255,255,255,.9)}.ui.inverted.list .list>a.item:hover,.ui.inverted.list>a.item:hover{color:#1e70bf}.ui.inverted.list .item a:not(.ui){color:rgba(255,255,255,.9)!important}.ui.inverted.list .item a:not(.ui):hover{color:#1e70bf!important}.ui.list [class*="top aligned"],.ui.list[class*="top aligned"] .content,.ui.list[class*="top aligned"] .image{vertical-align:top!important}.ui.list [class*="middle aligned"],.ui.list[class*="middle aligned"] .content,.ui.list[class*="middle aligned"] .image{vertical-align:middle!important}.ui.list [class*="bottom aligned"],.ui.list[class*="bottom aligned"] .content,.ui.list[class*="bottom aligned"] .image{vertical-align:bottom!important}.ui.link.list .item,.ui.link.list .item a:not(.ui),.ui.link.list a.item{color:rgba(0,0,0,.4);-webkit-transition:.1s color ease;transition:.1s color ease}.ui.link.list.list .item a:not(.ui):hover,.ui.link.list.list a.item:hover{color:rgba(0,0,0,.8)}.ui.link.list.list .item a:not(.ui):active,.ui.link.list.list a.item:active{color:rgba(0,0,0,.9)}.ui.link.list.list .active.item,.ui.link.list.list .active.item a:not(.ui){color:rgba(0,0,0,.95)}.ui.inverted.link.list .item,.ui.inverted.link.list .item a:not(.ui),.ui.inverted.link.list a.item{color:rgba(255,255,255,.5)}.ui.inverted.link.list.list .item a:not(.ui):hover,.ui.inverted.link.list.list a.item:hover{color:#fff}.ui.inverted.link.list.list .item a:not(.ui):active,.ui.inverted.link.list.list a.item:active{color:#fff}.ui.inverted.link.list.list .active.item a:not(.ui),.ui.inverted.link.list.list a.active.item{color:#fff}.ui.selection.list .list>.item,.ui.selection.list>.item{cursor:pointer;background:0 0;padding:.5em .5em;margin:0;color:rgba(0,0,0,.4);border-radius:.5em;-webkit-transition:.1s color ease,.1s padding-left ease,.1s background-color ease;transition:.1s color ease,.1s padding-left ease,.1s background-color ease}.ui.selection.list .list>.item:last-child,.ui.selection.list>.item:last-child{margin-bottom:0}.ui.selection.list .list>.item:hover,.ui.selection.list>.item:hover{background:rgba(0,0,0,.03);color:rgba(0,0,0,.8)}.ui.selection.list .list>.item:active,.ui.selection.list>.item:active{background:rgba(0,0,0,.05);color:rgba(0,0,0,.9)}.ui.selection.list .list>.item.active,.ui.selection.list>.item.active{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.inverted.selection.list>.item{background:0 0;color:rgba(255,255,255,.5)}.ui.inverted.selection.list>.item:hover{background:rgba(255,255,255,.02);color:#fff}.ui.inverted.selection.list>.item:active{background:rgba(255,255,255,.08);color:#fff}.ui.inverted.selection.list>.item.active{background:rgba(255,255,255,.08);color:#fff}.ui.celled.selection.list .list>.item,.ui.celled.selection.list>.item,.ui.divided.selection.list .list>.item,.ui.divided.selection.list>.item{border-radius:0}.ui.animated.list>.item{-webkit-transition:.25s color ease .1s,.25s padding-left ease .1s,.25s background-color ease .1s;transition:.25s color ease .1s,.25s padding-left ease .1s,.25s background-color ease .1s}.ui.animated.list:not(.horizontal)>.item:hover{padding-left:1em}.ui.fitted.list:not(.selection) .list>.item,.ui.fitted.list:not(.selection)>.item{padding-left:0;padding-right:0}.ui.fitted.selection.list .list>.item,.ui.fitted.selection.list>.item{margin-left:-.5em;margin-right:-.5em}.ui.bulleted.list,ul.ui.list{margin-left:1.25rem}.ui.bulleted.list .list>.item,.ui.bulleted.list>.item,ul.ui.list li{position:relative}.ui.bulleted.list .list>.item:before,.ui.bulleted.list>.item:before,ul.ui.list li:before{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;position:absolute;top:auto;left:auto;font-weight:400;margin-left:-1.25rem;content:'\2022';opacity:1;color:inherit;vertical-align:top}.ui.bulleted.list .list>a.item:before,.ui.bulleted.list>a.item:before,ul.ui.list li:before{color:rgba(0,0,0,.87)}.ui.bulleted.list .list:not(.icon),ul.ui.list ul{padding-left:1.25rem}.ui.horizontal.bulleted.list,ul.ui.horizontal.bulleted.list{margin-left:0}.ui.horizontal.bulleted.list>.item,ul.ui.horizontal.bulleted.list li{margin-left:1.75rem}.ui.horizontal.bulleted.list>.item:first-child,ul.ui.horizontal.bulleted.list li:first-child{margin-left:0}.ui.horizontal.bulleted.list>.item::before,ul.ui.horizontal.bulleted.list li::before{color:rgba(0,0,0,.87)}.ui.horizontal.bulleted.list>.item:first-child::before,ul.ui.horizontal.bulleted.list li:first-child::before{display:none}.ui.ordered.list,.ui.ordered.list .list:not(.icon),ol.ui.list,ol.ui.list ol{counter-reset:ordered;margin-left:1.25rem;list-style-type:none}.ui.ordered.list .list>.item,.ui.ordered.list>.item,ol.ui.list li{list-style-type:none;position:relative}.ui.ordered.list .list>.item:before,.ui.ordered.list>.item:before,ol.ui.list li:before{position:absolute;top:auto;left:auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;margin-left:-1.25rem;counter-increment:ordered;content:counters(ordered, ".") " ";text-align:right;color:rgba(0,0,0,.87);vertical-align:middle;opacity:.8}.ui.ordered.inverted.list .list>.item:before,.ui.ordered.inverted.list>.item:before,ol.ui.inverted.list li:before{color:rgba(255,255,255,.7)}.ui.ordered.list .list>.item[data-value]:before,.ui.ordered.list>.item[data-value]:before{content:attr(data-value)}ol.ui.list li[value]:before{content:attr(value)}.ui.ordered.list .list:not(.icon),ol.ui.list ol{margin-left:1em}.ui.ordered.list .list>.item:before,ol.ui.list ol li:before{margin-left:-2em}.ui.ordered.horizontal.list,ol.ui.horizontal.list{margin-left:0}.ui.ordered.horizontal.list .list>.item:before,.ui.ordered.horizontal.list>.item:before,ol.ui.horizontal.list li:before{position:static;margin:0 .5em 0 0}.ui.suffixed.ordered.list .list>.item:before,.ui.suffixed.ordered.list>.item:before,ol.ui.suffixed.list li:before{content:counters(ordered, ".") "."}.ui.divided.list>.item{border-top:1px solid rgba(34,36,38,.15)}.ui.divided.list .list>.item{border-top:none}.ui.divided.list .item .list>.item{border-top:none}.ui.divided.list .list>.item:first-child,.ui.divided.list>.item:first-child{border-top:none}.ui.divided.list:not(.horizontal) .list>.item:first-child{border-top-width:1px}.ui.divided.bulleted.list .list:not(.icon),.ui.divided.bulleted.list:not(.horizontal){margin-left:0;padding-left:0}.ui.divided.bulleted.list>.item:not(.horizontal){padding-left:1.25rem}.ui.divided.ordered.list{margin-left:0}.ui.divided.ordered.list .list>.item,.ui.divided.ordered.list>.item{padding-left:1.25rem}.ui.divided.ordered.list .item .list:not(.icon){margin-left:0;margin-right:0;padding-bottom:.21428571em}.ui.divided.ordered.list .item .list>.item{padding-left:1em}.ui.divided.selection.list .list>.item,.ui.divided.selection.list>.item{margin:0;border-radius:0}.ui.divided.horizontal.list{margin-left:0}.ui.divided.horizontal.list>.item{padding-left:.5em}.ui.divided.horizontal.list>.item:not(:last-child){padding-right:.5em}.ui.divided.horizontal.list>.item{border-top:none;border-right:1px solid rgba(34,36,38,.15);margin:0;line-height:.6}.ui.horizontal.divided.list>.item:last-child{border-right:none}.ui.divided.inverted.horizontal.list>.item,.ui.divided.inverted.list>.item,.ui.divided.inverted.list>.list{border-color:rgba(255,255,255,.1)}.ui.celled.list>.item,.ui.celled.list>.list{border-top:1px solid rgba(34,36,38,.15);padding-left:.5em;padding-right:.5em}.ui.celled.list>.item:last-child{border-bottom:1px solid rgba(34,36,38,.15)}.ui.celled.list>.item:first-child,.ui.celled.list>.item:last-child{padding-top:.21428571em;padding-bottom:.21428571em}.ui.celled.list .item .list>.item{border-width:0}.ui.celled.list .list>.item:first-child{border-top-width:0}.ui.celled.bulleted.list{margin-left:0}.ui.celled.bulleted.list .list>.item,.ui.celled.bulleted.list>.item{padding-left:1.25rem}.ui.celled.bulleted.list .item .list:not(.icon){margin-left:-1.25rem;margin-right:-1.25rem;padding-bottom:.21428571em}.ui.celled.ordered.list{margin-left:0}.ui.celled.ordered.list .list>.item,.ui.celled.ordered.list>.item{padding-left:1.25rem}.ui.celled.ordered.list .item .list:not(.icon){margin-left:0;margin-right:0;padding-bottom:.21428571em}.ui.celled.ordered.list .list>.item{padding-left:1em}.ui.horizontal.celled.list{margin-left:0}.ui.horizontal.celled.list .list>.item,.ui.horizontal.celled.list>.item{border-top:none;border-left:1px solid rgba(34,36,38,.15);margin:0;padding-left:.5em;padding-right:.5em;line-height:.6}.ui.horizontal.celled.list .list>.item:last-child,.ui.horizontal.celled.list>.item:last-child{border-bottom:none;border-right:1px solid rgba(34,36,38,.15)}.ui.celled.inverted.list>.item,.ui.celled.inverted.list>.list{border-color:rgba(255,255,255,.1)}.ui.celled.inverted.horizontal.list .list>.item,.ui.celled.inverted.horizontal.list>.item{border-color:rgba(255,255,255,.1)}.ui.relaxed.list:not(.horizontal)>.item:not(:first-child){padding-top:.42857143em}.ui.relaxed.list:not(.horizontal)>.item:not(:last-child){padding-bottom:.42857143em}.ui.horizontal.relaxed.list .list>.item:not(:first-child),.ui.horizontal.relaxed.list>.item:not(:first-child){padding-left:1rem}.ui.horizontal.relaxed.list .list>.item:not(:last-child),.ui.horizontal.relaxed.list>.item:not(:last-child){padding-right:1rem}.ui[class*="very relaxed"].list:not(.horizontal)>.item:not(:first-child){padding-top:.85714286em}.ui[class*="very relaxed"].list:not(.horizontal)>.item:not(:last-child){padding-bottom:.85714286em}.ui.horizontal[class*="very relaxed"].list .list>.item:not(:first-child),.ui.horizontal[class*="very relaxed"].list>.item:not(:first-child){padding-left:1.5rem}.ui.horizontal[class*="very relaxed"].list .list>.item:not(:last-child),.ui.horizontal[class*="very relaxed"].list>.item:not(:last-child){padding-right:1.5rem}.ui.list{font-size:1em}.ui.mini.list{font-size:.78571429em}.ui.mini.horizontal.list .list>.item,.ui.mini.horizontal.list>.item{font-size:.78571429rem}.ui.tiny.list{font-size:.85714286em}.ui.tiny.horizontal.list .list>.item,.ui.tiny.horizontal.list>.item{font-size:.85714286rem}.ui.small.list{font-size:.92857143em}.ui.small.horizontal.list .list>.item,.ui.small.horizontal.list>.item{font-size:.92857143rem}.ui.large.list{font-size:1.14285714em}.ui.large.horizontal.list .list>.item,.ui.large.horizontal.list>.item{font-size:1.14285714rem}.ui.big.list{font-size:1.28571429em}.ui.big.horizontal.list .list>.item,.ui.big.horizontal.list>.item{font-size:1.28571429rem}.ui.huge.list{font-size:1.42857143em}.ui.huge.horizontal.list .list>.item,.ui.huge.horizontal.list>.item{font-size:1.42857143rem}.ui.massive.list{font-size:1.71428571em}.ui.massive.horizontal.list .list>.item,.ui.massive.horizontal.list>.item{font-size:1.71428571rem}/*! + * # Fomantic-UI - Loader + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.loader{display:none;position:absolute;top:50%;left:50%;margin:0;text-align:center;z-index:1000;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.ui.loader:before{position:absolute;content:'';top:0;left:50%;width:100%;height:100%;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loader:after{position:absolute;content:'';top:0;left:50%;width:100%;height:100%;-webkit-animation:loader .6s infinite linear;animation:loader .6s infinite linear;border:.2em solid #767676;border-radius:500rem;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}.ui.fast.loader:after,.ui.fast.loading.loading .input>i.icon:after,.ui.fast.loading.loading:after,.ui.fast.loading.loading>i.icon:after{-webkit-animation-duration:.3s;animation-duration:.3s}.ui.slow.loader:after,.ui.slow.loading.loading .input>i.icon:after,.ui.slow.loading.loading:after,.ui.slow.loading.loading>i.icon:after{-webkit-animation-duration:.9s;animation-duration:.9s}@-webkit-keyframes loader{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loader{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui.dimmer>.loader{display:block}.ui.dimmer>.ui.loader{color:rgba(255,255,255,.9)}.ui.dimmer>.ui.loader:not(.elastic):before{border-color:rgba(255,255,255,.15)}.ui.inverted.dimmer>.ui.loader{color:rgba(0,0,0,.87)}.ui.inverted.dimmer>.ui.loader:not(.elastic):before{border-color:rgba(0,0,0,.1)}.ui.ui.ui.ui.text.loader{width:auto;height:auto;text-align:center;font-style:normal}.ui.indeterminate.loader:after{animation-direction:reverse;-webkit-animation-duration:1.2s;animation-duration:1.2s}.ui.loader.active,.ui.loader.visible{display:block}.ui.loader.disabled,.ui.loader.hidden{display:none}.ui.loader{width:2.28571429rem;height:2.28571429rem;font-size:1em}.ui.loader:after,.ui.loader:before{width:2.28571429rem;height:2.28571429rem;margin:0 0 0 -1.14285714rem}.ui.text.loader{min-width:2.28571429rem;padding-top:3.07142857rem}.ui.mini.loader{width:1rem;height:1rem;font-size:.78571429em}.ui.mini.loader:after,.ui.mini.loader:before{width:1rem;height:1rem;margin:0 0 0 -.5rem}.ui.mini.text.loader{min-width:1rem;padding-top:1.78571429rem}.ui.tiny.loader{width:1.14285714rem;height:1.14285714rem;font-size:.85714286em}.ui.tiny.loader:after,.ui.tiny.loader:before{width:1.14285714rem;height:1.14285714rem;margin:0 0 0 -.57142857rem}.ui.tiny.text.loader{min-width:1.14285714rem;padding-top:1.92857143rem}.ui.small.loader{width:1.71428571rem;height:1.71428571rem;font-size:.92857143em}.ui.small.loader:after,.ui.small.loader:before{width:1.71428571rem;height:1.71428571rem;margin:0 0 0 -.85714286rem}.ui.small.text.loader{min-width:1.71428571rem;padding-top:2.5rem}.ui.large.loader{width:3.42857143rem;height:3.42857143rem;font-size:1.14285714em}.ui.large.loader:after,.ui.large.loader:before{width:3.42857143rem;height:3.42857143rem;margin:0 0 0 -1.71428571rem}.ui.large.text.loader{min-width:3.42857143rem;padding-top:4.21428571rem}.ui.big.loader{width:3.71428571rem;height:3.71428571rem;font-size:1.28571429em}.ui.big.loader:after,.ui.big.loader:before{width:3.71428571rem;height:3.71428571rem;margin:0 0 0 -1.85714286rem}.ui.big.text.loader{min-width:3.71428571rem;padding-top:4.5rem}.ui.huge.loader{width:4.14285714rem;height:4.14285714rem;font-size:1.42857143em}.ui.huge.loader:after,.ui.huge.loader:before{width:4.14285714rem;height:4.14285714rem;margin:0 0 0 -2.07142857rem}.ui.huge.text.loader{min-width:4.14285714rem;padding-top:4.92857143rem}.ui.massive.loader{width:4.57142857rem;height:4.57142857rem;font-size:1.71428571em}.ui.massive.loader:after,.ui.massive.loader:before{width:4.57142857rem;height:4.57142857rem;margin:0 0 0 -2.28571429rem}.ui.massive.text.loader{min-width:4.57142857rem;padding-top:5.35714286rem}.ui.primary.basic.elastic.loading.button:after,.ui.primary.basic.elastic.loading.button:before,.ui.primary.elastic.loader.loader:before,.ui.primary.elastic.loading.loading.loading .input>i.icon:before,.ui.primary.elastic.loading.loading.loading.loading>i.icon:before,.ui.primary.elastic.loading.loading.loading:not(.segment):before,.ui.primary.loader.loader.loader:after,.ui.primary.loading.loading.loading.loading .input>i.icon:after,.ui.primary.loading.loading.loading.loading:not(.usual):not(.button):after,.ui.primary.loading.loading.loading.loading>i.icon:after{color:#2185d0}.ui.inverted.primary.elastic.loader:before,.ui.inverted.primary.elastic.loading.loading.loading .input>i.icon:before,.ui.inverted.primary.elastic.loading.loading.loading:not(.segment):before,.ui.inverted.primary.elastic.loading.loading.loading>i.icon:before,.ui.inverted.primary.loader.loader.loader:after,.ui.inverted.primary.loading.loading.loading.loading .input>i.icon:after,.ui.inverted.primary.loading.loading.loading.loading:not(.usual):after,.ui.inverted.primary.loading.loading.loading.loading>i.icon:after{color:#54c8ff}.ui.secondary.basic.elastic.loading.button:after,.ui.secondary.basic.elastic.loading.button:before,.ui.secondary.elastic.loader.loader:before,.ui.secondary.elastic.loading.loading.loading .input>i.icon:before,.ui.secondary.elastic.loading.loading.loading.loading>i.icon:before,.ui.secondary.elastic.loading.loading.loading:not(.segment):before,.ui.secondary.loader.loader.loader:after,.ui.secondary.loading.loading.loading.loading .input>i.icon:after,.ui.secondary.loading.loading.loading.loading:not(.usual):not(.button):after,.ui.secondary.loading.loading.loading.loading>i.icon:after{color:#1b1c1d}.ui.inverted.secondary.elastic.loader:before,.ui.inverted.secondary.elastic.loading.loading.loading .input>i.icon:before,.ui.inverted.secondary.elastic.loading.loading.loading:not(.segment):before,.ui.inverted.secondary.elastic.loading.loading.loading>i.icon:before,.ui.inverted.secondary.loader.loader.loader:after,.ui.inverted.secondary.loading.loading.loading.loading .input>i.icon:after,.ui.inverted.secondary.loading.loading.loading.loading:not(.usual):after,.ui.inverted.secondary.loading.loading.loading.loading>i.icon:after{color:#545454}.ui.red.basic.elastic.loading.button:after,.ui.red.basic.elastic.loading.button:before,.ui.red.elastic.loader.loader:before,.ui.red.elastic.loading.loading.loading .input>i.icon:before,.ui.red.elastic.loading.loading.loading.loading>i.icon:before,.ui.red.elastic.loading.loading.loading:not(.segment):before,.ui.red.loader.loader.loader:after,.ui.red.loading.loading.loading.loading .input>i.icon:after,.ui.red.loading.loading.loading.loading:not(.usual):not(.button):after,.ui.red.loading.loading.loading.loading>i.icon:after{color:#db2828}.ui.inverted.red.elastic.loader:before,.ui.inverted.red.elastic.loading.loading.loading .input>i.icon:before,.ui.inverted.red.elastic.loading.loading.loading:not(.segment):before,.ui.inverted.red.elastic.loading.loading.loading>i.icon:before,.ui.inverted.red.loader.loader.loader:after,.ui.inverted.red.loading.loading.loading.loading .input>i.icon:after,.ui.inverted.red.loading.loading.loading.loading:not(.usual):after,.ui.inverted.red.loading.loading.loading.loading>i.icon:after{color:#ff695e}.ui.orange.basic.elastic.loading.button:after,.ui.orange.basic.elastic.loading.button:before,.ui.orange.elastic.loader.loader:before,.ui.orange.elastic.loading.loading.loading .input>i.icon:before,.ui.orange.elastic.loading.loading.loading.loading>i.icon:before,.ui.orange.elastic.loading.loading.loading:not(.segment):before,.ui.orange.loader.loader.loader:after,.ui.orange.loading.loading.loading.loading .input>i.icon:after,.ui.orange.loading.loading.loading.loading:not(.usual):not(.button):after,.ui.orange.loading.loading.loading.loading>i.icon:after{color:#f2711c}.ui.inverted.orange.elastic.loader:before,.ui.inverted.orange.elastic.loading.loading.loading .input>i.icon:before,.ui.inverted.orange.elastic.loading.loading.loading:not(.segment):before,.ui.inverted.orange.elastic.loading.loading.loading>i.icon:before,.ui.inverted.orange.loader.loader.loader:after,.ui.inverted.orange.loading.loading.loading.loading .input>i.icon:after,.ui.inverted.orange.loading.loading.loading.loading:not(.usual):after,.ui.inverted.orange.loading.loading.loading.loading>i.icon:after{color:#ff851b}.ui.yellow.basic.elastic.loading.button:after,.ui.yellow.basic.elastic.loading.button:before,.ui.yellow.elastic.loader.loader:before,.ui.yellow.elastic.loading.loading.loading .input>i.icon:before,.ui.yellow.elastic.loading.loading.loading.loading>i.icon:before,.ui.yellow.elastic.loading.loading.loading:not(.segment):before,.ui.yellow.loader.loader.loader:after,.ui.yellow.loading.loading.loading.loading .input>i.icon:after,.ui.yellow.loading.loading.loading.loading:not(.usual):not(.button):after,.ui.yellow.loading.loading.loading.loading>i.icon:after{color:#fbbd08}.ui.inverted.yellow.elastic.loader:before,.ui.inverted.yellow.elastic.loading.loading.loading .input>i.icon:before,.ui.inverted.yellow.elastic.loading.loading.loading:not(.segment):before,.ui.inverted.yellow.elastic.loading.loading.loading>i.icon:before,.ui.inverted.yellow.loader.loader.loader:after,.ui.inverted.yellow.loading.loading.loading.loading .input>i.icon:after,.ui.inverted.yellow.loading.loading.loading.loading:not(.usual):after,.ui.inverted.yellow.loading.loading.loading.loading>i.icon:after{color:#ffe21f}.ui.olive.basic.elastic.loading.button:after,.ui.olive.basic.elastic.loading.button:before,.ui.olive.elastic.loader.loader:before,.ui.olive.elastic.loading.loading.loading .input>i.icon:before,.ui.olive.elastic.loading.loading.loading.loading>i.icon:before,.ui.olive.elastic.loading.loading.loading:not(.segment):before,.ui.olive.loader.loader.loader:after,.ui.olive.loading.loading.loading.loading .input>i.icon:after,.ui.olive.loading.loading.loading.loading:not(.usual):not(.button):after,.ui.olive.loading.loading.loading.loading>i.icon:after{color:#b5cc18}.ui.inverted.olive.elastic.loader:before,.ui.inverted.olive.elastic.loading.loading.loading .input>i.icon:before,.ui.inverted.olive.elastic.loading.loading.loading:not(.segment):before,.ui.inverted.olive.elastic.loading.loading.loading>i.icon:before,.ui.inverted.olive.loader.loader.loader:after,.ui.inverted.olive.loading.loading.loading.loading .input>i.icon:after,.ui.inverted.olive.loading.loading.loading.loading:not(.usual):after,.ui.inverted.olive.loading.loading.loading.loading>i.icon:after{color:#d9e778}.ui.green.basic.elastic.loading.button:after,.ui.green.basic.elastic.loading.button:before,.ui.green.elastic.loader.loader:before,.ui.green.elastic.loading.loading.loading .input>i.icon:before,.ui.green.elastic.loading.loading.loading.loading>i.icon:before,.ui.green.elastic.loading.loading.loading:not(.segment):before,.ui.green.loader.loader.loader:after,.ui.green.loading.loading.loading.loading .input>i.icon:after,.ui.green.loading.loading.loading.loading:not(.usual):not(.button):after,.ui.green.loading.loading.loading.loading>i.icon:after{color:#21ba45}.ui.inverted.green.elastic.loader:before,.ui.inverted.green.elastic.loading.loading.loading .input>i.icon:before,.ui.inverted.green.elastic.loading.loading.loading:not(.segment):before,.ui.inverted.green.elastic.loading.loading.loading>i.icon:before,.ui.inverted.green.loader.loader.loader:after,.ui.inverted.green.loading.loading.loading.loading .input>i.icon:after,.ui.inverted.green.loading.loading.loading.loading:not(.usual):after,.ui.inverted.green.loading.loading.loading.loading>i.icon:after{color:#2ecc40}.ui.teal.basic.elastic.loading.button:after,.ui.teal.basic.elastic.loading.button:before,.ui.teal.elastic.loader.loader:before,.ui.teal.elastic.loading.loading.loading .input>i.icon:before,.ui.teal.elastic.loading.loading.loading.loading>i.icon:before,.ui.teal.elastic.loading.loading.loading:not(.segment):before,.ui.teal.loader.loader.loader:after,.ui.teal.loading.loading.loading.loading .input>i.icon:after,.ui.teal.loading.loading.loading.loading:not(.usual):not(.button):after,.ui.teal.loading.loading.loading.loading>i.icon:after{color:#00b5ad}.ui.inverted.teal.elastic.loader:before,.ui.inverted.teal.elastic.loading.loading.loading .input>i.icon:before,.ui.inverted.teal.elastic.loading.loading.loading:not(.segment):before,.ui.inverted.teal.elastic.loading.loading.loading>i.icon:before,.ui.inverted.teal.loader.loader.loader:after,.ui.inverted.teal.loading.loading.loading.loading .input>i.icon:after,.ui.inverted.teal.loading.loading.loading.loading:not(.usual):after,.ui.inverted.teal.loading.loading.loading.loading>i.icon:after{color:#6dffff}.ui.blue.basic.elastic.loading.button:after,.ui.blue.basic.elastic.loading.button:before,.ui.blue.elastic.loader.loader:before,.ui.blue.elastic.loading.loading.loading .input>i.icon:before,.ui.blue.elastic.loading.loading.loading.loading>i.icon:before,.ui.blue.elastic.loading.loading.loading:not(.segment):before,.ui.blue.loader.loader.loader:after,.ui.blue.loading.loading.loading.loading .input>i.icon:after,.ui.blue.loading.loading.loading.loading:not(.usual):not(.button):after,.ui.blue.loading.loading.loading.loading>i.icon:after{color:#2185d0}.ui.inverted.blue.elastic.loader:before,.ui.inverted.blue.elastic.loading.loading.loading .input>i.icon:before,.ui.inverted.blue.elastic.loading.loading.loading:not(.segment):before,.ui.inverted.blue.elastic.loading.loading.loading>i.icon:before,.ui.inverted.blue.loader.loader.loader:after,.ui.inverted.blue.loading.loading.loading.loading .input>i.icon:after,.ui.inverted.blue.loading.loading.loading.loading:not(.usual):after,.ui.inverted.blue.loading.loading.loading.loading>i.icon:after{color:#54c8ff}.ui.violet.basic.elastic.loading.button:after,.ui.violet.basic.elastic.loading.button:before,.ui.violet.elastic.loader.loader:before,.ui.violet.elastic.loading.loading.loading .input>i.icon:before,.ui.violet.elastic.loading.loading.loading.loading>i.icon:before,.ui.violet.elastic.loading.loading.loading:not(.segment):before,.ui.violet.loader.loader.loader:after,.ui.violet.loading.loading.loading.loading .input>i.icon:after,.ui.violet.loading.loading.loading.loading:not(.usual):not(.button):after,.ui.violet.loading.loading.loading.loading>i.icon:after{color:#6435c9}.ui.inverted.violet.elastic.loader:before,.ui.inverted.violet.elastic.loading.loading.loading .input>i.icon:before,.ui.inverted.violet.elastic.loading.loading.loading:not(.segment):before,.ui.inverted.violet.elastic.loading.loading.loading>i.icon:before,.ui.inverted.violet.loader.loader.loader:after,.ui.inverted.violet.loading.loading.loading.loading .input>i.icon:after,.ui.inverted.violet.loading.loading.loading.loading:not(.usual):after,.ui.inverted.violet.loading.loading.loading.loading>i.icon:after{color:#a291fb}.ui.purple.basic.elastic.loading.button:after,.ui.purple.basic.elastic.loading.button:before,.ui.purple.elastic.loader.loader:before,.ui.purple.elastic.loading.loading.loading .input>i.icon:before,.ui.purple.elastic.loading.loading.loading.loading>i.icon:before,.ui.purple.elastic.loading.loading.loading:not(.segment):before,.ui.purple.loader.loader.loader:after,.ui.purple.loading.loading.loading.loading .input>i.icon:after,.ui.purple.loading.loading.loading.loading:not(.usual):not(.button):after,.ui.purple.loading.loading.loading.loading>i.icon:after{color:#a333c8}.ui.inverted.purple.elastic.loader:before,.ui.inverted.purple.elastic.loading.loading.loading .input>i.icon:before,.ui.inverted.purple.elastic.loading.loading.loading:not(.segment):before,.ui.inverted.purple.elastic.loading.loading.loading>i.icon:before,.ui.inverted.purple.loader.loader.loader:after,.ui.inverted.purple.loading.loading.loading.loading .input>i.icon:after,.ui.inverted.purple.loading.loading.loading.loading:not(.usual):after,.ui.inverted.purple.loading.loading.loading.loading>i.icon:after{color:#dc73ff}.ui.pink.basic.elastic.loading.button:after,.ui.pink.basic.elastic.loading.button:before,.ui.pink.elastic.loader.loader:before,.ui.pink.elastic.loading.loading.loading .input>i.icon:before,.ui.pink.elastic.loading.loading.loading.loading>i.icon:before,.ui.pink.elastic.loading.loading.loading:not(.segment):before,.ui.pink.loader.loader.loader:after,.ui.pink.loading.loading.loading.loading .input>i.icon:after,.ui.pink.loading.loading.loading.loading:not(.usual):not(.button):after,.ui.pink.loading.loading.loading.loading>i.icon:after{color:#e03997}.ui.inverted.pink.elastic.loader:before,.ui.inverted.pink.elastic.loading.loading.loading .input>i.icon:before,.ui.inverted.pink.elastic.loading.loading.loading:not(.segment):before,.ui.inverted.pink.elastic.loading.loading.loading>i.icon:before,.ui.inverted.pink.loader.loader.loader:after,.ui.inverted.pink.loading.loading.loading.loading .input>i.icon:after,.ui.inverted.pink.loading.loading.loading.loading:not(.usual):after,.ui.inverted.pink.loading.loading.loading.loading>i.icon:after{color:#ff8edf}.ui.brown.basic.elastic.loading.button:after,.ui.brown.basic.elastic.loading.button:before,.ui.brown.elastic.loader.loader:before,.ui.brown.elastic.loading.loading.loading .input>i.icon:before,.ui.brown.elastic.loading.loading.loading.loading>i.icon:before,.ui.brown.elastic.loading.loading.loading:not(.segment):before,.ui.brown.loader.loader.loader:after,.ui.brown.loading.loading.loading.loading .input>i.icon:after,.ui.brown.loading.loading.loading.loading:not(.usual):not(.button):after,.ui.brown.loading.loading.loading.loading>i.icon:after{color:#a5673f}.ui.inverted.brown.elastic.loader:before,.ui.inverted.brown.elastic.loading.loading.loading .input>i.icon:before,.ui.inverted.brown.elastic.loading.loading.loading:not(.segment):before,.ui.inverted.brown.elastic.loading.loading.loading>i.icon:before,.ui.inverted.brown.loader.loader.loader:after,.ui.inverted.brown.loading.loading.loading.loading .input>i.icon:after,.ui.inverted.brown.loading.loading.loading.loading:not(.usual):after,.ui.inverted.brown.loading.loading.loading.loading>i.icon:after{color:#d67c1c}.ui.grey.basic.elastic.loading.button:after,.ui.grey.basic.elastic.loading.button:before,.ui.grey.elastic.loader.loader:before,.ui.grey.elastic.loading.loading.loading .input>i.icon:before,.ui.grey.elastic.loading.loading.loading.loading>i.icon:before,.ui.grey.elastic.loading.loading.loading:not(.segment):before,.ui.grey.loader.loader.loader:after,.ui.grey.loading.loading.loading.loading .input>i.icon:after,.ui.grey.loading.loading.loading.loading:not(.usual):not(.button):after,.ui.grey.loading.loading.loading.loading>i.icon:after{color:#767676}.ui.inverted.grey.elastic.loader:before,.ui.inverted.grey.elastic.loading.loading.loading .input>i.icon:before,.ui.inverted.grey.elastic.loading.loading.loading:not(.segment):before,.ui.inverted.grey.elastic.loading.loading.loading>i.icon:before,.ui.inverted.grey.loader.loader.loader:after,.ui.inverted.grey.loading.loading.loading.loading .input>i.icon:after,.ui.inverted.grey.loading.loading.loading.loading:not(.usual):after,.ui.inverted.grey.loading.loading.loading.loading>i.icon:after{color:#dcddde}.ui.black.basic.elastic.loading.button:after,.ui.black.basic.elastic.loading.button:before,.ui.black.elastic.loader.loader:before,.ui.black.elastic.loading.loading.loading .input>i.icon:before,.ui.black.elastic.loading.loading.loading.loading>i.icon:before,.ui.black.elastic.loading.loading.loading:not(.segment):before,.ui.black.loader.loader.loader:after,.ui.black.loading.loading.loading.loading .input>i.icon:after,.ui.black.loading.loading.loading.loading:not(.usual):not(.button):after,.ui.black.loading.loading.loading.loading>i.icon:after{color:#1b1c1d}.ui.inverted.black.elastic.loader:before,.ui.inverted.black.elastic.loading.loading.loading .input>i.icon:before,.ui.inverted.black.elastic.loading.loading.loading:not(.segment):before,.ui.inverted.black.elastic.loading.loading.loading>i.icon:before,.ui.inverted.black.loader.loader.loader:after,.ui.inverted.black.loading.loading.loading.loading .input>i.icon:after,.ui.inverted.black.loading.loading.loading.loading:not(.usual):after,.ui.inverted.black.loading.loading.loading.loading>i.icon:after{color:#545454}.ui.elastic.loader.loader:before,.ui.elastic.loading.loading.loading .input>i.icon:before,.ui.elastic.loading.loading.loading:before,.ui.elastic.loading.loading.loading>i.icon:before,.ui.loader.loader.loader:after,.ui.loading.loading.loading.loading .input>i.icon:after,.ui.loading.loading.loading.loading:not(.usual):after,.ui.loading.loading.loading.loading>i.icon:after{border-color:currentColor}.ui.elastic.loading.loading.loading.loading.button:not(.inverted):not(.basic):before{color:#fff}.ui.elastic.basic.loading.button:after,.ui.elastic.basic.loading.button:before{color:#767676}.ui.double.loading.loading.loading.loading.button:after{border-bottom-color:currentColor}.ui.inline.loader{position:relative;vertical-align:middle;margin:0;left:0;top:0;-webkit-transform:none;transform:none}.ui.inline.loader.active,.ui.inline.loader.visible{display:inline-block}.ui.centered.inline.loader.active,.ui.centered.inline.loader.visible{display:block;margin-left:auto;margin-right:auto}.ui.loader.loader.loader.loader.loader:after,.ui.loading.loading.loading.loading.loading.loading .input>i.icon:after,.ui.loading.loading.loading.loading.loading.loading:after,.ui.loading.loading.loading.loading.loading.loading>i.icon:after{border-left-color:transparent;border-right-color:transparent}.ui.loader.loader.loader.loader.loader.loader:not(.double):after,.ui.loading.loading.loading.loading.loading.loading.loading:not(.double) .input>i.icon:after,.ui.loading.loading.loading.loading.loading.loading.loading:not(.double):after,.ui.loading.loading.loading.loading.loading.loading.loading:not(.double)>i.icon:after{border-bottom-color:transparent}.ui.loading.loading.loading.loading.loading.loading.form:after,.ui.loading.loading.loading.loading.loading.loading.segment:after{border-left-color:rgba(0,0,0,.1);border-right-color:rgba(0,0,0,.1)}.ui.loading.loading.loading.loading.loading.loading.form:not(.double):after,.ui.loading.loading.loading.loading.loading.loading.segment:not(.double):after{border-bottom-color:rgba(0,0,0,.1)}.ui.dimmer>.ui.elastic.loader{color:#fff}.ui.inverted.dimmer>.ui.elastic.loader{color:#767676}.ui.elastic.loader.loader:after,.ui.elastic.loading.loading .input>i.icon:after,.ui.elastic.loading.loading:not(.form):not(.segment):after,.ui.elastic.loading.loading>i.icon:after{-webkit-animation:loader 1s infinite cubic-bezier(.27,1.05,.92,.61);animation:loader 1s infinite cubic-bezier(.27,1.05,.92,.61);-webkit-animation-delay:.3s;animation-delay:.3s}.ui.elastic.loader.loader:before,.ui.elastic.loading.loading.loading .input>i.icon:before,.ui.elastic.loading.loading.loading:not(.form):not(.segment):before,.ui.elastic.loading.loading.loading>i.icon:before{-webkit-animation:elastic-loader 1s infinite cubic-bezier(.27,1.05,.92,.61);animation:elastic-loader 1s infinite cubic-bezier(.27,1.05,.92,.61);-moz-animation:currentcolor-elastic-loader 1s infinite cubic-bezier(.27,1.05,.92,.61);border-right-color:transparent}.ui.elastic.inline.loader:empty{-webkit-animation:loader 8s infinite linear;animation:loader 8s infinite linear}.ui.slow.elastic.loader.loader:after,.ui.slow.elastic.loading.loading .input>i.icon:after,.ui.slow.elastic.loading.loading:not(.form):not(.segment):after,.ui.slow.elastic.loading.loading>i.icon:after{-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-delay:.45s;animation-delay:.45s}.ui.slow.elastic.loader.loader:before,.ui.slow.elastic.loading.loading.loading .input>i.icon:before,.ui.slow.elastic.loading.loading.loading:not(.form):not(.segment):before,.ui.slow.elastic.loading.loading.loading>i.icon:before{-webkit-animation-duration:1.5s;animation-duration:1.5s}.ui.fast.elastic.loader.loader:after,.ui.fast.elastic.loading.loading .input>i.icon:after,.ui.fast.elastic.loading.loading:not(.form):not(.segment):after,.ui.fast.elastic.loading.loading>i.icon:after{-webkit-animation-duration:.66s;animation-duration:.66s;-webkit-animation-delay:.2s;animation-delay:.2s}.ui.fast.elastic.loader.loader:before,.ui.fast.elastic.loading.loading.loading .input>i.icon:before,.ui.fast.elastic.loading.loading.loading:not(.form):not(.segment):before,.ui.fast.elastic.loading.loading.loading>i.icon:before{-webkit-animation-duration:.66s;animation-duration:.66s}@-webkit-keyframes elastic-loader{0%,1%{border-left-color:transparent;border-bottom-color:transparent}1.1%,50%{border-left-color:inherit}10%,35.1%{border-bottom-color:transparent}10.1%,35%{border-bottom-color:inherit}50.1%{border-left-color:transparent}100%{border-left-color:transparent;border-bottom-color:transparent;-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes elastic-loader{0%,1%{border-left-color:transparent;border-bottom-color:transparent}1.1%,50%{border-left-color:inherit}10%,35.1%{border-bottom-color:transparent}10.1%,35%{border-bottom-color:inherit}50.1%{border-left-color:transparent}100%{border-left-color:transparent;border-bottom-color:transparent;-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes currentcolor-elastic-loader{0%,1%{border-left-color:transparent;border-bottom-color:transparent}1.1%,50%{border-left-color:currentColor}10%,35.1%{border-bottom-color:transparent}10.1%,35%{border-bottom-color:currentColor}50.1%{border-left-color:transparent}100%{border-left-color:transparent;border-bottom-color:transparent;-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes currentcolor-elastic-loader{0%,1%{border-left-color:transparent;border-bottom-color:transparent}1.1%,50%{border-left-color:currentColor}10%,35.1%{border-bottom-color:transparent}10.1%,35%{border-bottom-color:currentColor}50.1%{border-left-color:transparent}100%{border-left-color:transparent;border-bottom-color:transparent;-webkit-transform:rotate(360deg);transform:rotate(360deg)}}/*! + * # Fomantic-UI - Loader + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.placeholder{position:static;overflow:hidden;-webkit-animation:placeholderShimmer 2s linear;animation:placeholderShimmer 2s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;background-color:#fff;background-image:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(0,0,0,.08)),color-stop(15%,rgba(0,0,0,.15)),color-stop(30%,rgba(0,0,0,.08)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.08) 0,rgba(0,0,0,.15) 15%,rgba(0,0,0,.08) 30%);background-image:linear-gradient(to right,rgba(0,0,0,.08) 0,rgba(0,0,0,.15) 15%,rgba(0,0,0,.08) 30%);background-size:1200px 100%;max-width:30rem}@-webkit-keyframes placeholderShimmer{0%{background-position:-1200px 0}100%{background-position:1200px 0}}@keyframes placeholderShimmer{0%{background-position:-1200px 0}100%{background-position:1200px 0}}.ui.placeholder+.ui.placeholder{margin-top:2rem}.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.15s;animation-delay:.15s}.ui.placeholder+.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.3s;animation-delay:.3s}.ui.placeholder+.ui.placeholder+.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.45s;animation-delay:.45s}.ui.placeholder+.ui.placeholder+.ui.placeholder+.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.6s;animation-delay:.6s}.ui.placeholder,.ui.placeholder .image.header:after,.ui.placeholder .line,.ui.placeholder .line:after,.ui.placeholder>:before{background-color:#fff}.ui.placeholder.hidden{display:none}.ui.placeholder .image:not(.header):not(.ui):not(.icon){height:100px}.ui.placeholder .square.image:not(.header){height:0;overflow:hidden;padding-top:100%}.ui.placeholder .rectangular.image:not(.header){height:0;overflow:hidden;padding-top:75%}.ui.placeholder .line{position:relative;height:.85714286em}.ui.placeholder .line:after,.ui.placeholder .line:before{top:100%;position:absolute;content:'';background-color:inherit}.ui.placeholder .line:before{left:0}.ui.placeholder .line:after{right:0}.ui.placeholder .line{margin-bottom:.5em}.ui.placeholder .line:after,.ui.placeholder .line:before{height:.5em}.ui.placeholder .line:not(:first-child){margin-top:.5em}.ui.placeholder .line:nth-child(1):after{width:0}.ui.placeholder .line:nth-child(2):after{width:50%}.ui.placeholder .line:nth-child(3):after{width:10%}.ui.placeholder .line:nth-child(4):after{width:35%}.ui.placeholder .line:nth-child(5):after{width:65%}.ui.placeholder .header{position:relative;overflow:hidden}.ui.placeholder .header .line{margin-bottom:.64285714em}.ui.placeholder .header .line:after,.ui.placeholder .header .line:before{height:.64285714em}.ui.placeholder .header .line:not(:first-child){margin-top:.64285714em}.ui.placeholder .header .line:after{width:20%}.ui.placeholder .header .line:nth-child(2):after{width:60%}.ui.placeholder .image.header .line{margin-left:3em}.ui.placeholder .image.header .line:before{width:.71428571rem}.ui.placeholder .image.header:after{display:block;height:.85714286em;content:'';margin-left:3em}.ui.placeholder .header .line:first-child,.ui.placeholder .image .line:first-child,.ui.placeholder .paragraph .line:first-child{height:.01px}.ui.placeholder .header:not(:first-child):before,.ui.placeholder .image:not(:first-child):before,.ui.placeholder .paragraph:not(:first-child):before{height:1.42857143em;content:'';display:block}.ui.inverted.placeholder{background-image:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,.08)),color-stop(15%,rgba(255,255,255,.14)),color-stop(30%,rgba(255,255,255,.08)));background-image:-webkit-linear-gradient(left,rgba(255,255,255,.08) 0,rgba(255,255,255,.14) 15%,rgba(255,255,255,.08) 30%);background-image:linear-gradient(to right,rgba(255,255,255,.08) 0,rgba(255,255,255,.14) 15%,rgba(255,255,255,.08) 30%)}.ui.inverted.placeholder,.ui.inverted.placeholder .image.header:after,.ui.inverted.placeholder .line,.ui.inverted.placeholder .line:after,.ui.inverted.placeholder>:before{background-color:#1b1c1d}.ui.placeholder .full.line.line.line:after{width:0}.ui.placeholder .very.long.line.line.line:after{width:10%}.ui.placeholder .long.line.line.line:after{width:35%}.ui.placeholder .medium.line.line.line:after{width:50%}.ui.placeholder .short.line.line.line:after{width:65%}.ui.placeholder .very.short.line.line.line:after{width:80%}.ui.fluid.placeholder{max-width:none}/*! + * # Fomantic-UI - Rail + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.rail{position:absolute;top:0;width:300px;height:100%}.ui.left.rail{left:auto;right:100%;padding:0 2rem 0 0;margin:0 2rem 0 0}.ui.right.rail{left:100%;right:auto;padding:0 0 0 2rem;margin:0 0 0 2rem}.ui.left.internal.rail{left:0;right:auto;padding:0 0 0 2rem;margin:0 0 0 2rem}.ui.right.internal.rail{left:auto;right:0;padding:0 2rem 0 0;margin:0 2rem 0 0}.ui.dividing.rail{width:302.5px}.ui.left.dividing.rail{padding:0 2.5rem 0 0;margin:0 2.5rem 0 0;border-right:1px solid rgba(34,36,38,.15)}.ui.right.dividing.rail{border-left:1px solid rgba(34,36,38,.15);padding:0 0 0 2.5rem;margin:0 0 0 2.5rem}.ui.close.rail{width:calc(300px + 1em)}.ui.close.left.rail{padding:0 1em 0 0;margin:0 1em 0 0}.ui.close.right.rail{padding:0 0 0 1em;margin:0 0 0 1em}.ui.very.close.rail{width:calc(300px + .5em)}.ui.very.close.left.rail{padding:0 .5em 0 0;margin:0 .5em 0 0}.ui.very.close.right.rail{padding:0 0 0 .5em;margin:0 0 0 .5em}.ui.attached.left.rail,.ui.attached.right.rail{padding:0;margin:0}.ui.rail{font-size:1rem}.ui.mini.rail{font-size:.78571429rem}.ui.tiny.rail{font-size:.85714286rem}.ui.small.rail{font-size:.92857143rem}.ui.large.rail{font-size:1.14285714rem}.ui.big.rail{font-size:1.28571429rem}.ui.huge.rail{font-size:1.42857143rem}.ui.massive.rail{font-size:1.71428571rem}/*! + * # Fomantic-UI - Reveal + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.reveal{display:inherit;position:relative!important;font-size:0}.ui.reveal>.visible.content{position:absolute!important;top:0!important;left:0!important;z-index:3!important;-webkit-transition:all .5s ease .1s;transition:all .5s ease .1s}.ui.reveal>.hidden.content{position:relative!important;z-index:2!important}.ui.active.reveal .visible.content,.ui.reveal:hover .visible.content{z-index:4!important}.ui.slide.reveal{position:relative!important;overflow:hidden!important;white-space:nowrap}.ui.slide.reveal>.content{display:block;width:100%;white-space:normal;float:left;margin:0;-webkit-transition:-webkit-transform .5s ease .1s;transition:-webkit-transform .5s ease .1s;transition:transform .5s ease .1s;transition:transform .5s ease .1s,-webkit-transform .5s ease .1s}.ui.slide.reveal>.visible.content{position:relative!important}.ui.slide.reveal>.hidden.content{position:absolute!important;left:0!important;width:100%!important;-webkit-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.slide.active.reveal>.visible.content,.ui.slide.reveal:hover>.visible.content{-webkit-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.slide.active.reveal>.hidden.content,.ui.slide.reveal:hover>.hidden.content{-webkit-transform:translateX(0)!important;transform:translateX(0)!important}.ui.slide.right.reveal>.visible.content{-webkit-transform:translateX(0)!important;transform:translateX(0)!important}.ui.slide.right.reveal>.hidden.content{-webkit-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.slide.right.active.reveal>.visible.content,.ui.slide.right.reveal:hover>.visible.content{-webkit-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.slide.right.active.reveal>.hidden.content,.ui.slide.right.reveal:hover>.hidden.content{-webkit-transform:translateX(0)!important;transform:translateX(0)!important}.ui.slide.up.reveal>.hidden.content{-webkit-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.slide.up.active.reveal>.visible.content,.ui.slide.up.reveal:hover>.visible.content{-webkit-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.slide.up.active.reveal>.hidden.content,.ui.slide.up.reveal:hover>.hidden.content{-webkit-transform:translateY(0)!important;transform:translateY(0)!important}.ui.slide.down.reveal>.hidden.content{-webkit-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.slide.down.active.reveal>.visible.content,.ui.slide.down.reveal:hover>.visible.content{-webkit-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.slide.down.active.reveal>.hidden.content,.ui.slide.down.reveal:hover>.hidden.content{-webkit-transform:translateY(0)!important;transform:translateY(0)!important}.ui.fade.reveal>.visible.content{opacity:1}.ui.fade.active.reveal>.visible.content,.ui.fade.reveal:hover>.visible.content{opacity:0}.ui.move.reveal{position:relative!important;overflow:hidden!important;white-space:nowrap}.ui.move.reveal>.content{display:block;float:left;white-space:normal;margin:0;-webkit-transition:-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:transform .5s cubic-bezier(.175,.885,.32,1) .1s,-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s}.ui.move.reveal>.visible.content{position:relative!important}.ui.move.reveal>.hidden.content{position:absolute!important;left:0!important;width:100%!important}.ui.move.active.reveal>.visible.content,.ui.move.reveal:hover>.visible.content{-webkit-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.move.right.active.reveal>.visible.content,.ui.move.right.reveal:hover>.visible.content{-webkit-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.move.up.active.reveal>.visible.content,.ui.move.up.reveal:hover>.visible.content{-webkit-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.move.down.active.reveal>.visible.content,.ui.move.down.reveal:hover>.visible.content{-webkit-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.rotate.reveal>.visible.content{-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transform:rotate(0);transform:rotate(0)}.ui.rotate.reveal>.visible.content,.ui.rotate.right.reveal>.visible.content{-webkit-transform-origin:bottom right;transform-origin:bottom right}.ui.rotate.active.reveal>.visible.content,.ui.rotate.reveal:hover>.visible.content,.ui.rotate.right.active.reveal>.visible.content,.ui.rotate.right.reveal:hover>.visible.content{-webkit-transform:rotate(110deg);transform:rotate(110deg)}.ui.rotate.left.reveal>.visible.content{-webkit-transform-origin:bottom left;transform-origin:bottom left}.ui.rotate.left.active.reveal>.visible.content,.ui.rotate.left.reveal:hover>.visible.content{-webkit-transform:rotate(-110deg);transform:rotate(-110deg)}.ui.disabled.reveal:hover>.visible.visible.content{position:static!important;display:block!important;opacity:1!important;top:0!important;left:0!important;right:auto!important;bottom:auto!important;-webkit-transform:none!important;transform:none!important}.ui.disabled.reveal:hover>.hidden.hidden.content{display:none!important}.ui.reveal>.ui.ribbon.label{z-index:5}.ui.visible.reveal{overflow:visible}.ui.instant.reveal>.content{-webkit-transition-delay:0s!important;transition-delay:0s!important}.ui.reveal>.content{font-size:1rem}.ui.mini.reveal>.content{font-size:.78571429rem}.ui.tiny.reveal>.content{font-size:.85714286rem}.ui.small.reveal>.content{font-size:.92857143rem}.ui.large.reveal>.content{font-size:1.14285714rem}.ui.big.reveal>.content{font-size:1.28571429rem}.ui.huge.reveal>.content{font-size:1.42857143rem}.ui.massive.reveal>.content{font-size:1.71428571rem}/*! + * # Fomantic-UI - Segment + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.segment{position:relative;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);margin:1rem 0;padding:1em 1em;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.segment:first-child{margin-top:0}.ui.segment:last-child{margin-bottom:0}.ui.vertical.segment{margin:0;padding-left:0;padding-right:0;background:none transparent;border-radius:0;-webkit-box-shadow:none;box-shadow:none;border:none;border-bottom:1px solid rgba(34,36,38,.15)}.ui.vertical.segment:last-child{border-bottom:none}.ui.inverted.segment>.ui.header,.ui.inverted.segment>.ui.header>.sub.header{color:#fff}.ui[class*="bottom attached"].segment>[class*="top attached"].label{border-top-left-radius:0;border-top-right-radius:0}.ui[class*="top attached"].segment>[class*="bottom attached"].label{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.attached.segment:not(.top):not(.bottom)>[class*="top attached"].label{border-top-left-radius:0;border-top-right-radius:0}.ui.attached.segment:not(.top):not(.bottom)>[class*="bottom attached"].label{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.grid>.row>.ui.segment.column,.ui.grid>.ui.segment.column,.ui.page.grid.segment{padding-top:2em;padding-bottom:2em}.ui.grid.segment{margin:1rem 0;border-radius:.28571429rem}.ui.basic.table.segment{background:#fff;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.ui[class*="very basic"].table.segment{padding:1em 1em}.ui.segment.tab:last-child{margin-bottom:1rem}.ui.placeholder.segment{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;max-width:initial;-webkit-animation:none;animation:none;overflow:visible;padding:1em 1em;min-height:18rem;background:#f9fafb;border-color:rgba(34,36,38,.15);-webkit-box-shadow:0 2px 25px 0 rgba(34,36,38,.05) inset;box-shadow:0 2px 25px 0 rgba(34,36,38,.05) inset}.ui.placeholder.segment .button,.ui.placeholder.segment textarea{display:block}.ui.placeholder.segment .button,.ui.placeholder.segment .field,.ui.placeholder.segment textarea,.ui.placeholder.segment>.ui.input{max-width:15rem;margin-left:auto;margin-right:auto}.ui.placeholder.segment .column .button,.ui.placeholder.segment .column .field,.ui.placeholder.segment .column textarea,.ui.placeholder.segment .column>.ui.input{max-width:15rem;margin-left:auto;margin-right:auto}.ui.placeholder.segment>.inline{-ms-flex-item-align:center;align-self:center}.ui.placeholder.segment>.inline>.button{display:inline-block;width:auto;margin:0 .35714286rem 0 0}.ui.placeholder.segment>.inline>.button:last-child{margin-right:0}.ui.piled.segment,.ui.piled.segments{margin:3em 0;-webkit-box-shadow:'';box-shadow:'';z-index:auto}.ui.piled.segment:first-child{margin-top:0}.ui.piled.segment:last-child{margin-bottom:0}.ui.piled.segment:after,.ui.piled.segment:before,.ui.piled.segments:after,.ui.piled.segments:before{background-color:#fff;visibility:visible;content:'';display:block;height:100%;left:0;position:absolute;width:100%;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:'';box-shadow:''}.ui.piled.segment:before,.ui.piled.segments:before{-webkit-transform:rotate(-1.2deg);transform:rotate(-1.2deg);top:0;z-index:-2}.ui.piled.segment:after,.ui.piled.segments:after{-webkit-transform:rotate(1.2deg);transform:rotate(1.2deg);top:0;z-index:-1}.ui[class*="top attached"].piled.segment{margin-top:3em;margin-bottom:0}.ui.piled.segment[class*="top attached"]:first-child{margin-top:0}.ui.piled.segment[class*="bottom attached"]{margin-top:0;margin-bottom:3em}.ui.piled.segment[class*="bottom attached"]:last-child{margin-bottom:0}.ui.stacked.segment{padding-bottom:1.4em}.ui.stacked.segment:after,.ui.stacked.segment:before,.ui.stacked.segments:after,.ui.stacked.segments:before{content:'';position:absolute;bottom:-3px;left:0;border-top:1px solid rgba(34,36,38,.15);background:rgba(0,0,0,.03);width:100%;height:6px;visibility:visible}.ui.stacked.segment:before,.ui.stacked.segments:before{display:none}.ui.tall.stacked.segment:before,.ui.tall.stacked.segments:before{display:block;bottom:0}.ui.stacked.inverted.segment:after,.ui.stacked.inverted.segment:before,.ui.stacked.inverted.segments:after,.ui.stacked.inverted.segments:before{background-color:rgba(0,0,0,.03);border-top:1px solid rgba(34,36,38,.35)}.ui.padded.segment{padding:1.5em}.ui[class*="very padded"].segment{padding:3em}.ui.padded.segment.vertical.segment,.ui[class*="very padded"].vertical.segment{padding-left:0;padding-right:0}.ui.compact.segment{display:table}.ui.compact.segments{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.ui.compact.segments .segment,.ui.segments .compact.segment{display:block;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.ui.circular.segment{display:table-cell;padding:2em;text-align:center;vertical-align:middle;border-radius:500em}.ui.raised.raised.segment,.ui.raised.raised.segments{-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.segments{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;position:relative;margin:1rem 0;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);border-radius:.28571429rem}.ui.segments:first-child{margin-top:0}.ui.segments:last-child{margin-bottom:0}.ui.segments>.segment{top:0;bottom:0;border-radius:0;margin:0;width:auto;-webkit-box-shadow:none;box-shadow:none;border:none;border-top:1px solid rgba(34,36,38,.15)}.ui.segments:not(.horizontal)>.segment:first-child{top:0;bottom:0;border-top:none;margin-top:0;margin-bottom:0;border-radius:.28571429rem .28571429rem 0 0}.ui.segments:not(.horizontal)>.segment:last-child{top:0;bottom:0;margin-top:0;margin-bottom:0;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui.segments:not(.horizontal)>.segment:only-child{border-radius:.28571429rem}.ui.segments>.ui.segments{border-top:1px solid rgba(34,36,38,.15);margin:1rem 1rem}.ui.segments>.segments:first-child{border-top:none}.ui.segments>.segment+.segments:not(.horizontal){margin-top:0}.ui.horizontal.segments{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;background-color:transparent;padding:0;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);margin:1rem 0;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.stackable.horizontal.segments{-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.segments>.horizontal.segments{margin:0;background-color:transparent;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none;border-top:1px solid rgba(34,36,38,.15)}.ui.horizontal.segments:not(.compact)>.segment:not(.compact){-webkit-box-flex:1;flex:1 1 auto;-ms-flex:1 1 0}.ui.horizontal.segments>.segment{margin:0;min-width:0;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none;border-left:1px solid rgba(34,36,38,.15)}.ui.segments>.horizontal.segments:first-child{border-top:none}.ui.horizontal.segments:not(.stackable)>.segment:first-child{border-left:none}.ui.disabled.segment{opacity:.45;color:rgba(40,40,40,.3)}.ui.loading.segment{position:relative;cursor:default;pointer-events:none;text-shadow:none!important;-webkit-transition:all 0s linear;transition:all 0s linear}.ui.loading.segment:before{position:absolute;content:'';top:0;left:0;background:rgba(255,255,255,.8);width:100%;height:100%;border-radius:.28571429rem;z-index:100}.ui.loading.segment:after{position:absolute;content:'';top:50%;left:50%;margin:-1.5em 0 0 -1.5em;width:3em;height:3em;-webkit-animation:loader .6s infinite linear;animation:loader .6s infinite linear;border:.2em solid #767676;border-radius:500rem;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent;visibility:visible;z-index:101}.ui.basic.segment,.ui.basic.segments,.ui.segments .ui.basic.segment{background:none transparent;-webkit-box-shadow:none;box-shadow:none;border:none;border-radius:0}.ui.clearing.segment:after{content:"";display:block;clear:both}.ui.red.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #db2828}.ui.inverted.red.segment.segment.segment.segment.segment{background-color:#db2828;color:#fff}.ui.orange.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #f2711c}.ui.inverted.orange.segment.segment.segment.segment.segment{background-color:#f2711c;color:#fff}.ui.yellow.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #fbbd08}.ui.inverted.yellow.segment.segment.segment.segment.segment{background-color:#fbbd08;color:#fff}.ui.olive.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #b5cc18}.ui.inverted.olive.segment.segment.segment.segment.segment{background-color:#b5cc18;color:#fff}.ui.green.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #21ba45}.ui.inverted.green.segment.segment.segment.segment.segment{background-color:#21ba45;color:#fff}.ui.teal.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #00b5ad}.ui.inverted.teal.segment.segment.segment.segment.segment{background-color:#00b5ad;color:#fff}.ui.blue.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #2185d0}.ui.inverted.blue.segment.segment.segment.segment.segment{background-color:#2185d0;color:#fff}.ui.violet.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #6435c9}.ui.inverted.violet.segment.segment.segment.segment.segment{background-color:#6435c9;color:#fff}.ui.purple.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #a333c8}.ui.inverted.purple.segment.segment.segment.segment.segment{background-color:#a333c8;color:#fff}.ui.pink.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #e03997}.ui.inverted.pink.segment.segment.segment.segment.segment{background-color:#e03997;color:#fff}.ui.brown.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #a5673f}.ui.inverted.brown.segment.segment.segment.segment.segment{background-color:#a5673f;color:#fff}.ui.grey.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #767676}.ui.inverted.grey.segment.segment.segment.segment.segment{background-color:#767676;color:#fff}.ui.black.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #1b1c1d}.ui.inverted.black.segment.segment.segment.segment.segment{background-color:#1b1c1d;color:#fff}.ui[class*="left aligned"].segment{text-align:left}.ui[class*="right aligned"].segment{text-align:right}.ui[class*="center aligned"].segment{text-align:center}.ui.floated.segment,.ui[class*="left floated"].segment{float:left;margin-right:1em}.ui[class*="right floated"].segment{float:right;margin-left:1em}.ui.inverted.segment{border:none;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.segment,.ui.primary.inverted.segment{background:#1b1c1d;color:rgba(255,255,255,.9)}.ui.inverted.segment .segment{color:rgba(0,0,0,.87)}.ui.inverted.segment .inverted.segment{color:rgba(255,255,255,.9)}.ui.inverted.attached.segment{border-color:#555}.ui.inverted.loading.segment{color:#fff}.ui.inverted.loading.segment:before{background:rgba(0,0,0,.85)}.ui.secondary.segment{background:#f3f4f5;color:rgba(0,0,0,.6)}.ui.secondary.inverted.segment{background:#4c4f52 -webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,.2)),to(rgba(255,255,255,.2)));background:#4c4f52 -webkit-linear-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.2) 100%);background:#4c4f52 linear-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.2) 100%);color:rgba(255,255,255,.8)}.ui.tertiary.segment{background:#dcddde;color:rgba(0,0,0,.6)}.ui.tertiary.inverted.segment{background:#717579 -webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,.35)),to(rgba(255,255,255,.35)));background:#717579 -webkit-linear-gradient(rgba(255,255,255,.35) 0,rgba(255,255,255,.35) 100%);background:#717579 linear-gradient(rgba(255,255,255,.35) 0,rgba(255,255,255,.35) 100%);color:rgba(255,255,255,.8)}.ui.attached.segment{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% + 2px);max-width:calc(100% + 2px);-webkit-box-shadow:none;box-shadow:none;border:1px solid #d4d4d5}.ui.attached:not(.message)+.ui.attached.segment:not(.top){border-top:none}.ui[class*="top attached"].segment{bottom:0;margin-bottom:0;top:0;margin-top:1rem;border-radius:.28571429rem .28571429rem 0 0}.ui.segment[class*="top attached"]:first-child{margin-top:0}.ui.segment[class*="bottom attached"]{bottom:0;margin-top:0;top:0;margin-bottom:1rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui.segment[class*="bottom attached"]:last-child{margin-bottom:1rem}.ui.fitted.segment:not(.horizontally){padding-top:0;padding-bottom:0}.ui.fitted.segment:not(.vertically){padding-left:0;padding-right:0}.ui.segment,.ui.segments .segment{font-size:1rem}.ui.mini.segment,.ui.mini.segments .segment{font-size:.78571429rem}.ui.tiny.segment,.ui.tiny.segments .segment{font-size:.85714286rem}.ui.small.segment,.ui.small.segments .segment{font-size:.92857143rem}.ui.large.segment,.ui.large.segments .segment{font-size:1.14285714rem}.ui.big.segment,.ui.big.segments .segment{font-size:1.28571429rem}.ui.huge.segment,.ui.huge.segments .segment{font-size:1.42857143rem}.ui.massive.segment,.ui.massive.segments .segment{font-size:1.71428571rem}/*! + * # Fomantic-UI - Step + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.steps{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;margin:1em 0;background:'';-webkit-box-shadow:none;box-shadow:none;line-height:1.14285714em;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.steps:not(.unstackable){-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.steps:first-child{margin-top:0}.ui.steps:last-child{margin-bottom:0}.ui.steps .step{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;vertical-align:middle;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:0 0;padding:1.14285714em 2em;background:#fff;color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none;border-radius:0;border:none;border-right:1px solid rgba(34,36,38,.15);-webkit-transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease,-webkit-box-shadow .1s ease}.ui.steps .step:after{display:none;position:absolute;z-index:2;content:'';top:50%;right:0;background-color:#fff;width:1.14285714em;height:1.14285714em;border-style:solid;border-color:rgba(34,36,38,.15);border-width:0 1px 1px 0;-webkit-transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease,-webkit-box-shadow .1s ease;-webkit-transform:translateY(-50%) translateX(50%) rotate(-45deg);transform:translateY(-50%) translateX(50%) rotate(-45deg)}.ui.steps .step:first-child{padding-left:2em;border-radius:.28571429rem 0 0 .28571429rem}.ui.steps .step:last-child{border-radius:0 .28571429rem .28571429rem 0;border-right:none;margin-right:0}.ui.steps .step:only-child{border-radius:.28571429rem}.ui.steps .step .title{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1.14285714em;font-weight:700}.ui.steps .step>.title{width:100%}.ui.steps .step .description{font-weight:400;font-size:.92857143em;color:rgba(0,0,0,.87)}.ui.steps .step>.description{width:100%}.ui.steps .step .title~.description{margin-top:.25em}.ui.steps .step>.icon{line-height:1;font-size:2.5em;margin:0 1rem 0 0}.ui.steps .step>.icon,.ui.steps .step>.icon~.content{display:block;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;-ms-flex-item-align:middle;align-self:middle}.ui.steps:not(.vertical) .step>.icon{width:auto}.ui.steps .link.step,.ui.steps a.step{cursor:pointer}.ui.ordered.steps{counter-reset:ordered}.ui.ordered.steps .step:before{display:block;position:static;text-align:center;content:counter(ordered);-ms-flex-item-align:middle;align-self:middle;margin-right:1rem;font-size:2.5em;counter-increment:ordered;font-family:inherit;font-weight:700}.ui.ordered.steps .step>*{display:block;-ms-flex-item-align:middle;align-self:middle}.ui.vertical.steps{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow:visible}.ui.vertical.steps .step{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;border-radius:0;padding:1.14285714em 2em;border-right:none;border-bottom:1px solid rgba(34,36,38,.15)}.ui.vertical.steps .step:first-child{padding:1.14285714em 2em;border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.steps .step:last-child{border-bottom:none;border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.steps .step:only-child{border-radius:.28571429rem}.ui.vertical.steps .step:after{top:50%;right:0;border-width:0 1px 1px 0;display:none}.ui.vertical.steps .active.step:after{display:block}.ui.vertical.steps .step:last-child:after{display:none}.ui.vertical.steps .active.step:last-child:after{display:block}@media only screen and (max-width:767.98px){.ui.steps:not(.unstackable){display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;overflow:visible;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.steps:not(.unstackable) .step{width:100%!important;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;border-radius:0;padding:1.14285714em 2em;border-right:none;border-bottom:1px solid rgba(34,36,38,.15)}.ui.steps:not(.unstackable) .step:first-child{padding:1.14285714em 2em;border-radius:.28571429rem .28571429rem 0 0}.ui.steps:not(.unstackable) .step:last-child{border-radius:0 0 .28571429rem .28571429rem;border-bottom:none}.ui.steps:not(.unstackable) .step:after{top:unset;bottom:-1.14285714em;right:50%;-webkit-transform:translateY(-50%) translateX(50%) rotate(45deg);transform:translateY(-50%) translateX(50%) rotate(45deg)}.ui.vertical.steps .active.step:last-child:after{display:none}.ui.steps:not(.unstackable) .step .content{text-align:center}.ui.ordered.steps:not(.unstackable) .step:before,.ui.steps:not(.unstackable) .step>.icon{margin:0 0 1rem 0}}.ui.steps .link.step:hover,.ui.steps .link.step:hover::after,.ui.steps a.step:hover,.ui.steps a.step:hover::after{background:#f9fafb;color:rgba(0,0,0,.8)}.ui.steps .link.step:active,.ui.steps .link.step:active::after,.ui.steps a.step:active,.ui.steps a.step:active::after{background:#f3f4f5;color:rgba(0,0,0,.9)}.ui.steps .step.active{cursor:auto;background:#f3f4f5}.ui.steps .step.active:after{background:#f3f4f5}.ui.steps .step.active .title{color:#4183c4}.ui.ordered.steps .step.active:before,.ui.steps .active.step .icon{color:rgba(0,0,0,.85)}.ui.steps .step:after{display:block}.ui.steps .active.step:after{display:block}.ui.steps .step:last-child:after{display:none}.ui.steps .active.step:last-child:after{display:none}.ui.steps .link.active.step:hover,.ui.steps .link.active.step:hover::after,.ui.steps a.active.step:hover,.ui.steps a.active.step:hover::after{cursor:pointer;background:#dcddde;color:rgba(0,0,0,.87)}.ui.ordered.steps .step.completed:before,.ui.steps .step.completed>.icon:before{color:#21ba45}.ui.steps .disabled.step{cursor:auto;background:#fff;pointer-events:none}.ui.steps .disabled.step,.ui.steps .disabled.step .description,.ui.steps .disabled.step .title{color:rgba(40,40,40,.3)}.ui.steps .disabled.step:after{background:#fff}@media only screen and (max-width:991.98px){.ui[class*="tablet stackable"].steps{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;overflow:visible;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui[class*="tablet stackable"].steps .step{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;border-radius:0;padding:1.14285714em 2em;border-right:none;border-bottom:1px solid rgba(34,36,38,.15)}.ui[class*="tablet stackable"].steps .step:first-child{padding:1.14285714em 2em;border-radius:.28571429rem .28571429rem 0 0}.ui[class*="tablet stackable"].steps .step:last-child{border-radius:0 0 .28571429rem .28571429rem;border-bottom:none}.ui[class*="tablet stackable"].steps .step:after{top:unset;bottom:-1.14285714em;right:50%;-webkit-transform:translateY(-50%) translateX(50%) rotate(45deg);transform:translateY(-50%) translateX(50%) rotate(45deg)}.ui[class*="tablet stackable"].steps .step .content{text-align:center}.ui[class*="tablet stackable"].ordered.steps .step:before,.ui[class*="tablet stackable"].steps .step>.icon{margin:0 0 1rem 0}}.ui.fluid.steps{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%}.ui.attached.steps{width:calc(100% + 2px)!important;margin:0 -1px 0;max-width:calc(100% + 2px);border-radius:.28571429rem .28571429rem 0 0}.ui.attached.steps .step:first-child{border-radius:.28571429rem 0 0 0}.ui.attached.steps .step:last-child{border-radius:0 .28571429rem 0 0}.ui.bottom.attached.steps{margin:0 -1px 0;border-radius:0 0 .28571429rem .28571429rem}.ui.bottom.attached.steps .step:first-child{border-radius:0 0 0 .28571429rem}.ui.bottom.attached.steps .step:last-child{border-radius:0 0 .28571429rem 0}.ui.eight.steps,.ui.five.steps,.ui.four.steps,.ui.one.steps,.ui.seven.steps,.ui.six.steps,.ui.three.steps,.ui.two.steps{width:100%}.ui.eight.steps>.step,.ui.five.steps>.step,.ui.four.steps>.step,.ui.one.steps>.step,.ui.seven.steps>.step,.ui.six.steps>.step,.ui.three.steps>.step,.ui.two.steps>.step{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.ui.one.steps>.step{width:100%}.ui.two.steps>.step{width:50%}.ui.three.steps>.step{width:33.333%}.ui.four.steps>.step{width:25%}.ui.five.steps>.step{width:20%}.ui.six.steps>.step{width:16.666%}.ui.seven.steps>.step{width:14.285%}.ui.eight.steps>.step{width:12.5%}.ui.step,.ui.steps .step{font-size:1rem}.ui.mini.step,.ui.mini.steps .step{font-size:.78571429rem}.ui.tiny.step,.ui.tiny.steps .step{font-size:.85714286rem}.ui.small.step,.ui.small.steps .step{font-size:.92857143rem}.ui.large.step,.ui.large.steps .step{font-size:1.14285714rem}.ui.big.step,.ui.big.steps .step{font-size:1.28571429rem}.ui.huge.step,.ui.huge.steps .step{font-size:1.42857143rem}.ui.massive.step,.ui.massive.steps .step{font-size:1.71428571rem}.ui.inverted.steps{border:1px solid #555}.ui.inverted.steps .step{color:rgba(255,255,255,.9);background:#1b1c1d;border-color:#555}.ui.inverted.steps .step:after{background-color:#1b1c1d;border-color:#555}.ui.inverted.steps .step .description{color:rgba(255,255,255,.9)}.ui.inverted.steps .step.active,.ui.inverted.steps .step.active:after{background:#333}.ui.inverted.ordered.steps .step.active:before,.ui.inverted.steps .active.step .icon{color:#fff}.ui.inverted.steps .disabled.step,.ui.inverted.steps .disabled.step:after{background:#222}.ui.inverted.steps .disabled.step,.ui.inverted.steps .disabled.step .description,.ui.inverted.steps .disabled.step .title{color:rgba(225,225,225,.3)}.ui.inverted.steps .link.step:hover,.ui.inverted.steps .link.step:hover::after,.ui.inverted.steps a.step:hover,.ui.inverted.steps a.step:hover::after{background:#3f3f3f;color:#fff}.ui.inverted.steps .link.step:active,.ui.inverted.steps .link.step:active::after,.ui.inverted.steps a.step:active,.ui.inverted.steps a.step:active::after{background:#444;color:#fff}@font-face{font-family:Step;src:url(data:application/x-font-ttf;charset=utf-8;;base64,AAEAAAAOAIAAAwBgT1MvMj3hSQEAAADsAAAAVmNtYXDQEhm3AAABRAAAAUpjdnQgBkn/lAAABuwAAAAcZnBnbYoKeDsAAAcIAAAJkWdhc3AAAAAQAAAG5AAAAAhnbHlm32cEdgAAApAAAAC2aGVhZAErPHsAAANIAAAANmhoZWEHUwNNAAADgAAAACRobXR4CykAAAAAA6QAAAAMbG9jYQA4AFsAAAOwAAAACG1heHAApgm8AAADuAAAACBuYW1lzJ0aHAAAA9gAAALNcG9zdK69QJgAAAaoAAAAO3ByZXCSoZr/AAAQnAAAAFYAAQO4AZAABQAIAnoCvAAAAIwCegK8AAAB4AAxAQIAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA6ADoAQNS/2oAWgMLAE8AAAABAAAAAAAAAAAAAwAAAAMAAAAcAAEAAAAAAEQAAwABAAAAHAAEACgAAAAGAAQAAQACAADoAf//AAAAAOgA//8AABgBAAEAAAAAAAAAAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAADpAKYABUAHEAZDwEAAQFCAAIBAmoAAQABagAAAGEUFxQDEisBFAcBBiInASY0PwE2Mh8BATYyHwEWA6QP/iAQLBD+6g8PTBAsEKQBbhAsEEwPAhYWEP4gDw8BFhAsEEwQEKUBbxAQTBAAAAH//f+xA18DCwAMABJADwABAQpDAAAACwBEFRMCESsBFA4BIi4CPgEyHgEDWXLG6MhuBnq89Lp+AV51xHR0xOrEdHTEAAAAAAEAAAABAADDeRpdXw889QALA+gAAAAAzzWYjQAAAADPNWBN//3/sQOkAwsAAAAIAAIAAAAAAAAAAQAAA1L/agBaA+gAAP/3A6QAAQAAAAAAAAAAAAAAAAAAAAMD6AAAA+gAAANZAAAAAAAAADgAWwABAAAAAwAWAAEAAAAAAAIABgATAG4AAAAtCZEAAAAAAAAAEgDeAAEAAAAAAAAANQAAAAEAAAAAAAEACAA1AAEAAAAAAAIABwA9AAEAAAAAAAMACABEAAEAAAAAAAQACABMAAEAAAAAAAUACwBUAAEAAAAAAAYACABfAAEAAAAAAAoAKwBnAAEAAAAAAAsAEwCSAAMAAQQJAAAAagClAAMAAQQJAAEAEAEPAAMAAQQJAAIADgEfAAMAAQQJAAMAEAEtAAMAAQQJAAQAEAE9AAMAAQQJAAUAFgFNAAMAAQQJAAYAEAFjAAMAAQQJAAoAVgFzAAMAAQQJAAsAJgHJQ29weXJpZ2h0IChDKSAyMDE0IGJ5IG9yaWdpbmFsIGF1dGhvcnMgQCBmb250ZWxsby5jb21mb250ZWxsb1JlZ3VsYXJmb250ZWxsb2ZvbnRlbGxvVmVyc2lvbiAxLjBmb250ZWxsb0dlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAEMAbwBwAHkAcgBpAGcAaAB0ACAAKABDACkAIAAyADAAMQA0ACAAYgB5ACAAbwByAGkAZwBpAG4AYQBsACAAYQB1AHQAaABvAHIAcwAgAEAAIABmAG8AbgB0AGUAbABsAG8ALgBjAG8AbQBmAG8AbgB0AGUAbABsAG8AUgBlAGcAdQBsAGEAcgBmAG8AbgB0AGUAbABsAG8AZgBvAG4AdABlAGwAbABvAFYAZQByAHMAaQBvAG4AIAAxAC4AMABmAG8AbgB0AGUAbABsAG8ARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAQIBAwljaGVja21hcmsGY2lyY2xlAAAAAAEAAf//AA8AAAAAAAAAAAAAAAAAAAAAADIAMgML/7EDC/+xsAAssCBgZi2wASwgZCCwwFCwBCZasARFW1ghIyEbilggsFBQWCGwQFkbILA4UFghsDhZWSCwCkVhZLAoUFghsApFILAwUFghsDBZGyCwwFBYIGYgiophILAKUFhgGyCwIFBYIbAKYBsgsDZQWCGwNmAbYFlZWRuwACtZWSOwAFBYZVlZLbACLCBFILAEJWFkILAFQ1BYsAUjQrAGI0IbISFZsAFgLbADLCMhIyEgZLEFYkIgsAYjQrIKAAIqISCwBkMgiiCKsAArsTAFJYpRWGBQG2FSWVgjWSEgsEBTWLAAKxshsEBZI7AAUFhlWS2wBCywB0MrsgACAENgQi2wBSywByNCIyCwACNCYbCAYrABYLAEKi2wBiwgIEUgsAJFY7ABRWJgRLABYC2wBywgIEUgsAArI7ECBCVgIEWKI2EgZCCwIFBYIbAAG7AwUFiwIBuwQFlZI7AAUFhlWbADJSNhRESwAWAtsAgssQUFRbABYUQtsAkssAFgICCwCUNKsABQWCCwCSNCWbAKQ0qwAFJYILAKI0JZLbAKLCC4BABiILgEAGOKI2GwC0NgIIpgILALI0IjLbALLEtUWLEHAURZJLANZSN4LbAMLEtRWEtTWLEHAURZGyFZJLATZSN4LbANLLEADENVWLEMDEOwAWFCsAorWbAAQ7ACJUKxCQIlQrEKAiVCsAEWIyCwAyVQWLEBAENgsAQlQoqKIIojYbAJKiEjsAFhIIojYbAJKiEbsQEAQ2CwAiVCsAIlYbAJKiFZsAlDR7AKQ0dgsIBiILACRWOwAUViYLEAABMjRLABQ7AAPrIBAQFDYEItsA4ssQAFRVRYALAMI0IgYLABYbUNDQEACwBCQopgsQ0FK7BtKxsiWS2wDyyxAA4rLbAQLLEBDistsBEssQIOKy2wEiyxAw4rLbATLLEEDistsBQssQUOKy2wFSyxBg4rLbAWLLEHDistsBcssQgOKy2wGCyxCQ4rLbAZLLAIK7EABUVUWACwDCNCIGCwAWG1DQ0BAAsAQkKKYLENBSuwbSsbIlktsBossQAZKy2wGyyxARkrLbAcLLECGSstsB0ssQMZKy2wHiyxBBkrLbAfLLEFGSstsCAssQYZKy2wISyxBxkrLbAiLLEIGSstsCMssQkZKy2wJCwgPLABYC2wJSwgYLANYCBDI7ABYEOwAiVhsAFgsCQqIS2wJiywJSuwJSotsCcsICBHICCwAkVjsAFFYmAjYTgjIIpVWCBHICCwAkVjsAFFYmAjYTgbIVktsCgssQAFRVRYALABFrAnKrABFTAbIlktsCkssAgrsQAFRVRYALABFrAnKrABFTAbIlktsCosIDWwAWAtsCssALADRWOwAUVisAArsAJFY7ABRWKwACuwABa0AAAAAABEPiM4sSoBFSotsCwsIDwgRyCwAkVjsAFFYmCwAENhOC2wLSwuFzwtsC4sIDwgRyCwAkVjsAFFYmCwAENhsAFDYzgtsC8ssQIAFiUgLiBHsAAjQrACJUmKikcjRyNhIFhiGyFZsAEjQrIuAQEVFCotsDAssAAWsAQlsAQlRyNHI2GwBkUrZYouIyAgPIo4LbAxLLAAFrAEJbAEJSAuRyNHI2EgsAQjQrAGRSsgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjILAIQyCKI0cjRyNhI0ZgsARDsIBiYCCwACsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsIBiYSMgILAEJiNGYTgbI7AIQ0awAiWwCENHI0cjYWAgsARDsIBiYCMgsAArI7AEQ2CwACuwBSVhsAUlsIBisAQmYSCwBCVgZCOwAyVgZFBYIRsjIVkjICCwBCYjRmE4WS2wMiywABYgICCwBSYgLkcjRyNhIzw4LbAzLLAAFiCwCCNCICAgRiNHsAArI2E4LbA0LLAAFrADJbACJUcjRyNhsABUWC4gPCMhG7ACJbACJUcjRyNhILAFJbAEJUcjRyNhsAYlsAUlSbACJWGwAUVjIyBYYhshWWOwAUViYCMuIyAgPIo4IyFZLbA1LLAAFiCwCEMgLkcjRyNhIGCwIGBmsIBiIyAgPIo4LbA2LCMgLkawAiVGUlggPFkusSYBFCstsDcsIyAuRrACJUZQWCA8WS6xJgEUKy2wOCwjIC5GsAIlRlJYIDxZIyAuRrACJUZQWCA8WS6xJgEUKy2wOSywMCsjIC5GsAIlRlJYIDxZLrEmARQrLbA6LLAxK4ogIDywBCNCijgjIC5GsAIlRlJYIDxZLrEmARQrsARDLrAmKy2wOyywABawBCWwBCYgLkcjRyNhsAZFKyMgPCAuIzixJgEUKy2wPCyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAGRSsgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwgGJgILAAKyCKimEgsAJDYGQjsANDYWRQWLACQ2EbsANDYFmwAyWwgGJhsAIlRmE4IyA8IzgbISAgRiNHsAArI2E4IVmxJgEUKy2wPSywMCsusSYBFCstsD4ssDErISMgIDywBCNCIzixJgEUK7AEQy6wJistsD8ssAAVIEewACNCsgABARUUEy6wLCotsEAssAAVIEewACNCsgABARUUEy6wLCotsEEssQABFBOwLSotsEIssC8qLbBDLLAAFkUjIC4gRoojYTixJgEUKy2wRCywCCNCsEMrLbBFLLIAADwrLbBGLLIAATwrLbBHLLIBADwrLbBILLIBATwrLbBJLLIAAD0rLbBKLLIAAT0rLbBLLLIBAD0rLbBMLLIBAT0rLbBNLLIAADkrLbBOLLIAATkrLbBPLLIBADkrLbBQLLIBATkrLbBRLLIAADsrLbBSLLIAATsrLbBTLLIBADsrLbBULLIBATsrLbBVLLIAAD4rLbBWLLIAAT4rLbBXLLIBAD4rLbBYLLIBAT4rLbBZLLIAADorLbBaLLIAATorLbBbLLIBADorLbBcLLIBATorLbBdLLAyKy6xJgEUKy2wXiywMiuwNistsF8ssDIrsDcrLbBgLLAAFrAyK7A4Ky2wYSywMysusSYBFCstsGIssDMrsDYrLbBjLLAzK7A3Ky2wZCywMyuwOCstsGUssDQrLrEmARQrLbBmLLA0K7A2Ky2wZyywNCuwNystsGgssDQrsDgrLbBpLLA1Ky6xJgEUKy2waiywNSuwNistsGsssDUrsDcrLbBsLLA1K7A4Ky2wbSwrsAhlsAMkUHiwARUwLQAAAEu4AMhSWLEBAY5ZuQgACABjILABI0SwAyNwsgQoCUVSRLIKAgcqsQYBRLEkAYhRWLBAiFixBgNEsSYBiFFYuAQAiFixBgFEWVlZWbgB/4WwBI2xBQBEAAA=) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAoUAA4AAAAAEPQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABRAAAAEQAAABWPeFJAWNtYXAAAAGIAAAAOgAAAUrQEhm3Y3Z0IAAAAcQAAAAUAAAAHAZJ/5RmcGdtAAAB2AAABPkAAAmRigp4O2dhc3AAAAbUAAAACAAAAAgAAAAQZ2x5ZgAABtwAAACuAAAAtt9nBHZoZWFkAAAHjAAAADUAAAA2ASs8e2hoZWEAAAfEAAAAIAAAACQHUwNNaG10eAAAB+QAAAAMAAAADAspAABsb2NhAAAH8AAAAAgAAAAIADgAW21heHAAAAf4AAAAIAAAACAApgm8bmFtZQAACBgAAAF3AAACzcydGhxwb3N0AAAJkAAAACoAAAA7rr1AmHByZXAAAAm8AAAAVgAAAFaSoZr/eJxjYGTewTiBgZWBg6mKaQ8DA0MPhGZ8wGDIyMTAwMTAysyAFQSkuaYwOLxgeMHIHPQ/iyGKmZvBHyjMCJIDAPe9C2B4nGNgYGBmgGAZBkYGEHAB8hjBfBYGDSDNBqQZGZgYGF4w/v8PUvCCAURLMELVAwEjG8OIBwBk5AavAAB4nGNgQANGDEbM3P83gjAAELQD4XicnVXZdtNWFJU8ZHASOmSgoA7X3DhQ68qEKRgwaSrFdiEdHAitBB2kDHTkncc+62uOQrtWH/m07n09JLR0rbYsls++R1tn2DrnRhwjKn0aiGvUoZKXA6msPZZK90lc13Uvj5UMBnFdthJPSZuonSRKat3sUC7xWOsqWSdYJ+PlIFZPVZ5noAziFB5lSUQbRBuplyZJ4onjJ4kWZxAfJUkgJaMQp9LIUEI1GsRS1aFM6dCr1xNx00DKRqMedVhU90PFJ8c1p9SsA0YqVznCFevVRr4bpwMve5DEOsGzrYcxHnisfpQqkIqR6cg/dkpOlIaBVHHUoVbi6DCTX/eRTCrNQKaMYkWl7oG43f102xYxPXQ6vi5KlUaqurnOKJrt0fGogygP2cbppNzQ2fbw5RlTVKtdcbPtQGYNXErJbHSfRAAdJlLj6QFONZwCqRn1R8XZ588BEslclKo8VTKHegOZMzt7cTHtbiersnCknwcyb3Z2452HQ6dXh3/R+hdM4cxHj+Jifj5C+lBqfiJOJKVGWMzyp4YfcVcgQrkxiAsXyuBThDl0RdrZZl3jtTH2hs/5SqlhPQna6KP4fgr9TiQrHGdRo/VInM1j13Wt3GdQS7W7Fzsyr0OVIu7vCwuuM+eEYZ4WC1VfnvneBTT/Bohn/EDeNIVL+5YpSrRvm6JMu2iKCu0SVKVdNsUU7YoppmnPmmKG9h1TzNKeMzLj/8vc55H7HN7xkJv2XeSmfQ+5ad9HbtoPkJtWITdtHblpLyA3rUZu2lWjOnYEGgZpF1IVQdA0svph3Fab9UDWjDR8aWDyLmLI+upER521tcofxX914gsHcmmip7siF5viLq/bFj483e6rj5pG3bDV+MaR8jAeRnocmtBZ+c3hv+1N3S6a7jKqMugBFUwKwABl7UAC0zrbCaT1mqf48gdgXIZ4zkpDtVSfO4am7+V5X/exOfG+x+3GLrdcd3kJWdYNcmP28N9SZKrrH+UtrVQnR6wrJ49VaxhDKrwour6SlHu0tRu/KKmy8l6U1srnk5CbPYMbQlu27mGwI0xpyiUeXlOlKD3UUo6yQyxvKco84JSLC1qGxLgOdQ9qa8TpoXoYGwshhqG0vRBwSCldFd+0ynfxHqtr2Oj4xRXh6XpyEhGf4ir7UfBU10b96A7avGbdMoMpVaqn+4xPsa/b9lFZaaSOsxe3VAfXNOsaORXTT+Rr4HRvOGjdAz1UfDRBI1U1x+jGKGM0ljXl3wR0MVZ+w2jVYvs93E+dpFWsuUuY7JsT9+C0u/0q+7WcW0bW/dcGvW3kip8jMb8tCvw7B2K3ZA3UO5OBGAvIWdAYxhYmdxiug23EbfY/Jqf/34aFRXJXOxq7eerD1ZNRJXfZ8rjLTXZZ16M2R9VOGvsIjS0PN+bY4XIstsRgQbb+wf8x7gF3aVEC4NDIZZiI2nShnurh6h6rsW04VxIBds2x43QAegAuQd8cu9bzCYD13CPnLsB9cgh2yCH4lByCz8i5BfA5OQRfkEMwIIdgl5w7AA/IIXhIDsEeOQSPyNkE+JIcgq/IIYjJIUjIuQ3wmByCJ+QQfE0OwTdGrk5k/pYH2QD6zqKbQKmdGhzaOGRGrk3Y+zxY9oFFZB9aROqRkesT6lMeLPV7i0j9wSJSfzRyY0L9iQdL/dkiUn+xiNRnxpeZIymvDp7zjg7+BJfqrV4AAAAAAQAB//8AD3icY2BkAALmJUwzGEQZZBwk+RkZGBmdGJgYmbIYgMwsoGSiiLgIs5A2owg7I5uSOqOaiT2jmZE8I5gQY17C/09BQEfg3yt+fh8gvYQxD0j68DOJiQn8U+DnZxQDcQUEljLmCwBpBgbG/3//b2SOZ+Zm4GEQcuAH2sblDLSEm8FFVJhJEGgLH6OSHpMdo5EcI3Nk0bEXJ/LYqvZ82VXHGFd6pKTkyCsQwQAAq+QkqAAAeJxjYGRgYADiw5VSsfH8Nl8ZuJlfAEUYzpvO6IXQCb7///7fyLyEmRvI5WBgAokCAFb/DJAAAAB4nGNgZGBgDvqfxRDF/IKB4f935iUMQBEUwAwAi5YFpgPoAAAD6AAAA1kAAAAAAAAAOABbAAEAAAADABYAAQAAAAAAAgAGABMAbgAAAC0JkQAAAAB4nHWQy2rCQBSG//HSi0JbWui2sypKabxgN4IgWHTTbqS4LTHGJBIzMhkFX6Pv0IfpS/RZ+puMpShNmMx3vjlz5mQAXOMbAvnzxJGzwBmjnAs4Rc9ykf7Zcon8YrmMKt4sn9C/W67gAYHlKm7wwQqidM5ogU/LAlfi0nIBF+LOcpH+0XKJ3LNcxq14tXxC71muYCJSy1Xci6+BWm11FIRG1gZ12W62OnK6lYoqStxYumsTKp3KvpyrxPhxrBxPLfc89oN17Op9uJ8nvk4jlciW09yrkZ/42jX+bFc93QRtY+ZyrtVSDm2GXGm18D3jhMasuo3G3/MwgMIKW2hEvKoQBhI12jrnNppooUOaMkMyM8+KkMBFTONizR1htpIy7nPMGSW0PjNisgOP3+WRH5MC7o9ZRR+tHsYT0u6MKPOSfTns7jBrREqyTDezs9/eU2x4WpvWcNeuS511JTE8qCF5H7u1BY1H72S3Ymi7aPD95/9+AN1fhEsAeJxjYGKAAC4G7ICZgYGRiZGZMzkjNTk7N7Eomy05syg5J5WBAQBE1QZBAABLuADIUlixAQGOWbkIAAgAYyCwASNEsAMjcLIEKAlFUkSyCgIHKrEGAUSxJAGIUViwQIhYsQYDRLEmAYhRWLgEAIhYsQYBRFlZWVm4Af+FsASNsQUARAAA) format('woff')}.ui.ordered.steps .step.completed:before,.ui.steps .step.completed>.icon:before{font-family:Step;content:'\e800'}/*! + * # Fomantic-UI - Text + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * https://github.com/fomantic/Fomantic-UI/blob/master/LICENSE.md + * + */span.ui.primary.text{color:#2185d0}span.ui.inverted.primary.text{color:#54c8ff}span.ui.secondary.text{color:#1b1c1d}span.ui.inverted.secondary.text{color:#545454}span.ui.red.text{color:#db2828}span.ui.inverted.red.text{color:#ff695e}span.ui.orange.text{color:#f2711c}span.ui.inverted.orange.text{color:#ff851b}span.ui.yellow.text{color:#fbbd08}span.ui.inverted.yellow.text{color:#ffe21f}span.ui.olive.text{color:#b5cc18}span.ui.inverted.olive.text{color:#d9e778}span.ui.green.text{color:#21ba45}span.ui.inverted.green.text{color:#2ecc40}span.ui.teal.text{color:#00b5ad}span.ui.inverted.teal.text{color:#6dffff}span.ui.blue.text{color:#2185d0}span.ui.inverted.blue.text{color:#54c8ff}span.ui.violet.text{color:#6435c9}span.ui.inverted.violet.text{color:#a291fb}span.ui.purple.text{color:#a333c8}span.ui.inverted.purple.text{color:#dc73ff}span.ui.pink.text{color:#e03997}span.ui.inverted.pink.text{color:#ff8edf}span.ui.brown.text{color:#a5673f}span.ui.inverted.brown.text{color:#d67c1c}span.ui.grey.text{color:#767676}span.ui.inverted.grey.text{color:#dcddde}span.ui.black.text{color:#1b1c1d}span.ui.inverted.black.text{color:#545454}span.ui.disabled.text{opacity:.45}span.ui.medium.text{font-size:1em}span.ui.mini.text{font-size:.4em}span.ui.tiny.text{font-size:.5em}span.ui.small.text{font-size:.75em}span.ui.large.text{font-size:1.5em}span.ui.big.text{font-size:2em}span.ui.huge.text{font-size:4em}span.ui.massive.text{font-size:8em}/*! + * # Fomantic-UI - Breadcrumb + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.breadcrumb{line-height:1.4285em;display:inline-block;margin:0 0;vertical-align:middle}.ui.breadcrumb:first-child{margin-top:0}.ui.breadcrumb:last-child{margin-bottom:0}.ui.breadcrumb .divider{display:inline-block;opacity:.7;margin:0 .21428571rem 0;font-size:.92857143em;color:rgba(0,0,0,.4);vertical-align:baseline}.ui.breadcrumb a{color:#4183c4}.ui.breadcrumb a:hover{color:#1e70bf}.ui.breadcrumb .icon.divider{font-size:.85714286em;vertical-align:baseline}.ui.breadcrumb a.section{cursor:pointer}.ui.breadcrumb .section{display:inline-block;margin:0;padding:0}.ui.breadcrumb.segment{display:inline-block;padding:.78571429em 1em}.ui.inverted.breadcrumb{color:#dcddde}.ui.inverted.breadcrumb>.active.section{color:#fff}.ui.inverted.breadcrumb>.divider{color:rgba(255,255,255,.7)}.ui.breadcrumb .active.section{font-weight:700}.ui.breadcrumb{font-size:1rem}.ui.mini.breadcrumb{font-size:.78571429rem}.ui.tiny.breadcrumb{font-size:.85714286rem}.ui.small.breadcrumb{font-size:.92857143rem}.ui.large.breadcrumb{font-size:1.14285714rem}.ui.big.breadcrumb{font-size:1.28571429rem}.ui.huge.breadcrumb{font-size:1.42857143rem}.ui.massive.breadcrumb{font-size:1.71428571rem}/*! + * # Fomantic-UI - Form + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.form{position:relative;max-width:100%}.ui.form>p{margin:1em 0}.ui.form .field{clear:both;margin:0 0 1em}.ui.form .field:last-child,.ui.form .fields .fields,.ui.form .fields:last-child .field{margin-bottom:0}.ui.form .fields .field{clear:both;margin:0}.ui.form .field>label{display:block;margin:0 0 .28571429rem 0;color:rgba(0,0,0,.87);font-size:.92857143em;font-weight:700;text-transform:none}.ui.form input:not([type]),.ui.form input[type=date],.ui.form input[type=datetime-local],.ui.form input[type=email],.ui.form input[type=file],.ui.form input[type=number],.ui.form input[type=password],.ui.form input[type=search],.ui.form input[type=tel],.ui.form input[type=text],.ui.form input[type=time],.ui.form input[type=url],.ui.form textarea{width:100%;vertical-align:top}.ui.form ::-webkit-datetime-edit,.ui.form ::-webkit-inner-spin-button{height:1.21428571em}.ui.form input:not([type]),.ui.form input[type=date],.ui.form input[type=datetime-local],.ui.form input[type=email],.ui.form input[type=file],.ui.form input[type=number],.ui.form input[type=password],.ui.form input[type=search],.ui.form input[type=tel],.ui.form input[type=text],.ui.form input[type=time],.ui.form input[type=url]{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;margin:0;outline:0;-webkit-appearance:none;-webkit-tap-highlight-color:rgba(255,255,255,0);line-height:1.21428571em;padding:.67857143em 1em;font-size:1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:0 0 0 0 transparent inset;-webkit-transition:color .1s ease,border-color .1s ease;transition:color .1s ease,border-color .1s ease}.ui.form textarea,.ui.input textarea{margin:0;-webkit-appearance:none;-webkit-tap-highlight-color:rgba(255,255,255,0);padding:.78571429em 1em;background:#fff;border:1px solid rgba(34,36,38,.15);outline:0;color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:0 0 0 0 transparent inset;-webkit-transition:color .1s ease,border-color .1s ease;transition:color .1s ease,border-color .1s ease;font-size:1em;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;line-height:1.2857;resize:vertical}.ui.form textarea:not([rows]){height:12em;min-height:8em;max-height:24em}.ui.form input[type=checkbox],.ui.form textarea{vertical-align:top}.ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) label+.ui.ui.checkbox{margin-top:.7em}.ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) .ui.checkbox{margin-top:2.41428571em}.ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) .ui.toggle.checkbox{margin-top:2.21428571em}.ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) .ui.slider.checkbox{margin-top:2.61428571em}.ui.ui.form .field .fields .field:not(:only-child) .ui.checkbox{margin-top:.6em}.ui.ui.form .field .fields .field:not(:only-child) .ui.toggle.checkbox{margin-top:.5em}.ui.ui.form .field .fields .field:not(:only-child) .ui.slider.checkbox{margin-top:.7em}.ui.form .field .transparent.input:not(.icon) input,.ui.form .field input.transparent,.ui.form .field textarea.transparent{padding:.67857143em 1em}.ui.form .field input.transparent,.ui.form .field textarea.transparent{border-color:transparent!important;background-color:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.form input.attached{width:auto}.ui.form select{display:block;height:auto;width:100%;background:#fff;border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem;-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:0 0 0 0 transparent inset;padding:.62em 1em;color:rgba(0,0,0,.87);-webkit-transition:color .1s ease,border-color .1s ease;transition:color .1s ease,border-color .1s ease}.ui.form .field>.selection.dropdown{min-width:auto;width:100%}.ui.form .field>.selection.dropdown>.dropdown.icon{float:right}.ui.form .inline.field>.selection.dropdown,.ui.form .inline.fields .field>.selection.dropdown{width:auto}.ui.form .inline.field>.selection.dropdown>.dropdown.icon,.ui.form .inline.fields .field>.selection.dropdown>.dropdown.icon{float:none}.ui.form .field .ui.input,.ui.form .fields .field .ui.input,.ui.form .wide.field .ui.input{width:100%}.ui.form .inline.field:not(.wide) .ui.input,.ui.form .inline.fields .field:not(.wide) .ui.input{width:auto;vertical-align:middle}.ui.form .field .ui.input input,.ui.form .fields .field .ui.input input{width:auto}.ui.form .eight.fields .ui.input input,.ui.form .five.fields .ui.input input,.ui.form .four.fields .ui.input input,.ui.form .nine.fields .ui.input input,.ui.form .seven.fields .ui.input input,.ui.form .six.fields .ui.input input,.ui.form .ten.fields .ui.input input,.ui.form .three.fields .ui.input input,.ui.form .two.fields .ui.input input,.ui.form .wide.field .ui.input input{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;width:0}.ui.form .error.message,.ui.form .error.message:empty{display:none}.ui.form .info.message,.ui.form .info.message:empty{display:none}.ui.form .success.message,.ui.form .success.message:empty{display:none}.ui.form .warning.message,.ui.form .warning.message:empty{display:none}.ui.form .message:first-child{margin-top:0}.ui.form .field .prompt.label{white-space:normal;background:#fff!important;border:1px solid #e0b4b4!important;color:#9f3a38!important}.ui.form .inline.field .prompt,.ui.form .inline.fields .field .prompt{vertical-align:top;margin:-.25em 0 -.5em .5em}.ui.form .inline.field .prompt:before,.ui.form .inline.fields .field .prompt:before{border-width:0 0 1px 1px;bottom:auto;right:auto;top:50%;left:0}.ui.form .field.field input:-webkit-autofill{-webkit-box-shadow:0 0 0 100px ivory inset!important;box-shadow:0 0 0 100px ivory inset!important;border-color:#e5dfa1!important}.ui.form .field.field input:-webkit-autofill:focus{-webkit-box-shadow:0 0 0 100px ivory inset!important;box-shadow:0 0 0 100px ivory inset!important;border-color:#d5c315!important}.ui.form ::-webkit-input-placeholder{color:rgba(191,191,191,.87)}.ui.form :-ms-input-placeholder{color:rgba(191,191,191,.87)!important}.ui.form ::-moz-placeholder{color:rgba(191,191,191,.87)}.ui.form :focus::-webkit-input-placeholder{color:rgba(115,115,115,.87)}.ui.form :focus:-ms-input-placeholder{color:rgba(115,115,115,.87)!important}.ui.form :focus::-moz-placeholder{color:rgba(115,115,115,.87)}.ui.form input:not([type]):focus,.ui.form input[type=date]:focus,.ui.form input[type=datetime-local]:focus,.ui.form input[type=email]:focus,.ui.form input[type=file]:focus,.ui.form input[type=number]:focus,.ui.form input[type=password]:focus,.ui.form input[type=search]:focus,.ui.form input[type=tel]:focus,.ui.form input[type=text]:focus,.ui.form input[type=time]:focus,.ui.form input[type=url]:focus{color:rgba(0,0,0,.95);border-color:#85b7d9;border-radius:.28571429rem;background:#fff;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.35) inset;box-shadow:0 0 0 0 rgba(34,36,38,.35) inset}.ui.form .ui.action.input:not(.left) input:not([type]):focus,.ui.form .ui.action.input:not(.left) input[type=date]:focus,.ui.form .ui.action.input:not(.left) input[type=datetime-local]:focus,.ui.form .ui.action.input:not(.left) input[type=email]:focus,.ui.form .ui.action.input:not(.left) input[type=file]:focus,.ui.form .ui.action.input:not(.left) input[type=number]:focus,.ui.form .ui.action.input:not(.left) input[type=password]:focus,.ui.form .ui.action.input:not(.left) input[type=search]:focus,.ui.form .ui.action.input:not(.left) input[type=tel]:focus,.ui.form .ui.action.input:not(.left) input[type=text]:focus,.ui.form .ui.action.input:not(.left) input[type=time]:focus,.ui.form .ui.action.input:not(.left) input[type=url]:focus{border-top-right-radius:0;border-bottom-right-radius:0}.ui.form .ui.action.input.left input:not([type]),.ui.form .ui.action.input.left input[type=date],.ui.form .ui.action.input.left input[type=datetime-local],.ui.form .ui.action.input.left input[type=email],.ui.form .ui.action.input.left input[type=file],.ui.form .ui.action.input.left input[type=number],.ui.form .ui.action.input.left input[type=password],.ui.form .ui.action.input.left input[type=search],.ui.form .ui.action.input.left input[type=tel],.ui.form .ui.action.input.left input[type=text],.ui.form .ui.action.input.left input[type=time],.ui.form .ui.action.input.left input[type=url]{border-bottom-left-radius:0;border-top-left-radius:0}.ui.form textarea:focus{color:rgba(0,0,0,.95);border-color:#85b7d9;border-radius:.28571429rem;background:#fff;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.35) inset;box-shadow:0 0 0 0 rgba(34,36,38,.35) inset;-webkit-appearance:none}.ui.form.error .error.message:not(:empty){display:block}.ui.form.error .compact.error.message:not(:empty){display:inline-block}.ui.form.error .icon.error.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.form .field.error .error.message:not(:empty),.ui.form .fields.error .error.message:not(:empty){display:block}.ui.form .field.error .compact.error.message:not(:empty),.ui.form .fields.error .compact.error.message:not(:empty){display:inline-block}.ui.form .field.error .icon.error.message:not(:empty),.ui.form .fields.error .icon.error.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.ui.form .field.error .input,.ui.ui.form .field.error label,.ui.ui.form .fields.error .field .input,.ui.ui.form .fields.error .field label{color:#9f3a38}.ui.form .field.error .corner.label,.ui.form .fields.error .field .corner.label{border-color:#9f3a38;color:#fff}.ui.form .field.error input:not([type]),.ui.form .field.error input[type=date],.ui.form .field.error input[type=datetime-local],.ui.form .field.error input[type=email],.ui.form .field.error input[type=file],.ui.form .field.error input[type=number],.ui.form .field.error input[type=password],.ui.form .field.error input[type=search],.ui.form .field.error input[type=tel],.ui.form .field.error input[type=text],.ui.form .field.error input[type=time],.ui.form .field.error input[type=url],.ui.form .field.error select,.ui.form .field.error textarea,.ui.form .fields.error .field input:not([type]),.ui.form .fields.error .field input[type=date],.ui.form .fields.error .field input[type=datetime-local],.ui.form .fields.error .field input[type=email],.ui.form .fields.error .field input[type=file],.ui.form .fields.error .field input[type=number],.ui.form .fields.error .field input[type=password],.ui.form .fields.error .field input[type=search],.ui.form .fields.error .field input[type=tel],.ui.form .fields.error .field input[type=text],.ui.form .fields.error .field input[type=time],.ui.form .fields.error .field input[type=url],.ui.form .fields.error .field select,.ui.form .fields.error .field textarea{color:#9f3a38;background:#fff6f6;border-color:#e0b4b4;border-radius:'';-webkit-box-shadow:none;box-shadow:none}.ui.form .field.error input:not([type]):focus,.ui.form .field.error input[type=date]:focus,.ui.form .field.error input[type=datetime-local]:focus,.ui.form .field.error input[type=email]:focus,.ui.form .field.error input[type=file]:focus,.ui.form .field.error input[type=number]:focus,.ui.form .field.error input[type=password]:focus,.ui.form .field.error input[type=search]:focus,.ui.form .field.error input[type=tel]:focus,.ui.form .field.error input[type=text]:focus,.ui.form .field.error input[type=time]:focus,.ui.form .field.error input[type=url]:focus,.ui.form .field.error select:focus,.ui.form .field.error textarea:focus{background:#fff6f6;border-color:#e0b4b4;color:#9f3a38;-webkit-box-shadow:none;box-shadow:none}.ui.form .field.error select{-webkit-appearance:menulist-button}.ui.form .field.error .transparent.input input,.ui.form .field.error .transparent.input textarea,.ui.form .field.error input.transparent,.ui.form .field.error textarea.transparent{background-color:#fff6f6;color:#9f3a38}.ui.form .error.error input:-webkit-autofill{-webkit-box-shadow:0 0 0 100px #fffaf0 inset!important;box-shadow:0 0 0 100px #fffaf0 inset!important;border-color:#e0b4b4}.ui.form .error ::-webkit-input-placeholder{color:#e7bdbc}.ui.form .error :-ms-input-placeholder{color:#e7bdbc}.ui.form .error ::-moz-placeholder{color:#e7bdbc}.ui.form .error :focus::-webkit-input-placeholder{color:#da9796}.ui.form .error :focus:-ms-input-placeholder{color:#da9796}.ui.form .error :focus::-moz-placeholder{color:#da9796}.ui.form .field.error .ui.dropdown,.ui.form .field.error .ui.dropdown .item,.ui.form .field.error .ui.dropdown .text,.ui.form .fields.error .field .ui.dropdown,.ui.form .fields.error .field .ui.dropdown .item{background:#fff6f6;color:#9f3a38}.ui.form .field.error .ui.dropdown,.ui.form .fields.error .field .ui.dropdown{border-color:#e0b4b4!important}.ui.form .field.error .ui.dropdown:hover,.ui.form .fields.error .field .ui.dropdown:hover{border-color:#e0b4b4!important}.ui.form .field.error .ui.dropdown:hover .menu,.ui.form .fields.error .field .ui.dropdown:hover .menu{border-color:#e0b4b4}.ui.form .field.error .ui.multiple.selection.dropdown>.label,.ui.form .fields.error .field .ui.multiple.selection.dropdown>.label{background-color:#eacbcb;color:#9f3a38}.ui.form .field.error .ui.dropdown .menu .item:hover,.ui.form .fields.error .field .ui.dropdown .menu .item:hover{background-color:#fbe7e7}.ui.form .field.error .ui.dropdown .menu .selected.item,.ui.form .fields.error .field .ui.dropdown .menu .selected.item{background-color:#fbe7e7}.ui.form .field.error .ui.dropdown .menu .active.item,.ui.form .fields.error .field .ui.dropdown .menu .active.item{background-color:#fdcfcf}.ui.form .field.error .checkbox:not(.toggle):not(.slider) .box,.ui.form .field.error .checkbox:not(.toggle):not(.slider) label,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) .box,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) label{color:#9f3a38}.ui.form .field.error .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .field.error .checkbox:not(.toggle):not(.slider) label:before,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) label:before{background:#fff6f6;border-color:#e0b4b4}.ui.form .field.error .checkbox .box:after,.ui.form .field.error .checkbox label:after,.ui.form .fields.error .field .checkbox .box:after,.ui.form .fields.error .field .checkbox label:after{color:#9f3a38}.ui.form.info .info.message:not(:empty){display:block}.ui.form.info .compact.info.message:not(:empty){display:inline-block}.ui.form.info .icon.info.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.form .field.info .info.message:not(:empty),.ui.form .fields.info .info.message:not(:empty){display:block}.ui.form .field.info .compact.info.message:not(:empty),.ui.form .fields.info .compact.info.message:not(:empty){display:inline-block}.ui.form .field.info .icon.info.message:not(:empty),.ui.form .fields.info .icon.info.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.ui.form .field.info .input,.ui.ui.form .field.info label,.ui.ui.form .fields.info .field .input,.ui.ui.form .fields.info .field label{color:#276f86}.ui.form .field.info .corner.label,.ui.form .fields.info .field .corner.label{border-color:#276f86;color:#fff}.ui.form .field.info input:not([type]),.ui.form .field.info input[type=date],.ui.form .field.info input[type=datetime-local],.ui.form .field.info input[type=email],.ui.form .field.info input[type=file],.ui.form .field.info input[type=number],.ui.form .field.info input[type=password],.ui.form .field.info input[type=search],.ui.form .field.info input[type=tel],.ui.form .field.info input[type=text],.ui.form .field.info input[type=time],.ui.form .field.info input[type=url],.ui.form .field.info select,.ui.form .field.info textarea,.ui.form .fields.info .field input:not([type]),.ui.form .fields.info .field input[type=date],.ui.form .fields.info .field input[type=datetime-local],.ui.form .fields.info .field input[type=email],.ui.form .fields.info .field input[type=file],.ui.form .fields.info .field input[type=number],.ui.form .fields.info .field input[type=password],.ui.form .fields.info .field input[type=search],.ui.form .fields.info .field input[type=tel],.ui.form .fields.info .field input[type=text],.ui.form .fields.info .field input[type=time],.ui.form .fields.info .field input[type=url],.ui.form .fields.info .field select,.ui.form .fields.info .field textarea{color:#276f86;background:#f8ffff;border-color:#a9d5de;border-radius:'';-webkit-box-shadow:none;box-shadow:none}.ui.form .field.info input:not([type]):focus,.ui.form .field.info input[type=date]:focus,.ui.form .field.info input[type=datetime-local]:focus,.ui.form .field.info input[type=email]:focus,.ui.form .field.info input[type=file]:focus,.ui.form .field.info input[type=number]:focus,.ui.form .field.info input[type=password]:focus,.ui.form .field.info input[type=search]:focus,.ui.form .field.info input[type=tel]:focus,.ui.form .field.info input[type=text]:focus,.ui.form .field.info input[type=time]:focus,.ui.form .field.info input[type=url]:focus,.ui.form .field.info select:focus,.ui.form .field.info textarea:focus{background:#f8ffff;border-color:#a9d5de;color:#276f86;-webkit-box-shadow:none;box-shadow:none}.ui.form .field.info select{-webkit-appearance:menulist-button}.ui.form .field.info .transparent.input input,.ui.form .field.info .transparent.input textarea,.ui.form .field.info input.transparent,.ui.form .field.info textarea.transparent{background-color:#f8ffff;color:#276f86}.ui.form .info.info input:-webkit-autofill{-webkit-box-shadow:0 0 0 100px #f0faff inset!important;box-shadow:0 0 0 100px #f0faff inset!important;border-color:#b3e0e0}.ui.form .info ::-webkit-input-placeholder{color:#98cfe1}.ui.form .info :-ms-input-placeholder{color:#98cfe1}.ui.form .info ::-moz-placeholder{color:#98cfe1}.ui.form .info :focus::-webkit-input-placeholder{color:#70bdd6}.ui.form .info :focus:-ms-input-placeholder{color:#70bdd6}.ui.form .info :focus::-moz-placeholder{color:#70bdd6}.ui.form .field.info .ui.dropdown,.ui.form .field.info .ui.dropdown .item,.ui.form .field.info .ui.dropdown .text,.ui.form .fields.info .field .ui.dropdown,.ui.form .fields.info .field .ui.dropdown .item{background:#f8ffff;color:#276f86}.ui.form .field.info .ui.dropdown,.ui.form .fields.info .field .ui.dropdown{border-color:#a9d5de!important}.ui.form .field.info .ui.dropdown:hover,.ui.form .fields.info .field .ui.dropdown:hover{border-color:#a9d5de!important}.ui.form .field.info .ui.dropdown:hover .menu,.ui.form .fields.info .field .ui.dropdown:hover .menu{border-color:#a9d5de}.ui.form .field.info .ui.multiple.selection.dropdown>.label,.ui.form .fields.info .field .ui.multiple.selection.dropdown>.label{background-color:#cce3ea;color:#276f86}.ui.form .field.info .ui.dropdown .menu .item:hover,.ui.form .fields.info .field .ui.dropdown .menu .item:hover{background-color:#e9f2fb}.ui.form .field.info .ui.dropdown .menu .selected.item,.ui.form .fields.info .field .ui.dropdown .menu .selected.item{background-color:#e9f2fb}.ui.form .field.info .ui.dropdown .menu .active.item,.ui.form .fields.info .field .ui.dropdown .menu .active.item{background-color:#cef1fd}.ui.form .field.info .checkbox:not(.toggle):not(.slider) .box,.ui.form .field.info .checkbox:not(.toggle):not(.slider) label,.ui.form .fields.info .field .checkbox:not(.toggle):not(.slider) .box,.ui.form .fields.info .field .checkbox:not(.toggle):not(.slider) label{color:#276f86}.ui.form .field.info .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .field.info .checkbox:not(.toggle):not(.slider) label:before,.ui.form .fields.info .field .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .fields.info .field .checkbox:not(.toggle):not(.slider) label:before{background:#f8ffff;border-color:#a9d5de}.ui.form .field.info .checkbox .box:after,.ui.form .field.info .checkbox label:after,.ui.form .fields.info .field .checkbox .box:after,.ui.form .fields.info .field .checkbox label:after{color:#276f86}.ui.form.success .success.message:not(:empty){display:block}.ui.form.success .compact.success.message:not(:empty){display:inline-block}.ui.form.success .icon.success.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.form .field.success .success.message:not(:empty),.ui.form .fields.success .success.message:not(:empty){display:block}.ui.form .field.success .compact.success.message:not(:empty),.ui.form .fields.success .compact.success.message:not(:empty){display:inline-block}.ui.form .field.success .icon.success.message:not(:empty),.ui.form .fields.success .icon.success.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.ui.form .field.success .input,.ui.ui.form .field.success label,.ui.ui.form .fields.success .field .input,.ui.ui.form .fields.success .field label{color:#2c662d}.ui.form .field.success .corner.label,.ui.form .fields.success .field .corner.label{border-color:#2c662d;color:#fff}.ui.form .field.success input:not([type]),.ui.form .field.success input[type=date],.ui.form .field.success input[type=datetime-local],.ui.form .field.success input[type=email],.ui.form .field.success input[type=file],.ui.form .field.success input[type=number],.ui.form .field.success input[type=password],.ui.form .field.success input[type=search],.ui.form .field.success input[type=tel],.ui.form .field.success input[type=text],.ui.form .field.success input[type=time],.ui.form .field.success input[type=url],.ui.form .field.success select,.ui.form .field.success textarea,.ui.form .fields.success .field input:not([type]),.ui.form .fields.success .field input[type=date],.ui.form .fields.success .field input[type=datetime-local],.ui.form .fields.success .field input[type=email],.ui.form .fields.success .field input[type=file],.ui.form .fields.success .field input[type=number],.ui.form .fields.success .field input[type=password],.ui.form .fields.success .field input[type=search],.ui.form .fields.success .field input[type=tel],.ui.form .fields.success .field input[type=text],.ui.form .fields.success .field input[type=time],.ui.form .fields.success .field input[type=url],.ui.form .fields.success .field select,.ui.form .fields.success .field textarea{color:#2c662d;background:#fcfff5;border-color:#a3c293;border-radius:'';-webkit-box-shadow:none;box-shadow:none}.ui.form .field.success input:not([type]):focus,.ui.form .field.success input[type=date]:focus,.ui.form .field.success input[type=datetime-local]:focus,.ui.form .field.success input[type=email]:focus,.ui.form .field.success input[type=file]:focus,.ui.form .field.success input[type=number]:focus,.ui.form .field.success input[type=password]:focus,.ui.form .field.success input[type=search]:focus,.ui.form .field.success input[type=tel]:focus,.ui.form .field.success input[type=text]:focus,.ui.form .field.success input[type=time]:focus,.ui.form .field.success input[type=url]:focus,.ui.form .field.success select:focus,.ui.form .field.success textarea:focus{background:#fcfff5;border-color:#a3c293;color:#2c662d;-webkit-box-shadow:none;box-shadow:none}.ui.form .field.success select{-webkit-appearance:menulist-button}.ui.form .field.success .transparent.input input,.ui.form .field.success .transparent.input textarea,.ui.form .field.success input.transparent,.ui.form .field.success textarea.transparent{background-color:#fcfff5;color:#2c662d}.ui.form .success.success input:-webkit-autofill{-webkit-box-shadow:0 0 0 100px #f0fff0 inset!important;box-shadow:0 0 0 100px #f0fff0 inset!important;border-color:#bee0b3}.ui.form .success ::-webkit-input-placeholder{color:#8fcf90}.ui.form .success :-ms-input-placeholder{color:#8fcf90}.ui.form .success ::-moz-placeholder{color:#8fcf90}.ui.form .success :focus::-webkit-input-placeholder{color:#6cbf6d}.ui.form .success :focus:-ms-input-placeholder{color:#6cbf6d}.ui.form .success :focus::-moz-placeholder{color:#6cbf6d}.ui.form .field.success .ui.dropdown,.ui.form .field.success .ui.dropdown .item,.ui.form .field.success .ui.dropdown .text,.ui.form .fields.success .field .ui.dropdown,.ui.form .fields.success .field .ui.dropdown .item{background:#fcfff5;color:#2c662d}.ui.form .field.success .ui.dropdown,.ui.form .fields.success .field .ui.dropdown{border-color:#a3c293!important}.ui.form .field.success .ui.dropdown:hover,.ui.form .fields.success .field .ui.dropdown:hover{border-color:#a3c293!important}.ui.form .field.success .ui.dropdown:hover .menu,.ui.form .fields.success .field .ui.dropdown:hover .menu{border-color:#a3c293}.ui.form .field.success .ui.multiple.selection.dropdown>.label,.ui.form .fields.success .field .ui.multiple.selection.dropdown>.label{background-color:#cceacc;color:#2c662d}.ui.form .field.success .ui.dropdown .menu .item:hover,.ui.form .fields.success .field .ui.dropdown .menu .item:hover{background-color:#e9fbe9}.ui.form .field.success .ui.dropdown .menu .selected.item,.ui.form .fields.success .field .ui.dropdown .menu .selected.item{background-color:#e9fbe9}.ui.form .field.success .ui.dropdown .menu .active.item,.ui.form .fields.success .field .ui.dropdown .menu .active.item{background-color:#dafdce}.ui.form .field.success .checkbox:not(.toggle):not(.slider) .box,.ui.form .field.success .checkbox:not(.toggle):not(.slider) label,.ui.form .fields.success .field .checkbox:not(.toggle):not(.slider) .box,.ui.form .fields.success .field .checkbox:not(.toggle):not(.slider) label{color:#2c662d}.ui.form .field.success .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .field.success .checkbox:not(.toggle):not(.slider) label:before,.ui.form .fields.success .field .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .fields.success .field .checkbox:not(.toggle):not(.slider) label:before{background:#fcfff5;border-color:#a3c293}.ui.form .field.success .checkbox .box:after,.ui.form .field.success .checkbox label:after,.ui.form .fields.success .field .checkbox .box:after,.ui.form .fields.success .field .checkbox label:after{color:#2c662d}.ui.form.warning .warning.message:not(:empty){display:block}.ui.form.warning .compact.warning.message:not(:empty){display:inline-block}.ui.form.warning .icon.warning.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.form .field.warning .warning.message:not(:empty),.ui.form .fields.warning .warning.message:not(:empty){display:block}.ui.form .field.warning .compact.warning.message:not(:empty),.ui.form .fields.warning .compact.warning.message:not(:empty){display:inline-block}.ui.form .field.warning .icon.warning.message:not(:empty),.ui.form .fields.warning .icon.warning.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.ui.form .field.warning .input,.ui.ui.form .field.warning label,.ui.ui.form .fields.warning .field .input,.ui.ui.form .fields.warning .field label{color:#573a08}.ui.form .field.warning .corner.label,.ui.form .fields.warning .field .corner.label{border-color:#573a08;color:#fff}.ui.form .field.warning input:not([type]),.ui.form .field.warning input[type=date],.ui.form .field.warning input[type=datetime-local],.ui.form .field.warning input[type=email],.ui.form .field.warning input[type=file],.ui.form .field.warning input[type=number],.ui.form .field.warning input[type=password],.ui.form .field.warning input[type=search],.ui.form .field.warning input[type=tel],.ui.form .field.warning input[type=text],.ui.form .field.warning input[type=time],.ui.form .field.warning input[type=url],.ui.form .field.warning select,.ui.form .field.warning textarea,.ui.form .fields.warning .field input:not([type]),.ui.form .fields.warning .field input[type=date],.ui.form .fields.warning .field input[type=datetime-local],.ui.form .fields.warning .field input[type=email],.ui.form .fields.warning .field input[type=file],.ui.form .fields.warning .field input[type=number],.ui.form .fields.warning .field input[type=password],.ui.form .fields.warning .field input[type=search],.ui.form .fields.warning .field input[type=tel],.ui.form .fields.warning .field input[type=text],.ui.form .fields.warning .field input[type=time],.ui.form .fields.warning .field input[type=url],.ui.form .fields.warning .field select,.ui.form .fields.warning .field textarea{color:#573a08;background:#fffaf3;border-color:#c9ba9b;border-radius:'';-webkit-box-shadow:none;box-shadow:none}.ui.form .field.warning input:not([type]):focus,.ui.form .field.warning input[type=date]:focus,.ui.form .field.warning input[type=datetime-local]:focus,.ui.form .field.warning input[type=email]:focus,.ui.form .field.warning input[type=file]:focus,.ui.form .field.warning input[type=number]:focus,.ui.form .field.warning input[type=password]:focus,.ui.form .field.warning input[type=search]:focus,.ui.form .field.warning input[type=tel]:focus,.ui.form .field.warning input[type=text]:focus,.ui.form .field.warning input[type=time]:focus,.ui.form .field.warning input[type=url]:focus,.ui.form .field.warning select:focus,.ui.form .field.warning textarea:focus{background:#fffaf3;border-color:#c9ba9b;color:#573a08;-webkit-box-shadow:none;box-shadow:none}.ui.form .field.warning select{-webkit-appearance:menulist-button}.ui.form .field.warning .transparent.input input,.ui.form .field.warning .transparent.input textarea,.ui.form .field.warning input.transparent,.ui.form .field.warning textarea.transparent{background-color:#fffaf3;color:#573a08}.ui.form .warning.warning input:-webkit-autofill{-webkit-box-shadow:0 0 0 100px #ffffe0 inset!important;box-shadow:0 0 0 100px #ffffe0 inset!important;border-color:#e0e0b3}.ui.form .warning ::-webkit-input-placeholder{color:#edad3e}.ui.form .warning :-ms-input-placeholder{color:#edad3e}.ui.form .warning ::-moz-placeholder{color:#edad3e}.ui.form .warning :focus::-webkit-input-placeholder{color:#e39715}.ui.form .warning :focus:-ms-input-placeholder{color:#e39715}.ui.form .warning :focus::-moz-placeholder{color:#e39715}.ui.form .field.warning .ui.dropdown,.ui.form .field.warning .ui.dropdown .item,.ui.form .field.warning .ui.dropdown .text,.ui.form .fields.warning .field .ui.dropdown,.ui.form .fields.warning .field .ui.dropdown .item{background:#fffaf3;color:#573a08}.ui.form .field.warning .ui.dropdown,.ui.form .fields.warning .field .ui.dropdown{border-color:#c9ba9b!important}.ui.form .field.warning .ui.dropdown:hover,.ui.form .fields.warning .field .ui.dropdown:hover{border-color:#c9ba9b!important}.ui.form .field.warning .ui.dropdown:hover .menu,.ui.form .fields.warning .field .ui.dropdown:hover .menu{border-color:#c9ba9b}.ui.form .field.warning .ui.multiple.selection.dropdown>.label,.ui.form .fields.warning .field .ui.multiple.selection.dropdown>.label{background-color:#eaeacc;color:#573a08}.ui.form .field.warning .ui.dropdown .menu .item:hover,.ui.form .fields.warning .field .ui.dropdown .menu .item:hover{background-color:#fbfbe9}.ui.form .field.warning .ui.dropdown .menu .selected.item,.ui.form .fields.warning .field .ui.dropdown .menu .selected.item{background-color:#fbfbe9}.ui.form .field.warning .ui.dropdown .menu .active.item,.ui.form .fields.warning .field .ui.dropdown .menu .active.item{background-color:#fdfdce}.ui.form .field.warning .checkbox:not(.toggle):not(.slider) .box,.ui.form .field.warning .checkbox:not(.toggle):not(.slider) label,.ui.form .fields.warning .field .checkbox:not(.toggle):not(.slider) .box,.ui.form .fields.warning .field .checkbox:not(.toggle):not(.slider) label{color:#573a08}.ui.form .field.warning .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .field.warning .checkbox:not(.toggle):not(.slider) label:before,.ui.form .fields.warning .field .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .fields.warning .field .checkbox:not(.toggle):not(.slider) label:before{background:#fffaf3;border-color:#c9ba9b}.ui.form .field.warning .checkbox .box:after,.ui.form .field.warning .checkbox label:after,.ui.form .fields.warning .field .checkbox .box:after,.ui.form .fields.warning .field .checkbox label:after{color:#573a08}.ui.form .disabled.field,.ui.form .disabled.fields .field,.ui.form .field :disabled{pointer-events:none;opacity:.45}.ui.form .field.disabled>label,.ui.form .fields.disabled>label{opacity:.45}.ui.form .field.disabled :disabled{opacity:1}.ui.loading.form{position:relative;cursor:default;pointer-events:none}.ui.loading.form:before{position:absolute;content:'';top:0;left:0;background:rgba(255,255,255,.8);width:100%;height:100%;z-index:100}.ui.loading.form.segments:before{border-radius:.28571429rem}.ui.loading.form:after{position:absolute;content:'';top:50%;left:50%;margin:-1.5em 0 0 -1.5em;width:3em;height:3em;-webkit-animation:loader .6s infinite linear;animation:loader .6s infinite linear;border:.2em solid #767676;border-radius:500rem;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent;visibility:visible;z-index:101}.ui.form .required.field>.checkbox:after,.ui.form .required.field>label:after,.ui.form .required.fields.grouped>label:after,.ui.form .required.fields:not(.grouped)>.field>.checkbox:after,.ui.form .required.fields:not(.grouped)>.field>label:after,.ui.form label.required:after{margin:-.2em 0 0 .2em;content:'*';color:#db2828}.ui.form .required.field>label:after,.ui.form .required.fields.grouped>label:after,.ui.form .required.fields:not(.grouped)>.field>label:after,.ui.form label.required:after{display:inline-block;vertical-align:top}.ui.form .required.field>.checkbox:after,.ui.form .required.fields:not(.grouped)>.field>.checkbox:after{position:absolute;top:0;left:100%}.ui.form .inverted.segment .ui.checkbox .box,.ui.form .inverted.segment .ui.checkbox label,.ui.form .inverted.segment label,.ui.inverted.form .inline.field>label,.ui.inverted.form .inline.field>p,.ui.inverted.form .inline.fields .field>label,.ui.inverted.form .inline.fields .field>p,.ui.inverted.form .inline.fields>label,.ui.inverted.form .ui.checkbox .box,.ui.inverted.form .ui.checkbox label,.ui.inverted.form label{color:rgba(255,255,255,.9)}.ui.inverted.loading.form{color:#fff}.ui.inverted.loading.form:before{background:rgba(0,0,0,.85)}.ui.inverted.form input:not([type]),.ui.inverted.form input[type=date],.ui.inverted.form input[type=datetime-local],.ui.inverted.form input[type=email],.ui.inverted.form input[type=file],.ui.inverted.form input[type=number],.ui.inverted.form input[type=password],.ui.inverted.form input[type=search],.ui.inverted.form input[type=tel],.ui.inverted.form input[type=text],.ui.inverted.form input[type=time],.ui.inverted.form input[type=url]{background:#fff;border-color:rgba(255,255,255,.1);color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none}.ui.form .grouped.fields{display:block;margin:0 0 1em}.ui.form .grouped.fields:last-child{margin-bottom:0}.ui.form .grouped.fields>label{margin:0 0 .28571429rem 0;color:rgba(0,0,0,.87);font-size:.92857143em;font-weight:700;text-transform:none}.ui.form .grouped.fields .field,.ui.form .grouped.inline.fields .field{display:block;margin:.5em 0;padding:0}.ui.form .fields{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;margin:0 -.5em 1em}.ui.form .fields>.field{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;padding-left:.5em;padding-right:.5em}.ui.form .fields>.field:first-child{border-left:none;-webkit-box-shadow:none;box-shadow:none}.ui.form .two.fields>.field,.ui.form .two.fields>.fields{width:50%}.ui.form .three.fields>.field,.ui.form .three.fields>.fields{width:33.33333333%}.ui.form .four.fields>.field,.ui.form .four.fields>.fields{width:25%}.ui.form .five.fields>.field,.ui.form .five.fields>.fields{width:20%}.ui.form .six.fields>.field,.ui.form .six.fields>.fields{width:16.66666667%}.ui.form .seven.fields>.field,.ui.form .seven.fields>.fields{width:14.28571429%}.ui.form .eight.fields>.field,.ui.form .eight.fields>.fields{width:12.5%}.ui.form .nine.fields>.field,.ui.form .nine.fields>.fields{width:11.11111111%}.ui.form .ten.fields>.field,.ui.form .ten.fields>.fields{width:10%}@media only screen and (max-width:767.98px){.ui.form .fields{-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.form:not(.unstackable) .eight.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .eight.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .nine.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .nine.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .seven.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .seven.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .six.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .six.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .ten.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .ten.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) [class*="equal width"].fields:not(.unstackable)>.field,.ui[class*="equal width"].form:not(.unstackable) .fields>.field{width:100%!important;margin:0 0 1em}}.ui.form .fields .wide.field{width:6.25%;padding-left:.5em;padding-right:.5em}.ui.form .one.wide.field{width:6.25%!important}.ui.form .two.wide.field{width:12.5%!important}.ui.form .three.wide.field{width:18.75%!important}.ui.form .four.wide.field{width:25%!important}.ui.form .five.wide.field{width:31.25%!important}.ui.form .six.wide.field{width:37.5%!important}.ui.form .seven.wide.field{width:43.75%!important}.ui.form .eight.wide.field{width:50%!important}.ui.form .nine.wide.field{width:56.25%!important}.ui.form .ten.wide.field{width:62.5%!important}.ui.form .eleven.wide.field{width:68.75%!important}.ui.form .twelve.wide.field{width:75%!important}.ui.form .thirteen.wide.field{width:81.25%!important}.ui.form .fourteen.wide.field{width:87.5%!important}.ui.form .fifteen.wide.field{width:93.75%!important}.ui.form .sixteen.wide.field{width:100%!important}@media only screen and (max-width:767.98px){.ui.form:not(.unstackable) .fields:not(.unstackable)>.eight.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.eleven.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.fifteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.five.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.four.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.fourteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.nine.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.seven.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.six.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.sixteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.ten.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.thirteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.three.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.twelve.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.two.wide.field,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.fields{width:100%!important}.ui.form .fields{margin-bottom:0}}.ui.form [class*="equal width"].fields>.field,.ui[class*="equal width"].form .fields>.field{width:100%;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.ui.form .inline.fields{margin:0 0 1em;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.form .inline.fields .field{margin:0;padding:0 1em 0 0}.ui.form .inline.field>label,.ui.form .inline.field>p,.ui.form .inline.fields .field>label,.ui.form .inline.fields .field>p,.ui.form .inline.fields>label{display:inline-block;width:auto;margin-top:0;margin-bottom:0;vertical-align:baseline;font-size:.92857143em;font-weight:700;color:rgba(0,0,0,.87);text-transform:none}.ui.form .inline.fields>label{margin:.035714em 1em 0 0}.ui.form .inline.field>input,.ui.form .inline.field>select,.ui.form .inline.fields .field>input,.ui.form .inline.fields .field>select{display:inline-block;width:auto;margin-top:0;margin-bottom:0;vertical-align:middle;font-size:1em}.ui.form .inline.field>:first-child,.ui.form .inline.fields .field>:first-child{margin:0 .85714286em 0 0}.ui.form .inline.field>:only-child,.ui.form .inline.fields .field>:only-child{margin:0}.ui.form .inline.fields .wide.field{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.form .inline.fields .wide.field>input,.ui.form .inline.fields .wide.field>select{width:100%}.ui.form,.ui.form .field .dropdown,.ui.form .field .dropdown .menu>.item{font-size:1rem}.ui.mini.form,.ui.mini.form .field .dropdown,.ui.mini.form .field .dropdown .menu>.item{font-size:.78571429rem}.ui.tiny.form,.ui.tiny.form .field .dropdown,.ui.tiny.form .field .dropdown .menu>.item{font-size:.85714286rem}.ui.small.form,.ui.small.form .field .dropdown,.ui.small.form .field .dropdown .menu>.item{font-size:.92857143rem}.ui.large.form,.ui.large.form .field .dropdown,.ui.large.form .field .dropdown .menu>.item{font-size:1.14285714rem}.ui.big.form,.ui.big.form .field .dropdown,.ui.big.form .field .dropdown .menu>.item{font-size:1.28571429rem}.ui.huge.form,.ui.huge.form .field .dropdown,.ui.huge.form .field .dropdown .menu>.item{font-size:1.42857143rem}.ui.massive.form,.ui.massive.form .field .dropdown,.ui.massive.form .field .dropdown .menu>.item{font-size:1.71428571rem}/*! + * # Fomantic-UI - Grid + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.grid{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;padding:0}.ui.grid{margin-top:-1rem;margin-bottom:-1rem;margin-left:-1rem;margin-right:-1rem}.ui.relaxed.grid{margin-left:-1.5rem;margin-right:-1.5rem}.ui[class*="very relaxed"].grid{margin-left:-2.5rem;margin-right:-2.5rem}.ui.grid+.grid{margin-top:1rem}.ui.grid>.column:not(.row),.ui.grid>.row>.column{position:relative;display:inline-block;width:6.25%;padding-left:1rem;padding-right:1rem;vertical-align:top}.ui.grid>*{padding-left:1rem;padding-right:1rem}.ui.grid>.row{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:inherit;-ms-flex-pack:inherit;justify-content:inherit;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%!important;padding:0;padding-top:1rem;padding-bottom:1rem}.ui.grid>.column:not(.row){padding-top:1rem;padding-bottom:1rem}.ui.grid>.row>.column{margin-top:0;margin-bottom:0}.ui.grid>.row>.column>img,.ui.grid>.row>img{max-width:100%}.ui.grid>.ui.grid:first-child{margin-top:0}.ui.grid>.ui.grid:last-child{margin-bottom:0}.ui.aligned.grid .column>.segment:not(.compact):not(.attached),.ui.grid .aligned.row>.column>.segment:not(.compact):not(.attached){width:100%}.ui.grid .row+.ui.divider{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin:1rem 1rem}.ui.grid .column+.ui.vertical.divider{height:calc(50% - 1rem)}.ui.grid>.column:last-child>.horizontal.segment,.ui.grid>.row>.column:last-child>.horizontal.segment{-webkit-box-shadow:none;box-shadow:none}@media only screen and (max-width:767.98px){.ui.page.grid{width:auto;padding-left:0;padding-right:0;margin-left:0;margin-right:0}}@media only screen and (min-width:768px) and (max-width:991.98px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:2em;padding-right:2em}}@media only screen and (min-width:992px) and (max-width:1199.98px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:3%;padding-right:3%}}@media only screen and (min-width:1200px) and (max-width:1919.98px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:15%;padding-right:15%}}@media only screen and (min-width:1920px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:23%;padding-right:23%}}.ui.grid>.column:only-child,.ui.grid>.row>.column:only-child{width:100%}.ui[class*="one column"].grid>.column:not(.row),.ui[class*="one column"].grid>.row>.column{width:100%}.ui[class*="two column"].grid>.column:not(.row),.ui[class*="two column"].grid>.row>.column{width:50%}.ui[class*="three column"].grid>.column:not(.row),.ui[class*="three column"].grid>.row>.column{width:33.33333333%}.ui[class*="four column"].grid>.column:not(.row),.ui[class*="four column"].grid>.row>.column{width:25%}.ui[class*="five column"].grid>.column:not(.row),.ui[class*="five column"].grid>.row>.column{width:20%}.ui[class*="six column"].grid>.column:not(.row),.ui[class*="six column"].grid>.row>.column{width:16.66666667%}.ui[class*="seven column"].grid>.column:not(.row),.ui[class*="seven column"].grid>.row>.column{width:14.28571429%}.ui[class*="eight column"].grid>.column:not(.row),.ui[class*="eight column"].grid>.row>.column{width:12.5%}.ui[class*="nine column"].grid>.column:not(.row),.ui[class*="nine column"].grid>.row>.column{width:11.11111111%}.ui[class*="ten column"].grid>.column:not(.row),.ui[class*="ten column"].grid>.row>.column{width:10%}.ui[class*="eleven column"].grid>.column:not(.row),.ui[class*="eleven column"].grid>.row>.column{width:9.09090909%}.ui[class*="twelve column"].grid>.column:not(.row),.ui[class*="twelve column"].grid>.row>.column{width:8.33333333%}.ui[class*="thirteen column"].grid>.column:not(.row),.ui[class*="thirteen column"].grid>.row>.column{width:7.69230769%}.ui[class*="fourteen column"].grid>.column:not(.row),.ui[class*="fourteen column"].grid>.row>.column{width:7.14285714%}.ui[class*="fifteen column"].grid>.column:not(.row),.ui[class*="fifteen column"].grid>.row>.column{width:6.66666667%}.ui[class*="sixteen column"].grid>.column:not(.row),.ui[class*="sixteen column"].grid>.row>.column{width:6.25%}.ui.grid>[class*="one column"].row>.column{width:100%!important}.ui.grid>[class*="two column"].row>.column{width:50%!important}.ui.grid>[class*="three column"].row>.column{width:33.33333333%!important}.ui.grid>[class*="four column"].row>.column{width:25%!important}.ui.grid>[class*="five column"].row>.column{width:20%!important}.ui.grid>[class*="six column"].row>.column{width:16.66666667%!important}.ui.grid>[class*="seven column"].row>.column{width:14.28571429%!important}.ui.grid>[class*="eight column"].row>.column{width:12.5%!important}.ui.grid>[class*="nine column"].row>.column{width:11.11111111%!important}.ui.grid>[class*="ten column"].row>.column{width:10%!important}.ui.grid>[class*="eleven column"].row>.column{width:9.09090909%!important}.ui.grid>[class*="twelve column"].row>.column{width:8.33333333%!important}.ui.grid>[class*="thirteen column"].row>.column{width:7.69230769%!important}.ui.grid>[class*="fourteen column"].row>.column{width:7.14285714%!important}.ui.grid>[class*="fifteen column"].row>.column{width:6.66666667%!important}.ui.grid>[class*="sixteen column"].row>.column{width:6.25%!important}.ui.celled.page.grid{-webkit-box-shadow:none;box-shadow:none}.ui.column.grid>[class*="one wide"].column,.ui.grid>.column.row>[class*="one wide"].column,.ui.grid>.row>[class*="one wide"].column,.ui.grid>[class*="one wide"].column{width:6.25%!important}.ui.column.grid>[class*="two wide"].column,.ui.grid>.column.row>[class*="two wide"].column,.ui.grid>.row>[class*="two wide"].column,.ui.grid>[class*="two wide"].column{width:12.5%!important}.ui.column.grid>[class*="three wide"].column,.ui.grid>.column.row>[class*="three wide"].column,.ui.grid>.row>[class*="three wide"].column,.ui.grid>[class*="three wide"].column{width:18.75%!important}.ui.column.grid>[class*="four wide"].column,.ui.grid>.column.row>[class*="four wide"].column,.ui.grid>.row>[class*="four wide"].column,.ui.grid>[class*="four wide"].column{width:25%!important}.ui.column.grid>[class*="five wide"].column,.ui.grid>.column.row>[class*="five wide"].column,.ui.grid>.row>[class*="five wide"].column,.ui.grid>[class*="five wide"].column{width:31.25%!important}.ui.column.grid>[class*="six wide"].column,.ui.grid>.column.row>[class*="six wide"].column,.ui.grid>.row>[class*="six wide"].column,.ui.grid>[class*="six wide"].column{width:37.5%!important}.ui.column.grid>[class*="seven wide"].column,.ui.grid>.column.row>[class*="seven wide"].column,.ui.grid>.row>[class*="seven wide"].column,.ui.grid>[class*="seven wide"].column{width:43.75%!important}.ui.column.grid>[class*="eight wide"].column,.ui.grid>.column.row>[class*="eight wide"].column,.ui.grid>.row>[class*="eight wide"].column,.ui.grid>[class*="eight wide"].column{width:50%!important}.ui.column.grid>[class*="nine wide"].column,.ui.grid>.column.row>[class*="nine wide"].column,.ui.grid>.row>[class*="nine wide"].column,.ui.grid>[class*="nine wide"].column{width:56.25%!important}.ui.column.grid>[class*="ten wide"].column,.ui.grid>.column.row>[class*="ten wide"].column,.ui.grid>.row>[class*="ten wide"].column,.ui.grid>[class*="ten wide"].column{width:62.5%!important}.ui.column.grid>[class*="eleven wide"].column,.ui.grid>.column.row>[class*="eleven wide"].column,.ui.grid>.row>[class*="eleven wide"].column,.ui.grid>[class*="eleven wide"].column{width:68.75%!important}.ui.column.grid>[class*="twelve wide"].column,.ui.grid>.column.row>[class*="twelve wide"].column,.ui.grid>.row>[class*="twelve wide"].column,.ui.grid>[class*="twelve wide"].column{width:75%!important}.ui.column.grid>[class*="thirteen wide"].column,.ui.grid>.column.row>[class*="thirteen wide"].column,.ui.grid>.row>[class*="thirteen wide"].column,.ui.grid>[class*="thirteen wide"].column{width:81.25%!important}.ui.column.grid>[class*="fourteen wide"].column,.ui.grid>.column.row>[class*="fourteen wide"].column,.ui.grid>.row>[class*="fourteen wide"].column,.ui.grid>[class*="fourteen wide"].column{width:87.5%!important}.ui.column.grid>[class*="fifteen wide"].column,.ui.grid>.column.row>[class*="fifteen wide"].column,.ui.grid>.row>[class*="fifteen wide"].column,.ui.grid>[class*="fifteen wide"].column{width:93.75%!important}.ui.column.grid>[class*="sixteen wide"].column,.ui.grid>.column.row>[class*="sixteen wide"].column,.ui.grid>.row>[class*="sixteen wide"].column,.ui.grid>[class*="sixteen wide"].column{width:100%!important}@media only screen and (min-width:320px) and (max-width:767.98px){.ui.column.grid>[class*="one wide mobile"].column,.ui.grid>.column.row>[class*="one wide mobile"].column,.ui.grid>.row>[class*="one wide mobile"].column,.ui.grid>[class*="one wide mobile"].column{width:6.25%!important}.ui.column.grid>[class*="two wide mobile"].column,.ui.grid>.column.row>[class*="two wide mobile"].column,.ui.grid>.row>[class*="two wide mobile"].column,.ui.grid>[class*="two wide mobile"].column{width:12.5%!important}.ui.column.grid>[class*="three wide mobile"].column,.ui.grid>.column.row>[class*="three wide mobile"].column,.ui.grid>.row>[class*="three wide mobile"].column,.ui.grid>[class*="three wide mobile"].column{width:18.75%!important}.ui.column.grid>[class*="four wide mobile"].column,.ui.grid>.column.row>[class*="four wide mobile"].column,.ui.grid>.row>[class*="four wide mobile"].column,.ui.grid>[class*="four wide mobile"].column{width:25%!important}.ui.column.grid>[class*="five wide mobile"].column,.ui.grid>.column.row>[class*="five wide mobile"].column,.ui.grid>.row>[class*="five wide mobile"].column,.ui.grid>[class*="five wide mobile"].column{width:31.25%!important}.ui.column.grid>[class*="six wide mobile"].column,.ui.grid>.column.row>[class*="six wide mobile"].column,.ui.grid>.row>[class*="six wide mobile"].column,.ui.grid>[class*="six wide mobile"].column{width:37.5%!important}.ui.column.grid>[class*="seven wide mobile"].column,.ui.grid>.column.row>[class*="seven wide mobile"].column,.ui.grid>.row>[class*="seven wide mobile"].column,.ui.grid>[class*="seven wide mobile"].column{width:43.75%!important}.ui.column.grid>[class*="eight wide mobile"].column,.ui.grid>.column.row>[class*="eight wide mobile"].column,.ui.grid>.row>[class*="eight wide mobile"].column,.ui.grid>[class*="eight wide mobile"].column{width:50%!important}.ui.column.grid>[class*="nine wide mobile"].column,.ui.grid>.column.row>[class*="nine wide mobile"].column,.ui.grid>.row>[class*="nine wide mobile"].column,.ui.grid>[class*="nine wide mobile"].column{width:56.25%!important}.ui.column.grid>[class*="ten wide mobile"].column,.ui.grid>.column.row>[class*="ten wide mobile"].column,.ui.grid>.row>[class*="ten wide mobile"].column,.ui.grid>[class*="ten wide mobile"].column{width:62.5%!important}.ui.column.grid>[class*="eleven wide mobile"].column,.ui.grid>.column.row>[class*="eleven wide mobile"].column,.ui.grid>.row>[class*="eleven wide mobile"].column,.ui.grid>[class*="eleven wide mobile"].column{width:68.75%!important}.ui.column.grid>[class*="twelve wide mobile"].column,.ui.grid>.column.row>[class*="twelve wide mobile"].column,.ui.grid>.row>[class*="twelve wide mobile"].column,.ui.grid>[class*="twelve wide mobile"].column{width:75%!important}.ui.column.grid>[class*="thirteen wide mobile"].column,.ui.grid>.column.row>[class*="thirteen wide mobile"].column,.ui.grid>.row>[class*="thirteen wide mobile"].column,.ui.grid>[class*="thirteen wide mobile"].column{width:81.25%!important}.ui.column.grid>[class*="fourteen wide mobile"].column,.ui.grid>.column.row>[class*="fourteen wide mobile"].column,.ui.grid>.row>[class*="fourteen wide mobile"].column,.ui.grid>[class*="fourteen wide mobile"].column{width:87.5%!important}.ui.column.grid>[class*="fifteen wide mobile"].column,.ui.grid>.column.row>[class*="fifteen wide mobile"].column,.ui.grid>.row>[class*="fifteen wide mobile"].column,.ui.grid>[class*="fifteen wide mobile"].column{width:93.75%!important}.ui.column.grid>[class*="sixteen wide mobile"].column,.ui.grid>.column.row>[class*="sixteen wide mobile"].column,.ui.grid>.row>[class*="sixteen wide mobile"].column,.ui.grid>[class*="sixteen wide mobile"].column{width:100%!important}}@media only screen and (min-width:768px) and (max-width:991.98px){.ui.column.grid>[class*="one wide tablet"].column,.ui.grid>.column.row>[class*="one wide tablet"].column,.ui.grid>.row>[class*="one wide tablet"].column,.ui.grid>[class*="one wide tablet"].column{width:6.25%!important}.ui.column.grid>[class*="two wide tablet"].column,.ui.grid>.column.row>[class*="two wide tablet"].column,.ui.grid>.row>[class*="two wide tablet"].column,.ui.grid>[class*="two wide tablet"].column{width:12.5%!important}.ui.column.grid>[class*="three wide tablet"].column,.ui.grid>.column.row>[class*="three wide tablet"].column,.ui.grid>.row>[class*="three wide tablet"].column,.ui.grid>[class*="three wide tablet"].column{width:18.75%!important}.ui.column.grid>[class*="four wide tablet"].column,.ui.grid>.column.row>[class*="four wide tablet"].column,.ui.grid>.row>[class*="four wide tablet"].column,.ui.grid>[class*="four wide tablet"].column{width:25%!important}.ui.column.grid>[class*="five wide tablet"].column,.ui.grid>.column.row>[class*="five wide tablet"].column,.ui.grid>.row>[class*="five wide tablet"].column,.ui.grid>[class*="five wide tablet"].column{width:31.25%!important}.ui.column.grid>[class*="six wide tablet"].column,.ui.grid>.column.row>[class*="six wide tablet"].column,.ui.grid>.row>[class*="six wide tablet"].column,.ui.grid>[class*="six wide tablet"].column{width:37.5%!important}.ui.column.grid>[class*="seven wide tablet"].column,.ui.grid>.column.row>[class*="seven wide tablet"].column,.ui.grid>.row>[class*="seven wide tablet"].column,.ui.grid>[class*="seven wide tablet"].column{width:43.75%!important}.ui.column.grid>[class*="eight wide tablet"].column,.ui.grid>.column.row>[class*="eight wide tablet"].column,.ui.grid>.row>[class*="eight wide tablet"].column,.ui.grid>[class*="eight wide tablet"].column{width:50%!important}.ui.column.grid>[class*="nine wide tablet"].column,.ui.grid>.column.row>[class*="nine wide tablet"].column,.ui.grid>.row>[class*="nine wide tablet"].column,.ui.grid>[class*="nine wide tablet"].column{width:56.25%!important}.ui.column.grid>[class*="ten wide tablet"].column,.ui.grid>.column.row>[class*="ten wide tablet"].column,.ui.grid>.row>[class*="ten wide tablet"].column,.ui.grid>[class*="ten wide tablet"].column{width:62.5%!important}.ui.column.grid>[class*="eleven wide tablet"].column,.ui.grid>.column.row>[class*="eleven wide tablet"].column,.ui.grid>.row>[class*="eleven wide tablet"].column,.ui.grid>[class*="eleven wide tablet"].column{width:68.75%!important}.ui.column.grid>[class*="twelve wide tablet"].column,.ui.grid>.column.row>[class*="twelve wide tablet"].column,.ui.grid>.row>[class*="twelve wide tablet"].column,.ui.grid>[class*="twelve wide tablet"].column{width:75%!important}.ui.column.grid>[class*="thirteen wide tablet"].column,.ui.grid>.column.row>[class*="thirteen wide tablet"].column,.ui.grid>.row>[class*="thirteen wide tablet"].column,.ui.grid>[class*="thirteen wide tablet"].column{width:81.25%!important}.ui.column.grid>[class*="fourteen wide tablet"].column,.ui.grid>.column.row>[class*="fourteen wide tablet"].column,.ui.grid>.row>[class*="fourteen wide tablet"].column,.ui.grid>[class*="fourteen wide tablet"].column{width:87.5%!important}.ui.column.grid>[class*="fifteen wide tablet"].column,.ui.grid>.column.row>[class*="fifteen wide tablet"].column,.ui.grid>.row>[class*="fifteen wide tablet"].column,.ui.grid>[class*="fifteen wide tablet"].column{width:93.75%!important}.ui.column.grid>[class*="sixteen wide tablet"].column,.ui.grid>.column.row>[class*="sixteen wide tablet"].column,.ui.grid>.row>[class*="sixteen wide tablet"].column,.ui.grid>[class*="sixteen wide tablet"].column{width:100%!important}}@media only screen and (min-width:992px){.ui.column.grid>[class*="one wide computer"].column,.ui.grid>.column.row>[class*="one wide computer"].column,.ui.grid>.row>[class*="one wide computer"].column,.ui.grid>[class*="one wide computer"].column{width:6.25%!important}.ui.column.grid>[class*="two wide computer"].column,.ui.grid>.column.row>[class*="two wide computer"].column,.ui.grid>.row>[class*="two wide computer"].column,.ui.grid>[class*="two wide computer"].column{width:12.5%!important}.ui.column.grid>[class*="three wide computer"].column,.ui.grid>.column.row>[class*="three wide computer"].column,.ui.grid>.row>[class*="three wide computer"].column,.ui.grid>[class*="three wide computer"].column{width:18.75%!important}.ui.column.grid>[class*="four wide computer"].column,.ui.grid>.column.row>[class*="four wide computer"].column,.ui.grid>.row>[class*="four wide computer"].column,.ui.grid>[class*="four wide computer"].column{width:25%!important}.ui.column.grid>[class*="five wide computer"].column,.ui.grid>.column.row>[class*="five wide computer"].column,.ui.grid>.row>[class*="five wide computer"].column,.ui.grid>[class*="five wide computer"].column{width:31.25%!important}.ui.column.grid>[class*="six wide computer"].column,.ui.grid>.column.row>[class*="six wide computer"].column,.ui.grid>.row>[class*="six wide computer"].column,.ui.grid>[class*="six wide computer"].column{width:37.5%!important}.ui.column.grid>[class*="seven wide computer"].column,.ui.grid>.column.row>[class*="seven wide computer"].column,.ui.grid>.row>[class*="seven wide computer"].column,.ui.grid>[class*="seven wide computer"].column{width:43.75%!important}.ui.column.grid>[class*="eight wide computer"].column,.ui.grid>.column.row>[class*="eight wide computer"].column,.ui.grid>.row>[class*="eight wide computer"].column,.ui.grid>[class*="eight wide computer"].column{width:50%!important}.ui.column.grid>[class*="nine wide computer"].column,.ui.grid>.column.row>[class*="nine wide computer"].column,.ui.grid>.row>[class*="nine wide computer"].column,.ui.grid>[class*="nine wide computer"].column{width:56.25%!important}.ui.column.grid>[class*="ten wide computer"].column,.ui.grid>.column.row>[class*="ten wide computer"].column,.ui.grid>.row>[class*="ten wide computer"].column,.ui.grid>[class*="ten wide computer"].column{width:62.5%!important}.ui.column.grid>[class*="eleven wide computer"].column,.ui.grid>.column.row>[class*="eleven wide computer"].column,.ui.grid>.row>[class*="eleven wide computer"].column,.ui.grid>[class*="eleven wide computer"].column{width:68.75%!important}.ui.column.grid>[class*="twelve wide computer"].column,.ui.grid>.column.row>[class*="twelve wide computer"].column,.ui.grid>.row>[class*="twelve wide computer"].column,.ui.grid>[class*="twelve wide computer"].column{width:75%!important}.ui.column.grid>[class*="thirteen wide computer"].column,.ui.grid>.column.row>[class*="thirteen wide computer"].column,.ui.grid>.row>[class*="thirteen wide computer"].column,.ui.grid>[class*="thirteen wide computer"].column{width:81.25%!important}.ui.column.grid>[class*="fourteen wide computer"].column,.ui.grid>.column.row>[class*="fourteen wide computer"].column,.ui.grid>.row>[class*="fourteen wide computer"].column,.ui.grid>[class*="fourteen wide computer"].column{width:87.5%!important}.ui.column.grid>[class*="fifteen wide computer"].column,.ui.grid>.column.row>[class*="fifteen wide computer"].column,.ui.grid>.row>[class*="fifteen wide computer"].column,.ui.grid>[class*="fifteen wide computer"].column{width:93.75%!important}.ui.column.grid>[class*="sixteen wide computer"].column,.ui.grid>.column.row>[class*="sixteen wide computer"].column,.ui.grid>.row>[class*="sixteen wide computer"].column,.ui.grid>[class*="sixteen wide computer"].column{width:100%!important}}@media only screen and (min-width:1200px) and (max-width:1919.98px){.ui.column.grid>[class*="one wide large screen"].column,.ui.grid>.column.row>[class*="one wide large screen"].column,.ui.grid>.row>[class*="one wide large screen"].column,.ui.grid>[class*="one wide large screen"].column{width:6.25%!important}.ui.column.grid>[class*="two wide large screen"].column,.ui.grid>.column.row>[class*="two wide large screen"].column,.ui.grid>.row>[class*="two wide large screen"].column,.ui.grid>[class*="two wide large screen"].column{width:12.5%!important}.ui.column.grid>[class*="three wide large screen"].column,.ui.grid>.column.row>[class*="three wide large screen"].column,.ui.grid>.row>[class*="three wide large screen"].column,.ui.grid>[class*="three wide large screen"].column{width:18.75%!important}.ui.column.grid>[class*="four wide large screen"].column,.ui.grid>.column.row>[class*="four wide large screen"].column,.ui.grid>.row>[class*="four wide large screen"].column,.ui.grid>[class*="four wide large screen"].column{width:25%!important}.ui.column.grid>[class*="five wide large screen"].column,.ui.grid>.column.row>[class*="five wide large screen"].column,.ui.grid>.row>[class*="five wide large screen"].column,.ui.grid>[class*="five wide large screen"].column{width:31.25%!important}.ui.column.grid>[class*="six wide large screen"].column,.ui.grid>.column.row>[class*="six wide large screen"].column,.ui.grid>.row>[class*="six wide large screen"].column,.ui.grid>[class*="six wide large screen"].column{width:37.5%!important}.ui.column.grid>[class*="seven wide large screen"].column,.ui.grid>.column.row>[class*="seven wide large screen"].column,.ui.grid>.row>[class*="seven wide large screen"].column,.ui.grid>[class*="seven wide large screen"].column{width:43.75%!important}.ui.column.grid>[class*="eight wide large screen"].column,.ui.grid>.column.row>[class*="eight wide large screen"].column,.ui.grid>.row>[class*="eight wide large screen"].column,.ui.grid>[class*="eight wide large screen"].column{width:50%!important}.ui.column.grid>[class*="nine wide large screen"].column,.ui.grid>.column.row>[class*="nine wide large screen"].column,.ui.grid>.row>[class*="nine wide large screen"].column,.ui.grid>[class*="nine wide large screen"].column{width:56.25%!important}.ui.column.grid>[class*="ten wide large screen"].column,.ui.grid>.column.row>[class*="ten wide large screen"].column,.ui.grid>.row>[class*="ten wide large screen"].column,.ui.grid>[class*="ten wide large screen"].column{width:62.5%!important}.ui.column.grid>[class*="eleven wide large screen"].column,.ui.grid>.column.row>[class*="eleven wide large screen"].column,.ui.grid>.row>[class*="eleven wide large screen"].column,.ui.grid>[class*="eleven wide large screen"].column{width:68.75%!important}.ui.column.grid>[class*="twelve wide large screen"].column,.ui.grid>.column.row>[class*="twelve wide large screen"].column,.ui.grid>.row>[class*="twelve wide large screen"].column,.ui.grid>[class*="twelve wide large screen"].column{width:75%!important}.ui.column.grid>[class*="thirteen wide large screen"].column,.ui.grid>.column.row>[class*="thirteen wide large screen"].column,.ui.grid>.row>[class*="thirteen wide large screen"].column,.ui.grid>[class*="thirteen wide large screen"].column{width:81.25%!important}.ui.column.grid>[class*="fourteen wide large screen"].column,.ui.grid>.column.row>[class*="fourteen wide large screen"].column,.ui.grid>.row>[class*="fourteen wide large screen"].column,.ui.grid>[class*="fourteen wide large screen"].column{width:87.5%!important}.ui.column.grid>[class*="fifteen wide large screen"].column,.ui.grid>.column.row>[class*="fifteen wide large screen"].column,.ui.grid>.row>[class*="fifteen wide large screen"].column,.ui.grid>[class*="fifteen wide large screen"].column{width:93.75%!important}.ui.column.grid>[class*="sixteen wide large screen"].column,.ui.grid>.column.row>[class*="sixteen wide large screen"].column,.ui.grid>.row>[class*="sixteen wide large screen"].column,.ui.grid>[class*="sixteen wide large screen"].column{width:100%!important}}@media only screen and (min-width:1920px){.ui.column.grid>[class*="one wide widescreen"].column,.ui.grid>.column.row>[class*="one wide widescreen"].column,.ui.grid>.row>[class*="one wide widescreen"].column,.ui.grid>[class*="one wide widescreen"].column{width:6.25%!important}.ui.column.grid>[class*="two wide widescreen"].column,.ui.grid>.column.row>[class*="two wide widescreen"].column,.ui.grid>.row>[class*="two wide widescreen"].column,.ui.grid>[class*="two wide widescreen"].column{width:12.5%!important}.ui.column.grid>[class*="three wide widescreen"].column,.ui.grid>.column.row>[class*="three wide widescreen"].column,.ui.grid>.row>[class*="three wide widescreen"].column,.ui.grid>[class*="three wide widescreen"].column{width:18.75%!important}.ui.column.grid>[class*="four wide widescreen"].column,.ui.grid>.column.row>[class*="four wide widescreen"].column,.ui.grid>.row>[class*="four wide widescreen"].column,.ui.grid>[class*="four wide widescreen"].column{width:25%!important}.ui.column.grid>[class*="five wide widescreen"].column,.ui.grid>.column.row>[class*="five wide widescreen"].column,.ui.grid>.row>[class*="five wide widescreen"].column,.ui.grid>[class*="five wide widescreen"].column{width:31.25%!important}.ui.column.grid>[class*="six wide widescreen"].column,.ui.grid>.column.row>[class*="six wide widescreen"].column,.ui.grid>.row>[class*="six wide widescreen"].column,.ui.grid>[class*="six wide widescreen"].column{width:37.5%!important}.ui.column.grid>[class*="seven wide widescreen"].column,.ui.grid>.column.row>[class*="seven wide widescreen"].column,.ui.grid>.row>[class*="seven wide widescreen"].column,.ui.grid>[class*="seven wide widescreen"].column{width:43.75%!important}.ui.column.grid>[class*="eight wide widescreen"].column,.ui.grid>.column.row>[class*="eight wide widescreen"].column,.ui.grid>.row>[class*="eight wide widescreen"].column,.ui.grid>[class*="eight wide widescreen"].column{width:50%!important}.ui.column.grid>[class*="nine wide widescreen"].column,.ui.grid>.column.row>[class*="nine wide widescreen"].column,.ui.grid>.row>[class*="nine wide widescreen"].column,.ui.grid>[class*="nine wide widescreen"].column{width:56.25%!important}.ui.column.grid>[class*="ten wide widescreen"].column,.ui.grid>.column.row>[class*="ten wide widescreen"].column,.ui.grid>.row>[class*="ten wide widescreen"].column,.ui.grid>[class*="ten wide widescreen"].column{width:62.5%!important}.ui.column.grid>[class*="eleven wide widescreen"].column,.ui.grid>.column.row>[class*="eleven wide widescreen"].column,.ui.grid>.row>[class*="eleven wide widescreen"].column,.ui.grid>[class*="eleven wide widescreen"].column{width:68.75%!important}.ui.column.grid>[class*="twelve wide widescreen"].column,.ui.grid>.column.row>[class*="twelve wide widescreen"].column,.ui.grid>.row>[class*="twelve wide widescreen"].column,.ui.grid>[class*="twelve wide widescreen"].column{width:75%!important}.ui.column.grid>[class*="thirteen wide widescreen"].column,.ui.grid>.column.row>[class*="thirteen wide widescreen"].column,.ui.grid>.row>[class*="thirteen wide widescreen"].column,.ui.grid>[class*="thirteen wide widescreen"].column{width:81.25%!important}.ui.column.grid>[class*="fourteen wide widescreen"].column,.ui.grid>.column.row>[class*="fourteen wide widescreen"].column,.ui.grid>.row>[class*="fourteen wide widescreen"].column,.ui.grid>[class*="fourteen wide widescreen"].column{width:87.5%!important}.ui.column.grid>[class*="fifteen wide widescreen"].column,.ui.grid>.column.row>[class*="fifteen wide widescreen"].column,.ui.grid>.row>[class*="fifteen wide widescreen"].column,.ui.grid>[class*="fifteen wide widescreen"].column{width:93.75%!important}.ui.column.grid>[class*="sixteen wide widescreen"].column,.ui.grid>.column.row>[class*="sixteen wide widescreen"].column,.ui.grid>.row>[class*="sixteen wide widescreen"].column,.ui.grid>[class*="sixteen wide widescreen"].column{width:100%!important}}.ui.centered.grid,.ui.centered.grid>.row,.ui.grid>.centered.row{text-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.centered.grid>.column:not(.aligned):not(.justified):not(.row),.ui.centered.grid>.row>.column:not(.aligned):not(.justified),.ui.grid .centered.row>.column:not(.aligned):not(.justified){text-align:left}.ui.grid>.centered.column,.ui.grid>.row>.centered.column{display:block;margin-left:auto;margin-right:auto}.ui.grid>.relaxed.row>.column,.ui.relaxed.grid>.column:not(.row),.ui.relaxed.grid>.row>.column{padding-left:1.5rem;padding-right:1.5rem}.ui.grid>[class*="very relaxed"].row>.column,.ui[class*="very relaxed"].grid>.column:not(.row),.ui[class*="very relaxed"].grid>.row>.column{padding-left:2.5rem;padding-right:2.5rem}.ui.grid .relaxed.row+.ui.divider,.ui.relaxed.grid .row+.ui.divider{margin-left:1.5rem;margin-right:1.5rem}.ui.grid [class*="very relaxed"].row+.ui.divider,.ui[class*="very relaxed"].grid .row+.ui.divider{margin-left:2.5rem;margin-right:2.5rem}.ui.padded.grid:not(.vertically):not(.horizontally){margin:0!important}[class*="horizontally padded"].ui.grid{margin-left:0!important;margin-right:0!important}[class*="vertically padded"].ui.grid{margin-top:0!important;margin-bottom:0!important}.ui.grid [class*="left floated"].column{margin-right:auto}.ui.grid [class*="right floated"].column{margin-left:auto}.ui.divided.grid:not([class*="vertically divided"])>.column:not(.row),.ui.divided.grid:not([class*="vertically divided"])>.row>.column{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*="vertically divided"].grid>.column:not(.row),.ui[class*="vertically divided"].grid>.row>.column{margin-top:1rem;margin-bottom:1rem;padding-top:0;padding-bottom:0}.ui[class*="vertically divided"].grid>.row{margin-top:0;margin-bottom:0}.ui.divided.grid:not([class*="vertically divided"])>.column:first-child,.ui.divided.grid:not([class*="vertically divided"])>.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui[class*="vertically divided"].grid>.row:first-child>.column{margin-top:0}.ui.grid>.divided.row>.column{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui.grid>.divided.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui[class*="vertically divided"].grid>.row{position:relative}.ui[class*="vertically divided"].grid>.row:before{position:absolute;content:"";top:0;left:0;width:calc(100% - 2rem);height:1px;margin:0 1rem;-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.padded.divided.grid:not(.vertically):not(.horizontally),[class*="horizontally padded"].ui.divided.grid{width:100%}.ui[class*="vertically divided"].grid>.row:first-child:before{-webkit-box-shadow:none;box-shadow:none}.ui.inverted.divided.grid:not([class*="vertically divided"])>.column:not(.row),.ui.inverted.divided.grid:not([class*="vertically divided"])>.row>.column{-webkit-box-shadow:-1px 0 0 0 rgba(255,255,255,.1);box-shadow:-1px 0 0 0 rgba(255,255,255,.1)}.ui.inverted.divided.grid:not([class*="vertically divided"])>.column:not(.row):first-child,.ui.inverted.divided.grid:not([class*="vertically divided"])>.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui.inverted[class*="vertically divided"].grid>.row:before{-webkit-box-shadow:0 -1px 0 0 rgba(255,255,255,.1);box-shadow:0 -1px 0 0 rgba(255,255,255,.1)}.ui.relaxed[class*="vertically divided"].grid>.row:before{margin-left:1.5rem;margin-right:1.5rem;width:calc(100% - 3rem)}.ui[class*="very relaxed"][class*="vertically divided"].grid>.row:before{margin-left:2.5rem;margin-right:2.5rem;width:calc(100% - 5rem)}.ui.celled.grid{width:100%;margin:1em 0;-webkit-box-shadow:0 0 0 1px #d4d4d5;box-shadow:0 0 0 1px #d4d4d5}.ui.celled.grid>.row{width:100%!important;margin:0;padding:0;-webkit-box-shadow:0 -1px 0 0 #d4d4d5;box-shadow:0 -1px 0 0 #d4d4d5}.ui.celled.grid>.column:not(.row),.ui.celled.grid>.row>.column{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui.celled.grid>.column:first-child,.ui.celled.grid>.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui.celled.grid>.column:not(.row),.ui.celled.grid>.row>.column{padding:1em}.ui.relaxed.celled.grid>.column:not(.row),.ui.relaxed.celled.grid>.row>.column{padding:1.5em}.ui[class*="very relaxed"].celled.grid>.column:not(.row),.ui[class*="very relaxed"].celled.grid>.row>.column{padding:2em}.ui[class*="internally celled"].grid{-webkit-box-shadow:none;box-shadow:none;margin:0}.ui[class*="internally celled"].grid>.row:first-child{-webkit-box-shadow:none;box-shadow:none}.ui[class*="internally celled"].grid>.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui.grid>.row>[class*="top aligned"].column,.ui.grid>[class*="top aligned"].column:not(.row),.ui.grid>[class*="top aligned"].row>.column,.ui[class*="top aligned"].grid>.column:not(.row),.ui[class*="top aligned"].grid>.row>.column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;vertical-align:top;-ms-flex-item-align:start!important;align-self:flex-start!important}.ui.grid>.row>[class*="middle aligned"].column,.ui.grid>[class*="middle aligned"].column:not(.row),.ui.grid>[class*="middle aligned"].row>.column,.ui[class*="middle aligned"].grid>.column:not(.row),.ui[class*="middle aligned"].grid>.row>.column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;vertical-align:middle;-ms-flex-item-align:center!important;align-self:center!important}.ui.grid>.row>[class*="bottom aligned"].column,.ui.grid>[class*="bottom aligned"].column:not(.row),.ui.grid>[class*="bottom aligned"].row>.column,.ui[class*="bottom aligned"].grid>.column:not(.row),.ui[class*="bottom aligned"].grid>.row>.column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;vertical-align:bottom;-ms-flex-item-align:end!important;align-self:flex-end!important}.ui.grid>.row>.stretched.column,.ui.grid>.stretched.column:not(.row),.ui.grid>.stretched.row>.column,.ui.stretched.grid>.column,.ui.stretched.grid>.row>.column{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important;-ms-flex-item-align:stretch;align-self:stretch;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.grid>.row>.stretched.column>*,.ui.grid>.stretched.column:not(.row)>*,.ui.grid>.stretched.row>.column>*,.ui.stretched.grid>.column>*,.ui.stretched.grid>.row>.column>*{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.ui.grid>.row>[class*="left aligned"].column.column,.ui.grid>[class*="left aligned"].column.column,.ui.grid>[class*="left aligned"].row>.column,.ui[class*="left aligned"].grid>.column,.ui[class*="left aligned"].grid>.row>.column{text-align:left;-ms-flex-item-align:inherit;align-self:inherit}.ui.grid>.row>[class*="center aligned"].column.column,.ui.grid>[class*="center aligned"].column.column,.ui.grid>[class*="center aligned"].row>.column,.ui[class*="center aligned"].grid>.column,.ui[class*="center aligned"].grid>.row>.column{text-align:center;-ms-flex-item-align:inherit;align-self:inherit}.ui[class*="center aligned"].grid{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.grid>.row>[class*="right aligned"].column.column,.ui.grid>[class*="right aligned"].column.column,.ui.grid>[class*="right aligned"].row>.column,.ui[class*="right aligned"].grid>.column,.ui[class*="right aligned"].grid>.row>.column{text-align:right;-ms-flex-item-align:inherit;align-self:inherit}.ui.grid>.justified.column.column,.ui.grid>.justified.row>.column,.ui.grid>.row>.justified.column.column,.ui.justified.grid>.column,.ui.justified.grid>.row>.column{text-align:justify;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.ui.grid>.primary.column,.ui.grid>.primary.row,.ui.grid>.row>.primary.column{background-color:#2185d0;color:#fff}.ui.grid>.row>.secondary.column,.ui.grid>.secondary.column,.ui.grid>.secondary.row{background-color:#1b1c1d;color:#fff}.ui.grid>.red.column,.ui.grid>.red.row,.ui.grid>.row>.red.column{background-color:#db2828;color:#fff}.ui.grid>.orange.column,.ui.grid>.orange.row,.ui.grid>.row>.orange.column{background-color:#f2711c;color:#fff}.ui.grid>.row>.yellow.column,.ui.grid>.yellow.column,.ui.grid>.yellow.row{background-color:#fbbd08;color:#fff}.ui.grid>.olive.column,.ui.grid>.olive.row,.ui.grid>.row>.olive.column{background-color:#b5cc18;color:#fff}.ui.grid>.green.column,.ui.grid>.green.row,.ui.grid>.row>.green.column{background-color:#21ba45;color:#fff}.ui.grid>.row>.teal.column,.ui.grid>.teal.column,.ui.grid>.teal.row{background-color:#00b5ad;color:#fff}.ui.grid>.blue.column,.ui.grid>.blue.row,.ui.grid>.row>.blue.column{background-color:#2185d0;color:#fff}.ui.grid>.row>.violet.column,.ui.grid>.violet.column,.ui.grid>.violet.row{background-color:#6435c9;color:#fff}.ui.grid>.purple.column,.ui.grid>.purple.row,.ui.grid>.row>.purple.column{background-color:#a333c8;color:#fff}.ui.grid>.pink.column,.ui.grid>.pink.row,.ui.grid>.row>.pink.column{background-color:#e03997;color:#fff}.ui.grid>.brown.column,.ui.grid>.brown.row,.ui.grid>.row>.brown.column{background-color:#a5673f;color:#fff}.ui.grid>.grey.column,.ui.grid>.grey.row,.ui.grid>.row>.grey.column{background-color:#767676;color:#fff}.ui.grid>.black.column,.ui.grid>.black.row,.ui.grid>.row>.black.column{background-color:#1b1c1d;color:#fff}.ui.grid>[class*="equal width"].row>.column,.ui[class*="equal width"].grid>.column:not(.row),.ui[class*="equal width"].grid>.row>.column{display:inline-block;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.ui.grid>[class*="equal width"].row>.wide.column,.ui[class*="equal width"].grid>.row>.wide.column,.ui[class*="equal width"].grid>.wide.column{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}@media only screen and (max-width:767.98px){.ui.grid>[class*="mobile reversed"].row,.ui[class*="mobile reversed"].grid,.ui[class*="mobile reversed"].grid>.row{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ui.stackable[class*="mobile reversed"],.ui[class*="mobile vertically reversed"].grid{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.ui[class*="mobile reversed"].divided.grid:not([class*="vertically divided"])>.column:first-child,.ui[class*="mobile reversed"].divided.grid:not([class*="vertically divided"])>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*="mobile reversed"].divided.grid:not([class*="vertically divided"])>.column:last-child,.ui[class*="mobile reversed"].divided.grid:not([class*="vertically divided"])>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}.ui.grid[class*="vertically divided"][class*="mobile vertically reversed"]>.row:first-child:before{-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.grid[class*="vertically divided"][class*="mobile vertically reversed"]>.row:last-child:before{-webkit-box-shadow:none;box-shadow:none}.ui[class*="mobile reversed"].celled.grid>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui[class*="mobile reversed"].celled.grid>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}}@media only screen and (min-width:768px) and (max-width:991.98px){.ui.grid>[class*="tablet reversed"].row,.ui[class*="tablet reversed"].grid,.ui[class*="tablet reversed"].grid>.row{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ui[class*="tablet vertically reversed"].grid{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.ui[class*="tablet reversed"].divided.grid:not([class*="vertically divided"])>.column:first-child,.ui[class*="tablet reversed"].divided.grid:not([class*="vertically divided"])>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*="tablet reversed"].divided.grid:not([class*="vertically divided"])>.column:last-child,.ui[class*="tablet reversed"].divided.grid:not([class*="vertically divided"])>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}.ui.grid[class*="vertically divided"][class*="tablet vertically reversed"]>.row:first-child:before{-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.grid[class*="vertically divided"][class*="tablet vertically reversed"]>.row:last-child:before{-webkit-box-shadow:none;box-shadow:none}.ui[class*="tablet reversed"].celled.grid>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui[class*="tablet reversed"].celled.grid>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}}@media only screen and (min-width:992px){.ui.grid>[class*="computer reversed"].row,.ui[class*="computer reversed"].grid,.ui[class*="computer reversed"].grid>.row{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ui[class*="computer vertically reversed"].grid{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.ui[class*="computer reversed"].divided.grid:not([class*="vertically divided"])>.column:first-child,.ui[class*="computer reversed"].divided.grid:not([class*="vertically divided"])>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*="computer reversed"].divided.grid:not([class*="vertically divided"])>.column:last-child,.ui[class*="computer reversed"].divided.grid:not([class*="vertically divided"])>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}.ui.grid[class*="vertically divided"][class*="computer vertically reversed"]>.row:first-child:before{-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.grid[class*="vertically divided"][class*="computer vertically reversed"]>.row:last-child:before{-webkit-box-shadow:none;box-shadow:none}.ui[class*="computer reversed"].celled.grid>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui[class*="computer reversed"].celled.grid>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}}@media only screen and (min-width:768px) and (max-width:991.98px){.ui.doubling.grid{width:auto}.ui.doubling.grid>.row,.ui.grid>.doubling.row{margin:0!important;padding:0!important}.ui.doubling.grid>.row>.column,.ui.grid>.doubling.row>.column{display:inline-block!important;padding-top:1rem!important;padding-bottom:1rem!important;-webkit-box-shadow:none!important;box-shadow:none!important;margin:0}.ui.grid>[class*="two column"].doubling.row.row>.column,.ui[class*="two column"].doubling.grid>.column:not(.row),.ui[class*="two column"].doubling.grid>.row>.column{width:100%!important}.ui.grid>[class*="three column"].doubling.row.row>.column,.ui[class*="three column"].doubling.grid>.column:not(.row),.ui[class*="three column"].doubling.grid>.row>.column{width:50%!important}.ui.grid>[class*="four column"].doubling.row.row>.column,.ui[class*="four column"].doubling.grid>.column:not(.row),.ui[class*="four column"].doubling.grid>.row>.column{width:50%!important}.ui.grid>[class*="five column"].doubling.row.row>.column,.ui[class*="five column"].doubling.grid>.column:not(.row),.ui[class*="five column"].doubling.grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="six column"].doubling.row.row>.column,.ui[class*="six column"].doubling.grid>.column:not(.row),.ui[class*="six column"].doubling.grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="seven column"].doubling.row.row>.column,.ui[class*="seven column"].doubling.grid>.column:not(.row),.ui[class*="seven column"].doubling.grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="eight column"].doubling.row.row>.column,.ui[class*="eight column"].doubling.grid>.column:not(.row),.ui[class*="eight column"].doubling.grid>.row>.column{width:25%!important}.ui.grid>[class*="nine column"].doubling.row.row>.column,.ui[class*="nine column"].doubling.grid>.column:not(.row),.ui[class*="nine column"].doubling.grid>.row>.column{width:25%!important}.ui.grid>[class*="ten column"].doubling.row.row>.column,.ui[class*="ten column"].doubling.grid>.column:not(.row),.ui[class*="ten column"].doubling.grid>.row>.column{width:20%!important}.ui.grid>[class*="eleven column"].doubling.row.row>.column,.ui[class*="eleven column"].doubling.grid>.column:not(.row),.ui[class*="eleven column"].doubling.grid>.row>.column{width:20%!important}.ui.grid>[class*="twelve column"].doubling.row.row>.column,.ui[class*="twelve column"].doubling.grid>.column:not(.row),.ui[class*="twelve column"].doubling.grid>.row>.column{width:16.66666667%!important}.ui.grid>[class*="thirteen column"].doubling.row.row>.column,.ui[class*="thirteen column"].doubling.grid>.column:not(.row),.ui[class*="thirteen column"].doubling.grid>.row>.column{width:16.66666667%!important}.ui.grid>[class*="fourteen column"].doubling.row.row>.column,.ui[class*="fourteen column"].doubling.grid>.column:not(.row),.ui[class*="fourteen column"].doubling.grid>.row>.column{width:14.28571429%!important}.ui.grid>[class*="fifteen column"].doubling.row.row>.column,.ui[class*="fifteen column"].doubling.grid>.column:not(.row),.ui[class*="fifteen column"].doubling.grid>.row>.column{width:14.28571429%!important}.ui.grid>[class*="sixteen column"].doubling.row.row>.column,.ui[class*="sixteen column"].doubling.grid>.column:not(.row),.ui[class*="sixteen column"].doubling.grid>.row>.column{width:12.5%!important}}@media only screen and (max-width:767.98px){.ui.doubling.grid>.row,.ui.grid>.doubling.row{margin:0!important;padding:0!important}.ui.doubling.grid>.row>.column,.ui.grid>.doubling.row>.column{padding-top:1rem!important;padding-bottom:1rem!important;margin:0!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.grid>[class*="two column"].doubling:not(.stackable).row.row>.column,.ui[class*="two column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="two column"].doubling:not(.stackable).grid>.row>.column{width:100%!important}.ui.grid>[class*="three column"].doubling:not(.stackable).row.row>.column,.ui[class*="three column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="three column"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*="four column"].doubling:not(.stackable).row.row>.column,.ui[class*="four column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="four column"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*="five column"].doubling:not(.stackable).row.row>.column,.ui[class*="five column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="five column"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*="six column"].doubling:not(.stackable).row.row>.column,.ui[class*="six column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="six column"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*="seven column"].doubling:not(.stackable).row.row>.column,.ui[class*="seven column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="seven column"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*="eight column"].doubling:not(.stackable).row.row>.column,.ui[class*="eight column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="eight column"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*="nine column"].doubling:not(.stackable).row.row>.column,.ui[class*="nine column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="nine column"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="ten column"].doubling:not(.stackable).row.row>.column,.ui[class*="ten column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="ten column"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="eleven column"].doubling:not(.stackable).row.row>.column,.ui[class*="eleven column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="eleven column"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="twelve column"].doubling:not(.stackable).row.row>.column,.ui[class*="twelve column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="twelve column"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="thirteen column"].doubling:not(.stackable).row.row>.column,.ui[class*="thirteen column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="thirteen column"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="fourteen column"].doubling:not(.stackable).row.row>.column,.ui[class*="fourteen column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="fourteen column"].doubling:not(.stackable).grid>.row>.column{width:25%!important}.ui.grid>[class*="fifteen column"].doubling:not(.stackable).row.row>.column,.ui[class*="fifteen column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="fifteen column"].doubling:not(.stackable).grid>.row>.column{width:25%!important}.ui.grid>[class*="sixteen column"].doubling:not(.stackable).row.row>.column,.ui[class*="sixteen column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="sixteen column"].doubling:not(.stackable).grid>.row>.column{width:25%!important}}@media only screen and (max-width:767.98px){.ui.stackable.grid{width:auto;margin-left:0!important;margin-right:0!important}.ui.grid>.stackable.stackable.stackable.row>.column,.ui.stackable.grid>.column.grid>.column,.ui.stackable.grid>.column.row>.column,.ui.stackable.grid>.column:not(.row),.ui.stackable.grid>.row>.column,.ui.stackable.grid>.row>.wide.column,.ui.stackable.grid>.wide.column{width:100%!important;margin:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;padding:1rem 1rem}.ui.stackable.grid:not(.vertically)>.row{margin:0;padding:0}.ui.container>.ui.stackable.grid>.column,.ui.container>.ui.stackable.grid>.row>.column{padding-left:0!important;padding-right:0!important}.ui.grid .ui.stackable.grid,.ui.segment:not(.vertical) .ui.stackable.page.grid{margin-left:-1rem!important;margin-right:-1rem!important}.ui.stackable.celled.grid>.column:not(.row):first-child,.ui.stackable.celled.grid>.row:first-child>.column:first-child,.ui.stackable.divided.grid>.column:not(.row):first-child,.ui.stackable.divided.grid>.row:first-child>.column:first-child{border-top:none!important}.ui.inverted.stackable.celled.grid>.column:not(.row),.ui.inverted.stackable.celled.grid>.row>.column,.ui.inverted.stackable.divided.grid>.column:not(.row),.ui.inverted.stackable.divided.grid>.row>.column{border-top:1px solid rgba(255,255,255,.1)}.ui.stackable.celled.grid>.column:not(.row),.ui.stackable.celled.grid>.row>.column,.ui.stackable.divided:not(.vertically).grid>.column:not(.row),.ui.stackable.divided:not(.vertically).grid>.row>.column{border-top:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none!important;box-shadow:none!important;padding-top:2rem!important;padding-bottom:2rem!important}.ui.stackable.celled.grid>.row{-webkit-box-shadow:none!important;box-shadow:none!important}.ui.stackable.divided:not(.vertically).grid>.column:not(.row),.ui.stackable.divided:not(.vertically).grid>.row>.column{padding-left:0!important;padding-right:0!important}}@media only screen and (max-width:767.98px){.ui.grid.grid.grid>.row>[class*="tablet only"].column:not(.mobile),.ui.grid.grid.grid>[class*="tablet only"].column:not(.mobile),.ui.grid.grid.grid>[class*="tablet only"].row:not(.mobile),.ui[class*="tablet only"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*="computer only"].column:not(.mobile),.ui.grid.grid.grid>[class*="computer only"].column:not(.mobile),.ui.grid.grid.grid>[class*="computer only"].row:not(.mobile),.ui[class*="computer only"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*="large screen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="large screen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="large screen only"].row:not(.mobile),.ui[class*="large screen only"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].row:not(.mobile),.ui[class*="widescreen only"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:768px) and (max-width:991.98px){.ui.grid.grid.grid>.row>[class*="mobile only"].column:not(.tablet),.ui.grid.grid.grid>[class*="mobile only"].column:not(.tablet),.ui.grid.grid.grid>[class*="mobile only"].row:not(.tablet),.ui[class*="mobile only"].grid.grid.grid:not(.tablet){display:none!important}.ui.grid.grid.grid>.row>[class*="computer only"].column:not(.tablet),.ui.grid.grid.grid>[class*="computer only"].column:not(.tablet),.ui.grid.grid.grid>[class*="computer only"].row:not(.tablet),.ui[class*="computer only"].grid.grid.grid:not(.tablet){display:none!important}.ui.grid.grid.grid>.row>[class*="large screen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="large screen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="large screen only"].row:not(.mobile),.ui[class*="large screen only"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].row:not(.mobile),.ui[class*="widescreen only"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:992px) and (max-width:1199.98px){.ui.grid.grid.grid>.row>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].row:not(.computer),.ui[class*="mobile only"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*="tablet only"].column:not(.computer),.ui.grid.grid.grid>[class*="tablet only"].column:not(.computer),.ui.grid.grid.grid>[class*="tablet only"].row:not(.computer),.ui[class*="tablet only"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*="large screen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="large screen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="large screen only"].row:not(.mobile),.ui[class*="large screen only"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].row:not(.mobile),.ui[class*="widescreen only"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:1200px) and (max-width:1919.98px){.ui.grid.grid.grid>.row>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].row:not(.computer),.ui[class*="mobile only"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*="tablet only"].column:not(.computer),.ui.grid.grid.grid>[class*="tablet only"].column:not(.computer),.ui.grid.grid.grid>[class*="tablet only"].row:not(.computer),.ui[class*="tablet only"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].row:not(.mobile),.ui[class*="widescreen only"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:1920px){.ui.grid.grid.grid>.row>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].row:not(.computer),.ui[class*="mobile only"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*="tablet only"].column:not(.computer),.ui.grid.grid.grid>[class*="tablet only"].column:not(.computer),.ui.grid.grid.grid>[class*="tablet only"].row:not(.computer),.ui[class*="tablet only"].grid.grid.grid:not(.computer){display:none!important}}.ui.ui.ui.compact.grid>.column:not(.row),.ui.ui.ui.compact.grid>.row>.column{padding-left:.5rem;padding-right:.5rem}.ui.ui.ui.compact.grid>*{padding-left:.5rem;padding-right:.5rem}.ui.ui.ui.compact.grid>.row{padding-top:.5rem;padding-bottom:.5rem}.ui.ui.ui.compact.grid>.column:not(.row){padding-top:.5rem;padding-bottom:.5rem}.ui.compact.relaxed.celled.grid>.column:not(.row),.ui.compact.relaxed.celled.grid>.row>.column{padding:.75em}.ui.compact[class*="very relaxed"].celled.grid>.column:not(.row),.ui.compact[class*="very relaxed"].celled.grid>.row>.column{padding:1em}.ui[class*="very compact"].grid>.column:not(.row),.ui[class*="very compact"].grid>.row>.column{padding-left:.25rem;padding-right:.5rem}.ui[class*="very compact"].grid>*{padding-left:.25rem;padding-right:.25rem}.ui[class*="very compact"].grid>.row{padding-top:.25rem;padding-bottom:.25rem}.ui[class*="very compact"].grid>.column:not(.row){padding-top:.25rem;padding-bottom:.25rem}.ui[class*="very compact"].relaxed.celled.grid>.column:not(.row),.ui[class*="very compact"].relaxed.celled.grid>.row>.column{padding:.375em}.ui[class*="very compact"][class*="very relaxed"].celled.grid>.column:not(.row),.ui[class*="very compact"][class*="very relaxed"].celled.grid>.row>.column{padding:.5em}.ui.menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin:1rem 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;background:#fff;font-weight:400;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);border-radius:.28571429rem;min-height:2.85714286em}.ui.menu:after{content:'';display:block;height:0;clear:both;visibility:hidden}.ui.menu:first-child{margin-top:0}.ui.menu:last-child{margin-bottom:0}.ui.menu .menu{margin:0}.ui.menu:not(.vertical)>.menu{display:-webkit-box;display:-ms-flexbox;display:flex}.ui.menu:not(.vertical) .item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.menu .item{position:relative;vertical-align:middle;line-height:1;text-decoration:none;-webkit-tap-highlight-color:transparent;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:0 0;padding:.92857143em 1.14285714em;text-transform:none;color:rgba(0,0,0,.87);font-weight:400;-webkit-transition:background .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background .1s ease,box-shadow .1s ease,color .1s ease;transition:background .1s ease,box-shadow .1s ease,color .1s ease,-webkit-box-shadow .1s ease}.ui.menu>.item:first-child{border-radius:.28571429rem 0 0 .28571429rem}.ui.menu .item:before{position:absolute;content:'';top:0;right:0;height:100%;width:1px;background:rgba(34,36,38,.1)}.ui.menu .item>a:not(.ui),.ui.menu .item>p:only-child,.ui.menu .text.item>*{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;line-height:1.3}.ui.menu .item>p:first-child{margin-top:0}.ui.menu .item>p:last-child{margin-bottom:0}.ui.menu .item>i.icon{opacity:.9;float:none;margin:0 .35714286em 0 0}.ui.menu:not(.vertical) .item>.button{position:relative;top:0;margin:-.5em 0;padding-bottom:.78571429em;padding-top:.78571429em;font-size:1em}.ui.menu>.container,.ui.menu>.grid{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:inherit;-ms-flex-align:inherit;align-items:inherit;-webkit-box-orient:inherit;-webkit-box-direction:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.menu .item>.input{width:100%}.ui.menu:not(.vertical) .item>.input{position:relative;top:0;margin:-.5em 0}.ui.menu .item>.input input{font-size:1em;padding-top:.57142857em;padding-bottom:.57142857em}.ui.menu .header.item,.ui.vertical.menu .header.item{margin:0;background:'';text-transform:normal;font-weight:700}.ui.vertical.menu .item>.header:not(.ui){margin:0 0 .5em;font-size:1em;font-weight:700}.ui.menu .item>i.dropdown.icon{padding:0;float:right;margin:0 0 0 1em}.ui.menu .dropdown.item .menu{min-width:calc(100% - 1px);border-radius:0 0 .28571429rem .28571429rem;background:#fff;margin:0 0 0;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.08);box-shadow:0 1px 3px 0 rgba(0,0,0,.08);-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.ui.menu .ui.dropdown .menu>.item{margin:0;text-align:left;font-size:1em!important;padding:.78571429em 1.14285714em!important;background:0 0!important;color:rgba(0,0,0,.87)!important;text-transform:none!important;font-weight:400!important;-webkit-box-shadow:none!important;box-shadow:none!important;-webkit-transition:none!important;transition:none!important}.ui.menu .ui.dropdown .menu>.item:hover{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown .menu>.selected.item{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown .menu>.active.item{background:rgba(0,0,0,.03)!important;font-weight:700!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown.item .menu .item:not(.filtered){display:block}.ui.menu .ui.dropdown .menu>.item .icon:not(.dropdown){display:inline-block;font-size:1em!important;float:none;margin:0 .75em 0 0!important}.ui.secondary.menu .dropdown.item>.menu,.ui.text.menu .dropdown.item>.menu{border-radius:.28571429rem;margin-top:.35714286em}.ui.menu .pointing.dropdown.item .menu{margin-top:.75em}.ui.inverted.menu .search.dropdown.item>.search,.ui.inverted.menu .search.dropdown.item>.text{color:rgba(255,255,255,.9)}.ui.vertical.menu .dropdown.item>.icon{float:right;content:"\f0da";margin-left:1em}.ui.vertical.menu .dropdown.item .menu{left:100%;min-width:0;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;margin:0;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.08);box-shadow:0 1px 3px 0 rgba(0,0,0,.08);border-radius:0 .28571429rem .28571429rem .28571429rem}.ui.vertical.menu .dropdown.item.upward .menu{bottom:0}.ui.vertical.menu .dropdown.item:not(.upward) .menu{top:0}.ui.vertical.menu .active.dropdown.item{border-top-right-radius:0;border-bottom-right-radius:0}.ui.vertical.menu .dropdown.active.item{-webkit-box-shadow:none;box-shadow:none}.ui.item.menu .dropdown .menu .item{width:100%}.ui.menu .item>.label:not(.floating){margin-left:1em;padding:.3em .78571429em}.ui.vertical.menu .item>.label{margin-top:-.15em;margin-bottom:-.15em;padding:.3em .78571429em}.ui.menu .item>.floating.label{padding:.3em .78571429em}.ui.menu .item>.label{background:#999;color:#fff}.ui.menu .item>.image.label img{margin:-.2833em .8em -.2833em -.8em;height:1.5666em}.ui.menu .item>img:not(.ui){display:inline-block;vertical-align:middle;margin:-.3em 0;width:2.5em}.ui.vertical.menu .item>img:not(.ui):only-child{display:block;max-width:100%;width:auto}.ui.menu .list .item:before{background:0 0!important}.ui.vertical.sidebar.menu>.item:first-child:before{display:block!important}.ui.vertical.sidebar.menu>.item::before{top:auto;bottom:0}@media only screen and (max-width:767.98px){.ui.menu>.ui.container{width:100%!important;margin-left:0!important;margin-right:0!important}}@media only screen and (min-width:768px){.ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless)>.container>.item:not(.right):not(.borderless):first-child{border-left:1px solid rgba(34,36,38,.1)}.ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless)>.container>.right.item:not(.borderless):last-child,.ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless)>.container>.right.menu>.item:not(.borderless):last-child{border-right:1px solid rgba(34,36,38,.1)}}.ui.link.menu .item:hover,.ui.menu .dropdown.item:hover,.ui.menu .link.item:hover,.ui.menu a.item:hover{cursor:pointer;background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.link.menu .item:active,.ui.menu .link.item:active,.ui.menu a.item:active{background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.menu .active.item{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);font-weight:400;-webkit-box-shadow:none;box-shadow:none}.ui.menu .active.item>i.icon{opacity:1}.ui.menu .active.item:hover,.ui.vertical.menu .active.item:hover{background-color:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.ui.menu .item.disabled{cursor:default;background-color:transparent;color:rgba(40,40,40,.3);pointer-events:none}.ui.menu:not(.vertical) .left.item,.ui.menu:not(.vertical) .left.menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin-right:auto!important}.ui.menu:not(.vertical) .right.item,.ui.menu:not(.vertical) .right.menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin-left:auto!important}.ui.menu:not(.vertical) :not(.dropdown)>.left.menu,.ui.menu:not(.vertical) :not(.dropdown)>.right.menu{display:inherit}.ui.menu:not(.vertical) .center.item,.ui.menu:not(.vertical) .center.menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin-left:auto!important;margin-right:auto!important}.ui.menu .right.item::before,.ui.menu .right.menu>.item::before{right:auto;left:0}.ui.menu .center.item:last-child::before,.ui.menu .center.menu>.item:last-child::before{display:none}.ui.vertical.menu{display:block;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.ui.vertical.menu .item{display:block;background:0 0;border-top:none;border-right:none}.ui.vertical.menu>.item:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.menu>.item:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.menu .item>.label{float:right;text-align:center}.ui.vertical.menu .item>i.icon,.ui.vertical.menu .item>i.icons{width:1.18em;float:right;margin:0 0 0 .5em}.ui.vertical.menu .item>.label+i.icon{float:none;margin:0 .5em 0 0}.ui.vertical.menu .item:before{position:absolute;content:'';top:0;left:0;width:100%;height:1px;background:rgba(34,36,38,.1)}.ui.vertical.menu .item:first-child:before{display:none!important}.ui.vertical.menu .item>.menu{margin:.5em -1.14285714em 0}.ui.vertical.menu .menu .item{background:0 0;padding:.5em 1.33333333em;font-size:.85714286em;color:rgba(0,0,0,.5)}.ui.vertical.menu .item .menu .link.item:hover,.ui.vertical.menu .item .menu a.item:hover{color:rgba(0,0,0,.85)}.ui.vertical.menu .menu .item:before{display:none}.ui.vertical.menu .active.item{background:rgba(0,0,0,.05);border-radius:0;-webkit-box-shadow:none;box-shadow:none}.ui.vertical.menu>.active.item:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.menu>.active.item:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.menu>.active.item:only-child{border-radius:.28571429rem}.ui.vertical.menu .active.item .menu .active.item{border-left:none}.ui.vertical.menu .item .menu .active.item{background-color:transparent;font-weight:700;color:rgba(0,0,0,.95)}.ui.tabular.menu{border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border:none;background:none transparent;border-bottom:1px solid #d4d4d5}.ui.tabular.fluid.menu{width:calc(100% + 2px)!important}.ui.tabular.menu .item{background:0 0;border-bottom:none;border-left:1px solid transparent;border-right:1px solid transparent;border-top:2px solid transparent;padding:.92857143em 1.42857143em;color:rgba(0,0,0,.87)}.ui.tabular.menu .item:before{display:none}.ui.tabular.menu .item:hover{background-color:transparent;color:rgba(0,0,0,.8)}.ui.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-top-width:1px;border-color:#d4d4d5;font-weight:700;margin-bottom:-1px;-webkit-box-shadow:none;box-shadow:none;border-radius:.28571429rem .28571429rem 0 0!important}.ui.tabular.menu+.attached:not(.top).segment,.ui.tabular.menu+.attached:not(.top).segment+.attached:not(.top).segment{border-top:none;margin-left:0;margin-top:0;margin-right:0;width:100%}.top.attached.segment+.ui.bottom.tabular.menu{position:relative;width:calc(100% + 2px);left:-1px}.ui.bottom.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:none;border-top:1px solid #d4d4d5}.ui.bottom.tabular.menu .item{background:0 0;border-left:1px solid transparent;border-right:1px solid transparent;border-bottom:1px solid transparent;border-top:none}.ui.bottom.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:-1px 0 0 0;border-radius:0 0 .28571429rem .28571429rem!important}.ui.vertical.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:none;border-right:1px solid #d4d4d5}.ui.vertical.tabular.menu .item{background:0 0;border-left:1px solid transparent;border-bottom:1px solid transparent;border-top:1px solid transparent;border-right:none}.ui.vertical.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:0 -1px 0 0;border-radius:.28571429rem 0 0 .28571429rem!important}.ui.vertical.right.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:none;border-right:none;border-left:1px solid #d4d4d5}.ui.vertical.right.tabular.menu .item{background:0 0;border-right:1px solid transparent;border-bottom:1px solid transparent;border-top:1px solid transparent;border-left:none}.ui.vertical.right.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:0 0 0 -1px;border-radius:0 .28571429rem .28571429rem 0!important}.ui.tabular.menu .active.dropdown.item{margin-bottom:0;border-left:1px solid transparent;border-right:1px solid transparent;border-top:2px solid transparent;border-bottom:none}.ui.pagination.menu{margin:0;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.ui.pagination.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.compact.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.pagination.menu .item:last-child:before{display:none}.ui.pagination.menu .item{min-width:3em;text-align:center}.ui.pagination.menu .icon.item i.icon{vertical-align:top}.ui.pagination.menu .active.item{border-top:none;padding-top:.92857143em;background-color:rgba(0,0,0,.05);color:rgba(0,0,0,.95);-webkit-box-shadow:none;box-shadow:none}.ui.secondary.menu{background:0 0;margin-left:-.35714286em;margin-right:-.35714286em;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none}.ui.secondary.menu .item{-ms-flex-item-align:center;align-self:center;-webkit-box-shadow:none;box-shadow:none;border:none;padding:.78571429em .92857143em;margin:0 .35714286em;background:0 0;-webkit-transition:color .1s ease;transition:color .1s ease;border-radius:.28571429rem}.ui.secondary.menu .item:before{display:none!important}.ui.secondary.menu .header.item{border-radius:0;border-right:none;background:none transparent}.ui.secondary.menu .item>img:not(.ui){margin:0}.ui.secondary.menu .dropdown.item:hover,.ui.secondary.menu .link.item:hover,.ui.secondary.menu a.item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.secondary.menu .active.item{-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);border-radius:.28571429rem}.ui.secondary.menu .active.item:hover{-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.secondary.inverted.menu .link.item:not(.disabled),.ui.secondary.inverted.menu a.item:not(.disabled){color:rgba(255,255,255,.7)}.ui.secondary.inverted.menu .dropdown.item:hover,.ui.secondary.inverted.menu .link.item:hover,.ui.secondary.inverted.menu a.item:hover{background:rgba(255,255,255,.08);color:#fff}.ui.secondary.inverted.menu .active.item{background:rgba(255,255,255,.15);color:#fff}.ui.secondary.item.menu{margin-left:0;margin-right:0}.ui.secondary.item.menu .item:last-child{margin-right:0}.ui.secondary.attached.menu{-webkit-box-shadow:none;box-shadow:none}.ui.vertical.secondary.menu .item:not(.dropdown)>.menu{margin:0 -.92857143em}.ui.vertical.secondary.menu .item:not(.dropdown)>.menu>.item{margin:0;padding:.5em 1.33333333em}.ui.secondary.vertical.menu>.item{border:none;margin:0 0 .35714286em;border-radius:.28571429rem!important}.ui.secondary.vertical.menu>.header.item{border-radius:0}.ui.vertical.secondary.menu .item>.menu .item{background-color:transparent}.ui.secondary.inverted.menu{background-color:transparent}.ui.secondary.pointing.menu{margin-left:0;margin-right:0;border-bottom:2px solid rgba(34,36,38,.15)}.ui.secondary.pointing.menu .item{border-bottom-color:transparent;border-bottom-style:solid;border-radius:0;-ms-flex-item-align:end;align-self:flex-end;margin:0 0 -2px;padding:.85714286em 1.14285714em;border-bottom-width:2px;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.secondary.pointing.menu .ui.dropdown .menu .item{border-bottom-width:0}.ui.secondary.pointing.menu .item>.label:not(.floating){margin-top:-.3em;margin-bottom:-.3em}.ui.secondary.pointing.menu .item>.circular.label{margin-top:-.5em;margin-bottom:-.5em}.ui.secondary.pointing.menu .header.item{color:rgba(0,0,0,.85)!important}.ui.secondary.pointing.menu .text.item{-webkit-box-shadow:none!important;box-shadow:none!important}.ui.secondary.pointing.menu .item:after{display:none}.ui.secondary.pointing.menu .dropdown.item:hover,.ui.secondary.pointing.menu .link.item:hover,.ui.secondary.pointing.menu a.item:hover{background-color:transparent;color:rgba(0,0,0,.87)}.ui.secondary.pointing.menu .dropdown.item:active,.ui.secondary.pointing.menu .link.item:active,.ui.secondary.pointing.menu a.item:active{background-color:transparent;border-color:rgba(34,36,38,.15)}.ui.secondary.pointing.menu .active.item{background-color:transparent;-webkit-box-shadow:none;box-shadow:none;border-color:currentColor;font-weight:700;color:rgba(0,0,0,.95)}.ui.secondary.pointing.menu .active.item:hover{border-color:currentColor;color:rgba(0,0,0,.95)}.ui.secondary.pointing.menu .active.dropdown.item{border-color:transparent}.ui.secondary.vertical.pointing.menu{border-bottom-width:0;border-right-width:2px;border-right-style:solid;border-right-color:rgba(34,36,38,.15)}.ui.secondary.vertical.pointing.menu .item{border-bottom:none;border-right-style:solid;border-right-color:transparent;border-radius:0!important;margin:0 -2px 0 0;border-right-width:2px}.ui.secondary.vertical.pointing.menu .active.item{border-color:currentColor}.ui.secondary.inverted.pointing.menu{border-color:rgba(255,255,255,.1)}.ui.secondary.inverted.pointing.menu .item:not(.disabled){color:rgba(255,255,255,.9)}.ui.secondary.inverted.pointing.menu .header.item{color:#fff!important}.ui.secondary.inverted.pointing.menu .link.item:hover,.ui.secondary.inverted.pointing.menu a.item:hover{color:#fff}.ui.ui.secondary.inverted.pointing.menu .active.item{border-color:#fff;color:#fff;background-color:transparent}.ui.text.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none;box-shadow:none;border:none;margin:1em -.5em}.ui.text.menu .item{border-radius:0;-webkit-box-shadow:none;box-shadow:none;-ms-flex-item-align:center;align-self:center;margin:0 0;padding:.35714286em .5em;font-weight:400;color:rgba(0,0,0,.6);-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.text.menu .item:before,.ui.text.menu .menu .item:before{display:none!important}.ui.text.menu .header.item{background-color:transparent;opacity:1;color:rgba(0,0,0,.85);font-size:.92857143em;text-transform:uppercase;font-weight:700}.ui.text.menu .item>img:not(.ui){margin:0}.ui.text.item.menu .item{margin:0}.ui.vertical.text.menu{margin:1em 0}.ui.vertical.text.menu:first-child{margin-top:0}.ui.vertical.text.menu:last-child{margin-bottom:0}.ui.vertical.text.menu .item{margin:.57142857em 0;padding-left:0;padding-right:0}.ui.vertical.text.menu .item>i.icon{float:none;margin:0 .35714286em 0 0}.ui.vertical.text.menu .header.item{margin:.57142857em 0 .71428571em}.ui.vertical.text.menu .item:not(.dropdown)>.menu{margin:0}.ui.vertical.text.menu .item:not(.dropdown)>.menu>.item{margin:0;padding:.5em 0}.ui.text.menu .item:hover{opacity:1;background-color:transparent}.ui.text.menu .active.item{background-color:transparent;border:none;-webkit-box-shadow:none;box-shadow:none;font-weight:400;color:rgba(0,0,0,.95)}.ui.text.menu .active.item:hover{background-color:transparent}.ui.text.pointing.menu .active.item:after{-webkit-box-shadow:none;box-shadow:none}.ui.text.attached.menu{-webkit-box-shadow:none;box-shadow:none}.ui.inverted.text.menu,.ui.inverted.text.menu .active.item,.ui.inverted.text.menu .item,.ui.inverted.text.menu .item:hover{background-color:transparent}.ui.fluid.text.menu{margin-left:0;margin-right:0}.ui.vertical.icon.menu{display:inline-block;width:auto}.ui.icon.menu .item{height:auto;text-align:center;color:#1b1c1d}.ui.icon.menu .item>.icon:not(.dropdown){margin:0;opacity:1}.ui.icon.menu .icon:before{opacity:1}.ui.menu .icon.item>.icon{width:auto;margin:0 auto}.ui.vertical.icon.menu .item>.icon:not(.dropdown){display:block;opacity:1;margin:0 auto;float:none}.ui.inverted.icon.menu .item{color:#fff}.ui.labeled.icon.menu{text-align:center}.ui.labeled.icon.menu .item{min-width:6em;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.labeled.icon.menu>.item>.icon:not(.dropdown){height:1em;display:block;font-size:1.71428571em!important;margin:0 auto .5rem!important}.ui.fluid.labeled.icon.menu>.item{min-width:0}@media only screen and (max-width:767.98px){.ui.stackable.menu{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.stackable.menu .item{width:100%!important}.ui.stackable.menu .item:before{position:absolute;content:'';top:auto;bottom:0;left:0;width:100%;height:1px;background:rgba(34,36,38,.1)}.ui.stackable.menu .left.item,.ui.stackable.menu .left.menu{margin-right:0!important}.ui.stackable.menu .right.item,.ui.stackable.menu .right.menu{margin-left:0!important}.ui.stackable.menu .center.item,.ui.stackable.menu .center.menu{margin-left:0!important;margin-right:0!important}.ui.stackable.menu .center.menu,.ui.stackable.menu .left.menu,.ui.stackable.menu .right.menu{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.ui.ui.menu .primary.active.item,.ui.ui.primary.menu .active.item,.ui.ui.primary.menu .active.item:hover{color:#2185d0}.ui.ui.menu .red.active.item,.ui.ui.red.menu .active.item,.ui.ui.red.menu .active.item:hover{color:#db2828}.ui.ui.menu .orange.active.item,.ui.ui.orange.menu .active.item,.ui.ui.orange.menu .active.item:hover{color:#f2711c}.ui.ui.menu .yellow.active.item,.ui.ui.yellow.menu .active.item,.ui.ui.yellow.menu .active.item:hover{color:#fbbd08}.ui.ui.menu .olive.active.item,.ui.ui.olive.menu .active.item,.ui.ui.olive.menu .active.item:hover{color:#b5cc18}.ui.ui.green.menu .active.item,.ui.ui.green.menu .active.item:hover,.ui.ui.menu .green.active.item{color:#21ba45}.ui.ui.menu .teal.active.item,.ui.ui.teal.menu .active.item,.ui.ui.teal.menu .active.item:hover{color:#00b5ad}.ui.ui.blue.menu .active.item,.ui.ui.blue.menu .active.item:hover,.ui.ui.menu .blue.active.item{color:#2185d0}.ui.ui.menu .violet.active.item,.ui.ui.violet.menu .active.item,.ui.ui.violet.menu .active.item:hover{color:#6435c9}.ui.ui.menu .purple.active.item,.ui.ui.purple.menu .active.item,.ui.ui.purple.menu .active.item:hover{color:#a333c8}.ui.ui.menu .pink.active.item,.ui.ui.pink.menu .active.item,.ui.ui.pink.menu .active.item:hover{color:#e03997}.ui.ui.brown.menu .active.item,.ui.ui.brown.menu .active.item:hover,.ui.ui.menu .brown.active.item{color:#a5673f}.ui.ui.grey.menu .active.item,.ui.ui.grey.menu .active.item:hover,.ui.ui.menu .grey.active.item{color:#767676}.ui.ui.black.menu .active.item,.ui.ui.black.menu .active.item:hover,.ui.ui.menu .black.active.item{color:#1b1c1d}.ui.inverted.menu{border:0 solid transparent;background:#1b1c1d;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.menu .item,.ui.inverted.menu .item>a:not(.ui){background:0 0;color:rgba(255,255,255,.9)}.ui.inverted.menu .item.menu{background:0 0}.ui.inverted.menu .item:before{background:rgba(255,255,255,.08)}.ui.vertical.inverted.menu .item:before{background:rgba(255,255,255,.08)}.ui.vertical.inverted.menu .menu .item,.ui.vertical.inverted.menu .menu .item a:not(.ui){color:rgba(255,255,255,.5)}.ui.inverted.menu .header.item{margin:0;background:0 0;-webkit-box-shadow:none;box-shadow:none}.ui.ui.inverted.menu .item.disabled{color:rgba(225,225,225,.3)}.ui.inverted.menu .dropdown.item:hover,.ui.inverted.menu .link.item:hover,.ui.inverted.menu a.item:hover,.ui.link.inverted.menu .item:hover{background:rgba(255,255,255,.08);color:#fff}.ui.vertical.inverted.menu .item .menu .link.item:hover,.ui.vertical.inverted.menu .item .menu a.item:hover{background:0 0;color:#fff}.ui.inverted.menu .link.item:active,.ui.inverted.menu a.item:active{background:rgba(255,255,255,.08);color:#fff}.ui.inverted.menu .active.item{background:#3d3e3f;color:#fff!important}.ui.inverted.vertical.menu .item .menu .active.item{background:0 0;color:#fff}.ui.inverted.pointing.menu .active.item:after{background:#3d3e3f;margin:0!important;-webkit-box-shadow:none!important;box-shadow:none!important;border:none!important}.ui.inverted.menu .active.item:hover{background:#3d3e3f;color:#fff!important}.ui.inverted.pointing.menu .active.item:hover:after{background:#3d3e3f}.ui.floated.menu{float:left;margin:0 .5rem 0 0}.ui.floated.menu .item:last-child:before{display:none}.ui.right.floated.menu{float:right;margin:0 0 0 .5rem}.ui.ui.inverted.menu .primary.active.item,.ui.ui.inverted.primary.menu{background-color:#2185d0}.ui.inverted.primary.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.primary.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.primary.menu .active.item{background-color:#1678c2}.ui.ui.inverted.menu .red.active.item,.ui.ui.inverted.red.menu{background-color:#db2828}.ui.inverted.red.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.red.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.red.menu .active.item{background-color:#d01919}.ui.ui.inverted.menu .orange.active.item,.ui.ui.inverted.orange.menu{background-color:#f2711c}.ui.inverted.orange.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.orange.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.orange.menu .active.item{background-color:#f26202}.ui.ui.inverted.menu .yellow.active.item,.ui.ui.inverted.yellow.menu{background-color:#fbbd08}.ui.inverted.yellow.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.yellow.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.yellow.menu .active.item{background-color:#eaae00}.ui.ui.inverted.menu .olive.active.item,.ui.ui.inverted.olive.menu{background-color:#b5cc18}.ui.inverted.olive.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.olive.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.olive.menu .active.item{background-color:#a7bd0d}.ui.ui.inverted.green.menu,.ui.ui.inverted.menu .green.active.item{background-color:#21ba45}.ui.inverted.green.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.green.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.green.menu .active.item{background-color:#16ab39}.ui.ui.inverted.menu .teal.active.item,.ui.ui.inverted.teal.menu{background-color:#00b5ad}.ui.inverted.teal.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.teal.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.teal.menu .active.item{background-color:#009c95}.ui.ui.inverted.blue.menu,.ui.ui.inverted.menu .blue.active.item{background-color:#2185d0}.ui.inverted.blue.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.blue.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.blue.menu .active.item{background-color:#1678c2}.ui.ui.inverted.menu .violet.active.item,.ui.ui.inverted.violet.menu{background-color:#6435c9}.ui.inverted.violet.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.violet.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.violet.menu .active.item{background-color:#5829bb}.ui.ui.inverted.menu .purple.active.item,.ui.ui.inverted.purple.menu{background-color:#a333c8}.ui.inverted.purple.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.purple.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.purple.menu .active.item{background-color:#9627ba}.ui.ui.inverted.menu .pink.active.item,.ui.ui.inverted.pink.menu{background-color:#e03997}.ui.inverted.pink.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.pink.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.pink.menu .active.item{background-color:#e61a8d}.ui.ui.inverted.brown.menu,.ui.ui.inverted.menu .brown.active.item{background-color:#a5673f}.ui.inverted.brown.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.brown.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.brown.menu .active.item{background-color:#975b33}.ui.ui.inverted.grey.menu,.ui.ui.inverted.menu .grey.active.item{background-color:#767676}.ui.inverted.grey.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.grey.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.grey.menu .active.item{background-color:#838383}.ui.ui.inverted.black.menu,.ui.ui.inverted.menu .black.active.item{background-color:#1b1c1d}.ui.inverted.black.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.black.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.black.menu .active.item{background-color:#27292a}.ui.ui.ui.inverted.pointing.menu .active.item:after{background-color:inherit}.ui.fitted.menu .item,.ui.fitted.menu .item .menu .item,.ui.menu .fitted.item{padding:0}.ui.horizontally.fitted.menu .item,.ui.horizontally.fitted.menu .item .menu .item,.ui.menu .horizontally.fitted.item{padding-top:.92857143em;padding-bottom:.92857143em}.ui.menu .vertically.fitted.item,.ui.vertically.fitted.menu .item,.ui.vertically.fitted.menu .item .menu .item{padding-left:1.14285714em;padding-right:1.14285714em}.ui.borderless.menu .item .menu .item:before,.ui.borderless.menu .item:before,.ui.menu .borderless.item:before{background:0 0!important}.ui.compact.menu{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin:0;vertical-align:middle}.ui.compact.vertical.menu{display:-ms-inline-flexbox!important;display:inline-block}.ui.compact.menu:not(.secondary) .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.compact.menu .item:last-child:before{display:none}.ui.compact.vertical.menu{width:auto!important}.ui.compact.vertical.menu .item:last-child::before{display:block}.ui.menu.fluid,.ui.vertical.menu.fluid{width:100%!important}.ui.item.menu,.ui.item.menu .item{width:100%;padding-left:0!important;padding-right:0!important;margin-left:0!important;margin-right:0!important;text-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.attached.item.menu:not(.tabular){margin:0 -1px!important}.ui.item.menu .item:last-child:before{display:none}.ui.menu.two.item .item{width:50%}.ui.menu.three.item .item{width:33.333%}.ui.menu.four.item .item{width:25%}.ui.menu.five.item .item{width:20%}.ui.menu.six.item .item{width:16.666%}.ui.menu.seven.item .item{width:14.285%}.ui.menu.eight.item .item{width:12.5%}.ui.menu.nine.item .item{width:11.11%}.ui.menu.ten.item .item{width:10%}.ui.menu.eleven.item .item{width:9.09%}.ui.menu.twelve.item .item{width:8.333%}.ui.menu.fixed{position:fixed;z-index:101;margin:0;width:100%}.ui.menu.fixed,.ui.menu.fixed .item:first-child,.ui.menu.fixed .item:last-child{border-radius:0!important}.ui.fixed.menu,.ui[class*="top fixed"].menu{top:0;left:0;right:auto;bottom:auto}.ui[class*="top fixed"].menu{border-top:none;border-left:none;border-right:none}.ui[class*="right fixed"].menu{border-top:none;border-bottom:none;border-right:none;top:0;right:0;left:auto;bottom:auto;width:auto;height:100%}.ui[class*="bottom fixed"].menu{border-bottom:none;border-left:none;border-right:none;bottom:0;left:0;top:auto;right:auto}.ui[class*="left fixed"].menu{border-top:none;border-bottom:none;border-left:none;top:0;left:0;right:auto;bottom:auto;width:auto;height:100%}.ui.fixed.menu+.ui.grid{padding-top:2.75rem}.ui.pointing.menu .item:after{visibility:hidden;position:absolute;content:'';top:100%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);background:0 0;margin:.5px 0 0;width:.57142857em;height:.57142857em;border:none;border-bottom:1px solid #d4d4d5;border-right:1px solid #d4d4d5;z-index:2;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.vertical.pointing.menu .item:after{position:absolute;top:50%;right:0;bottom:auto;left:auto;-webkit-transform:translateX(50%) translateY(-50%) rotate(45deg);transform:translateX(50%) translateY(-50%) rotate(45deg);margin:0 -.5px 0 0;border:none;border-top:1px solid #d4d4d5;border-right:1px solid #d4d4d5}.ui.pointing.menu .ui.dropdown .menu .item:after,.ui.vertical.pointing.menu .ui.dropdown .menu .item:after{display:none}.ui.pointing.menu .active.item:after{visibility:visible}.ui.pointing.menu .active.dropdown.item:after{visibility:hidden}.ui.pointing.menu .active.item .menu .active.item:after,.ui.pointing.menu .dropdown.active.item:after{display:none}.ui.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.pointing.menu .active.item:after{background-color:#f2f2f2}.ui.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .active.item:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .menu .active.item:after{background-color:#fff}.ui.inverted.pointing.menu .primary.active.item:after{background-color:#2185d0}.ui.inverted.pointing.menu .secondary.active.item:after{background-color:#1b1c1d}.ui.inverted.pointing.menu .red.active.item:after{background-color:#db2828}.ui.inverted.pointing.menu .orange.active.item:after{background-color:#f2711c}.ui.inverted.pointing.menu .yellow.active.item:after{background-color:#fbbd08}.ui.inverted.pointing.menu .olive.active.item:after{background-color:#b5cc18}.ui.inverted.pointing.menu .green.active.item:after{background-color:#21ba45}.ui.inverted.pointing.menu .teal.active.item:after{background-color:#00b5ad}.ui.inverted.pointing.menu .blue.active.item:after{background-color:#2185d0}.ui.inverted.pointing.menu .violet.active.item:after{background-color:#6435c9}.ui.inverted.pointing.menu .purple.active.item:after{background-color:#a333c8}.ui.inverted.pointing.menu .pink.active.item:after{background-color:#e03997}.ui.inverted.pointing.menu .brown.active.item:after{background-color:#a5673f}.ui.inverted.pointing.menu .grey.active.item:after{background-color:#767676}.ui.inverted.pointing.menu .black.active.item:after{background-color:#1b1c1d}.ui.attached.menu{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% + 2px);max-width:calc(100% + 2px);-webkit-box-shadow:none;box-shadow:none}.ui.attached+.ui.attached.menu:not(.top){border-top:none}.ui[class*="top attached"].menu{bottom:0;margin-bottom:0;top:0;margin-top:1rem;border-radius:.28571429rem .28571429rem 0 0}.ui.menu[class*="top attached"]:first-child{margin-top:0}.ui[class*="bottom attached"].menu{bottom:0;margin-top:0;top:0;margin-bottom:1rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui[class*="bottom attached"].menu:last-child{margin-bottom:0}.ui.top.attached.menu>.item:first-child{border-radius:.28571429rem 0 0 0}.ui.bottom.attached.menu>.item:first-child{border-radius:0 0 0 .28571429rem}.ui.attached.menu:not(.tabular){border:1px solid #d4d4d5}.ui.attached.inverted.menu{border:none}.ui.attached.tabular.menu{margin-left:0;margin-right:0;width:100%}.ui.menu{font-size:1rem}.ui.vertical.menu{width:15rem}.ui.mini.menu,.ui.mini.menu .dropdown,.ui.mini.menu .dropdown .menu>.item{font-size:.78571429rem}.ui.mini.vertical.menu:not(.icon){width:9rem}.ui.tiny.menu,.ui.tiny.menu .dropdown,.ui.tiny.menu .dropdown .menu>.item{font-size:.85714286rem}.ui.tiny.vertical.menu:not(.icon){width:11rem}.ui.small.menu,.ui.small.menu .dropdown,.ui.small.menu .dropdown .menu>.item{font-size:.92857143rem}.ui.small.vertical.menu:not(.icon){width:13rem}.ui.large.menu,.ui.large.menu .dropdown,.ui.large.menu .dropdown .menu>.item{font-size:1.07142857rem}.ui.large.vertical.menu:not(.icon){width:18rem}.ui.big.menu,.ui.big.menu .dropdown,.ui.big.menu .dropdown .menu>.item{font-size:1.14285714rem}.ui.big.vertical.menu:not(.icon){width:20rem}.ui.huge.menu,.ui.huge.menu .dropdown,.ui.huge.menu .dropdown .menu>.item{font-size:1.21428571rem}.ui.huge.vertical.menu:not(.icon){width:22rem}.ui.massive.menu,.ui.massive.menu .dropdown,.ui.massive.menu .dropdown .menu>.item{font-size:1.28571429rem}.ui.massive.vertical.menu:not(.icon){width:25rem}.ui.menu .ui.inverted.inverted.dropdown.item .menu{background:#1b1c1d;-webkit-box-shadow:none;box-shadow:none}.ui.menu .ui.inverted.dropdown .menu>.item{color:rgba(255,255,255,.8)!important}.ui.menu .ui.inverted.dropdown .menu>.active.item{background:0 0!important;color:rgba(255,255,255,.8)!important}.ui.menu .ui.inverted.dropdown .menu>.item:hover{background:rgba(255,255,255,.08)!important;color:rgba(255,255,255,.8)!important}.ui.menu .ui.inverted.dropdown .menu>.selected.item{background:rgba(255,255,255,.15)!important;color:rgba(255,255,255,.8)!important}.ui.vertical.menu .inverted.dropdown.item .menu{-webkit-box-shadow:none;box-shadow:none}/*! + * # Fomantic-UI - Message + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.message{position:relative;min-height:1em;margin:1em 0;background:#f8f8f9;padding:1em 1.5em;line-height:1.4285em;color:rgba(0,0,0,.87);-webkit-transition:opacity .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,color .1s ease,background .1s ease,box-shadow .1s ease;transition:opacity .1s ease,color .1s ease,background .1s ease,box-shadow .1s ease,-webkit-box-shadow .1s ease;border-radius:.28571429rem;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 0 0 0 transparent;box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 0 0 0 transparent}.ui.message:first-child{margin-top:0}.ui.message:last-child{margin-bottom:0}.ui.message .header{display:block;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;margin:-.14285714em 0 0 0}.ui.message .header:not(.ui){font-size:1.14285714em}.ui.message p{opacity:.85;margin:.75em 0}.ui.message p:first-child{margin-top:0}.ui.message p:last-child{margin-bottom:0}.ui.message .header+p{margin-top:.25em}.ui.message .list:not(.ui){text-align:left;padding:0;opacity:.85;list-style-position:inside;margin:.5em 0 0}.ui.message .list:not(.ui):first-child{margin-top:0}.ui.message .list:not(.ui):last-child{margin-bottom:0}.ui.message .list:not(.ui) li{position:relative;list-style-type:none;margin:0 0 .3em 1em;padding:0}.ui.message .list:not(.ui) li:before{position:absolute;content:'•';left:-1em;height:100%;vertical-align:baseline}.ui.message .list:not(.ui) li:last-child{margin-bottom:0}.ui.message>.icon{margin-right:.6em}.ui.message>.close.icon{cursor:pointer;position:absolute;margin:0;top:.78575em;right:.5em;opacity:.7;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.message>.close.icon:hover{opacity:1}.ui.message>:first-child{margin-top:0}.ui.message>:last-child{margin-bottom:0}.ui.dropdown .menu>.message{margin:0 -1px}.ui.visible.visible.visible.visible.message{display:block}.ui.icon.visible.visible.visible.visible.message{display:-webkit-box;display:-ms-flexbox;display:flex}.ui.hidden.hidden.hidden.hidden.message{display:none}.ui.compact.message{display:inline-block}.ui.compact.icon.message{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;width:auto}.ui.attached.message{margin-bottom:-1px;border-radius:.28571429rem .28571429rem 0 0;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;margin-left:-1px;margin-right:-1px}.ui.attached+.ui.attached.message:not(.top):not(.bottom){margin-top:-1px;border-radius:0}.ui.bottom.attached.message{margin-top:-1px;border-radius:0 0 .28571429rem .28571429rem;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset,0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px rgba(34,36,38,.15) inset,0 1px 2px 0 rgba(34,36,38,.15)}.ui.bottom.attached.message:not(:last-child){margin-bottom:1em}.ui.attached.icon.message{width:auto}.ui.icon.message{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.icon.message>.icon:not(.close){display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;line-height:1;vertical-align:middle;font-size:3em;opacity:.8}.ui.icon.message>.content{display:block;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;vertical-align:middle}.ui.icon.message .icon:not(.close)+.content{padding-left:0}.ui.icon.message .circular.icon{width:1em}.ui.floating.message{-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.positive.message{background-color:#fcfff5;color:#2c662d}.ui.attached.positive.message,.ui.positive.message{-webkit-box-shadow:0 0 0 1px #a3c293 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #a3c293 inset,0 0 0 0 transparent}.ui.floating.positive.message{-webkit-box-shadow:0 0 0 1px #a3c293 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #a3c293 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.positive.message .header{color:#1a531b}.ui.negative.message{background-color:#fff6f6;color:#9f3a38}.ui.attached.negative.message,.ui.negative.message{-webkit-box-shadow:0 0 0 1px #e0b4b4 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #e0b4b4 inset,0 0 0 0 transparent}.ui.floating.negative.message{-webkit-box-shadow:0 0 0 1px #e0b4b4 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #e0b4b4 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.negative.message .header{color:#912d2b}.ui.info.message{background-color:#f8ffff;color:#276f86}.ui.attached.info.message,.ui.info.message{-webkit-box-shadow:0 0 0 1px #a9d5de inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #a9d5de inset,0 0 0 0 transparent}.ui.floating.info.message{-webkit-box-shadow:0 0 0 1px #a9d5de inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #a9d5de inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.info.message .header{color:#0e566c}.ui.warning.message{background-color:#fffaf3;color:#573a08}.ui.attached.warning.message,.ui.warning.message{-webkit-box-shadow:0 0 0 1px #c9ba9b inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #c9ba9b inset,0 0 0 0 transparent}.ui.floating.warning.message{-webkit-box-shadow:0 0 0 1px #c9ba9b inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #c9ba9b inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.warning.message .header{color:#794b02}.ui.error.message{background-color:#fff6f6;color:#9f3a38}.ui.attached.error.message,.ui.error.message{-webkit-box-shadow:0 0 0 1px #e0b4b4 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #e0b4b4 inset,0 0 0 0 transparent}.ui.floating.error.message{-webkit-box-shadow:0 0 0 1px #e0b4b4 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #e0b4b4 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.error.message .header{color:#912d2b}.ui.success.message{background-color:#fcfff5;color:#2c662d}.ui.attached.success.message,.ui.success.message{-webkit-box-shadow:0 0 0 1px #a3c293 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #a3c293 inset,0 0 0 0 transparent}.ui.floating.success.message{-webkit-box-shadow:0 0 0 1px #a3c293 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #a3c293 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.success.message .header{color:#1a531b}.ui.primary.message{background-color:#dff0ff;color:rgba(255,255,255,.9)}.ui.attached.primary.message,.ui.primary.message{-webkit-box-shadow:0 0 0 1px #2185d0 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #2185d0 inset,0 0 0 0 transparent}.ui.floating.primary.message{-webkit-box-shadow:0 0 0 1px #2185d0 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #2185d0 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.primary.message .header{color:rgba(242,242,242,.9)}.ui.secondary.message{background-color:#f4f4f4;color:rgba(255,255,255,.9)}.ui.attached.secondary.message,.ui.secondary.message{-webkit-box-shadow:0 0 0 1px #1b1c1d inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #1b1c1d inset,0 0 0 0 transparent}.ui.floating.secondary.message{-webkit-box-shadow:0 0 0 1px #1b1c1d inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #1b1c1d inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.secondary.message .header{color:rgba(242,242,242,.9)}.ui.red.message{background-color:#ffe8e6;color:#db2828}.ui.attached.red.message,.ui.red.message{-webkit-box-shadow:0 0 0 1px #db2828 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #db2828 inset,0 0 0 0 transparent}.ui.floating.red.message{-webkit-box-shadow:0 0 0 1px #db2828 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #db2828 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.red.message .header{color:#c82121}.ui.orange.message{background-color:#ffedde;color:#f2711c}.ui.attached.orange.message,.ui.orange.message{-webkit-box-shadow:0 0 0 1px #f2711c inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #f2711c inset,0 0 0 0 transparent}.ui.floating.orange.message{-webkit-box-shadow:0 0 0 1px #f2711c inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #f2711c inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.orange.message .header{color:#e7640d}.ui.yellow.message{background-color:#fff8db;color:#b58105}.ui.attached.yellow.message,.ui.yellow.message{-webkit-box-shadow:0 0 0 1px #b58105 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #b58105 inset,0 0 0 0 transparent}.ui.floating.yellow.message{-webkit-box-shadow:0 0 0 1px #b58105 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #b58105 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.yellow.message .header{color:#9c6f04}.ui.olive.message{background-color:#fbfdef;color:#8abc1e}.ui.attached.olive.message,.ui.olive.message{-webkit-box-shadow:0 0 0 1px #8abc1e inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #8abc1e inset,0 0 0 0 transparent}.ui.floating.olive.message{-webkit-box-shadow:0 0 0 1px #8abc1e inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #8abc1e inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.olive.message .header{color:#7aa61a}.ui.green.message{background-color:#e5f9e7;color:#1ebc30}.ui.attached.green.message,.ui.green.message{-webkit-box-shadow:0 0 0 1px #1ebc30 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #1ebc30 inset,0 0 0 0 transparent}.ui.floating.green.message{-webkit-box-shadow:0 0 0 1px #1ebc30 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #1ebc30 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.green.message .header{color:#1aa62a}.ui.teal.message{background-color:#e1f7f7;color:#10a3a3}.ui.attached.teal.message,.ui.teal.message{-webkit-box-shadow:0 0 0 1px #10a3a3 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #10a3a3 inset,0 0 0 0 transparent}.ui.floating.teal.message{-webkit-box-shadow:0 0 0 1px #10a3a3 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #10a3a3 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.teal.message .header{color:#0e8c8c}.ui.blue.message{background-color:#dff0ff;color:#2185d0}.ui.attached.blue.message,.ui.blue.message{-webkit-box-shadow:0 0 0 1px #2185d0 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #2185d0 inset,0 0 0 0 transparent}.ui.floating.blue.message{-webkit-box-shadow:0 0 0 1px #2185d0 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #2185d0 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.blue.message .header{color:#1e77ba}.ui.violet.message{background-color:#eae7ff;color:#6435c9}.ui.attached.violet.message,.ui.violet.message{-webkit-box-shadow:0 0 0 1px #6435c9 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #6435c9 inset,0 0 0 0 transparent}.ui.floating.violet.message{-webkit-box-shadow:0 0 0 1px #6435c9 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #6435c9 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.violet.message .header{color:#5a30b5}.ui.purple.message{background-color:#f6e7ff;color:#a333c8}.ui.attached.purple.message,.ui.purple.message{-webkit-box-shadow:0 0 0 1px #a333c8 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #a333c8 inset,0 0 0 0 transparent}.ui.floating.purple.message{-webkit-box-shadow:0 0 0 1px #a333c8 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #a333c8 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.purple.message .header{color:#922eb4}.ui.pink.message{background-color:#ffe3fb;color:#e03997}.ui.attached.pink.message,.ui.pink.message{-webkit-box-shadow:0 0 0 1px #e03997 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #e03997 inset,0 0 0 0 transparent}.ui.floating.pink.message{-webkit-box-shadow:0 0 0 1px #e03997 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #e03997 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.pink.message .header{color:#dd238b}.ui.brown.message{background-color:#f1e2d3;color:#a5673f}.ui.attached.brown.message,.ui.brown.message{-webkit-box-shadow:0 0 0 1px #a5673f inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #a5673f inset,0 0 0 0 transparent}.ui.floating.brown.message{-webkit-box-shadow:0 0 0 1px #a5673f inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #a5673f inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.brown.message .header{color:#935b38}.ui.grey.message{background-color:#f4f4f4;color:#767676}.ui.attached.grey.message,.ui.grey.message{-webkit-box-shadow:0 0 0 1px #767676 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #767676 inset,0 0 0 0 transparent}.ui.floating.grey.message{-webkit-box-shadow:0 0 0 1px #767676 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #767676 inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.grey.message .header{color:#696969}.ui.black.message{background-color:#1b1c1d;color:rgba(255,255,255,.9)}.ui.black.message .header{color:rgba(255,255,255,.9)}.ui.inverted.message{background-color:#1b1c1d;color:rgba(255,255,255,.9)}.ui.message{font-size:1em}.ui.mini.message{font-size:.78571429em}.ui.tiny.message{font-size:.85714286em}.ui.small.message{font-size:.92857143em}.ui.large.message{font-size:1.14285714em}.ui.big.message{font-size:1.28571429em}.ui.huge.message{font-size:1.42857143em}.ui.massive.message{font-size:1.71428571em}/*! + * # Fomantic-UI - Table + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.table{width:100%;background:#fff;margin:1em 0;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none;box-shadow:none;border-radius:.28571429rem;text-align:left;vertical-align:middle;color:rgba(0,0,0,.87);border-collapse:separate;border-spacing:0}.ui.table:first-child{margin-top:0}.ui.table:last-child{margin-bottom:0}.ui.table>tbody,.ui.table>thead{text-align:inherit;vertical-align:inherit}.ui.table td,.ui.table th{-webkit-transition:background .1s ease,color .1s ease;transition:background .1s ease,color .1s ease}.ui.table>thead{-webkit-box-shadow:none;box-shadow:none}.ui.table>thead>tr>th{cursor:auto;background:#f9fafb;text-align:inherit;color:rgba(0,0,0,.87);padding:.92857143em .78571429em;vertical-align:inherit;font-style:none;font-weight:700;text-transform:none;border-bottom:1px solid rgba(34,36,38,.1);border-left:none}.ui.table>thead>tr>th:first-child{border-left:none}.ui.table>thead>tr:first-child>th:first-child{border-radius:.28571429rem 0 0 0}.ui.table>thead>tr:first-child>th:last-child{border-radius:0 .28571429rem 0 0}.ui.table>thead>tr:first-child>th:only-child{border-radius:.28571429rem .28571429rem 0 0}.ui.table>tfoot{-webkit-box-shadow:none;box-shadow:none}.ui.table>tfoot>tr>td,.ui.table>tfoot>tr>th{cursor:auto;border-top:1px solid rgba(34,36,38,.15);background:#f9fafb;text-align:inherit;color:rgba(0,0,0,.87);padding:.78571429em .78571429em;vertical-align:middle;font-style:normal;font-weight:400;text-transform:none}.ui.table>tfoot>tr>td:first-child,.ui.table>tfoot>tr>th:first-child{border-left:none}.ui.table>tfoot>tr:first-child>td:first-child,.ui.table>tfoot>tr:first-child>th:first-child{border-radius:0 0 0 .28571429rem}.ui.table>tfoot>tr:first-child>td:last-child,.ui.table>tfoot>tr:first-child>th:last-child{border-radius:0 0 .28571429rem 0}.ui.table>tfoot>tr:first-child>td:only-child,.ui.table>tfoot>tr:first-child>th:only-child{border-radius:0 0 .28571429rem .28571429rem}.ui.table>tbody>tr>td,.ui.table>tr>td{border-top:1px solid rgba(34,36,38,.1)}.ui.table>tbody>tr:first-child>td,.ui.table>tr:first-child>td{border-top:none}.ui.table>tbody+tbody tr:first-child>td{border-top:1px solid rgba(34,36,38,.1)}.ui.table>tbody>tr>td,.ui.table>tr>td{padding:.78571429em .78571429em;text-align:inherit}.ui.table>.icon{vertical-align:baseline}.ui.table>.icon:only-child{margin:0}.ui.table.segment{padding:0}.ui.table.segment:after{display:none}.ui.table.segment.stacked:after{display:block}@media only screen and (max-width:767.98px){.ui.table:not(.unstackable){width:100%;padding:0}.ui.table:not(.unstackable)>tbody,.ui.table:not(.unstackable)>tbody>tr,.ui.table:not(.unstackable)>tbody>tr>td,.ui.table:not(.unstackable)>tbody>tr>th,.ui.table:not(.unstackable)>tfoot,.ui.table:not(.unstackable)>tfoot>tr,.ui.table:not(.unstackable)>tfoot>tr>td,.ui.table:not(.unstackable)>tfoot>tr>th,.ui.table:not(.unstackable)>thead,.ui.table:not(.unstackable)>thead>tr,.ui.table:not(.unstackable)>thead>tr>th,.ui.table:not(.unstackable)>tr,.ui.table:not(.unstackable)>tr>td,.ui.table:not(.unstackable)>tr>th{display:block!important;width:auto!important}.ui.table:not(.unstackable)>thead{display:block}.ui.table:not(.unstackable)>tfoot{display:block}.ui.ui.ui.ui.table:not(.unstackable)>tbody>tr,.ui.ui.ui.ui.table:not(.unstackable)>tfoot>tr,.ui.ui.ui.ui.table:not(.unstackable)>thead>tr,.ui.ui.ui.ui.table:not(.unstackable)>tr{padding-top:1em;padding-bottom:1em;-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset}.ui.ui.ui.ui.table:not(.unstackable)>tbody>tr>td,.ui.ui.ui.ui.table:not(.unstackable)>tbody>tr>th,.ui.ui.ui.ui.table:not(.unstackable)>tfoot>tr>td,.ui.ui.ui.ui.table:not(.unstackable)>tfoot>tr>th,.ui.ui.ui.ui.table:not(.unstackable)>thead>tr>th,.ui.ui.ui.ui.table:not(.unstackable)>tr>td,.ui.ui.ui.ui.table:not(.unstackable)>tr>th{background:0 0;border:none;padding:.25em .75em;-webkit-box-shadow:none;box-shadow:none}.ui.table:not(.unstackable)>tbody>tr>td:first-child,.ui.table:not(.unstackable)>tbody>tr>th:first-child,.ui.table:not(.unstackable)>tfoot>tr>td:first-child,.ui.table:not(.unstackable)>tfoot>tr>th:first-child,.ui.table:not(.unstackable)>thead>tr>th:first-child,.ui.table:not(.unstackable)>tr>td:first-child,.ui.table:not(.unstackable)>tr>th:first-child{font-weight:700}.ui.definition.table:not(.unstackable)>thead>tr>th:first-child{-webkit-box-shadow:none!important;box-shadow:none!important}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.primary.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2185d0 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2185d0 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.primary.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2185d0 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2185d0 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.primary.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #54c8ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #54c8ff inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.primary.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #54c8ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #54c8ff inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.secondary.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #1b1c1d inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #1b1c1d inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.secondary.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #1b1c1d inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #1b1c1d inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.secondary.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #545454 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #545454 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.secondary.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #545454 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #545454 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.red.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #db2828 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #db2828 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.red.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #db2828 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #db2828 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.red.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff695e inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff695e inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.red.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff695e inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff695e inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.orange.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #f2711c inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #f2711c inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.orange.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #f2711c inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #f2711c inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.orange.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff851b inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff851b inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.orange.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff851b inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff851b inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.yellow.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #fbbd08 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #fbbd08 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.yellow.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #fbbd08 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #fbbd08 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.yellow.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ffe21f inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ffe21f inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.yellow.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ffe21f inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ffe21f inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.olive.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #b5cc18 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #b5cc18 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.olive.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #b5cc18 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #b5cc18 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.olive.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #d9e778 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #d9e778 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.olive.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #d9e778 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #d9e778 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.green.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #21ba45 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #21ba45 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.green.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #21ba45 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #21ba45 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.green.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2ecc40 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2ecc40 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.green.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2ecc40 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2ecc40 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.teal.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #00b5ad inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #00b5ad inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.teal.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #00b5ad inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #00b5ad inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.teal.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #6dffff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #6dffff inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.teal.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #6dffff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #6dffff inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.blue.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2185d0 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2185d0 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.blue.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2185d0 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2185d0 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.blue.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #54c8ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #54c8ff inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.blue.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #54c8ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #54c8ff inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.violet.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #6435c9 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #6435c9 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.violet.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #6435c9 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #6435c9 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.violet.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a291fb inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a291fb inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.violet.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a291fb inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a291fb inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.purple.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a333c8 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a333c8 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.purple.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a333c8 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a333c8 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.purple.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #dc73ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #dc73ff inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.purple.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #dc73ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #dc73ff inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.pink.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #e03997 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #e03997 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.pink.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #e03997 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #e03997 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.pink.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff8edf inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff8edf inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.pink.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff8edf inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff8edf inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.brown.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a5673f inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a5673f inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.brown.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a5673f inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a5673f inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.brown.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #d67c1c inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #d67c1c inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.brown.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #d67c1c inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #d67c1c inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.grey.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #767676 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #767676 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.grey.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #767676 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #767676 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.grey.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #dcddde inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #dcddde inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.grey.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #dcddde inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #dcddde inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.black.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #1b1c1d inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #1b1c1d inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.black.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #1b1c1d inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #1b1c1d inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.black.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #545454 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #545454 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.black.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #545454 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #545454 inset}}.ui.table .collapsing .image,.ui.table .collapsing .image img{max-width:none}.ui.structured.table{border-collapse:collapse}.ui.structured.table>thead>tr>th{border-left:none;border-right:none}.ui.structured.sortable.table>thead>tr>th{border-left:1px solid rgba(34,36,38,.15);border-right:1px solid rgba(34,36,38,.15)}.ui.structured.basic.table>tbody>tr>th,.ui.structured.basic.table>tfoot>tr>th,.ui.structured.basic.table>thead>tr>th,.ui.structured.basic.table>tr>th{border-left:none;border-right:none}.ui.structured.celled.table>tbody>tr>td,.ui.structured.celled.table>tbody>tr>th,.ui.structured.celled.table>tfoot>tr>td,.ui.structured.celled.table>tfoot>tr>th,.ui.structured.celled.table>thead>tr>th,.ui.structured.celled.table>tr>td,.ui.structured.celled.table>tr>th{border-left:1px solid rgba(34,36,38,.1);border-right:1px solid rgba(34,36,38,.1)}.ui.definition.table>thead:not(.full-width)>tr>th:first-child{pointer-events:none;background:#fff;font-weight:400;color:rgba(0,0,0,.4);-webkit-box-shadow:-.1em -.2em 0 .1em #fff;box-shadow:-.1em -.2em 0 .1em #fff;-moz-transform:scale(1)}.ui.definition.table>tfoot:not(.full-width)>tr>th:first-child{pointer-events:none;background:#fff;font-weight:400;color:rgba(0,0,0,.4);-webkit-box-shadow:-.1em .2em 0 .1em #fff;box-shadow:-.1em .2em 0 .1em #fff;-moz-transform:scale(1)}.ui.definition.table tr td.definition,.ui.definition.table>tbody>tr>td:first-child:not(.ignored),.ui.definition.table>tfoot>tr>td:first-child:not(.ignored),.ui.definition.table>tr>td:first-child:not(.ignored){background:rgba(0,0,0,.03);font-weight:700;color:rgba(0,0,0,.95);text-transform:'';-webkit-box-shadow:'';box-shadow:'';text-align:'';font-size:1em;padding-left:'';padding-right:''}.ui.definition.table>thead:not(.full-width)>tr>th:nth-child(2){border-left:1px solid rgba(34,36,38,.15)}.ui.definition.table>tfoot:not(.full-width)>tr>td:nth-child(2),.ui.definition.table>tfoot:not(.full-width)>tr>th:nth-child(2){border-left:1px solid rgba(34,36,38,.15)}.ui.definition.table>tbody>tr>td:nth-child(2),.ui.definition.table>tr>td:nth-child(2){border-left:1px solid rgba(34,36,38,.15)}.ui.ui.table td.positive,.ui.ui.ui.ui.table tr.positive{-webkit-box-shadow:0 0 0 #a3c293 inset;box-shadow:0 0 0 #a3c293 inset;background:#fcfff5;color:#2c662d}.ui.ui.table td.negative,.ui.ui.ui.ui.table tr.negative{-webkit-box-shadow:0 0 0 #e0b4b4 inset;box-shadow:0 0 0 #e0b4b4 inset;background:#fff6f6;color:#9f3a38}.ui.ui.table td.error,.ui.ui.ui.ui.table tr.error{-webkit-box-shadow:0 0 0 #e0b4b4 inset;box-shadow:0 0 0 #e0b4b4 inset;background:#fff6f6;color:#9f3a38}.ui.ui.table td.warning,.ui.ui.ui.ui.table tr.warning{-webkit-box-shadow:0 0 0 #c9ba9b inset;box-shadow:0 0 0 #c9ba9b inset;background:#fffaf3;color:#573a08}.ui.ui.table td.active,.ui.ui.ui.ui.table tr.active{-webkit-box-shadow:0 0 0 rgba(0,0,0,.87) inset;box-shadow:0 0 0 rgba(0,0,0,.87) inset;background:#e0e0e0;color:rgba(0,0,0,.87)}.ui.table tr td.disabled,.ui.table tr.disabled td,.ui.table tr.disabled:hover,.ui.table tr:hover td.disabled{pointer-events:none;color:rgba(40,40,40,.3)}@media only screen and (max-width:991.98px){.ui[class*="tablet stackable"].table,.ui[class*="tablet stackable"].table>tbody,.ui[class*="tablet stackable"].table>tbody>tr,.ui[class*="tablet stackable"].table>tbody>tr>td,.ui[class*="tablet stackable"].table>tbody>tr>th,.ui[class*="tablet stackable"].table>tfoot,.ui[class*="tablet stackable"].table>tfoot>tr,.ui[class*="tablet stackable"].table>tfoot>tr>td,.ui[class*="tablet stackable"].table>tfoot>tr>th,.ui[class*="tablet stackable"].table>thead,.ui[class*="tablet stackable"].table>thead>tr,.ui[class*="tablet stackable"].table>thead>tr>th,.ui[class*="tablet stackable"].table>tr,.ui[class*="tablet stackable"].table>tr>td,.ui[class*="tablet stackable"].table>tr>th{display:block!important;width:100%!important}.ui[class*="tablet stackable"].table{padding:0}.ui[class*="tablet stackable"].table>thead{display:block}.ui[class*="tablet stackable"].table>tfoot{display:block}.ui.ui.ui.ui[class*="tablet stackable"].table>tbody>tr,.ui.ui.ui.ui[class*="tablet stackable"].table>tfoot>tr,.ui.ui.ui.ui[class*="tablet stackable"].table>thead>tr,.ui.ui.ui.ui[class*="tablet stackable"].table>tr{padding-top:1em;padding-bottom:1em;-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset}.ui[class*="tablet stackable"].table>tbody>tr>td,.ui[class*="tablet stackable"].table>tbody>tr>th,.ui[class*="tablet stackable"].table>tfoot>tr>td,.ui[class*="tablet stackable"].table>tfoot>tr>th,.ui[class*="tablet stackable"].table>thead>tr>th,.ui[class*="tablet stackable"].table>tr>td,.ui[class*="tablet stackable"].table>tr>th{background:0 0;border:none!important;padding:.25em .75em;-webkit-box-shadow:none;box-shadow:none}.ui.definition[class*="tablet stackable"].table>thead>tr>th:first-child{-webkit-box-shadow:none!important;box-shadow:none!important}}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.primary.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2185d0 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2185d0 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.primary.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2185d0 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2185d0 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.primary.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #54c8ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #54c8ff inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.primary.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #54c8ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #54c8ff inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.secondary.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #1b1c1d inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #1b1c1d inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.secondary.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #1b1c1d inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #1b1c1d inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.secondary.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #545454 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #545454 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.secondary.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #545454 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #545454 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.red.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #db2828 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #db2828 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.red.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #db2828 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #db2828 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.red.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff695e inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff695e inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.red.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff695e inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff695e inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.orange.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #f2711c inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #f2711c inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.orange.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #f2711c inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #f2711c inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.orange.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff851b inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff851b inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.orange.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff851b inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff851b inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.yellow.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #fbbd08 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #fbbd08 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.yellow.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #fbbd08 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #fbbd08 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.yellow.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ffe21f inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ffe21f inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.yellow.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ffe21f inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ffe21f inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.olive.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #b5cc18 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #b5cc18 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.olive.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #b5cc18 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #b5cc18 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.olive.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #d9e778 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #d9e778 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.olive.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #d9e778 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #d9e778 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.green.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #21ba45 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #21ba45 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.green.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #21ba45 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #21ba45 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.green.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2ecc40 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2ecc40 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.green.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2ecc40 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2ecc40 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.teal.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #00b5ad inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #00b5ad inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.teal.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #00b5ad inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #00b5ad inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.teal.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #6dffff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #6dffff inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.teal.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #6dffff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #6dffff inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.blue.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2185d0 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2185d0 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.blue.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2185d0 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2185d0 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.blue.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #54c8ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #54c8ff inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.blue.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #54c8ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #54c8ff inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.violet.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #6435c9 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #6435c9 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.violet.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #6435c9 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #6435c9 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.violet.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a291fb inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a291fb inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.violet.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a291fb inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a291fb inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.purple.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a333c8 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a333c8 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.purple.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a333c8 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a333c8 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.purple.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #dc73ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #dc73ff inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.purple.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #dc73ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #dc73ff inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.pink.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #e03997 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #e03997 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.pink.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #e03997 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #e03997 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.pink.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff8edf inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff8edf inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.pink.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff8edf inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff8edf inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.brown.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a5673f inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a5673f inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.brown.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a5673f inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a5673f inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.brown.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #d67c1c inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #d67c1c inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.brown.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #d67c1c inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #d67c1c inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.grey.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #767676 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #767676 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.grey.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #767676 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #767676 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.grey.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #dcddde inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #dcddde inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.grey.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #dcddde inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #dcddde inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.black.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #1b1c1d inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #1b1c1d inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.black.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #1b1c1d inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #1b1c1d inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.black.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #545454 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #545454 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.black.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #545454 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #545454 inset}.ui.table [class*="left aligned"],.ui.table[class*="left aligned"]{text-align:left}.ui.table [class*="center aligned"],.ui.table[class*="center aligned"]{text-align:center}.ui.table [class*="right aligned"],.ui.table[class*="right aligned"]{text-align:right}.ui.table [class*="top aligned"],.ui.table[class*="top aligned"]{vertical-align:top}.ui.table [class*="middle aligned"],.ui.table[class*="middle aligned"]{vertical-align:middle}.ui.table [class*="bottom aligned"],.ui.table[class*="bottom aligned"]{vertical-align:bottom}.ui.table td.collapsing,.ui.table th.collapsing{width:1px;white-space:nowrap}.ui.fixed.table{table-layout:fixed}.ui.fixed.table td,.ui.fixed.table th{overflow:hidden;text-overflow:ellipsis}.ui.table tbody tr td.selectable:hover,.ui.ui.selectable.table>tbody>tr:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.inverted.table tbody tr td.selectable:hover,.ui.ui.selectable.inverted.table>tbody>tr:hover{background:rgba(255,255,255,.08);color:#fff}.ui.table tbody tr td.selectable{padding:0}.ui.table tbody tr td.selectable>a:not(.ui){display:block;color:inherit;padding:.78571429em .78571429em}.ui.selectable.table>tbody>tr,.ui.selectable.table>tr,.ui.table>tbody>tr>td.selectable,.ui.table>tr>td.selectable{cursor:pointer}.ui.selectable.table tr:hover td.error,.ui.table tr td.selectable.error:hover,.ui.ui.selectable.table tr.error:hover{background:#ffe7e7;color:#943634}.ui.selectable.table tr:hover td.warning,.ui.table tr td.selectable.warning:hover,.ui.ui.selectable.table tr.warning:hover{background:#fff4e4;color:#493107}.ui.selectable.table tr:hover td.active,.ui.table tr td.selectable.active:hover,.ui.ui.selectable.table tr.active:hover{background:#e0e0e0;color:rgba(0,0,0,.87)}.ui.selectable.table tr:hover td.positive,.ui.table tr td.selectable.positive:hover,.ui.ui.selectable.table tr.positive:hover{background:#f7ffe6;color:#275b28}.ui.selectable.table tr:hover td.negative,.ui.table tr td.selectable.negative:hover,.ui.ui.selectable.table tr.negative:hover{background:#ffe7e7;color:#943634}.ui.attached.table{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% + 2px);max-width:calc(100% + 2px);-webkit-box-shadow:none;box-shadow:none;border:1px solid #d4d4d5}.ui.attached+.ui.attached.table:not(.top){border-top:none}.ui[class*="top attached"].table{bottom:0;margin-bottom:0;top:0;margin-top:1em;border-radius:.28571429rem .28571429rem 0 0}.ui.table[class*="top attached"]:first-child{margin-top:0}.ui[class*="bottom attached"].table{bottom:0;margin-top:0;top:0;margin-bottom:1em;-webkit-box-shadow:none,none;box-shadow:none,none;border-radius:0 0 .28571429rem .28571429rem}.ui[class*="bottom attached"].table:last-child{margin-bottom:0}.ui.striped.table>tbody>tr:nth-child(2n),.ui.striped.table>tr:nth-child(2n){background-color:rgba(0,0,50,.02)}.ui.inverted.striped.table>tbody>tr:nth-child(2n),.ui.inverted.striped.table>tr:nth-child(2n){background-color:rgba(255,255,255,.05)}.ui.striped.selectable.selectable.selectable.table tbody tr.active:hover{background:#efefef;color:rgba(0,0,0,.95)}.ui.table [class*="single line"],.ui.table[class*="single line"]{white-space:nowrap}.ui.primary.table{border-top:.2em solid #2185d0}.ui.inverted.primary.table{background-color:#2185d0;color:#fff}.ui.ui.table td.primary:not(.marked),.ui.ui.ui.ui.table tr.primary:not(.marked){background:#ddf4ff;color:rgba(255,255,255,.9)}.ui.selectable.table tr:hover td.primary:not(.marked),.ui.table tr td.selectable.primary:not(.marked):hover,.ui.ui.selectable.table tr.primary:not(.marked):hover{background:#d3f1ff;color:rgba(255,255,255,.9)}.ui.table td.marked.primary.left,.ui.table tr.marked.primary.left{-webkit-box-shadow:.2em 0 0 0 #2185d0 inset;box-shadow:.2em 0 0 0 #2185d0 inset}.ui.table td.marked.primary.right,.ui.table tr.marked.primary.right{-webkit-box-shadow:-.2em 0 0 0 #2185d0 inset;box-shadow:-.2em 0 0 0 #2185d0 inset}.ui.inverted.table td.marked.primary.left,.ui.inverted.table tr.marked.primary.left{-webkit-box-shadow:.2em 0 0 0 #54c8ff inset;box-shadow:.2em 0 0 0 #54c8ff inset}.ui.inverted.table td.marked.primary.right,.ui.inverted.table tr.marked.primary.right{-webkit-box-shadow:-.2em 0 0 0 #54c8ff inset;box-shadow:-.2em 0 0 0 #54c8ff inset}.ui.secondary.table{border-top:.2em solid #1b1c1d}.ui.inverted.secondary.table{background-color:#1b1c1d;color:#fff}.ui.ui.table td.secondary:not(.marked),.ui.ui.ui.ui.table tr.secondary:not(.marked){background:#ddd;color:rgba(255,255,255,.9)}.ui.selectable.table tr:hover td.secondary:not(.marked),.ui.table tr td.selectable.secondary:not(.marked):hover,.ui.ui.selectable.table tr.secondary:not(.marked):hover{background:#e2e2e2;color:rgba(255,255,255,.9)}.ui.table td.marked.secondary.left,.ui.table tr.marked.secondary.left{-webkit-box-shadow:.2em 0 0 0 #1b1c1d inset;box-shadow:.2em 0 0 0 #1b1c1d inset}.ui.table td.marked.secondary.right,.ui.table tr.marked.secondary.right{-webkit-box-shadow:-.2em 0 0 0 #1b1c1d inset;box-shadow:-.2em 0 0 0 #1b1c1d inset}.ui.inverted.table td.marked.secondary.left,.ui.inverted.table tr.marked.secondary.left{-webkit-box-shadow:.2em 0 0 0 #545454 inset;box-shadow:.2em 0 0 0 #545454 inset}.ui.inverted.table td.marked.secondary.right,.ui.inverted.table tr.marked.secondary.right{-webkit-box-shadow:-.2em 0 0 0 #545454 inset;box-shadow:-.2em 0 0 0 #545454 inset}.ui.red.table{border-top:.2em solid #db2828}.ui.inverted.red.table{background-color:#db2828;color:#fff}.ui.ui.table td.red:not(.marked),.ui.ui.ui.ui.table tr.red:not(.marked){background:#ffe1df;color:#db2828}.ui.selectable.table tr:hover td.red:not(.marked),.ui.table tr td.selectable.red:not(.marked):hover,.ui.ui.selectable.table tr.red:not(.marked):hover{background:#ffd7d5;color:#db2828}.ui.table td.marked.red.left,.ui.table tr.marked.red.left{-webkit-box-shadow:.2em 0 0 0 #db2828 inset;box-shadow:.2em 0 0 0 #db2828 inset}.ui.table td.marked.red.right,.ui.table tr.marked.red.right{-webkit-box-shadow:-.2em 0 0 0 #db2828 inset;box-shadow:-.2em 0 0 0 #db2828 inset}.ui.inverted.table td.marked.red.left,.ui.inverted.table tr.marked.red.left{-webkit-box-shadow:.2em 0 0 0 #ff695e inset;box-shadow:.2em 0 0 0 #ff695e inset}.ui.inverted.table td.marked.red.right,.ui.inverted.table tr.marked.red.right{-webkit-box-shadow:-.2em 0 0 0 #ff695e inset;box-shadow:-.2em 0 0 0 #ff695e inset}.ui.orange.table{border-top:.2em solid #f2711c}.ui.inverted.orange.table{background-color:#f2711c;color:#fff}.ui.ui.table td.orange:not(.marked),.ui.ui.ui.ui.table tr.orange:not(.marked){background:#ffe7d1;color:#f2711c}.ui.selectable.table tr:hover td.orange:not(.marked),.ui.table tr td.selectable.orange:not(.marked):hover,.ui.ui.selectable.table tr.orange:not(.marked):hover{background:#fae1cc;color:#f2711c}.ui.table td.marked.orange.left,.ui.table tr.marked.orange.left{-webkit-box-shadow:.2em 0 0 0 #f2711c inset;box-shadow:.2em 0 0 0 #f2711c inset}.ui.table td.marked.orange.right,.ui.table tr.marked.orange.right{-webkit-box-shadow:-.2em 0 0 0 #f2711c inset;box-shadow:-.2em 0 0 0 #f2711c inset}.ui.inverted.table td.marked.orange.left,.ui.inverted.table tr.marked.orange.left{-webkit-box-shadow:.2em 0 0 0 #ff851b inset;box-shadow:.2em 0 0 0 #ff851b inset}.ui.inverted.table td.marked.orange.right,.ui.inverted.table tr.marked.orange.right{-webkit-box-shadow:-.2em 0 0 0 #ff851b inset;box-shadow:-.2em 0 0 0 #ff851b inset}.ui.yellow.table{border-top:.2em solid #fbbd08}.ui.inverted.yellow.table{background-color:#fbbd08;color:#fff}.ui.ui.table td.yellow:not(.marked),.ui.ui.ui.ui.table tr.yellow:not(.marked){background:#fff9d2;color:#b58105}.ui.selectable.table tr:hover td.yellow:not(.marked),.ui.table tr td.selectable.yellow:not(.marked):hover,.ui.ui.selectable.table tr.yellow:not(.marked):hover{background:#fbf5cc;color:#b58105}.ui.table td.marked.yellow.left,.ui.table tr.marked.yellow.left{-webkit-box-shadow:.2em 0 0 0 #fbbd08 inset;box-shadow:.2em 0 0 0 #fbbd08 inset}.ui.table td.marked.yellow.right,.ui.table tr.marked.yellow.right{-webkit-box-shadow:-.2em 0 0 0 #fbbd08 inset;box-shadow:-.2em 0 0 0 #fbbd08 inset}.ui.inverted.table td.marked.yellow.left,.ui.inverted.table tr.marked.yellow.left{-webkit-box-shadow:.2em 0 0 0 #ffe21f inset;box-shadow:.2em 0 0 0 #ffe21f inset}.ui.inverted.table td.marked.yellow.right,.ui.inverted.table tr.marked.yellow.right{-webkit-box-shadow:-.2em 0 0 0 #ffe21f inset;box-shadow:-.2em 0 0 0 #ffe21f inset}.ui.olive.table{border-top:.2em solid #b5cc18}.ui.inverted.olive.table{background-color:#b5cc18;color:#fff}.ui.ui.table td.olive:not(.marked),.ui.ui.ui.ui.table tr.olive:not(.marked){background:#f7fae4;color:#8abc1e}.ui.selectable.table tr:hover td.olive:not(.marked),.ui.table tr td.selectable.olive:not(.marked):hover,.ui.ui.selectable.table tr.olive:not(.marked):hover{background:#f6fada;color:#8abc1e}.ui.table td.marked.olive.left,.ui.table tr.marked.olive.left{-webkit-box-shadow:.2em 0 0 0 #b5cc18 inset;box-shadow:.2em 0 0 0 #b5cc18 inset}.ui.table td.marked.olive.right,.ui.table tr.marked.olive.right{-webkit-box-shadow:-.2em 0 0 0 #b5cc18 inset;box-shadow:-.2em 0 0 0 #b5cc18 inset}.ui.inverted.table td.marked.olive.left,.ui.inverted.table tr.marked.olive.left{-webkit-box-shadow:.2em 0 0 0 #d9e778 inset;box-shadow:.2em 0 0 0 #d9e778 inset}.ui.inverted.table td.marked.olive.right,.ui.inverted.table tr.marked.olive.right{-webkit-box-shadow:-.2em 0 0 0 #d9e778 inset;box-shadow:-.2em 0 0 0 #d9e778 inset}.ui.green.table{border-top:.2em solid #21ba45}.ui.inverted.green.table{background-color:#21ba45;color:#fff}.ui.ui.table td.green:not(.marked),.ui.ui.ui.ui.table tr.green:not(.marked){background:#d5f5d9;color:#1ebc30}.ui.selectable.table tr:hover td.green:not(.marked),.ui.table tr td.selectable.green:not(.marked):hover,.ui.ui.selectable.table tr.green:not(.marked):hover{background:#d2eed5;color:#1ebc30}.ui.table td.marked.green.left,.ui.table tr.marked.green.left{-webkit-box-shadow:.2em 0 0 0 #21ba45 inset;box-shadow:.2em 0 0 0 #21ba45 inset}.ui.table td.marked.green.right,.ui.table tr.marked.green.right{-webkit-box-shadow:-.2em 0 0 0 #21ba45 inset;box-shadow:-.2em 0 0 0 #21ba45 inset}.ui.inverted.table td.marked.green.left,.ui.inverted.table tr.marked.green.left{-webkit-box-shadow:.2em 0 0 0 #2ecc40 inset;box-shadow:.2em 0 0 0 #2ecc40 inset}.ui.inverted.table td.marked.green.right,.ui.inverted.table tr.marked.green.right{-webkit-box-shadow:-.2em 0 0 0 #2ecc40 inset;box-shadow:-.2em 0 0 0 #2ecc40 inset}.ui.teal.table{border-top:.2em solid #00b5ad}.ui.inverted.teal.table{background-color:#00b5ad;color:#fff}.ui.ui.table td.teal:not(.marked),.ui.ui.ui.ui.table tr.teal:not(.marked){background:#e2ffff;color:#10a3a3}.ui.selectable.table tr:hover td.teal:not(.marked),.ui.table tr td.selectable.teal:not(.marked):hover,.ui.ui.selectable.table tr.teal:not(.marked):hover{background:#d8ffff;color:#10a3a3}.ui.table td.marked.teal.left,.ui.table tr.marked.teal.left{-webkit-box-shadow:.2em 0 0 0 #00b5ad inset;box-shadow:.2em 0 0 0 #00b5ad inset}.ui.table td.marked.teal.right,.ui.table tr.marked.teal.right{-webkit-box-shadow:-.2em 0 0 0 #00b5ad inset;box-shadow:-.2em 0 0 0 #00b5ad inset}.ui.inverted.table td.marked.teal.left,.ui.inverted.table tr.marked.teal.left{-webkit-box-shadow:.2em 0 0 0 #6dffff inset;box-shadow:.2em 0 0 0 #6dffff inset}.ui.inverted.table td.marked.teal.right,.ui.inverted.table tr.marked.teal.right{-webkit-box-shadow:-.2em 0 0 0 #6dffff inset;box-shadow:-.2em 0 0 0 #6dffff inset}.ui.blue.table{border-top:.2em solid #2185d0}.ui.inverted.blue.table{background-color:#2185d0;color:#fff}.ui.ui.table td.blue:not(.marked),.ui.ui.ui.ui.table tr.blue:not(.marked){background:#ddf4ff;color:#2185d0}.ui.selectable.table tr:hover td.blue:not(.marked),.ui.table tr td.selectable.blue:not(.marked):hover,.ui.ui.selectable.table tr.blue:not(.marked):hover{background:#d3f1ff;color:#2185d0}.ui.table td.marked.blue.left,.ui.table tr.marked.blue.left{-webkit-box-shadow:.2em 0 0 0 #2185d0 inset;box-shadow:.2em 0 0 0 #2185d0 inset}.ui.table td.marked.blue.right,.ui.table tr.marked.blue.right{-webkit-box-shadow:-.2em 0 0 0 #2185d0 inset;box-shadow:-.2em 0 0 0 #2185d0 inset}.ui.inverted.table td.marked.blue.left,.ui.inverted.table tr.marked.blue.left{-webkit-box-shadow:.2em 0 0 0 #54c8ff inset;box-shadow:.2em 0 0 0 #54c8ff inset}.ui.inverted.table td.marked.blue.right,.ui.inverted.table tr.marked.blue.right{-webkit-box-shadow:-.2em 0 0 0 #54c8ff inset;box-shadow:-.2em 0 0 0 #54c8ff inset}.ui.violet.table{border-top:.2em solid #6435c9}.ui.inverted.violet.table{background-color:#6435c9;color:#fff}.ui.ui.table td.violet:not(.marked),.ui.ui.ui.ui.table tr.violet:not(.marked){background:#ece9fe;color:#6435c9}.ui.selectable.table tr:hover td.violet:not(.marked),.ui.table tr td.selectable.violet:not(.marked):hover,.ui.ui.selectable.table tr.violet:not(.marked):hover{background:#e3deff;color:#6435c9}.ui.table td.marked.violet.left,.ui.table tr.marked.violet.left{-webkit-box-shadow:.2em 0 0 0 #6435c9 inset;box-shadow:.2em 0 0 0 #6435c9 inset}.ui.table td.marked.violet.right,.ui.table tr.marked.violet.right{-webkit-box-shadow:-.2em 0 0 0 #6435c9 inset;box-shadow:-.2em 0 0 0 #6435c9 inset}.ui.inverted.table td.marked.violet.left,.ui.inverted.table tr.marked.violet.left{-webkit-box-shadow:.2em 0 0 0 #a291fb inset;box-shadow:.2em 0 0 0 #a291fb inset}.ui.inverted.table td.marked.violet.right,.ui.inverted.table tr.marked.violet.right{-webkit-box-shadow:-.2em 0 0 0 #a291fb inset;box-shadow:-.2em 0 0 0 #a291fb inset}.ui.purple.table{border-top:.2em solid #a333c8}.ui.inverted.purple.table{background-color:#a333c8;color:#fff}.ui.ui.table td.purple:not(.marked),.ui.ui.ui.ui.table tr.purple:not(.marked){background:#f8e3ff;color:#a333c8}.ui.selectable.table tr:hover td.purple:not(.marked),.ui.table tr td.selectable.purple:not(.marked):hover,.ui.ui.selectable.table tr.purple:not(.marked):hover{background:#f5d9ff;color:#a333c8}.ui.table td.marked.purple.left,.ui.table tr.marked.purple.left{-webkit-box-shadow:.2em 0 0 0 #a333c8 inset;box-shadow:.2em 0 0 0 #a333c8 inset}.ui.table td.marked.purple.right,.ui.table tr.marked.purple.right{-webkit-box-shadow:-.2em 0 0 0 #a333c8 inset;box-shadow:-.2em 0 0 0 #a333c8 inset}.ui.inverted.table td.marked.purple.left,.ui.inverted.table tr.marked.purple.left{-webkit-box-shadow:.2em 0 0 0 #dc73ff inset;box-shadow:.2em 0 0 0 #dc73ff inset}.ui.inverted.table td.marked.purple.right,.ui.inverted.table tr.marked.purple.right{-webkit-box-shadow:-.2em 0 0 0 #dc73ff inset;box-shadow:-.2em 0 0 0 #dc73ff inset}.ui.pink.table{border-top:.2em solid #e03997}.ui.inverted.pink.table{background-color:#e03997;color:#fff}.ui.ui.table td.pink:not(.marked),.ui.ui.ui.ui.table tr.pink:not(.marked){background:#ffe8f9;color:#e03997}.ui.selectable.table tr:hover td.pink:not(.marked),.ui.table tr td.selectable.pink:not(.marked):hover,.ui.ui.selectable.table tr.pink:not(.marked):hover{background:#ffdef6;color:#e03997}.ui.table td.marked.pink.left,.ui.table tr.marked.pink.left{-webkit-box-shadow:.2em 0 0 0 #e03997 inset;box-shadow:.2em 0 0 0 #e03997 inset}.ui.table td.marked.pink.right,.ui.table tr.marked.pink.right{-webkit-box-shadow:-.2em 0 0 0 #e03997 inset;box-shadow:-.2em 0 0 0 #e03997 inset}.ui.inverted.table td.marked.pink.left,.ui.inverted.table tr.marked.pink.left{-webkit-box-shadow:.2em 0 0 0 #ff8edf inset;box-shadow:.2em 0 0 0 #ff8edf inset}.ui.inverted.table td.marked.pink.right,.ui.inverted.table tr.marked.pink.right{-webkit-box-shadow:-.2em 0 0 0 #ff8edf inset;box-shadow:-.2em 0 0 0 #ff8edf inset}.ui.brown.table{border-top:.2em solid #a5673f}.ui.inverted.brown.table{background-color:#a5673f;color:#fff}.ui.ui.table td.brown:not(.marked),.ui.ui.ui.ui.table tr.brown:not(.marked){background:#f7e5d2;color:#a5673f}.ui.selectable.table tr:hover td.brown:not(.marked),.ui.table tr td.selectable.brown:not(.marked):hover,.ui.ui.selectable.table tr.brown:not(.marked):hover{background:#efe0cf;color:#a5673f}.ui.table td.marked.brown.left,.ui.table tr.marked.brown.left{-webkit-box-shadow:.2em 0 0 0 #a5673f inset;box-shadow:.2em 0 0 0 #a5673f inset}.ui.table td.marked.brown.right,.ui.table tr.marked.brown.right{-webkit-box-shadow:-.2em 0 0 0 #a5673f inset;box-shadow:-.2em 0 0 0 #a5673f inset}.ui.inverted.table td.marked.brown.left,.ui.inverted.table tr.marked.brown.left{-webkit-box-shadow:.2em 0 0 0 #d67c1c inset;box-shadow:.2em 0 0 0 #d67c1c inset}.ui.inverted.table td.marked.brown.right,.ui.inverted.table tr.marked.brown.right{-webkit-box-shadow:-.2em 0 0 0 #d67c1c inset;box-shadow:-.2em 0 0 0 #d67c1c inset}.ui.grey.table{border-top:.2em solid #767676}.ui.inverted.grey.table{background-color:#767676;color:#fff}.ui.ui.table td.grey:not(.marked),.ui.ui.ui.ui.table tr.grey:not(.marked){background:#dcddde;color:#767676}.ui.selectable.table tr:hover td.grey:not(.marked),.ui.table tr td.selectable.grey:not(.marked):hover,.ui.ui.selectable.table tr.grey:not(.marked):hover{background:#c2c4c5;color:#767676}.ui.table td.marked.grey.left,.ui.table tr.marked.grey.left{-webkit-box-shadow:.2em 0 0 0 #767676 inset;box-shadow:.2em 0 0 0 #767676 inset}.ui.table td.marked.grey.right,.ui.table tr.marked.grey.right{-webkit-box-shadow:-.2em 0 0 0 #767676 inset;box-shadow:-.2em 0 0 0 #767676 inset}.ui.inverted.table td.marked.grey.left,.ui.inverted.table tr.marked.grey.left{-webkit-box-shadow:.2em 0 0 0 #dcddde inset;box-shadow:.2em 0 0 0 #dcddde inset}.ui.inverted.table td.marked.grey.right,.ui.inverted.table tr.marked.grey.right{-webkit-box-shadow:-.2em 0 0 0 #dcddde inset;box-shadow:-.2em 0 0 0 #dcddde inset}.ui.black.table{border-top:.2em solid #1b1c1d}.ui.inverted.black.table{background-color:#1b1c1d;color:#fff}.ui.ui.table td.black:not(.marked),.ui.ui.ui.ui.table tr.black:not(.marked){background:#545454;color:#fff}.ui.selectable.table tr:hover td.black:not(.marked),.ui.table tr td.selectable.black:not(.marked):hover,.ui.ui.selectable.table tr.black:not(.marked):hover{background:#000;color:#fff}.ui.table td.marked.black.left,.ui.table tr.marked.black.left{-webkit-box-shadow:.2em 0 0 0 #1b1c1d inset;box-shadow:.2em 0 0 0 #1b1c1d inset}.ui.table td.marked.black.right,.ui.table tr.marked.black.right{-webkit-box-shadow:-.2em 0 0 0 #1b1c1d inset;box-shadow:-.2em 0 0 0 #1b1c1d inset}.ui.inverted.table td.marked.black.left,.ui.inverted.table tr.marked.black.left{-webkit-box-shadow:.2em 0 0 0 #545454 inset;box-shadow:.2em 0 0 0 #545454 inset}.ui.inverted.table td.marked.black.right,.ui.inverted.table tr.marked.black.right{-webkit-box-shadow:-.2em 0 0 0 #545454 inset;box-shadow:-.2em 0 0 0 #545454 inset}.ui.one.column.table td{width:100%}.ui.two.column.table td{width:50%}.ui.three.column.table td{width:33.33333333%}.ui.four.column.table td{width:25%}.ui.five.column.table td{width:20%}.ui.six.column.table td{width:16.66666667%}.ui.seven.column.table td{width:14.28571429%}.ui.eight.column.table td{width:12.5%}.ui.nine.column.table td{width:11.11111111%}.ui.ten.column.table td{width:10%}.ui.eleven.column.table td{width:9.09090909%}.ui.twelve.column.table td{width:8.33333333%}.ui.thirteen.column.table td{width:7.69230769%}.ui.fourteen.column.table td{width:7.14285714%}.ui.fifteen.column.table td{width:6.66666667%}.ui.sixteen.column.table td{width:6.25%}.ui.table td.one.wide,.ui.table th.one.wide{width:6.25%}.ui.table td.two.wide,.ui.table th.two.wide{width:12.5%}.ui.table td.three.wide,.ui.table th.three.wide{width:18.75%}.ui.table td.four.wide,.ui.table th.four.wide{width:25%}.ui.table td.five.wide,.ui.table th.five.wide{width:31.25%}.ui.table td.six.wide,.ui.table th.six.wide{width:37.5%}.ui.table td.seven.wide,.ui.table th.seven.wide{width:43.75%}.ui.table td.eight.wide,.ui.table th.eight.wide{width:50%}.ui.table td.nine.wide,.ui.table th.nine.wide{width:56.25%}.ui.table td.ten.wide,.ui.table th.ten.wide{width:62.5%}.ui.table td.eleven.wide,.ui.table th.eleven.wide{width:68.75%}.ui.table td.twelve.wide,.ui.table th.twelve.wide{width:75%}.ui.table td.thirteen.wide,.ui.table th.thirteen.wide{width:81.25%}.ui.table td.fourteen.wide,.ui.table th.fourteen.wide{width:87.5%}.ui.table td.fifteen.wide,.ui.table th.fifteen.wide{width:93.75%}.ui.table td.sixteen.wide,.ui.table th.sixteen.wide{width:100%}.ui.sortable.table>thead>tr>th{cursor:pointer;white-space:nowrap;border-left:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87)}.ui.sortable.table>thead>tr>th:first-child{border-left:none}.ui.sortable.table thead th.sorted,.ui.sortable.table thead th.sorted:hover{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ui.sortable.table>thead>tr>th:after{display:none;font-style:normal;font-weight:400;text-decoration:inherit;content:'';height:1em;width:auto;opacity:.8;margin:0 0 0 .5em;font-family:Icons}.ui.sortable.table thead th.ascending:after{content:'\f0d8'}.ui.sortable.table thead th.descending:after{content:'\f0d7'}.ui.sortable.table th.disabled:hover{cursor:auto;color:rgba(40,40,40,.3)}.ui.sortable.table>thead>tr>th:hover{color:rgba(0,0,0,.8)}.ui.sortable.table:not(.basic)>thead>tr>th:hover{background:rgba(0,0,0,.05)}.ui.sortable.table thead th.sorted{color:rgba(0,0,0,.95)}.ui.sortable.table:not(.basic) thead th.sorted{background:rgba(0,0,0,.05)}.ui.sortable.table thead th.sorted:after{display:inline-block}.ui.sortable.table thead th.sorted:hover{color:rgba(0,0,0,.95)}.ui.sortable.table:not(.basic) thead th.sorted:hover{background:rgba(0,0,0,.05)}.ui.inverted.sortable.table thead th.sorted{color:#fff}.ui.inverted.sortable.table:not(.basic) thead th.sorted{background:rgba(255,255,255,.15) -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:rgba(255,255,255,.15) -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:rgba(255,255,255,.15) linear-gradient(transparent,rgba(0,0,0,.05))}.ui.inverted.sortable.table>thead>tr>th:hover{color:#fff}.ui.inverted.sortable.table:not(.basic)>thead>tr>th:hover{background:rgba(255,255,255,.08) -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:rgba(255,255,255,.08) -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:rgba(255,255,255,.08) linear-gradient(transparent,rgba(0,0,0,.05))}.ui.inverted.sortable.table:not(.basic)>thead>tr>th{border-left-color:transparent;border-right-color:transparent}.ui.inverted.table{background:#333;color:rgba(255,255,255,.9);border:none}.ui.ui.inverted.table>tbody>tr>th,.ui.ui.inverted.table>tfoot>tr>td,.ui.ui.inverted.table>tfoot>tr>th,.ui.ui.inverted.table>thead>tr>th,.ui.ui.inverted.table>tr>th{background-color:rgba(0,0,0,.15);border-color:rgba(255,255,255,.1);color:rgba(255,255,255,.9)}.ui.inverted.table>tbody>tr>td,.ui.inverted.table>tfoot>tr>td,.ui.inverted.table>tr>td{border-color:rgba(255,255,255,.1)}.ui.inverted.table tr td.disabled,.ui.inverted.table tr.disabled td,.ui.inverted.table tr.disabled:hover td,.ui.inverted.table tr:hover td.disabled{pointer-events:none;color:rgba(225,225,225,.3)}.ui.inverted.table tr td.disabled:not([class=disabled]),.ui.inverted.table tr.disabled td[class]:not(.disabled),.ui.inverted.table tr.disabled:not([class=disabled]) td,.ui.inverted.table tr:hover td.disabled:not([class=disabled]){color:rgba(40,40,40,.3)}.ui.inverted.definition.table>tfoot:not(.full-width)>tr>th:first-child,.ui.inverted.definition.table>thead:not(.full-width)>tr>th:first-child{background:#fff}.ui.inverted.definition.table>tbody>tr>td:first-child .ui.inverted.definition.table>tfoot>tr>td:first-child,.ui.inverted.definition.table>tr>td:first-child{background:rgba(255,255,255,.02);color:#fff}.ui.collapsing.table{width:auto}.ui.basic.table{background:0 0;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none;box-shadow:none}.ui.basic.table>tfoot,.ui.basic.table>thead{-webkit-box-shadow:none;box-shadow:none}.ui.basic.table>tbody>tr>th,.ui.basic.table>tfoot>tr>th,.ui.basic.table>thead>tr>th,.ui.basic.table>tr>th{background:0 0;border-left:none}.ui.basic.table>tbody>tr{border-bottom:1px solid rgba(0,0,0,.1)}.ui.basic.table>tbody>tr>td,.ui.basic.table>tfoot>tr>td,.ui.basic.table>tr>td{background:0 0}.ui.basic.striped.table>tbody>tr:nth-child(2n){background-color:rgba(0,0,0,.05)}.ui[class*="very basic"].table{border:none}.ui[class*="very basic"].table:not(.sortable):not(.striped)>tbody>tr>td,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tbody>tr>th,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tfoot>tr>th,.ui[class*="very basic"].table:not(.sortable):not(.striped)>thead>tr>th,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tr>td,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tr>th{padding:''}.ui[class*="very basic"].table:not(.sortable):not(.striped)>tbody>tr>td:first-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tbody>tr>th:first-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tfoot>tr>td:first-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tfoot>tr>th:first-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>thead>tr>th:first-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tr>td:first-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tr>th:first-child{padding-left:0}.ui[class*="very basic"].table:not(.sortable):not(.striped)>tbody>tr>td:last-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tbody>tr>th:last-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tfoot>tr>td:last-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tfoot>tr>th:last-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>thead>tr>th:last-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tr>td:last-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tr>th:last-child{padding-right:0}.ui[class*="very basic"].table:not(.sortable):not(.striped)>thead>tr:first-child>th{padding-top:0}.ui.celled.table>tbody>tr>td,.ui.celled.table>tbody>tr>th,.ui.celled.table>tfoot>tr>td,.ui.celled.table>tfoot>tr>th,.ui.celled.table>thead>tr>th,.ui.celled.table>tr>td,.ui.celled.table>tr>th{border-left:1px solid rgba(34,36,38,.1)}.ui.inverted.celled.table>tbody>tr>td,.ui.inverted.celled.table>tr>td{border-left:1px solid rgba(255,255,255,.1)}.ui.celled.table>tbody>tr>td:first-child,.ui.celled.table>tbody>tr>th:first-child,.ui.celled.table>tfoot>tr>td:first-child,.ui.celled.table>tfoot>tr>th:first-child,.ui.celled.table>thead>tr>th:first-child,.ui.celled.table>tr>td:first-child,.ui.celled.table>tr>th:first-child{border-left:none}.ui.padded.table>tbody>tr>th,.ui.padded.table>tfoot>tr>th,.ui.padded.table>thead>tr>th,.ui.padded.table>tr>th{padding-left:1em;padding-right:1em}.ui.padded.table>tbody>tr>td,.ui.padded.table>tbody>tr>th,.ui.padded.table>tfoot>tr>td,.ui.padded.table>tfoot>tr>th,.ui.padded.table>thead>tr>th,.ui.padded.table>tr>td,.ui.padded.table>tr>th{padding:1em 1em}.ui[class*="very padded"].table>tbody>tr>th,.ui[class*="very padded"].table>tfoot>tr>th,.ui[class*="very padded"].table>thead>tr>th,.ui[class*="very padded"].table>tr>th{padding-left:1.5em;padding-right:1.5em}.ui[class*="very padded"].table>tbody>tr>td,.ui[class*="very padded"].table>tfoot>tr>td,.ui[class*="very padded"].table>tr>td{padding:1.5em 1.5em}.ui.compact.table>tbody>tr>th,.ui.compact.table>tfoot>tr>th,.ui.compact.table>thead>tr>th,.ui.compact.table>tr>th{padding-left:.7em;padding-right:.7em}.ui.compact.table>tbody>tr>td,.ui.compact.table>tfoot>tr>td,.ui.compact.table>tr>td{padding:.5em .7em}.ui[class*="very compact"].table>tbody>tr>th,.ui[class*="very compact"].table>tfoot>tr>th,.ui[class*="very compact"].table>thead>tr>th,.ui[class*="very compact"].table>tr>th{padding-left:.6em;padding-right:.6em}.ui[class*="very compact"].table>tbody>tr>td,.ui[class*="very compact"].table>tfoot>tr>td,.ui[class*="very compact"].table>tr>td{padding:.4em .6em}.ui.table{font-size:1em}.ui.mini.table{font-size:.78571429rem}.ui.tiny.table{font-size:.85714286rem}.ui.small.table{font-size:.9em}.ui.large.table{font-size:1.1em}.ui.big.table{font-size:1.28571429rem}.ui.huge.table{font-size:1.42857143rem}.ui.massive.table{font-size:1.71428571rem}/*! + * # Fomantic-UI - Ad + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Copyright 2013 Contributors + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.ad{display:block;overflow:hidden;margin:1em 0}.ui.ad:first-child{margin:0}.ui.ad:last-child{margin:0}.ui.ad iframe{margin:0;padding:0;border:none;overflow:hidden}.ui.leaderboard.ad{width:728px;height:90px}.ui[class*="medium rectangle"].ad{width:300px;height:250px}.ui[class*="large rectangle"].ad{width:336px;height:280px}.ui[class*="half page"].ad{width:300px;height:600px}.ui.square.ad{width:250px;height:250px}.ui[class*="small square"].ad{width:200px;height:200px}.ui[class*="small rectangle"].ad{width:180px;height:150px}.ui[class*="vertical rectangle"].ad{width:240px;height:400px}.ui.button.ad{width:120px;height:90px}.ui[class*="square button"].ad{width:125px;height:125px}.ui[class*="small button"].ad{width:120px;height:60px}.ui.skyscraper.ad{width:120px;height:600px}.ui[class*="wide skyscraper"].ad{width:160px}.ui.banner.ad{width:468px;height:60px}.ui[class*="vertical banner"].ad{width:120px;height:240px}.ui[class*="top banner"].ad{width:930px;height:180px}.ui[class*="half banner"].ad{width:234px;height:60px}.ui[class*="large leaderboard"].ad{width:970px;height:90px}.ui.billboard.ad{width:970px;height:250px}.ui.panorama.ad{width:980px;height:120px}.ui.netboard.ad{width:580px;height:400px}.ui[class*="large mobile banner"].ad{width:320px;height:100px}.ui[class*="mobile leaderboard"].ad{width:320px;height:50px}.ui.mobile.ad{display:none}@media only screen and (max-width:767.98px){.ui.mobile.ad{display:block}}.ui.centered.ad{margin-left:auto;margin-right:auto}.ui.test.ad{position:relative;background:#545454}.ui.test.ad:after{position:absolute;top:50%;left:50%;width:100%;text-align:center;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);content:'Ad';color:#fff;font-size:1em;font-weight:700}.ui.mobile.test.ad:after{font-size:.85714286em}.ui.test.ad[data-text]:after{content:attr(data-text)}/*! + * # Fomantic-UI - Card + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.card,.ui.cards>.card{max-width:100%;position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:290px;min-height:0;background:#fff;padding:0;border:none;border-radius:.28571429rem;-webkit-box-shadow:0 1px 3px 0 #d4d4d5,0 0 0 1px #d4d4d5;box-shadow:0 1px 3px 0 #d4d4d5,0 0 0 1px #d4d4d5;-webkit-transition:-webkit-box-shadow .1s ease,-webkit-transform .1s ease;transition:-webkit-box-shadow .1s ease,-webkit-transform .1s ease;transition:box-shadow .1s ease,transform .1s ease;transition:box-shadow .1s ease,transform .1s ease,-webkit-box-shadow .1s ease,-webkit-transform .1s ease;z-index:'';word-wrap:break-word}.ui.card{margin:1em 0}.ui.card a,.ui.cards>.card a{cursor:pointer}.ui.card:first-child{margin-top:0}.ui.card:last-child{margin-bottom:0}.ui.cards{display:-webkit-box;display:-ms-flexbox;display:flex;margin:-.875em -.5em;-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.cards>.card{display:-webkit-box;display:-ms-flexbox;display:flex;margin:.875em .5em;float:none}.ui.card:after,.ui.cards:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.cards~.ui.cards{margin-top:.875em}.ui.card>:first-child,.ui.cards>.card>:first-child{border-radius:.28571429rem .28571429rem 0 0!important;border-top:none!important}.ui.card>:last-child,.ui.cards>.card>:last-child{border-radius:0 0 .28571429rem .28571429rem!important}.ui.card>:only-child,.ui.cards>.card>:only-child{border-radius:.28571429rem!important}.ui.card>.image,.ui.cards>.card>.image{position:relative;display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding:0;background:rgba(0,0,0,.05)}.ui.card>.image>img,.ui.cards>.card>.image>img{display:block;width:100%;height:auto;border-radius:inherit}.ui.card>.image:not(.ui)>img,.ui.cards>.card>.image:not(.ui)>img{border:none}.ui.card>.content,.ui.cards>.card>.content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;border:none;border-top:1px solid rgba(34,36,38,.1);background:0 0;margin:0;padding:1em 1em;-webkit-box-shadow:none;box-shadow:none;font-size:1em;border-radius:0}.ui.card>.content:after,.ui.cards>.card>.content:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.card>.content>.header,.ui.cards>.card>.content>.header{display:block;margin:'';font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;color:rgba(0,0,0,.85)}.ui.card>.content>.header:not(.ui),.ui.cards>.card>.content>.header:not(.ui){font-weight:700;font-size:1.28571429em;margin-top:-.21425em;line-height:1.28571429em}.ui.card>.content>.header+.description,.ui.card>.content>.meta+.description,.ui.cards>.card>.content>.header+.description,.ui.cards>.card>.content>.meta+.description{margin-top:.5em}.ui.card [class*="left floated"],.ui.cards>.card [class*="left floated"]{float:left}.ui.card [class*="right floated"],.ui.cards>.card [class*="right floated"]{float:right}.ui.card [class*="left aligned"],.ui.cards>.card [class*="left aligned"]{text-align:left}.ui.card [class*="center aligned"],.ui.cards>.card [class*="center aligned"]{text-align:center}.ui.card [class*="right aligned"],.ui.cards>.card [class*="right aligned"]{text-align:right}.ui.card .content img,.ui.cards>.card .content img{display:inline-block;vertical-align:middle;width:''}.ui.card .avatar img,.ui.card img.avatar,.ui.cards>.card .avatar img,.ui.cards>.card img.avatar{width:2em;height:2em;border-radius:500rem}.ui.card>.content>.description,.ui.cards>.card>.content>.description{clear:both;color:rgba(0,0,0,.68)}.ui.card>.content p,.ui.cards>.card>.content p{margin:0 0 .5em}.ui.card>.content p:last-child,.ui.cards>.card>.content p:last-child{margin-bottom:0}.ui.card .meta,.ui.cards>.card .meta{font-size:1em;color:rgba(0,0,0,.4)}.ui.card .meta *,.ui.cards>.card .meta *{margin-right:.3em}.ui.card .meta :last-child,.ui.cards>.card .meta :last-child{margin-right:0}.ui.card .meta [class*="right floated"],.ui.cards>.card .meta [class*="right floated"]{margin-right:0;margin-left:.3em}.ui.card>.content a:not(.ui),.ui.cards>.card>.content a:not(.ui){color:'';-webkit-transition:color .1s ease;transition:color .1s ease}.ui.card>.content a:not(.ui):hover,.ui.cards>.card>.content a:not(.ui):hover{color:''}.ui.card>.content>a.header,.ui.cards>.card>.content>a.header{color:rgba(0,0,0,.85)}.ui.card>.content>a.header:hover,.ui.cards>.card>.content>a.header:hover{color:#1e70bf}.ui.card .meta>a:not(.ui),.ui.cards>.card .meta>a:not(.ui){color:rgba(0,0,0,.4)}.ui.card .meta>a:not(.ui):hover,.ui.cards>.card .meta>a:not(.ui):hover{color:rgba(0,0,0,.87)}.ui.card>.button,.ui.card>.buttons,.ui.cards>.card>.button,.ui.cards>.card>.buttons{margin:0 -1px;width:calc(100% + 2px)}.ui.card>.button:last-child,.ui.card>.buttons:last-child,.ui.cards>.card>.button:last-child,.ui.cards>.card>.buttons:last-child{margin-bottom:-1px}.ui.card .dimmer,.ui.cards>.card .dimmer{background-color:'';z-index:10}.ui.card>.content .star.icon,.ui.cards>.card>.content .star.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.card>.content .star.icon:hover,.ui.cards>.card>.content .star.icon:hover{opacity:1;color:#ffb70a}.ui.card>.content .active.star.icon,.ui.cards>.card>.content .active.star.icon{color:#ffe623}.ui.card>.content .like.icon,.ui.cards>.card>.content .like.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.card>.content .like.icon:hover,.ui.cards>.card>.content .like.icon:hover{opacity:1;color:#ff2733}.ui.card>.content .active.like.icon,.ui.cards>.card>.content .active.like.icon{color:#ff2733}.ui.card>.extra,.ui.cards>.card>.extra{max-width:100%;min-height:0!important;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;border-top:1px solid rgba(0,0,0,.05)!important;position:static;background:0 0;width:auto;margin:0 0;padding:.75em 1em;top:0;left:0;color:rgba(0,0,0,.4);-webkit-box-shadow:none;box-shadow:none;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.card>.extra a:not(.ui),.ui.cards>.card>.extra a:not(.ui){color:rgba(0,0,0,.4)}.ui.card>.extra a:not(.ui):hover,.ui.cards>.card>.extra a:not(.ui):hover{color:#1e70bf}.ui.card.horizontal,.ui.horizontal.cards>.card{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;min-width:270px;width:400px;max-width:100%}.ui.card.horizontal>.image,.ui.horizontal.cards>.card>.image{border-radius:.28571429rem 0 0 .28571429rem;width:150px}.ui.card.horizontal>.image>img,.ui.horizontal.cards>.card>.image>img{background-size:cover;background-repeat:no-repeat;background-position:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;height:100%;border-radius:.28571429rem 0 0 .28571429rem}.ui.card.horizontal>.image:last-child>img,.ui.horizontal.cards>.card>.image:last-child>img{border-radius:0 .28571429rem .28571429rem 0}.ui.horizontal.card>.content,.ui.horizontal.cards>.card>.content{-ms-flex-preferred-size:1px;flex-basis:1px}.ui.horizontal.card>.extra,.ui.horizontal.cards>.card>.extra{-ms-flex-preferred-size:100%;flex-basis:100%}.ui.raised.card,.ui.raised.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #d4d4d5,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.link.cards .raised.card:hover,.ui.link.raised.card:hover,.ui.raised.cards a.card:hover,a.ui.raised.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 4px 0 rgba(34,36,38,.15),0 2px 10px 0 rgba(34,36,38,.25);box-shadow:0 0 0 1px #d4d4d5,0 2px 4px 0 rgba(34,36,38,.15),0 2px 10px 0 rgba(34,36,38,.25)}.ui.centered.cards{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.centered.card{margin-left:auto;margin-right:auto}.ui.fluid.card{width:100%;max-width:9999px}.ui.cards a.card,.ui.link.card,.ui.link.cards .card,a.ui.card{-webkit-transform:none;transform:none}.ui.cards a.card:hover,.ui.link.card:hover,.ui.link.cards .card:not(.icon):hover,a.ui.card:hover{cursor:pointer;z-index:5;background:#fff;border:none;-webkit-box-shadow:0 1px 3px 0 #bcbdbd,0 0 0 1px #d4d4d5;box-shadow:0 1px 3px 0 #bcbdbd,0 0 0 1px #d4d4d5;-webkit-transform:translateY(-3px);transform:translateY(-3px)}.ui.cards>.primary.card,.ui.primary.card,.ui.primary.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #2185d0,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #2185d0,0 1px 3px 0 #d4d4d5}.ui.cards>.primary.card:hover,.ui.primary.card:hover,.ui.primary.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #1678c2,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #1678c2,0 1px 3px 0 #bcbdbd}.ui.inverted.cards>.primary.card,.ui.inverted.primary.card,.ui.inverted.primary.cards>.card{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #54c8ff,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #54c8ff,0 0 0 1px #555}.ui.inverted.cards>.primary.card:hover,.ui.inverted.primary.card:hover,.ui.inverted.primary.cards>.card:hover{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #21b8ff,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #21b8ff,0 0 0 1px #555}.ui.cards>.secondary.card,.ui.secondary.card,.ui.secondary.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #1b1c1d,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #1b1c1d,0 1px 3px 0 #d4d4d5}.ui.cards>.secondary.card:hover,.ui.secondary.card:hover,.ui.secondary.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #27292a,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #27292a,0 1px 3px 0 #bcbdbd}.ui.inverted.cards>.secondary.card,.ui.inverted.secondary.card,.ui.inverted.secondary.cards>.card{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #545454,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #545454,0 0 0 1px #555}.ui.inverted.cards>.secondary.card:hover,.ui.inverted.secondary.card:hover,.ui.inverted.secondary.cards>.card:hover{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #6e6e6e,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #6e6e6e,0 0 0 1px #555}.ui.cards>.red.card,.ui.red.card,.ui.red.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #db2828,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #db2828,0 1px 3px 0 #d4d4d5}.ui.cards>.red.card:hover,.ui.red.card:hover,.ui.red.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #d01919,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #d01919,0 1px 3px 0 #bcbdbd}.ui.inverted.cards>.red.card,.ui.inverted.red.card,.ui.inverted.red.cards>.card{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #ff695e,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #ff695e,0 0 0 1px #555}.ui.inverted.cards>.red.card:hover,.ui.inverted.red.card:hover,.ui.inverted.red.cards>.card:hover{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #ff392b,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #ff392b,0 0 0 1px #555}.ui.cards>.orange.card,.ui.orange.card,.ui.orange.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #f2711c,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #f2711c,0 1px 3px 0 #d4d4d5}.ui.cards>.orange.card:hover,.ui.orange.card:hover,.ui.orange.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #f26202,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #f26202,0 1px 3px 0 #bcbdbd}.ui.inverted.cards>.orange.card,.ui.inverted.orange.card,.ui.inverted.orange.cards>.card{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #ff851b,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #ff851b,0 0 0 1px #555}.ui.inverted.cards>.orange.card:hover,.ui.inverted.orange.card:hover,.ui.inverted.orange.cards>.card:hover{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #e76b00,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #e76b00,0 0 0 1px #555}.ui.cards>.yellow.card,.ui.yellow.card,.ui.yellow.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #fbbd08,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #fbbd08,0 1px 3px 0 #d4d4d5}.ui.cards>.yellow.card:hover,.ui.yellow.card:hover,.ui.yellow.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #eaae00,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #eaae00,0 1px 3px 0 #bcbdbd}.ui.inverted.cards>.yellow.card,.ui.inverted.yellow.card,.ui.inverted.yellow.cards>.card{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #ffe21f,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #ffe21f,0 0 0 1px #555}.ui.inverted.cards>.yellow.card:hover,.ui.inverted.yellow.card:hover,.ui.inverted.yellow.cards>.card:hover{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #ebcd00,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #ebcd00,0 0 0 1px #555}.ui.cards>.olive.card,.ui.olive.card,.ui.olive.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #b5cc18,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #b5cc18,0 1px 3px 0 #d4d4d5}.ui.cards>.olive.card:hover,.ui.olive.card:hover,.ui.olive.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a7bd0d,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a7bd0d,0 1px 3px 0 #bcbdbd}.ui.inverted.cards>.olive.card,.ui.inverted.olive.card,.ui.inverted.olive.cards>.card{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #d9e778,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #d9e778,0 0 0 1px #555}.ui.inverted.cards>.olive.card:hover,.ui.inverted.olive.card:hover,.ui.inverted.olive.cards>.card:hover{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #d2e745,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #d2e745,0 0 0 1px #555}.ui.cards>.green.card,.ui.green.card,.ui.green.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #21ba45,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #21ba45,0 1px 3px 0 #d4d4d5}.ui.cards>.green.card:hover,.ui.green.card:hover,.ui.green.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #16ab39,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #16ab39,0 1px 3px 0 #bcbdbd}.ui.inverted.cards>.green.card,.ui.inverted.green.card,.ui.inverted.green.cards>.card{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #2ecc40,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #2ecc40,0 0 0 1px #555}.ui.inverted.cards>.green.card:hover,.ui.inverted.green.card:hover,.ui.inverted.green.cards>.card:hover{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #1ea92e,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #1ea92e,0 0 0 1px #555}.ui.cards>.teal.card,.ui.teal.card,.ui.teal.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #00b5ad,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #00b5ad,0 1px 3px 0 #d4d4d5}.ui.cards>.teal.card:hover,.ui.teal.card:hover,.ui.teal.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #009c95,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #009c95,0 1px 3px 0 #bcbdbd}.ui.inverted.cards>.teal.card,.ui.inverted.teal.card,.ui.inverted.teal.cards>.card{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #6dffff,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #6dffff,0 0 0 1px #555}.ui.inverted.cards>.teal.card:hover,.ui.inverted.teal.card:hover,.ui.inverted.teal.cards>.card:hover{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #3affff,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #3affff,0 0 0 1px #555}.ui.blue.card,.ui.blue.cards>.card,.ui.cards>.blue.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #2185d0,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #2185d0,0 1px 3px 0 #d4d4d5}.ui.blue.card:hover,.ui.blue.cards>.card:hover,.ui.cards>.blue.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #1678c2,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #1678c2,0 1px 3px 0 #bcbdbd}.ui.inverted.blue.card,.ui.inverted.blue.cards>.card,.ui.inverted.cards>.blue.card{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #54c8ff,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #54c8ff,0 0 0 1px #555}.ui.inverted.blue.card:hover,.ui.inverted.blue.cards>.card:hover,.ui.inverted.cards>.blue.card:hover{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #21b8ff,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #21b8ff,0 0 0 1px #555}.ui.cards>.violet.card,.ui.violet.card,.ui.violet.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #6435c9,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #6435c9,0 1px 3px 0 #d4d4d5}.ui.cards>.violet.card:hover,.ui.violet.card:hover,.ui.violet.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #5829bb,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #5829bb,0 1px 3px 0 #bcbdbd}.ui.inverted.cards>.violet.card,.ui.inverted.violet.card,.ui.inverted.violet.cards>.card{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #a291fb,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #a291fb,0 0 0 1px #555}.ui.inverted.cards>.violet.card:hover,.ui.inverted.violet.card:hover,.ui.inverted.violet.cards>.card:hover{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #745aff,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #745aff,0 0 0 1px #555}.ui.cards>.purple.card,.ui.purple.card,.ui.purple.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a333c8,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a333c8,0 1px 3px 0 #d4d4d5}.ui.cards>.purple.card:hover,.ui.purple.card:hover,.ui.purple.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #9627ba,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #9627ba,0 1px 3px 0 #bcbdbd}.ui.inverted.cards>.purple.card,.ui.inverted.purple.card,.ui.inverted.purple.cards>.card{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #dc73ff,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #dc73ff,0 0 0 1px #555}.ui.inverted.cards>.purple.card:hover,.ui.inverted.purple.card:hover,.ui.inverted.purple.cards>.card:hover{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #cf40ff,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #cf40ff,0 0 0 1px #555}.ui.cards>.pink.card,.ui.pink.card,.ui.pink.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #e03997,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #e03997,0 1px 3px 0 #d4d4d5}.ui.cards>.pink.card:hover,.ui.pink.card:hover,.ui.pink.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #e61a8d,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #e61a8d,0 1px 3px 0 #bcbdbd}.ui.inverted.cards>.pink.card,.ui.inverted.pink.card,.ui.inverted.pink.cards>.card{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #ff8edf,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #ff8edf,0 0 0 1px #555}.ui.inverted.cards>.pink.card:hover,.ui.inverted.pink.card:hover,.ui.inverted.pink.cards>.card:hover{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #ff5bd1,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #ff5bd1,0 0 0 1px #555}.ui.brown.card,.ui.brown.cards>.card,.ui.cards>.brown.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a5673f,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a5673f,0 1px 3px 0 #d4d4d5}.ui.brown.card:hover,.ui.brown.cards>.card:hover,.ui.cards>.brown.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #975b33,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #975b33,0 1px 3px 0 #bcbdbd}.ui.inverted.brown.card,.ui.inverted.brown.cards>.card,.ui.inverted.cards>.brown.card{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #d67c1c,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #d67c1c,0 0 0 1px #555}.ui.inverted.brown.card:hover,.ui.inverted.brown.cards>.card:hover,.ui.inverted.cards>.brown.card:hover{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #b0620f,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #b0620f,0 0 0 1px #555}.ui.cards>.grey.card,.ui.grey.card,.ui.grey.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #767676,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #767676,0 1px 3px 0 #d4d4d5}.ui.cards>.grey.card:hover,.ui.grey.card:hover,.ui.grey.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #838383,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #838383,0 1px 3px 0 #bcbdbd}.ui.inverted.cards>.grey.card,.ui.inverted.grey.card,.ui.inverted.grey.cards>.card{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #dcddde,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #dcddde,0 0 0 1px #555}.ui.inverted.cards>.grey.card:hover,.ui.inverted.grey.card:hover,.ui.inverted.grey.cards>.card:hover{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #c2c4c5,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #c2c4c5,0 0 0 1px #555}.ui.black.card,.ui.black.cards>.card,.ui.cards>.black.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #1b1c1d,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #1b1c1d,0 1px 3px 0 #d4d4d5}.ui.black.card:hover,.ui.black.cards>.card:hover,.ui.cards>.black.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #27292a,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #27292a,0 1px 3px 0 #bcbdbd}.ui.inverted.black.card,.ui.inverted.black.cards>.card,.ui.inverted.cards>.black.card{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #545454,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #545454,0 0 0 1px #555}.ui.inverted.black.card:hover,.ui.inverted.black.cards>.card:hover,.ui.inverted.cards>.black.card:hover{-webkit-box-shadow:0 1px 3px 0 #555,0 2px 0 0 #000,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 2px 0 0 #000,0 0 0 1px #555}.ui.one.cards{margin-left:0;margin-right:0}.ui.one.cards>.card{width:100%}.ui.two.cards{margin-left:-1em;margin-right:-1em}.ui.two.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.three.cards{margin-left:-1em;margin-right:-1em}.ui.three.cards>.card{width:calc(33.33333333333333% - 2em);margin-left:1em;margin-right:1em}.ui.four.cards{margin-left:-.75em;margin-right:-.75em}.ui.four.cards>.card{width:calc(25% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.five.cards{margin-left:-.75em;margin-right:-.75em}.ui.five.cards>.card{width:calc(20% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.six.cards{margin-left:-.75em;margin-right:-.75em}.ui.six.cards>.card{width:calc(16.666666666666664% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.seven.cards{margin-left:-.5em;margin-right:-.5em}.ui.seven.cards>.card{width:calc(14.285714285714285% - 1em);margin-left:.5em;margin-right:.5em}.ui.eight.cards{margin-left:-.5em;margin-right:-.5em}.ui.eight.cards>.card{width:calc(12.5% - 1em);margin-left:.5em;margin-right:.5em;font-size:11px}.ui.nine.cards{margin-left:-.5em;margin-right:-.5em}.ui.nine.cards>.card{width:calc(11.11111111111111% - 1em);margin-left:.5em;margin-right:.5em;font-size:10px}.ui.ten.cards{margin-left:-.5em;margin-right:-.5em}.ui.ten.cards>.card{width:calc(10% - 1em);margin-left:.5em;margin-right:.5em}@media only screen and (max-width:767.98px){.ui.two.doubling.cards{margin-left:0;margin-right:0}.ui.two.doubling.cards>.card{width:100%;margin-left:0;margin-right:0}.ui.three.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.three.doubling.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.four.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.four.doubling.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.five.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.five.doubling.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.six.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.six.doubling.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.seven.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.seven.doubling.cards>.card{width:calc(33.33333333333333% - 2em);margin-left:1em;margin-right:1em}.ui.eight.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.eight.doubling.cards>.card{width:calc(33.33333333333333% - 2em);margin-left:1em;margin-right:1em}.ui.nine.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.nine.doubling.cards>.card{width:calc(33.33333333333333% - 2em);margin-left:1em;margin-right:1em}.ui.ten.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.ten.doubling.cards>.card{width:calc(33.33333333333333% - 2em);margin-left:1em;margin-right:1em}}@media only screen and (min-width:768px) and (max-width:991.98px){.ui.two.doubling.cards{margin-left:0;margin-right:0}.ui.two.doubling.cards>.card{width:100%;margin-left:0;margin-right:0}.ui.three.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.three.doubling.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.four.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.four.doubling.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.five.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.five.doubling.cards>.card{width:calc(33.33333333333333% - 2em);margin-left:1em;margin-right:1em}.ui.six.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.six.doubling.cards>.card{width:calc(33.33333333333333% - 2em);margin-left:1em;margin-right:1em}.ui.eight.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.eight.doubling.cards>.card{width:calc(33.33333333333333% - 2em);margin-left:1em;margin-right:1em}.ui.eight.doubling.cards{margin-left:-.75em;margin-right:-.75em}.ui.eight.doubling.cards>.card{width:calc(25% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.nine.doubling.cards{margin-left:-.75em;margin-right:-.75em}.ui.nine.doubling.cards>.card{width:calc(25% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.ten.doubling.cards{margin-left:-.75em;margin-right:-.75em}.ui.ten.doubling.cards>.card{width:calc(20% - 1.5em);margin-left:.75em;margin-right:.75em}}@media only screen and (max-width:767.98px){.ui.stackable.cards{display:block!important}.ui.stackable.cards .card:first-child{margin-top:0!important}.ui.stackable.cards>.card{display:block!important;height:auto!important;margin:1em 1em;padding:0!important;width:calc(100% - 2em)!important}}.ui.cards>.card{font-size:1em}.ui.mini.cards .card{font-size:.78571429rem}.ui.tiny.cards .card{font-size:.85714286rem}.ui.small.cards .card{font-size:.92857143rem}.ui.large.cards .card{font-size:1.14285714rem}.ui.big.cards .card{font-size:1.28571429rem}.ui.huge.cards .card{font-size:1.42857143rem}.ui.massive.cards .card{font-size:1.71428571rem}.ui.inverted.card,.ui.inverted.cards>.card{background:#1b1c1d;-webkit-box-shadow:0 1px 3px 0 #555,0 0 0 1px #555;box-shadow:0 1px 3px 0 #555,0 0 0 1px #555}.ui.inverted.card>.content,.ui.inverted.cards>.card>.content{border-top:1px solid rgba(255,255,255,.15)}.ui.inverted.card>.content>.header,.ui.inverted.cards>.card>.content>.header{color:rgba(255,255,255,.9)}.ui.inverted.card>.content>.description,.ui.inverted.cards>.card>.content>.description{color:rgba(255,255,255,.8)}.ui.inverted.card .meta,.ui.inverted.cards>.card .meta{color:rgba(255,255,255,.7)}.ui.inverted.card .meta>a:not(.ui),.ui.inverted.cards>.card .meta>a:not(.ui){color:rgba(255,255,255,.7)}.ui.inverted.card .meta>a:not(.ui):hover,.ui.inverted.cards>.card .meta>a:not(.ui):hover{color:#fff}.ui.inverted.card>.extra,.ui.inverted.cards>.card>.extra{border-top:1px solid rgba(255,255,255,.15)!important;color:rgba(255,255,255,.7)}.ui.inverted.card>.extra a:not(.ui),.ui.inverted.cards>.card>.extra a:not(.ui){color:rgba(255,255,255,.5)}.ui.inverted.card>.extra a:not(.ui):hover,.ui.inverted.cards>.card>.extra a:not(.ui):hover{color:#1e70bf}.ui.inverted.cards a.card:hover,.ui.inverted.link.card:hover,.ui.inverted.link.cards .card:not(.icon):hover,a.inverted.ui.card:hover{background:#1b1c1d}/*! + * # Fomantic-UI - Comment + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.comments{margin:1.5em 0;max-width:650px}.ui.comments:first-child{margin-top:0}.ui.comments:last-child{margin-bottom:0}.ui.comments .comment{position:relative;background:0 0;margin:.5em 0 0;padding:.5em 0 0;border:none;border-top:none;line-height:1.2}.ui.comments .comment:first-child{margin-top:0;padding-top:0}.ui.comments .comment>.comments{margin:0 0 .5em .5em;padding:1em 0 1em 1em}.ui.comments .comment>.comments:before{position:absolute;top:0;left:0}.ui.comments .comment>.comments .comment{border:none;border-top:none;background:0 0}.ui.comments .comment .avatar{display:block;width:2.5em;height:auto;float:left;margin:.2em 0 0}.ui.comments .comment .avatar img,.ui.comments .comment img.avatar{display:block;margin:0 auto;width:100%;height:100%;border-radius:.25rem}.ui.comments .comment>.content{display:block}.ui.comments .comment>.avatar~.content{margin-left:3.5em}.ui.comments .comment .author{font-size:1em;color:rgba(0,0,0,.87);font-weight:700}.ui.comments .comment a.author{cursor:pointer}.ui.comments .comment a.author:hover{color:#1e70bf}.ui.comments .comment .metadata{display:inline-block;margin-left:.5em;color:rgba(0,0,0,.4);font-size:.875em}.ui.comments .comment .metadata>*{display:inline-block;margin:0 .5em 0 0}.ui.comments .comment .metadata>:last-child{margin-right:0}.ui.comments .comment .text{margin:.25em 0 .5em;font-size:1em;word-wrap:break-word;color:rgba(0,0,0,.87);line-height:1.3}.ui.comments .comment .actions{font-size:.875em}.ui.comments .comment .actions a{cursor:pointer;display:inline-block;margin:0 .75em 0 0;color:rgba(0,0,0,.4)}.ui.comments .comment .actions a:last-child{margin-right:0}.ui.comments .comment .actions a.active,.ui.comments .comment .actions a:hover{color:rgba(0,0,0,.8)}.ui.comments>.reply.form{margin-top:1em}.ui.comments .comment .reply.form{width:100%;margin-top:1em}.ui.comments .reply.form textarea{font-size:1em;height:12em}.ui.collapsed.comments,.ui.comments .collapsed.comment,.ui.comments .collapsed.comments{display:none}.ui.threaded.comments .comment>.comments{margin:-1.5em 0 -1em 1.25em;padding:3em 0 2em 2.25em;-webkit-box-shadow:-1px 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 rgba(34,36,38,.15)}.ui.minimal.comments .comment .actions{opacity:0;position:absolute;top:0;right:0;left:auto;-webkit-transition:opacity .2s ease;transition:opacity .2s ease;-webkit-transition-delay:.1s;transition-delay:.1s}.ui.minimal.comments .comment>.content:hover>.actions{opacity:1}.ui.comments{font-size:1rem}.ui.mini.comments{font-size:.78571429rem}.ui.tiny.comments{font-size:.85714286rem}.ui.small.comments{font-size:.92857143rem}.ui.large.comments{font-size:1.14285714rem}.ui.big.comments{font-size:1.28571429rem}.ui.huge.comments{font-size:1.42857143rem}.ui.massive.comments{font-size:1.71428571rem}.ui.inverted.comments .comment{background-color:#1b1c1d}.ui.inverted.comments .comment .author,.ui.inverted.comments .comment .text{color:rgba(255,255,255,.9)}.ui.inverted.comments .comment .actions a,.ui.inverted.comments .comment .metadata{color:rgba(255,255,255,.7)}.ui.inverted.comments .comment .actions a.active,.ui.inverted.comments .comment .actions a:hover,.ui.inverted.comments .comment a.author:hover{color:#fff}.ui.inverted.threaded.comments .comment>.comments{-webkit-box-shadow:-1px 0 0 #555;box-shadow:-1px 0 0 #555}/*! + * # Fomantic-UI - Feed + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.feed{margin:1em 0}.ui.feed:first-child{margin-top:0}.ui.feed:last-child{margin-bottom:0}.ui.feed>.event{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;width:100%;padding:.21428571rem 0;margin:0;background:0 0;border-top:none}.ui.feed>.event:first-child{border-top:0;padding-top:0}.ui.feed>.event:last-child{padding-bottom:0}.ui.feed>.event>.label{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:2.5em;height:auto;-ms-flex-item-align:stretch;align-self:stretch;text-align:left}.ui.feed>.event>.label .icon{opacity:1;font-size:1.5em;width:100%;padding:.25em;background:0 0;border:none;border-radius:none;color:rgba(0,0,0,.6)}.ui.feed>.event>.label img{width:100%;height:auto;border-radius:500rem}.ui.feed>.event>.label+.content{margin:.5em 0 .35714286em 1.14285714em}.ui.feed>.event>.content{display:block;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;-ms-flex-item-align:stretch;align-self:stretch;text-align:left;word-wrap:break-word}.ui.feed>.event:last-child>.content{padding-bottom:0}.ui.feed>.event>.content a{cursor:pointer}.ui.feed>.event>.content .date{margin:-.5rem 0 0;padding:0;color:rgba(0,0,0,.4);font-weight:400;font-size:1em;font-style:normal}.ui.feed>.event>.content .summary{margin:0;font-size:1em;font-weight:700;color:rgba(0,0,0,.87)}.ui.feed>.event>.content .summary img{display:inline-block;width:auto;height:10em;margin:-.25em .25em 0 0;border-radius:.25em;vertical-align:middle}.ui.feed>.event>.content .user{display:inline-block;font-weight:700;margin-right:0;vertical-align:baseline}.ui.feed>.event>.content .user img{margin:-.25em .25em 0 0;width:auto;height:10em;vertical-align:middle}.ui.feed>.event>.content .summary>.date{display:inline-block;float:none;font-weight:400;font-size:.85714286em;font-style:normal;margin:0 0 0 .5em;padding:0;color:rgba(0,0,0,.4)}.ui.feed>.event>.content .extra{margin:.5em 0 0;background:0 0;padding:0;color:rgba(0,0,0,.87)}.ui.feed>.event>.content .extra.images img{display:inline-block;margin:0 .25em 0 0;width:6em}.ui.feed>.event>.content .extra.text{padding:0;border-left:none;font-size:1em;max-width:500px;line-height:1.4285em}.ui.feed>.event>.content .meta{display:inline-block;font-size:.85714286em;margin:.5em 0 0;background:0 0;border:none;border-radius:0;-webkit-box-shadow:none;box-shadow:none;padding:0;color:rgba(0,0,0,.6)}.ui.feed>.event>.content .meta>*{position:relative;margin-left:.75em}.ui.feed>.event>.content .meta>:after{content:'';color:rgba(0,0,0,.2);top:0;left:-1em;opacity:1;position:absolute;vertical-align:top}.ui.feed>.event>.content .meta .like{color:'';-webkit-transition:.2s color ease;transition:.2s color ease}.ui.feed>.event>.content .meta .like:hover .icon{color:#ff2733}.ui.feed>.event>.content .meta .active.like .icon{color:#ef404a}.ui.feed>.event>.content .meta>:first-child{margin-left:0}.ui.feed>.event>.content .meta>:first-child::after{display:none}.ui.feed>.event>.content .meta a,.ui.feed>.event>.content .meta>.icon{cursor:pointer;opacity:1;color:rgba(0,0,0,.5);-webkit-transition:color .1s ease;transition:color .1s ease}.ui.feed>.event>.content .meta a:hover,.ui.feed>.event>.content .meta a:hover .icon,.ui.feed>.event>.content .meta>.icon:hover{color:rgba(0,0,0,.95)}.ui.feed{font-size:1rem}.ui.mini.feed{font-size:.78571429rem}.ui.tiny.feed{font-size:.85714286rem}.ui.small.feed{font-size:.92857143rem}.ui.large.feed{font-size:1.14285714rem}.ui.big.feed{font-size:1.28571429rem}.ui.huge.feed{font-size:1.42857143rem}.ui.massive.feed{font-size:1.71428571rem}.ui.inverted.feed>.event{background:#1b1c1d}.ui.inverted.feed>.event>.content .date,.ui.inverted.feed>.event>.content .meta .like{color:rgba(255,255,255,.7)}.ui.inverted.feed>.event>.content .extra.text,.ui.inverted.feed>.event>.content .summary{color:rgba(255,255,255,.9)}.ui.inverted.feed>.event>.content .meta .like:hover{color:#fff}/*! + * # Fomantic-UI - Item + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.items>.item{display:-webkit-box;display:-ms-flexbox;display:flex;margin:1em 0;width:100%;min-height:0;background:0 0;padding:0;border:none;border-radius:0;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:-webkit-box-shadow .1s ease;transition:-webkit-box-shadow .1s ease;transition:box-shadow .1s ease;transition:box-shadow .1s ease,-webkit-box-shadow .1s ease;z-index:''}.ui.items>.item a{cursor:pointer}.ui.items{margin:1.5em 0}.ui.items:first-child{margin-top:0!important}.ui.items:last-child{margin-bottom:0!important}.ui.items>.item:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item:first-child{margin-top:0}.ui.items>.item:last-child{margin-bottom:0}.ui.items>.item>.image{position:relative;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;display:block;float:none;margin:0;padding:0;max-height:'';-ms-flex-item-align:start;align-self:start}.ui.items>.item>.image>img{display:block;width:100%;height:auto;border-radius:.125rem;border:none}.ui.items>.item>.image:only-child>img{border-radius:0}.ui.items>.item>.content{display:block;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;background:0 0;color:rgba(0,0,0,.87);margin:0;padding:0;-webkit-box-shadow:none;box-shadow:none;font-size:1em;border:none;border-radius:0}.ui.items>.item>.content:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item>.image+.content{min-width:0;width:auto;display:block;margin-left:0;-ms-flex-item-align:start;align-self:start;padding-left:1.5em}.ui.items>.item>.content>.header{display:inline-block;margin:-.21425em 0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;color:rgba(0,0,0,.85)}.ui.items>.item>.content>.header:not(.ui){font-size:1.28571429em}.ui.items>.item [class*="left floated"]{float:left}.ui.items>.item [class*="right floated"]{float:right}.ui.items>.item .content img{-ms-flex-item-align:center;align-self:center;width:''}.ui.items>.item .avatar img,.ui.items>.item img.avatar{width:'';height:'';border-radius:500rem}.ui.items>.item>.content>.description{margin-top:.6em;max-width:auto;font-size:1em;line-height:1.4285em;color:rgba(0,0,0,.87)}.ui.items>.item>.content p{margin:0 0 .5em}.ui.items>.item>.content p:last-child{margin-bottom:0}.ui.items>.item .meta{margin:.5em 0 .5em;font-size:1em;line-height:1em;color:rgba(0,0,0,.6)}.ui.items>.item .meta *{margin-right:.3em}.ui.items>.item .meta :last-child{margin-right:0}.ui.items>.item .meta [class*="right floated"]{margin-right:0;margin-left:.3em}.ui.items>.item>.content a:not(.ui){color:'';-webkit-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content a:not(.ui):hover{color:''}.ui.items>.item>.content>a.header{color:rgba(0,0,0,.85)}.ui.items>.item>.content>a.header:hover{color:#1e70bf}.ui.items>.item .meta>a:not(.ui){color:rgba(0,0,0,.4)}.ui.items>.item .meta>a:not(.ui):hover{color:rgba(0,0,0,.87)}.ui.items>.item>.content .favorite.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content .favorite.icon:hover{opacity:1;color:#ffb70a}.ui.items>.item>.content .active.favorite.icon{color:#ffe623}.ui.items>.item>.content .like.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content .like.icon:hover{opacity:1;color:#ff2733}.ui.items>.item>.content .active.like.icon{color:#ff2733}.ui.items>.item .extra{display:block;position:relative;background:0 0;margin:.5rem 0 0;width:100%;padding:0 0 0;top:0;left:0;color:rgba(0,0,0,.4);-webkit-box-shadow:none;box-shadow:none;-webkit-transition:color .1s ease;transition:color .1s ease;border-top:none}.ui.items>.item .extra>*{margin:.25rem .5rem .25rem 0}.ui.items>.item .extra>[class*="right floated"]{margin:.25rem 0 .25rem .5rem}.ui.items>.item .extra:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item>.image:not(.ui){width:175px}@media only screen and (min-width:768px) and (max-width:991.98px){.ui.items>.item{margin:1em 0}.ui.items>.item>.image:not(.ui){width:150px}.ui.items>.item>.image+.content{display:block;padding:0 0 0 1em}}@media only screen and (max-width:767.98px){.ui.items:not(.unstackable)>.item{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:2em 0}.ui.items:not(.unstackable)>.item>.image{display:block;margin-left:auto;margin-right:auto}.ui.items:not(.unstackable)>.item>.image,.ui.items:not(.unstackable)>.item>.image>img{max-width:100%!important;width:auto!important;max-height:250px!important}.ui.items:not(.unstackable)>.item>.image+.content{display:block;padding:1.5em 0 0}}.ui.items>.item>.image+[class*="top aligned"].content{-ms-flex-item-align:start;align-self:flex-start}.ui.items>.item>.image+[class*="middle aligned"].content{-ms-flex-item-align:center;align-self:center}.ui.items>.item>.image+[class*="bottom aligned"].content{-ms-flex-item-align:end;align-self:flex-end}.ui.relaxed.items>.item{margin:1.5em 0}.ui[class*="very relaxed"].items>.item{margin:2em 0}.ui.divided.items>.item{border-top:1px solid rgba(34,36,38,.15);margin:0;padding:1em 0}.ui.divided.items>.item:first-child{border-top:none;margin-top:0!important;padding-top:0!important}.ui.divided.items>.item:last-child{margin-bottom:0!important;padding-bottom:0!important}.ui.relaxed.divided.items>.item{margin:0;padding:1.5em 0}.ui[class*="very relaxed"].divided.items>.item{margin:0;padding:2em 0}.ui.items a.item:hover,.ui.link.items>.item:hover{cursor:pointer}.ui.items a.item:hover .content .header,.ui.link.items>.item:hover .content .header{color:#1e70bf}.ui.items>.item{font-size:1em}.ui.mini.items>.item{font-size:.78571429em}.ui.tiny.items>.item{font-size:.85714286em}.ui.small.items>.item{font-size:.92857143em}.ui.large.items>.item{font-size:1.14285714em}.ui.big.items>.item{font-size:1.28571429em}.ui.huge.items>.item{font-size:1.42857143em}.ui.massive.items>.item{font-size:1.71428571em}@media only screen and (max-width:767.98px){.ui.unstackable.items>.item>.image,.ui.unstackable.items>.item>.image>img{width:125px!important}}.ui.inverted.items>.item{background:0 0}.ui.inverted.items>.item>.content{background:0 0;color:rgba(255,255,255,.9)}.ui.inverted.items>.item .extra{background:0 0}.ui.inverted.items>.item>.content>.header{color:rgba(255,255,255,.9)}.ui.inverted.items>.item>.content>.description{color:rgba(255,255,255,.9)}.ui.inverted.items>.item .meta{color:rgba(255,255,255,.8)}.ui.inverted.items>.item>.content a:not(.ui){color:#57a4ef}.ui.inverted.items>.item>.content a:not(.ui):hover{color:#4183c4}.ui.inverted.items>.item>.content>a.header{color:rgba(255,255,255,.9)}.ui.inverted.items>.item>.content>a.header:hover{color:#fff}.ui.inverted.items>.item .meta>a:not(.ui){color:rgba(255,255,255,.7)}.ui.inverted.items>.item .meta>a:not(.ui):hover{color:rgba(255,255,255,.9)}.ui.inverted.items>.item>.content .favorite.icon:hover{color:#ffc63d}.ui.inverted.items>.item>.content .active.favorite.icon{color:#ffec56}.ui.inverted.items>.item>.content .like.icon:hover{color:#ff5a63}.ui.inverted.items>.item>.content .active.like.icon{color:#ff5a63}.ui.inverted.items>.item .extra{color:rgba(255,255,255,.7)}.ui.inverted.items a.item:hover .content .header,.ui.inverted.link.items>.item:hover .content .header{color:#fff}.ui.inverted.divided.items>.item{border-top:1px solid rgba(255,255,255,.1)}.ui.inverted.divided.items>.item:first-child{border-top:none}/*! + * # Fomantic-UI - Statistic + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.statistic{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:1em 0;max-width:none}.ui.statistic+.ui.statistic{margin:0 0 0 1.5em}.ui.statistic:first-child{margin-top:0}.ui.statistic:last-child{margin-bottom:0}.ui.statistics{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.statistics>.statistic{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:0 1.5em 1em;max-width:none}.ui.statistics{display:-webkit-box;display:-ms-flexbox;display:flex;margin:1em -1.5em -1em}.ui.statistics:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.statistics:first-child{margin-top:0}.ui.statistic>.value,.ui.statistics .statistic>.value{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:4rem;font-weight:400;line-height:1em;color:#1b1c1d;text-transform:uppercase;text-align:center}.ui.statistic>.label,.ui.statistics .statistic>.label{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1em;font-weight:700;color:rgba(0,0,0,.87);text-transform:uppercase;text-align:center}.ui.statistic>.label~.value,.ui.statistics .statistic>.label~.value{margin-top:0}.ui.statistic>.value~.label,.ui.statistics .statistic>.value~.label{margin-top:0}.ui.statistic>.value .icon,.ui.statistics .statistic>.value .icon{opacity:1;width:auto;margin:0}.ui.statistic>.text.value,.ui.statistics .statistic>.text.value{line-height:1em;min-height:2em;font-weight:700;text-align:center}.ui.statistic>.text.value+.label,.ui.statistics .statistic>.text.value+.label{text-align:center}.ui.statistic>.value img,.ui.statistics .statistic>.value img{max-height:3rem;vertical-align:baseline}.ui.ten.statistics{margin:0 0 -1em}.ui.ten.statistics .statistic{min-width:10%;margin:0 0 1em}.ui.nine.statistics{margin:0 0 -1em}.ui.nine.statistics .statistic{min-width:11.11111111%;margin:0 0 1em}.ui.eight.statistics{margin:0 0 -1em}.ui.eight.statistics .statistic{min-width:12.5%;margin:0 0 1em}.ui.seven.statistics{margin:0 0 -1em}.ui.seven.statistics .statistic{min-width:14.28571429%;margin:0 0 1em}.ui.six.statistics{margin:0 0 -1em}.ui.six.statistics .statistic{min-width:16.66666667%;margin:0 0 1em}.ui.five.statistics{margin:0 0 -1em}.ui.five.statistics .statistic{min-width:20%;margin:0 0 1em}.ui.four.statistics{margin:0 0 -1em}.ui.four.statistics .statistic{min-width:25%;margin:0 0 1em}.ui.three.statistics{margin:0 0 -1em}.ui.three.statistics .statistic{min-width:33.33333333%;margin:0 0 1em}.ui.two.statistics{margin:0 0 -1em}.ui.two.statistics .statistic{min-width:50%;margin:0 0 1em}.ui.one.statistics{margin:0 0 -1em}.ui.one.statistics .statistic{min-width:100%;margin:0 0 1em}.ui.horizontal.statistic{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.horizontal.statistics{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:0;max-width:none}.ui.horizontal.statistics .statistic{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-width:none;margin:1em 0}.ui.horizontal.statistic>.text.value,.ui.horizontal.statistics>.statistic>.text.value{min-height:0!important}.ui.horizontal.statistic>.value .icon,.ui.horizontal.statistics .statistic>.value .icon{width:1.18em}.ui.horizontal.statistic>.value,.ui.horizontal.statistics .statistic>.value{display:inline-block;vertical-align:middle}.ui.horizontal.statistic>.label,.ui.horizontal.statistics .statistic>.label{display:inline-block;vertical-align:middle;margin:0 0 0 .75em}.ui.inverted.statistic .value,.ui.inverted.statistics .statistic>.value{color:#fff}.ui.inverted.statistic .label,.ui.inverted.statistics .statistic>.label{color:rgba(255,255,255,.9)}.ui.primary.statistic>.value,.ui.primary.statistics .statistic>.value,.ui.statistics .primary.statistic>.value{color:#2185d0}.ui.inverted.primary.statistic>.value,.ui.inverted.primary.statistics .statistic>.value,.ui.statistics .inverted.primary.statistic>.value{color:#54c8ff}.ui.secondary.statistic>.value,.ui.secondary.statistics .statistic>.value,.ui.statistics .secondary.statistic>.value{color:#1b1c1d}.ui.inverted.secondary.statistic>.value,.ui.inverted.secondary.statistics .statistic>.value,.ui.statistics .inverted.secondary.statistic>.value{color:#545454}.ui.red.statistic>.value,.ui.red.statistics .statistic>.value,.ui.statistics .red.statistic>.value{color:#db2828}.ui.inverted.red.statistic>.value,.ui.inverted.red.statistics .statistic>.value,.ui.statistics .inverted.red.statistic>.value{color:#ff695e}.ui.orange.statistic>.value,.ui.orange.statistics .statistic>.value,.ui.statistics .orange.statistic>.value{color:#f2711c}.ui.inverted.orange.statistic>.value,.ui.inverted.orange.statistics .statistic>.value,.ui.statistics .inverted.orange.statistic>.value{color:#ff851b}.ui.statistics .yellow.statistic>.value,.ui.yellow.statistic>.value,.ui.yellow.statistics .statistic>.value{color:#fbbd08}.ui.inverted.yellow.statistic>.value,.ui.inverted.yellow.statistics .statistic>.value,.ui.statistics .inverted.yellow.statistic>.value{color:#ffe21f}.ui.olive.statistic>.value,.ui.olive.statistics .statistic>.value,.ui.statistics .olive.statistic>.value{color:#b5cc18}.ui.inverted.olive.statistic>.value,.ui.inverted.olive.statistics .statistic>.value,.ui.statistics .inverted.olive.statistic>.value{color:#d9e778}.ui.green.statistic>.value,.ui.green.statistics .statistic>.value,.ui.statistics .green.statistic>.value{color:#21ba45}.ui.inverted.green.statistic>.value,.ui.inverted.green.statistics .statistic>.value,.ui.statistics .inverted.green.statistic>.value{color:#2ecc40}.ui.statistics .teal.statistic>.value,.ui.teal.statistic>.value,.ui.teal.statistics .statistic>.value{color:#00b5ad}.ui.inverted.teal.statistic>.value,.ui.inverted.teal.statistics .statistic>.value,.ui.statistics .inverted.teal.statistic>.value{color:#6dffff}.ui.blue.statistic>.value,.ui.blue.statistics .statistic>.value,.ui.statistics .blue.statistic>.value{color:#2185d0}.ui.inverted.blue.statistic>.value,.ui.inverted.blue.statistics .statistic>.value,.ui.statistics .inverted.blue.statistic>.value{color:#54c8ff}.ui.statistics .violet.statistic>.value,.ui.violet.statistic>.value,.ui.violet.statistics .statistic>.value{color:#6435c9}.ui.inverted.violet.statistic>.value,.ui.inverted.violet.statistics .statistic>.value,.ui.statistics .inverted.violet.statistic>.value{color:#a291fb}.ui.purple.statistic>.value,.ui.purple.statistics .statistic>.value,.ui.statistics .purple.statistic>.value{color:#a333c8}.ui.inverted.purple.statistic>.value,.ui.inverted.purple.statistics .statistic>.value,.ui.statistics .inverted.purple.statistic>.value{color:#dc73ff}.ui.pink.statistic>.value,.ui.pink.statistics .statistic>.value,.ui.statistics .pink.statistic>.value{color:#e03997}.ui.inverted.pink.statistic>.value,.ui.inverted.pink.statistics .statistic>.value,.ui.statistics .inverted.pink.statistic>.value{color:#ff8edf}.ui.brown.statistic>.value,.ui.brown.statistics .statistic>.value,.ui.statistics .brown.statistic>.value{color:#a5673f}.ui.inverted.brown.statistic>.value,.ui.inverted.brown.statistics .statistic>.value,.ui.statistics .inverted.brown.statistic>.value{color:#d67c1c}.ui.grey.statistic>.value,.ui.grey.statistics .statistic>.value,.ui.statistics .grey.statistic>.value{color:#767676}.ui.inverted.grey.statistic>.value,.ui.inverted.grey.statistics .statistic>.value,.ui.statistics .inverted.grey.statistic>.value{color:#dcddde}.ui.black.statistic>.value,.ui.black.statistics .statistic>.value,.ui.statistics .black.statistic>.value{color:#1b1c1d}.ui.inverted.black.statistic>.value,.ui.inverted.black.statistics .statistic>.value,.ui.statistics .inverted.black.statistic>.value{color:#545454}.ui[class*="left floated"].statistic{float:left;margin:0 2em 1em 0}.ui[class*="right floated"].statistic{float:right;margin:0 0 1em 2em}.ui.floated.statistic:last-child{margin-bottom:0}@media only screen and (max-width:767.98px){.ui.stackable.statistics{width:auto;margin-left:0!important;margin-right:0!important}.ui.stackable.statistics>.statistic{width:100%!important;margin:0 0!important;padding:1rem 1rem!important}}.ui.statistic>.value,.ui.statistics .statistic>.value{font-size:4rem}.ui.horizontal.statistic>.value,.ui.horizontal.statistics .statistic>.value{font-size:3rem}.ui.statistic>.text.value,.ui.statistics .statistic>.text.value{font-size:2rem}.ui.mini.statistic>.value,.ui.mini.statistics .statistic>.value{font-size:1.5rem}.ui.mini.horizontal.statistic>.value,.ui.mini.horizontal.statistics .statistic>.value{font-size:1.5rem}.ui.mini.statistic>.text.value,.ui.mini.statistics .statistic>.text.value{font-size:1rem}.ui.tiny.statistic>.value,.ui.tiny.statistics .statistic>.value{font-size:2rem}.ui.tiny.horizontal.statistic>.value,.ui.tiny.horizontal.statistics .statistic>.value{font-size:2rem}.ui.tiny.statistic>.text.value,.ui.tiny.statistics .statistic>.text.value{font-size:1rem}.ui.small.statistic>.value,.ui.small.statistics .statistic>.value{font-size:3rem}.ui.small.horizontal.statistic>.value,.ui.small.horizontal.statistics .statistic>.value{font-size:2rem}.ui.small.statistic>.text.value,.ui.small.statistics .statistic>.text.value{font-size:1rem}.ui.large.statistic>.value,.ui.large.statistics .statistic>.value{font-size:5rem}.ui.large.horizontal.statistic>.value,.ui.large.horizontal.statistics .statistic>.value{font-size:4rem}.ui.large.statistic>.text.value,.ui.large.statistics .statistic>.text.value{font-size:2.5rem}.ui.big.statistic>.value,.ui.big.statistics .statistic>.value{font-size:5.5rem}.ui.big.horizontal.statistic>.value,.ui.big.horizontal.statistics .statistic>.value{font-size:4.5rem}.ui.big.statistic>.text.value,.ui.big.statistics .statistic>.text.value{font-size:2.5rem}.ui.huge.statistic>.value,.ui.huge.statistics .statistic>.value{font-size:6rem}.ui.huge.horizontal.statistic>.value,.ui.huge.horizontal.statistics .statistic>.value{font-size:5rem}.ui.huge.statistic>.text.value,.ui.huge.statistics .statistic>.text.value{font-size:2.5rem}.ui.massive.statistic>.value,.ui.massive.statistics .statistic>.value{font-size:7rem}.ui.massive.horizontal.statistic>.value,.ui.massive.horizontal.statistics .statistic>.value{font-size:6rem}.ui.massive.statistic>.text.value,.ui.massive.statistics .statistic>.text.value{font-size:3rem}/*! + * # Fomantic-UI - Accordion + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.accordion,.ui.accordion .accordion{max-width:100%}.ui.accordion .accordion{margin:1em 0 0;padding:0}.ui.accordion .accordion .title,.ui.accordion .title{cursor:pointer}.ui.accordion .title:not(.ui){padding:.5em 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1em;color:rgba(0,0,0,.87)}.ui.accordion:not(.styled) .accordion .title~.content:not(.ui),.ui.accordion:not(.styled) .title~.content:not(.ui){margin:'';padding:.5em 0 1em}.ui.accordion:not(.styled) .title~.content:not(.ui):last-child{padding-bottom:0}.ui.accordion .accordion .title .dropdown.icon,.ui.accordion .title .dropdown.icon{display:inline-block;float:none;opacity:1;width:1.25em;height:1em;margin:0 .25rem 0 0;padding:0;font-size:1em;-webkit-transition:opacity .1s ease,-webkit-transform .1s ease;transition:opacity .1s ease,-webkit-transform .1s ease;transition:transform .1s ease,opacity .1s ease;transition:transform .1s ease,opacity .1s ease,-webkit-transform .1s ease;vertical-align:baseline;-webkit-transform:none;transform:none}.ui.accordion.menu .item .title{display:block;padding:0}.ui.accordion.menu .item .title>.dropdown.icon{float:right;margin:.21425em 0 0 1em;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.ui.accordion .ui.header .dropdown.icon{font-size:1em;margin:0 .25rem 0 0}.ui.accordion .accordion .active.title .dropdown.icon,.ui.accordion .active.title .dropdown.icon{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.ui.accordion.menu .item .active.title>.dropdown.icon{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.ui.styled.accordion{width:600px}.ui.styled.accordion,.ui.styled.accordion .accordion{border-radius:.28571429rem;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15)}.ui.styled.accordion .accordion .title,.ui.styled.accordion .title{margin:0;padding:.75em 1em;color:rgba(0,0,0,.4);font-weight:700;border-top:1px solid rgba(34,36,38,.15);-webkit-transition:background .1s ease,color .1s ease;transition:background .1s ease,color .1s ease}.ui.styled.accordion .accordion .title:first-child,.ui.styled.accordion>.title:first-child{border-top:none}.ui.styled.accordion .accordion .content,.ui.styled.accordion .content{margin:0;padding:.5em 1em 1.5em}.ui.styled.accordion .accordion .content{margin:0;padding:.5em 1em 1.5em}.ui.styled.accordion .accordion .active.title,.ui.styled.accordion .accordion .title:hover,.ui.styled.accordion .active.title,.ui.styled.accordion .title:hover{background:0 0;color:rgba(0,0,0,.87)}.ui.styled.accordion .accordion .active.title,.ui.styled.accordion .accordion .title:hover{background:0 0;color:rgba(0,0,0,.87)}.ui.styled.accordion .active.title{background:0 0;color:rgba(0,0,0,.95)}.ui.styled.accordion .accordion .active.title{background:0 0;color:rgba(0,0,0,.95)}.ui.accordion .accordion .title~.content:not(.active),.ui.accordion .title~.content:not(.active){display:none}.ui.fluid.accordion,.ui.fluid.accordion .accordion{width:100%}.ui.inverted.accordion .title:not(.ui){color:rgba(255,255,255,.9)}@font-face{font-family:Accordion;src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMggjB5AAAAC8AAAAYGNtYXAPfOIKAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zryj6HgAAAFwAAAAyGhlYWT/0IhHAAACOAAAADZoaGVhApkB5wAAAnAAAAAkaG10eAJuABIAAAKUAAAAGGxvY2EAjABWAAACrAAAAA5tYXhwAAgAFgAAArwAAAAgbmFtZfC1n04AAALcAAABPHBvc3QAAwAAAAAEGAAAACAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADw2gHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIPDa//3//wAAAAAAIPDZ//3//wAB/+MPKwADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQASAEkAtwFuABMAADc0PwE2FzYXFh0BFAcGJwYvASY1EgaABQgHBQYGBQcIBYAG2wcGfwcBAQcECf8IBAcBAQd/BgYAAAAAAQAAAEkApQFuABMAADcRNDc2MzIfARYVFA8BBiMiJyY1AAUGBwgFgAYGgAUIBwYFWwEACAUGBoAFCAcFgAYGBQcAAAABAAAAAQAAqWYls18PPPUACwIAAAAAAM/9o+4AAAAAz/2j7gAAAAAAtwFuAAAACAACAAAAAAAAAAEAAAHg/+AAAAIAAAAAAAC3AAEAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAQAAAAC3ABIAtwAAAAAAAAAKABQAHgBCAGQAAAABAAAABgAUAAEAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADAAAAAEAAAAAAAIADgBAAAEAAAAAAAMADAAiAAEAAAAAAAQADABOAAEAAAAAAAUAFgAMAAEAAAAAAAYABgAuAAEAAAAAAAoANABaAAMAAQQJAAEADAAAAAMAAQQJAAIADgBAAAMAAQQJAAMADAAiAAMAAQQJAAQADABOAAMAAQQJAAUAFgAMAAMAAQQJAAYADAA0AAMAAQQJAAoANABaAHIAYQB0AGkAbgBnAFYAZQByAHMAaQBvAG4AIAAxAC4AMAByAGEAdABpAG4AZ3JhdGluZwByAGEAdABpAG4AZwBSAGUAZwB1AGwAYQByAHIAYQB0AGkAbgBnAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,d09GRk9UVE8AAASwAAoAAAAABGgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABDRkYgAAAA9AAAAS0AAAEtFpovuE9TLzIAAAIkAAAAYAAAAGAIIweQY21hcAAAAoQAAABMAAAATA984gpnYXNwAAAC0AAAAAgAAAAIAAAAEGhlYWQAAALYAAAANgAAADb/0IhHaGhlYQAAAxAAAAAkAAAAJAKZAedobXR4AAADNAAAABgAAAAYAm4AEm1heHAAAANMAAAABgAAAAYABlAAbmFtZQAAA1QAAAE8AAABPPC1n05wb3N0AAAEkAAAACAAAAAgAAMAAAEABAQAAQEBB3JhdGluZwABAgABADr4HAL4GwP4GAQeCgAZU/+Lix4KABlT/4uLDAeLa/iU+HQFHQAAAHkPHQAAAH4RHQAAAAkdAAABJBIABwEBBw0PERQZHnJhdGluZ3JhdGluZ3UwdTF1MjB1RjBEOXVGMERBAAACAYkABAAGAQEEBwoNVp38lA78lA78lA77lA773Z33bxWLkI2Qj44I9xT3FAWOj5CNkIuQi4+JjoePiI2Gi4YIi/uUBYuGiYeHiIiHh4mGi4aLho2Ijwj7FPcUBYeOiY+LkAgO+92L5hWL95QFi5CNkI6Oj4+PjZCLkIuQiY6HCPcU+xQFj4iNhouGi4aJh4eICPsU+xQFiIeGiYaLhouHjYePiI6Jj4uQCA74lBT4lBWLDAoAAAAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADw2gHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIPDa//3//wAAAAAAIPDZ//3//wAB/+MPKwADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAEAADfYOJZfDzz1AAsCAAAAAADP/aPuAAAAAM/9o+4AAAAAALcBbgAAAAgAAgAAAAAAAAABAAAB4P/gAAACAAAAAAAAtwABAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAEAAAAAtwASALcAAAAAUAAABgAAAAAADgCuAAEAAAAAAAEADAAAAAEAAAAAAAIADgBAAAEAAAAAAAMADAAiAAEAAAAAAAQADABOAAEAAAAAAAUAFgAMAAEAAAAAAAYABgAuAAEAAAAAAAoANABaAAMAAQQJAAEADAAAAAMAAQQJAAIADgBAAAMAAQQJAAMADAAiAAMAAQQJAAQADABOAAMAAQQJAAUAFgAMAAMAAQQJAAYADAA0AAMAAQQJAAoANABaAHIAYQB0AGkAbgBnAFYAZQByAHMAaQBvAG4AIAAxAC4AMAByAGEAdABpAG4AZ3JhdGluZwByAGEAdABpAG4AZwBSAGUAZwB1AGwAYQByAHIAYQB0AGkAbgBnAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff');font-weight:400;font-style:normal}.ui.accordion .accordion .title .dropdown.icon,.ui.accordion .title .dropdown.icon{font-family:Accordion;line-height:1;-webkit-backface-visibility:hidden;backface-visibility:hidden;font-weight:400;font-style:normal;text-align:center}.ui.accordion .accordion .title .dropdown.icon:before,.ui.accordion .title .dropdown.icon:before{content:'\f0da'}/*! + * # Fomantic-UI - Calendar + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.calendar .ui.popup{max-width:none;padding:0;border:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ui.calendar .calendar:focus{outline:0}.ui.calendar .ui.popup .ui.grid{display:block;white-space:nowrap}.ui.calendar .ui.popup .ui.grid>.column{width:auto}.ui.calendar .ui.table.minute,.ui.calendar .ui.table.month,.ui.calendar .ui.table.year{min-width:15em}.ui.calendar .ui.table.day{min-width:18em}.ui.calendar .ui.table.day.andweek{min-width:22em}.ui.calendar .ui.table.hour{min-width:20em}.ui.calendar .ui.table tr td,.ui.calendar .ui.table tr th{padding:.5em;white-space:nowrap}.ui.calendar .ui.table tr th{border-left:none}.ui.calendar .ui.table tr th .icon{margin:0}.ui.calendar .ui.table tr:first-child th{position:relative;padding-left:0;padding-right:0}.ui.calendar .ui.table.day tr:first-child th{border:none}.ui.calendar .ui.table.day tr:nth-child(2) th{padding-top:.2em;padding-bottom:.3em}.ui.calendar .ui.table tr td{padding-left:.1em;padding-right:.1em}.ui.calendar .ui.table tr .link{cursor:pointer}.ui.calendar .ui.table tr .prev.link{width:14.28571429%;position:absolute;left:0}.ui.calendar .ui.table tr .next.link{width:14.28571429%;position:absolute;right:0}.ui.calendar .ui.table tr .disabled{pointer-events:auto;cursor:default;color:rgba(40,40,40,.3)}.ui.calendar .ui.table tr .adjacent:not(.disabled){color:rgba(0,0,0,.6);background:rgba(0,0,0,.03)}.ui.calendar .ui.table tr td.today{font-weight:700}.ui.calendar .ui.table tr td.range{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);-webkit-box-shadow:none;box-shadow:none}.ui.calendar .ui.table.inverted tr td.range{background:rgba(255,255,255,.08);color:#fff;-webkit-box-shadow:none;box-shadow:none}.ui.calendar:not(.disabled) .calendar.active .ui.table tbody tr td.focus,.ui.calendar:not(.disabled) .calendar:focus .ui.table tbody tr td.focus{-webkit-box-shadow:inset 0 0 0 1px #85b7d9;box-shadow:inset 0 0 0 1px #85b7d9}.ui.calendar:not(.disabled) .calendar.active .ui.table.inverted tbody tr td.focus,.ui.calendar:not(.disabled) .calendar:focus .ui.table.inverted tbody tr td.focus{-webkit-box-shadow:inset 0 0 0 1px #85b7d9;box-shadow:inset 0 0 0 1px #85b7d9}.ui.disabled.calendar{opacity:.45}.ui.disabled.calendar .ui.table tr .link,.ui.disabled.calendar>.input{pointer-events:none}/*! + * # Fomantic-UI - Checkbox + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.checkbox{position:relative;display:inline-block;-webkit-backface-visibility:hidden;backface-visibility:hidden;outline:0;vertical-align:baseline;font-style:normal;min-height:17px;font-size:1em;line-height:17px;min-width:17px}.ui.checkbox input[type=checkbox],.ui.checkbox input[type=radio]{cursor:pointer;position:absolute;top:0;left:0;opacity:0!important;outline:0;z-index:3;width:17px;height:17px}.ui.checkbox label{cursor:auto;position:relative;display:block;padding-left:1.85714em;outline:0;font-size:1em}.ui.checkbox label:before{position:absolute;top:0;left:0;width:17px;height:17px;content:'';background:#fff;border-radius:.21428571rem;-webkit-transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;border:1px solid #d4d4d5}.ui.checkbox label:after{position:absolute;font-size:14px;top:0;left:0;width:17px;height:17px;text-align:center;opacity:0;color:rgba(0,0,0,.87);-webkit-transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease}.ui.checkbox label,.ui.checkbox+label{color:rgba(0,0,0,.87);-webkit-transition:color .1s ease;transition:color .1s ease}.ui.checkbox+label{vertical-align:middle}.ui.checkbox label:hover::before{background:#fff;border-color:rgba(34,36,38,.35)}.ui.checkbox label:hover,.ui.checkbox+label:hover{color:rgba(0,0,0,.8)}.ui.checkbox label:active::before{background:#f9fafb;border-color:rgba(34,36,38,.35)}.ui.checkbox label:active::after{color:rgba(0,0,0,.95)}.ui.checkbox input:active~label{color:rgba(0,0,0,.95)}.ui.checkbox input:focus~label:before{background:#fff;border-color:#96c8da}.ui.checkbox input:focus~label:after{color:rgba(0,0,0,.95)}.ui.checkbox input:focus~label{color:rgba(0,0,0,.95)}.ui.checkbox input:checked~label:before{background:#fff;border-color:rgba(34,36,38,.35)}.ui.checkbox input:checked~label:after{opacity:1;color:rgba(0,0,0,.95)}.ui.checkbox input:not([type=radio]):indeterminate~label:before{background:#fff;border-color:rgba(34,36,38,.35)}.ui.checkbox input:not([type=radio]):indeterminate~label:after{opacity:1;color:rgba(0,0,0,.95)}.ui.indeterminate.toggle.checkbox input:not([type=radio]):indeterminate~label:before{background:rgba(0,0,0,.15)}.ui.indeterminate.toggle.checkbox input:not([type=radio])~label:after{left:1.075rem}.ui.checkbox input:checked:focus~label:before,.ui.checkbox input:not([type=radio]):indeterminate:focus~label:before{background:#fff;border-color:#96c8da}.ui.checkbox input:checked:focus~label:after,.ui.checkbox input:not([type=radio]):indeterminate:focus~label:after{color:rgba(0,0,0,.95)}.ui.read-only.checkbox,.ui.read-only.checkbox label{cursor:default}.ui.checkbox input[disabled]~label,.ui.disabled.checkbox label{cursor:default!important;opacity:.5;color:#000}.ui.checkbox input.hidden{z-index:-1}.ui.checkbox input.hidden+label{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ui.radio.checkbox{min-height:15px}.ui.radio.checkbox label{padding-left:1.85714em}.ui.radio.checkbox label:before{content:'';-webkit-transform:none;transform:none;width:15px;height:15px;border-radius:500rem;top:1px;left:0}.ui.radio.checkbox label:after{border:none;content:''!important;line-height:15px;top:1px;left:0;width:15px;height:15px;border-radius:500rem;-webkit-transform:scale(.46666667);transform:scale(.46666667);background-color:rgba(0,0,0,.87)}.ui.radio.checkbox input:focus~label:before{background-color:#fff}.ui.radio.checkbox input:focus~label:after{background-color:rgba(0,0,0,.95)}.ui.radio.checkbox input:indeterminate~label:after{opacity:0}.ui.radio.checkbox input:checked~label:before{background-color:#fff}.ui.radio.checkbox input:checked~label:after{background-color:rgba(0,0,0,.95)}.ui.radio.checkbox input:focus:checked~label:before{background-color:#fff}.ui.radio.checkbox input:focus:checked~label:after{background-color:rgba(0,0,0,.95)}.ui.slider.checkbox{min-height:1.25rem}.ui.slider.checkbox input{width:3.5rem;height:1.25rem}.ui.slider.checkbox label{padding-left:4.5rem;line-height:1rem;color:rgba(0,0,0,.4)}.ui.slider.checkbox label:before{display:block;position:absolute;content:'';-webkit-transform:none;transform:none;border:none!important;left:0;z-index:1;top:.4rem;background-color:rgba(0,0,0,.05);width:3.5rem;height:.21428571rem;border-radius:500rem;-webkit-transition:background .3s ease;transition:background .3s ease}.ui.slider.checkbox label:after{background:#fff -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#fff -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#fff linear-gradient(transparent,rgba(0,0,0,.05));position:absolute;content:''!important;opacity:1;z-index:2;border:none;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;width:1.5rem;height:1.5rem;top:-.25rem;left:0;-webkit-transform:none;transform:none;border-radius:500rem;-webkit-transition:left .3s ease;transition:left .3s ease}.ui.slider.checkbox input:focus~label:before{background-color:rgba(0,0,0,.15);border:none}.ui.slider.checkbox label:hover{color:rgba(0,0,0,.8)}.ui.slider.checkbox label:hover::before{background:rgba(0,0,0,.15)}.ui.slider.checkbox input:checked~label{color:rgba(0,0,0,.95)!important}.ui.slider.checkbox input:checked~label:before{background-color:#545454!important}.ui.slider.checkbox input:checked~label:after{left:2rem}.ui.slider.checkbox input:focus:checked~label{color:rgba(0,0,0,.95)!important}.ui.slider.checkbox input:focus:checked~label:before{background-color:#000!important}.ui.toggle.checkbox{min-height:1.5rem}.ui.toggle.checkbox input{width:3.5rem;height:1.5rem}.ui.toggle.checkbox label{min-height:1.5rem;padding-left:4.5rem;color:rgba(0,0,0,.87)}.ui.toggle.checkbox label{padding-top:.15em}.ui.toggle.checkbox label:before{display:block;position:absolute;content:'';z-index:1;-webkit-transform:none;transform:none;border:none;top:0;background:rgba(0,0,0,.05);-webkit-box-shadow:none;box-shadow:none;width:3.5rem;height:1.5rem;border-radius:500rem}.ui.toggle.checkbox label:after{background:#fff -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#fff -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#fff linear-gradient(transparent,rgba(0,0,0,.05));position:absolute;content:''!important;opacity:1;z-index:2;border:none;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;width:1.5rem;height:1.5rem;top:0;left:0;border-radius:500rem;-webkit-transition:background .3s ease,left .3s ease;transition:background .3s ease,left .3s ease}.ui.toggle.checkbox input~label:after{left:-.05rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset}.ui.toggle.checkbox input:focus~label:before{background-color:rgba(0,0,0,.15);border:none}.ui.toggle.checkbox label:hover::before{background-color:rgba(0,0,0,.15);border:none}.ui.toggle.checkbox input:checked~label{color:rgba(0,0,0,.95)!important}.ui.toggle.checkbox input:checked~label:before{background-color:#2185d0!important}.ui.toggle.checkbox input:checked~label:after{left:2.15rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset}.ui.toggle.checkbox input:focus:checked~label{color:rgba(0,0,0,.95)!important}.ui.toggle.checkbox input:focus:checked~label:before{background-color:#0d71bb!important}.ui.fitted.checkbox label{padding-left:0!important}.ui.fitted.toggle.checkbox{width:3.5rem}.ui.fitted.slider.checkbox{width:3.5rem}.ui.inverted.checkbox label,.ui.inverted.checkbox+label{color:rgba(255,255,255,.9)!important}.ui.inverted.checkbox label:hover{color:#fff!important}.ui.inverted.checkbox label:hover::before{border-color:rgba(34,36,38,.5)}.ui.inverted.slider.checkbox label{color:rgba(255,255,255,.5)}.ui.inverted.slider.checkbox label:before{background-color:rgba(255,255,255,.5)!important}.ui.inverted.slider.checkbox label:hover::before{background:rgba(255,255,255,.7)!important}.ui.inverted.slider.checkbox input:checked~label{color:#fff!important}.ui.inverted.slider.checkbox input:checked~label:before{background-color:rgba(255,255,255,.8)!important}.ui.inverted.slider.checkbox input:focus:checked~label{color:#fff!important}.ui.inverted.slider.checkbox input:focus:checked~label:before{background-color:rgba(255,255,255,.8)!important}.ui.inverted.toggle.checkbox label:before{background-color:rgba(255,255,255,.9)!important}.ui.inverted.toggle.checkbox label:hover::before{background:#fff!important}.ui.inverted.toggle.checkbox input:checked~label{color:#fff!important}.ui.inverted.toggle.checkbox input:checked~label:before{background-color:#2185d0!important}.ui.inverted.toggle.checkbox input:focus:checked~label{color:#fff!important}.ui.inverted.toggle.checkbox input:focus:checked~label:before{background-color:#0d71bb!important}.ui.mini.checkbox{font-size:.78571429em}.ui.tiny.checkbox{font-size:.85714286em}.ui.small.checkbox{font-size:.92857143em}.ui.large.checkbox{font-size:1.14285714em}.ui.large.checkbox:not(.slider):not(.toggle):not(.radio) label:after,.ui.large.checkbox:not(.slider):not(.toggle):not(.radio) label:before,.ui.large.form .checkbox:not(.slider):not(.toggle):not(.radio) label:after,.ui.large.form .checkbox:not(.slider):not(.toggle):not(.radio) label:before{-webkit-transform:scale(1.14285714);transform:scale(1.14285714);-webkit-transform-origin:left;transform-origin:left}.ui.large.checkbox.radio label:before,.ui.large.form .checkbox.radio label:before{-webkit-transform:scale(1.14285714);transform:scale(1.14285714);-webkit-transform-origin:left;transform-origin:left}.ui.large.checkbox.radio label:after,.ui.large.form .checkbox.radio label:after{-webkit-transform:scale(.57142857);transform:scale(.57142857);-webkit-transform-origin:left;transform-origin:left;left:.33571429em}.ui.big.checkbox{font-size:1.28571429em}.ui.big.checkbox:not(.slider):not(.toggle):not(.radio) label:after,.ui.big.checkbox:not(.slider):not(.toggle):not(.radio) label:before,.ui.big.form .checkbox:not(.slider):not(.toggle):not(.radio) label:after,.ui.big.form .checkbox:not(.slider):not(.toggle):not(.radio) label:before{-webkit-transform:scale(1.28571429);transform:scale(1.28571429);-webkit-transform-origin:left;transform-origin:left}.ui.big.checkbox.radio label:before,.ui.big.form .checkbox.radio label:before{-webkit-transform:scale(1.28571429);transform:scale(1.28571429);-webkit-transform-origin:left;transform-origin:left}.ui.big.checkbox.radio label:after,.ui.big.form .checkbox.radio label:after{-webkit-transform:scale(.64285714);transform:scale(.64285714);-webkit-transform-origin:left;transform-origin:left;left:.37142857em}.ui.huge.checkbox{font-size:1.42857143em}.ui.huge.checkbox:not(.slider):not(.toggle):not(.radio) label:after,.ui.huge.checkbox:not(.slider):not(.toggle):not(.radio) label:before,.ui.huge.form .checkbox:not(.slider):not(.toggle):not(.radio) label:after,.ui.huge.form .checkbox:not(.slider):not(.toggle):not(.radio) label:before{-webkit-transform:scale(1.42857143);transform:scale(1.42857143);-webkit-transform-origin:left;transform-origin:left}.ui.huge.checkbox.radio label:before,.ui.huge.form .checkbox.radio label:before{-webkit-transform:scale(1.42857143);transform:scale(1.42857143);-webkit-transform-origin:left;transform-origin:left}.ui.huge.checkbox.radio label:after,.ui.huge.form .checkbox.radio label:after{-webkit-transform:scale(.71428571);transform:scale(.71428571);-webkit-transform-origin:left;transform-origin:left;left:.40714286em}.ui.massive.checkbox{font-size:1.71428571em}.ui.massive.checkbox:not(.slider):not(.toggle):not(.radio) label:after,.ui.massive.checkbox:not(.slider):not(.toggle):not(.radio) label:before,.ui.massive.form .checkbox:not(.slider):not(.toggle):not(.radio) label:after,.ui.massive.form .checkbox:not(.slider):not(.toggle):not(.radio) label:before{-webkit-transform:scale(1.71428571);transform:scale(1.71428571);-webkit-transform-origin:left;transform-origin:left}.ui.massive.checkbox.radio label:before,.ui.massive.form .checkbox.radio label:before{-webkit-transform:scale(1.71428571);transform:scale(1.71428571);-webkit-transform-origin:left;transform-origin:left}.ui.massive.checkbox.radio label:after,.ui.massive.form .checkbox.radio label:after{-webkit-transform:scale(.85714286);transform:scale(.85714286);-webkit-transform-origin:left;transform-origin:left;left:.47857143em}@font-face{font-family:Checkbox;src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBD8AAAC8AAAAYGNtYXAYVtCJAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5Zn4huwUAAAF4AAABYGhlYWQGPe1ZAAAC2AAAADZoaGVhB30DyAAAAxAAAAAkaG10eBBKAEUAAAM0AAAAHGxvY2EAmgESAAADUAAAABBtYXhwAAkALwAAA2AAAAAgbmFtZSC8IugAAAOAAAABknBvc3QAAwAAAAAFFAAAACAAAwMTAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADoAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6AL//f//AAAAAAAg6AD//f//AAH/4xgEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAEUAUQO7AvgAGgAAARQHAQYjIicBJjU0PwE2MzIfAQE2MzIfARYVA7sQ/hQQFhcQ/uMQEE4QFxcQqAF2EBcXEE4QAnMWEP4UEBABHRAXFhBOEBCoAXcQEE4QFwAAAAABAAABbgMlAkkAFAAAARUUBwYjISInJj0BNDc2MyEyFxYVAyUQEBf9SRcQEBAQFwK3FxAQAhJtFxAQEBAXbRcQEBAQFwAAAAABAAAASQMlA24ALAAAARUUBwYrARUUBwYrASInJj0BIyInJj0BNDc2OwE1NDc2OwEyFxYdATMyFxYVAyUQEBfuEBAXbhYQEO4XEBAQEBfuEBAWbhcQEO4XEBACEm0XEBDuFxAQEBAX7hAQF20XEBDuFxAQEBAX7hAQFwAAAQAAAAIAAHRSzT9fDzz1AAsEAAAAAADRsdR3AAAAANGx1HcAAAAAA7sDbgAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAADuwABAAAAAAAAAAAAAAAAAAAABwQAAAAAAAAAAAAAAAIAAAAEAABFAyUAAAMlAAAAAAAAAAoAFAAeAE4AcgCwAAEAAAAHAC0AAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAIAAAAAQAAAAAAAgAHAGkAAQAAAAAAAwAIADkAAQAAAAAABAAIAH4AAQAAAAAABQALABgAAQAAAAAABgAIAFEAAQAAAAAACgAaAJYAAwABBAkAAQAQAAgAAwABBAkAAgAOAHAAAwABBAkAAwAQAEEAAwABBAkABAAQAIYAAwABBAkABQAWACMAAwABBAkABgAQAFkAAwABBAkACgA0ALBDaGVja2JveABDAGgAZQBjAGsAYgBvAHhWZXJzaW9uIDIuMABWAGUAcgBzAGkAbwBuACAAMgAuADBDaGVja2JveABDAGgAZQBjAGsAYgBvAHhDaGVja2JveABDAGgAZQBjAGsAYgBvAHhSZWd1bGFyAFIAZQBnAHUAbABhAHJDaGVja2JveABDAGgAZQBjAGsAYgBvAHhGb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('truetype')}.ui.checkbox .box:after,.ui.checkbox label:after{font-family:Checkbox}.ui.checkbox input:checked~.box:after,.ui.checkbox input:checked~label:after{content:'\e800'}.ui.checkbox input:indeterminate~.box:after,.ui.checkbox input:indeterminate~label:after{font-size:12px;content:'\e801'}/*! + * # Fomantic-UI - Dimmer + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.dimmable:not(body){position:relative}.ui.dimmer{display:none;position:absolute;top:0!important;left:0!important;width:100%;height:100%;text-align:center;vertical-align:middle;padding:1em;background-color:rgba(0,0,0,.85);opacity:0;line-height:1;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-transition:background-color .5s linear;transition:background-color .5s linear;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;will-change:opacity;z-index:1000}.ui.dimmer>.content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;color:#fff}.ui.segment>.ui.dimmer:not(.page){border-radius:inherit}.ui.dimmer:not(.inverted)::-webkit-scrollbar-track{background:rgba(255,255,255,.1)}.ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb{background:rgba(255,255,255,.25)}.ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb:window-inactive{background:rgba(255,255,255,.15)}.ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.35)}.animating.dimmable:not(body),.dimmed.dimmable:not(body){overflow:hidden}.dimmed.dimmable>.ui.animating.dimmer,.dimmed.dimmable>.ui.visible.dimmer,.ui.active.dimmer{display:-webkit-box;display:-ms-flexbox;display:flex;opacity:1}.ui.disabled.dimmer{width:0!important;height:0!important}.dimmed.dimmable>.ui.animating.legacy.dimmer,.dimmed.dimmable>.ui.visible.legacy.dimmer,.ui.active.legacy.dimmer{display:block}.ui[class*="top aligned"].dimmer{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.ui[class*="bottom aligned"].dimmer{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.ui.page.dimmer{position:fixed;-webkit-transform-style:'';transform-style:'';-webkit-perspective:2000px;perspective:2000px;-webkit-transform-origin:center center;transform-origin:center center}body.animating.in.dimmable,body.dimmed.dimmable{overflow:hidden}body.dimmable>.dimmer{position:fixed}.blurring.dimmable>:not(.dimmer){-webkit-filter:initial;filter:initial;-webkit-transition:.8s -webkit-filter ease;transition:.8s -webkit-filter ease;transition:.8s filter ease;transition:.8s filter ease,.8s -webkit-filter ease}.blurring.dimmed.dimmable>:not(.dimmer):not(.popup){-webkit-filter:blur(5px) grayscale(.7);filter:blur(5px) grayscale(.7)}.blurring.dimmable>.dimmer{background-color:rgba(0,0,0,.6)}.blurring.dimmable>.inverted.dimmer{background-color:rgba(255,255,255,.6)}.ui.dimmer>.top.aligned.content>*{vertical-align:top}.ui.dimmer>.bottom.aligned.content>*{vertical-align:bottom}.medium.medium.medium.medium.medium.dimmer{background-color:rgba(0,0,0,.65)}.light.light.light.light.light.dimmer{background-color:rgba(0,0,0,.45)}.very.light.light.light.light.dimmer{background-color:rgba(0,0,0,.25)}.ui.inverted.dimmer{background-color:rgba(255,255,255,.85)}.ui.inverted.dimmer>.content,.ui.inverted.dimmer>.content>*{color:#000}.medium.medium.medium.medium.medium.inverted.dimmer{background-color:rgba(255,255,255,.65)}.light.light.light.light.light.inverted.dimmer{background-color:rgba(255,255,255,.45)}.very.light.light.light.light.inverted.dimmer{background-color:rgba(255,255,255,.25)}.ui.simple.dimmer{display:block;overflow:hidden;opacity:0;width:0;height:0;z-index:-100;background-color:rgba(0,0,0,0)}.dimmed.dimmable>.ui.simple.dimmer{overflow:visible;opacity:1;width:100%;height:100%;background-color:rgba(0,0,0,.85);z-index:1}.ui.simple.inverted.dimmer{background-color:rgba(255,255,255,0)}.dimmed.dimmable>.ui.simple.inverted.dimmer{background-color:rgba(255,255,255,.85)}.ui[class*="bottom dimmer"],.ui[class*="center dimmer"],.ui[class*="top dimmer"]{height:auto}.ui[class*="bottom dimmer"]{top:auto!important;bottom:0}.ui[class*="center dimmer"]{top:50%!important;transform:translateY(-50%);-webkit-transform:translateY(calc(-50% - .5px))}.ui.segment>.ui.ui[class*="top dimmer"]{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.segment>.ui.ui[class*="center dimmer"]{border-radius:0}.ui.segment>.ui.ui[class*="bottom dimmer"]{border-top-left-radius:0;border-top-right-radius:0}.ui[class*="center dimmer"].transition[class*="fade up"].in{-webkit-animation-name:fadeInUpCenter;animation-name:fadeInUpCenter}.ui[class*="center dimmer"].transition[class*="fade down"].in{-webkit-animation-name:fadeInDownCenter;animation-name:fadeInDownCenter}.ui[class*="center dimmer"].transition[class*="fade up"].out{-webkit-animation-name:fadeOutUpCenter;animation-name:fadeOutUpCenter}.ui[class*="center dimmer"].transition[class*="fade down"].out{-webkit-animation-name:fadeOutDownCenter;animation-name:fadeOutDownCenter}.ui[class*="center dimmer"].bounce.transition{-webkit-animation-name:bounceCenter;animation-name:bounceCenter}@-webkit-keyframes fadeInUpCenter{0%{opacity:0;transform:translateY(-40%);-webkit-transform:translateY(calc(-40% - .5px))}100%{opacity:1;transform:translateY(-50%);-webkit-transform:translateY(calc(-50% - .5px))}}@keyframes fadeInUpCenter{0%{opacity:0;transform:translateY(-40%);-webkit-transform:translateY(calc(-40% - .5px))}100%{opacity:1;transform:translateY(-50%);-webkit-transform:translateY(calc(-50% - .5px))}}@-webkit-keyframes fadeInDownCenter{0%{opacity:0;transform:translateY(-60%);-webkit-transform:translateY(calc(-60% - .5px))}100%{opacity:1;transform:translateY(-50%);-webkit-transform:translateY(calc(-50% - .5px))}}@keyframes fadeInDownCenter{0%{opacity:0;transform:translateY(-60%);-webkit-transform:translateY(calc(-60% - .5px))}100%{opacity:1;transform:translateY(-50%);-webkit-transform:translateY(calc(-50% - .5px))}}@-webkit-keyframes fadeOutUpCenter{0%{opacity:1;transform:translateY(-50%);-webkit-transform:translateY(calc(-50% - .5px))}100%{opacity:0;transform:translateY(-45%);-webkit-transform:translateY(calc(-45% - .5px))}}@keyframes fadeOutUpCenter{0%{opacity:1;transform:translateY(-50%);-webkit-transform:translateY(calc(-50% - .5px))}100%{opacity:0;transform:translateY(-45%);-webkit-transform:translateY(calc(-45% - .5px))}}@-webkit-keyframes fadeOutDownCenter{0%{opacity:1;transform:translateY(-50%);-webkit-transform:translateY(calc(-50% - .5px))}100%{opacity:0;transform:translateY(-55%);-webkit-transform:translateY(calc(-55% - .5px))}}@keyframes fadeOutDownCenter{0%{opacity:1;transform:translateY(-50%);-webkit-transform:translateY(calc(-50% - .5px))}100%{opacity:0;transform:translateY(-55%);-webkit-transform:translateY(calc(-55% - .5px))}}@-webkit-keyframes bounceCenter{0%,100%,20%,50%,80%{transform:translateY(-50%);-webkit-transform:translateY(calc(-50% - .5px))}40%{-webkit-transform:translateY(calc(-50% - 30px));transform:translateY(calc(-50% - 30px))}60%{-webkit-transform:translateY(calc(-50% - 15px));transform:translateY(calc(-50% - 15px))}}@keyframes bounceCenter{0%,100%,20%,50%,80%{transform:translateY(-50%);-webkit-transform:translateY(calc(-50% - .5px))}40%{-webkit-transform:translateY(calc(-50% - 30px));transform:translateY(calc(-50% - 30px))}60%{-webkit-transform:translateY(calc(-50% - 15px));transform:translateY(calc(-50% - 15px))}}/*! + * # Fomantic-UI - Dropdown + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.dropdown{cursor:pointer;position:relative;display:inline-block;outline:0;text-align:left;-webkit-transition:width .1s ease,-webkit-box-shadow .1s ease;transition:width .1s ease,-webkit-box-shadow .1s ease;transition:box-shadow .1s ease,width .1s ease;transition:box-shadow .1s ease,width .1s ease,-webkit-box-shadow .1s ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.ui.dropdown .menu{cursor:auto;position:absolute;display:none;outline:0;top:100%;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;margin:0;padding:0 0;background:#fff;font-size:1em;text-shadow:none;text-align:left;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15);border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem;-webkit-transition:opacity .1s ease;transition:opacity .1s ease;z-index:11;will-change:transform,opacity}.ui.dropdown .menu>*{white-space:nowrap}.ui.dropdown>input:not(.search):first-child,.ui.dropdown>select{display:none!important}.ui.dropdown:not(.labeled)>.dropdown.icon{position:relative;width:auto;font-size:.85714286em;margin:0 0 0 1em}.ui.dropdown .menu>.item .dropdown.icon{width:auto;float:right;margin:0 0 0 1em}.ui.dropdown .menu>.item .dropdown.icon+.text{margin-right:1em}.ui.dropdown>.text{display:inline-block;-webkit-transition:none;transition:none}.ui.dropdown .menu>.item{position:relative;cursor:pointer;display:block;border:none;height:auto;min-height:2.57142857rem;text-align:left;border-top:none;line-height:1em;font-size:1rem;color:rgba(0,0,0,.87);padding:.78571429rem 1.14285714rem!important;text-transform:none;font-weight:400;-webkit-box-shadow:none;box-shadow:none;-webkit-touch-callout:none}.ui.dropdown .menu>.item:first-child{border-top-width:0}.ui.dropdown .menu .item>[class*="right floated"],.ui.dropdown>.text>[class*="right floated"]{float:right!important;margin-right:0!important;margin-left:1em!important}.ui.dropdown .menu .item>[class*="left floated"],.ui.dropdown>.text>[class*="left floated"]{float:left!important;margin-left:0!important;margin-right:1em!important}.ui.dropdown .menu .item>.flag.floated,.ui.dropdown .menu .item>.icon.floated,.ui.dropdown .menu .item>.image.floated,.ui.dropdown .menu .item>img.floated{margin-top:0}.ui.dropdown .menu>.header{margin:1rem 0 .75rem;padding:0 1.14285714rem;font-weight:700;text-transform:uppercase}.ui.dropdown .menu>.header:not(.ui){color:rgba(0,0,0,.85);font-size:.78571429em}.ui.dropdown .menu>.divider{border-top:1px solid rgba(34,36,38,.1);height:0;margin:.5em 0}.ui.dropdown .menu>.horizontal.divider{border-top:none}.ui.dropdown.dropdown .menu>.input{width:auto;display:-webkit-box;display:-ms-flexbox;display:flex;margin:1.14285714rem .78571429rem;min-width:10rem}.ui.dropdown .menu>.header+.input{margin-top:0}.ui.dropdown .menu>.input:not(.transparent) input{padding:.5em 1em}.ui.dropdown .menu>.input:not(.transparent) .button,.ui.dropdown .menu>.input:not(.transparent) .icon,.ui.dropdown .menu>.input:not(.transparent) .label{padding-top:.5em;padding-bottom:.5em}.ui.dropdown .menu>.item>.description,.ui.dropdown>.text>.description{float:right;margin:0 0 0 1em;color:rgba(0,0,0,.4)}.ui.dropdown .menu>.message{padding:.78571429rem 1.14285714rem;font-weight:400}.ui.dropdown .menu>.message:not(.ui){color:rgba(0,0,0,.4)}.ui.dropdown .menu .menu{top:0;left:100%;right:auto;margin:0 0 0 -.5em!important;border-radius:.28571429rem!important;z-index:21!important}.ui.dropdown .menu .menu:after{display:none}.ui.dropdown>.text>.flag,.ui.dropdown>.text>.icon,.ui.dropdown>.text>.image,.ui.dropdown>.text>.label,.ui.dropdown>.text>img{margin-top:0}.ui.dropdown .menu>.item>.flag,.ui.dropdown .menu>.item>.icon,.ui.dropdown .menu>.item>.image,.ui.dropdown .menu>.item>.label,.ui.dropdown .menu>.item>img{margin-top:0}.ui.dropdown .menu>.item>.flag,.ui.dropdown .menu>.item>.icon,.ui.dropdown .menu>.item>.image,.ui.dropdown .menu>.item>.label,.ui.dropdown .menu>.item>img,.ui.dropdown>.text>.flag,.ui.dropdown>.text>.icon,.ui.dropdown>.text>.image,.ui.dropdown>.text>.label,.ui.dropdown>.text>img{margin-left:0;float:none;margin-right:.78571429rem}.ui.dropdown .menu>.item>.image:not(.icon),.ui.dropdown .menu>.item>img,.ui.dropdown>.text>.image:not(.icon),.ui.dropdown>.text>img{display:inline-block;vertical-align:top;width:auto;margin-top:-.5em;margin-bottom:-.5em;max-height:2em}.ui.dropdown .ui.menu>.item:before,.ui.menu .ui.dropdown .menu>.item:before{display:none}.ui.menu .ui.dropdown .menu .active.item{border-left:none}.ui.buttons>.ui.dropdown:last-child .menu,.ui.menu .right.dropdown.item .menu,.ui.menu .right.menu .dropdown:last-child .menu{left:auto;right:0}.ui.label.dropdown .menu{min-width:100%}.ui.dropdown.icon.button>.dropdown.icon{margin:0}.ui.button.dropdown .menu{min-width:100%}select.ui.dropdown{height:38px;padding:.5em;border:1px solid rgba(34,36,38,.15);visibility:visible}.ui.selection.dropdown{cursor:pointer;word-wrap:break-word;line-height:1em;white-space:normal;outline:0;-webkit-transform:rotateZ(0);transform:rotateZ(0);min-width:14em;min-height:2.71428571em;background:#fff;display:inline-block;padding:.78571429em 3.2em .78571429em 1em;color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none;border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem;-webkit-transition:width .1s ease,-webkit-box-shadow .1s ease;transition:width .1s ease,-webkit-box-shadow .1s ease;transition:box-shadow .1s ease,width .1s ease;transition:box-shadow .1s ease,width .1s ease,-webkit-box-shadow .1s ease}.ui.selection.dropdown.active,.ui.selection.dropdown.visible{z-index:10}.ui.selection.dropdown>.delete.icon,.ui.selection.dropdown>.dropdown.icon,.ui.selection.dropdown>.search.icon{cursor:pointer;position:absolute;width:auto;height:auto;line-height:1.21428571em;top:.78571429em;right:1em;z-index:3;margin:-.78571429em;padding:.91666667em;opacity:.8;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.compact.selection.dropdown{min-width:0}.ui.selection.dropdown .menu{overflow-x:hidden;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-overflow-scrolling:touch;border-top-width:0!important;width:auto;outline:0;margin:0 -1px;min-width:calc(100% + 2px);width:calc(100% + 2px);border-radius:0 0 .28571429rem .28571429rem;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15);-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.selection.dropdown .menu:after,.ui.selection.dropdown .menu:before{display:none}.ui.selection.dropdown .menu>.message{padding:.78571429rem 1.14285714rem}@media only screen and (max-width:767.98px){.ui.selection.dropdown[class*="very short"] .menu{max-height:4.00714286rem}.ui.selection.dropdown.short .menu{max-height:6.01071429rem}.ui.selection.dropdown .menu{max-height:8.01428571rem}.ui.selection.dropdown.long .menu{max-height:16.02857143rem}.ui.selection.dropdown[class*="very long"] .menu{max-height:24.04285714rem}}@media only screen and (min-width:768px){.ui.selection.dropdown[class*="very short"] .menu{max-height:5.34285714rem}.ui.selection.dropdown.short .menu{max-height:8.01428571rem}.ui.selection.dropdown .menu{max-height:10.68571429rem}.ui.selection.dropdown.long .menu{max-height:21.37142857rem}.ui.selection.dropdown[class*="very long"] .menu{max-height:32.05714286rem}}@media only screen and (min-width:992px){.ui.selection.dropdown[class*="very short"] .menu{max-height:8.01428571rem}.ui.selection.dropdown.short .menu{max-height:12.02142857rem}.ui.selection.dropdown .menu{max-height:16.02857143rem}.ui.selection.dropdown.long .menu{max-height:32.05714286rem}.ui.selection.dropdown[class*="very long"] .menu{max-height:48.08571429rem}}@media only screen and (min-width:1920px){.ui.selection.dropdown[class*="very short"] .menu{max-height:10.68571429rem}.ui.selection.dropdown.short .menu{max-height:16.02857143rem}.ui.selection.dropdown .menu{max-height:21.37142857rem}.ui.selection.dropdown.long .menu{max-height:42.74285714rem}.ui.selection.dropdown[class*="very long"] .menu{max-height:64.11428571rem}}.ui.selection.dropdown .menu>.item{border-top:1px solid #fafafa;padding:.78571429rem 1.14285714rem!important;white-space:normal;word-wrap:normal}.ui.selection.dropdown .menu>.hidden.addition.item{display:none}.ui.selection.dropdown:hover{border-color:rgba(34,36,38,.35);-webkit-box-shadow:none;box-shadow:none}.ui.selection.active.dropdown{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.selection.active.dropdown .menu{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.selection.dropdown:focus{border-color:#96c8da;-webkit-box-shadow:none;box-shadow:none}.ui.selection.dropdown:focus .menu{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.selection.visible.dropdown>.text:not(.default){font-weight:400;color:rgba(0,0,0,.8)}.ui.selection.active.dropdown:hover{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.selection.active.dropdown:hover .menu{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.active.selection.dropdown>.dropdown.icon,.ui.visible.selection.dropdown>.dropdown.icon{opacity:'';z-index:3}.ui.active.selection.dropdown{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.ui.active.empty.selection.dropdown{border-radius:.28571429rem!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.active.empty.selection.dropdown .menu{border:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.search.dropdown{min-width:''}.ui.search.dropdown>input.search{background:none transparent!important;border:none!important;-webkit-box-shadow:none!important;box-shadow:none!important;cursor:text;top:0;left:1px;width:100%;outline:0;-webkit-tap-highlight-color:rgba(255,255,255,0);padding:inherit}.ui.search.dropdown>input.search{position:absolute;z-index:2}.ui.search.dropdown>.text{cursor:text;position:relative;left:1px;z-index:3}.ui.search.selection.dropdown>input.search{line-height:1.21428571em;padding:.67857143em 3.2em .67857143em 1em}.ui.search.selection.dropdown>span.sizer{line-height:1.21428571em;padding:.67857143em 3.2em .67857143em 1em;display:none;white-space:pre}.ui.search.dropdown.active>input.search,.ui.search.dropdown.visible>input.search{cursor:auto}.ui.search.dropdown.active>.text,.ui.search.dropdown.visible>.text{pointer-events:none}.ui.active.search.dropdown input.search:focus+.text .flag,.ui.active.search.dropdown input.search:focus+.text .icon{opacity:.45}.ui.active.search.dropdown input.search:focus+.text{color:rgba(115,115,115,.87)!important}.ui.search.dropdown .menu{overflow-x:hidden;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-overflow-scrolling:touch}@media only screen and (max-width:767.98px){.ui.search.dropdown .menu{max-height:8.01428571rem}}@media only screen and (min-width:768px){.ui.search.dropdown .menu{max-height:10.68571429rem}}@media only screen and (min-width:992px){.ui.search.dropdown .menu{max-height:16.02857143rem}}@media only screen and (min-width:1920px){.ui.search.dropdown .menu{max-height:21.37142857rem}}.ui.dropdown>.remove.icon{cursor:pointer;font-size:.85714286em;margin:-.78571429em;padding:.91666667em;right:3em;top:.78571429em;position:absolute;opacity:.6;z-index:3}.ui.clearable.dropdown .text,.ui.clearable.dropdown a:last-of-type{margin-right:1.5em}.ui.dropdown input:not([value])~.remove.icon,.ui.dropdown input[value='']~.remove.icon,.ui.dropdown select.noselection~.remove.icon,.ui.dropdown.loading>.remove.icon{display:none}.ui.multiple.dropdown{padding:.22619048em 3.2em .22619048em .35714286em}.ui.multiple.dropdown .menu{cursor:auto}.ui.multiple.dropdown>.label{display:inline-block;white-space:normal;font-size:1em;padding:.35714286em .78571429em;margin:.14285714rem .28571429rem .14285714rem 0;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.15) inset}.ui.multiple.dropdown .dropdown.icon{margin:'';padding:''}.ui.multiple.dropdown>.text{position:static;padding:0;max-width:100%;margin:.45238095em 0 .45238095em .64285714em;line-height:1.21428571em}.ui.multiple.dropdown>.label~input.search{margin-left:.14285714em!important}.ui.multiple.dropdown>.label~.text{display:none}.ui.multiple.dropdown>.label:not(.image)>img:not(.centered){margin-right:.78571429rem}.ui.multiple.dropdown>.label:not(.image)>img.ui:not(.avatar){margin-bottom:.39285714rem}.ui.multiple.dropdown>.image.label img{margin:-.35714286em .78571429em -.35714286em -.78571429em;height:1.71428571em}.ui.multiple.search.dropdown,.ui.multiple.search.dropdown>input.search{cursor:text}.ui.multiple.search.dropdown>.text{display:inline-block;position:absolute;top:0;left:0;padding:inherit;margin:.45238095em 0 .45238095em .64285714em;line-height:1.21428571em}.ui.multiple.search.dropdown>.label~.text{display:none}.ui.multiple.search.dropdown>input.search{position:static;padding:0;max-width:100%;margin:.45238095em 0 .45238095em .64285714em;width:2.2em;line-height:1.21428571em}.ui.inline.dropdown{cursor:pointer;display:inline-block;color:inherit}.ui.inline.dropdown .dropdown.icon{margin:0 .21428571em 0 .21428571em;vertical-align:baseline}.ui.inline.dropdown>.text{font-weight:700}.ui.inline.dropdown .menu{cursor:auto;margin-top:.21428571em;border-radius:.28571429rem}.ui.dropdown .menu .active.item{background:0 0;font-weight:700;color:rgba(0,0,0,.95);-webkit-box-shadow:none;box-shadow:none;z-index:12}.ui.dropdown .menu>.item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);z-index:13}.ui.default.dropdown:not(.button)>.text,.ui.dropdown:not(.button)>.default.text{color:rgba(191,191,191,.87)}.ui.default.dropdown:not(.button)>input:focus~.text,.ui.dropdown:not(.button)>input:focus~.default.text{color:rgba(115,115,115,.87)}.ui.loading.dropdown>i.icon{height:1em!important}.ui.loading.selection.dropdown>i.icon{padding:1.5em 1.28571429em!important}.ui.loading.dropdown>i.icon:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loading.dropdown>i.icon:after{position:absolute;content:'';top:50%;left:50%;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;-webkit-animation:loader .6s infinite linear;animation:loader .6s infinite linear;border:.2em solid #767676;border-radius:500rem}.ui.loading.dropdown.button>i.icon:after,.ui.loading.dropdown.button>i.icon:before{display:none}.ui.loading.dropdown>.text{-webkit-transition:none;transition:none}.ui.dropdown .loading.menu{display:block;visibility:hidden;z-index:-1}.ui.dropdown>.loading.menu{left:0!important;right:auto!important}.ui.dropdown>.menu .loading.menu{left:100%!important;right:auto!important}.ui.dropdown .menu .selected.item,.ui.dropdown.selected{background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.dropdown>.filtered.text{visibility:hidden}.ui.dropdown .filtered.item{display:none!important}.ui.dropdown.error,.ui.dropdown.error>.default.text,.ui.dropdown.error>.text{color:#9f3a38}.ui.selection.dropdown.error{background:#fff6f6;border-color:#e0b4b4}.ui.selection.dropdown.error:hover{border-color:#e0b4b4}.ui.multiple.selection.error.dropdown>.label{border-color:#e0b4b4}.ui.dropdown.error>.menu,.ui.dropdown.error>.menu .menu{border-color:#e0b4b4}.ui.dropdown.error>.menu>.item{color:#9f3a38}.ui.dropdown.error>.menu>.item:hover{background-color:#fbe7e7}.ui.dropdown.error>.menu .active.item{background-color:#fdcfcf}.ui.dropdown.info,.ui.dropdown.info>.default.text,.ui.dropdown.info>.text{color:#276f86}.ui.selection.dropdown.info{background:#f8ffff;border-color:#a9d5de}.ui.selection.dropdown.info:hover{border-color:#a9d5de}.ui.multiple.selection.info.dropdown>.label{border-color:#a9d5de}.ui.dropdown.info>.menu,.ui.dropdown.info>.menu .menu{border-color:#a9d5de}.ui.dropdown.info>.menu>.item{color:#276f86}.ui.dropdown.info>.menu>.item:hover{background-color:#e9f2fb}.ui.dropdown.info>.menu .active.item{background-color:#cef1fd}.ui.dropdown.success,.ui.dropdown.success>.default.text,.ui.dropdown.success>.text{color:#2c662d}.ui.selection.dropdown.success{background:#fcfff5;border-color:#a3c293}.ui.selection.dropdown.success:hover{border-color:#a3c293}.ui.multiple.selection.success.dropdown>.label{border-color:#a3c293}.ui.dropdown.success>.menu,.ui.dropdown.success>.menu .menu{border-color:#a3c293}.ui.dropdown.success>.menu>.item{color:#2c662d}.ui.dropdown.success>.menu>.item:hover{background-color:#e9fbe9}.ui.dropdown.success>.menu .active.item{background-color:#dafdce}.ui.dropdown.warning,.ui.dropdown.warning>.default.text,.ui.dropdown.warning>.text{color:#573a08}.ui.selection.dropdown.warning{background:#fffaf3;border-color:#c9ba9b}.ui.selection.dropdown.warning:hover{border-color:#c9ba9b}.ui.multiple.selection.warning.dropdown>.label{border-color:#c9ba9b}.ui.dropdown.warning>.menu,.ui.dropdown.warning>.menu .menu{border-color:#c9ba9b}.ui.dropdown.warning>.menu>.item{color:#573a08}.ui.dropdown.warning>.menu>.item:hover{background-color:#fbfbe9}.ui.dropdown.warning>.menu .active.item{background-color:#fdfdce}.ui.dropdown>.clear.dropdown.icon{opacity:.8;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.dropdown>.clear.dropdown.icon:hover{opacity:1}.ui.disabled.dropdown,.ui.dropdown .menu>.disabled.item{cursor:default;pointer-events:none;opacity:.45}.ui.dropdown .menu{left:0}.ui.dropdown .menu .right.menu,.ui.dropdown .right.menu>.menu{left:100%!important;right:auto!important;border-radius:.28571429rem!important}.ui.dropdown>.left.menu{left:auto!important;right:0!important}.ui.dropdown .menu .left.menu,.ui.dropdown>.left.menu .menu{left:auto;right:100%;margin:0 -.5em 0 0!important;border-radius:.28571429rem!important}.ui.dropdown .item .left.dropdown.icon,.ui.dropdown .left.menu .item .dropdown.icon{width:auto;float:left;margin:0}.ui.dropdown .item .left.dropdown.icon,.ui.dropdown .left.menu .item .dropdown.icon{width:auto;float:left;margin:0}.ui.dropdown .item .left.dropdown.icon+.text,.ui.dropdown .left.menu .item .dropdown.icon+.text{margin-left:1em;margin-right:0}.ui.upward.dropdown>.menu{top:auto;bottom:100%;-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.08);box-shadow:0 0 3px 0 rgba(0,0,0,.08);border-radius:.28571429rem .28571429rem 0 0}.ui.dropdown .upward.menu{top:auto!important;bottom:0!important}.ui.simple.upward.active.dropdown,.ui.simple.upward.dropdown:hover{border-radius:.28571429rem .28571429rem 0 0!important}.ui.upward.dropdown.button:not(.pointing):not(.floating).active{border-radius:.28571429rem .28571429rem 0 0}.ui.upward.selection.dropdown .menu{border-top-width:1px!important;border-bottom-width:0!important;-webkit-box-shadow:0 -2px 3px 0 rgba(0,0,0,.08);box-shadow:0 -2px 3px 0 rgba(0,0,0,.08)}.ui.upward.selection.dropdown:hover{-webkit-box-shadow:0 0 2px 0 rgba(0,0,0,.05);box-shadow:0 0 2px 0 rgba(0,0,0,.05)}.ui.active.upward.selection.dropdown{border-radius:0 0 .28571429rem .28571429rem!important}.ui.upward.selection.dropdown.visible{-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.08);box-shadow:0 0 3px 0 rgba(0,0,0,.08);border-radius:0 0 .28571429rem .28571429rem!important}.ui.upward.active.selection.dropdown:hover{-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.05);box-shadow:0 0 3px 0 rgba(0,0,0,.05)}.ui.upward.active.selection.dropdown:hover .menu{-webkit-box-shadow:0 -2px 3px 0 rgba(0,0,0,.08);box-shadow:0 -2px 3px 0 rgba(0,0,0,.08)}.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{overflow-x:hidden;overflow-y:auto}.ui.scrolling.dropdown .menu{overflow-x:hidden;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-overflow-scrolling:touch;min-width:100%!important;width:auto!important}.ui.dropdown .scrolling.menu{position:static;overflow-y:auto;border:none;-webkit-box-shadow:none!important;box-shadow:none!important;border-radius:0!important;margin:0!important;min-width:100%!important;width:auto!important;border-top:1px solid rgba(34,36,38,.15)}.ui.dropdown .scrolling.menu>.item.item.item,.ui.scrolling.dropdown .menu .item.item.item{border-top:none}.ui.dropdown .scrolling.menu .item:first-child,.ui.scrolling.dropdown .menu .item:first-child{border-top:none}.ui.dropdown>.animating.menu .scrolling.menu,.ui.dropdown>.visible.menu .scrolling.menu{display:block}@media all and (-ms-high-contrast:none){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{min-width:calc(100% - 17px)}}@media only screen and (max-width:767.98px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:10.28571429rem}}@media only screen and (min-width:768px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:15.42857143rem}}@media only screen and (min-width:992px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:20.57142857rem}}@media only screen and (min-width:1920px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:20.57142857rem}}.ui.dropdown[class*="two column"]>.menu>.item{display:inline-block;width:50%}.ui.dropdown[class*="three column"]>.menu>.item{display:inline-block;width:33%}.ui.dropdown[class*="four column"]>.menu>.item{display:inline-block;width:25%}.ui.dropdown[class*="five column"]>.menu>.item{display:inline-block;width:20%}.ui.simple.dropdown .menu:after,.ui.simple.dropdown .menu:before{display:none}.ui.simple.dropdown .menu{position:absolute;display:-ms-inline-flexbox!important;display:block;overflow:hidden;top:-9999px;opacity:0;width:0;height:0;-webkit-transition:opacity .1s ease;transition:opacity .1s ease;margin-top:0!important}.ui.simple.active.dropdown,.ui.simple.dropdown:hover{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.ui.simple.active.dropdown>.menu,.ui.simple.dropdown:hover>.menu{overflow:visible;width:auto;height:auto;top:100%;opacity:1}.ui.simple.dropdown:hover>.menu>.item:hover>.menu,.ui.simple.dropdown>.menu>.item:active>.menu{overflow:visible;width:auto;height:auto;top:0!important;left:100%!important;opacity:1}.ui.simple.disabled.dropdown:hover .menu{display:none;height:0;width:0;overflow:hidden}.ui.simple.visible.dropdown>.menu{display:block}.ui.simple.scrolling.active.dropdown>.menu,.ui.simple.scrolling.dropdown:hover>.menu{overflow-x:hidden;overflow-y:auto}.ui.fluid.dropdown{display:block;width:100%!important;min-width:0}.ui.fluid.dropdown>.dropdown.icon{float:right}.ui.floating.dropdown .menu{left:0;right:auto;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)!important;box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)!important;border-radius:.28571429rem!important}.ui.floating.dropdown>.menu{border-radius:.28571429rem!important}.ui:not(.upward).floating.dropdown>.menu{margin-top:.5em}.ui.upward.floating.dropdown>.menu{margin-bottom:.5em}.ui.pointing.dropdown>.menu{top:100%;margin-top:.78571429rem;border-radius:.28571429rem}.ui.pointing.dropdown>.menu:not(.hidden):after{display:block;position:absolute;pointer-events:none;content:'';visibility:visible;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:.5em;height:.5em;-webkit-box-shadow:-1px -1px 0 0 rgba(34,36,38,.15);box-shadow:-1px -1px 0 0 rgba(34,36,38,.15);background:#fff;z-index:2}.ui.pointing.dropdown>.menu:not(.hidden):after{top:-.25em;left:50%;margin:0 0 0 -.25em}.ui.top.left.pointing.dropdown>.menu{top:100%;bottom:auto;left:0;right:auto;margin:1em 0 0}.ui.top.left.pointing.dropdown>.menu{top:100%;bottom:auto;left:0;right:auto;margin:1em 0 0}.ui.top.left.pointing.dropdown>.menu:after{top:-.25em;left:1em;right:auto;margin:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.ui.top.right.pointing.dropdown>.menu{top:100%;bottom:auto;right:0;left:auto;margin:1em 0 0}.ui.top.pointing.dropdown>.left.menu:after,.ui.top.right.pointing.dropdown>.menu:after{top:-.25em;left:auto!important;right:1em!important;margin:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.ui.left.pointing.dropdown>.menu{top:0;left:100%;right:auto;margin:0 0 0 1em}.ui.left.pointing.dropdown>.menu:after{top:1em;left:-.25em;margin:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.ui.left:not(.top):not(.bottom).pointing.dropdown>.left.menu{left:auto!important;right:100%!important;margin:0 1em 0 0}.ui.left:not(.top):not(.bottom).pointing.dropdown>.left.menu:after{top:1em;left:auto;right:-.25em;margin:0;-webkit-transform:rotate(135deg);transform:rotate(135deg)}.ui.right.pointing.dropdown>.menu{top:0;left:auto;right:100%;margin:0 1em 0 0}.ui.right.pointing.dropdown>.menu:after{top:1em;left:auto;right:-.25em;margin:0;-webkit-transform:rotate(135deg);transform:rotate(135deg)}.ui.bottom.pointing.dropdown>.menu{top:auto;bottom:100%;left:0;right:auto;margin:0 0 1em}.ui.bottom.pointing.dropdown>.menu:after{top:auto;bottom:-.25em;right:auto;margin:0;-webkit-transform:rotate(-135deg);transform:rotate(-135deg)}.ui.bottom.pointing.dropdown>.menu .menu{top:auto!important;bottom:0!important}.ui.bottom.left.pointing.dropdown>.menu{left:0;right:auto}.ui.bottom.left.pointing.dropdown>.menu:after{left:1em;right:auto}.ui.bottom.right.pointing.dropdown>.menu{right:0;left:auto}.ui.bottom.right.pointing.dropdown>.menu:after{left:auto;right:1em}.ui.pointing.upward.dropdown .menu,.ui.top.pointing.upward.dropdown .menu{top:auto!important;bottom:100%!important;margin:0 0 .78571429rem;border-radius:.28571429rem}.ui.pointing.upward.dropdown .menu:after,.ui.top.pointing.upward.dropdown .menu:after{top:100%!important;bottom:auto!important;-webkit-box-shadow:1px 1px 0 0 rgba(34,36,38,.15);box-shadow:1px 1px 0 0 rgba(34,36,38,.15);margin:-.25em 0 0}.ui.right.pointing.upward.dropdown:not(.top):not(.bottom) .menu{top:auto!important;bottom:0!important;margin:0 1em 0 0}.ui.right.pointing.upward.dropdown:not(.top):not(.bottom) .menu:after{top:auto!important;bottom:0!important;margin:0 0 1em 0;-webkit-box-shadow:-1px -1px 0 0 rgba(34,36,38,.15);box-shadow:-1px -1px 0 0 rgba(34,36,38,.15)}.ui.left.pointing.upward.dropdown:not(.top):not(.bottom) .menu{top:auto!important;bottom:0!important;margin:0 0 0 1em}.ui.left.pointing.upward.dropdown:not(.top):not(.bottom) .menu:after{top:auto!important;bottom:0!important;margin:0 0 1em 0;-webkit-box-shadow:-1px -1px 0 0 rgba(34,36,38,.15);box-shadow:-1px -1px 0 0 rgba(34,36,38,.15)}.ui.dropdown,.ui.dropdown .menu>.item{font-size:1rem}.ui.mini.dropdown,.ui.mini.dropdown .menu>.item{font-size:.78571429rem}.ui.tiny.dropdown,.ui.tiny.dropdown .menu>.item{font-size:.85714286rem}.ui.small.dropdown,.ui.small.dropdown .menu>.item{font-size:.92857143rem}.ui.large.dropdown,.ui.large.dropdown .menu>.item{font-size:1.14285714rem}.ui.big.dropdown,.ui.big.dropdown .menu>.item{font-size:1.28571429rem}.ui.huge.dropdown,.ui.huge.dropdown .menu>.item{font-size:1.42857143rem}.ui.massive.dropdown,.ui.massive.dropdown .menu>.item{font-size:1.71428571rem}.ui.inverted.dropdown .menu{background:#1b1c1d;-webkit-box-shadow:none;box-shadow:none;border:1px solid rgba(255,255,255,.15)}.ui.inverted.dropdown .menu>.item{color:rgba(255,255,255,.8)}.ui.inverted.dropdown .menu .active.item{background:0 0;color:rgba(255,255,255,.8);-webkit-box-shadow:none;box-shadow:none}.ui.inverted.dropdown .menu>.item:hover{background:rgba(255,255,255,.08);color:rgba(255,255,255,.8)}.ui.inverted.dropdown .menu .selected.item,.ui.inverted.dropdown.selected{background:rgba(255,255,255,.15);color:rgba(255,255,255,.8)}.ui.inverted.dropdown .menu>.header{color:#fff}.ui.inverted.dropdown .menu>.item>.description,.ui.inverted.dropdown>.text>.description{color:rgba(255,255,255,.5)}.ui.inverted.dropdown .menu>.divider{border-top:1px solid rgba(255,255,255,.15)}.ui.inverted.dropdown .scrolling.menu{border:none;border-top:1px solid rgba(255,255,255,.15)}.ui.inverted.selection.dropdown{border:1px solid rgba(255,255,255,.15);background:#1b1c1d;color:rgba(255,255,255,.8)}.ui.inverted.selection.dropdown:hover{border-color:rgba(255,255,255,.25);-webkit-box-shadow:none;box-shadow:none}.ui.inverted.selection.dropdown input{color:#fff}.ui.inverted.selection.visible.dropdown>.text:not(.default){color:rgba(255,255,255,.9)}.ui.inverted.selection.active.dropdown .menu,.ui.inverted.selection.active.dropdown:hover{border-color:rgba(255,255,255,.15)}.ui.inverted.selection.dropdown .menu>.item{border-top:1px solid #242526}.ui.inverted.default.dropdown:not(.button)>.text,.ui.inverted.dropdown:not(.button)>.default.text{color:rgba(255,255,255,.5)}.ui.inverted.default.dropdown:not(.button)>input:focus~.text,.ui.inverted.dropdown:not(.button)>input:focus~.default.text{color:rgba(255,255,255,.7)}.ui.inverted.active.search.dropdown input.search:focus+.text .flag,.ui.inverted.active.search.dropdown input.search:focus+.text .icon{opacity:.45}.ui.inverted.active.search.dropdown input.search:focus+.text{color:rgba(255,255,255,.7)!important}.ui.inverted.dropdown .menu>.message:not(.ui){color:rgba(255,255,255,.5)}.ui.inverted.dropdown .menu>.item:first-child{border-top-width:0}.ui.inverted.multiple.dropdown>.label{background-color:rgba(255,255,255,.7);background-image:none;color:#000;-webkit-box-shadow:0 0 0 1px rgba(255,255,255,0) inset;box-shadow:0 0 0 1px rgba(255,255,255,0) inset}.ui.inverted.multiple.dropdown>.label:hover{background-color:rgba(255,255,255,.9);border-color:rgba(255,255,255,.9);background-image:none;color:#000}.ui.inverted.multiple.dropdown>.label>.close.icon,.ui.inverted.multiple.dropdown>.label>.delete.icon{opacity:.6}.ui.inverted.multiple.dropdown>.label>.close.icon:hover,.ui.inverted.multiple.dropdown>.label>.delete.icon:hover{opacity:.8}.ui.inverted.dropdown input::-webkit-selection,.ui.inverted.dropdown textarea::-webkit-selection{background-color:rgba(255,255,255,.25);color:rgba(255,255,255,.8)}.ui.inverted.dropdown input::-moz-selection,.ui.inverted.dropdown textarea::-moz-selection{background-color:rgba(255,255,255,.25);color:rgba(255,255,255,.8)}.ui.inverted.dropdown input::selection,.ui.inverted.dropdown textarea::selection{background-color:rgba(255,255,255,.25);color:rgba(255,255,255,.8)}.ui.inverted.dropdown .menu::-webkit-scrollbar-track{background:rgba(255,255,255,.1)}.ui.inverted.dropdown .menu::-webkit-scrollbar-thumb{background:rgba(255,255,255,.25)}.ui.inverted.dropdown .menu::-webkit-scrollbar-thumb:window-inactive{background:rgba(255,255,255,.15)}.ui.inverted.dropdown .menu::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.35)}.ui.inverted.pointing.dropdown>.menu:after{background:#1b1c1d;-webkit-box-shadow:-1px -1px 0 0 rgba(255,255,255,.15);box-shadow:-1px -1px 0 0 rgba(255,255,255,.15)}@font-face{font-family:Dropdown;src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMggjB5AAAAC8AAAAYGNtYXAPfuIIAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zjo82LgAAAFwAAABVGhlYWQAQ88bAAACxAAAADZoaGVhAwcB6QAAAvwAAAAkaG10eAS4ABIAAAMgAAAAIGxvY2EBNgDeAAADQAAAABJtYXhwAAoAFgAAA1QAAAAgbmFtZVcZpu4AAAN0AAABRXBvc3QAAwAAAAAEvAAAACAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADw2gHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIPDa//3//wAAAAAAIPDX//3//wAB/+MPLQADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAIABJQElABMAABM0NzY3BTYXFhUUDwEGJwYvASY1AAUGBwEACAUGBoAFCAcGgAUBEgcGBQEBAQcECQYHfwYBAQZ/BwYAAQAAAG4BJQESABMAADc0PwE2MzIfARYVFAcGIyEiJyY1AAWABgcIBYAGBgUI/wAHBgWABwaABQWABgcHBgUFBgcAAAABABIASQC3AW4AEwAANzQ/ATYXNhcWHQEUBwYnBi8BJjUSBoAFCAcFBgYFBwgFgAbbBwZ/BwEBBwQJ/wgEBwEBB38GBgAAAAABAAAASQClAW4AEwAANxE0NzYzMh8BFhUUDwEGIyInJjUABQYHCAWABgaABQgHBgVbAQAIBQYGgAUIBwWABgYFBwAAAAEAAAABAADZuaKOXw889QALAgAAAAAA0ABHWAAAAADQAEdYAAAAAAElAW4AAAAIAAIAAAAAAAAAAQAAAeD/4AAAAgAAAAAAASUAAQAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAABAAAAASUAAAElAAAAtwASALcAAAAAAAAACgAUAB4AQgBkAIgAqgAAAAEAAAAIABQAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAOAAAAAQAAAAAAAgAOAEcAAQAAAAAAAwAOACQAAQAAAAAABAAOAFUAAQAAAAAABQAWAA4AAQAAAAAABgAHADIAAQAAAAAACgA0AGMAAwABBAkAAQAOAAAAAwABBAkAAgAOAEcAAwABBAkAAwAOACQAAwABBAkABAAOAFUAAwABBAkABQAWAA4AAwABBAkABgAOADkAAwABBAkACgA0AGMAaQBjAG8AbQBvAG8AbgBWAGUAcgBzAGkAbwBuACAAMQAuADAAaQBjAG8AbQBvAG8Abmljb21vb24AaQBjAG8AbQBvAG8AbgBSAGUAZwB1AGwAYQByAGkAYwBvAG0AbwBvAG4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,d09GRk9UVE8AAAVwAAoAAAAABSgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABDRkYgAAAA9AAAAdkAAAHZLDXE/09TLzIAAALQAAAAYAAAAGAIIweQY21hcAAAAzAAAABMAAAATA9+4ghnYXNwAAADfAAAAAgAAAAIAAAAEGhlYWQAAAOEAAAANgAAADYAQ88baGhlYQAAA7wAAAAkAAAAJAMHAelobXR4AAAD4AAAACAAAAAgBLgAEm1heHAAAAQAAAAABgAAAAYACFAAbmFtZQAABAgAAAFFAAABRVcZpu5wb3N0AAAFUAAAACAAAAAgAAMAAAEABAQAAQEBCGljb21vb24AAQIAAQA6+BwC+BsD+BgEHgoAGVP/i4seCgAZU/+LiwwHi2v4lPh0BR0AAACIDx0AAACNER0AAAAJHQAAAdASAAkBAQgPERMWGyAlKmljb21vb25pY29tb29udTB1MXUyMHVGMEQ3dUYwRDh1RjBEOXVGMERBAAACAYkABgAIAgABAAQABwAKAA0AVgCfAOgBL/yUDvyUDvyUDvuUDvtvi/emFYuQjZCOjo+Pj42Qiwj3lIsFkIuQiY6Hj4iNhouGi4aJh4eHCPsU+xQFiIiGiYaLhouHjYeOCPsU9xQFiI+Jj4uQCA77b4v3FBWLkI2Pjo8I9xT3FAWPjo+NkIuQi5CJjogI9xT7FAWPh42Hi4aLhomHh4eIiIaJhosI+5SLBYaLh42HjoiPiY+LkAgO+92d928Vi5CNkI+OCPcU9xQFjo+QjZCLkIuPiY6Hj4iNhouGCIv7lAWLhomHh4iIh4eJhouGi4aNiI8I+xT3FAWHjomPi5AIDvvdi+YVi/eUBYuQjZCOjo+Pj42Qi5CLkImOhwj3FPsUBY+IjYaLhouGiYeHiAj7FPsUBYiHhomGi4aLh42Hj4iOiY+LkAgO+JQU+JQViwwKAAAAAAMCAAGQAAUAAAFMAWYAAABHAUwBZgAAAPUAGQCEAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA8NoB4P/g/+AB4AAgAAAAAQAAAAAAAAAAAAAAIAAAAAAAAgAAAAMAAAAUAAMAAQAAABQABAA4AAAACgAIAAIAAgABACDw2v/9//8AAAAAACDw1//9//8AAf/jDy0AAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAABAAA5emozXw889QALAgAAAAAA0ABHWAAAAADQAEdYAAAAAAElAW4AAAAIAAIAAAAAAAAAAQAAAeD/4AAAAgAAAAAAASUAAQAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAABAAAAASUAAAElAAAAtwASALcAAAAAUAAACAAAAAAADgCuAAEAAAAAAAEADgAAAAEAAAAAAAIADgBHAAEAAAAAAAMADgAkAAEAAAAAAAQADgBVAAEAAAAAAAUAFgAOAAEAAAAAAAYABwAyAAEAAAAAAAoANABjAAMAAQQJAAEADgAAAAMAAQQJAAIADgBHAAMAAQQJAAMADgAkAAMAAQQJAAQADgBVAAMAAQQJAAUAFgAOAAMAAQQJAAYADgA5AAMAAQQJAAoANABjAGkAYwBvAG0AbwBvAG4AVgBlAHIAcwBpAG8AbgAgADEALgAwAGkAYwBvAG0AbwBvAG5pY29tb29uAGkAYwBvAG0AbwBvAG4AUgBlAGcAdQBsAGEAcgBpAGMAbwBtAG8AbwBuAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff');font-weight:400;font-style:normal}.ui.dropdown>.dropdown.icon{font-family:Dropdown;line-height:1;height:1em;width:1.23em;-webkit-backface-visibility:hidden;backface-visibility:hidden;font-weight:400;font-style:normal;text-align:center}.ui.dropdown>.dropdown.icon{width:auto}.ui.dropdown>.dropdown.icon:before{content:'\f0d7'}.ui.dropdown .menu .item .dropdown.icon:before{content:'\f0da'}.ui.dropdown .item .left.dropdown.icon:before,.ui.dropdown .left.menu .item .dropdown.icon:before{content:"\f0d9"}.ui.vertical.menu .dropdown.item>.dropdown.icon:before{content:"\f0da"}/*! + * # Fomantic-UI - Video + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.embed{position:relative;max-width:100%;height:0;overflow:hidden;background:#dcddde;padding-bottom:56.25%}.ui.embed embed,.ui.embed iframe,.ui.embed object{position:absolute;border:none;width:100%;height:100%;top:0;left:0;margin:0;padding:0;overflow:hidden}.ui.embed>.embed{display:none}.ui.embed>.placeholder{position:absolute;cursor:pointer;top:0;left:0;display:block;width:100%;height:100%;background-color:radial-gradient(transparent 45%,rgba(0,0,0,.3))}.ui.embed>.icon{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;z-index:2}.ui.embed>.icon:after{position:absolute;top:0;left:0;width:100%;height:100%;z-index:3;content:'';background:-webkit-radial-gradient(transparent 45%,rgba(0,0,0,.3));background:radial-gradient(transparent 45%,rgba(0,0,0,.3));opacity:.5;-webkit-transition:opacity .5s ease;transition:opacity .5s ease}.ui.embed>.icon:before{position:absolute;top:50%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);color:#fff;font-size:6rem;text-shadow:0 2px 10px rgba(34,36,38,.2);-webkit-transition:opacity .5s ease,color .5s ease;transition:opacity .5s ease,color .5s ease;z-index:10}.ui.embed .icon:hover:after{background:-webkit-radial-gradient(transparent 45%,rgba(0,0,0,.3));background:radial-gradient(transparent 45%,rgba(0,0,0,.3));opacity:1}.ui.embed .icon:hover:before{color:#fff}.ui.active.embed>.icon,.ui.active.embed>.placeholder{display:none}.ui.active.embed>.embed{display:block}.ui.square.embed{padding-bottom:100%}.ui[class*="4:3"].embed{padding-bottom:75%}.ui[class*="16:9"].embed{padding-bottom:56.25%}.ui[class*="21:9"].embed{padding-bottom:42.85714286%}/*! + * # Fomantic-UI - Modal + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.modal{position:absolute;display:none;z-index:1001;text-align:left;background:#fff;border:none;-webkit-box-shadow:1px 3px 3px 0 rgba(0,0,0,.2),1px 3px 15px 2px rgba(0,0,0,.2);box-shadow:1px 3px 3px 0 rgba(0,0,0,.2),1px 3px 15px 2px rgba(0,0,0,.2);-webkit-transform-origin:50% 25%;transform-origin:50% 25%;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;border-radius:.28571429rem;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;will-change:top,left,margin,transform,opacity}.ui.modal>.dimmer:first-child+.icon+*,.ui.modal>.dimmer:first-child+:not(.icon),.ui.modal>.icon:first-child+*,.ui.modal>:first-child:not(.icon):not(.dimmer){border-top-left-radius:.28571429rem;border-top-right-radius:.28571429rem}.ui.modal>:last-child{border-bottom-left-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.modal>.close{cursor:pointer;position:absolute;top:-2.5rem;right:-2.5rem;z-index:1;opacity:.8;font-size:1.25em;color:#fff;width:2.25rem;height:2.25rem;padding:.625rem 0 0 0}.ui.modal>.close:hover{opacity:1}.ui.modal>.header{display:block;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;background:#fff;margin:0;padding:1.25rem 1.5rem;-webkit-box-shadow:none;box-shadow:none;color:rgba(0,0,0,.85);border-bottom:1px solid rgba(34,36,38,.15)}.ui.modal>.header:not(.ui){font-size:1.42857143rem;line-height:1.28571429em;font-weight:700}.ui.modal>.content{display:block;width:100%;font-size:1em;line-height:1.4;padding:1.5rem;background:#fff}.ui.modal>.image.content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.ui.modal>.content>.image{display:block;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:'';-ms-flex-item-align:start;align-self:start;max-width:100%}.ui.modal>[class*="top aligned"]{-ms-flex-item-align:start;align-self:start}.ui.modal>[class*="middle aligned"]{-ms-flex-item-align:center;align-self:center}.ui.modal>[class*=stretched]{-ms-flex-item-align:stretch;align-self:stretch}.ui.modal>.content>.description{display:block;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-width:0;-ms-flex-item-align:start;align-self:start}.ui.modal>.content>.icon+.description,.ui.modal>.content>.image+.description{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;min-width:'';width:auto;padding-left:2em}.ui.modal>.content>.image>i.icon{margin:0;opacity:1;width:auto;line-height:1;font-size:8rem}.ui.modal>.actions{background:#f9fafb;padding:1rem 1rem;border-top:1px solid rgba(34,36,38,.15);text-align:right}.ui.modal .actions>.button{margin-left:.75em}.ui.basic.modal>.actions{border-top:none}@media only screen and (max-width:767.98px){.ui.modal:not(.fullscreen){width:95%;margin:0}}@media only screen and (min-width:768px){.ui.modal:not(.fullscreen){width:88%;margin:0}}@media only screen and (min-width:992px){.ui.modal:not(.fullscreen){width:850px;margin:0}}@media only screen and (min-width:1200px){.ui.modal:not(.fullscreen){width:900px;margin:0}}@media only screen and (min-width:1920px){.ui.modal:not(.fullscreen){width:950px;margin:0}}@media only screen and (max-width:991.98px){.ui.modal>.header{padding-right:2.25rem}.ui.modal>.close{top:1.0535rem;right:1rem;color:rgba(0,0,0,.87)}}@media only screen and (max-width:767.98px){.ui.modal>.header{padding:.75rem 1rem!important;padding-right:2.25rem!important}.ui.overlay.fullscreen.modal>.content.content.content{min-height:calc(100vh - 8.1rem)}.ui.overlay.fullscreen.modal>.scrolling.content.content.content{max-height:calc(100vh - 8.1rem)}.ui.modal>.content{display:block;padding:1rem!important}.ui.modal>.close{top:.5rem!important;right:.5rem!important}.ui.modal .image.content{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.modal .content>.image{display:block;max-width:100%;margin:0 auto!important;text-align:center;padding:0 0 1rem!important}.ui.modal>.content>.image>i.icon{font-size:5rem;text-align:center}.ui.modal .content>.description{display:block;width:100%!important;margin:0!important;padding:1rem 0!important;-webkit-box-shadow:none;box-shadow:none}.ui.modal>.actions{padding:1rem 1rem 0!important}.ui.modal .actions>.button,.ui.modal .actions>.buttons{margin-bottom:1rem}}.ui.inverted.dimmer>.ui.modal{-webkit-box-shadow:1px 3px 10px 2px rgba(0,0,0,.2);box-shadow:1px 3px 10px 2px rgba(0,0,0,.2)}.ui.basic.modal{background-color:transparent;border:none;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.basic.modal>.actions,.ui.basic.modal>.content,.ui.basic.modal>.header{background-color:transparent}.ui.basic.modal>.header{color:#fff}.ui.basic.modal>.close{top:1rem;right:1.5rem;color:#fff}.ui.inverted.dimmer>.basic.modal{color:rgba(0,0,0,.87)}.ui.inverted.dimmer>.ui.basic.modal>.header{color:rgba(0,0,0,.85)}.ui.legacy.legacy.modal,.ui.legacy.legacy.page.dimmer>.ui.modal{left:50%!important}.ui.legacy.legacy.modal:not(.aligned),.ui.legacy.legacy.page.dimmer>.ui.modal:not(.aligned){top:50%}.ui.legacy.legacy.page.dimmer>.ui.scrolling.modal:not(.aligned),.ui.page.dimmer>.ui.scrolling.legacy.legacy.modal:not(.aligned),.ui.top.aligned.dimmer>.ui.legacy.legacy.modal:not(.aligned),.ui.top.aligned.legacy.legacy.page.dimmer>.ui.modal:not(.aligned){top:auto}.ui.legacy.overlay.fullscreen.modal{margin-top:-2rem!important}.ui.loading.modal{display:block;visibility:hidden;z-index:-1}.ui.active.modal{display:block}.modals.dimmer .ui.top.aligned.modal{top:5vh}.modals.dimmer .ui.bottom.aligned.modal{bottom:5vh}@media only screen and (max-width:767.98px){.modals.dimmer .ui.top.aligned.modal{top:1rem}.modals.dimmer .ui.bottom.aligned.modal{bottom:1rem}}.scrolling.dimmable.dimmed{overflow:hidden}.scrolling.dimmable>.dimmer{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;position:fixed}.scrolling.dimmable.dimmed>.dimmer{overflow:auto;-webkit-overflow-scrolling:touch}.modals.dimmer .ui.scrolling.modal:not(.fullscreen){margin:2rem auto}.modals.dimmer .ui.scrolling.modal:not([class*="overlay fullscreen"])::after{content:'\00A0';position:absolute;height:2rem}.scrolling.undetached.dimmable.dimmed{overflow:auto;-webkit-overflow-scrolling:touch}.scrolling.undetached.dimmable.dimmed>.dimmer{overflow:hidden}.scrolling.undetached.dimmable .ui.scrolling.modal:not(.fullscreen){position:absolute;left:50%}.ui.modal>.scrolling.content{max-height:calc(80vh - 10rem);overflow:auto}.ui.overlay.fullscreen.modal>.content{min-height:calc(100vh - 9.1rem)}.ui.overlay.fullscreen.modal>.scrolling.content{max-height:calc(100vh - 9.1rem)}.ui.fullscreen.modal{width:95%;left:2.5%;margin:1em auto}.ui.overlay.fullscreen.modal{width:100%;left:0;margin:0 auto;top:0;border-radius:0}.ui.fullscreen.modal>.header,.ui.modal>.close.inside+.header{padding-right:2.25rem}.ui.fullscreen.modal>.close,.ui.modal>.close.inside{top:1.0535rem;right:1rem;color:rgba(0,0,0,.87)}.ui.basic.fullscreen.modal>.close{color:#fff}.ui.modal{font-size:1rem}.ui.mini.modal>.header:not(.ui){font-size:1.3em}@media only screen and (max-width:767.98px){.ui.mini.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.mini.modal{width:35.2%;margin:0}}@media only screen and (min-width:992px){.ui.mini.modal{width:340px;margin:0}}@media only screen and (min-width:1200px){.ui.mini.modal{width:360px;margin:0}}@media only screen and (min-width:1920px){.ui.mini.modal{width:380px;margin:0}}.ui.tiny.modal>.header:not(.ui){font-size:1.3em}@media only screen and (max-width:767.98px){.ui.tiny.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.tiny.modal{width:52.8%;margin:0}}@media only screen and (min-width:992px){.ui.tiny.modal{width:510px;margin:0}}@media only screen and (min-width:1200px){.ui.tiny.modal{width:540px;margin:0}}@media only screen and (min-width:1920px){.ui.tiny.modal{width:570px;margin:0}}.ui.small.modal>.header:not(.ui){font-size:1.3em}@media only screen and (max-width:767.98px){.ui.small.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.small.modal{width:70.4%;margin:0}}@media only screen and (min-width:992px){.ui.small.modal{width:680px;margin:0}}@media only screen and (min-width:1200px){.ui.small.modal{width:720px;margin:0}}@media only screen and (min-width:1920px){.ui.small.modal{width:760px;margin:0}}.ui.large.modal>.header:not(.ui){font-size:1.6em}@media only screen and (max-width:767.98px){.ui.large.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.large.modal{width:88%;margin:0}}@media only screen and (min-width:992px){.ui.large.modal{width:1020px;margin:0}}@media only screen and (min-width:1200px){.ui.large.modal{width:1080px;margin:0}}@media only screen and (min-width:1920px){.ui.large.modal{width:1140px;margin:0}}.ui.big.modal>.header:not(.ui){font-size:1.6em}@media only screen and (max-width:767.98px){.ui.big.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.big.modal{width:88%;margin:0}}@media only screen and (min-width:992px){.ui.big.modal{width:1190px;margin:0}}@media only screen and (min-width:1200px){.ui.big.modal{width:1260px;margin:0}}@media only screen and (min-width:1920px){.ui.big.modal{width:1330px;margin:0}}.ui.huge.modal>.header:not(.ui){font-size:1.6em}@media only screen and (max-width:767.98px){.ui.huge.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.huge.modal{width:88%;margin:0}}@media only screen and (min-width:992px){.ui.huge.modal{width:1360px;margin:0}}@media only screen and (min-width:1200px){.ui.huge.modal{width:1440px;margin:0}}@media only screen and (min-width:1920px){.ui.huge.modal{width:1520px;margin:0}}.ui.massive.modal>.header:not(.ui){font-size:1.8em}@media only screen and (max-width:767.98px){.ui.massive.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.massive.modal{width:88%;margin:0}}@media only screen and (min-width:992px){.ui.massive.modal{width:1530px;margin:0}}@media only screen and (min-width:1200px){.ui.massive.modal{width:1620px;margin:0}}@media only screen and (min-width:1920px){.ui.massive.modal{width:1710px;margin:0}}.ui.inverted.modal{background:rgba(0,0,0,.9)}.ui.inverted.modal>.content,.ui.inverted.modal>.header{background:rgba(0,0,0,.9);color:#fff}.ui.inverted.modal>.actions{background:#191a1b;border-top:1px solid rgba(34,36,38,.85);color:#fff}.ui.inverted.dimmer>.modal>.close{color:rgba(0,0,0,.85)}@media only screen and (max-width:991.98px){.ui.dimmer .inverted.modal>.close{color:#fff}}.ui.inverted.fullscreen.modal>.close,.ui.inverted.modal>.close.inside{color:#fff}/*! + * # Fomantic-UI - Nag + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.nag{display:none;opacity:.95;position:relative;top:0;left:0;z-index:999;min-height:0;width:100%;margin:0;padding:.75em 1em;background:#555;-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.2);box-shadow:0 1px 2px 0 rgba(0,0,0,.2);font-size:1rem;text-align:center;color:rgba(0,0,0,.87);border-radius:0 0 .28571429rem .28571429rem;-webkit-transition:.2s background ease;transition:.2s background ease}a.ui.nag{cursor:pointer}.ui.nag>.title{display:inline-block;margin:0 .5em;color:#fff}.ui.nag>.close.icon{cursor:pointer;opacity:.4;position:absolute;top:50%;right:1em;font-size:1em;margin:-.5em 0 0;color:#fff;-webkit-transition:opacity .2s ease;transition:opacity .2s ease}.ui.nag:hover{background:#555;opacity:1}.ui.nag .close:hover{opacity:1}.ui.overlay.nag{position:absolute;display:block}.ui.fixed.nag{position:fixed}.ui.bottom.nag,.ui.bottom.nags{border-radius:.28571429rem .28571429rem 0 0;top:auto;bottom:0}.ui.inverted.nag,.ui.inverted.nags .nag{background-color:#f3f4f5;color:rgba(0,0,0,.85)}.ui.inverted.nag .close,.ui.inverted.nag .title,.ui.inverted.nags .nag .close,.ui.inverted.nags .nag .title{color:rgba(0,0,0,.4)}.ui.nags .nag{border-radius:0!important}.ui.nags .nag:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.bottom.nags .nag:last-child{border-radius:.28571429rem .28571429rem 0 0}/*! + * # Fomantic-UI - Popup + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.popup{display:none;position:absolute;top:0;right:0;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content;z-index:1900;border:1px solid #d4d4d5;line-height:1.4285em;max-width:250px;background:#fff;padding:.833em 1em;font-weight:400;font-style:normal;color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.popup>.header{padding:0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1.14285714em;line-height:1.2;font-weight:700}.ui.popup>.header+.content{padding-top:.5em}.ui.popup:before{position:absolute;content:'';width:.71428571em;height:.71428571em;background:#fff;-webkit-transform:rotate(45deg);transform:rotate(45deg);z-index:1901;-webkit-box-shadow:1px 1px 0 0 #bababc;box-shadow:1px 1px 0 0 #bababc}[data-tooltip]{position:relative}[data-tooltip]:before{pointer-events:none;position:absolute;content:'';font-size:1rem;width:.71428571em;height:.71428571em;background:#fff;-webkit-transform:rotate(45deg);transform:rotate(45deg);z-index:1901;-webkit-box-shadow:1px 1px 0 0 #bababc;box-shadow:1px 1px 0 0 #bababc}[data-tooltip]:after{pointer-events:none;content:attr(data-tooltip);position:absolute;text-transform:none;text-align:left;white-space:nowrap;font-size:1rem;border:1px solid #d4d4d5;line-height:1.4285em;max-width:none;background:#fff;padding:.833em 1em;font-weight:400;font-style:normal;color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);z-index:1900}[data-tooltip]:not([data-position]):before{top:auto;right:auto;bottom:100%;left:50%;background:#fff;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-tooltip]:not([data-position]):after{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);bottom:100%;margin-bottom:.5em}[data-tooltip]:after,[data-tooltip]:before{pointer-events:none;visibility:hidden;opacity:0;-webkit-transition:opacity .1s ease,-webkit-transform .1s ease;transition:opacity .1s ease,-webkit-transform .1s ease;transition:transform .1s ease,opacity .1s ease;transition:transform .1s ease,opacity .1s ease,-webkit-transform .1s ease}[data-tooltip]:before{-webkit-transform:rotate(45deg) scale(0)!important;transform:rotate(45deg) scale(0)!important;-webkit-transform-origin:center top;transform-origin:center top}[data-tooltip]:after{-webkit-transform-origin:center bottom;transform-origin:center bottom}[data-tooltip]:hover:after,[data-tooltip]:hover:before{visibility:visible;pointer-events:auto;opacity:1}[data-tooltip]:hover:before{-webkit-transform:rotate(45deg) scale(1)!important;transform:rotate(45deg) scale(1)!important}[data-tooltip]:after,[data-tooltip][data-position="bottom center"]:after,[data-tooltip][data-position="top center"]:after{-webkit-transform:translateX(-50%) scale(0)!important;transform:translateX(-50%) scale(0)!important}[data-tooltip]:hover:after,[data-tooltip][data-position="bottom center"]:hover:after{-webkit-transform:translateX(-50%) scale(1)!important;transform:translateX(-50%) scale(1)!important}[data-tooltip][data-position="left center"]:after,[data-tooltip][data-position="right center"]:after{-webkit-transform:translateY(-50%) scale(0)!important;transform:translateY(-50%) scale(0)!important}[data-tooltip][data-position="left center"]:hover:after,[data-tooltip][data-position="right center"]:hover:after{-webkit-transform:translateY(-50%) scale(1)!important;transform:translateY(-50%) scale(1)!important}[data-tooltip][data-position="bottom left"]:after,[data-tooltip][data-position="bottom right"]:after,[data-tooltip][data-position="top left"]:after,[data-tooltip][data-position="top right"]:after{-webkit-transform:scale(0)!important;transform:scale(0)!important}[data-tooltip][data-position="bottom left"]:hover:after,[data-tooltip][data-position="bottom right"]:hover:after,[data-tooltip][data-position="top left"]:hover:after,[data-tooltip][data-position="top right"]:hover:after{-webkit-transform:scale(1)!important;transform:scale(1)!important}[data-tooltip][data-variation~=fixed]:after{white-space:normal;width:250px}[data-tooltip][data-variation*="wide fixed"]:after{width:350px}[data-tooltip][data-variation*="very wide fixed"]:after{width:550px}@media only screen and (max-width:767.98px){[data-tooltip][data-variation~=fixed]:after{width:250px}}[data-tooltip][data-inverted]:before{-webkit-box-shadow:none!important;box-shadow:none!important}[data-tooltip][data-inverted]:before{background:#1b1c1d}[data-tooltip][data-inverted]:after{background:#1b1c1d;color:#fff;border:none;-webkit-box-shadow:none;box-shadow:none}[data-tooltip][data-inverted]:after .header{background:0 0;color:#fff}[data-position~=top][data-tooltip]:before{background:#fff}[data-position="top center"][data-tooltip]:after{top:auto;right:auto;left:50%;bottom:100%;-webkit-transform:translateX(-50%);transform:translateX(-50%);margin-bottom:.5em}[data-position="top center"][data-tooltip]:before{top:auto;right:auto;bottom:100%;left:50%;background:#fff;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-position="top left"][data-tooltip]:after{top:auto;right:auto;left:0;bottom:100%;margin-bottom:.5em}[data-position="top left"][data-tooltip]:before{top:auto;right:auto;bottom:100%;left:1em;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-position="top right"][data-tooltip]:after{top:auto;left:auto;right:0;bottom:100%;margin-bottom:.5em}[data-position="top right"][data-tooltip]:before{top:auto;left:auto;bottom:100%;right:1em;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-position~=bottom][data-tooltip]:before{background:#fff;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}[data-position="bottom center"][data-tooltip]:after{bottom:auto;right:auto;left:50%;top:100%;-webkit-transform:translateX(-50%);transform:translateX(-50%);margin-top:.5em}[data-position="bottom center"][data-tooltip]:before{bottom:auto;right:auto;top:100%;left:50%;margin-left:-.07142857rem;margin-top:.14285714rem}[data-position="bottom left"][data-tooltip]:after{left:0;top:100%;margin-top:.5em}[data-position="bottom left"][data-tooltip]:before{bottom:auto;right:auto;top:100%;left:1em;margin-left:-.07142857rem;margin-top:.14285714rem}[data-position="bottom right"][data-tooltip]:after{right:0;top:100%;margin-top:.5em}[data-position="bottom right"][data-tooltip]:before{bottom:auto;left:auto;top:100%;right:1em;margin-left:-.14285714rem;margin-top:.07142857rem}[data-position="left center"][data-tooltip]:after{right:100%;top:50%;margin-right:.5em;-webkit-transform:translateY(-50%);transform:translateY(-50%)}[data-position="left center"][data-tooltip]:before{right:100%;top:50%;margin-top:-.14285714rem;margin-right:-.07142857rem;background:#fff;-webkit-box-shadow:1px -1px 0 0 #bababc;box-shadow:1px -1px 0 0 #bababc}[data-position="right center"][data-tooltip]:after{left:100%;top:50%;margin-left:.5em;-webkit-transform:translateY(-50%);transform:translateY(-50%)}[data-position="right center"][data-tooltip]:before{left:100%;top:50%;margin-top:-.07142857rem;margin-left:.14285714rem;background:#fff;-webkit-box-shadow:-1px 1px 0 0 #bababc;box-shadow:-1px 1px 0 0 #bababc}[data-inverted][data-position~=bottom][data-tooltip]:before{background:#1b1c1d;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}[data-inverted][data-position="left center"][data-tooltip]:before{background:#1b1c1d;-webkit-box-shadow:1px -1px 0 0 #bababc;box-shadow:1px -1px 0 0 #bababc}[data-inverted][data-position="right center"][data-tooltip]:before{background:#1b1c1d;-webkit-box-shadow:-1px 1px 0 0 #bababc;box-shadow:-1px 1px 0 0 #bababc}[data-inverted][data-position~=top][data-tooltip]:before{background:#1b1c1d}[data-position~=bottom][data-tooltip]:before{-webkit-transform-origin:center bottom;transform-origin:center bottom}[data-position~=bottom][data-tooltip]:after{-webkit-transform-origin:center top;transform-origin:center top}[data-position="left center"][data-tooltip]:before{-webkit-transform-origin:top center;transform-origin:top center}[data-position="left center"][data-tooltip]:after{-webkit-transform-origin:right center;transform-origin:right center}[data-position="right center"][data-tooltip]:before{-webkit-transform-origin:right center;transform-origin:right center}[data-position="right center"][data-tooltip]:after{-webkit-transform-origin:left center;transform-origin:left center}[data-tooltip][data-variation~=basic]:before{display:none}.ui.popup{margin:0}.ui.top.popup{margin:0 0 .71428571em}.ui.top.left.popup{-webkit-transform-origin:left bottom;transform-origin:left bottom}.ui.top.center.popup{-webkit-transform-origin:center bottom;transform-origin:center bottom}.ui.top.right.popup{-webkit-transform-origin:right bottom;transform-origin:right bottom}.ui.left.center.popup{margin:0 .71428571em 0 0;-webkit-transform-origin:right 50%;transform-origin:right 50%}.ui.right.center.popup{margin:0 0 0 .71428571em;-webkit-transform-origin:left 50%;transform-origin:left 50%}.ui.bottom.popup{margin:.71428571em 0 0}.ui.bottom.left.popup{-webkit-transform-origin:left top;transform-origin:left top}.ui.bottom.center.popup{-webkit-transform-origin:center top;transform-origin:center top}.ui.bottom.right.popup{-webkit-transform-origin:right top;transform-origin:right top}.ui.bottom.center.popup:before{margin-left:-.30714286em;top:-.30714286em;left:50%;right:auto;bottom:auto;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}.ui.bottom.left.popup{margin-left:0}.ui.bottom.left.popup:before{top:-.30714286em;left:1em;right:auto;bottom:auto;margin-left:0;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}.ui.bottom.right.popup{margin-right:0}.ui.bottom.right.popup:before{top:-.30714286em;right:1em;bottom:auto;left:auto;margin-left:0;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}.ui.top.center.popup:before{top:auto;right:auto;bottom:-.30714286em;left:50%;margin-left:-.30714286em}.ui.top.left.popup{margin-left:0}.ui.top.left.popup:before{bottom:-.30714286em;left:1em;top:auto;right:auto;margin-left:0}.ui.top.right.popup{margin-right:0}.ui.top.right.popup:before{bottom:-.30714286em;right:1em;top:auto;left:auto;margin-left:0}.ui.left.center.popup:before{top:50%;right:-.30714286em;bottom:auto;left:auto;margin-top:-.30714286em;-webkit-box-shadow:1px -1px 0 0 #bababc;box-shadow:1px -1px 0 0 #bababc}.ui.right.center.popup:before{top:50%;left:-.30714286em;bottom:auto;right:auto;margin-top:-.30714286em;-webkit-box-shadow:-1px 1px 0 0 #bababc;box-shadow:-1px 1px 0 0 #bababc}.ui.left.center.popup:before,.ui.right.center.popup:before{background:#fff}.ui.bottom.popup:before{background:#fff}.ui.top.popup:before{background:#fff}.ui.inverted.bottom.popup:before{background:#1b1c1d}.ui.inverted.left.center.popup:before,.ui.inverted.right.center.popup:before{background:#1b1c1d}.ui.inverted.top.popup:before{background:#1b1c1d}.ui.popup>.ui.grid:not(.padded){width:calc(100% + 1.75rem);margin:-.7rem -.875rem}.ui.loading.popup{display:block;visibility:hidden;z-index:-1}.ui.animating.popup,.ui.visible.popup{display:block}.ui.visible.popup{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui.basic.popup:before{display:none}.ui.fixed.popup{width:250px}.ui.wide.popup{max-width:350px}.ui.wide.popup.fixed{width:350px}.ui[class*="very wide"].popup{max-width:550px}.ui[class*="very wide"].popup.fixed{width:550px}@media only screen and (max-width:767.98px){.ui.wide.popup,.ui[class*="very wide"].popup{max-width:250px}.ui.wide.popup.fixed,.ui[class*="very wide"].popup.fixed{width:250px}}.ui.fluid.popup{width:100%;max-width:none}.ui.inverted.popup{background:#1b1c1d;color:#fff;border:none;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.popup .header{background-color:none;color:#fff}.ui.inverted.popup:before{background-color:#1b1c1d;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.flowing.popup{max-width:none}.ui.popup{font-size:1rem}.ui.mini.popup{font-size:.78571429rem}[data-tooltip][data-variation~=mini]:after,[data-tooltip][data-variation~=mini]:before{font-size:.78571429rem}.ui.tiny.popup{font-size:.85714286rem}[data-tooltip][data-variation~=tiny]:after,[data-tooltip][data-variation~=tiny]:before{font-size:.85714286rem}.ui.small.popup{font-size:.92857143rem}[data-tooltip][data-variation~=small]:after,[data-tooltip][data-variation~=small]:before{font-size:.92857143rem}.ui.large.popup{font-size:1.14285714rem}[data-tooltip][data-variation~=large]:after,[data-tooltip][data-variation~=large]:before{font-size:1.14285714rem}.ui.big.popup{font-size:1.28571429rem}[data-tooltip][data-variation~=big]:after,[data-tooltip][data-variation~=big]:before{font-size:1.28571429rem}.ui.huge.popup{font-size:1.42857143rem}[data-tooltip][data-variation~=huge]:after,[data-tooltip][data-variation~=huge]:before{font-size:1.42857143rem}.ui.massive.popup{font-size:1.71428571rem}[data-tooltip][data-variation~=massive]:after,[data-tooltip][data-variation~=massive]:before{font-size:1.71428571rem}/*! + * # Fomantic-UI - Progress Bar + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.progress{position:relative;display:block;max-width:100%;border:none;margin:1em 0 2.5em;-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,.1);padding:0;border-radius:.28571429rem}.ui.progress:first-child{margin:0 0 2.5em}.ui.progress:last-child{margin:0 0 1.5em}.ui.progress .bar{display:block;line-height:1;position:relative;width:0;min-width:2em;background:#888;border-radius:.28571429rem;-webkit-transition:width .1s ease,background-color .1s ease;transition:width .1s ease,background-color .1s ease;overflow:hidden}.ui.ui.ui.progress:not([data-percent]):not(.indeterminate) .bar,.ui.ui.ui.progress[data-percent="0"]:not(.indeterminate) .bar{background:0 0}.ui.progress[data-percent="0"] .bar .progress{color:rgba(0,0,0,.87)}.ui.inverted.progress[data-percent="0"] .bar .progress{color:rgba(255,255,255,.9)}.ui.progress .bar>.progress{white-space:nowrap;position:absolute;width:auto;font-size:.92857143em;top:50%;right:.5em;left:auto;bottom:auto;color:rgba(255,255,255,.7);text-shadow:none;margin-top:-.5em;font-weight:700;text-align:left}.ui.progress>.label{position:absolute;width:100%;font-size:1em;top:100%;right:auto;left:0;bottom:auto;color:rgba(0,0,0,.87);font-weight:700;text-shadow:none;margin-top:.2em;text-align:center;-webkit-transition:color .4s ease;transition:color .4s ease}.ui.indicating.progress[data-percent^="1"] .bar,.ui.indicating.progress[data-percent^="2"] .bar{background-color:#d95c5c}.ui.indicating.progress[data-percent^="3"] .bar{background-color:#efbc72}.ui.indicating.progress[data-percent^="4"] .bar,.ui.indicating.progress[data-percent^="5"] .bar{background-color:#e6bb48}.ui.indicating.progress[data-percent^="6"] .bar{background-color:#ddc928}.ui.indicating.progress[data-percent^="7"] .bar,.ui.indicating.progress[data-percent^="8"] .bar{background-color:#b4d95c}.ui.indicating.progress[data-percent^="100"] .bar,.ui.indicating.progress[data-percent^="9"] .bar{background-color:#66da81}.ui.indicating.progress[data-percent^="1"] .label,.ui.indicating.progress[data-percent^="2"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^="3"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^="4"] .label,.ui.indicating.progress[data-percent^="5"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^="6"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^="7"] .label,.ui.indicating.progress[data-percent^="8"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^="100"] .label,.ui.indicating.progress[data-percent^="9"] .label{color:rgba(0,0,0,.87)}.ui.inverted.indicating.progress[data-percent^="1"] .label,.ui.inverted.indicating.progress[data-percent^="2"] .label{color:rgba(255,255,255,.9)}.ui.inverted.indicating.progress[data-percent^="3"] .label{color:rgba(255,255,255,.9)}.ui.inverted.indicating.progress[data-percent^="4"] .label,.ui.inverted.indicating.progress[data-percent^="5"] .label{color:rgba(255,255,255,.9)}.ui.inverted.indicating.progress[data-percent^="6"] .label{color:rgba(255,255,255,.9)}.ui.inverted.indicating.progress[data-percent^="7"] .label,.ui.inverted.indicating.progress[data-percent^="8"] .label{color:rgba(255,255,255,.9)}.ui.inverted.indicating.progress[data-percent^="100"] .label,.ui.inverted.indicating.progress[data-percent^="9"] .label{color:rgba(255,255,255,.9)}.ui.indicating.progress[data-percent="1"] .bar,.ui.indicating.progress[data-percent="2"] .bar,.ui.indicating.progress[data-percent="3"] .bar,.ui.indicating.progress[data-percent="4"] .bar,.ui.indicating.progress[data-percent="5"] .bar,.ui.indicating.progress[data-percent="6"] .bar,.ui.indicating.progress[data-percent="7"] .bar,.ui.indicating.progress[data-percent="8"] .bar,.ui.indicating.progress[data-percent="9"] .bar{background-color:#d95c5c}.ui.indicating.progress[data-percent="0"] .label,.ui.indicating.progress[data-percent="1"] .label,.ui.indicating.progress[data-percent="2"] .label,.ui.indicating.progress[data-percent="3"] .label,.ui.indicating.progress[data-percent="4"] .label,.ui.indicating.progress[data-percent="5"] .label,.ui.indicating.progress[data-percent="6"] .label,.ui.indicating.progress[data-percent="7"] .label,.ui.indicating.progress[data-percent="8"] .label,.ui.indicating.progress[data-percent="9"] .label{color:rgba(0,0,0,.87)}.ui.inverted.indicating.progress[data-percent="0"] .label,.ui.inverted.indicating.progress[data-percent="1"] .label,.ui.inverted.indicating.progress[data-percent="2"] .label,.ui.inverted.indicating.progress[data-percent="3"] .label,.ui.inverted.indicating.progress[data-percent="4"] .label,.ui.inverted.indicating.progress[data-percent="5"] .label,.ui.inverted.indicating.progress[data-percent="6"] .label,.ui.inverted.indicating.progress[data-percent="7"] .label,.ui.inverted.indicating.progress[data-percent="8"] .label,.ui.inverted.indicating.progress[data-percent="9"] .label{color:rgba(255,255,255,.9)}.ui.ui.indicating.progress.success .label{color:#1a531b}.ui.multiple.progress{display:-webkit-box;display:-ms-flexbox;display:flex}.ui.ui.progress.success .bar{background-color:#21ba45}.ui.ui.progress.success .bar,.ui.ui.progress.success .bar::after{-webkit-animation:none;animation:none}.ui.progress.success>.label{color:#1a531b}.ui.ui.progress.warning .bar{background-color:#f2c037}.ui.ui.progress.warning .bar,.ui.ui.progress.warning .bar::after{-webkit-animation:none;animation:none}.ui.progress.warning>.label{color:#794b02}.ui.ui.progress.error .bar{background-color:#db2828}.ui.ui.progress.error .bar,.ui.ui.progress.error .bar::after{-webkit-animation:none;animation:none}.ui.progress.error>.label{color:#912d2b}.ui.active.progress .bar{position:relative;min-width:2em}.ui.active.progress .bar::after{content:'';opacity:0;position:absolute;top:0;left:0;right:0;bottom:0;background:#fff;border-radius:.28571429rem;-webkit-animation:progress-active 2s ease infinite;animation:progress-active 2s ease infinite;-webkit-transform-origin:left;transform-origin:left}@-webkit-keyframes progress-active{0%{opacity:.3;-webkit-transform:scale(0,1);transform:scale(0,1)}100%{opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@keyframes progress-active{0%{opacity:.3;-webkit-transform:scale(0,1);transform:scale(0,1)}100%{opacity:0;-webkit-transform:scale(1);transform:scale(1)}}.ui.disabled.progress{opacity:.35}.ui.ui.disabled.progress .bar,.ui.ui.disabled.progress .bar::after{-webkit-animation:none;animation:none}.ui.inverted.progress{background:rgba(255,255,255,.08);border:none}.ui.inverted.progress .bar{background:#888}.ui.inverted.progress .bar>.progress{color:#1b1c1d}.ui.inverted.progress>.label{color:#fff}.ui.inverted.progress.success>.label{color:#21ba45}.ui.inverted.progress.warning>.label{color:#f2c037}.ui.inverted.progress.error>.label{color:#db2828}.ui.progress.attached{background:0 0;position:relative;border:none;margin:0}.ui.progress.attached,.ui.progress.attached .bar{display:block;height:.2rem;padding:0;overflow:hidden;border-radius:0 0 .28571429rem .28571429rem}.ui.progress.attached .bar{border-radius:0}.ui.progress.top.attached,.ui.progress.top.attached .bar{top:0;border-radius:.28571429rem .28571429rem 0 0}.ui.progress.top.attached .bar{border-radius:0}.ui.card>.ui.attached.progress,.ui.segment>.ui.attached.progress{position:absolute;top:auto;left:0;bottom:100%;width:100%}.ui.card>.ui.bottom.attached.progress,.ui.segment>.ui.bottom.attached.progress{top:100%;bottom:auto}.ui.indeterminate.primary.progress .bar::before,.ui.primary.progress .bar,.ui.progress .primary.bar{background-color:#2185d0}.ui.inverted.indeterminate.primary.progress .bar::before,.ui.inverted.progress .primary.bar,.ui.primary.inverted.progress .bar{background-color:#54c8ff}.ui.indeterminate.secondary.progress .bar::before,.ui.progress .secondary.bar,.ui.secondary.progress .bar{background-color:#1b1c1d}.ui.inverted.indeterminate.secondary.progress .bar::before,.ui.inverted.progress .secondary.bar,.ui.secondary.inverted.progress .bar{background-color:#545454}.ui.indeterminate.red.progress .bar::before,.ui.progress .red.bar,.ui.red.progress .bar{background-color:#db2828}.ui.inverted.indeterminate.red.progress .bar::before,.ui.inverted.progress .red.bar,.ui.red.inverted.progress .bar{background-color:#ff695e}.ui.indeterminate.orange.progress .bar::before,.ui.orange.progress .bar,.ui.progress .orange.bar{background-color:#f2711c}.ui.inverted.indeterminate.orange.progress .bar::before,.ui.inverted.progress .orange.bar,.ui.orange.inverted.progress .bar{background-color:#ff851b}.ui.indeterminate.yellow.progress .bar::before,.ui.progress .yellow.bar,.ui.yellow.progress .bar{background-color:#fbbd08}.ui.inverted.indeterminate.yellow.progress .bar::before,.ui.inverted.progress .yellow.bar,.ui.yellow.inverted.progress .bar{background-color:#ffe21f}.ui.indeterminate.olive.progress .bar::before,.ui.olive.progress .bar,.ui.progress .olive.bar{background-color:#b5cc18}.ui.inverted.indeterminate.olive.progress .bar::before,.ui.inverted.progress .olive.bar,.ui.olive.inverted.progress .bar{background-color:#d9e778}.ui.green.progress .bar,.ui.indeterminate.green.progress .bar::before,.ui.progress .green.bar{background-color:#21ba45}.ui.green.inverted.progress .bar,.ui.inverted.indeterminate.green.progress .bar::before,.ui.inverted.progress .green.bar{background-color:#2ecc40}.ui.indeterminate.teal.progress .bar::before,.ui.progress .teal.bar,.ui.teal.progress .bar{background-color:#00b5ad}.ui.inverted.indeterminate.teal.progress .bar::before,.ui.inverted.progress .teal.bar,.ui.teal.inverted.progress .bar{background-color:#6dffff}.ui.blue.progress .bar,.ui.indeterminate.blue.progress .bar::before,.ui.progress .blue.bar{background-color:#2185d0}.ui.blue.inverted.progress .bar,.ui.inverted.indeterminate.blue.progress .bar::before,.ui.inverted.progress .blue.bar{background-color:#54c8ff}.ui.indeterminate.violet.progress .bar::before,.ui.progress .violet.bar,.ui.violet.progress .bar{background-color:#6435c9}.ui.inverted.indeterminate.violet.progress .bar::before,.ui.inverted.progress .violet.bar,.ui.violet.inverted.progress .bar{background-color:#a291fb}.ui.indeterminate.purple.progress .bar::before,.ui.progress .purple.bar,.ui.purple.progress .bar{background-color:#a333c8}.ui.inverted.indeterminate.purple.progress .bar::before,.ui.inverted.progress .purple.bar,.ui.purple.inverted.progress .bar{background-color:#dc73ff}.ui.indeterminate.pink.progress .bar::before,.ui.pink.progress .bar,.ui.progress .pink.bar{background-color:#e03997}.ui.inverted.indeterminate.pink.progress .bar::before,.ui.inverted.progress .pink.bar,.ui.pink.inverted.progress .bar{background-color:#ff8edf}.ui.brown.progress .bar,.ui.indeterminate.brown.progress .bar::before,.ui.progress .brown.bar{background-color:#a5673f}.ui.brown.inverted.progress .bar,.ui.inverted.indeterminate.brown.progress .bar::before,.ui.inverted.progress .brown.bar{background-color:#d67c1c}.ui.grey.progress .bar,.ui.indeterminate.grey.progress .bar::before,.ui.progress .grey.bar{background-color:#767676}.ui.grey.inverted.progress .bar,.ui.inverted.indeterminate.grey.progress .bar::before,.ui.inverted.progress .grey.bar{background-color:#dcddde}.ui.black.progress .bar,.ui.indeterminate.black.progress .bar::before,.ui.progress .black.bar{background-color:#1b1c1d}.ui.black.inverted.progress .bar,.ui.inverted.indeterminate.black.progress .bar::before,.ui.inverted.progress .black.bar{background-color:#545454}.ui.progress{font-size:1rem}.ui.progress .bar{height:1.75em}.ui.mini.progress{font-size:.78571429rem}.ui.mini.progress .bar{height:.3em}.ui.tiny.progress{font-size:.85714286rem}.ui.tiny.progress .bar{height:.5em}.ui.small.progress{font-size:.92857143rem}.ui.small.progress .bar{height:1em}.ui.large.progress{font-size:1.14285714rem}.ui.large.progress .bar{height:2.5em}.ui.big.progress{font-size:1.28571429rem}.ui.big.progress .bar{height:3.5em}.ui.huge.progress{font-size:1.42857143rem}.ui.huge.progress .bar{height:4em}.ui.massive.progress{font-size:1.71428571rem}.ui.massive.progress .bar{height:5em}.ui.indeterminate.progress .bar{width:100%}.ui.indeterminate.progress .bar .progress,.ui.progress .bar .centered.progress{text-align:center;position:relative}.ui.indeterminate.progress .bar::before{content:'';position:absolute;top:0;bottom:0;border-radius:.28571429rem;-webkit-animation:progress-pulsating 2s ease infinite;animation:progress-pulsating 2s ease infinite;-webkit-transform-origin:center;transform-origin:center;width:100%}.ui.slow.indeterminate.progress .bar::before{-webkit-animation-duration:4s;animation-duration:4s}.ui.fast.indeterminate.progress .bar::before{-webkit-animation-duration:1s;animation-duration:1s}.ui.swinging.indeterminate.progress .bar::before{-webkit-transform-origin:left;transform-origin:left;-webkit-animation-name:progress-swinging;animation-name:progress-swinging}.ui.sliding.indeterminate.progress .bar::before{-webkit-transform-origin:left;transform-origin:left;-webkit-animation-name:progress-sliding;animation-name:progress-sliding}.ui.filling.indeterminate.progress .bar::before{-webkit-animation-name:progress-filling;animation-name:progress-filling}.ui.indeterminate.progress:not(.sliding):not(.filling):not(.swinging) .bar::before{background:#fff}.ui.filling.indeterminate.progress .bar,.ui.sliding.indeterminate.progress .bar,.ui.swinging.indeterminate.progress .bar{background:rgba(0,0,0,.1)}.ui.sliding.indeterminate.progress .bar .progress,.ui.swinging.indeterminate.progress .bar .progress{color:#1b1c1d}.ui.inverted.filling.indeterminate.progress .bar,.ui.inverted.sliding.indeterminate.progress .bar,.ui.inverted.swinging.indeterminate.progress .bar{background:rgba(255,255,255,.08)}.ui.inverted.sliding.indeterminate.progress .bar .progress,.ui.inverted.swinging.indeterminate.progress .bar .progress{color:rgba(255,255,255,.7)}@-webkit-keyframes progress-swinging{0%,100%{width:10%;left:-25%}25%,65%{width:70%}50%{width:10%;left:100%}}@keyframes progress-swinging{0%,100%{width:10%;left:-25%}25%,65%{width:70%}50%{width:10%;left:100%}}@-webkit-keyframes progress-sliding{0%{width:10%;left:-25%}50%{width:70%}100%{width:10%;left:100%}}@keyframes progress-sliding{0%{width:10%;left:-25%}50%{width:70%}100%{width:10%;left:100%}}@-webkit-keyframes progress-filling{0%{-webkit-transform:scale(0,1);transform:scale(0,1)}80%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{opacity:0}}@keyframes progress-filling{0%{-webkit-transform:scale(0,1);transform:scale(0,1)}80%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{opacity:0}}@-webkit-keyframes progress-pulsating{0%{-webkit-transform:scale(0,1);transform:scale(0,1);opacity:.7}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes progress-pulsating{0%{-webkit-transform:scale(0,1);transform:scale(0,1);opacity:.7}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}.ui.slider:not(.vertical):not(.checkbox){width:100%;padding:1em .5em}.ui.slider:not(.checkbox){position:relative}.ui.slider:not(.checkbox):focus{outline:0}.ui.slider .inner{position:relative;z-index:2}.ui.slider:not(.vertical) .inner{height:1.5em}.ui.slider .inner:hover{cursor:auto}.ui.slider .inner .track{position:absolute;border-radius:4px;background-color:rgba(0,0,0,.05)}.ui.slider:not(.vertical) .inner .track{width:100%;height:.4em;top:.55em;left:0}.ui.slider .inner .track-fill{position:absolute;border-radius:4px;background-color:#1b1c1d}.ui.slider:not(.vertical) .inner .track-fill{height:.4em;top:.55em;left:0}.ui.slider .inner .thumb{position:absolute;left:0;top:0;height:1.5em;width:1.5em;background:#fff -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#fff -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#fff linear-gradient(transparent,rgba(0,0,0,.05));border-radius:100%;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;-webkit-transition:background .3s ease;transition:background .3s ease}.ui.slider:not(.disabled) .inner .thumb:hover{cursor:pointer;background:#f2f2f2 -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#f2f2f2 -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#f2f2f2 linear-gradient(transparent,rgba(0,0,0,.05))}.ui.slider:not(.disabled):focus .inner .thumb{background:#f2f2f2 -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#f2f2f2 -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#f2f2f2 linear-gradient(transparent,rgba(0,0,0,.05))}.ui.disabled.slider:not(.checkbox){opacity:.5}.ui.disabled.slider .inner:hover{cursor:auto}.ui.disabled.slider .inner .track-fill{background:#ccc}.ui.reversed.slider .inner .track-fill{left:auto;right:0}.ui.reversed.slider:not(.vertical) .inner .thumb{left:auto;right:0}.ui.reversed.vertical.slider .inner .thumb{left:.03em}.ui.labeled.reversed.slider>.labels .label{-webkit-transform:translate(-100%,-100%);transform:translate(-100%,-100%)}.ui.vertical.slider{height:100%;width:1.5em;padding:.5em 1em}.ui.vertical.slider .inner{height:100%}.ui.vertical.slider .inner .track{height:100%;width:.4em;left:.55em;top:0}.ui.vertical.slider .inner .track-fill{width:.4em;left:.55em;top:0}.ui.vertical.reversed.slider .inner .thumb{top:auto;bottom:0}.ui.vertical.reversed.slider .inner .track-fill{top:auto;bottom:0}.ui.labeled.slider>.labels{height:1.5em;width:auto;margin:0;padding:0;position:absolute;top:50%;left:0;right:0}.ui.labeled.slider:not(.vertical)>.labels{-webkit-transform:translateY(-50%);transform:translateY(-50%)}.ui.labeled.slider>.labels .label{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;position:absolute;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}.ui.labeled.ticked.slider>.labels .label:after{content:' ';height:1.5em;width:1px;background:#ccc;position:absolute;top:100%;left:50%}.ui.labeled.ticked.slider>.labels .halftick.label:after{height:.75em}.ui.labeled.vertical.slider>.labels{width:1.5em;height:auto;left:50%;top:0;bottom:0;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.ui.labeled.vertical.slider>.labels .label{-webkit-transform:translate(-100%,-50%);transform:translate(-100%,-50%)}.ui.labeled.vertical.slider>.labels .label:after{width:1.5em;height:1px;left:100%;top:50%}.ui.labeled.vertical.slider>.labels .halftick.label:after{width:.75em;height:1px}.ui.labeled.vertical.reversed.slider>.labels .label{-webkit-transform:translate(-100%,50%);transform:translate(-100%,50%)}.ui.hover.slider .inner .thumb{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.ui.hover.slider:not(.disabled):focus .inner .thumb,.ui.hover.slider:not(.disabled):hover .inner .thumb{opacity:1}.ui.inverted.slider .inner .track-fill{background-color:#545454}.ui.inverted.slider .inner .track{background-color:rgba(255,255,255,.08)}.ui.primary.slider .inner .track-fill{background-color:#2185d0}.ui.primary.inverted.slider .inner .track-fill{background-color:#54c8ff}.ui.primary.slider.basic .inner .thumb{background-color:#2185d0}.ui.primary.slider.basic .inner .thumb:hover,.ui.primary.slider.basic:focus .inner .thumb{background-color:#1678c2}.ui.primary.inverted.slider.basic .inner .thumb{background-color:#54c8ff}.ui.primary.inverted.slider.basic .inner .thumb:hover,.ui.primary.inverted.slider.basic:focus .inner .thumb{background-color:#21b8ff}.ui.secondary.slider .inner .track-fill{background-color:#1b1c1d}.ui.secondary.inverted.slider .inner .track-fill{background-color:#545454}.ui.secondary.slider.basic .inner .thumb{background-color:#1b1c1d}.ui.secondary.slider.basic .inner .thumb:hover,.ui.secondary.slider.basic:focus .inner .thumb{background-color:#27292a}.ui.secondary.inverted.slider.basic .inner .thumb{background-color:#545454}.ui.secondary.inverted.slider.basic .inner .thumb:hover,.ui.secondary.inverted.slider.basic:focus .inner .thumb{background-color:#6e6e6e}.ui.red.slider .inner .track-fill{background-color:#db2828}.ui.red.inverted.slider .inner .track-fill{background-color:#ff695e}.ui.red.slider.basic .inner .thumb{background-color:#db2828}.ui.red.slider.basic .inner .thumb:hover,.ui.red.slider.basic:focus .inner .thumb{background-color:#d01919}.ui.red.inverted.slider.basic .inner .thumb{background-color:#ff695e}.ui.red.inverted.slider.basic .inner .thumb:hover,.ui.red.inverted.slider.basic:focus .inner .thumb{background-color:#ff392b}.ui.orange.slider .inner .track-fill{background-color:#f2711c}.ui.orange.inverted.slider .inner .track-fill{background-color:#ff851b}.ui.orange.slider.basic .inner .thumb{background-color:#f2711c}.ui.orange.slider.basic .inner .thumb:hover,.ui.orange.slider.basic:focus .inner .thumb{background-color:#f26202}.ui.orange.inverted.slider.basic .inner .thumb{background-color:#ff851b}.ui.orange.inverted.slider.basic .inner .thumb:hover,.ui.orange.inverted.slider.basic:focus .inner .thumb{background-color:#e76b00}.ui.yellow.slider .inner .track-fill{background-color:#fbbd08}.ui.yellow.inverted.slider .inner .track-fill{background-color:#ffe21f}.ui.yellow.slider.basic .inner .thumb{background-color:#fbbd08}.ui.yellow.slider.basic .inner .thumb:hover,.ui.yellow.slider.basic:focus .inner .thumb{background-color:#eaae00}.ui.yellow.inverted.slider.basic .inner .thumb{background-color:#ffe21f}.ui.yellow.inverted.slider.basic .inner .thumb:hover,.ui.yellow.inverted.slider.basic:focus .inner .thumb{background-color:#ebcd00}.ui.olive.slider .inner .track-fill{background-color:#b5cc18}.ui.olive.inverted.slider .inner .track-fill{background-color:#d9e778}.ui.olive.slider.basic .inner .thumb{background-color:#b5cc18}.ui.olive.slider.basic .inner .thumb:hover,.ui.olive.slider.basic:focus .inner .thumb{background-color:#a7bd0d}.ui.olive.inverted.slider.basic .inner .thumb{background-color:#d9e778}.ui.olive.inverted.slider.basic .inner .thumb:hover,.ui.olive.inverted.slider.basic:focus .inner .thumb{background-color:#d2e745}.ui.green.slider .inner .track-fill{background-color:#21ba45}.ui.green.inverted.slider .inner .track-fill{background-color:#2ecc40}.ui.green.slider.basic .inner .thumb{background-color:#21ba45}.ui.green.slider.basic .inner .thumb:hover,.ui.green.slider.basic:focus .inner .thumb{background-color:#16ab39}.ui.green.inverted.slider.basic .inner .thumb{background-color:#2ecc40}.ui.green.inverted.slider.basic .inner .thumb:hover,.ui.green.inverted.slider.basic:focus .inner .thumb{background-color:#1ea92e}.ui.teal.slider .inner .track-fill{background-color:#00b5ad}.ui.teal.inverted.slider .inner .track-fill{background-color:#6dffff}.ui.teal.slider.basic .inner .thumb{background-color:#00b5ad}.ui.teal.slider.basic .inner .thumb:hover,.ui.teal.slider.basic:focus .inner .thumb{background-color:#009c95}.ui.teal.inverted.slider.basic .inner .thumb{background-color:#6dffff}.ui.teal.inverted.slider.basic .inner .thumb:hover,.ui.teal.inverted.slider.basic:focus .inner .thumb{background-color:#3affff}.ui.blue.slider .inner .track-fill{background-color:#2185d0}.ui.blue.inverted.slider .inner .track-fill{background-color:#54c8ff}.ui.blue.slider.basic .inner .thumb{background-color:#2185d0}.ui.blue.slider.basic .inner .thumb:hover,.ui.blue.slider.basic:focus .inner .thumb{background-color:#1678c2}.ui.blue.inverted.slider.basic .inner .thumb{background-color:#54c8ff}.ui.blue.inverted.slider.basic .inner .thumb:hover,.ui.blue.inverted.slider.basic:focus .inner .thumb{background-color:#21b8ff}.ui.violet.slider .inner .track-fill{background-color:#6435c9}.ui.violet.inverted.slider .inner .track-fill{background-color:#a291fb}.ui.violet.slider.basic .inner .thumb{background-color:#6435c9}.ui.violet.slider.basic .inner .thumb:hover,.ui.violet.slider.basic:focus .inner .thumb{background-color:#5829bb}.ui.violet.inverted.slider.basic .inner .thumb{background-color:#a291fb}.ui.violet.inverted.slider.basic .inner .thumb:hover,.ui.violet.inverted.slider.basic:focus .inner .thumb{background-color:#745aff}.ui.purple.slider .inner .track-fill{background-color:#a333c8}.ui.purple.inverted.slider .inner .track-fill{background-color:#dc73ff}.ui.purple.slider.basic .inner .thumb{background-color:#a333c8}.ui.purple.slider.basic .inner .thumb:hover,.ui.purple.slider.basic:focus .inner .thumb{background-color:#9627ba}.ui.purple.inverted.slider.basic .inner .thumb{background-color:#dc73ff}.ui.purple.inverted.slider.basic .inner .thumb:hover,.ui.purple.inverted.slider.basic:focus .inner .thumb{background-color:#cf40ff}.ui.pink.slider .inner .track-fill{background-color:#e03997}.ui.pink.inverted.slider .inner .track-fill{background-color:#ff8edf}.ui.pink.slider.basic .inner .thumb{background-color:#e03997}.ui.pink.slider.basic .inner .thumb:hover,.ui.pink.slider.basic:focus .inner .thumb{background-color:#e61a8d}.ui.pink.inverted.slider.basic .inner .thumb{background-color:#ff8edf}.ui.pink.inverted.slider.basic .inner .thumb:hover,.ui.pink.inverted.slider.basic:focus .inner .thumb{background-color:#ff5bd1}.ui.brown.slider .inner .track-fill{background-color:#a5673f}.ui.brown.inverted.slider .inner .track-fill{background-color:#d67c1c}.ui.brown.slider.basic .inner .thumb{background-color:#a5673f}.ui.brown.slider.basic .inner .thumb:hover,.ui.brown.slider.basic:focus .inner .thumb{background-color:#975b33}.ui.brown.inverted.slider.basic .inner .thumb{background-color:#d67c1c}.ui.brown.inverted.slider.basic .inner .thumb:hover,.ui.brown.inverted.slider.basic:focus .inner .thumb{background-color:#b0620f}.ui.grey.slider .inner .track-fill{background-color:#767676}.ui.grey.inverted.slider .inner .track-fill{background-color:#dcddde}.ui.grey.slider.basic .inner .thumb{background-color:#767676}.ui.grey.slider.basic .inner .thumb:hover,.ui.grey.slider.basic:focus .inner .thumb{background-color:#838383}.ui.grey.inverted.slider.basic .inner .thumb{background-color:#dcddde}.ui.grey.inverted.slider.basic .inner .thumb:hover,.ui.grey.inverted.slider.basic:focus .inner .thumb{background-color:#c2c4c5}.ui.black.slider .inner .track-fill{background-color:#1b1c1d}.ui.black.inverted.slider .inner .track-fill{background-color:#545454}.ui.black.slider.basic .inner .thumb{background-color:#1b1c1d}.ui.black.slider.basic .inner .thumb:hover,.ui.black.slider.basic:focus .inner .thumb{background-color:#27292a}.ui.black.inverted.slider.basic .inner .thumb{background-color:#545454}.ui.black.inverted.slider.basic .inner .thumb:hover,.ui.black.inverted.slider.basic:focus .inner .thumb{background-color:#000}.ui.slider.basic .inner .thumb{background-color:#1b1c1d}.ui.slider.basic .inner .thumb:hover,.ui.slider.basic:focus .inner .thumb{background-color:#27292a}.ui.inverted.slider.basic .inner .thumb{background-color:#545454}.ui.inverted.slider.basic .inner .thumb:hover,.ui.inverted.slider.basic:focus .inner .thumb{background-color:#000}.ui.slider.small .inner .thumb{height:1em;width:1em}.ui.slider.small:not(.vertical) .inner{height:1em}.ui.slider.small:not(.vertical) .inner .track,.ui.slider.small:not(.vertical) .inner .track-fill{height:.3em;top:.35em}.ui.small.labeled.slider:not(.vertical)>.labels,.ui.small.labeled.slider:not(.vertical)>.labels .label:after{height:1em}.ui.small.labeled.slider:not(.vertical)>.labels .halftick.label:after{height:.5em}.ui.slider.small.vertical .inner{width:1em}.ui.slider.small.vertical .inner .track,.ui.slider.small.vertical .inner .track-fill{width:.3em;left:.35em}.ui.small.labeled.vertical.slider>.labels,.ui.small.labeled.vertical.slider>.labels .label:after{width:1em}.ui.small.labeled.vertical.slider>.labels .halftick.label:after{width:.5em}.ui.slider.large .inner .thumb{height:2em;width:2em}.ui.slider.large:not(.vertical) .inner{height:2em}.ui.slider.large:not(.vertical) .inner .track,.ui.slider.large:not(.vertical) .inner .track-fill{height:.5em;top:.75em}.ui.large.labeled.slider:not(.vertical)>.labels,.ui.large.labeled.slider:not(.vertical)>.labels .label:after{height:2em}.ui.large.labeled.slider:not(.vertical)>.labels .halftick.label:after{height:1em}.ui.slider.large.vertical .inner{width:2em}.ui.slider.large.vertical .inner .track,.ui.slider.large.vertical .inner .track-fill{width:.5em;left:.75em}.ui.large.labeled.vertical.slider>.labels,.ui.large.labeled.vertical.slider>.labels .label:after{width:2em}.ui.large.labeled.vertical.slider>.labels .halftick.label:after{width:1em}.ui.slider.big .inner .thumb{height:2.5em;width:2.5em}.ui.slider.big:not(.vertical) .inner{height:2.5em}.ui.slider.big:not(.vertical) .inner .track,.ui.slider.big:not(.vertical) .inner .track-fill{height:.6em;top:.95em}.ui.big.labeled.slider:not(.vertical)>.labels,.ui.big.labeled.slider:not(.vertical)>.labels .label:after{height:2.5em}.ui.big.labeled.slider:not(.vertical)>.labels .halftick.label:after{height:1.25em}.ui.slider.big.vertical .inner{width:2.5em}.ui.slider.big.vertical .inner .track,.ui.slider.big.vertical .inner .track-fill{width:.6em;left:.95em}.ui.big.labeled.vertical.slider>.labels,.ui.big.labeled.vertical.slider>.labels .label:after{width:2.5em}.ui.big.labeled.vertical.slider>.labels .halftick.label:after{width:1.25em}/*! + * # Fomantic-UI - Rating + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.rating{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;white-space:nowrap;vertical-align:baseline}.ui.rating:last-child{margin-right:0}.ui.rating .icon{padding:0;margin:0;text-align:center;font-weight:400;font-style:normal;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;cursor:pointer;width:1.25em;height:auto;-webkit-transition:opacity .1s ease,background .1s ease,text-shadow .1s ease,color .1s ease;transition:opacity .1s ease,background .1s ease,text-shadow .1s ease,color .1s ease;line-height:1;-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui.rating .icon{background:0 0;color:rgba(0,0,0,.15)}.ui.rating .active.icon{background:0 0;color:rgba(0,0,0,.85)}.ui.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.85)),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,rgba(0,0,0,.85) 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,rgba(0,0,0,.85) 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);-webkit-background-clip:text;background-clip:text;color:transparent}.ui.rating .icon.selected,.ui.rating .icon.selected.active,.ui.rating .icon.selected.partial.active{background:0 0;color:rgba(0,0,0,.87);background-clip:unset}.ui.primary.rating .active.icon{color:#54c8ff;text-shadow:0 -1px 0 #2185d0,-1px 0 0 #2185d0,0 1px 0 #2185d0,1px 0 0 #2185d0}.ui.primary.rating .icon.selected,.ui.primary.rating .icon.selected.active,.ui.primary.rating .icon.selected.partial.active{background:inherit;color:#21b8ff;text-shadow:0 -1px 0 #1678c2,-1px 0 0 #1678c2,0 1px 0 #1678c2,1px 0 0 #1678c2;-webkit-text-stroke:unset;background-clip:unset}.ui.primary.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#54c8ff),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#54c8ff 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#54c8ff 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#2185d0 .78px;-webkit-background-clip:text;background-clip:text;color:transparent}.ui.secondary.rating .active.icon{color:#545454;text-shadow:0 -1px 0 #1b1c1d,-1px 0 0 #1b1c1d,0 1px 0 #1b1c1d,1px 0 0 #1b1c1d}.ui.secondary.rating .icon.selected,.ui.secondary.rating .icon.selected.active,.ui.secondary.rating .icon.selected.partial.active{background:inherit;color:#6e6e6e;text-shadow:0 -1px 0 #27292a,-1px 0 0 #27292a,0 1px 0 #27292a,1px 0 0 #27292a;-webkit-text-stroke:unset;background-clip:unset}.ui.secondary.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#545454),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#545454 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#545454 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#1b1c1d .78px;-webkit-background-clip:text;background-clip:text;color:transparent}.ui.red.rating .active.icon{color:#ff695e;text-shadow:0 -1px 0 #db2828,-1px 0 0 #db2828,0 1px 0 #db2828,1px 0 0 #db2828}.ui.red.rating .icon.selected,.ui.red.rating .icon.selected.active,.ui.red.rating .icon.selected.partial.active{background:inherit;color:#ff392b;text-shadow:0 -1px 0 #d01919,-1px 0 0 #d01919,0 1px 0 #d01919,1px 0 0 #d01919;-webkit-text-stroke:unset;background-clip:unset}.ui.red.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#ff695e),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#ff695e 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#ff695e 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#db2828 .78px;-webkit-background-clip:text;background-clip:text;color:transparent}.ui.orange.rating .active.icon{color:#ff851b;text-shadow:0 -1px 0 #f2711c,-1px 0 0 #f2711c,0 1px 0 #f2711c,1px 0 0 #f2711c}.ui.orange.rating .icon.selected,.ui.orange.rating .icon.selected.active,.ui.orange.rating .icon.selected.partial.active{background:inherit;color:#e76b00;text-shadow:0 -1px 0 #f26202,-1px 0 0 #f26202,0 1px 0 #f26202,1px 0 0 #f26202;-webkit-text-stroke:unset;background-clip:unset}.ui.orange.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#ff851b),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#ff851b 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#ff851b 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#f2711c .78px;-webkit-background-clip:text;background-clip:text;color:transparent}.ui.yellow.rating .active.icon{color:#ffe21f;text-shadow:0 -1px 0 #fbbd08,-1px 0 0 #fbbd08,0 1px 0 #fbbd08,1px 0 0 #fbbd08}.ui.yellow.rating .icon.selected,.ui.yellow.rating .icon.selected.active,.ui.yellow.rating .icon.selected.partial.active{background:inherit;color:#ebcd00;text-shadow:0 -1px 0 #eaae00,-1px 0 0 #eaae00,0 1px 0 #eaae00,1px 0 0 #eaae00;-webkit-text-stroke:unset;background-clip:unset}.ui.yellow.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#ffe21f),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#ffe21f 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#ffe21f 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#fbbd08 .78px;-webkit-background-clip:text;background-clip:text;color:transparent}.ui.olive.rating .active.icon{color:#d9e778;text-shadow:0 -1px 0 #b5cc18,-1px 0 0 #b5cc18,0 1px 0 #b5cc18,1px 0 0 #b5cc18}.ui.olive.rating .icon.selected,.ui.olive.rating .icon.selected.active,.ui.olive.rating .icon.selected.partial.active{background:inherit;color:#d2e745;text-shadow:0 -1px 0 #a7bd0d,-1px 0 0 #a7bd0d,0 1px 0 #a7bd0d,1px 0 0 #a7bd0d;-webkit-text-stroke:unset;background-clip:unset}.ui.olive.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#d9e778),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#d9e778 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#d9e778 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#b5cc18 .78px;-webkit-background-clip:text;background-clip:text;color:transparent}.ui.green.rating .active.icon{color:#2ecc40;text-shadow:0 -1px 0 #21ba45,-1px 0 0 #21ba45,0 1px 0 #21ba45,1px 0 0 #21ba45}.ui.green.rating .icon.selected,.ui.green.rating .icon.selected.active,.ui.green.rating .icon.selected.partial.active{background:inherit;color:#1ea92e;text-shadow:0 -1px 0 #16ab39,-1px 0 0 #16ab39,0 1px 0 #16ab39,1px 0 0 #16ab39;-webkit-text-stroke:unset;background-clip:unset}.ui.green.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#2ecc40),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#2ecc40 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#2ecc40 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#21ba45 .78px;-webkit-background-clip:text;background-clip:text;color:transparent}.ui.teal.rating .active.icon{color:#6dffff;text-shadow:0 -1px 0 #00b5ad,-1px 0 0 #00b5ad,0 1px 0 #00b5ad,1px 0 0 #00b5ad}.ui.teal.rating .icon.selected,.ui.teal.rating .icon.selected.active,.ui.teal.rating .icon.selected.partial.active{background:inherit;color:#3affff;text-shadow:0 -1px 0 #009c95,-1px 0 0 #009c95,0 1px 0 #009c95,1px 0 0 #009c95;-webkit-text-stroke:unset;background-clip:unset}.ui.teal.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#6dffff),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#6dffff 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#6dffff 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#00b5ad .78px;-webkit-background-clip:text;background-clip:text;color:transparent}.ui.blue.rating .active.icon{color:#54c8ff;text-shadow:0 -1px 0 #2185d0,-1px 0 0 #2185d0,0 1px 0 #2185d0,1px 0 0 #2185d0}.ui.blue.rating .icon.selected,.ui.blue.rating .icon.selected.active,.ui.blue.rating .icon.selected.partial.active{background:inherit;color:#21b8ff;text-shadow:0 -1px 0 #1678c2,-1px 0 0 #1678c2,0 1px 0 #1678c2,1px 0 0 #1678c2;-webkit-text-stroke:unset;background-clip:unset}.ui.blue.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#54c8ff),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#54c8ff 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#54c8ff 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#2185d0 .78px;-webkit-background-clip:text;background-clip:text;color:transparent}.ui.violet.rating .active.icon{color:#a291fb;text-shadow:0 -1px 0 #6435c9,-1px 0 0 #6435c9,0 1px 0 #6435c9,1px 0 0 #6435c9}.ui.violet.rating .icon.selected,.ui.violet.rating .icon.selected.active,.ui.violet.rating .icon.selected.partial.active{background:inherit;color:#745aff;text-shadow:0 -1px 0 #5829bb,-1px 0 0 #5829bb,0 1px 0 #5829bb,1px 0 0 #5829bb;-webkit-text-stroke:unset;background-clip:unset}.ui.violet.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#a291fb),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#a291fb 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#a291fb 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#6435c9 .78px;-webkit-background-clip:text;background-clip:text;color:transparent}.ui.purple.rating .active.icon{color:#dc73ff;text-shadow:0 -1px 0 #a333c8,-1px 0 0 #a333c8,0 1px 0 #a333c8,1px 0 0 #a333c8}.ui.purple.rating .icon.selected,.ui.purple.rating .icon.selected.active,.ui.purple.rating .icon.selected.partial.active{background:inherit;color:#cf40ff;text-shadow:0 -1px 0 #9627ba,-1px 0 0 #9627ba,0 1px 0 #9627ba,1px 0 0 #9627ba;-webkit-text-stroke:unset;background-clip:unset}.ui.purple.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#dc73ff),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#dc73ff 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#dc73ff 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#a333c8 .78px;-webkit-background-clip:text;background-clip:text;color:transparent}.ui.pink.rating .active.icon{color:#ff8edf;text-shadow:0 -1px 0 #e03997,-1px 0 0 #e03997,0 1px 0 #e03997,1px 0 0 #e03997}.ui.pink.rating .icon.selected,.ui.pink.rating .icon.selected.active,.ui.pink.rating .icon.selected.partial.active{background:inherit;color:#ff5bd1;text-shadow:0 -1px 0 #e61a8d,-1px 0 0 #e61a8d,0 1px 0 #e61a8d,1px 0 0 #e61a8d;-webkit-text-stroke:unset;background-clip:unset}.ui.pink.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#ff8edf),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#ff8edf 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#ff8edf 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#e03997 .78px;-webkit-background-clip:text;background-clip:text;color:transparent}.ui.brown.rating .active.icon{color:#d67c1c;text-shadow:0 -1px 0 #a5673f,-1px 0 0 #a5673f,0 1px 0 #a5673f,1px 0 0 #a5673f}.ui.brown.rating .icon.selected,.ui.brown.rating .icon.selected.active,.ui.brown.rating .icon.selected.partial.active{background:inherit;color:#b0620f;text-shadow:0 -1px 0 #975b33,-1px 0 0 #975b33,0 1px 0 #975b33,1px 0 0 #975b33;-webkit-text-stroke:unset;background-clip:unset}.ui.brown.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#d67c1c),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#d67c1c 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#d67c1c 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#a5673f .78px;-webkit-background-clip:text;background-clip:text;color:transparent}.ui.grey.rating .active.icon{color:#dcddde;text-shadow:0 -1px 0 #767676,-1px 0 0 #767676,0 1px 0 #767676,1px 0 0 #767676}.ui.grey.rating .icon.selected,.ui.grey.rating .icon.selected.active,.ui.grey.rating .icon.selected.partial.active{background:inherit;color:#c2c4c5;text-shadow:0 -1px 0 #838383,-1px 0 0 #838383,0 1px 0 #838383,1px 0 0 #838383;-webkit-text-stroke:unset;background-clip:unset}.ui.grey.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#dcddde),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#dcddde 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#dcddde 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#767676 .78px;-webkit-background-clip:text;background-clip:text;color:transparent}.ui.black.rating .active.icon{color:#545454;text-shadow:0 -1px 0 #1b1c1d,-1px 0 0 #1b1c1d,0 1px 0 #1b1c1d,1px 0 0 #1b1c1d}.ui.black.rating .icon.selected,.ui.black.rating .icon.selected.active,.ui.black.rating .icon.selected.partial.active{background:inherit;color:#000;text-shadow:0 -1px 0 #27292a,-1px 0 0 #27292a,0 1px 0 #27292a,1px 0 0 #27292a;-webkit-text-stroke:unset;background-clip:unset}.ui.black.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#545454),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#545454 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#545454 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#1b1c1d .78px;-webkit-background-clip:text;background-clip:text;color:transparent}.ui.disabled.rating .icon{cursor:default}.ui.rating.selected .active.icon{opacity:1}.ui.rating .icon.selected,.ui.rating.selected .icon.selected{opacity:1}.ui.rating{font-size:1rem}.ui.mini.rating{font-size:.78571429rem}.ui.tiny.rating{font-size:.85714286rem}.ui.small.rating{font-size:.92857143rem}.ui.large.rating{font-size:1.14285714rem}.ui.big.rating{font-size:1.28571429rem}.ui.huge.rating{font-size:1.42857143rem}.ui.massive.rating{font-size:2rem}/*! + * # Fomantic-UI - Search + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.search{position:relative}.ui.search>.prompt{margin:0;outline:0;-webkit-appearance:none;-webkit-tap-highlight-color:rgba(255,255,255,0);text-shadow:none;font-style:normal;font-weight:400;line-height:1.21428571em;padding:.67857143em 1em;font-size:1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:0 0 0 0 transparent inset;-webkit-transition:background-color .1s ease,color .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,color .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,color .1s ease,box-shadow .1s ease,border-color .1s ease;transition:background-color .1s ease,color .1s ease,box-shadow .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease}.ui.search .prompt{border-radius:500rem}.ui.search .prompt~.search.icon{cursor:pointer}.ui.search>.results{display:none;position:absolute;top:100%;left:0;-webkit-transform-origin:center top;transform-origin:center top;white-space:normal;text-align:left;text-transform:none;background:#fff;margin-top:.5em;width:18em;border-radius:.28571429rem;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);border:1px solid #d4d4d5;z-index:998}.ui.search>.results>:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.search>.results>:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.search>.results .result{cursor:pointer;display:block;overflow:hidden;font-size:1em;padding:.85714286em 1.14285714em;color:rgba(0,0,0,.87);line-height:1.33;border-bottom:1px solid rgba(34,36,38,.1)}.ui.search>.results .result:last-child{border-bottom:none!important}.ui.search>.results .result .image{float:right;overflow:hidden;background:0 0;width:5em;height:3em;border-radius:.25em}.ui.search>.results .result .image img{display:block;width:auto;height:100%}.ui.search>.results .result .image+.content{margin:0 6em 0 0}.ui.search>.results .result .title{margin:-.14285714em 0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;font-size:1em;color:rgba(0,0,0,.85)}.ui.search>.results .result .description{margin-top:0;font-size:.92857143em;color:rgba(0,0,0,.4)}.ui.search>.results .result .price{float:right;color:#21ba45}.ui.search>.results>.message{padding:1em 1em}.ui.search>.results>.message .header{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1rem;font-weight:700;color:rgba(0,0,0,.87)}.ui.search>.results>.message .description{margin-top:.25rem;font-size:1em;color:rgba(0,0,0,.87)}.ui.search>.results>.action{display:block;border-top:none;background:#f3f4f5;padding:.92857143em 1em;color:rgba(0,0,0,.87);font-weight:700;text-align:center}.ui.search>.prompt:focus{border-color:rgba(34,36,38,.35);background:#fff;color:rgba(0,0,0,.95)}.ui.loading.search .input>i.icon:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loading.search .input>i.icon:after{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;-webkit-animation:loader .6s infinite linear;animation:loader .6s infinite linear;border:.2em solid #767676;border-radius:500rem;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}.ui.category.search>.results .category .result:hover,.ui.search>.results .result:hover{background:#f9fafb}.ui.search .action:hover:not(div){background:#e0e0e0}.ui.category.search>.results .category.active{background:#f3f4f5}.ui.category.search>.results .category.active>.name{color:rgba(0,0,0,.87)}.ui.category.search>.results .category .result.active,.ui.search>.results .result.active{position:relative;border-left-color:rgba(34,36,38,.1);background:#f3f4f5;-webkit-box-shadow:none;box-shadow:none}.ui.search>.results .result.active .title{color:rgba(0,0,0,.85)}.ui.search>.results .result.active .description{color:rgba(0,0,0,.85)}.ui.disabled.search{cursor:default;pointer-events:none;opacity:.45}.ui.search.selection .prompt{border-radius:.28571429rem}.ui.search.selection>.icon.input>.remove.icon{pointer-events:none;position:absolute;left:auto;opacity:0;color:'';top:0;right:0;-webkit-transition:color .1s ease,opacity .1s ease;transition:color .1s ease,opacity .1s ease}.ui.search.selection>.icon.input>.active.remove.icon{cursor:pointer;opacity:.8;pointer-events:auto}.ui.search.selection>.icon.input:not([class*="left icon"])>.icon~.remove.icon{right:1.85714em}.ui.search.selection>.icon.input>.remove.icon:hover{opacity:1;color:#db2828}.ui.category.search .results{width:28em}.ui.category.search .results.animating,.ui.category.search .results.visible{display:table}.ui.category.search>.results .category{display:table-row;background:#f3f4f5;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:background .1s ease,border-color .1s ease;transition:background .1s ease,border-color .1s ease}.ui.category.search>.results .category:last-child{border-bottom:none}.ui.category.search>.results .category:first-child .name+.result{border-radius:0 .28571429rem 0 0}.ui.category.search>.results .category:last-child .result:last-child{border-radius:0 0 .28571429rem 0}.ui.category.search>.results .category>.name{display:table-cell;text-overflow:ellipsis;width:100px;white-space:nowrap;background:0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1em;padding:.4em 1em;font-weight:700;color:rgba(0,0,0,.4);border-bottom:1px solid rgba(34,36,38,.1)}.ui.category.search>.results .category .results{display:table-cell;background:#fff;border-left:1px solid rgba(34,36,38,.15);border-bottom:1px solid rgba(34,36,38,.1)}.ui.category.search>.results .category .result{border-bottom:1px solid rgba(34,36,38,.1);-webkit-transition:background .1s ease,border-color .1s ease;transition:background .1s ease,border-color .1s ease;padding:.85714286em 1.14285714em}.ui[class*="left aligned"].search>.results{right:auto;left:0}.ui[class*="right aligned"].search>.results{right:0;left:auto}.ui.fluid.search .results{width:100%}.ui.search{font-size:1em}.ui.mini.search{font-size:.78571429em}.ui.tiny.search{font-size:.85714286em}.ui.small.search{font-size:.92857143em}.ui.large.search{font-size:1.14285714em}.ui.big.search{font-size:1.28571429em}.ui.huge.search{font-size:1.42857143em}.ui.massive.search{font-size:1.71428571em}@media only screen and (max-width:767.98px){.ui.search .results{max-width:calc(100vw - 2rem)}}/*! + * # Fomantic-UI - Shape + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.shape{position:relative;vertical-align:top;display:inline-block;-webkit-perspective:2000px;perspective:2000px;-webkit-transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out}.ui.shape .sides{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.ui.shape .side{display:none;opacity:1;width:100%;margin:0!important;-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui.shape .side *{-webkit-backface-visibility:visible!important;backface-visibility:visible!important}.ui.cube.shape .side{min-width:15em;height:15em;padding:2em;background-color:#e6e6e6;color:rgba(0,0,0,.87);-webkit-box-shadow:0 0 2px rgba(0,0,0,.3);box-shadow:0 0 2px rgba(0,0,0,.3)}.ui.cube.shape .side>.content{width:100%;height:100%;display:table;text-align:center;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.ui.cube.shape .side>.content>div{display:table-cell;vertical-align:middle;font-size:2em}.ui.text.shape.animating .sides{position:static}.ui.text.shape .side{white-space:nowrap}.ui.text.shape .side>*{white-space:normal}.ui.loading.shape{position:absolute;top:-9999px;left:-9999px}.ui.shape .animating.side{position:absolute;top:0;left:0;display:block;z-index:100}.ui.shape .hidden.side{opacity:.6}.ui.shape.animating .sides{position:absolute;-webkit-transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out}.ui.shape.animating .side{-webkit-transition:opacity .6s ease-in-out;transition:opacity .6s ease-in-out}.ui.shape .animating.side *,.ui.shape.animating .side *{-webkit-transition:none;transition:none}.ui.shape .active.side{display:block}/*! + * # Fomantic-UI - Sidebar + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.sidebar{position:fixed;top:0;left:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:none;transition:none;will-change:transform;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden;-webkit-overflow-scrolling:touch;height:100%!important;max-height:100%;border-radius:0!important;margin:0!important;overflow-y:auto!important;z-index:102}.ui.sidebar>*{-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui.left.sidebar{right:auto;left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.sidebar{right:0!important;left:auto!important;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.bottom.sidebar,.ui.top.sidebar{width:100%!important;height:auto!important}.ui.top.sidebar{top:0!important;bottom:auto!important;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.sidebar{top:auto!important;bottom:0!important;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.pushable{height:100%;overflow-x:hidden;padding:0!important}body.pushable{background:#545454}body.pushable.dimmed{background:inherit}.pushable:not(body){-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.pushable:not(body)>.fixed,.pushable:not(body)>.pusher:after,.pushable:not(body)>.ui.sidebar{position:absolute}.pushable>.fixed{position:fixed;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;will-change:transform;z-index:101}.pushable>.pusher{position:relative;-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden;min-height:100%;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:2;background:inherit}body.pushable>.pusher{background:#fff}.pushable>.pusher:after{position:fixed;top:0;right:0;content:'';background-color:rgba(0,0,0,.4);overflow:hidden;opacity:0;-webkit-transition:opacity .5s;transition:opacity .5s;will-change:opacity;z-index:1000}.ui.sidebar.menu .item{border-radius:0!important}.pushable>.pusher.dimmed:after{width:100%!important;height:100%!important;opacity:1!important}.ui.animating.sidebar{visibility:visible}.ui.visible.sidebar{visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.left.visible.sidebar,.ui.right.visible.sidebar{-webkit-box-shadow:0 0 20px rgba(34,36,38,.15);box-shadow:0 0 20px rgba(34,36,38,.15)}.ui.bottom.visible.sidebar,.ui.top.visible.sidebar{-webkit-box-shadow:0 0 20px rgba(34,36,38,.15);box-shadow:0 0 20px rgba(34,36,38,.15)}.ui.visible.left.sidebar~.fixed,.ui.visible.left.sidebar~.pusher{-webkit-transform:translate3d(260px,0,0);transform:translate3d(260px,0,0)}.ui.visible.right.sidebar~.fixed,.ui.visible.right.sidebar~.pusher{-webkit-transform:translate3d(-260px,0,0);transform:translate3d(-260px,0,0)}.ui.visible.top.sidebar~.fixed,.ui.visible.top.sidebar~.pusher{-webkit-transform:translate3d(0,36px,0);transform:translate3d(0,36px,0)}.ui.visible.bottom.sidebar~.fixed,.ui.visible.bottom.sidebar~.pusher{-webkit-transform:translate3d(0,-36px,0);transform:translate3d(0,-36px,0)}.ui.visible.left.sidebar~.ui.visible.right.sidebar~.fixed,.ui.visible.left.sidebar~.ui.visible.right.sidebar~.pusher,.ui.visible.right.sidebar~.ui.visible.left.sidebar~.fixed,.ui.visible.right.sidebar~.ui.visible.left.sidebar~.pusher{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.thin.left.sidebar,.ui.thin.right.sidebar{width:150px}.ui[class*="very thin"].left.sidebar,.ui[class*="very thin"].right.sidebar{width:60px}.ui.left.sidebar,.ui.right.sidebar{width:260px}.ui.wide.left.sidebar,.ui.wide.right.sidebar{width:350px}.ui[class*="very wide"].left.sidebar,.ui[class*="very wide"].right.sidebar{width:475px}.ui.visible.thin.left.sidebar~.fixed,.ui.visible.thin.left.sidebar~.pusher{-webkit-transform:translate3d(150px,0,0);transform:translate3d(150px,0,0)}.ui.visible[class*="very thin"].left.sidebar~.fixed,.ui.visible[class*="very thin"].left.sidebar~.pusher{-webkit-transform:translate3d(60px,0,0);transform:translate3d(60px,0,0)}.ui.visible.wide.left.sidebar~.fixed,.ui.visible.wide.left.sidebar~.pusher{-webkit-transform:translate3d(350px,0,0);transform:translate3d(350px,0,0)}.ui.visible[class*="very wide"].left.sidebar~.fixed,.ui.visible[class*="very wide"].left.sidebar~.pusher{-webkit-transform:translate3d(475px,0,0);transform:translate3d(475px,0,0)}.ui.visible.thin.right.sidebar~.fixed,.ui.visible.thin.right.sidebar~.pusher{-webkit-transform:translate3d(-150px,0,0);transform:translate3d(-150px,0,0)}.ui.visible[class*="very thin"].right.sidebar~.fixed,.ui.visible[class*="very thin"].right.sidebar~.pusher{-webkit-transform:translate3d(-60px,0,0);transform:translate3d(-60px,0,0)}.ui.visible.wide.right.sidebar~.fixed,.ui.visible.wide.right.sidebar~.pusher{-webkit-transform:translate3d(-350px,0,0);transform:translate3d(-350px,0,0)}.ui.visible[class*="very wide"].right.sidebar~.fixed,.ui.visible[class*="very wide"].right.sidebar~.pusher{-webkit-transform:translate3d(-475px,0,0);transform:translate3d(-475px,0,0)}.ui.overlay.sidebar{z-index:102}.ui.left.overlay.sidebar{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.overlay.sidebar{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.top.overlay.sidebar{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.overlay.sidebar{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.animating.ui.overlay.sidebar,.ui.visible.overlay.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.visible.left.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.right.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.top.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.bottom.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.overlay.sidebar~.fixed,.ui.visible.overlay.sidebar~.pusher{-webkit-transform:none!important;transform:none!important}.ui.push.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:102}.ui.left.push.sidebar{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.push.sidebar{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.top.push.sidebar{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.push.sidebar{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.ui.visible.push.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.uncover.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:1}.ui.visible.uncover.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.slide.along.sidebar{z-index:1}.ui.left.slide.along.sidebar{-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0)}.ui.right.slide.along.sidebar{-webkit-transform:translate3d(50%,0,0);transform:translate3d(50%,0,0)}.ui.top.slide.along.sidebar{-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.ui.bottom.slide.along.sidebar{-webkit-transform:translate3d(0,50%,0);transform:translate3d(0,50%,0)}.ui.animating.slide.along.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.visible.slide.along.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.slide.out.sidebar{z-index:1}.ui.left.slide.out.sidebar{-webkit-transform:translate3d(50%,0,0);transform:translate3d(50%,0,0)}.ui.right.slide.out.sidebar{-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0)}.ui.top.slide.out.sidebar{-webkit-transform:translate3d(0,50%,0);transform:translate3d(0,50%,0)}.ui.bottom.slide.out.sidebar{-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.ui.animating.slide.out.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.visible.slide.out.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.scale.down.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:102}.ui.left.scale.down.sidebar{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.scale.down.sidebar{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.top.scale.down.sidebar{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.scale.down.sidebar{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.ui.scale.down.left.sidebar~.pusher{-webkit-transform-origin:75% 50%;transform-origin:75% 50%}.ui.scale.down.right.sidebar~.pusher{-webkit-transform-origin:25% 50%;transform-origin:25% 50%}.ui.scale.down.top.sidebar~.pusher{-webkit-transform-origin:50% 75%;transform-origin:50% 75%}.ui.scale.down.bottom.sidebar~.pusher{-webkit-transform-origin:50% 25%;transform-origin:50% 25%}.ui.animating.scale.down>.visible.ui.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.animating.scale.down.sidebar~.pusher,.ui.visible.scale.down.sidebar~.pusher{display:block!important;width:100%;height:100%;overflow:hidden!important}.ui.visible.scale.down.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.scale.down.sidebar~.pusher{-webkit-transform:scale(.75);transform:scale(.75)}/*! + * # Fomantic-UI - Sticky + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.sticky{position:static;-webkit-transition:none;transition:none;z-index:800}.ui.sticky.bound{position:absolute;left:auto;right:auto}.ui.sticky.fixed{position:fixed;left:auto;right:auto}.ui.sticky.bound.top,.ui.sticky.fixed.top{top:0;bottom:auto}.ui.sticky.bound.bottom,.ui.sticky.fixed.bottom{top:auto;bottom:0}.ui.native.sticky{position:-webkit-sticky;position:-moz-sticky;position:-ms-sticky;position:-o-sticky;position:sticky}/*! + * # Fomantic-UI - Tab + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.tab{display:none}.ui.tab.active,.ui.tab.open{display:block}.ui.tab.loading{position:relative;overflow:hidden;display:block;min-height:250px}.ui.tab.loading *{position:relative!important;left:-10000px!important}.ui.tab.loading.segment:before,.ui.tab.loading:before{position:absolute;content:'';top:50%;left:50%;margin:-1.25em 0 0 -1.25em;width:2.5em;height:2.5em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.tab.loading.segment:after,.ui.tab.loading:after{position:absolute;content:'';top:50%;left:50%;margin:-1.25em 0 0 -1.25em;width:2.5em;height:2.5em;-webkit-animation:loader .6s infinite linear;animation:loader .6s infinite linear;border:.2em solid #767676;border-radius:500rem;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}/*! + * # Fomantic-UI - Toast + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.toast-container{position:fixed;z-index:9999}.ui.toast-container.top.right{top:.85714286em;right:.85714286em;margin-left:.85714286em}.ui.toast-container.top.left{top:.85714286em;left:.85714286em;margin-right:.85714286em}.ui.toast-container.top.center{left:50%;-webkit-transform:translate(-50%,0);transform:translate(-50%,0);top:.85714286em}.ui.toast-container.bottom.right{bottom:.85714286em;right:.85714286em;margin-left:.85714286em}.ui.toast-container.bottom.left{bottom:.85714286em;left:.85714286em;margin-right:.85714286em}.ui.toast-container.bottom.center{left:50%;-webkit-transform:translate(-50%,0);transform:translate(-50%,0);bottom:.85714286em}.ui.toast-container .animating.toast-box,.ui.toast-container .toast-box,.ui.toast-container .visible.toast-box{display:table!important}.ui.toast-container .toast-box{margin-bottom:.5em;border-radius:.28571429rem;cursor:default}.ui.toast-container .toast-box:hover{opacity:1}.ui.toast-container .toast-box:not(.unclickable):hover{cursor:pointer}.ui.toast-container .toast-box.floating,.ui.toast-container .toast-box.hoverfloating:hover{-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);border:1px solid rgba(34,36,38,.12)}.ui.toast-container .toast-box.compact,.ui.toast-container .toast-box>.compact{width:350px}.ui.toast-container .toast-box>.ui.message,.ui.toast-container .toast-box>.ui.toast{margin:0 -1px -.01em;position:relative}.ui.toast-container .toast-box>.attached.progress{z-index:1}.ui.toast-container .toast-box>.attached.progress.bottom{margin:-.2em -1px -.01em}.ui.toast-container .toast-box>.attached.progress.top{margin:-.01em -1px -.2em}.ui.toast-container .toast-box>.attached.progress .bar{min-width:0}.ui.toast-container .toast-box>.attached.progress.info .bar.bar.bar{background:#12a1bf}.ui.toast-container .toast-box>.attached.progress.warning .bar.bar.bar{background:#cf9b0d}.ui.toast-container .toast-box>.attached.progress.success .bar.bar.bar{background:#15792d}.ui.toast-container .toast-box>.attached.progress .error .bar.bar.bar{background:#9c1a1a}.ui.toast-container .toast-box>.attached.progress.neutral .bar.bar.bar{background:#d9d9d9}.ui.toast-container .toast-box>.ui.message>.close.icon{top:.3em;right:.3em}.ui.toast-container .toast-box>.ui.message>.actions:last-child{margin-bottom:-1em}.ui.toast-container .toast-box>.ui.message.icon{-webkit-box-align:inherit;-ms-flex-align:inherit;align-items:inherit}.ui.toast-container .toast-box>.ui.message.icon>:not(.icon):not(.actions){padding-left:5rem}.ui.toast-container .toast-box>.ui.message.icon>.icon:not(.close){display:inline-block;position:absolute;width:4rem;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.ui.toast-container .toast-box>.ui.message.icon:not(.vertical).actions>.icon:not(.close){top:calc(50% - 1.2em);-webkit-transform:none;transform:none}.ui.toast-container .toast-box>.ui.message.icon:not(.vertical).icon.icon.icon{display:block}.ui.toast-container .toast-box .ui.toast>.close.icon{cursor:pointer;margin:0;opacity:.7;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.toast-container .toast-box .ui.toast>.close.icon:hover{opacity:1}.ui.toast-container .toast-box .ui.toast.vertical>.close.icon{margin-top:-.3em;margin-right:-.3em}.ui.toast-container .toast-box .ui.toast:not(.vertical)>.close.icon{position:absolute;top:.3em}.ui.toast-container .toast-box .ui.toast:not(.vertical)>.close.icon:not(.left){right:.3em}.ui.toast-container .toast-box .ui.toast:not(.vertical)>.close.icon.left{margin-left:-.3em}.ui.toast-container .toast-box .ui.card{margin:0}.ui.toast-container .toast-box .ui.card.attached:not(.vertical).bottom{border-top-left-radius:0;border-top-right-radius:0}.ui.toast-container .toast-box .ui.card.attached:not(.vertical).bottom.horizontal>.image>img{border-top-left-radius:0}.ui.toast-container .toast-box .ui.card.attached:not(.vertical).bottom.horizontal>.image:last-child>img{border-top-right-radius:0}.ui.toast-container .toast-box .ui.card.attached:not(.vertical).top{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.toast-container .toast-box .ui.card.attached:not(.vertical).top.horizontal>.image>img{border-bottom-left-radius:0}.ui.toast-container .toast-box .ui.card.attached:not(.vertical).top.horizontal>.image:last-child>img{border-bottom-right-radius:0}.ui.toast-container .toast-box .ui.card.horizontal.actions>.image>img{border-bottom-left-radius:0}.ui.toast-container .toast-box .ui.card.horizontal.actions>.image:last-child>img{border-bottom-right-radius:0}.ui.toast-container .toast-box .progressing{-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-timing-function:linear;animation-timing-function:linear}.ui.toast-container .toast-box .progressing.up{-webkit-animation-name:progressUp;animation-name:progressUp}.ui.toast-container .toast-box .progressing.down{-webkit-animation-name:progressDown;animation-name:progressDown}.ui.toast-container .toast-box .progressing.wait{-webkit-animation-name:progressWait;animation-name:progressWait}.ui.toast-container .toast-box:hover .pausable.progressing{-webkit-animation-play-state:paused;animation-play-state:paused}.ui.toast-container .toast-box .ui.toast:not(.vertical){display:block}.ui.toast-container .toast-box :not(.comment):not(.card) .actions{margin:.5em -1em -1em -1em}.ui.toast-container .toast-box :not(.comment) .actions{padding:.5em .5em .75em .5em;text-align:right}.ui.toast-container .toast-box :not(.comment) .actions.attached:not(.vertical){margin-right:1px}.ui.toast-container .toast-box :not(.comment) .actions:not(.basic):not(.attached){background:rgba(255,255,255,.25);border-top:1px solid rgba(0,0,0,.2)}.ui.toast-container .toast-box :not(.comment) .actions.left{text-align:left}.ui.toast-container .toast-box .vertical.actions>.button,.ui.toast-container .toast-box>.vertical.vertical.vertical,.ui.toast-container .toast-box>.vertical>.vertical.vertical{display:-webkit-box;display:-ms-flexbox;display:flex}.ui.toast-container .toast-box :not(.comment) .vertical.actions{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.toast-container .toast-box :not(.comment) .vertical.actions>.button{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.toast-container .toast-box :not(.comment) .vertical.actions.attached>.button{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached){border-top:0;margin-top:-.75em;margin-bottom:-.75em;margin-left:1em;-ms-flex-pack:distribute;justify-content:space-around}.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached):not(.basic){border-left:1px solid rgba(0,0,0,.2)}.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached)>.button:not(:last-child){margin-bottom:.3em}.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached).top{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached).bottom{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.ui.vertical.attached:not(.left).card>.image>img{border-top-right-radius:0}.ui.vertical.attached:not(.left).card.horizontal>.image:last-child>img{border-top-right-radius:0;border-bottom-right-radius:0}.ui.vertical.attached:not(.left).card,.ui.vertical.attached:not(.left).toast{border-top-right-radius:0;border-bottom-right-radius:0}.ui.vertical.attached:not(.left).actions{border-top-right-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.vertical.attached:not(.left).actions .button:first-child,.ui.vertical.attached:not(.left).actions .button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.ui.vertical.attached:not(.left).message{border-top-right-radius:0;border-bottom-left-radius:.28571429rem}.ui.vertical.attached.left.card>.image>img{border-top-left-radius:0}.ui.vertical.attached.left.card.horizontal>.image>img{border-top-left-radius:0;border-bottom-left-radius:0}.ui.vertical.attached.left.card,.ui.vertical.attached.left.toast{border-top-left-radius:0;border-bottom-left-radius:0}.ui.vertical.attached.left.actions{border-top-left-radius:.28571429rem;border-bottom-left-radius:.28571429rem}.ui.vertical.attached.left.actions .button:first-child,.ui.vertical.attached.left.actions .button:last-child{border-top-right-radius:0;border-bottom-right-radius:0}.ui.vertical.attached.left.actions .button:not(:first-child):not(:last-child){margin-left:-1px}.ui.vertical.attached.left.message.message.message{border-top-right-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.attached:not(.vertical):not(.top).actions{border-bottom-left-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.attached:not(.vertical):not(.top).actions .button:first-child{border-bottom-left-radius:.28571429rem}.ui.attached:not(.vertical):not(.top).actions .button:last-child{border-bottom-right-radius:.28571429rem}.ui.attached:not(.vertical).top.actions{border-top-left-radius:.28571429rem;border-top-right-radius:.28571429rem}.ui.attached:not(.vertical).top.actions .button:first-child{border-top-left-radius:.28571429rem}.ui.attached:not(.vertical).top.actions .button:last-child{border-top-right-radius:.28571429rem}.ui.toast{display:none;border-radius:.28571429rem;padding:.78571429em 1em;margin:0 -1px -.01em;color:rgba(0,0,0,.87);background-color:#fff}.ui.toast>.content>.header{font-weight:700;color:inherit;margin:0}.ui.toast.info{background-color:#31ccec;color:rgba(255,255,255,.9)}.ui.toast.warning{background-color:#f2c037;color:rgba(255,255,255,.9)}.ui.toast.success{background-color:#21ba45;color:rgba(255,255,255,.9)}.ui.toast.error{background-color:#db2828;color:rgba(255,255,255,.9)}.ui.toast.neutral{background-color:#fff;color:rgba(0,0,0,.87)}.ui.toast>.icon:not(.close){font-size:1.5em}.ui.toast:not(.vertical)>.icon:not(.close){position:absolute}.ui.toast:not(.vertical)>.icon:not(.close)+.content{padding-left:3em}.ui.toast:not(.vertical)>.close.icon+.content{padding-left:1.5em}.ui.toast:not(.vertical)>.ui.image{position:absolute}.ui.toast:not(.vertical)>.ui.image.avatar+.content{padding-left:3em;min-height:2em}.ui.toast:not(.vertical)>.ui.image.mini+.content{padding-left:3.4em;min-height:35px}.ui.toast:not(.vertical)>.ui.image.tiny+.content{padding-left:7em;min-height:80px}.ui.toast:not(.vertical)>.ui.image.small+.content{padding-left:12em;min-height:150px}.ui.toast:not(.vertical)>.centered.icon,.ui.toast:not(.vertical)>.centered.image{-webkit-transform:translateY(-50%);transform:translateY(-50%);top:50%}.ui.toast:not(.vertical).actions>.centered.image{top:calc(50% - 2em)}.ui.toast:not(.vertical).actions>.centered.icon{top:calc(50% - 1.2em)}.ui.toast.vertical>.close.icon+.content{padding-left:1em}.ui.toast.vertical>.icon:not(.close)+.content,.ui.toast.vertical>.ui.image+.content{padding-left:1em}.ui.toast.vertical>.ui.image{-ms-flex-item-align:start;align-self:flex-start;-ms-flex-negative:0;flex-shrink:0}.ui.toast.vertical>.centered.icon,.ui.toast.vertical>.centered.image{-ms-flex-item-align:center;align-self:center}.ui.toast.attached.bottom{border-top-left-radius:0;border-top-right-radius:0}.ui.toast.attached.top{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.hoverfloating.message:hover{-webkit-box-shadow:0 0 0 1px inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.center.toast-container .toast-box,.ui.right.toast-container .toast-box{margin-left:auto}.ui.center.toast-container .toast-box{margin-right:auto}.ui.primary.toast{background-color:#2185d0;color:rgba(255,255,255,.9)}.ui.inverted.primary.toast,.ui.toast-container .toast-box>.inverted.primary.attached.progress .bar{background-color:#54c8ff;color:rgba(0,0,0,.87)}.ui.secondary.toast{background-color:#1b1c1d;color:rgba(255,255,255,.9)}.ui.inverted.secondary.toast,.ui.toast-container .toast-box>.inverted.secondary.attached.progress .bar{background-color:#545454;color:rgba(0,0,0,.87)}.ui.red.toast{background-color:#db2828;color:rgba(255,255,255,.9)}.ui.inverted.red.toast,.ui.toast-container .toast-box>.inverted.red.attached.progress .bar{background-color:#ff695e;color:rgba(0,0,0,.87)}.ui.orange.toast{background-color:#f2711c;color:rgba(255,255,255,.9)}.ui.inverted.orange.toast,.ui.toast-container .toast-box>.inverted.orange.attached.progress .bar{background-color:#ff851b;color:rgba(0,0,0,.87)}.ui.yellow.toast{background-color:#fbbd08;color:rgba(255,255,255,.9)}.ui.inverted.yellow.toast,.ui.toast-container .toast-box>.inverted.yellow.attached.progress .bar{background-color:#ffe21f;color:rgba(0,0,0,.87)}.ui.olive.toast{background-color:#b5cc18;color:rgba(255,255,255,.9)}.ui.inverted.olive.toast,.ui.toast-container .toast-box>.inverted.olive.attached.progress .bar{background-color:#d9e778;color:rgba(0,0,0,.87)}.ui.green.toast{background-color:#21ba45;color:rgba(255,255,255,.9)}.ui.inverted.green.toast,.ui.toast-container .toast-box>.inverted.green.attached.progress .bar{background-color:#2ecc40;color:rgba(0,0,0,.87)}.ui.teal.toast{background-color:#00b5ad;color:rgba(255,255,255,.9)}.ui.inverted.teal.toast,.ui.toast-container .toast-box>.inverted.teal.attached.progress .bar{background-color:#6dffff;color:rgba(0,0,0,.87)}.ui.blue.toast{background-color:#2185d0;color:rgba(255,255,255,.9)}.ui.inverted.blue.toast,.ui.toast-container .toast-box>.inverted.blue.attached.progress .bar{background-color:#54c8ff;color:rgba(0,0,0,.87)}.ui.violet.toast{background-color:#6435c9;color:rgba(255,255,255,.9)}.ui.inverted.violet.toast,.ui.toast-container .toast-box>.inverted.violet.attached.progress .bar{background-color:#a291fb;color:rgba(0,0,0,.87)}.ui.purple.toast{background-color:#a333c8;color:rgba(255,255,255,.9)}.ui.inverted.purple.toast,.ui.toast-container .toast-box>.inverted.purple.attached.progress .bar{background-color:#dc73ff;color:rgba(0,0,0,.87)}.ui.pink.toast{background-color:#e03997;color:rgba(255,255,255,.9)}.ui.inverted.pink.toast,.ui.toast-container .toast-box>.inverted.pink.attached.progress .bar{background-color:#ff8edf;color:rgba(0,0,0,.87)}.ui.brown.toast{background-color:#a5673f;color:rgba(255,255,255,.9)}.ui.inverted.brown.toast,.ui.toast-container .toast-box>.inverted.brown.attached.progress .bar{background-color:#d67c1c;color:rgba(0,0,0,.87)}.ui.grey.toast{background-color:#767676;color:rgba(255,255,255,.9)}.ui.inverted.grey.toast,.ui.toast-container .toast-box>.inverted.grey.attached.progress .bar{background-color:#dcddde;color:rgba(0,0,0,.87)}.ui.black.toast{background-color:#1b1c1d;color:rgba(255,255,255,.9)}.ui.inverted.black.toast,.ui.toast-container .toast-box>.inverted.black.attached.progress .bar{background-color:#545454;color:rgba(0,0,0,.87)}.ui.inverted.toast{color:rgba(255,255,255,.9);background-color:#1b1c1d}@media only screen and (max-width:420px){.ui.toast-container .toast-box.toast-box,.ui.toast-container .toast-box>*,.ui.toast-container .toast-box>.compact,.ui.toast-container .toast-box>.vertical>*{width:auto;max-width:100%}.ui.toast-container .toast-box>:not(.vertical){min-width:280px}.ui.toast-container .toast-box>.ui.card.horizontal,.ui.toast-container .toast-box>.vertical>.ui.horizontal.card{min-width:initial}}@-webkit-keyframes progressDown{0%{width:100%}100%{width:0}}@keyframes progressDown{0%{width:100%}100%{width:0}}@-webkit-keyframes progressUp{0%{width:0}100%{width:100%}}@keyframes progressUp{0%{width:0}100%{width:100%}}@-webkit-keyframes progressWait{0%{opacity:1}100%{opacity:0}}@keyframes progressWait{0%{opacity:1}100%{opacity:0}}/*! + * # Fomantic-UI - Transition + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.transition{-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animating.transition{-webkit-backface-visibility:hidden;backface-visibility:hidden;visibility:visible!important}.loading.transition{position:absolute;top:-99999px;left:-99999px}.hidden.transition{display:none;visibility:hidden}.visible.transition{display:block!important;visibility:visible!important}.disabled.transition{-webkit-animation-play-state:paused;animation-play-state:paused}.looping.transition{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.transition.browse{-webkit-animation-duration:.5s;animation-duration:.5s}.transition.browse.in{-webkit-animation-name:browseIn;animation-name:browseIn}.transition.browse.left.out,.transition.browse.out{-webkit-animation-name:browseOutLeft;animation-name:browseOutLeft}.transition.browse.right.out{-webkit-animation-name:browseOutRight;animation-name:browseOutRight}@-webkit-keyframes browseIn{0%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1}10%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1;opacity:.7}80%{-webkit-transform:scale(1.05) translateZ(0);transform:scale(1.05) translateZ(0);opacity:1;z-index:999}100%{-webkit-transform:scale(1) translateZ(0);transform:scale(1) translateZ(0);z-index:999}}@keyframes browseIn{0%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1}10%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1;opacity:.7}80%{-webkit-transform:scale(1.05) translateZ(0);transform:scale(1.05) translateZ(0);opacity:1;z-index:999}100%{-webkit-transform:scale(1) translateZ(0);transform:scale(1) translateZ(0);z-index:999}}@-webkit-keyframes browseOutLeft{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:-1;-webkit-transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:-1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}@keyframes browseOutLeft{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:-1;-webkit-transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:-1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}@-webkit-keyframes browseOutRight{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:1;-webkit-transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}@keyframes browseOutRight{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:1;-webkit-transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}.drop.transition{-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-timing-function:cubic-bezier(.34,1.61,.7,1);animation-timing-function:cubic-bezier(.34,1.61,.7,1)}.drop.transition.in{-webkit-animation-name:dropIn;animation-name:dropIn}.drop.transition.out{-webkit-animation-name:dropOut;animation-name:dropOut}@-webkit-keyframes dropIn{0%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes dropIn{0%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes dropOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}}@keyframes dropOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}}.transition.fade.in{-webkit-animation-name:fadeIn;animation-name:fadeIn}.transition[class*="fade up"].in{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}.transition[class*="fade down"].in{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}.transition[class*="fade left"].in{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}.transition[class*="fade right"].in{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}.transition.fade.out{-webkit-animation-name:fadeOut;animation-name:fadeOut}.transition[class*="fade up"].out{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}.transition[class*="fade down"].out{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}.transition[class*="fade left"].out{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}.transition[class*="fade right"].out{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(10%);transform:translateY(10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(10%);transform:translateY(10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-10%);transform:translateY(-10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-10%);transform:translateY(-10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(10%);transform:translateX(10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(10%);transform:translateX(10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(-10%);transform:translateX(-10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(-10%);transform:translateX(-10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(5%);transform:translateY(5%)}}@keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(5%);transform:translateY(5%)}}@-webkit-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-5%);transform:translateY(-5%)}}@keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-5%);transform:translateY(-5%)}}@-webkit-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(5%);transform:translateX(5%)}}@keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(5%);transform:translateX(5%)}}@-webkit-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-5%);transform:translateX(-5%)}}@keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-5%);transform:translateX(-5%)}}.flip.transition.in,.flip.transition.out{-webkit-animation-duration:.6s;animation-duration:.6s}.horizontal.flip.transition.in{-webkit-animation-name:horizontalFlipIn;animation-name:horizontalFlipIn}.horizontal.flip.transition.out{-webkit-animation-name:horizontalFlipOut;animation-name:horizontalFlipOut}.vertical.flip.transition.in{-webkit-animation-name:verticalFlipIn;animation-name:verticalFlipIn}.vertical.flip.transition.out{-webkit-animation-name:verticalFlipOut;animation-name:verticalFlipOut}@-webkit-keyframes horizontalFlipIn{0%{-webkit-transform:perspective(2000px) rotateY(-90deg);transform:perspective(2000px) rotateY(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}}@keyframes horizontalFlipIn{0%{-webkit-transform:perspective(2000px) rotateY(-90deg);transform:perspective(2000px) rotateY(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}}@-webkit-keyframes verticalFlipIn{0%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}}@keyframes verticalFlipIn{0%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}}@-webkit-keyframes horizontalFlipOut{0%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateY(90deg);transform:perspective(2000px) rotateY(90deg);opacity:0}}@keyframes horizontalFlipOut{0%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateY(90deg);transform:perspective(2000px) rotateY(90deg);opacity:0}}@-webkit-keyframes verticalFlipOut{0%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}}@keyframes verticalFlipOut{0%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}}.scale.transition.in{-webkit-animation-name:scaleIn;animation-name:scaleIn}.scale.transition.out{-webkit-animation-name:scaleOut;animation-name:scaleOut}@-webkit-keyframes scaleIn{0%{opacity:0;-webkit-transform:scale(.8);transform:scale(.8)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes scaleIn{0%{opacity:0;-webkit-transform:scale(.8);transform:scale(.8)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes scaleOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.9);transform:scale(.9)}}@keyframes scaleOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.9);transform:scale(.9)}}.transition.fly{-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}.transition.fly.in{-webkit-animation-name:flyIn;animation-name:flyIn}.transition[class*="fly up"].in{-webkit-animation-name:flyInUp;animation-name:flyInUp}.transition[class*="fly down"].in{-webkit-animation-name:flyInDown;animation-name:flyInDown}.transition[class*="fly left"].in{-webkit-animation-name:flyInLeft;animation-name:flyInLeft}.transition[class*="fly right"].in{-webkit-animation-name:flyInRight;animation-name:flyInRight}.transition.fly.out{-webkit-animation-name:flyOut;animation-name:flyOut}.transition[class*="fly up"].out{-webkit-animation-name:flyOutUp;animation-name:flyOutUp}.transition[class*="fly down"].out{-webkit-animation-name:flyOutDown;animation-name:flyOutDown}.transition[class*="fly left"].out{-webkit-animation-name:flyOutLeft;animation-name:flyOutLeft}.transition[class*="fly right"].out{-webkit-animation-name:flyOutRight;animation-name:flyOutRight}@-webkit-keyframes flyIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes flyIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes flyInUp{0%{opacity:0;-webkit-transform:translate3d(0,1500px,0);transform:translate3d(0,1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes flyInUp{0%{opacity:0;-webkit-transform:translate3d(0,1500px,0);transform:translate3d(0,1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-webkit-keyframes flyInDown{0%{opacity:0;-webkit-transform:translate3d(0,-1500px,0);transform:translate3d(0,-1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@keyframes flyInDown{0%{opacity:0;-webkit-transform:translate3d(0,-1500px,0);transform:translate3d(0,-1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@-webkit-keyframes flyInLeft{0%{opacity:0;-webkit-transform:translate3d(1500px,0,0);transform:translate3d(1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes flyInLeft{0%{opacity:0;-webkit-transform:translate3d(1500px,0,0);transform:translate3d(1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@-webkit-keyframes flyInRight{0%{opacity:0;-webkit-transform:translate3d(-1500px,0,0);transform:translate3d(-1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes flyInRight{0%{opacity:0;-webkit-transform:translate3d(-1500px,0,0);transform:translate3d(-1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@-webkit-keyframes flyOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes flyOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@-webkit-keyframes flyOutUp{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes flyOutUp{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@-webkit-keyframes flyOutDown{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes flyOutDown{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@-webkit-keyframes flyOutRight{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes flyOutRight{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@-webkit-keyframes flyOutLeft{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes flyOutLeft{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.transition.slide.in,.transition[class*="slide down"].in{-webkit-animation-name:slideInY;animation-name:slideInY;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*="slide up"].in{-webkit-animation-name:slideInY;animation-name:slideInY;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*="slide left"].in{-webkit-animation-name:slideInX;animation-name:slideInX;-webkit-transform-origin:center right;transform-origin:center right}.transition[class*="slide right"].in{-webkit-animation-name:slideInX;animation-name:slideInX;-webkit-transform-origin:center left;transform-origin:center left}.transition.slide.out,.transition[class*="slide down"].out{-webkit-animation-name:slideOutY;animation-name:slideOutY;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*="slide up"].out{-webkit-animation-name:slideOutY;animation-name:slideOutY;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*="slide left"].out{-webkit-animation-name:slideOutX;animation-name:slideOutX;-webkit-transform-origin:center right;transform-origin:center right}.transition[class*="slide right"].out{-webkit-animation-name:slideOutX;animation-name:slideOutX;-webkit-transform-origin:center left;transform-origin:center left}@-webkit-keyframes slideInY{0%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}100%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes slideInY{0%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}100%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}}@-webkit-keyframes slideInX{0%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}100%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes slideInX{0%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}100%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}@-webkit-keyframes slideOutY{0%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}}@keyframes slideOutY{0%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}}@-webkit-keyframes slideOutX{0%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}100%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}}@keyframes slideOutX{0%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}100%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}}.transition.swing{-webkit-animation-duration:.8s;animation-duration:.8s}.transition[class*="swing down"].in{-webkit-animation-name:swingInX;animation-name:swingInX;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*="swing up"].in{-webkit-animation-name:swingInX;animation-name:swingInX;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*="swing left"].in{-webkit-animation-name:swingInY;animation-name:swingInY;-webkit-transform-origin:center right;transform-origin:center right}.transition[class*="swing right"].in{-webkit-animation-name:swingInY;animation-name:swingInY;-webkit-transform-origin:center left;transform-origin:center left}.transition.swing.out,.transition[class*="swing down"].out{-webkit-animation-name:swingOutX;animation-name:swingOutX;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*="swing up"].out{-webkit-animation-name:swingOutX;animation-name:swingOutX;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*="swing left"].out{-webkit-animation-name:swingOutY;animation-name:swingOutY;-webkit-transform-origin:center right;transform-origin:center right}.transition[class*="swing right"].out{-webkit-animation-name:swingOutY;animation-name:swingOutY;-webkit-transform-origin:center left;transform-origin:center left}@-webkit-keyframes swingInX{0%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateX(15deg);transform:perspective(1000px) rotateX(15deg)}80%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}100%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}}@keyframes swingInX{0%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateX(15deg);transform:perspective(1000px) rotateX(15deg)}80%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}100%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}}@-webkit-keyframes swingInY{0%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateY(-17.5deg);transform:perspective(1000px) rotateY(-17.5deg)}80%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}100%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}}@keyframes swingInY{0%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateY(-17.5deg);transform:perspective(1000px) rotateY(-17.5deg)}80%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}100%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}}@-webkit-keyframes swingOutX{0%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}40%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}60%{-webkit-transform:perspective(1000px) rotateX(17.5deg);transform:perspective(1000px) rotateX(17.5deg)}80%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}}@keyframes swingOutX{0%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}40%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}60%{-webkit-transform:perspective(1000px) rotateX(17.5deg);transform:perspective(1000px) rotateX(17.5deg)}80%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}}@-webkit-keyframes swingOutY{0%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}40%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}60%{-webkit-transform:perspective(1000px) rotateY(-10deg);transform:perspective(1000px) rotateY(-10deg)}80%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}}@keyframes swingOutY{0%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}40%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}60%{-webkit-transform:perspective(1000px) rotateY(-10deg);transform:perspective(1000px) rotateY(-10deg)}80%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}}.transition.zoom.in{-webkit-animation-name:zoomIn;animation-name:zoomIn}.transition.zoom.out{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomIn{0%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes zoomIn{0%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes zoomOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}}@keyframes zoomOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}}.flash.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:flash;animation-name:flash}.shake.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:shake;animation-name:shake}.bounce.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:bounce;animation-name:bounce}.tada.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:tada;animation-name:tada}.pulse.transition{-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-name:pulse;animation-name:pulse}.jiggle.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:jiggle;animation-name:jiggle}.transition.glow{-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:cubic-bezier(.19,1,.22,1);animation-timing-function:cubic-bezier(.19,1,.22,1)}.transition.glow{-webkit-animation-name:glow;animation-name:glow}@-webkit-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@-webkit-keyframes shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@-webkit-keyframes bounce{0%,100%,20%,50%,80%{-webkit-transform:translateY(0);transform:translateY(0)}40%{-webkit-transform:translateY(-30px);transform:translateY(-30px)}60%{-webkit-transform:translateY(-15px);transform:translateY(-15px)}}@keyframes bounce{0%,100%,20%,50%,80%{-webkit-transform:translateY(0);transform:translateY(0)}40%{-webkit-transform:translateY(-30px);transform:translateY(-30px)}60%{-webkit-transform:translateY(-15px);transform:translateY(-15px)}}@-webkit-keyframes tada{0%{-webkit-transform:scale(1);transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg);transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.1) rotate(3deg);transform:scale(1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.1) rotate(-3deg);transform:scale(1.1) rotate(-3deg)}100%{-webkit-transform:scale(1) rotate(0);transform:scale(1) rotate(0)}}@keyframes tada{0%{-webkit-transform:scale(1);transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg);transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.1) rotate(3deg);transform:scale(1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.1) rotate(-3deg);transform:scale(1.1) rotate(-3deg)}100%{-webkit-transform:scale(1) rotate(0);transform:scale(1) rotate(0)}}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}50%{-webkit-transform:scale(.9);transform:scale(.9);opacity:.7}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes pulse{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}50%{-webkit-transform:scale(.9);transform:scale(.9);opacity:.7}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@-webkit-keyframes jiggle{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes jiggle{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes glow{0%{background-color:#fcfcfd}30%{background-color:#fff6cd}100%{background-color:#fcfcfd}}@keyframes glow{0%{background-color:#fcfcfd}30%{background-color:#fff6cd}100%{background-color:#fcfcfd}} \ No newline at end of file diff --git a/code/modules/vchat/css/semantic.vc.min.css b/code/modules/vchat/css/semantic.vc.min.css new file mode 100644 index 0000000000..2bafead4c5 --- /dev/null +++ b/code/modules/vchat/css/semantic.vc.min.css @@ -0,0 +1,110 @@ +/* + * # Fomantic-UI - Menu + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */ + .ui.menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin:1rem 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;background:#fff;font-weight:400;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);border-radius:.28571429rem;min-height:2.85714286em}.ui.menu:after{content:'';display:block;height:0;clear:both;visibility:hidden}.ui.menu:first-child{margin-top:0}.ui.menu:last-child{margin-bottom:0}.ui.menu .menu{margin:0}.ui.menu:not(.vertical)>.menu{display:-webkit-box;display:-ms-flexbox;display:flex}.ui.menu:not(.vertical) .item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.menu .item{position:relative;vertical-align:middle;line-height:1;text-decoration:none;-webkit-tap-highlight-color:transparent;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:0 0;padding:.92857143em 1.14285714em;text-transform:none;color:rgba(0,0,0,.87);font-weight:400;-webkit-transition:background .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background .1s ease,box-shadow .1s ease,color .1s ease;transition:background .1s ease,box-shadow .1s ease,color .1s ease,-webkit-box-shadow .1s ease}.ui.menu>.item:first-child{border-radius:.28571429rem 0 0 .28571429rem}.ui.menu .item:before{position:absolute;content:'';top:0;right:0;height:100%;width:1px;background:rgba(34,36,38,.1)}.ui.menu .item>a:not(.ui),.ui.menu .item>p:only-child,.ui.menu .text.item>*{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;line-height:1.3}.ui.menu .item>p:first-child{margin-top:0}.ui.menu .item>p:last-child{margin-bottom:0}.ui.menu .item>i.icon{opacity:.9;float:none;margin:0 .35714286em 0 0}.ui.menu:not(.vertical) .item>.button{position:relative;top:0;margin:-.5em 0;padding-bottom:.78571429em;padding-top:.78571429em;font-size:1em}.ui.menu>.container,.ui.menu>.grid{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:inherit;-ms-flex-align:inherit;align-items:inherit;-webkit-box-orient:inherit;-webkit-box-direction:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.menu .item>.input{width:100%}.ui.menu:not(.vertical) .item>.input{position:relative;top:0;margin:-.5em 0}.ui.menu .item>.input input{font-size:1em;padding-top:.57142857em;padding-bottom:.57142857em}.ui.menu .header.item,.ui.vertical.menu .header.item{margin:0;background:'';text-transform:normal;font-weight:700}.ui.vertical.menu .item>.header:not(.ui){margin:0 0 .5em;font-size:1em;font-weight:700}.ui.menu .item>i.dropdown.icon{padding:0;float:right;margin:0 0 0 1em}.ui.menu .dropdown.item .menu{min-width:calc(100% - 1px);border-radius:0 0 .28571429rem .28571429rem;background:#fff;margin:0 0 0;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.08);box-shadow:0 1px 3px 0 rgba(0,0,0,.08);-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.ui.menu .ui.dropdown .menu>.item{margin:0;text-align:left;font-size:1em!important;padding:.78571429em 1.14285714em!important;background:0 0!important;color:rgba(0,0,0,.87)!important;text-transform:none!important;font-weight:400!important;-webkit-box-shadow:none!important;box-shadow:none!important;-webkit-transition:none!important;transition:none!important}.ui.menu .ui.dropdown .menu>.item:hover{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown .menu>.selected.item{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown .menu>.active.item{background:rgba(0,0,0,.03)!important;font-weight:700!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown.item .menu .item:not(.filtered){display:block}.ui.menu .ui.dropdown .menu>.item .icon:not(.dropdown){display:inline-block;font-size:1em!important;float:none;margin:0 .75em 0 0!important}.ui.secondary.menu .dropdown.item>.menu,.ui.text.menu .dropdown.item>.menu{border-radius:.28571429rem;margin-top:.35714286em}.ui.menu .pointing.dropdown.item .menu{margin-top:.75em}.ui.inverted.menu .search.dropdown.item>.search,.ui.inverted.menu .search.dropdown.item>.text{color:rgba(255,255,255,.9)}.ui.vertical.menu .dropdown.item>.icon{float:right;content:"\f0da";margin-left:1em}.ui.vertical.menu .dropdown.item .menu{left:100%;min-width:0;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;margin:0;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.08);box-shadow:0 1px 3px 0 rgba(0,0,0,.08);border-radius:0 .28571429rem .28571429rem .28571429rem}.ui.vertical.menu .dropdown.item.upward .menu{bottom:0}.ui.vertical.menu .dropdown.item:not(.upward) .menu{top:0}.ui.vertical.menu .active.dropdown.item{border-top-right-radius:0;border-bottom-right-radius:0}.ui.vertical.menu .dropdown.active.item{-webkit-box-shadow:none;box-shadow:none}.ui.item.menu .dropdown .menu .item{width:100%}.ui.menu .item>.label:not(.floating){margin-left:1em;padding:.3em .78571429em}.ui.vertical.menu .item>.label{margin-top:-.15em;margin-bottom:-.15em;padding:.3em .78571429em}.ui.menu .item>.floating.label{padding:.3em .78571429em}.ui.menu .item>.label{background:#999;color:#fff}.ui.menu .item>.image.label img{margin:-.2833em .8em -.2833em -.8em;height:1.5666em}.ui.menu .item>img:not(.ui){display:inline-block;vertical-align:middle;margin:-.3em 0;width:2.5em}.ui.vertical.menu .item>img:not(.ui):only-child{display:block;max-width:100%;width:auto}.ui.menu .list .item:before{background:0 0!important}.ui.vertical.sidebar.menu>.item:first-child:before{display:block!important}.ui.vertical.sidebar.menu>.item::before{top:auto;bottom:0}@media only screen and (max-width:767.98px){.ui.menu>.ui.container{width:100%!important;margin-left:0!important;margin-right:0!important}}@media only screen and (min-width:768px){.ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless)>.container>.item:not(.right):not(.borderless):first-child{border-left:1px solid rgba(34,36,38,.1)}.ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless)>.container>.right.item:not(.borderless):last-child,.ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless)>.container>.right.menu>.item:not(.borderless):last-child{border-right:1px solid rgba(34,36,38,.1)}}.ui.link.menu .item:hover,.ui.menu .dropdown.item:hover,.ui.menu .link.item:hover,.ui.menu a.item:hover{cursor:pointer;background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.link.menu .item:active,.ui.menu .link.item:active,.ui.menu a.item:active{background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.menu .active.item{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);font-weight:400;-webkit-box-shadow:none;box-shadow:none}.ui.menu .active.item>i.icon{opacity:1}.ui.menu .active.item:hover,.ui.vertical.menu .active.item:hover{background-color:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.ui.menu .item.disabled{cursor:default;background-color:transparent;color:rgba(40,40,40,.3);pointer-events:none}.ui.menu:not(.vertical) .left.item,.ui.menu:not(.vertical) .left.menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin-right:auto!important}.ui.menu:not(.vertical) .right.item,.ui.menu:not(.vertical) .right.menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin-left:auto!important}.ui.menu:not(.vertical) :not(.dropdown)>.left.menu,.ui.menu:not(.vertical) :not(.dropdown)>.right.menu{display:inherit}.ui.menu:not(.vertical) .center.item,.ui.menu:not(.vertical) .center.menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin-left:auto!important;margin-right:auto!important}.ui.menu .right.item::before,.ui.menu .right.menu>.item::before{right:auto;left:0}.ui.menu .center.item:last-child::before,.ui.menu .center.menu>.item:last-child::before{display:none}.ui.vertical.menu{display:block;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.ui.vertical.menu .item{display:block;background:0 0;border-top:none;border-right:none}.ui.vertical.menu>.item:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.menu>.item:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.menu .item>.label{float:right;text-align:center}.ui.vertical.menu .item>i.icon,.ui.vertical.menu .item>i.icons{width:1.18em;float:right;margin:0 0 0 .5em}.ui.vertical.menu .item>.label+i.icon{float:none;margin:0 .5em 0 0}.ui.vertical.menu .item:before{position:absolute;content:'';top:0;left:0;width:100%;height:1px;background:rgba(34,36,38,.1)}.ui.vertical.menu .item:first-child:before{display:none!important}.ui.vertical.menu .item>.menu{margin:.5em -1.14285714em 0}.ui.vertical.menu .menu .item{background:0 0;padding:.5em 1.33333333em;font-size:.85714286em;color:rgba(0,0,0,.5)}.ui.vertical.menu .item .menu .link.item:hover,.ui.vertical.menu .item .menu a.item:hover{color:rgba(0,0,0,.85)}.ui.vertical.menu .menu .item:before{display:none}.ui.vertical.menu .active.item{background:rgba(0,0,0,.05);border-radius:0;-webkit-box-shadow:none;box-shadow:none}.ui.vertical.menu>.active.item:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.menu>.active.item:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.menu>.active.item:only-child{border-radius:.28571429rem}.ui.vertical.menu .active.item .menu .active.item{border-left:none}.ui.vertical.menu .item .menu .active.item{background-color:transparent;font-weight:700;color:rgba(0,0,0,.95)}.ui.tabular.menu{border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border:none;background:none transparent;border-bottom:1px solid #d4d4d5}.ui.tabular.fluid.menu{width:calc(100% + 2px)!important}.ui.tabular.menu .item{background:0 0;border-bottom:none;border-left:1px solid transparent;border-right:1px solid transparent;border-top:2px solid transparent;padding:.92857143em 1.42857143em;color:rgba(0,0,0,.87)}.ui.tabular.menu .item:before{display:none}.ui.tabular.menu .item:hover{background-color:transparent;color:rgba(0,0,0,.8)}.ui.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-top-width:1px;border-color:#d4d4d5;font-weight:700;margin-bottom:-1px;-webkit-box-shadow:none;box-shadow:none;border-radius:.28571429rem .28571429rem 0 0!important}.ui.tabular.menu+.attached:not(.top).segment,.ui.tabular.menu+.attached:not(.top).segment+.attached:not(.top).segment{border-top:none;margin-left:0;margin-top:0;margin-right:0;width:100%}.top.attached.segment+.ui.bottom.tabular.menu{position:relative;width:calc(100% + 2px);left:-1px}.ui.bottom.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:none;border-top:1px solid #d4d4d5}.ui.bottom.tabular.menu .item{background:0 0;border-left:1px solid transparent;border-right:1px solid transparent;border-bottom:1px solid transparent;border-top:none}.ui.bottom.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:-1px 0 0 0;border-radius:0 0 .28571429rem .28571429rem!important}.ui.vertical.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:none;border-right:1px solid #d4d4d5}.ui.vertical.tabular.menu .item{background:0 0;border-left:1px solid transparent;border-bottom:1px solid transparent;border-top:1px solid transparent;border-right:none}.ui.vertical.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:0 -1px 0 0;border-radius:.28571429rem 0 0 .28571429rem!important}.ui.vertical.right.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:none;border-right:none;border-left:1px solid #d4d4d5}.ui.vertical.right.tabular.menu .item{background:0 0;border-right:1px solid transparent;border-bottom:1px solid transparent;border-top:1px solid transparent;border-left:none}.ui.vertical.right.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:0 0 0 -1px;border-radius:0 .28571429rem .28571429rem 0!important}.ui.tabular.menu .active.dropdown.item{margin-bottom:0;border-left:1px solid transparent;border-right:1px solid transparent;border-top:2px solid transparent;border-bottom:none}.ui.pagination.menu{margin:0;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.ui.pagination.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.compact.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.pagination.menu .item:last-child:before{display:none}.ui.pagination.menu .item{min-width:3em;text-align:center}.ui.pagination.menu .icon.item i.icon{vertical-align:top}.ui.pagination.menu .active.item{border-top:none;padding-top:.92857143em;background-color:rgba(0,0,0,.05);color:rgba(0,0,0,.95);-webkit-box-shadow:none;box-shadow:none}.ui.secondary.menu{background:0 0;margin-left:-.35714286em;margin-right:-.35714286em;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none}.ui.secondary.menu .item{-ms-flex-item-align:center;align-self:center;-webkit-box-shadow:none;box-shadow:none;border:none;padding:.78571429em .92857143em;margin:0 .35714286em;background:0 0;-webkit-transition:color .1s ease;transition:color .1s ease;border-radius:.28571429rem}.ui.secondary.menu .item:before{display:none!important}.ui.secondary.menu .header.item{border-radius:0;border-right:none;background:none transparent}.ui.secondary.menu .item>img:not(.ui){margin:0}.ui.secondary.menu .dropdown.item:hover,.ui.secondary.menu .link.item:hover,.ui.secondary.menu a.item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.secondary.menu .active.item{-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);border-radius:.28571429rem}.ui.secondary.menu .active.item:hover{-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.secondary.inverted.menu .link.item:not(.disabled),.ui.secondary.inverted.menu a.item:not(.disabled){color:rgba(255,255,255,.7)}.ui.secondary.inverted.menu .dropdown.item:hover,.ui.secondary.inverted.menu .link.item:hover,.ui.secondary.inverted.menu a.item:hover{background:rgba(255,255,255,.08);color:#fff}.ui.secondary.inverted.menu .active.item{background:rgba(255,255,255,.15);color:#fff}.ui.secondary.item.menu{margin-left:0;margin-right:0}.ui.secondary.item.menu .item:last-child{margin-right:0}.ui.secondary.attached.menu{-webkit-box-shadow:none;box-shadow:none}.ui.vertical.secondary.menu .item:not(.dropdown)>.menu{margin:0 -.92857143em}.ui.vertical.secondary.menu .item:not(.dropdown)>.menu>.item{margin:0;padding:.5em 1.33333333em}.ui.secondary.vertical.menu>.item{border:none;margin:0 0 .35714286em;border-radius:.28571429rem!important}.ui.secondary.vertical.menu>.header.item{border-radius:0}.ui.vertical.secondary.menu .item>.menu .item{background-color:transparent}.ui.secondary.inverted.menu{background-color:transparent}.ui.secondary.pointing.menu{margin-left:0;margin-right:0;border-bottom:2px solid rgba(34,36,38,.15)}.ui.secondary.pointing.menu .item{border-bottom-color:transparent;border-bottom-style:solid;border-radius:0;-ms-flex-item-align:end;align-self:flex-end;margin:0 0 -2px;padding:.85714286em 1.14285714em;border-bottom-width:2px;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.secondary.pointing.menu .ui.dropdown .menu .item{border-bottom-width:0}.ui.secondary.pointing.menu .item>.label:not(.floating){margin-top:-.3em;margin-bottom:-.3em}.ui.secondary.pointing.menu .item>.circular.label{margin-top:-.5em;margin-bottom:-.5em}.ui.secondary.pointing.menu .header.item{color:rgba(0,0,0,.85)!important}.ui.secondary.pointing.menu .text.item{-webkit-box-shadow:none!important;box-shadow:none!important}.ui.secondary.pointing.menu .item:after{display:none}.ui.secondary.pointing.menu .dropdown.item:hover,.ui.secondary.pointing.menu .link.item:hover,.ui.secondary.pointing.menu a.item:hover{background-color:transparent;color:rgba(0,0,0,.87)}.ui.secondary.pointing.menu .dropdown.item:active,.ui.secondary.pointing.menu .link.item:active,.ui.secondary.pointing.menu a.item:active{background-color:transparent;border-color:rgba(34,36,38,.15)}.ui.secondary.pointing.menu .active.item{background-color:transparent;-webkit-box-shadow:none;box-shadow:none;border-color:currentColor;font-weight:700;color:rgba(0,0,0,.95)}.ui.secondary.pointing.menu .active.item:hover{border-color:currentColor;color:rgba(0,0,0,.95)}.ui.secondary.pointing.menu .active.dropdown.item{border-color:transparent}.ui.secondary.vertical.pointing.menu{border-bottom-width:0;border-right-width:2px;border-right-style:solid;border-right-color:rgba(34,36,38,.15)}.ui.secondary.vertical.pointing.menu .item{border-bottom:none;border-right-style:solid;border-right-color:transparent;border-radius:0!important;margin:0 -2px 0 0;border-right-width:2px}.ui.secondary.vertical.pointing.menu .active.item{border-color:currentColor}.ui.secondary.inverted.pointing.menu{border-color:rgba(255,255,255,.1)}.ui.secondary.inverted.pointing.menu .item:not(.disabled){color:rgba(255,255,255,.9)}.ui.secondary.inverted.pointing.menu .header.item{color:#fff!important}.ui.secondary.inverted.pointing.menu .link.item:hover,.ui.secondary.inverted.pointing.menu a.item:hover{color:#fff}.ui.ui.secondary.inverted.pointing.menu .active.item{border-color:#fff;color:#fff;background-color:transparent}.ui.text.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none;box-shadow:none;border:none;margin:1em -.5em}.ui.text.menu .item{border-radius:0;-webkit-box-shadow:none;box-shadow:none;-ms-flex-item-align:center;align-self:center;margin:0 0;padding:.35714286em .5em;font-weight:400;color:rgba(0,0,0,.6);-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.text.menu .item:before,.ui.text.menu .menu .item:before{display:none!important}.ui.text.menu .header.item{background-color:transparent;opacity:1;color:rgba(0,0,0,.85);font-size:.92857143em;text-transform:uppercase;font-weight:700}.ui.text.menu .item>img:not(.ui){margin:0}.ui.text.item.menu .item{margin:0}.ui.vertical.text.menu{margin:1em 0}.ui.vertical.text.menu:first-child{margin-top:0}.ui.vertical.text.menu:last-child{margin-bottom:0}.ui.vertical.text.menu .item{margin:.57142857em 0;padding-left:0;padding-right:0}.ui.vertical.text.menu .item>i.icon{float:none;margin:0 .35714286em 0 0}.ui.vertical.text.menu .header.item{margin:.57142857em 0 .71428571em}.ui.vertical.text.menu .item:not(.dropdown)>.menu{margin:0}.ui.vertical.text.menu .item:not(.dropdown)>.menu>.item{margin:0;padding:.5em 0}.ui.text.menu .item:hover{opacity:1;background-color:transparent}.ui.text.menu .active.item{background-color:transparent;border:none;-webkit-box-shadow:none;box-shadow:none;font-weight:400;color:rgba(0,0,0,.95)}.ui.text.menu .active.item:hover{background-color:transparent}.ui.text.pointing.menu .active.item:after{-webkit-box-shadow:none;box-shadow:none}.ui.text.attached.menu{-webkit-box-shadow:none;box-shadow:none}.ui.inverted.text.menu,.ui.inverted.text.menu .active.item,.ui.inverted.text.menu .item,.ui.inverted.text.menu .item:hover{background-color:transparent}.ui.fluid.text.menu{margin-left:0;margin-right:0}.ui.vertical.icon.menu{display:inline-block;width:auto}.ui.icon.menu .item{height:auto;text-align:center;color:#1b1c1d}.ui.icon.menu .item>.icon:not(.dropdown){margin:0;opacity:1}.ui.icon.menu .icon:before{opacity:1}.ui.menu .icon.item>.icon{width:auto;margin:0 auto}.ui.vertical.icon.menu .item>.icon:not(.dropdown){display:block;opacity:1;margin:0 auto;float:none}.ui.inverted.icon.menu .item{color:#fff}.ui.labeled.icon.menu{text-align:center}.ui.labeled.icon.menu .item{min-width:6em;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.labeled.icon.menu>.item>.icon:not(.dropdown){height:1em;display:block;font-size:1.71428571em!important;margin:0 auto .5rem!important}.ui.fluid.labeled.icon.menu>.item{min-width:0}@media only screen and (max-width:767.98px){.ui.stackable.menu{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.stackable.menu .item{width:100%!important}.ui.stackable.menu .item:before{position:absolute;content:'';top:auto;bottom:0;left:0;width:100%;height:1px;background:rgba(34,36,38,.1)}.ui.stackable.menu .left.item,.ui.stackable.menu .left.menu{margin-right:0!important}.ui.stackable.menu .right.item,.ui.stackable.menu .right.menu{margin-left:0!important}.ui.stackable.menu .center.item,.ui.stackable.menu .center.menu{margin-left:0!important;margin-right:0!important}.ui.stackable.menu .center.menu,.ui.stackable.menu .left.menu,.ui.stackable.menu .right.menu{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.ui.ui.menu .primary.active.item,.ui.ui.primary.menu .active.item,.ui.ui.primary.menu .active.item:hover{color:#2185d0}.ui.ui.menu .red.active.item,.ui.ui.red.menu .active.item,.ui.ui.red.menu .active.item:hover{color:#db2828}.ui.ui.menu .orange.active.item,.ui.ui.orange.menu .active.item,.ui.ui.orange.menu .active.item:hover{color:#f2711c}.ui.ui.menu .yellow.active.item,.ui.ui.yellow.menu .active.item,.ui.ui.yellow.menu .active.item:hover{color:#fbbd08}.ui.ui.menu .olive.active.item,.ui.ui.olive.menu .active.item,.ui.ui.olive.menu .active.item:hover{color:#b5cc18}.ui.ui.green.menu .active.item,.ui.ui.green.menu .active.item:hover,.ui.ui.menu .green.active.item{color:#21ba45}.ui.ui.menu .teal.active.item,.ui.ui.teal.menu .active.item,.ui.ui.teal.menu .active.item:hover{color:#00b5ad}.ui.ui.blue.menu .active.item,.ui.ui.blue.menu .active.item:hover,.ui.ui.menu .blue.active.item{color:#2185d0}.ui.ui.menu .violet.active.item,.ui.ui.violet.menu .active.item,.ui.ui.violet.menu .active.item:hover{color:#6435c9}.ui.ui.menu .purple.active.item,.ui.ui.purple.menu .active.item,.ui.ui.purple.menu .active.item:hover{color:#a333c8}.ui.ui.menu .pink.active.item,.ui.ui.pink.menu .active.item,.ui.ui.pink.menu .active.item:hover{color:#e03997}.ui.ui.brown.menu .active.item,.ui.ui.brown.menu .active.item:hover,.ui.ui.menu .brown.active.item{color:#a5673f}.ui.ui.grey.menu .active.item,.ui.ui.grey.menu .active.item:hover,.ui.ui.menu .grey.active.item{color:#767676}.ui.ui.black.menu .active.item,.ui.ui.black.menu .active.item:hover,.ui.ui.menu .black.active.item{color:#1b1c1d}.ui.inverted.menu{border:0 solid transparent;background:#1b1c1d;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.menu .item,.ui.inverted.menu .item>a:not(.ui){background:0 0;color:rgba(255,255,255,.9)}.ui.inverted.menu .item.menu{background:0 0}.ui.inverted.menu .item:before{background:rgba(255,255,255,.08)}.ui.vertical.inverted.menu .item:before{background:rgba(255,255,255,.08)}.ui.vertical.inverted.menu .menu .item,.ui.vertical.inverted.menu .menu .item a:not(.ui){color:rgba(255,255,255,.5)}.ui.inverted.menu .header.item{margin:0;background:0 0;-webkit-box-shadow:none;box-shadow:none}.ui.ui.inverted.menu .item.disabled{color:rgba(225,225,225,.3)}.ui.inverted.menu .dropdown.item:hover,.ui.inverted.menu .link.item:hover,.ui.inverted.menu a.item:hover,.ui.link.inverted.menu .item:hover{background:rgba(255,255,255,.08);color:#fff}.ui.vertical.inverted.menu .item .menu .link.item:hover,.ui.vertical.inverted.menu .item .menu a.item:hover{background:0 0;color:#fff}.ui.inverted.menu .link.item:active,.ui.inverted.menu a.item:active{background:rgba(255,255,255,.08);color:#fff}.ui.inverted.menu .active.item{background:#3d3e3f;color:#fff!important}.ui.inverted.vertical.menu .item .menu .active.item{background:0 0;color:#fff}.ui.inverted.pointing.menu .active.item:after{background:#3d3e3f;margin:0!important;-webkit-box-shadow:none!important;box-shadow:none!important;border:none!important}.ui.inverted.menu .active.item:hover{background:#3d3e3f;color:#fff!important}.ui.inverted.pointing.menu .active.item:hover:after{background:#3d3e3f}.ui.floated.menu{float:left;margin:0 .5rem 0 0}.ui.floated.menu .item:last-child:before{display:none}.ui.right.floated.menu{float:right;margin:0 0 0 .5rem}.ui.ui.inverted.menu .primary.active.item,.ui.ui.inverted.primary.menu{background-color:#2185d0}.ui.inverted.primary.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.primary.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.primary.menu .active.item{background-color:#1678c2}.ui.ui.inverted.menu .red.active.item,.ui.ui.inverted.red.menu{background-color:#db2828}.ui.inverted.red.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.red.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.red.menu .active.item{background-color:#d01919}.ui.ui.inverted.menu .orange.active.item,.ui.ui.inverted.orange.menu{background-color:#f2711c}.ui.inverted.orange.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.orange.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.orange.menu .active.item{background-color:#f26202}.ui.ui.inverted.menu .yellow.active.item,.ui.ui.inverted.yellow.menu{background-color:#fbbd08}.ui.inverted.yellow.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.yellow.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.yellow.menu .active.item{background-color:#eaae00}.ui.ui.inverted.menu .olive.active.item,.ui.ui.inverted.olive.menu{background-color:#b5cc18}.ui.inverted.olive.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.olive.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.olive.menu .active.item{background-color:#a7bd0d}.ui.ui.inverted.green.menu,.ui.ui.inverted.menu .green.active.item{background-color:#21ba45}.ui.inverted.green.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.green.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.green.menu .active.item{background-color:#16ab39}.ui.ui.inverted.menu .teal.active.item,.ui.ui.inverted.teal.menu{background-color:#00b5ad}.ui.inverted.teal.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.teal.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.teal.menu .active.item{background-color:#009c95}.ui.ui.inverted.blue.menu,.ui.ui.inverted.menu .blue.active.item{background-color:#2185d0}.ui.inverted.blue.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.blue.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.blue.menu .active.item{background-color:#1678c2}.ui.ui.inverted.menu .violet.active.item,.ui.ui.inverted.violet.menu{background-color:#6435c9}.ui.inverted.violet.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.violet.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.violet.menu .active.item{background-color:#5829bb}.ui.ui.inverted.menu .purple.active.item,.ui.ui.inverted.purple.menu{background-color:#a333c8}.ui.inverted.purple.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.purple.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.purple.menu .active.item{background-color:#9627ba}.ui.ui.inverted.menu .pink.active.item,.ui.ui.inverted.pink.menu{background-color:#e03997}.ui.inverted.pink.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.pink.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.pink.menu .active.item{background-color:#e61a8d}.ui.ui.inverted.brown.menu,.ui.ui.inverted.menu .brown.active.item{background-color:#a5673f}.ui.inverted.brown.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.brown.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.brown.menu .active.item{background-color:#975b33}.ui.ui.inverted.grey.menu,.ui.ui.inverted.menu .grey.active.item{background-color:#767676}.ui.inverted.grey.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.grey.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.grey.menu .active.item{background-color:#838383}.ui.ui.inverted.black.menu,.ui.ui.inverted.menu .black.active.item{background-color:#1b1c1d}.ui.inverted.black.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.black.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.black.menu .active.item{background-color:#27292a}.ui.ui.ui.inverted.pointing.menu .active.item:after{background-color:inherit}.ui.fitted.menu .item,.ui.fitted.menu .item .menu .item,.ui.menu .fitted.item{padding:0}.ui.horizontally.fitted.menu .item,.ui.horizontally.fitted.menu .item .menu .item,.ui.menu .horizontally.fitted.item{padding-top:.92857143em;padding-bottom:.92857143em}.ui.menu .vertically.fitted.item,.ui.vertically.fitted.menu .item,.ui.vertically.fitted.menu .item .menu .item{padding-left:1.14285714em;padding-right:1.14285714em}.ui.borderless.menu .item .menu .item:before,.ui.borderless.menu .item:before,.ui.menu .borderless.item:before{background:0 0!important}.ui.compact.menu{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin:0;vertical-align:middle}.ui.compact.vertical.menu{display:-ms-inline-flexbox!important;display:inline-block}.ui.compact.menu:not(.secondary) .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.compact.menu .item:last-child:before{display:none}.ui.compact.vertical.menu{width:auto!important}.ui.compact.vertical.menu .item:last-child::before{display:block}.ui.menu.fluid,.ui.vertical.menu.fluid{width:100%!important}.ui.item.menu,.ui.item.menu .item{width:100%;padding-left:0!important;padding-right:0!important;margin-left:0!important;margin-right:0!important;text-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.attached.item.menu:not(.tabular){margin:0 -1px!important}.ui.item.menu .item:last-child:before{display:none}.ui.menu.two.item .item{width:50%}.ui.menu.three.item .item{width:33.333%}.ui.menu.four.item .item{width:25%}.ui.menu.five.item .item{width:20%}.ui.menu.six.item .item{width:16.666%}.ui.menu.seven.item .item{width:14.285%}.ui.menu.eight.item .item{width:12.5%}.ui.menu.nine.item .item{width:11.11%}.ui.menu.ten.item .item{width:10%}.ui.menu.eleven.item .item{width:9.09%}.ui.menu.twelve.item .item{width:8.333%}.ui.menu.fixed{position:fixed;z-index:101;margin:0;width:100%}.ui.menu.fixed,.ui.menu.fixed .item:first-child,.ui.menu.fixed .item:last-child{border-radius:0!important}.ui.fixed.menu,.ui[class*="top fixed"].menu{top:0;left:0;right:auto;bottom:auto}.ui[class*="top fixed"].menu{border-top:none;border-left:none;border-right:none}.ui[class*="right fixed"].menu{border-top:none;border-bottom:none;border-right:none;top:0;right:0;left:auto;bottom:auto;width:auto;height:100%}.ui[class*="bottom fixed"].menu{border-bottom:none;border-left:none;border-right:none;bottom:0;left:0;top:auto;right:auto}.ui[class*="left fixed"].menu{border-top:none;border-bottom:none;border-left:none;top:0;left:0;right:auto;bottom:auto;width:auto;height:100%}.ui.fixed.menu+.ui.grid{padding-top:2.75rem}.ui.pointing.menu .item:after{visibility:hidden;position:absolute;content:'';top:100%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);background:0 0;margin:.5px 0 0;width:.57142857em;height:.57142857em;border:none;border-bottom:1px solid #d4d4d5;border-right:1px solid #d4d4d5;z-index:2;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.vertical.pointing.menu .item:after{position:absolute;top:50%;right:0;bottom:auto;left:auto;-webkit-transform:translateX(50%) translateY(-50%) rotate(45deg);transform:translateX(50%) translateY(-50%) rotate(45deg);margin:0 -.5px 0 0;border:none;border-top:1px solid #d4d4d5;border-right:1px solid #d4d4d5}.ui.pointing.menu .ui.dropdown .menu .item:after,.ui.vertical.pointing.menu .ui.dropdown .menu .item:after{display:none}.ui.pointing.menu .active.item:after{visibility:visible}.ui.pointing.menu .active.dropdown.item:after{visibility:hidden}.ui.pointing.menu .active.item .menu .active.item:after,.ui.pointing.menu .dropdown.active.item:after{display:none}.ui.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.pointing.menu .active.item:after{background-color:#f2f2f2}.ui.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .active.item:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .menu .active.item:after{background-color:#fff}.ui.inverted.pointing.menu .primary.active.item:after{background-color:#2185d0}.ui.inverted.pointing.menu .secondary.active.item:after{background-color:#1b1c1d}.ui.inverted.pointing.menu .red.active.item:after{background-color:#db2828}.ui.inverted.pointing.menu .orange.active.item:after{background-color:#f2711c}.ui.inverted.pointing.menu .yellow.active.item:after{background-color:#fbbd08}.ui.inverted.pointing.menu .olive.active.item:after{background-color:#b5cc18}.ui.inverted.pointing.menu .green.active.item:after{background-color:#21ba45}.ui.inverted.pointing.menu .teal.active.item:after{background-color:#00b5ad}.ui.inverted.pointing.menu .blue.active.item:after{background-color:#2185d0}.ui.inverted.pointing.menu .violet.active.item:after{background-color:#6435c9}.ui.inverted.pointing.menu .purple.active.item:after{background-color:#a333c8}.ui.inverted.pointing.menu .pink.active.item:after{background-color:#e03997}.ui.inverted.pointing.menu .brown.active.item:after{background-color:#a5673f}.ui.inverted.pointing.menu .grey.active.item:after{background-color:#767676}.ui.inverted.pointing.menu .black.active.item:after{background-color:#1b1c1d}.ui.attached.menu{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% + 2px);max-width:calc(100% + 2px);-webkit-box-shadow:none;box-shadow:none}.ui.attached+.ui.attached.menu:not(.top){border-top:none}.ui[class*="top attached"].menu{bottom:0;margin-bottom:0;top:0;margin-top:1rem;border-radius:.28571429rem .28571429rem 0 0}.ui.menu[class*="top attached"]:first-child{margin-top:0}.ui[class*="bottom attached"].menu{bottom:0;margin-top:0;top:0;margin-bottom:1rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui[class*="bottom attached"].menu:last-child{margin-bottom:0}.ui.top.attached.menu>.item:first-child{border-radius:.28571429rem 0 0 0}.ui.bottom.attached.menu>.item:first-child{border-radius:0 0 0 .28571429rem}.ui.attached.menu:not(.tabular){border:1px solid #d4d4d5}.ui.attached.inverted.menu{border:none}.ui.attached.tabular.menu{margin-left:0;margin-right:0;width:100%}.ui.menu{font-size:1rem}.ui.vertical.menu{width:15rem}.ui.mini.menu,.ui.mini.menu .dropdown,.ui.mini.menu .dropdown .menu>.item{font-size:.78571429rem}.ui.mini.vertical.menu:not(.icon){width:9rem}.ui.tiny.menu,.ui.tiny.menu .dropdown,.ui.tiny.menu .dropdown .menu>.item{font-size:.85714286rem}.ui.tiny.vertical.menu:not(.icon){width:11rem}.ui.small.menu,.ui.small.menu .dropdown,.ui.small.menu .dropdown .menu>.item{font-size:.92857143rem}.ui.small.vertical.menu:not(.icon){width:13rem}.ui.large.menu,.ui.large.menu .dropdown,.ui.large.menu .dropdown .menu>.item{font-size:1.07142857rem}.ui.large.vertical.menu:not(.icon){width:18rem}.ui.big.menu,.ui.big.menu .dropdown,.ui.big.menu .dropdown .menu>.item{font-size:1.14285714rem}.ui.big.vertical.menu:not(.icon){width:20rem}.ui.huge.menu,.ui.huge.menu .dropdown,.ui.huge.menu .dropdown .menu>.item{font-size:1.21428571rem}.ui.huge.vertical.menu:not(.icon){width:22rem}.ui.massive.menu,.ui.massive.menu .dropdown,.ui.massive.menu .dropdown .menu>.item{font-size:1.28571429rem}.ui.massive.vertical.menu:not(.icon){width:25rem}.ui.menu .ui.inverted.inverted.dropdown.item .menu{background:#1b1c1d;-webkit-box-shadow:none;box-shadow:none}.ui.menu .ui.inverted.dropdown .menu>.item{color:rgba(255,255,255,.8)!important}.ui.menu .ui.inverted.dropdown .menu>.active.item{background:0 0!important;color:rgba(255,255,255,.8)!important}.ui.menu .ui.inverted.dropdown .menu>.item:hover{background:rgba(255,255,255,.08)!important;color:rgba(255,255,255,.8)!important}.ui.menu .ui.inverted.dropdown .menu>.selected.item{background:rgba(255,255,255,.15)!important;color:rgba(255,255,255,.8)!important}.ui.vertical.menu .inverted.dropdown.item .menu{-webkit-box-shadow:none;box-shadow:none} +/* + * # Fomantic-UI - Button + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */ +.ui.button{cursor:pointer;display:inline-block;min-height:1em;outline:0;border:none;vertical-align:baseline;background:#e0e1e2 none;color:rgba(0,0,0,.6);font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;margin:0 .25em 0 0;padding:.78571429em 1.5em .78571429em;text-transform:none;text-shadow:none;font-weight:700;line-height:1em;font-style:normal;text-align:center;text-decoration:none;border-radius:.28571429rem;-webkit-box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:opacity .1s ease,background-color .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease,-webkit-box-shadow .1s ease;will-change:auto;-webkit-tap-highlight-color:transparent}.ui.button:hover{background-color:#cacbcd;background-image:none;-webkit-box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;color:rgba(0,0,0,.8)}.ui.button:hover .icon{opacity:.85}.ui.button:focus{background-color:#cacbcd;color:rgba(0,0,0,.8);background-image:none;-webkit-box-shadow:'';box-shadow:''}.ui.button:focus .icon{opacity:.85}.ui.active.button:active,.ui.button:active{background-color:#babbbc;background-image:'';color:rgba(0,0,0,.9);-webkit-box-shadow:0 0 0 1px transparent inset,none;box-shadow:0 0 0 1px transparent inset,none}.ui.active.button{background-color:#c0c1c2;background-image:none;-webkit-box-shadow:0 0 0 1px transparent inset;box-shadow:0 0 0 1px transparent inset;color:rgba(0,0,0,.95)}.ui.active.button:hover{background-color:#c0c1c2;background-image:none;color:rgba(0,0,0,.95)}.ui.active.button:active{background-color:#c0c1c2;background-image:none}.ui.loading.loading.loading.loading.loading.loading.button{position:relative;cursor:default;text-shadow:none!important;color:transparent;opacity:1;pointer-events:auto;-webkit-transition:all 0s linear,opacity .1s ease;transition:all 0s linear,opacity .1s ease}.ui.loading.button:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.15)}.ui.loading.button:after{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;-webkit-animation:loader .6s infinite linear;animation:loader .6s infinite linear;border:.2em solid currentColor;color:#fff;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}.ui.labeled.icon.loading.button .icon{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.ui.basic.loading.button:not(.inverted):before{border-color:rgba(0,0,0,.1)}.ui.basic.loading.button:not(.inverted):after{border-color:#767676}.ui.button:disabled,.ui.buttons .disabled.button:not(.basic),.ui.disabled.active.button,.ui.disabled.button,.ui.disabled.button:hover{cursor:default;opacity:.45!important;background-image:none;-webkit-box-shadow:none;box-shadow:none;pointer-events:none!important}.ui.basic.buttons .ui.disabled.button{border-color:rgba(34,36,38,.5)}.ui.animated.button{position:relative;overflow:hidden;padding-right:0!important;vertical-align:middle;z-index:1}.ui.animated.button .content{will-change:transform,opacity}.ui.animated.button .visible.content{position:relative;margin-right:1.5em}.ui.animated.button .hidden.content{position:absolute;width:100%}.ui.animated.button .hidden.content,.ui.animated.button .visible.content{-webkit-transition:right .3s ease 0s;transition:right .3s ease 0s}.ui.animated.button .visible.content{left:auto;right:0}.ui.animated.button .hidden.content{top:50%;left:auto;right:-100%;margin-top:-.5em}.ui.animated.button:focus .visible.content,.ui.animated.button:hover .visible.content{left:auto;right:200%}.ui.animated.button:focus .hidden.content,.ui.animated.button:hover .hidden.content{left:auto;right:0}.ui.vertical.animated.button .hidden.content,.ui.vertical.animated.button .visible.content{-webkit-transition:top .3s ease,-webkit-transform .3s ease;transition:top .3s ease,-webkit-transform .3s ease;transition:top .3s ease,transform .3s ease;transition:top .3s ease,transform .3s ease,-webkit-transform .3s ease}.ui.vertical.animated.button .visible.content{-webkit-transform:translateY(0);transform:translateY(0);right:auto}.ui.vertical.animated.button .hidden.content{top:-50%;left:0;right:auto}.ui.vertical.animated.button:focus .visible.content,.ui.vertical.animated.button:hover .visible.content{-webkit-transform:translateY(200%);transform:translateY(200%);right:auto}.ui.vertical.animated.button:focus .hidden.content,.ui.vertical.animated.button:hover .hidden.content{top:50%;right:auto}.ui.fade.animated.button .hidden.content,.ui.fade.animated.button .visible.content{-webkit-transition:opacity .3s ease,-webkit-transform .3s ease;transition:opacity .3s ease,-webkit-transform .3s ease;transition:opacity .3s ease,transform .3s ease;transition:opacity .3s ease,transform .3s ease,-webkit-transform .3s ease}.ui.fade.animated.button .visible.content{left:auto;right:auto;opacity:1;-webkit-transform:scale(1);transform:scale(1)}.ui.fade.animated.button .hidden.content{opacity:0;left:0;right:auto;-webkit-transform:scale(1.5);transform:scale(1.5)}.ui.fade.animated.button:focus .visible.content,.ui.fade.animated.button:hover .visible.content{left:auto;right:auto;opacity:0;-webkit-transform:scale(.75);transform:scale(.75)}.ui.fade.animated.button:focus .hidden.content,.ui.fade.animated.button:hover .hidden.content{left:0;right:auto;opacity:1;-webkit-transform:scale(1);transform:scale(1)}.ui.inverted.button{-webkit-box-shadow:0 0 0 2px #fff inset;box-shadow:0 0 0 2px #fff inset;background:transparent none;color:#fff;text-shadow:none!important}.ui.inverted.buttons .button{margin:0 0 0 -2px}.ui.inverted.buttons .button:first-child{margin-left:0}.ui.inverted.vertical.buttons .button{margin:0 0 -2px 0}.ui.inverted.vertical.buttons .button:first-child{margin-top:0}.ui.inverted.button:hover{background:#fff;-webkit-box-shadow:0 0 0 2px #fff inset;box-shadow:0 0 0 2px #fff inset;color:rgba(0,0,0,.8)}.ui.inverted.button.active,.ui.inverted.button:focus{background:#fff;-webkit-box-shadow:0 0 0 2px #fff inset;box-shadow:0 0 0 2px #fff inset;color:rgba(0,0,0,.8)}.ui.inverted.button.active:focus{background:#dcddde;-webkit-box-shadow:0 0 0 2px #dcddde inset;box-shadow:0 0 0 2px #dcddde inset;color:rgba(0,0,0,.8)}.ui.labeled.button:not(.icon){display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;background:0 0;padding:0!important;border:none;-webkit-box-shadow:none;box-shadow:none}.ui.labeled.button>.button{margin:0}.ui.labeled.button>.label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0 0 0 -1px!important;font-size:1em;padding:'';border-color:rgba(34,36,38,.15)}.ui.labeled.button>.tag.label:before{width:1.85em;height:1.85em}.ui.labeled.button:not([class*="left labeled"])>.button{border-top-right-radius:0;border-bottom-right-radius:0}.ui.labeled.button:not([class*="left labeled"])>.label{border-top-left-radius:0;border-bottom-left-radius:0}.ui[class*="left labeled"].button>.button{border-top-left-radius:0;border-bottom-left-radius:0}.ui[class*="left labeled"].button>.label{border-top-right-radius:0;border-bottom-right-radius:0}.ui.facebook.button{background-color:#3b5998;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.facebook.button:hover{background-color:#304d8a;color:#fff;text-shadow:none}.ui.facebook.button:active{background-color:#2d4373;color:#fff;text-shadow:none}.ui.twitter.button{background-color:#1da1f2;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.twitter.button:hover{background-color:#0298f3;color:#fff;text-shadow:none}.ui.twitter.button:active{background-color:#0c85d0;color:#fff;text-shadow:none}.ui.google.plus.button{background-color:#dd4b39;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.google.plus.button:hover{background-color:#e0321c;color:#fff;text-shadow:none}.ui.google.plus.button:active{background-color:#c23321;color:#fff;text-shadow:none}.ui.linkedin.button{background-color:#0077b5;color:#fff;text-shadow:none}.ui.linkedin.button:hover{background-color:#00669c;color:#fff;text-shadow:none}.ui.linkedin.button:active{background-color:#005582;color:#fff;text-shadow:none}.ui.youtube.button{background-color:red;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.youtube.button:hover{background-color:#e60000;color:#fff;text-shadow:none}.ui.youtube.button:active{background-color:#c00;color:#fff;text-shadow:none}.ui.instagram.button{background-color:#49769c;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.instagram.button:hover{background-color:#3d698e;color:#fff;text-shadow:none}.ui.instagram.button:active{background-color:#395c79;color:#fff;text-shadow:none}.ui.pinterest.button{background-color:#bd081c;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.pinterest.button:hover{background-color:#ac0013;color:#fff;text-shadow:none}.ui.pinterest.button:active{background-color:#8c0615;color:#fff;text-shadow:none}.ui.vk.button{background-color:#45668e;color:#fff;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.vk.button:hover{background-color:#395980;color:#fff}.ui.vk.button:active{background-color:#344d6c;color:#fff}.ui.whatsapp.button{background-color:#25d366;color:#fff;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.whatsapp.button:hover{background-color:#19c55a;color:#fff}.ui.whatsapp.button:active{background-color:#1da851;color:#fff}.ui.telegram.button{background-color:#08c;color:#fff;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.telegram.button:hover{background-color:#0077b3;color:#fff}.ui.telegram.button:active{background-color:#069;color:#fff}.ui.button>.icon:not(.button){height:auto;opacity:.8;margin:0 .42857143em 0 -.21428571em;-webkit-transition:opacity .1s ease;transition:opacity .1s ease;vertical-align:'';color:''}.ui.button:not(.icon)>.icon:not(.button):not(.dropdown),.ui.button:not(.icon)>.icons:not(.button):not(.dropdown){margin:0 .42857143em 0 -.21428571em}.ui.button:not(.icon)>.right.icon:not(.button):not(.dropdown){margin:0 -.21428571em 0 .42857143em}.ui[class*="left floated"].button,.ui[class*="left floated"].buttons{float:left;margin-left:0;margin-right:.25em}.ui[class*="right floated"].button,.ui[class*="right floated"].buttons{float:right;margin-right:0;margin-left:.25em}.ui.compact.button,.ui.compact.buttons .button{padding:.58928571em 1.125em .58928571em}.ui.compact.icon.button,.ui.compact.icon.buttons .button{padding:.58928571em .58928571em .58928571em}.ui.compact.labeled.icon.button,.ui.compact.labeled.icon.buttons .button{padding:.58928571em 3.69642857em .58928571em}.ui.compact.labeled.icon.button>.icon,.ui.compact.labeled.icon.buttons .button>.icon{padding:.58928571em 0 .58928571em 0}.ui.button,.ui.buttons .button,.ui.buttons .or{font-size:1rem}.ui.mini.buttons .button,.ui.mini.buttons .dropdown,.ui.mini.buttons .dropdown .menu>.item,.ui.mini.buttons .or,.ui.ui.ui.ui.mini.button{font-size:.78571429rem}.ui.tiny.buttons .button,.ui.tiny.buttons .dropdown,.ui.tiny.buttons .dropdown .menu>.item,.ui.tiny.buttons .or,.ui.ui.ui.ui.tiny.button{font-size:.85714286rem}.ui.small.buttons .button,.ui.small.buttons .dropdown,.ui.small.buttons .dropdown .menu>.item,.ui.small.buttons .or,.ui.ui.ui.ui.small.button{font-size:.92857143rem}.ui.large.buttons .button,.ui.large.buttons .dropdown,.ui.large.buttons .dropdown .menu>.item,.ui.large.buttons .or,.ui.ui.ui.ui.large.button{font-size:1.14285714rem}.ui.big.buttons .button,.ui.big.buttons .dropdown,.ui.big.buttons .dropdown .menu>.item,.ui.big.buttons .or,.ui.ui.ui.ui.big.button{font-size:1.28571429rem}.ui.huge.buttons .button,.ui.huge.buttons .dropdown,.ui.huge.buttons .dropdown .menu>.item,.ui.huge.buttons .or,.ui.ui.ui.ui.huge.button{font-size:1.42857143rem}.ui.massive.buttons .button,.ui.massive.buttons .dropdown,.ui.massive.buttons .dropdown .menu>.item,.ui.massive.buttons .or,.ui.ui.ui.ui.massive.button{font-size:1.71428571rem}.ui.icon.button,.ui.icon.buttons .button{padding:.78571429em .78571429em .78571429em}.ui.icon.button>.icon,.ui.icon.buttons .button>.icon{opacity:.9;margin:0!important;vertical-align:top}.ui.basic.button,.ui.basic.buttons .button{background:transparent none;color:rgba(0,0,0,.6);font-weight:400;border-radius:.28571429rem;text-transform:none;text-shadow:none!important;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.15) inset}.ui.basic.buttons{-webkit-box-shadow:none;box-shadow:none;border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem}.ui.basic.buttons .button{border-radius:0}.ui.basic.button:hover,.ui.basic.buttons .button:hover{background:#fff;color:rgba(0,0,0,.8);-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset}.ui.basic.button:focus,.ui.basic.buttons .button:focus{background:#fff;color:rgba(0,0,0,.8);-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset}.ui.basic.button:active,.ui.basic.buttons .button:active{background:#f8f8f8;color:rgba(0,0,0,.9);-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset}.ui.basic.active.button,.ui.basic.buttons .active.button{background:rgba(0,0,0,.05);-webkit-box-shadow:'';box-shadow:'';color:rgba(0,0,0,.95)}.ui.basic.active.button:hover,.ui.basic.buttons .active.button:hover{background-color:rgba(0,0,0,.05)}.ui.basic.buttons .button:hover{-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset inset;box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset inset}.ui.basic.buttons .button:active{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset inset;box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset inset}.ui.basic.buttons .active.button{-webkit-box-shadow:'';box-shadow:''}.ui.basic.inverted.button,.ui.basic.inverted.buttons .button{background-color:transparent;color:#f9fafb;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset}.ui.basic.inverted.button:hover,.ui.basic.inverted.buttons .button:hover{color:#fff;-webkit-box-shadow:0 0 0 2px #fff inset;box-shadow:0 0 0 2px #fff inset}.ui.basic.inverted.button:focus,.ui.basic.inverted.buttons .button:focus{color:#fff;-webkit-box-shadow:0 0 0 2px #fff inset;box-shadow:0 0 0 2px #fff inset}.ui.basic.inverted.button:active,.ui.basic.inverted.buttons .button:active{background-color:rgba(255,255,255,.08);color:#fff;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.9) inset;box-shadow:0 0 0 2px rgba(255,255,255,.9) inset}.ui.basic.inverted.active.button,.ui.basic.inverted.buttons .active.button{background-color:rgba(255,255,255,.08);color:#fff;text-shadow:none;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.7) inset;box-shadow:0 0 0 2px rgba(255,255,255,.7) inset}.ui.basic.inverted.active.button:hover,.ui.basic.inverted.buttons .active.button:hover{background-color:rgba(255,255,255,.15);-webkit-box-shadow:0 0 0 2px #fff inset;box-shadow:0 0 0 2px #fff inset}.ui.basic.buttons .button{border-left:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none;box-shadow:none}.ui.basic.vertical.buttons .button{border-left:none;border-left-width:0;border-top:1px solid rgba(34,36,38,.15)}.ui.basic.vertical.buttons .button:first-child{border-top-width:0}.ui.tertiary.button{-webkit-transition:color .1s ease!important;transition:color .1s ease!important;border-radius:0;margin:.28571429em .25em .28571429em 0!important;padding:.5em!important;-webkit-box-shadow:none;box-shadow:none;color:rgba(0,0,0,.6);background:0 0}.ui.tertiary.button:hover{-webkit-box-shadow:inset 0 -.2em 0 #666;box-shadow:inset 0 -.2em 0 #666;color:#333;background:0 0}.ui.tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #666;box-shadow:inset 0 -.2em 0 #666;color:#333;background:0 0}.ui.tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #999;box-shadow:inset 0 -.2em 0 #999;border-radius:.28571429rem .28571429rem 0 0;color:#666;background:0 0}.ui.labeled.icon.button,.ui.labeled.icon.buttons .button{position:relative;padding-left:4.07142857em!important;padding-right:1.5em!important}.ui.labeled.icon.button>.icon,.ui.labeled.icon.buttons>.button>.icon{position:absolute;top:0;left:0;height:100%;line-height:1;border-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit;text-align:center;-webkit-animation:none;animation:none;padding:.78571429em 0 .78571429em 0;margin:0;width:2.57142857em;background-color:rgba(0,0,0,.05);color:'';-webkit-box-shadow:-1px 0 0 0 transparent inset;box-shadow:-1px 0 0 0 transparent inset}.ui[class*="right labeled"].icon.button{padding-right:4.07142857em!important;padding-left:1.5em!important}.ui[class*="right labeled"].icon.button>.icon{left:auto;right:0;border-radius:0;border-top-right-radius:inherit;border-bottom-right-radius:inherit;-webkit-box-shadow:1px 0 0 0 transparent inset;box-shadow:1px 0 0 0 transparent inset}.ui.labeled.icon.button>.icon:after,.ui.labeled.icon.button>.icon:before,.ui.labeled.icon.buttons>.button>.icon:after,.ui.labeled.icon.buttons>.button>.icon:before{display:block;position:relative;width:100%;top:0;text-align:center}.ui.labeled.icon.buttons .button>.icon{border-radius:0}.ui.labeled.icon.buttons .button:first-child>.icon{border-top-left-radius:.28571429rem;border-bottom-left-radius:.28571429rem}.ui.labeled.icon.buttons .button:last-child>.icon{border-top-right-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.vertical.labeled.icon.buttons .button:first-child>.icon{border-radius:0;border-top-left-radius:.28571429rem}.ui.vertical.labeled.icon.buttons .button:last-child>.icon{border-radius:0;border-bottom-left-radius:.28571429rem}.ui.labeled.icon.button>.loading.icon:before{-webkit-animation:loader 2s linear infinite;animation:loader 2s linear infinite}.ui.button.toggle.active,.ui.buttons .button.toggle.active,.ui.toggle.buttons .active.button{background-color:#21ba45;-webkit-box-shadow:none;box-shadow:none;text-shadow:none;color:#fff}.ui.button.toggle.active:hover{background-color:#16ab39;text-shadow:none;color:#fff}.ui.circular.button{border-radius:10em}.ui.circular.button>.icon{width:1em;vertical-align:baseline}.ui.buttons .or{position:relative;width:.3em;height:2.57142857em;z-index:3}.ui.buttons .or:before{position:absolute;text-align:center;border-radius:500rem;content:'or';top:50%;left:50%;background-color:#fff;text-shadow:none;margin-top:-.89285714em;margin-left:-.89285714em;width:1.78571429em;height:1.78571429em;line-height:1.78571429em;color:rgba(0,0,0,.4);font-style:normal;font-weight:700;-webkit-box-shadow:0 0 0 1px transparent inset;box-shadow:0 0 0 1px transparent inset}.ui.buttons .or[data-text]:before{content:attr(data-text)}.ui.fluid.buttons .or{width:0!important}.ui.fluid.buttons .or:after{display:none}.ui.attached.button{position:relative;display:block;margin:0;border-radius:0;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15);box-shadow:0 0 0 1px rgba(34,36,38,.15)}.ui.attached.top.button{border-radius:.28571429rem .28571429rem 0 0}.ui.attached.bottom.button{border-radius:0 0 .28571429rem .28571429rem}.ui.left.attached.button{display:inline-block;border-left:none;text-align:right;padding-right:.75em;border-radius:.28571429rem 0 0 .28571429rem}.ui.right.attached.button{display:inline-block;text-align:left;padding-left:.75em;border-radius:0 .28571429rem .28571429rem 0}.ui.attached.buttons{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;border-radius:0;width:auto!important;z-index:auto;margin-left:-1px;margin-right:-1px}.ui.attached.buttons .button{margin:0}.ui.attached.buttons .button:first-child{border-radius:0}.ui.attached.buttons .button:last-child{border-radius:0}.ui[class*="top attached"].buttons{margin-bottom:-1px;border-radius:.28571429rem .28571429rem 0 0}.ui[class*="top attached"].buttons .button:first-child{border-radius:.28571429rem 0 0 0}.ui[class*="top attached"].buttons .button:last-child{border-radius:0 .28571429rem 0 0}.ui[class*="bottom attached"].buttons{margin-top:-1px;border-radius:0 0 .28571429rem .28571429rem}.ui[class*="bottom attached"].buttons .button:first-child{border-radius:0 0 0 .28571429rem}.ui[class*="bottom attached"].buttons .button:last-child{border-radius:0 0 .28571429rem 0}.ui[class*="left attached"].buttons{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:0;margin-left:-1px;border-radius:0 .28571429rem .28571429rem 0}.ui[class*="left attached"].buttons .button:first-child{margin-left:-1px;border-radius:0 .28571429rem 0 0}.ui[class*="left attached"].buttons .button:last-child{margin-left:-1px;border-radius:0 0 .28571429rem 0}.ui[class*="right attached"].buttons{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-left:0;margin-right:-1px;border-radius:.28571429rem 0 0 .28571429rem}.ui[class*="right attached"].buttons .button:first-child{margin-left:-1px;border-radius:.28571429rem 0 0 0}.ui[class*="right attached"].buttons .button:last-child{margin-left:-1px;border-radius:0 0 0 .28571429rem}.ui.fluid.button,.ui.fluid.buttons{width:100%}.ui.fluid.button{display:block}.ui.two.buttons{width:100%}.ui.two.buttons>.button{width:50%}.ui.three.buttons{width:100%}.ui.three.buttons>.button{width:33.333%}.ui.four.buttons{width:100%}.ui.four.buttons>.button{width:25%}.ui.five.buttons{width:100%}.ui.five.buttons>.button{width:20%}.ui.six.buttons{width:100%}.ui.six.buttons>.button{width:16.666%}.ui.seven.buttons{width:100%}.ui.seven.buttons>.button{width:14.285%}.ui.eight.buttons{width:100%}.ui.eight.buttons>.button{width:12.5%}.ui.nine.buttons{width:100%}.ui.nine.buttons>.button{width:11.11%}.ui.ten.buttons{width:100%}.ui.ten.buttons>.button{width:10%}.ui.eleven.buttons{width:100%}.ui.eleven.buttons>.button{width:9.09%}.ui.twelve.buttons{width:100%}.ui.twelve.buttons>.button{width:8.3333%}.ui.fluid.vertical.buttons,.ui.fluid.vertical.buttons>.button{display:-webkit-box;display:-ms-flexbox;display:flex;width:auto;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.two.vertical.buttons>.button{height:50%}.ui.three.vertical.buttons>.button{height:33.333%}.ui.four.vertical.buttons>.button{height:25%}.ui.five.vertical.buttons>.button{height:20%}.ui.six.vertical.buttons>.button{height:16.666%}.ui.seven.vertical.buttons>.button{height:14.285%}.ui.eight.vertical.buttons>.button{height:12.5%}.ui.nine.vertical.buttons>.button{height:11.11%}.ui.ten.vertical.buttons>.button{height:10%}.ui.eleven.vertical.buttons>.button{height:9.09%}.ui.twelve.vertical.buttons>.button{height:8.3333%}.ui.primary.button,.ui.primary.buttons .button{background-color:#2185d0;color:#fff;text-shadow:none;background-image:none}.ui.primary.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.primary.button:hover,.ui.primary.buttons .button:hover{background-color:#1678c2;color:#fff;text-shadow:none}.ui.primary.button:focus,.ui.primary.buttons .button:focus{background-color:#0d71bb;color:#fff;text-shadow:none}.ui.primary.button:active,.ui.primary.buttons .button:active{background-color:#1a69a4;color:#fff;text-shadow:none}.ui.primary.active.button,.ui.primary.button .active.button:active,.ui.primary.buttons .active.button,.ui.primary.buttons .active.button:active{background-color:#1279c6;color:#fff;text-shadow:none}.ui.basic.primary.button,.ui.basic.primary.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #2185d0 inset;box-shadow:0 0 0 1px #2185d0 inset;color:#2185d0}.ui.basic.primary.button:hover,.ui.basic.primary.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #1678c2 inset;box-shadow:0 0 0 1px #1678c2 inset;color:#1678c2}.ui.basic.primary.button:focus,.ui.basic.primary.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #0d71bb inset;box-shadow:0 0 0 1px #0d71bb inset;color:#1678c2}.ui.basic.primary.active.button,.ui.basic.primary.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #1279c6 inset;box-shadow:0 0 0 1px #1279c6 inset;color:#1a69a4}.ui.basic.primary.button:active,.ui.basic.primary.buttons .button:active{-webkit-box-shadow:0 0 0 1px #1a69a4 inset;box-shadow:0 0 0 1px #1a69a4 inset;color:#1a69a4}.ui.buttons:not(.vertical)>.basic.primary.button:not(:first-child){margin-left:-1px}.ui.inverted.primary.button,.ui.inverted.primary.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #54c8ff inset;box-shadow:0 0 0 2px #54c8ff inset;color:#54c8ff}.ui.inverted.primary.button.active,.ui.inverted.primary.button:active,.ui.inverted.primary.button:focus,.ui.inverted.primary.button:hover,.ui.inverted.primary.buttons .button.active,.ui.inverted.primary.buttons .button:active,.ui.inverted.primary.buttons .button:focus,.ui.inverted.primary.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.primary.button:hover,.ui.inverted.primary.buttons .button:hover{background-color:#21b8ff}.ui.inverted.primary.button:focus,.ui.inverted.primary.buttons .button:focus{background-color:#2bbbff}.ui.inverted.primary.active.button,.ui.inverted.primary.buttons .active.button{background-color:#3ac0ff}.ui.inverted.primary.button:active,.ui.inverted.primary.buttons .button:active{background-color:#21b8ff}.ui.inverted.primary.basic.button,.ui.inverted.primary.basic.buttons .button,.ui.inverted.primary.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.primary.basic.button:hover,.ui.inverted.primary.basic.buttons .button:hover,.ui.inverted.primary.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #21b8ff inset;box-shadow:0 0 0 2px #21b8ff inset;color:#54c8ff}.ui.inverted.primary.basic.button:focus,.ui.inverted.primary.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #2bbbff inset;box-shadow:0 0 0 2px #2bbbff inset;color:#54c8ff}.ui.inverted.primary.basic.active.button,.ui.inverted.primary.basic.buttons .active.button,.ui.inverted.primary.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #3ac0ff inset;box-shadow:0 0 0 2px #3ac0ff inset;color:#54c8ff}.ui.inverted.primary.basic.button:active,.ui.inverted.primary.basic.buttons .button:active,.ui.inverted.primary.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #21b8ff inset;box-shadow:0 0 0 2px #21b8ff inset;color:#54c8ff}.ui.tertiary.primary.button,.ui.tertiary.primary.buttons .button,.ui.tertiary.primary.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#2185d0}.ui.tertiary.primary.button:hover,.ui.tertiary.primary.buttons .button:hover,.ui.tertiary.primary.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #2b75ac;box-shadow:inset 0 -.2em 0 #2b75ac;color:#2b75ac}.ui.tertiary.primary.button:focus,.ui.tertiary.primary.buttons .button:focus,.ui.tertiary.primary.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #216ea7;box-shadow:inset 0 -.2em 0 #216ea7;color:#216ea7}.ui.tertiary.primary.active.button,.ui.tertiary.primary.button:active,.ui.tertiary.primary.buttons .active.button,.ui.tertiary.primary.buttons .button:active,.ui.tertiary.primary.buttons .tertiary.active.button,.ui.tertiary.primary.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #007bd8;box-shadow:inset 0 -.2em 0 #007bd8;color:#1279c6}.ui.secondary.button,.ui.secondary.buttons .button{background-color:#1b1c1d;color:#fff;text-shadow:none;background-image:none}.ui.secondary.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.secondary.button:hover,.ui.secondary.buttons .button:hover{background-color:#27292a;color:#fff;text-shadow:none}.ui.secondary.button:focus,.ui.secondary.buttons .button:focus{background-color:#2e3032;color:#fff;text-shadow:none}.ui.secondary.button:active,.ui.secondary.buttons .button:active{background-color:#343637;color:#fff;text-shadow:none}.ui.secondary.active.button,.ui.secondary.button .active.button:active,.ui.secondary.buttons .active.button,.ui.secondary.buttons .active.button:active{background-color:#27292a;color:#fff;text-shadow:none}.ui.basic.secondary.button,.ui.basic.secondary.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #1b1c1d inset;box-shadow:0 0 0 1px #1b1c1d inset;color:#1b1c1d}.ui.basic.secondary.button:hover,.ui.basic.secondary.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #27292a inset;box-shadow:0 0 0 1px #27292a inset;color:#27292a}.ui.basic.secondary.button:focus,.ui.basic.secondary.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #2e3032 inset;box-shadow:0 0 0 1px #2e3032 inset;color:#27292a}.ui.basic.secondary.active.button,.ui.basic.secondary.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #27292a inset;box-shadow:0 0 0 1px #27292a inset;color:#343637}.ui.basic.secondary.button:active,.ui.basic.secondary.buttons .button:active{-webkit-box-shadow:0 0 0 1px #343637 inset;box-shadow:0 0 0 1px #343637 inset;color:#343637}.ui.buttons:not(.vertical)>.basic.secondary.button:not(:first-child){margin-left:-1px}.ui.inverted.secondary.button,.ui.inverted.secondary.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #545454 inset;box-shadow:0 0 0 2px #545454 inset;color:#545454}.ui.inverted.secondary.button.active,.ui.inverted.secondary.button:active,.ui.inverted.secondary.button:focus,.ui.inverted.secondary.button:hover,.ui.inverted.secondary.buttons .button.active,.ui.inverted.secondary.buttons .button:active,.ui.inverted.secondary.buttons .button:focus,.ui.inverted.secondary.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.secondary.button:hover,.ui.inverted.secondary.buttons .button:hover{background-color:#6e6e6e}.ui.inverted.secondary.button:focus,.ui.inverted.secondary.buttons .button:focus{background-color:#686868}.ui.inverted.secondary.active.button,.ui.inverted.secondary.buttons .active.button{background-color:#616161}.ui.inverted.secondary.button:active,.ui.inverted.secondary.buttons .button:active{background-color:#6e6e6e}.ui.inverted.secondary.basic.button,.ui.inverted.secondary.basic.buttons .button,.ui.inverted.secondary.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.secondary.basic.button:hover,.ui.inverted.secondary.basic.buttons .button:hover,.ui.inverted.secondary.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #6e6e6e inset;box-shadow:0 0 0 2px #6e6e6e inset;color:#545454}.ui.inverted.secondary.basic.button:focus,.ui.inverted.secondary.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #686868 inset;box-shadow:0 0 0 2px #686868 inset;color:#545454}.ui.inverted.secondary.basic.active.button,.ui.inverted.secondary.basic.buttons .active.button,.ui.inverted.secondary.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #616161 inset;box-shadow:0 0 0 2px #616161 inset;color:#545454}.ui.inverted.secondary.basic.button:active,.ui.inverted.secondary.basic.buttons .button:active,.ui.inverted.secondary.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #6e6e6e inset;box-shadow:0 0 0 2px #6e6e6e inset;color:#545454}.ui.tertiary.secondary.button,.ui.tertiary.secondary.buttons .button,.ui.tertiary.secondary.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#1b1c1d}.ui.tertiary.secondary.button:hover,.ui.tertiary.secondary.buttons .button:hover,.ui.tertiary.secondary.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #292929;box-shadow:inset 0 -.2em 0 #292929;color:#292929}.ui.tertiary.secondary.button:focus,.ui.tertiary.secondary.buttons .button:focus,.ui.tertiary.secondary.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #303030;box-shadow:inset 0 -.2em 0 #303030;color:#303030}.ui.tertiary.secondary.active.button,.ui.tertiary.secondary.button:active,.ui.tertiary.secondary.buttons .active.button,.ui.tertiary.secondary.buttons .button:active,.ui.tertiary.secondary.buttons .tertiary.active.button,.ui.tertiary.secondary.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #1f2933;box-shadow:inset 0 -.2em 0 #1f2933;color:#27292a}.ui.red.button,.ui.red.buttons .button{background-color:#db2828;color:#fff;text-shadow:none;background-image:none}.ui.red.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.red.button:hover,.ui.red.buttons .button:hover{background-color:#d01919;color:#fff;text-shadow:none}.ui.red.button:focus,.ui.red.buttons .button:focus{background-color:#ca1010;color:#fff;text-shadow:none}.ui.red.button:active,.ui.red.buttons .button:active{background-color:#b21e1e;color:#fff;text-shadow:none}.ui.red.active.button,.ui.red.button .active.button:active,.ui.red.buttons .active.button,.ui.red.buttons .active.button:active{background-color:#d41515;color:#fff;text-shadow:none}.ui.basic.red.button,.ui.basic.red.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #db2828 inset;box-shadow:0 0 0 1px #db2828 inset;color:#db2828}.ui.basic.red.button:hover,.ui.basic.red.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #d01919 inset;box-shadow:0 0 0 1px #d01919 inset;color:#d01919}.ui.basic.red.button:focus,.ui.basic.red.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #ca1010 inset;box-shadow:0 0 0 1px #ca1010 inset;color:#d01919}.ui.basic.red.active.button,.ui.basic.red.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #d41515 inset;box-shadow:0 0 0 1px #d41515 inset;color:#b21e1e}.ui.basic.red.button:active,.ui.basic.red.buttons .button:active{-webkit-box-shadow:0 0 0 1px #b21e1e inset;box-shadow:0 0 0 1px #b21e1e inset;color:#b21e1e}.ui.buttons:not(.vertical)>.basic.red.button:not(:first-child){margin-left:-1px}.ui.inverted.red.button,.ui.inverted.red.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #ff695e inset;box-shadow:0 0 0 2px #ff695e inset;color:#ff695e}.ui.inverted.red.button.active,.ui.inverted.red.button:active,.ui.inverted.red.button:focus,.ui.inverted.red.button:hover,.ui.inverted.red.buttons .button.active,.ui.inverted.red.buttons .button:active,.ui.inverted.red.buttons .button:focus,.ui.inverted.red.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.red.button:hover,.ui.inverted.red.buttons .button:hover{background-color:#ff392b}.ui.inverted.red.button:focus,.ui.inverted.red.buttons .button:focus{background-color:#ff4335}.ui.inverted.red.active.button,.ui.inverted.red.buttons .active.button{background-color:#ff5144}.ui.inverted.red.button:active,.ui.inverted.red.buttons .button:active{background-color:#ff392b}.ui.inverted.red.basic.button,.ui.inverted.red.basic.buttons .button,.ui.inverted.red.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.red.basic.button:hover,.ui.inverted.red.basic.buttons .button:hover,.ui.inverted.red.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #ff392b inset;box-shadow:0 0 0 2px #ff392b inset;color:#ff695e}.ui.inverted.red.basic.button:focus,.ui.inverted.red.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #ff4335 inset;box-shadow:0 0 0 2px #ff4335 inset;color:#ff695e}.ui.inverted.red.basic.active.button,.ui.inverted.red.basic.buttons .active.button,.ui.inverted.red.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #ff5144 inset;box-shadow:0 0 0 2px #ff5144 inset;color:#ff695e}.ui.inverted.red.basic.button:active,.ui.inverted.red.basic.buttons .button:active,.ui.inverted.red.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #ff392b inset;box-shadow:0 0 0 2px #ff392b inset;color:#ff695e}.ui.tertiary.red.button,.ui.tertiary.red.buttons .button,.ui.tertiary.red.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#db2828}.ui.tertiary.red.button:hover,.ui.tertiary.red.buttons .button:hover,.ui.tertiary.red.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #b93131;box-shadow:inset 0 -.2em 0 #b93131;color:#b93131}.ui.tertiary.red.button:focus,.ui.tertiary.red.buttons .button:focus,.ui.tertiary.red.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #b52626;box-shadow:inset 0 -.2em 0 #b52626;color:#b52626}.ui.tertiary.red.active.button,.ui.tertiary.red.button:active,.ui.tertiary.red.buttons .active.button,.ui.tertiary.red.buttons .button:active,.ui.tertiary.red.buttons .tertiary.active.button,.ui.tertiary.red.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #ea0000;box-shadow:inset 0 -.2em 0 #ea0000;color:#d41515}.ui.orange.button,.ui.orange.buttons .button{background-color:#f2711c;color:#fff;text-shadow:none;background-image:none}.ui.orange.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.orange.button:hover,.ui.orange.buttons .button:hover{background-color:#f26202;color:#fff;text-shadow:none}.ui.orange.button:focus,.ui.orange.buttons .button:focus{background-color:#e55b00;color:#fff;text-shadow:none}.ui.orange.button:active,.ui.orange.buttons .button:active{background-color:#cf590c;color:#fff;text-shadow:none}.ui.orange.active.button,.ui.orange.button .active.button:active,.ui.orange.buttons .active.button,.ui.orange.buttons .active.button:active{background-color:#f56100;color:#fff;text-shadow:none}.ui.basic.orange.button,.ui.basic.orange.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #f2711c inset;box-shadow:0 0 0 1px #f2711c inset;color:#f2711c}.ui.basic.orange.button:hover,.ui.basic.orange.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #f26202 inset;box-shadow:0 0 0 1px #f26202 inset;color:#f26202}.ui.basic.orange.button:focus,.ui.basic.orange.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #e55b00 inset;box-shadow:0 0 0 1px #e55b00 inset;color:#f26202}.ui.basic.orange.active.button,.ui.basic.orange.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #f56100 inset;box-shadow:0 0 0 1px #f56100 inset;color:#cf590c}.ui.basic.orange.button:active,.ui.basic.orange.buttons .button:active{-webkit-box-shadow:0 0 0 1px #cf590c inset;box-shadow:0 0 0 1px #cf590c inset;color:#cf590c}.ui.buttons:not(.vertical)>.basic.orange.button:not(:first-child){margin-left:-1px}.ui.inverted.orange.button,.ui.inverted.orange.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #ff851b inset;box-shadow:0 0 0 2px #ff851b inset;color:#ff851b}.ui.inverted.orange.button.active,.ui.inverted.orange.button:active,.ui.inverted.orange.button:focus,.ui.inverted.orange.button:hover,.ui.inverted.orange.buttons .button.active,.ui.inverted.orange.buttons .button:active,.ui.inverted.orange.buttons .button:focus,.ui.inverted.orange.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.orange.button:hover,.ui.inverted.orange.buttons .button:hover{background-color:#e76b00}.ui.inverted.orange.button:focus,.ui.inverted.orange.buttons .button:focus{background-color:#f17000}.ui.inverted.orange.active.button,.ui.inverted.orange.buttons .active.button{background-color:#ff7701}.ui.inverted.orange.button:active,.ui.inverted.orange.buttons .button:active{background-color:#e76b00}.ui.inverted.orange.basic.button,.ui.inverted.orange.basic.buttons .button,.ui.inverted.orange.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.orange.basic.button:hover,.ui.inverted.orange.basic.buttons .button:hover,.ui.inverted.orange.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #e76b00 inset;box-shadow:0 0 0 2px #e76b00 inset;color:#ff851b}.ui.inverted.orange.basic.button:focus,.ui.inverted.orange.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #f17000 inset;box-shadow:0 0 0 2px #f17000 inset;color:#ff851b}.ui.inverted.orange.basic.active.button,.ui.inverted.orange.basic.buttons .active.button,.ui.inverted.orange.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #ff7701 inset;box-shadow:0 0 0 2px #ff7701 inset;color:#ff851b}.ui.inverted.orange.basic.button:active,.ui.inverted.orange.basic.buttons .button:active,.ui.inverted.orange.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #e76b00 inset;box-shadow:0 0 0 2px #e76b00 inset;color:#ff851b}.ui.tertiary.orange.button,.ui.tertiary.orange.buttons .button,.ui.tertiary.orange.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#f2711c}.ui.tertiary.orange.button:hover,.ui.tertiary.orange.buttons .button:hover,.ui.tertiary.orange.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #da671b;box-shadow:inset 0 -.2em 0 #da671b;color:#da671b}.ui.tertiary.orange.button:focus,.ui.tertiary.orange.buttons .button:focus,.ui.tertiary.orange.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #ce6017;box-shadow:inset 0 -.2em 0 #ce6017;color:#ce6017}.ui.tertiary.orange.active.button,.ui.tertiary.orange.button:active,.ui.tertiary.orange.buttons .active.button,.ui.tertiary.orange.buttons .button:active,.ui.tertiary.orange.buttons .tertiary.active.button,.ui.tertiary.orange.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #f56100;box-shadow:inset 0 -.2em 0 #f56100;color:#f56100}.ui.yellow.button,.ui.yellow.buttons .button{background-color:#fbbd08;color:#fff;text-shadow:none;background-image:none}.ui.yellow.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.yellow.button:hover,.ui.yellow.buttons .button:hover{background-color:#eaae00;color:#fff;text-shadow:none}.ui.yellow.button:focus,.ui.yellow.buttons .button:focus{background-color:#daa300;color:#fff;text-shadow:none}.ui.yellow.button:active,.ui.yellow.buttons .button:active{background-color:#cd9903;color:#fff;text-shadow:none}.ui.yellow.active.button,.ui.yellow.button .active.button:active,.ui.yellow.buttons .active.button,.ui.yellow.buttons .active.button:active{background-color:#eaae00;color:#fff;text-shadow:none}.ui.basic.yellow.button,.ui.basic.yellow.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #fbbd08 inset;box-shadow:0 0 0 1px #fbbd08 inset;color:#fbbd08}.ui.basic.yellow.button:hover,.ui.basic.yellow.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #eaae00 inset;box-shadow:0 0 0 1px #eaae00 inset;color:#eaae00}.ui.basic.yellow.button:focus,.ui.basic.yellow.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #daa300 inset;box-shadow:0 0 0 1px #daa300 inset;color:#eaae00}.ui.basic.yellow.active.button,.ui.basic.yellow.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #eaae00 inset;box-shadow:0 0 0 1px #eaae00 inset;color:#cd9903}.ui.basic.yellow.button:active,.ui.basic.yellow.buttons .button:active{-webkit-box-shadow:0 0 0 1px #cd9903 inset;box-shadow:0 0 0 1px #cd9903 inset;color:#cd9903}.ui.buttons:not(.vertical)>.basic.yellow.button:not(:first-child){margin-left:-1px}.ui.inverted.yellow.button,.ui.inverted.yellow.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #ffe21f inset;box-shadow:0 0 0 2px #ffe21f inset;color:#ffe21f}.ui.inverted.yellow.button.active,.ui.inverted.yellow.button:active,.ui.inverted.yellow.button:focus,.ui.inverted.yellow.button:hover,.ui.inverted.yellow.buttons .button.active,.ui.inverted.yellow.buttons .button:active,.ui.inverted.yellow.buttons .button:focus,.ui.inverted.yellow.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:rgba(0,0,0,.6)}.ui.inverted.yellow.button:hover,.ui.inverted.yellow.buttons .button:hover{background-color:#ebcd00}.ui.inverted.yellow.button:focus,.ui.inverted.yellow.buttons .button:focus{background-color:#f5d500}.ui.inverted.yellow.active.button,.ui.inverted.yellow.buttons .active.button{background-color:#ffdf05}.ui.inverted.yellow.button:active,.ui.inverted.yellow.buttons .button:active{background-color:#ebcd00}.ui.inverted.yellow.basic.button,.ui.inverted.yellow.basic.buttons .button,.ui.inverted.yellow.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.yellow.basic.button:hover,.ui.inverted.yellow.basic.buttons .button:hover,.ui.inverted.yellow.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #ebcd00 inset;box-shadow:0 0 0 2px #ebcd00 inset;color:#ffe21f}.ui.inverted.yellow.basic.button:focus,.ui.inverted.yellow.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #f5d500 inset;box-shadow:0 0 0 2px #f5d500 inset;color:#ffe21f}.ui.inverted.yellow.basic.active.button,.ui.inverted.yellow.basic.buttons .active.button,.ui.inverted.yellow.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #ffdf05 inset;box-shadow:0 0 0 2px #ffdf05 inset;color:#ffe21f}.ui.inverted.yellow.basic.button:active,.ui.inverted.yellow.basic.buttons .button:active,.ui.inverted.yellow.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #ebcd00 inset;box-shadow:0 0 0 2px #ebcd00 inset;color:#ffe21f}.ui.tertiary.yellow.button,.ui.tertiary.yellow.buttons .button,.ui.tertiary.yellow.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#fbbd08}.ui.tertiary.yellow.button:hover,.ui.tertiary.yellow.buttons .button:hover,.ui.tertiary.yellow.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #d2a217;box-shadow:inset 0 -.2em 0 #d2a217;color:#d2a217}.ui.tertiary.yellow.button:focus,.ui.tertiary.yellow.buttons .button:focus,.ui.tertiary.yellow.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #c49816;box-shadow:inset 0 -.2em 0 #c49816;color:#c49816}.ui.tertiary.yellow.active.button,.ui.tertiary.yellow.button:active,.ui.tertiary.yellow.buttons .active.button,.ui.tertiary.yellow.buttons .button:active,.ui.tertiary.yellow.buttons .tertiary.active.button,.ui.tertiary.yellow.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #eaae00;box-shadow:inset 0 -.2em 0 #eaae00;color:#eaae00}.ui.olive.button,.ui.olive.buttons .button{background-color:#b5cc18;color:#fff;text-shadow:none;background-image:none}.ui.olive.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.olive.button:hover,.ui.olive.buttons .button:hover{background-color:#a7bd0d;color:#fff;text-shadow:none}.ui.olive.button:focus,.ui.olive.buttons .button:focus{background-color:#a0b605;color:#fff;text-shadow:none}.ui.olive.button:active,.ui.olive.buttons .button:active{background-color:#8d9e13;color:#fff;text-shadow:none}.ui.olive.active.button,.ui.olive.button .active.button:active,.ui.olive.buttons .active.button,.ui.olive.buttons .active.button:active{background-color:#aac109;color:#fff;text-shadow:none}.ui.basic.olive.button,.ui.basic.olive.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #b5cc18 inset;box-shadow:0 0 0 1px #b5cc18 inset;color:#b5cc18}.ui.basic.olive.button:hover,.ui.basic.olive.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #a7bd0d inset;box-shadow:0 0 0 1px #a7bd0d inset;color:#a7bd0d}.ui.basic.olive.button:focus,.ui.basic.olive.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #a0b605 inset;box-shadow:0 0 0 1px #a0b605 inset;color:#a7bd0d}.ui.basic.olive.active.button,.ui.basic.olive.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #aac109 inset;box-shadow:0 0 0 1px #aac109 inset;color:#8d9e13}.ui.basic.olive.button:active,.ui.basic.olive.buttons .button:active{-webkit-box-shadow:0 0 0 1px #8d9e13 inset;box-shadow:0 0 0 1px #8d9e13 inset;color:#8d9e13}.ui.buttons:not(.vertical)>.basic.olive.button:not(:first-child){margin-left:-1px}.ui.inverted.olive.button,.ui.inverted.olive.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #d9e778 inset;box-shadow:0 0 0 2px #d9e778 inset;color:#d9e778}.ui.inverted.olive.button.active,.ui.inverted.olive.button:active,.ui.inverted.olive.button:focus,.ui.inverted.olive.button:hover,.ui.inverted.olive.buttons .button.active,.ui.inverted.olive.buttons .button:active,.ui.inverted.olive.buttons .button:focus,.ui.inverted.olive.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:rgba(0,0,0,.6)}.ui.inverted.olive.button:hover,.ui.inverted.olive.buttons .button:hover{background-color:#d2e745}.ui.inverted.olive.button:focus,.ui.inverted.olive.buttons .button:focus{background-color:#daef47}.ui.inverted.olive.active.button,.ui.inverted.olive.buttons .active.button{background-color:#daed59}.ui.inverted.olive.button:active,.ui.inverted.olive.buttons .button:active{background-color:#cddf4d}.ui.inverted.olive.basic.button,.ui.inverted.olive.basic.buttons .button,.ui.inverted.olive.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.olive.basic.button:hover,.ui.inverted.olive.basic.buttons .button:hover,.ui.inverted.olive.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #d2e745 inset;box-shadow:0 0 0 2px #d2e745 inset;color:#d9e778}.ui.inverted.olive.basic.button:focus,.ui.inverted.olive.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #daef47 inset;box-shadow:0 0 0 2px #daef47 inset;color:#d9e778}.ui.inverted.olive.basic.active.button,.ui.inverted.olive.basic.buttons .active.button,.ui.inverted.olive.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #daed59 inset;box-shadow:0 0 0 2px #daed59 inset;color:#d9e778}.ui.inverted.olive.basic.button:active,.ui.inverted.olive.basic.buttons .button:active,.ui.inverted.olive.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #cddf4d inset;box-shadow:0 0 0 2px #cddf4d inset;color:#d9e778}.ui.tertiary.olive.button,.ui.tertiary.olive.buttons .button,.ui.tertiary.olive.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#b5cc18}.ui.tertiary.olive.button:hover,.ui.tertiary.olive.buttons .button:hover,.ui.tertiary.olive.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #98a922;box-shadow:inset 0 -.2em 0 #98a922;color:#98a922}.ui.tertiary.olive.button:focus,.ui.tertiary.olive.buttons .button:focus,.ui.tertiary.olive.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #92a418;box-shadow:inset 0 -.2em 0 #92a418;color:#92a418}.ui.tertiary.olive.active.button,.ui.tertiary.olive.button:active,.ui.tertiary.olive.buttons .active.button,.ui.tertiary.olive.buttons .button:active,.ui.tertiary.olive.buttons .tertiary.active.button,.ui.tertiary.olive.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #b1cb00;box-shadow:inset 0 -.2em 0 #b1cb00;color:#aac109}.ui.green.button,.ui.green.buttons .button{background-color:#21ba45;color:#fff;text-shadow:none;background-image:none}.ui.green.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.green.button:hover,.ui.green.buttons .button:hover{background-color:#16ab39;color:#fff;text-shadow:none}.ui.green.button:focus,.ui.green.buttons .button:focus{background-color:#0ea432;color:#fff;text-shadow:none}.ui.green.button:active,.ui.green.buttons .button:active{background-color:#198f35;color:#fff;text-shadow:none}.ui.green.active.button,.ui.green.button .active.button:active,.ui.green.buttons .active.button,.ui.green.buttons .active.button:active{background-color:#13ae38;color:#fff;text-shadow:none}.ui.basic.green.button,.ui.basic.green.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #21ba45 inset;box-shadow:0 0 0 1px #21ba45 inset;color:#21ba45}.ui.basic.green.button:hover,.ui.basic.green.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #16ab39 inset;box-shadow:0 0 0 1px #16ab39 inset;color:#16ab39}.ui.basic.green.button:focus,.ui.basic.green.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #0ea432 inset;box-shadow:0 0 0 1px #0ea432 inset;color:#16ab39}.ui.basic.green.active.button,.ui.basic.green.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #13ae38 inset;box-shadow:0 0 0 1px #13ae38 inset;color:#198f35}.ui.basic.green.button:active,.ui.basic.green.buttons .button:active{-webkit-box-shadow:0 0 0 1px #198f35 inset;box-shadow:0 0 0 1px #198f35 inset;color:#198f35}.ui.buttons:not(.vertical)>.basic.green.button:not(:first-child){margin-left:-1px}.ui.inverted.green.button,.ui.inverted.green.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #2ecc40 inset;box-shadow:0 0 0 2px #2ecc40 inset;color:#2ecc40}.ui.inverted.green.button.active,.ui.inverted.green.button:active,.ui.inverted.green.button:focus,.ui.inverted.green.button:hover,.ui.inverted.green.buttons .button.active,.ui.inverted.green.buttons .button:active,.ui.inverted.green.buttons .button:focus,.ui.inverted.green.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.green.button:hover,.ui.inverted.green.buttons .button:hover{background-color:#1ea92e}.ui.inverted.green.button:focus,.ui.inverted.green.buttons .button:focus{background-color:#19b82b}.ui.inverted.green.active.button,.ui.inverted.green.buttons .active.button{background-color:#1fc231}.ui.inverted.green.button:active,.ui.inverted.green.buttons .button:active{background-color:#25a233}.ui.inverted.green.basic.button,.ui.inverted.green.basic.buttons .button,.ui.inverted.green.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.green.basic.button:hover,.ui.inverted.green.basic.buttons .button:hover,.ui.inverted.green.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #1ea92e inset;box-shadow:0 0 0 2px #1ea92e inset;color:#2ecc40}.ui.inverted.green.basic.button:focus,.ui.inverted.green.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #19b82b inset;box-shadow:0 0 0 2px #19b82b inset;color:#2ecc40}.ui.inverted.green.basic.active.button,.ui.inverted.green.basic.buttons .active.button,.ui.inverted.green.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #1fc231 inset;box-shadow:0 0 0 2px #1fc231 inset;color:#2ecc40}.ui.inverted.green.basic.button:active,.ui.inverted.green.basic.buttons .button:active,.ui.inverted.green.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #25a233 inset;box-shadow:0 0 0 2px #25a233 inset;color:#2ecc40}.ui.tertiary.green.button,.ui.tertiary.green.buttons .button,.ui.tertiary.green.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#21ba45}.ui.tertiary.green.button:hover,.ui.tertiary.green.buttons .button:hover,.ui.tertiary.green.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #2a9844;box-shadow:inset 0 -.2em 0 #2a9844;color:#2a9844}.ui.tertiary.green.button:focus,.ui.tertiary.green.buttons .button:focus,.ui.tertiary.green.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #20923b;box-shadow:inset 0 -.2em 0 #20923b;color:#20923b}.ui.tertiary.green.active.button,.ui.tertiary.green.button:active,.ui.tertiary.green.buttons .active.button,.ui.tertiary.green.buttons .button:active,.ui.tertiary.green.buttons .tertiary.active.button,.ui.tertiary.green.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #00c22e;box-shadow:inset 0 -.2em 0 #00c22e;color:#13ae38}.ui.teal.button,.ui.teal.buttons .button{background-color:#00b5ad;color:#fff;text-shadow:none;background-image:none}.ui.teal.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.teal.button:hover,.ui.teal.buttons .button:hover{background-color:#009c95;color:#fff;text-shadow:none}.ui.teal.button:focus,.ui.teal.buttons .button:focus{background-color:#008c86;color:#fff;text-shadow:none}.ui.teal.button:active,.ui.teal.buttons .button:active{background-color:#00827c;color:#fff;text-shadow:none}.ui.teal.active.button,.ui.teal.button .active.button:active,.ui.teal.buttons .active.button,.ui.teal.buttons .active.button:active{background-color:#009c95;color:#fff;text-shadow:none}.ui.basic.teal.button,.ui.basic.teal.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #00b5ad inset;box-shadow:0 0 0 1px #00b5ad inset;color:#00b5ad}.ui.basic.teal.button:hover,.ui.basic.teal.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #009c95 inset;box-shadow:0 0 0 1px #009c95 inset;color:#009c95}.ui.basic.teal.button:focus,.ui.basic.teal.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #008c86 inset;box-shadow:0 0 0 1px #008c86 inset;color:#009c95}.ui.basic.teal.active.button,.ui.basic.teal.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #009c95 inset;box-shadow:0 0 0 1px #009c95 inset;color:#00827c}.ui.basic.teal.button:active,.ui.basic.teal.buttons .button:active{-webkit-box-shadow:0 0 0 1px #00827c inset;box-shadow:0 0 0 1px #00827c inset;color:#00827c}.ui.buttons:not(.vertical)>.basic.teal.button:not(:first-child){margin-left:-1px}.ui.inverted.teal.button,.ui.inverted.teal.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #6dffff inset;box-shadow:0 0 0 2px #6dffff inset;color:#6dffff}.ui.inverted.teal.button.active,.ui.inverted.teal.button:active,.ui.inverted.teal.button:focus,.ui.inverted.teal.button:hover,.ui.inverted.teal.buttons .button.active,.ui.inverted.teal.buttons .button:active,.ui.inverted.teal.buttons .button:focus,.ui.inverted.teal.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:rgba(0,0,0,.6)}.ui.inverted.teal.button:hover,.ui.inverted.teal.buttons .button:hover{background-color:#3affff}.ui.inverted.teal.button:focus,.ui.inverted.teal.buttons .button:focus{background-color:#4ff}.ui.inverted.teal.active.button,.ui.inverted.teal.buttons .active.button{background-color:#54ffff}.ui.inverted.teal.button:active,.ui.inverted.teal.buttons .button:active{background-color:#3affff}.ui.inverted.teal.basic.button,.ui.inverted.teal.basic.buttons .button,.ui.inverted.teal.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.teal.basic.button:hover,.ui.inverted.teal.basic.buttons .button:hover,.ui.inverted.teal.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #3affff inset;box-shadow:0 0 0 2px #3affff inset;color:#6dffff}.ui.inverted.teal.basic.button:focus,.ui.inverted.teal.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #4ff inset;box-shadow:0 0 0 2px #4ff inset;color:#6dffff}.ui.inverted.teal.basic.active.button,.ui.inverted.teal.basic.buttons .active.button,.ui.inverted.teal.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #54ffff inset;box-shadow:0 0 0 2px #54ffff inset;color:#6dffff}.ui.inverted.teal.basic.button:active,.ui.inverted.teal.basic.buttons .button:active,.ui.inverted.teal.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #3affff inset;box-shadow:0 0 0 2px #3affff inset;color:#6dffff}.ui.tertiary.teal.button,.ui.tertiary.teal.buttons .button,.ui.tertiary.teal.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#00b5ad}.ui.tertiary.teal.button:hover,.ui.tertiary.teal.buttons .button:hover,.ui.tertiary.teal.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #108c86;box-shadow:inset 0 -.2em 0 #108c86;color:#108c86}.ui.tertiary.teal.button:focus,.ui.tertiary.teal.buttons .button:focus,.ui.tertiary.teal.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #0e7e79;box-shadow:inset 0 -.2em 0 #0e7e79;color:#0e7e79}.ui.tertiary.teal.active.button,.ui.tertiary.teal.button:active,.ui.tertiary.teal.buttons .active.button,.ui.tertiary.teal.buttons .button:active,.ui.tertiary.teal.buttons .tertiary.active.button,.ui.tertiary.teal.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #009c95;box-shadow:inset 0 -.2em 0 #009c95;color:#009c95}.ui.blue.button,.ui.blue.buttons .button{background-color:#2185d0;color:#fff;text-shadow:none;background-image:none}.ui.blue.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.blue.button:hover,.ui.blue.buttons .button:hover{background-color:#1678c2;color:#fff;text-shadow:none}.ui.blue.button:focus,.ui.blue.buttons .button:focus{background-color:#0d71bb;color:#fff;text-shadow:none}.ui.blue.button:active,.ui.blue.buttons .button:active{background-color:#1a69a4;color:#fff;text-shadow:none}.ui.blue.active.button,.ui.blue.button .active.button:active,.ui.blue.buttons .active.button,.ui.blue.buttons .active.button:active{background-color:#1279c6;color:#fff;text-shadow:none}.ui.basic.blue.button,.ui.basic.blue.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #2185d0 inset;box-shadow:0 0 0 1px #2185d0 inset;color:#2185d0}.ui.basic.blue.button:hover,.ui.basic.blue.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #1678c2 inset;box-shadow:0 0 0 1px #1678c2 inset;color:#1678c2}.ui.basic.blue.button:focus,.ui.basic.blue.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #0d71bb inset;box-shadow:0 0 0 1px #0d71bb inset;color:#1678c2}.ui.basic.blue.active.button,.ui.basic.blue.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #1279c6 inset;box-shadow:0 0 0 1px #1279c6 inset;color:#1a69a4}.ui.basic.blue.button:active,.ui.basic.blue.buttons .button:active{-webkit-box-shadow:0 0 0 1px #1a69a4 inset;box-shadow:0 0 0 1px #1a69a4 inset;color:#1a69a4}.ui.buttons:not(.vertical)>.basic.blue.button:not(:first-child){margin-left:-1px}.ui.inverted.blue.button,.ui.inverted.blue.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #54c8ff inset;box-shadow:0 0 0 2px #54c8ff inset;color:#54c8ff}.ui.inverted.blue.button.active,.ui.inverted.blue.button:active,.ui.inverted.blue.button:focus,.ui.inverted.blue.button:hover,.ui.inverted.blue.buttons .button.active,.ui.inverted.blue.buttons .button:active,.ui.inverted.blue.buttons .button:focus,.ui.inverted.blue.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.blue.button:hover,.ui.inverted.blue.buttons .button:hover{background-color:#21b8ff}.ui.inverted.blue.button:focus,.ui.inverted.blue.buttons .button:focus{background-color:#2bbbff}.ui.inverted.blue.active.button,.ui.inverted.blue.buttons .active.button{background-color:#3ac0ff}.ui.inverted.blue.button:active,.ui.inverted.blue.buttons .button:active{background-color:#21b8ff}.ui.inverted.blue.basic.button,.ui.inverted.blue.basic.buttons .button,.ui.inverted.blue.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.blue.basic.button:hover,.ui.inverted.blue.basic.buttons .button:hover,.ui.inverted.blue.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #21b8ff inset;box-shadow:0 0 0 2px #21b8ff inset;color:#54c8ff}.ui.inverted.blue.basic.button:focus,.ui.inverted.blue.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #2bbbff inset;box-shadow:0 0 0 2px #2bbbff inset;color:#54c8ff}.ui.inverted.blue.basic.active.button,.ui.inverted.blue.basic.buttons .active.button,.ui.inverted.blue.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #3ac0ff inset;box-shadow:0 0 0 2px #3ac0ff inset;color:#54c8ff}.ui.inverted.blue.basic.button:active,.ui.inverted.blue.basic.buttons .button:active,.ui.inverted.blue.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #21b8ff inset;box-shadow:0 0 0 2px #21b8ff inset;color:#54c8ff}.ui.tertiary.blue.button,.ui.tertiary.blue.buttons .button,.ui.tertiary.blue.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#2185d0}.ui.tertiary.blue.button:hover,.ui.tertiary.blue.buttons .button:hover,.ui.tertiary.blue.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #2b75ac;box-shadow:inset 0 -.2em 0 #2b75ac;color:#2b75ac}.ui.tertiary.blue.button:focus,.ui.tertiary.blue.buttons .button:focus,.ui.tertiary.blue.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #216ea7;box-shadow:inset 0 -.2em 0 #216ea7;color:#216ea7}.ui.tertiary.blue.active.button,.ui.tertiary.blue.button:active,.ui.tertiary.blue.buttons .active.button,.ui.tertiary.blue.buttons .button:active,.ui.tertiary.blue.buttons .tertiary.active.button,.ui.tertiary.blue.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #007bd8;box-shadow:inset 0 -.2em 0 #007bd8;color:#1279c6}.ui.violet.button,.ui.violet.buttons .button{background-color:#6435c9;color:#fff;text-shadow:none;background-image:none}.ui.violet.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.violet.button:hover,.ui.violet.buttons .button:hover{background-color:#5829bb;color:#fff;text-shadow:none}.ui.violet.button:focus,.ui.violet.buttons .button:focus{background-color:#4f20b5;color:#fff;text-shadow:none}.ui.violet.button:active,.ui.violet.buttons .button:active{background-color:#502aa1;color:#fff;text-shadow:none}.ui.violet.active.button,.ui.violet.button .active.button:active,.ui.violet.buttons .active.button,.ui.violet.buttons .active.button:active{background-color:#5626bf;color:#fff;text-shadow:none}.ui.basic.violet.button,.ui.basic.violet.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #6435c9 inset;box-shadow:0 0 0 1px #6435c9 inset;color:#6435c9}.ui.basic.violet.button:hover,.ui.basic.violet.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #5829bb inset;box-shadow:0 0 0 1px #5829bb inset;color:#5829bb}.ui.basic.violet.button:focus,.ui.basic.violet.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #4f20b5 inset;box-shadow:0 0 0 1px #4f20b5 inset;color:#5829bb}.ui.basic.violet.active.button,.ui.basic.violet.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #5626bf inset;box-shadow:0 0 0 1px #5626bf inset;color:#502aa1}.ui.basic.violet.button:active,.ui.basic.violet.buttons .button:active{-webkit-box-shadow:0 0 0 1px #502aa1 inset;box-shadow:0 0 0 1px #502aa1 inset;color:#502aa1}.ui.buttons:not(.vertical)>.basic.violet.button:not(:first-child){margin-left:-1px}.ui.inverted.violet.button,.ui.inverted.violet.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #a291fb inset;box-shadow:0 0 0 2px #a291fb inset;color:#a291fb}.ui.inverted.violet.button.active,.ui.inverted.violet.button:active,.ui.inverted.violet.button:focus,.ui.inverted.violet.button:hover,.ui.inverted.violet.buttons .button.active,.ui.inverted.violet.buttons .button:active,.ui.inverted.violet.buttons .button:focus,.ui.inverted.violet.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.violet.button:hover,.ui.inverted.violet.buttons .button:hover{background-color:#745aff}.ui.inverted.violet.button:focus,.ui.inverted.violet.buttons .button:focus{background-color:#7d64ff}.ui.inverted.violet.active.button,.ui.inverted.violet.buttons .active.button{background-color:#8a73ff}.ui.inverted.violet.button:active,.ui.inverted.violet.buttons .button:active{background-color:#7860f9}.ui.inverted.violet.basic.button,.ui.inverted.violet.basic.buttons .button,.ui.inverted.violet.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.violet.basic.button:hover,.ui.inverted.violet.basic.buttons .button:hover,.ui.inverted.violet.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #745aff inset;box-shadow:0 0 0 2px #745aff inset;color:#a291fb}.ui.inverted.violet.basic.button:focus,.ui.inverted.violet.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #7d64ff inset;box-shadow:0 0 0 2px #7d64ff inset;color:#a291fb}.ui.inverted.violet.basic.active.button,.ui.inverted.violet.basic.buttons .active.button,.ui.inverted.violet.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #8a73ff inset;box-shadow:0 0 0 2px #8a73ff inset;color:#a291fb}.ui.inverted.violet.basic.button:active,.ui.inverted.violet.basic.buttons .button:active,.ui.inverted.violet.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #7860f9 inset;box-shadow:0 0 0 2px #7860f9 inset;color:#a291fb}.ui.tertiary.violet.button,.ui.tertiary.violet.buttons .button,.ui.tertiary.violet.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#6435c9}.ui.tertiary.violet.button:hover,.ui.tertiary.violet.buttons .button:hover,.ui.tertiary.violet.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #6040a5;box-shadow:inset 0 -.2em 0 #6040a5;color:#6040a5}.ui.tertiary.violet.button:focus,.ui.tertiary.violet.buttons .button:focus,.ui.tertiary.violet.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #5735a0;box-shadow:inset 0 -.2em 0 #5735a0;color:#5735a0}.ui.tertiary.violet.active.button,.ui.tertiary.violet.button:active,.ui.tertiary.violet.buttons .active.button,.ui.tertiary.violet.buttons .button:active,.ui.tertiary.violet.buttons .tertiary.active.button,.ui.tertiary.violet.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #4e0fd6;box-shadow:inset 0 -.2em 0 #4e0fd6;color:#5626bf}.ui.purple.button,.ui.purple.buttons .button{background-color:#a333c8;color:#fff;text-shadow:none;background-image:none}.ui.purple.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.purple.button:hover,.ui.purple.buttons .button:hover{background-color:#9627ba;color:#fff;text-shadow:none}.ui.purple.button:focus,.ui.purple.buttons .button:focus{background-color:#8f1eb4;color:#fff;text-shadow:none}.ui.purple.button:active,.ui.purple.buttons .button:active{background-color:#82299f;color:#fff;text-shadow:none}.ui.purple.active.button,.ui.purple.button .active.button:active,.ui.purple.buttons .active.button,.ui.purple.buttons .active.button:active{background-color:#9724be;color:#fff;text-shadow:none}.ui.basic.purple.button,.ui.basic.purple.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #a333c8 inset;box-shadow:0 0 0 1px #a333c8 inset;color:#a333c8}.ui.basic.purple.button:hover,.ui.basic.purple.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #9627ba inset;box-shadow:0 0 0 1px #9627ba inset;color:#9627ba}.ui.basic.purple.button:focus,.ui.basic.purple.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #8f1eb4 inset;box-shadow:0 0 0 1px #8f1eb4 inset;color:#9627ba}.ui.basic.purple.active.button,.ui.basic.purple.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #9724be inset;box-shadow:0 0 0 1px #9724be inset;color:#82299f}.ui.basic.purple.button:active,.ui.basic.purple.buttons .button:active{-webkit-box-shadow:0 0 0 1px #82299f inset;box-shadow:0 0 0 1px #82299f inset;color:#82299f}.ui.buttons:not(.vertical)>.basic.purple.button:not(:first-child){margin-left:-1px}.ui.inverted.purple.button,.ui.inverted.purple.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #dc73ff inset;box-shadow:0 0 0 2px #dc73ff inset;color:#dc73ff}.ui.inverted.purple.button.active,.ui.inverted.purple.button:active,.ui.inverted.purple.button:focus,.ui.inverted.purple.button:hover,.ui.inverted.purple.buttons .button.active,.ui.inverted.purple.buttons .button:active,.ui.inverted.purple.buttons .button:focus,.ui.inverted.purple.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.purple.button:hover,.ui.inverted.purple.buttons .button:hover{background-color:#cf40ff}.ui.inverted.purple.button:focus,.ui.inverted.purple.buttons .button:focus{background-color:#d24aff}.ui.inverted.purple.active.button,.ui.inverted.purple.buttons .active.button{background-color:#d65aff}.ui.inverted.purple.button:active,.ui.inverted.purple.buttons .button:active{background-color:#cf40ff}.ui.inverted.purple.basic.button,.ui.inverted.purple.basic.buttons .button,.ui.inverted.purple.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.purple.basic.button:hover,.ui.inverted.purple.basic.buttons .button:hover,.ui.inverted.purple.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #cf40ff inset;box-shadow:0 0 0 2px #cf40ff inset;color:#dc73ff}.ui.inverted.purple.basic.button:focus,.ui.inverted.purple.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #d24aff inset;box-shadow:0 0 0 2px #d24aff inset;color:#dc73ff}.ui.inverted.purple.basic.active.button,.ui.inverted.purple.basic.buttons .active.button,.ui.inverted.purple.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #d65aff inset;box-shadow:0 0 0 2px #d65aff inset;color:#dc73ff}.ui.inverted.purple.basic.button:active,.ui.inverted.purple.basic.buttons .button:active,.ui.inverted.purple.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #cf40ff inset;box-shadow:0 0 0 2px #cf40ff inset;color:#dc73ff}.ui.tertiary.purple.button,.ui.tertiary.purple.buttons .button,.ui.tertiary.purple.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#a333c8}.ui.tertiary.purple.button:hover,.ui.tertiary.purple.buttons .button:hover,.ui.tertiary.purple.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #8a3ea4;box-shadow:inset 0 -.2em 0 #8a3ea4;color:#8a3ea4}.ui.tertiary.purple.button:focus,.ui.tertiary.purple.buttons .button:focus,.ui.tertiary.purple.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #84339f;box-shadow:inset 0 -.2em 0 #84339f;color:#84339f}.ui.tertiary.purple.active.button,.ui.tertiary.purple.button:active,.ui.tertiary.purple.buttons .active.button,.ui.tertiary.purple.buttons .button:active,.ui.tertiary.purple.buttons .tertiary.active.button,.ui.tertiary.purple.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #a30dd4;box-shadow:inset 0 -.2em 0 #a30dd4;color:#9724be}.ui.pink.button,.ui.pink.buttons .button{background-color:#e03997;color:#fff;text-shadow:none;background-image:none}.ui.pink.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.pink.button:hover,.ui.pink.buttons .button:hover{background-color:#e61a8d;color:#fff;text-shadow:none}.ui.pink.button:focus,.ui.pink.buttons .button:focus{background-color:#e10f85;color:#fff;text-shadow:none}.ui.pink.button:active,.ui.pink.buttons .button:active{background-color:#c71f7e;color:#fff;text-shadow:none}.ui.pink.active.button,.ui.pink.button .active.button:active,.ui.pink.buttons .active.button,.ui.pink.buttons .active.button:active{background-color:#ea158d;color:#fff;text-shadow:none}.ui.basic.pink.button,.ui.basic.pink.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #e03997 inset;box-shadow:0 0 0 1px #e03997 inset;color:#e03997}.ui.basic.pink.button:hover,.ui.basic.pink.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #e61a8d inset;box-shadow:0 0 0 1px #e61a8d inset;color:#e61a8d}.ui.basic.pink.button:focus,.ui.basic.pink.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #e10f85 inset;box-shadow:0 0 0 1px #e10f85 inset;color:#e61a8d}.ui.basic.pink.active.button,.ui.basic.pink.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #ea158d inset;box-shadow:0 0 0 1px #ea158d inset;color:#c71f7e}.ui.basic.pink.button:active,.ui.basic.pink.buttons .button:active{-webkit-box-shadow:0 0 0 1px #c71f7e inset;box-shadow:0 0 0 1px #c71f7e inset;color:#c71f7e}.ui.buttons:not(.vertical)>.basic.pink.button:not(:first-child){margin-left:-1px}.ui.inverted.pink.button,.ui.inverted.pink.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #ff8edf inset;box-shadow:0 0 0 2px #ff8edf inset;color:#ff8edf}.ui.inverted.pink.button.active,.ui.inverted.pink.button:active,.ui.inverted.pink.button:focus,.ui.inverted.pink.button:hover,.ui.inverted.pink.buttons .button.active,.ui.inverted.pink.buttons .button:active,.ui.inverted.pink.buttons .button:focus,.ui.inverted.pink.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.pink.button:hover,.ui.inverted.pink.buttons .button:hover{background-color:#ff5bd1}.ui.inverted.pink.button:focus,.ui.inverted.pink.buttons .button:focus{background-color:#ff65d3}.ui.inverted.pink.active.button,.ui.inverted.pink.buttons .active.button{background-color:#ff74d8}.ui.inverted.pink.button:active,.ui.inverted.pink.buttons .button:active{background-color:#ff5bd1}.ui.inverted.pink.basic.button,.ui.inverted.pink.basic.buttons .button,.ui.inverted.pink.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.pink.basic.button:hover,.ui.inverted.pink.basic.buttons .button:hover,.ui.inverted.pink.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #ff5bd1 inset;box-shadow:0 0 0 2px #ff5bd1 inset;color:#ff8edf}.ui.inverted.pink.basic.button:focus,.ui.inverted.pink.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #ff65d3 inset;box-shadow:0 0 0 2px #ff65d3 inset;color:#ff8edf}.ui.inverted.pink.basic.active.button,.ui.inverted.pink.basic.buttons .active.button,.ui.inverted.pink.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #ff74d8 inset;box-shadow:0 0 0 2px #ff74d8 inset;color:#ff8edf}.ui.inverted.pink.basic.button:active,.ui.inverted.pink.basic.buttons .button:active,.ui.inverted.pink.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #ff5bd1 inset;box-shadow:0 0 0 2px #ff5bd1 inset;color:#ff8edf}.ui.tertiary.pink.button,.ui.tertiary.pink.buttons .button,.ui.tertiary.pink.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#e03997}.ui.tertiary.pink.button:hover,.ui.tertiary.pink.buttons .button:hover,.ui.tertiary.pink.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #cc3389;box-shadow:inset 0 -.2em 0 #cc3389;color:#cc3389}.ui.tertiary.pink.button:focus,.ui.tertiary.pink.buttons .button:focus,.ui.tertiary.pink.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #c92782;box-shadow:inset 0 -.2em 0 #c92782;color:#c92782}.ui.tertiary.pink.active.button,.ui.tertiary.pink.button:active,.ui.tertiary.pink.buttons .active.button,.ui.tertiary.pink.buttons .button:active,.ui.tertiary.pink.buttons .tertiary.active.button,.ui.tertiary.pink.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #ff0090;box-shadow:inset 0 -.2em 0 #ff0090;color:#ea158d}.ui.brown.button,.ui.brown.buttons .button{background-color:#a5673f;color:#fff;text-shadow:none;background-image:none}.ui.brown.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.brown.button:hover,.ui.brown.buttons .button:hover{background-color:#975b33;color:#fff;text-shadow:none}.ui.brown.button:focus,.ui.brown.buttons .button:focus{background-color:#90532b;color:#fff;text-shadow:none}.ui.brown.button:active,.ui.brown.buttons .button:active{background-color:#805031;color:#fff;text-shadow:none}.ui.brown.active.button,.ui.brown.button .active.button:active,.ui.brown.buttons .active.button,.ui.brown.buttons .active.button:active{background-color:#995a31;color:#fff;text-shadow:none}.ui.basic.brown.button,.ui.basic.brown.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #a5673f inset;box-shadow:0 0 0 1px #a5673f inset;color:#a5673f}.ui.basic.brown.button:hover,.ui.basic.brown.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #975b33 inset;box-shadow:0 0 0 1px #975b33 inset;color:#975b33}.ui.basic.brown.button:focus,.ui.basic.brown.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #90532b inset;box-shadow:0 0 0 1px #90532b inset;color:#975b33}.ui.basic.brown.active.button,.ui.basic.brown.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #995a31 inset;box-shadow:0 0 0 1px #995a31 inset;color:#805031}.ui.basic.brown.button:active,.ui.basic.brown.buttons .button:active{-webkit-box-shadow:0 0 0 1px #805031 inset;box-shadow:0 0 0 1px #805031 inset;color:#805031}.ui.buttons:not(.vertical)>.basic.brown.button:not(:first-child){margin-left:-1px}.ui.inverted.brown.button,.ui.inverted.brown.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #d67c1c inset;box-shadow:0 0 0 2px #d67c1c inset;color:#d67c1c}.ui.inverted.brown.button.active,.ui.inverted.brown.button:active,.ui.inverted.brown.button:focus,.ui.inverted.brown.button:hover,.ui.inverted.brown.buttons .button.active,.ui.inverted.brown.buttons .button:active,.ui.inverted.brown.buttons .button:focus,.ui.inverted.brown.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.brown.button:hover,.ui.inverted.brown.buttons .button:hover{background-color:#b0620f}.ui.inverted.brown.button:focus,.ui.inverted.brown.buttons .button:focus{background-color:#c16808}.ui.inverted.brown.active.button,.ui.inverted.brown.buttons .active.button{background-color:#cc6f0d}.ui.inverted.brown.button:active,.ui.inverted.brown.buttons .button:active{background-color:#a96216}.ui.inverted.brown.basic.button,.ui.inverted.brown.basic.buttons .button,.ui.inverted.brown.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.brown.basic.button:hover,.ui.inverted.brown.basic.buttons .button:hover,.ui.inverted.brown.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #b0620f inset;box-shadow:0 0 0 2px #b0620f inset;color:#d67c1c}.ui.inverted.brown.basic.button:focus,.ui.inverted.brown.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #c16808 inset;box-shadow:0 0 0 2px #c16808 inset;color:#d67c1c}.ui.inverted.brown.basic.active.button,.ui.inverted.brown.basic.buttons .active.button,.ui.inverted.brown.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #cc6f0d inset;box-shadow:0 0 0 2px #cc6f0d inset;color:#d67c1c}.ui.inverted.brown.basic.button:active,.ui.inverted.brown.basic.buttons .button:active,.ui.inverted.brown.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #a96216 inset;box-shadow:0 0 0 2px #a96216 inset;color:#d67c1c}.ui.tertiary.brown.button,.ui.tertiary.brown.buttons .button,.ui.tertiary.brown.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#a5673f}.ui.tertiary.brown.button:hover,.ui.tertiary.brown.buttons .button:hover,.ui.tertiary.brown.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #835f48;box-shadow:inset 0 -.2em 0 #835f48;color:#835f48}.ui.tertiary.brown.button:focus,.ui.tertiary.brown.buttons .button:focus,.ui.tertiary.brown.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #7d573e;box-shadow:inset 0 -.2em 0 #7d573e;color:#7d573e}.ui.tertiary.brown.active.button,.ui.tertiary.brown.button:active,.ui.tertiary.brown.buttons .active.button,.ui.tertiary.brown.buttons .button:active,.ui.tertiary.brown.buttons .tertiary.active.button,.ui.tertiary.brown.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #ae561d;box-shadow:inset 0 -.2em 0 #ae561d;color:#995a31}.ui.grey.button,.ui.grey.buttons .button{background-color:#767676;color:#fff;text-shadow:none;background-image:none}.ui.grey.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.grey.button:hover,.ui.grey.buttons .button:hover{background-color:#838383;color:#fff;text-shadow:none}.ui.grey.button:focus,.ui.grey.buttons .button:focus{background-color:#8a8a8a;color:#fff;text-shadow:none}.ui.grey.button:active,.ui.grey.buttons .button:active{background-color:#909090;color:#fff;text-shadow:none}.ui.grey.active.button,.ui.grey.button .active.button:active,.ui.grey.buttons .active.button,.ui.grey.buttons .active.button:active{background-color:#696969;color:#fff;text-shadow:none}.ui.basic.grey.button,.ui.basic.grey.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #767676 inset;box-shadow:0 0 0 1px #767676 inset;color:#767676}.ui.basic.grey.button:hover,.ui.basic.grey.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #838383 inset;box-shadow:0 0 0 1px #838383 inset;color:#838383}.ui.basic.grey.button:focus,.ui.basic.grey.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #8a8a8a inset;box-shadow:0 0 0 1px #8a8a8a inset;color:#838383}.ui.basic.grey.active.button,.ui.basic.grey.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #696969 inset;box-shadow:0 0 0 1px #696969 inset;color:#909090}.ui.basic.grey.button:active,.ui.basic.grey.buttons .button:active{-webkit-box-shadow:0 0 0 1px #909090 inset;box-shadow:0 0 0 1px #909090 inset;color:#909090}.ui.buttons:not(.vertical)>.basic.grey.button:not(:first-child){margin-left:-1px}.ui.inverted.grey.button,.ui.inverted.grey.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #d4d4d5 inset;box-shadow:0 0 0 2px #d4d4d5 inset;color:#fff}.ui.inverted.grey.button.active,.ui.inverted.grey.button:active,.ui.inverted.grey.button:focus,.ui.inverted.grey.button:hover,.ui.inverted.grey.buttons .button.active,.ui.inverted.grey.buttons .button:active,.ui.inverted.grey.buttons .button:focus,.ui.inverted.grey.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:rgba(0,0,0,.6)}.ui.inverted.grey.button:hover,.ui.inverted.grey.buttons .button:hover{background-color:#c2c4c5}.ui.inverted.grey.button:focus,.ui.inverted.grey.buttons .button:focus{background-color:#c7c9cb}.ui.inverted.grey.active.button,.ui.inverted.grey.buttons .active.button{background-color:#cfd0d2}.ui.inverted.grey.button:active,.ui.inverted.grey.buttons .button:active{background-color:#c2c4c5}.ui.inverted.grey.basic.button,.ui.inverted.grey.basic.buttons .button,.ui.inverted.grey.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.grey.basic.button:hover,.ui.inverted.grey.basic.buttons .button:hover,.ui.inverted.grey.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #c2c4c5 inset;box-shadow:0 0 0 2px #c2c4c5 inset;color:#fff}.ui.inverted.grey.basic.button:focus,.ui.inverted.grey.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #c7c9cb inset;box-shadow:0 0 0 2px #c7c9cb inset;color:#dcddde}.ui.inverted.grey.basic.active.button,.ui.inverted.grey.basic.buttons .active.button,.ui.inverted.grey.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #cfd0d2 inset;box-shadow:0 0 0 2px #cfd0d2 inset;color:#fff}.ui.inverted.grey.basic.button:active,.ui.inverted.grey.basic.buttons .button:active,.ui.inverted.grey.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #c2c4c5 inset;box-shadow:0 0 0 2px #c2c4c5 inset;color:#fff}.ui.tertiary.grey.button,.ui.tertiary.grey.buttons .button,.ui.tertiary.grey.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#767676}.ui.tertiary.grey.button:hover,.ui.tertiary.grey.buttons .button:hover,.ui.tertiary.grey.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #838383;box-shadow:inset 0 -.2em 0 #838383;color:#838383}.ui.tertiary.grey.button:focus,.ui.tertiary.grey.buttons .button:focus,.ui.tertiary.grey.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #8a8a8a;box-shadow:inset 0 -.2em 0 #8a8a8a;color:#8a8a8a}.ui.tertiary.grey.active.button,.ui.tertiary.grey.button:active,.ui.tertiary.grey.buttons .active.button,.ui.tertiary.grey.buttons .button:active,.ui.tertiary.grey.buttons .tertiary.active.button,.ui.tertiary.grey.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #7e5454;box-shadow:inset 0 -.2em 0 #7e5454;color:#696969}.ui.black.button,.ui.black.buttons .button{background-color:#1b1c1d;color:#fff;text-shadow:none;background-image:none}.ui.black.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.black.button:hover,.ui.black.buttons .button:hover{background-color:#27292a;color:#fff;text-shadow:none}.ui.black.button:focus,.ui.black.buttons .button:focus{background-color:#2f3032;color:#fff;text-shadow:none}.ui.black.button:active,.ui.black.buttons .button:active{background-color:#343637;color:#fff;text-shadow:none}.ui.black.active.button,.ui.black.button .active.button:active,.ui.black.buttons .active.button,.ui.black.buttons .active.button:active{background-color:#0f0f10;color:#fff;text-shadow:none}.ui.basic.black.button,.ui.basic.black.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #1b1c1d inset;box-shadow:0 0 0 1px #1b1c1d inset;color:#1b1c1d}.ui.basic.black.button:hover,.ui.basic.black.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #27292a inset;box-shadow:0 0 0 1px #27292a inset;color:#27292a}.ui.basic.black.button:focus,.ui.basic.black.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #2f3032 inset;box-shadow:0 0 0 1px #2f3032 inset;color:#27292a}.ui.basic.black.active.button,.ui.basic.black.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #0f0f10 inset;box-shadow:0 0 0 1px #0f0f10 inset;color:#343637}.ui.basic.black.button:active,.ui.basic.black.buttons .button:active{-webkit-box-shadow:0 0 0 1px #343637 inset;box-shadow:0 0 0 1px #343637 inset;color:#343637}.ui.buttons:not(.vertical)>.basic.black.button:not(:first-child){margin-left:-1px}.ui.inverted.black.button,.ui.inverted.black.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #d4d4d5 inset;box-shadow:0 0 0 2px #d4d4d5 inset;color:#fff}.ui.inverted.black.button.active,.ui.inverted.black.button:active,.ui.inverted.black.button:focus,.ui.inverted.black.button:hover,.ui.inverted.black.buttons .button.active,.ui.inverted.black.buttons .button:active,.ui.inverted.black.buttons .button:focus,.ui.inverted.black.buttons .button:hover{-webkit-box-shadow:none;box-shadow:none;color:#fff}.ui.inverted.black.button:hover,.ui.inverted.black.buttons .button:hover{background-color:#000}.ui.inverted.black.button:focus,.ui.inverted.black.buttons .button:focus{background-color:#000}.ui.inverted.black.active.button,.ui.inverted.black.buttons .active.button{background-color:#000}.ui.inverted.black.button:active,.ui.inverted.black.buttons .button:active{background-color:#000}.ui.inverted.black.basic.button,.ui.inverted.black.basic.buttons .button,.ui.inverted.black.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset;color:#fff}.ui.inverted.black.basic.button:hover,.ui.inverted.black.basic.buttons .button:hover,.ui.inverted.black.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #000 inset;box-shadow:0 0 0 2px #000 inset;color:#fff}.ui.inverted.black.basic.button:focus,.ui.inverted.black.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #000 inset;box-shadow:0 0 0 2px #000 inset;color:#545454}.ui.inverted.black.basic.active.button,.ui.inverted.black.basic.buttons .active.button,.ui.inverted.black.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #000 inset;box-shadow:0 0 0 2px #000 inset;color:#fff}.ui.inverted.black.basic.button:active,.ui.inverted.black.basic.buttons .button:active,.ui.inverted.black.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #000 inset;box-shadow:0 0 0 2px #000 inset;color:#fff}.ui.tertiary.black.button,.ui.tertiary.black.buttons .button,.ui.tertiary.black.buttons .tertiary.button{background:0 0;-webkit-box-shadow:none;box-shadow:none;color:#1b1c1d}.ui.tertiary.black.button:hover,.ui.tertiary.black.buttons .button:hover,.ui.tertiary.black.buttons button:hover{-webkit-box-shadow:inset 0 -.2em 0 #8b8f93;box-shadow:inset 0 -.2em 0 #8b8f93;color:#8b8f93}.ui.tertiary.black.button:focus,.ui.tertiary.black.buttons .button:focus,.ui.tertiary.black.buttons .tertiary.button:focus{-webkit-box-shadow:inset 0 -.2em 0 #93969a;box-shadow:inset 0 -.2em 0 #93969a;color:#93969a}.ui.tertiary.black.active.button,.ui.tertiary.black.button:active,.ui.tertiary.black.buttons .active.button,.ui.tertiary.black.buttons .button:active,.ui.tertiary.black.buttons .tertiary.active.button,.ui.tertiary.black.buttons .tertiary.button:active{-webkit-box-shadow:inset 0 -.2em 0 #404245;box-shadow:inset 0 -.2em 0 #404245;color:#0f0f10}.ui.positive.button,.ui.positive.buttons .button{background-color:#21ba45;color:#fff;text-shadow:none;background-image:none}.ui.positive.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.positive.button:hover,.ui.positive.buttons .button:hover{background-color:#16ab39;color:#fff;text-shadow:none}.ui.positive.button:focus,.ui.positive.buttons .button:focus{background-color:#0ea432;color:#fff;text-shadow:none}.ui.positive.button:active,.ui.positive.buttons .button:active{background-color:#198f35;color:#fff;text-shadow:none}.ui.positive.active.button,.ui.positive.button .active.button:active,.ui.positive.buttons .active.button,.ui.positive.buttons .active.button:active{background-color:#13ae38;color:#fff;text-shadow:none}.ui.basic.positive.button,.ui.basic.positive.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #21ba45 inset;box-shadow:0 0 0 1px #21ba45 inset;color:#21ba45}.ui.basic.positive.button:hover,.ui.basic.positive.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #16ab39 inset;box-shadow:0 0 0 1px #16ab39 inset;color:#16ab39}.ui.basic.positive.button:focus,.ui.basic.positive.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #0ea432 inset;box-shadow:0 0 0 1px #0ea432 inset;color:#16ab39}.ui.basic.positive.active.button,.ui.basic.positive.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #13ae38 inset;box-shadow:0 0 0 1px #13ae38 inset;color:#198f35}.ui.basic.positive.button:active,.ui.basic.positive.buttons .button:active{-webkit-box-shadow:0 0 0 1px #198f35 inset;box-shadow:0 0 0 1px #198f35 inset;color:#198f35}.ui.buttons:not(.vertical)>.basic.positive.button:not(:first-child){margin-left:-1px}.ui.negative.button,.ui.negative.buttons .button{background-color:#db2828;color:#fff;text-shadow:none;background-image:none}.ui.negative.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.negative.button:hover,.ui.negative.buttons .button:hover{background-color:#d01919;color:#fff;text-shadow:none}.ui.negative.button:focus,.ui.negative.buttons .button:focus{background-color:#ca1010;color:#fff;text-shadow:none}.ui.negative.button:active,.ui.negative.buttons .button:active{background-color:#b21e1e;color:#fff;text-shadow:none}.ui.negative.active.button,.ui.negative.button .active.button:active,.ui.negative.buttons .active.button,.ui.negative.buttons .active.button:active{background-color:#d41515;color:#fff;text-shadow:none}.ui.basic.negative.button,.ui.basic.negative.buttons .button{background:0 0;-webkit-box-shadow:0 0 0 1px #db2828 inset;box-shadow:0 0 0 1px #db2828 inset;color:#db2828}.ui.basic.negative.button:hover,.ui.basic.negative.buttons .button:hover{background:0 0;-webkit-box-shadow:0 0 0 1px #d01919 inset;box-shadow:0 0 0 1px #d01919 inset;color:#d01919}.ui.basic.negative.button:focus,.ui.basic.negative.buttons .button:focus{background:0 0;-webkit-box-shadow:0 0 0 1px #ca1010 inset;box-shadow:0 0 0 1px #ca1010 inset;color:#d01919}.ui.basic.negative.active.button,.ui.basic.negative.buttons .active.button{background:0 0;-webkit-box-shadow:0 0 0 1px #d41515 inset;box-shadow:0 0 0 1px #d41515 inset;color:#b21e1e}.ui.basic.negative.button:active,.ui.basic.negative.buttons .button:active{-webkit-box-shadow:0 0 0 1px #b21e1e inset;box-shadow:0 0 0 1px #b21e1e inset;color:#b21e1e}.ui.buttons:not(.vertical)>.basic.negative.button:not(:first-child){margin-left:-1px}.ui.buttons{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;font-size:0;vertical-align:baseline;margin:0 .25em 0 0}.ui.buttons:not(.basic):not(.inverted){-webkit-box-shadow:none;box-shadow:none}.ui.buttons:after{content:".";display:block;height:0;clear:both;visibility:hidden}.ui.buttons .button{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;border-radius:0;margin:0}.ui.buttons:not(.basic):not(.inverted)>.button:not(.basic):not(.inverted){-webkit-box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset}.ui.buttons .button:first-child{border-left:none;margin-left:0;border-top-left-radius:.28571429rem;border-bottom-left-radius:.28571429rem}.ui.buttons .button:last-child{border-top-right-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.vertical.buttons{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.vertical.buttons .button{display:block;float:none;width:100%;margin:0;-webkit-box-shadow:none;box-shadow:none;border-radius:0}.ui.vertical.buttons .button:first-child{border-top-left-radius:.28571429rem;border-top-right-radius:.28571429rem}.ui.vertical.buttons .button:last-child{margin-bottom:0;border-bottom-left-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.vertical.buttons .button:only-child{border-radius:.28571429rem} + /* + * # Fomantic-UI - Checkbox + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */ + .ui.checkbox{position:relative;display:inline-block;-webkit-backface-visibility:hidden;backface-visibility:hidden;outline:0;vertical-align:baseline;font-style:normal;min-height:17px;font-size:1em;line-height:17px;min-width:17px}.ui.checkbox input[type=checkbox],.ui.checkbox input[type=radio]{cursor:pointer;position:absolute;top:0;left:0;opacity:0!important;outline:0;z-index:3;width:17px;height:17px}.ui.checkbox label{cursor:auto;position:relative;display:block;padding-left:1.85714em;outline:0;font-size:1em}.ui.checkbox label:before{position:absolute;top:0;left:0;width:17px;height:17px;content:'';background:#fff;border-radius:.21428571rem;-webkit-transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;border:1px solid #d4d4d5}.ui.checkbox label:after{position:absolute;font-size:14px;top:0;left:0;width:17px;height:17px;text-align:center;opacity:0;color:rgba(0,0,0,.87);-webkit-transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease}.ui.checkbox label,.ui.checkbox+label{color:rgba(0,0,0,.87);-webkit-transition:color .1s ease;transition:color .1s ease}.ui.checkbox+label{vertical-align:middle}.ui.checkbox label:hover::before{background:#fff;border-color:rgba(34,36,38,.35)}.ui.checkbox label:hover,.ui.checkbox+label:hover{color:rgba(0,0,0,.8)}.ui.checkbox label:active::before{background:#f9fafb;border-color:rgba(34,36,38,.35)}.ui.checkbox label:active::after{color:rgba(0,0,0,.95)}.ui.checkbox input:active~label{color:rgba(0,0,0,.95)}.ui.checkbox input:focus~label:before{background:#fff;border-color:#96c8da}.ui.checkbox input:focus~label:after{color:rgba(0,0,0,.95)}.ui.checkbox input:focus~label{color:rgba(0,0,0,.95)}.ui.checkbox input:checked~label:before{background:#fff;border-color:rgba(34,36,38,.35)}.ui.checkbox input:checked~label:after{opacity:1;color:rgba(0,0,0,.95)}.ui.checkbox input:not([type=radio]):indeterminate~label:before{background:#fff;border-color:rgba(34,36,38,.35)}.ui.checkbox input:not([type=radio]):indeterminate~label:after{opacity:1;color:rgba(0,0,0,.95)}.ui.indeterminate.toggle.checkbox input:not([type=radio]):indeterminate~label:before{background:rgba(0,0,0,.15)}.ui.indeterminate.toggle.checkbox input:not([type=radio])~label:after{left:1.075rem}.ui.checkbox input:checked:focus~label:before,.ui.checkbox input:not([type=radio]):indeterminate:focus~label:before{background:#fff;border-color:#96c8da}.ui.checkbox input:checked:focus~label:after,.ui.checkbox input:not([type=radio]):indeterminate:focus~label:after{color:rgba(0,0,0,.95)}.ui.read-only.checkbox,.ui.read-only.checkbox label{cursor:default}.ui.checkbox input[disabled]~label,.ui.disabled.checkbox label{cursor:default!important;opacity:.5;color:#000}.ui.checkbox input.hidden{z-index:-1}.ui.checkbox input.hidden+label{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ui.radio.checkbox{min-height:15px}.ui.radio.checkbox label{padding-left:1.85714em}.ui.radio.checkbox label:before{content:'';-webkit-transform:none;transform:none;width:15px;height:15px;border-radius:500rem;top:1px;left:0}.ui.radio.checkbox label:after{border:none;content:''!important;line-height:15px;top:1px;left:0;width:15px;height:15px;border-radius:500rem;-webkit-transform:scale(.46666667);transform:scale(.46666667);background-color:rgba(0,0,0,.87)}.ui.radio.checkbox input:focus~label:before{background-color:#fff}.ui.radio.checkbox input:focus~label:after{background-color:rgba(0,0,0,.95)}.ui.radio.checkbox input:indeterminate~label:after{opacity:0}.ui.radio.checkbox input:checked~label:before{background-color:#fff}.ui.radio.checkbox input:checked~label:after{background-color:rgba(0,0,0,.95)}.ui.radio.checkbox input:focus:checked~label:before{background-color:#fff}.ui.radio.checkbox input:focus:checked~label:after{background-color:rgba(0,0,0,.95)}.ui.slider.checkbox{min-height:1.25rem}.ui.slider.checkbox input{width:3.5rem;height:1.25rem}.ui.slider.checkbox label{padding-left:4.5rem;line-height:1rem;color:rgba(0,0,0,.4)}.ui.slider.checkbox label:before{display:block;position:absolute;content:'';-webkit-transform:none;transform:none;border:none!important;left:0;z-index:1;top:.4rem;background-color:rgba(0,0,0,.05);width:3.5rem;height:.21428571rem;border-radius:500rem;-webkit-transition:background .3s ease;transition:background .3s ease}.ui.slider.checkbox label:after{background:#fff -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#fff -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#fff linear-gradient(transparent,rgba(0,0,0,.05));position:absolute;content:''!important;opacity:1;z-index:2;border:none;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;width:1.5rem;height:1.5rem;top:-.25rem;left:0;-webkit-transform:none;transform:none;border-radius:500rem;-webkit-transition:left .3s ease;transition:left .3s ease}.ui.slider.checkbox input:focus~label:before{background-color:rgba(0,0,0,.15);border:none}.ui.slider.checkbox label:hover{color:rgba(0,0,0,.8)}.ui.slider.checkbox label:hover::before{background:rgba(0,0,0,.15)}.ui.slider.checkbox input:checked~label{color:rgba(0,0,0,.95)!important}.ui.slider.checkbox input:checked~label:before{background-color:#545454!important}.ui.slider.checkbox input:checked~label:after{left:2rem}.ui.slider.checkbox input:focus:checked~label{color:rgba(0,0,0,.95)!important}.ui.slider.checkbox input:focus:checked~label:before{background-color:#000!important}.ui.toggle.checkbox{min-height:1.5rem}.ui.toggle.checkbox input{width:3.5rem;height:1.5rem}.ui.toggle.checkbox label{min-height:1.5rem;padding-left:4.5rem;color:rgba(0,0,0,.87)}.ui.toggle.checkbox label{padding-top:.15em}.ui.toggle.checkbox label:before{display:block;position:absolute;content:'';z-index:1;-webkit-transform:none;transform:none;border:none;top:0;background:rgba(0,0,0,.05);-webkit-box-shadow:none;box-shadow:none;width:3.5rem;height:1.5rem;border-radius:500rem}.ui.toggle.checkbox label:after{background:#fff -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#fff -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#fff linear-gradient(transparent,rgba(0,0,0,.05));position:absolute;content:''!important;opacity:1;z-index:2;border:none;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;width:1.5rem;height:1.5rem;top:0;left:0;border-radius:500rem;-webkit-transition:background .3s ease,left .3s ease;transition:background .3s ease,left .3s ease}.ui.toggle.checkbox input~label:after{left:-.05rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset}.ui.toggle.checkbox input:focus~label:before{background-color:rgba(0,0,0,.15);border:none}.ui.toggle.checkbox label:hover::before{background-color:rgba(0,0,0,.15);border:none}.ui.toggle.checkbox input:checked~label{color:rgba(0,0,0,.95)!important}.ui.toggle.checkbox input:checked~label:before{background-color:#2185d0!important}.ui.toggle.checkbox input:checked~label:after{left:2.15rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset}.ui.toggle.checkbox input:focus:checked~label{color:rgba(0,0,0,.95)!important}.ui.toggle.checkbox input:focus:checked~label:before{background-color:#0d71bb!important}.ui.fitted.checkbox label{padding-left:0!important}.ui.fitted.toggle.checkbox{width:3.5rem}.ui.fitted.slider.checkbox{width:3.5rem}.ui.inverted.checkbox label,.ui.inverted.checkbox+label{color:rgba(255,255,255,.9)!important}.ui.inverted.checkbox label:hover{color:#fff!important}.ui.inverted.checkbox label:hover::before{border-color:rgba(34,36,38,.5)}.ui.inverted.slider.checkbox label{color:rgba(255,255,255,.5)}.ui.inverted.slider.checkbox label:before{background-color:rgba(255,255,255,.5)!important}.ui.inverted.slider.checkbox label:hover::before{background:rgba(255,255,255,.7)!important}.ui.inverted.slider.checkbox input:checked~label{color:#fff!important}.ui.inverted.slider.checkbox input:checked~label:before{background-color:rgba(255,255,255,.8)!important}.ui.inverted.slider.checkbox input:focus:checked~label{color:#fff!important}.ui.inverted.slider.checkbox input:focus:checked~label:before{background-color:rgba(255,255,255,.8)!important}.ui.inverted.toggle.checkbox label:before{background-color:rgba(255,255,255,.9)!important}.ui.inverted.toggle.checkbox label:hover::before{background:#fff!important}.ui.inverted.toggle.checkbox input:checked~label{color:#fff!important}.ui.inverted.toggle.checkbox input:checked~label:before{background-color:#2185d0!important}.ui.inverted.toggle.checkbox input:focus:checked~label{color:#fff!important}.ui.inverted.toggle.checkbox input:focus:checked~label:before{background-color:#0d71bb!important}.ui.mini.checkbox{font-size:.78571429em}.ui.tiny.checkbox{font-size:.85714286em}.ui.small.checkbox{font-size:.92857143em}.ui.large.checkbox{font-size:1.14285714em}.ui.large.checkbox:not(.slider):not(.toggle):not(.radio) label:after,.ui.large.checkbox:not(.slider):not(.toggle):not(.radio) label:before,.ui.large.form .checkbox:not(.slider):not(.toggle):not(.radio) label:after,.ui.large.form .checkbox:not(.slider):not(.toggle):not(.radio) label:before{-webkit-transform:scale(1.14285714);transform:scale(1.14285714);-webkit-transform-origin:left;transform-origin:left}.ui.large.checkbox.radio label:before,.ui.large.form .checkbox.radio label:before{-webkit-transform:scale(1.14285714);transform:scale(1.14285714);-webkit-transform-origin:left;transform-origin:left}.ui.large.checkbox.radio label:after,.ui.large.form .checkbox.radio label:after{-webkit-transform:scale(.57142857);transform:scale(.57142857);-webkit-transform-origin:left;transform-origin:left;left:.33571429em}.ui.big.checkbox{font-size:1.28571429em}.ui.big.checkbox:not(.slider):not(.toggle):not(.radio) label:after,.ui.big.checkbox:not(.slider):not(.toggle):not(.radio) label:before,.ui.big.form .checkbox:not(.slider):not(.toggle):not(.radio) label:after,.ui.big.form .checkbox:not(.slider):not(.toggle):not(.radio) label:before{-webkit-transform:scale(1.28571429);transform:scale(1.28571429);-webkit-transform-origin:left;transform-origin:left}.ui.big.checkbox.radio label:before,.ui.big.form .checkbox.radio label:before{-webkit-transform:scale(1.28571429);transform:scale(1.28571429);-webkit-transform-origin:left;transform-origin:left}.ui.big.checkbox.radio label:after,.ui.big.form .checkbox.radio label:after{-webkit-transform:scale(.64285714);transform:scale(.64285714);-webkit-transform-origin:left;transform-origin:left;left:.37142857em}.ui.huge.checkbox{font-size:1.42857143em}.ui.huge.checkbox:not(.slider):not(.toggle):not(.radio) label:after,.ui.huge.checkbox:not(.slider):not(.toggle):not(.radio) label:before,.ui.huge.form .checkbox:not(.slider):not(.toggle):not(.radio) label:after,.ui.huge.form .checkbox:not(.slider):not(.toggle):not(.radio) label:before{-webkit-transform:scale(1.42857143);transform:scale(1.42857143);-webkit-transform-origin:left;transform-origin:left}.ui.huge.checkbox.radio label:before,.ui.huge.form .checkbox.radio label:before{-webkit-transform:scale(1.42857143);transform:scale(1.42857143);-webkit-transform-origin:left;transform-origin:left}.ui.huge.checkbox.radio label:after,.ui.huge.form .checkbox.radio label:after{-webkit-transform:scale(.71428571);transform:scale(.71428571);-webkit-transform-origin:left;transform-origin:left;left:.40714286em}.ui.massive.checkbox{font-size:1.71428571em}.ui.massive.checkbox:not(.slider):not(.toggle):not(.radio) label:after,.ui.massive.checkbox:not(.slider):not(.toggle):not(.radio) label:before,.ui.massive.form .checkbox:not(.slider):not(.toggle):not(.radio) label:after,.ui.massive.form .checkbox:not(.slider):not(.toggle):not(.radio) label:before{-webkit-transform:scale(1.71428571);transform:scale(1.71428571);-webkit-transform-origin:left;transform-origin:left}.ui.massive.checkbox.radio label:before,.ui.massive.form .checkbox.radio label:before{-webkit-transform:scale(1.71428571);transform:scale(1.71428571);-webkit-transform-origin:left;transform-origin:left}.ui.massive.checkbox.radio label:after,.ui.massive.form .checkbox.radio label:after{-webkit-transform:scale(.85714286);transform:scale(.85714286);-webkit-transform-origin:left;transform-origin:left;left:.47857143em}@font-face{font-family:Checkbox;src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBD8AAAC8AAAAYGNtYXAYVtCJAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5Zn4huwUAAAF4AAABYGhlYWQGPe1ZAAAC2AAAADZoaGVhB30DyAAAAxAAAAAkaG10eBBKAEUAAAM0AAAAHGxvY2EAmgESAAADUAAAABBtYXhwAAkALwAAA2AAAAAgbmFtZSC8IugAAAOAAAABknBvc3QAAwAAAAAFFAAAACAAAwMTAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADoAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6AL//f//AAAAAAAg6AD//f//AAH/4xgEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAEUAUQO7AvgAGgAAARQHAQYjIicBJjU0PwE2MzIfAQE2MzIfARYVA7sQ/hQQFhcQ/uMQEE4QFxcQqAF2EBcXEE4QAnMWEP4UEBABHRAXFhBOEBCoAXcQEE4QFwAAAAABAAABbgMlAkkAFAAAARUUBwYjISInJj0BNDc2MyEyFxYVAyUQEBf9SRcQEBAQFwK3FxAQAhJtFxAQEBAXbRcQEBAQFwAAAAABAAAASQMlA24ALAAAARUUBwYrARUUBwYrASInJj0BIyInJj0BNDc2OwE1NDc2OwEyFxYdATMyFxYVAyUQEBfuEBAXbhYQEO4XEBAQEBfuEBAWbhcQEO4XEBACEm0XEBDuFxAQEBAX7hAQF20XEBDuFxAQEBAX7hAQFwAAAQAAAAIAAHRSzT9fDzz1AAsEAAAAAADRsdR3AAAAANGx1HcAAAAAA7sDbgAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAADuwABAAAAAAAAAAAAAAAAAAAABwQAAAAAAAAAAAAAAAIAAAAEAABFAyUAAAMlAAAAAAAAAAoAFAAeAE4AcgCwAAEAAAAHAC0AAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAIAAAAAQAAAAAAAgAHAGkAAQAAAAAAAwAIADkAAQAAAAAABAAIAH4AAQAAAAAABQALABgAAQAAAAAABgAIAFEAAQAAAAAACgAaAJYAAwABBAkAAQAQAAgAAwABBAkAAgAOAHAAAwABBAkAAwAQAEEAAwABBAkABAAQAIYAAwABBAkABQAWACMAAwABBAkABgAQAFkAAwABBAkACgA0ALBDaGVja2JveABDAGgAZQBjAGsAYgBvAHhWZXJzaW9uIDIuMABWAGUAcgBzAGkAbwBuACAAMgAuADBDaGVja2JveABDAGgAZQBjAGsAYgBvAHhDaGVja2JveABDAGgAZQBjAGsAYgBvAHhSZWd1bGFyAFIAZQBnAHUAbABhAHJDaGVja2JveABDAGgAZQBjAGsAYgBvAHhGb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('truetype')}.ui.checkbox .box:after,.ui.checkbox label:after{font-family:Checkbox}.ui.checkbox input:checked~.box:after,.ui.checkbox input:checked~label:after{content:'\e800'}.ui.checkbox input:indeterminate~.box:after,.ui.checkbox input:indeterminate~label:after{font-size:12px;content:'\e801'} + /* + * # Fomantic-UI - Divider + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */ + .ui.divider{margin:1rem 0;line-height:1;height:0;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:rgba(0,0,0,.85);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.ui.divider:not(.vertical):not(.horizontal){border-top:1px solid rgba(34,36,38,.15);border-bottom:1px solid rgba(255,255,255,.1)}.ui.grid>.column+.divider,.ui.grid>.row>.column+.divider{left:auto}.ui.horizontal.divider{display:table;white-space:nowrap;height:auto;margin:'';line-height:1;text-align:center}.ui.horizontal.divider:after,.ui.horizontal.divider:before{content:'';display:table-cell;position:relative;top:50%;width:50%;background-repeat:no-repeat}.ui.horizontal.divider:before{background-position:right 1em top 50%}.ui.horizontal.divider:after{background-position:left 1em top 50%}.ui.vertical.divider{position:absolute;z-index:2;top:50%;left:50%;margin:0;padding:0;width:auto;height:50%;line-height:0;text-align:center;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.ui.vertical.divider:after,.ui.vertical.divider:before{position:absolute;left:50%;content:'';z-index:3;border-left:1px solid rgba(34,36,38,.15);border-right:1px solid rgba(255,255,255,.1);width:0;height:calc(100% - 1rem)}.ui.vertical.divider:before{top:-100%}.ui.vertical.divider:after{top:auto;bottom:0}@media only screen and (max-width:767.98px){.ui.grid .stackable.row .ui.vertical.divider,.ui.stackable.grid .ui.vertical.divider{display:table;white-space:nowrap;height:auto;margin:'';overflow:hidden;line-height:1;text-align:center;position:static;top:0;left:0;-webkit-transform:none;transform:none}.ui.grid .stackable.row .ui.vertical.divider:after,.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:before{left:0;border-left:none;border-right:none;content:'';display:table-cell;position:relative;top:50%;width:50%;background-repeat:no-repeat}.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:before{background-position:right 1em top 50%}.ui.grid .stackable.row .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:after{background-position:left 1em top 50%}}.ui.divider>.icon{margin:0;font-size:1rem;height:1em;vertical-align:middle}.ui.horizontal.divider[class*="left aligned"]:before{display:none}.ui.horizontal.divider[class*="left aligned"]:after{width:100%}.ui.horizontal.divider[class*="right aligned"]:before{width:100%}.ui.horizontal.divider[class*="right aligned"]:after{display:none}.ui.hidden.divider{border-color:transparent!important}.ui.hidden.divider:after,.ui.hidden.divider:before{display:none}.ui.divider.inverted,.ui.horizontal.inverted.divider,.ui.vertical.inverted.divider{color:#fff}.ui.divider.inverted,.ui.divider.inverted:after,.ui.divider.inverted:before{border-top-color:rgba(34,36,38,.15)!important;border-left-color:rgba(34,36,38,.15)!important;border-bottom-color:rgba(255,255,255,.15)!important;border-right-color:rgba(255,255,255,.15)!important}.ui.fitted.divider{margin:0}.ui.clearing.divider{clear:both}.ui.section.divider{margin-top:2rem;margin-bottom:2rem}.ui.divider{font-size:1rem}.ui.mini.divider{font-size:.78571429rem}.ui.tiny.divider{font-size:.85714286rem}.ui.small.divider{font-size:.92857143rem}.ui.large.divider{font-size:1.14285714rem}.ui.big.divider{font-size:1.28571429rem}.ui.huge.divider{font-size:1.42857143rem}.ui.massive.divider{font-size:1.71428571rem}.ui.horizontal.divider:after,.ui.horizontal.divider:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC)}@media only screen and (max-width:767px){.ui.grid .stackable.row .ui.vertical.divider:after,.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC)}} + /* + * # Fomantic-UI - Form + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */ + .ui.form{position:relative;max-width:100%}.ui.form>p{margin:1em 0}.ui.form .field{clear:both;margin:0 0 1em}.ui.form .field:last-child,.ui.form .fields .fields,.ui.form .fields:last-child .field{margin-bottom:0}.ui.form .fields .field{clear:both;margin:0}.ui.form .field>label{display:block;margin:0 0 .28571429rem 0;color:rgba(0,0,0,.87);font-size:.92857143em;font-weight:700;text-transform:none}.ui.form input:not([type]),.ui.form input[type=date],.ui.form input[type=datetime-local],.ui.form input[type=email],.ui.form input[type=file],.ui.form input[type=number],.ui.form input[type=password],.ui.form input[type=search],.ui.form input[type=tel],.ui.form input[type=text],.ui.form input[type=time],.ui.form input[type=url],.ui.form textarea{width:100%;vertical-align:top}.ui.form ::-webkit-datetime-edit,.ui.form ::-webkit-inner-spin-button{height:1.21428571em}.ui.form input:not([type]),.ui.form input[type=date],.ui.form input[type=datetime-local],.ui.form input[type=email],.ui.form input[type=file],.ui.form input[type=number],.ui.form input[type=password],.ui.form input[type=search],.ui.form input[type=tel],.ui.form input[type=text],.ui.form input[type=time],.ui.form input[type=url]{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;margin:0;outline:0;-webkit-appearance:none;-webkit-tap-highlight-color:rgba(255,255,255,0);line-height:1.21428571em;padding:.67857143em 1em;font-size:1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:0 0 0 0 transparent inset;-webkit-transition:color .1s ease,border-color .1s ease;transition:color .1s ease,border-color .1s ease}.ui.form textarea,.ui.input textarea{margin:0;-webkit-appearance:none;-webkit-tap-highlight-color:rgba(255,255,255,0);padding:.78571429em 1em;background:#fff;border:1px solid rgba(34,36,38,.15);outline:0;color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:0 0 0 0 transparent inset;-webkit-transition:color .1s ease,border-color .1s ease;transition:color .1s ease,border-color .1s ease;font-size:1em;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;line-height:1.2857;resize:vertical}.ui.form textarea:not([rows]){height:12em;min-height:8em;max-height:24em}.ui.form input[type=checkbox],.ui.form textarea{vertical-align:top}.ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) label+.ui.ui.checkbox{margin-top:.7em}.ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) .ui.checkbox{margin-top:2.41428571em}.ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) .ui.toggle.checkbox{margin-top:2.21428571em}.ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) .ui.slider.checkbox{margin-top:2.61428571em}.ui.ui.form .field .fields .field:not(:only-child) .ui.checkbox{margin-top:.6em}.ui.ui.form .field .fields .field:not(:only-child) .ui.toggle.checkbox{margin-top:.5em}.ui.ui.form .field .fields .field:not(:only-child) .ui.slider.checkbox{margin-top:.7em}.ui.form .field .transparent.input:not(.icon) input,.ui.form .field input.transparent,.ui.form .field textarea.transparent{padding:.67857143em 1em}.ui.form .field input.transparent,.ui.form .field textarea.transparent{border-color:transparent!important;background-color:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.form input.attached{width:auto}.ui.form select{display:block;height:auto;width:100%;background:#fff;border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem;-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:0 0 0 0 transparent inset;padding:.62em 1em;color:rgba(0,0,0,.87);-webkit-transition:color .1s ease,border-color .1s ease;transition:color .1s ease,border-color .1s ease}.ui.form .field>.selection.dropdown{min-width:auto;width:100%}.ui.form .field>.selection.dropdown>.dropdown.icon{float:right}.ui.form .inline.field>.selection.dropdown,.ui.form .inline.fields .field>.selection.dropdown{width:auto}.ui.form .inline.field>.selection.dropdown>.dropdown.icon,.ui.form .inline.fields .field>.selection.dropdown>.dropdown.icon{float:none}.ui.form .field .ui.input,.ui.form .fields .field .ui.input,.ui.form .wide.field .ui.input{width:100%}.ui.form .inline.field:not(.wide) .ui.input,.ui.form .inline.fields .field:not(.wide) .ui.input{width:auto;vertical-align:middle}.ui.form .field .ui.input input,.ui.form .fields .field .ui.input input{width:auto}.ui.form .eight.fields .ui.input input,.ui.form .five.fields .ui.input input,.ui.form .four.fields .ui.input input,.ui.form .nine.fields .ui.input input,.ui.form .seven.fields .ui.input input,.ui.form .six.fields .ui.input input,.ui.form .ten.fields .ui.input input,.ui.form .three.fields .ui.input input,.ui.form .two.fields .ui.input input,.ui.form .wide.field .ui.input input{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;width:0}.ui.form .error.message,.ui.form .error.message:empty{display:none}.ui.form .info.message,.ui.form .info.message:empty{display:none}.ui.form .success.message,.ui.form .success.message:empty{display:none}.ui.form .warning.message,.ui.form .warning.message:empty{display:none}.ui.form .message:first-child{margin-top:0}.ui.form .field .prompt.label{white-space:normal;background:#fff!important;border:1px solid #e0b4b4!important;color:#9f3a38!important}.ui.form .inline.field .prompt,.ui.form .inline.fields .field .prompt{vertical-align:top;margin:-.25em 0 -.5em .5em}.ui.form .inline.field .prompt:before,.ui.form .inline.fields .field .prompt:before{border-width:0 0 1px 1px;bottom:auto;right:auto;top:50%;left:0}.ui.form .field.field input:-webkit-autofill{-webkit-box-shadow:0 0 0 100px ivory inset!important;box-shadow:0 0 0 100px ivory inset!important;border-color:#e5dfa1!important}.ui.form .field.field input:-webkit-autofill:focus{-webkit-box-shadow:0 0 0 100px ivory inset!important;box-shadow:0 0 0 100px ivory inset!important;border-color:#d5c315!important}.ui.form ::-webkit-input-placeholder{color:rgba(191,191,191,.87)}.ui.form :-ms-input-placeholder{color:rgba(191,191,191,.87)!important}.ui.form ::-moz-placeholder{color:rgba(191,191,191,.87)}.ui.form :focus::-webkit-input-placeholder{color:rgba(115,115,115,.87)}.ui.form :focus:-ms-input-placeholder{color:rgba(115,115,115,.87)!important}.ui.form :focus::-moz-placeholder{color:rgba(115,115,115,.87)}.ui.form input:not([type]):focus,.ui.form input[type=date]:focus,.ui.form input[type=datetime-local]:focus,.ui.form input[type=email]:focus,.ui.form input[type=file]:focus,.ui.form input[type=number]:focus,.ui.form input[type=password]:focus,.ui.form input[type=search]:focus,.ui.form input[type=tel]:focus,.ui.form input[type=text]:focus,.ui.form input[type=time]:focus,.ui.form input[type=url]:focus{color:rgba(0,0,0,.95);border-color:#85b7d9;border-radius:.28571429rem;background:#fff;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.35) inset;box-shadow:0 0 0 0 rgba(34,36,38,.35) inset}.ui.form .ui.action.input:not(.left) input:not([type]):focus,.ui.form .ui.action.input:not(.left) input[type=date]:focus,.ui.form .ui.action.input:not(.left) input[type=datetime-local]:focus,.ui.form .ui.action.input:not(.left) input[type=email]:focus,.ui.form .ui.action.input:not(.left) input[type=file]:focus,.ui.form .ui.action.input:not(.left) input[type=number]:focus,.ui.form .ui.action.input:not(.left) input[type=password]:focus,.ui.form .ui.action.input:not(.left) input[type=search]:focus,.ui.form .ui.action.input:not(.left) input[type=tel]:focus,.ui.form .ui.action.input:not(.left) input[type=text]:focus,.ui.form .ui.action.input:not(.left) input[type=time]:focus,.ui.form .ui.action.input:not(.left) input[type=url]:focus{border-top-right-radius:0;border-bottom-right-radius:0}.ui.form .ui.action.input.left input:not([type]),.ui.form .ui.action.input.left input[type=date],.ui.form .ui.action.input.left input[type=datetime-local],.ui.form .ui.action.input.left input[type=email],.ui.form .ui.action.input.left input[type=file],.ui.form .ui.action.input.left input[type=number],.ui.form .ui.action.input.left input[type=password],.ui.form .ui.action.input.left input[type=search],.ui.form .ui.action.input.left input[type=tel],.ui.form .ui.action.input.left input[type=text],.ui.form .ui.action.input.left input[type=time],.ui.form .ui.action.input.left input[type=url]{border-bottom-left-radius:0;border-top-left-radius:0}.ui.form textarea:focus{color:rgba(0,0,0,.95);border-color:#85b7d9;border-radius:.28571429rem;background:#fff;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.35) inset;box-shadow:0 0 0 0 rgba(34,36,38,.35) inset;-webkit-appearance:none}.ui.form.error .error.message:not(:empty){display:block}.ui.form.error .compact.error.message:not(:empty){display:inline-block}.ui.form.error .icon.error.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.form .field.error .error.message:not(:empty),.ui.form .fields.error .error.message:not(:empty){display:block}.ui.form .field.error .compact.error.message:not(:empty),.ui.form .fields.error .compact.error.message:not(:empty){display:inline-block}.ui.form .field.error .icon.error.message:not(:empty),.ui.form .fields.error .icon.error.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.ui.form .field.error .input,.ui.ui.form .field.error label,.ui.ui.form .fields.error .field .input,.ui.ui.form .fields.error .field label{color:#9f3a38}.ui.form .field.error .corner.label,.ui.form .fields.error .field .corner.label{border-color:#9f3a38;color:#fff}.ui.form .field.error input:not([type]),.ui.form .field.error input[type=date],.ui.form .field.error input[type=datetime-local],.ui.form .field.error input[type=email],.ui.form .field.error input[type=file],.ui.form .field.error input[type=number],.ui.form .field.error input[type=password],.ui.form .field.error input[type=search],.ui.form .field.error input[type=tel],.ui.form .field.error input[type=text],.ui.form .field.error input[type=time],.ui.form .field.error input[type=url],.ui.form .field.error select,.ui.form .field.error textarea,.ui.form .fields.error .field input:not([type]),.ui.form .fields.error .field input[type=date],.ui.form .fields.error .field input[type=datetime-local],.ui.form .fields.error .field input[type=email],.ui.form .fields.error .field input[type=file],.ui.form .fields.error .field input[type=number],.ui.form .fields.error .field input[type=password],.ui.form .fields.error .field input[type=search],.ui.form .fields.error .field input[type=tel],.ui.form .fields.error .field input[type=text],.ui.form .fields.error .field input[type=time],.ui.form .fields.error .field input[type=url],.ui.form .fields.error .field select,.ui.form .fields.error .field textarea{color:#9f3a38;background:#fff6f6;border-color:#e0b4b4;border-radius:'';-webkit-box-shadow:none;box-shadow:none}.ui.form .field.error input:not([type]):focus,.ui.form .field.error input[type=date]:focus,.ui.form .field.error input[type=datetime-local]:focus,.ui.form .field.error input[type=email]:focus,.ui.form .field.error input[type=file]:focus,.ui.form .field.error input[type=number]:focus,.ui.form .field.error input[type=password]:focus,.ui.form .field.error input[type=search]:focus,.ui.form .field.error input[type=tel]:focus,.ui.form .field.error input[type=text]:focus,.ui.form .field.error input[type=time]:focus,.ui.form .field.error input[type=url]:focus,.ui.form .field.error select:focus,.ui.form .field.error textarea:focus{background:#fff6f6;border-color:#e0b4b4;color:#9f3a38;-webkit-box-shadow:none;box-shadow:none}.ui.form .field.error select{-webkit-appearance:menulist-button}.ui.form .field.error .transparent.input input,.ui.form .field.error .transparent.input textarea,.ui.form .field.error input.transparent,.ui.form .field.error textarea.transparent{background-color:#fff6f6;color:#9f3a38}.ui.form .error.error input:-webkit-autofill{-webkit-box-shadow:0 0 0 100px #fffaf0 inset!important;box-shadow:0 0 0 100px #fffaf0 inset!important;border-color:#e0b4b4}.ui.form .error ::-webkit-input-placeholder{color:#e7bdbc}.ui.form .error :-ms-input-placeholder{color:#e7bdbc}.ui.form .error ::-moz-placeholder{color:#e7bdbc}.ui.form .error :focus::-webkit-input-placeholder{color:#da9796}.ui.form .error :focus:-ms-input-placeholder{color:#da9796}.ui.form .error :focus::-moz-placeholder{color:#da9796}.ui.form .field.error .ui.dropdown,.ui.form .field.error .ui.dropdown .item,.ui.form .field.error .ui.dropdown .text,.ui.form .fields.error .field .ui.dropdown,.ui.form .fields.error .field .ui.dropdown .item{background:#fff6f6;color:#9f3a38}.ui.form .field.error .ui.dropdown,.ui.form .fields.error .field .ui.dropdown{border-color:#e0b4b4!important}.ui.form .field.error .ui.dropdown:hover,.ui.form .fields.error .field .ui.dropdown:hover{border-color:#e0b4b4!important}.ui.form .field.error .ui.dropdown:hover .menu,.ui.form .fields.error .field .ui.dropdown:hover .menu{border-color:#e0b4b4}.ui.form .field.error .ui.multiple.selection.dropdown>.label,.ui.form .fields.error .field .ui.multiple.selection.dropdown>.label{background-color:#eacbcb;color:#9f3a38}.ui.form .field.error .ui.dropdown .menu .item:hover,.ui.form .fields.error .field .ui.dropdown .menu .item:hover{background-color:#fbe7e7}.ui.form .field.error .ui.dropdown .menu .selected.item,.ui.form .fields.error .field .ui.dropdown .menu .selected.item{background-color:#fbe7e7}.ui.form .field.error .ui.dropdown .menu .active.item,.ui.form .fields.error .field .ui.dropdown .menu .active.item{background-color:#fdcfcf}.ui.form .field.error .checkbox:not(.toggle):not(.slider) .box,.ui.form .field.error .checkbox:not(.toggle):not(.slider) label,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) .box,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) label{color:#9f3a38}.ui.form .field.error .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .field.error .checkbox:not(.toggle):not(.slider) label:before,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) label:before{background:#fff6f6;border-color:#e0b4b4}.ui.form .field.error .checkbox .box:after,.ui.form .field.error .checkbox label:after,.ui.form .fields.error .field .checkbox .box:after,.ui.form .fields.error .field .checkbox label:after{color:#9f3a38}.ui.form.info .info.message:not(:empty){display:block}.ui.form.info .compact.info.message:not(:empty){display:inline-block}.ui.form.info .icon.info.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.form .field.info .info.message:not(:empty),.ui.form .fields.info .info.message:not(:empty){display:block}.ui.form .field.info .compact.info.message:not(:empty),.ui.form .fields.info .compact.info.message:not(:empty){display:inline-block}.ui.form .field.info .icon.info.message:not(:empty),.ui.form .fields.info .icon.info.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.ui.form .field.info .input,.ui.ui.form .field.info label,.ui.ui.form .fields.info .field .input,.ui.ui.form .fields.info .field label{color:#276f86}.ui.form .field.info .corner.label,.ui.form .fields.info .field .corner.label{border-color:#276f86;color:#fff}.ui.form .field.info input:not([type]),.ui.form .field.info input[type=date],.ui.form .field.info input[type=datetime-local],.ui.form .field.info input[type=email],.ui.form .field.info input[type=file],.ui.form .field.info input[type=number],.ui.form .field.info input[type=password],.ui.form .field.info input[type=search],.ui.form .field.info input[type=tel],.ui.form .field.info input[type=text],.ui.form .field.info input[type=time],.ui.form .field.info input[type=url],.ui.form .field.info select,.ui.form .field.info textarea,.ui.form .fields.info .field input:not([type]),.ui.form .fields.info .field input[type=date],.ui.form .fields.info .field input[type=datetime-local],.ui.form .fields.info .field input[type=email],.ui.form .fields.info .field input[type=file],.ui.form .fields.info .field input[type=number],.ui.form .fields.info .field input[type=password],.ui.form .fields.info .field input[type=search],.ui.form .fields.info .field input[type=tel],.ui.form .fields.info .field input[type=text],.ui.form .fields.info .field input[type=time],.ui.form .fields.info .field input[type=url],.ui.form .fields.info .field select,.ui.form .fields.info .field textarea{color:#276f86;background:#f8ffff;border-color:#a9d5de;border-radius:'';-webkit-box-shadow:none;box-shadow:none}.ui.form .field.info input:not([type]):focus,.ui.form .field.info input[type=date]:focus,.ui.form .field.info input[type=datetime-local]:focus,.ui.form .field.info input[type=email]:focus,.ui.form .field.info input[type=file]:focus,.ui.form .field.info input[type=number]:focus,.ui.form .field.info input[type=password]:focus,.ui.form .field.info input[type=search]:focus,.ui.form .field.info input[type=tel]:focus,.ui.form .field.info input[type=text]:focus,.ui.form .field.info input[type=time]:focus,.ui.form .field.info input[type=url]:focus,.ui.form .field.info select:focus,.ui.form .field.info textarea:focus{background:#f8ffff;border-color:#a9d5de;color:#276f86;-webkit-box-shadow:none;box-shadow:none}.ui.form .field.info select{-webkit-appearance:menulist-button}.ui.form .field.info .transparent.input input,.ui.form .field.info .transparent.input textarea,.ui.form .field.info input.transparent,.ui.form .field.info textarea.transparent{background-color:#f8ffff;color:#276f86}.ui.form .info.info input:-webkit-autofill{-webkit-box-shadow:0 0 0 100px #f0faff inset!important;box-shadow:0 0 0 100px #f0faff inset!important;border-color:#b3e0e0}.ui.form .info ::-webkit-input-placeholder{color:#98cfe1}.ui.form .info :-ms-input-placeholder{color:#98cfe1}.ui.form .info ::-moz-placeholder{color:#98cfe1}.ui.form .info :focus::-webkit-input-placeholder{color:#70bdd6}.ui.form .info :focus:-ms-input-placeholder{color:#70bdd6}.ui.form .info :focus::-moz-placeholder{color:#70bdd6}.ui.form .field.info .ui.dropdown,.ui.form .field.info .ui.dropdown .item,.ui.form .field.info .ui.dropdown .text,.ui.form .fields.info .field .ui.dropdown,.ui.form .fields.info .field .ui.dropdown .item{background:#f8ffff;color:#276f86}.ui.form .field.info .ui.dropdown,.ui.form .fields.info .field .ui.dropdown{border-color:#a9d5de!important}.ui.form .field.info .ui.dropdown:hover,.ui.form .fields.info .field .ui.dropdown:hover{border-color:#a9d5de!important}.ui.form .field.info .ui.dropdown:hover .menu,.ui.form .fields.info .field .ui.dropdown:hover .menu{border-color:#a9d5de}.ui.form .field.info .ui.multiple.selection.dropdown>.label,.ui.form .fields.info .field .ui.multiple.selection.dropdown>.label{background-color:#cce3ea;color:#276f86}.ui.form .field.info .ui.dropdown .menu .item:hover,.ui.form .fields.info .field .ui.dropdown .menu .item:hover{background-color:#e9f2fb}.ui.form .field.info .ui.dropdown .menu .selected.item,.ui.form .fields.info .field .ui.dropdown .menu .selected.item{background-color:#e9f2fb}.ui.form .field.info .ui.dropdown .menu .active.item,.ui.form .fields.info .field .ui.dropdown .menu .active.item{background-color:#cef1fd}.ui.form .field.info .checkbox:not(.toggle):not(.slider) .box,.ui.form .field.info .checkbox:not(.toggle):not(.slider) label,.ui.form .fields.info .field .checkbox:not(.toggle):not(.slider) .box,.ui.form .fields.info .field .checkbox:not(.toggle):not(.slider) label{color:#276f86}.ui.form .field.info .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .field.info .checkbox:not(.toggle):not(.slider) label:before,.ui.form .fields.info .field .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .fields.info .field .checkbox:not(.toggle):not(.slider) label:before{background:#f8ffff;border-color:#a9d5de}.ui.form .field.info .checkbox .box:after,.ui.form .field.info .checkbox label:after,.ui.form .fields.info .field .checkbox .box:after,.ui.form .fields.info .field .checkbox label:after{color:#276f86}.ui.form.success .success.message:not(:empty){display:block}.ui.form.success .compact.success.message:not(:empty){display:inline-block}.ui.form.success .icon.success.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.form .field.success .success.message:not(:empty),.ui.form .fields.success .success.message:not(:empty){display:block}.ui.form .field.success .compact.success.message:not(:empty),.ui.form .fields.success .compact.success.message:not(:empty){display:inline-block}.ui.form .field.success .icon.success.message:not(:empty),.ui.form .fields.success .icon.success.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.ui.form .field.success .input,.ui.ui.form .field.success label,.ui.ui.form .fields.success .field .input,.ui.ui.form .fields.success .field label{color:#2c662d}.ui.form .field.success .corner.label,.ui.form .fields.success .field .corner.label{border-color:#2c662d;color:#fff}.ui.form .field.success input:not([type]),.ui.form .field.success input[type=date],.ui.form .field.success input[type=datetime-local],.ui.form .field.success input[type=email],.ui.form .field.success input[type=file],.ui.form .field.success input[type=number],.ui.form .field.success input[type=password],.ui.form .field.success input[type=search],.ui.form .field.success input[type=tel],.ui.form .field.success input[type=text],.ui.form .field.success input[type=time],.ui.form .field.success input[type=url],.ui.form .field.success select,.ui.form .field.success textarea,.ui.form .fields.success .field input:not([type]),.ui.form .fields.success .field input[type=date],.ui.form .fields.success .field input[type=datetime-local],.ui.form .fields.success .field input[type=email],.ui.form .fields.success .field input[type=file],.ui.form .fields.success .field input[type=number],.ui.form .fields.success .field input[type=password],.ui.form .fields.success .field input[type=search],.ui.form .fields.success .field input[type=tel],.ui.form .fields.success .field input[type=text],.ui.form .fields.success .field input[type=time],.ui.form .fields.success .field input[type=url],.ui.form .fields.success .field select,.ui.form .fields.success .field textarea{color:#2c662d;background:#fcfff5;border-color:#a3c293;border-radius:'';-webkit-box-shadow:none;box-shadow:none}.ui.form .field.success input:not([type]):focus,.ui.form .field.success input[type=date]:focus,.ui.form .field.success input[type=datetime-local]:focus,.ui.form .field.success input[type=email]:focus,.ui.form .field.success input[type=file]:focus,.ui.form .field.success input[type=number]:focus,.ui.form .field.success input[type=password]:focus,.ui.form .field.success input[type=search]:focus,.ui.form .field.success input[type=tel]:focus,.ui.form .field.success input[type=text]:focus,.ui.form .field.success input[type=time]:focus,.ui.form .field.success input[type=url]:focus,.ui.form .field.success select:focus,.ui.form .field.success textarea:focus{background:#fcfff5;border-color:#a3c293;color:#2c662d;-webkit-box-shadow:none;box-shadow:none}.ui.form .field.success select{-webkit-appearance:menulist-button}.ui.form .field.success .transparent.input input,.ui.form .field.success .transparent.input textarea,.ui.form .field.success input.transparent,.ui.form .field.success textarea.transparent{background-color:#fcfff5;color:#2c662d}.ui.form .success.success input:-webkit-autofill{-webkit-box-shadow:0 0 0 100px #f0fff0 inset!important;box-shadow:0 0 0 100px #f0fff0 inset!important;border-color:#bee0b3}.ui.form .success ::-webkit-input-placeholder{color:#8fcf90}.ui.form .success :-ms-input-placeholder{color:#8fcf90}.ui.form .success ::-moz-placeholder{color:#8fcf90}.ui.form .success :focus::-webkit-input-placeholder{color:#6cbf6d}.ui.form .success :focus:-ms-input-placeholder{color:#6cbf6d}.ui.form .success :focus::-moz-placeholder{color:#6cbf6d}.ui.form .field.success .ui.dropdown,.ui.form .field.success .ui.dropdown .item,.ui.form .field.success .ui.dropdown .text,.ui.form .fields.success .field .ui.dropdown,.ui.form .fields.success .field .ui.dropdown .item{background:#fcfff5;color:#2c662d}.ui.form .field.success .ui.dropdown,.ui.form .fields.success .field .ui.dropdown{border-color:#a3c293!important}.ui.form .field.success .ui.dropdown:hover,.ui.form .fields.success .field .ui.dropdown:hover{border-color:#a3c293!important}.ui.form .field.success .ui.dropdown:hover .menu,.ui.form .fields.success .field .ui.dropdown:hover .menu{border-color:#a3c293}.ui.form .field.success .ui.multiple.selection.dropdown>.label,.ui.form .fields.success .field .ui.multiple.selection.dropdown>.label{background-color:#cceacc;color:#2c662d}.ui.form .field.success .ui.dropdown .menu .item:hover,.ui.form .fields.success .field .ui.dropdown .menu .item:hover{background-color:#e9fbe9}.ui.form .field.success .ui.dropdown .menu .selected.item,.ui.form .fields.success .field .ui.dropdown .menu .selected.item{background-color:#e9fbe9}.ui.form .field.success .ui.dropdown .menu .active.item,.ui.form .fields.success .field .ui.dropdown .menu .active.item{background-color:#dafdce}.ui.form .field.success .checkbox:not(.toggle):not(.slider) .box,.ui.form .field.success .checkbox:not(.toggle):not(.slider) label,.ui.form .fields.success .field .checkbox:not(.toggle):not(.slider) .box,.ui.form .fields.success .field .checkbox:not(.toggle):not(.slider) label{color:#2c662d}.ui.form .field.success .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .field.success .checkbox:not(.toggle):not(.slider) label:before,.ui.form .fields.success .field .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .fields.success .field .checkbox:not(.toggle):not(.slider) label:before{background:#fcfff5;border-color:#a3c293}.ui.form .field.success .checkbox .box:after,.ui.form .field.success .checkbox label:after,.ui.form .fields.success .field .checkbox .box:after,.ui.form .fields.success .field .checkbox label:after{color:#2c662d}.ui.form.warning .warning.message:not(:empty){display:block}.ui.form.warning .compact.warning.message:not(:empty){display:inline-block}.ui.form.warning .icon.warning.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.form .field.warning .warning.message:not(:empty),.ui.form .fields.warning .warning.message:not(:empty){display:block}.ui.form .field.warning .compact.warning.message:not(:empty),.ui.form .fields.warning .compact.warning.message:not(:empty){display:inline-block}.ui.form .field.warning .icon.warning.message:not(:empty),.ui.form .fields.warning .icon.warning.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.ui.form .field.warning .input,.ui.ui.form .field.warning label,.ui.ui.form .fields.warning .field .input,.ui.ui.form .fields.warning .field label{color:#573a08}.ui.form .field.warning .corner.label,.ui.form .fields.warning .field .corner.label{border-color:#573a08;color:#fff}.ui.form .field.warning input:not([type]),.ui.form .field.warning input[type=date],.ui.form .field.warning input[type=datetime-local],.ui.form .field.warning input[type=email],.ui.form .field.warning input[type=file],.ui.form .field.warning input[type=number],.ui.form .field.warning input[type=password],.ui.form .field.warning input[type=search],.ui.form .field.warning input[type=tel],.ui.form .field.warning input[type=text],.ui.form .field.warning input[type=time],.ui.form .field.warning input[type=url],.ui.form .field.warning select,.ui.form .field.warning textarea,.ui.form .fields.warning .field input:not([type]),.ui.form .fields.warning .field input[type=date],.ui.form .fields.warning .field input[type=datetime-local],.ui.form .fields.warning .field input[type=email],.ui.form .fields.warning .field input[type=file],.ui.form .fields.warning .field input[type=number],.ui.form .fields.warning .field input[type=password],.ui.form .fields.warning .field input[type=search],.ui.form .fields.warning .field input[type=tel],.ui.form .fields.warning .field input[type=text],.ui.form .fields.warning .field input[type=time],.ui.form .fields.warning .field input[type=url],.ui.form .fields.warning .field select,.ui.form .fields.warning .field textarea{color:#573a08;background:#fffaf3;border-color:#c9ba9b;border-radius:'';-webkit-box-shadow:none;box-shadow:none}.ui.form .field.warning input:not([type]):focus,.ui.form .field.warning input[type=date]:focus,.ui.form .field.warning input[type=datetime-local]:focus,.ui.form .field.warning input[type=email]:focus,.ui.form .field.warning input[type=file]:focus,.ui.form .field.warning input[type=number]:focus,.ui.form .field.warning input[type=password]:focus,.ui.form .field.warning input[type=search]:focus,.ui.form .field.warning input[type=tel]:focus,.ui.form .field.warning input[type=text]:focus,.ui.form .field.warning input[type=time]:focus,.ui.form .field.warning input[type=url]:focus,.ui.form .field.warning select:focus,.ui.form .field.warning textarea:focus{background:#fffaf3;border-color:#c9ba9b;color:#573a08;-webkit-box-shadow:none;box-shadow:none}.ui.form .field.warning select{-webkit-appearance:menulist-button}.ui.form .field.warning .transparent.input input,.ui.form .field.warning .transparent.input textarea,.ui.form .field.warning input.transparent,.ui.form .field.warning textarea.transparent{background-color:#fffaf3;color:#573a08}.ui.form .warning.warning input:-webkit-autofill{-webkit-box-shadow:0 0 0 100px #ffffe0 inset!important;box-shadow:0 0 0 100px #ffffe0 inset!important;border-color:#e0e0b3}.ui.form .warning ::-webkit-input-placeholder{color:#edad3e}.ui.form .warning :-ms-input-placeholder{color:#edad3e}.ui.form .warning ::-moz-placeholder{color:#edad3e}.ui.form .warning :focus::-webkit-input-placeholder{color:#e39715}.ui.form .warning :focus:-ms-input-placeholder{color:#e39715}.ui.form .warning :focus::-moz-placeholder{color:#e39715}.ui.form .field.warning .ui.dropdown,.ui.form .field.warning .ui.dropdown .item,.ui.form .field.warning .ui.dropdown .text,.ui.form .fields.warning .field .ui.dropdown,.ui.form .fields.warning .field .ui.dropdown .item{background:#fffaf3;color:#573a08}.ui.form .field.warning .ui.dropdown,.ui.form .fields.warning .field .ui.dropdown{border-color:#c9ba9b!important}.ui.form .field.warning .ui.dropdown:hover,.ui.form .fields.warning .field .ui.dropdown:hover{border-color:#c9ba9b!important}.ui.form .field.warning .ui.dropdown:hover .menu,.ui.form .fields.warning .field .ui.dropdown:hover .menu{border-color:#c9ba9b}.ui.form .field.warning .ui.multiple.selection.dropdown>.label,.ui.form .fields.warning .field .ui.multiple.selection.dropdown>.label{background-color:#eaeacc;color:#573a08}.ui.form .field.warning .ui.dropdown .menu .item:hover,.ui.form .fields.warning .field .ui.dropdown .menu .item:hover{background-color:#fbfbe9}.ui.form .field.warning .ui.dropdown .menu .selected.item,.ui.form .fields.warning .field .ui.dropdown .menu .selected.item{background-color:#fbfbe9}.ui.form .field.warning .ui.dropdown .menu .active.item,.ui.form .fields.warning .field .ui.dropdown .menu .active.item{background-color:#fdfdce}.ui.form .field.warning .checkbox:not(.toggle):not(.slider) .box,.ui.form .field.warning .checkbox:not(.toggle):not(.slider) label,.ui.form .fields.warning .field .checkbox:not(.toggle):not(.slider) .box,.ui.form .fields.warning .field .checkbox:not(.toggle):not(.slider) label{color:#573a08}.ui.form .field.warning .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .field.warning .checkbox:not(.toggle):not(.slider) label:before,.ui.form .fields.warning .field .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .fields.warning .field .checkbox:not(.toggle):not(.slider) label:before{background:#fffaf3;border-color:#c9ba9b}.ui.form .field.warning .checkbox .box:after,.ui.form .field.warning .checkbox label:after,.ui.form .fields.warning .field .checkbox .box:after,.ui.form .fields.warning .field .checkbox label:after{color:#573a08}.ui.form .disabled.field,.ui.form .disabled.fields .field,.ui.form .field :disabled{pointer-events:none;opacity:.45}.ui.form .field.disabled>label,.ui.form .fields.disabled>label{opacity:.45}.ui.form .field.disabled :disabled{opacity:1}.ui.loading.form{position:relative;cursor:default;pointer-events:none}.ui.loading.form:before{position:absolute;content:'';top:0;left:0;background:rgba(255,255,255,.8);width:100%;height:100%;z-index:100}.ui.loading.form.segments:before{border-radius:.28571429rem}.ui.loading.form:after{position:absolute;content:'';top:50%;left:50%;margin:-1.5em 0 0 -1.5em;width:3em;height:3em;-webkit-animation:loader .6s infinite linear;animation:loader .6s infinite linear;border:.2em solid #767676;border-radius:500rem;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent;visibility:visible;z-index:101}.ui.form .required.field>.checkbox:after,.ui.form .required.field>label:after,.ui.form .required.fields.grouped>label:after,.ui.form .required.fields:not(.grouped)>.field>.checkbox:after,.ui.form .required.fields:not(.grouped)>.field>label:after,.ui.form label.required:after{margin:-.2em 0 0 .2em;content:'*';color:#db2828}.ui.form .required.field>label:after,.ui.form .required.fields.grouped>label:after,.ui.form .required.fields:not(.grouped)>.field>label:after,.ui.form label.required:after{display:inline-block;vertical-align:top}.ui.form .required.field>.checkbox:after,.ui.form .required.fields:not(.grouped)>.field>.checkbox:after{position:absolute;top:0;left:100%}.ui.form .inverted.segment .ui.checkbox .box,.ui.form .inverted.segment .ui.checkbox label,.ui.form .inverted.segment label,.ui.inverted.form .inline.field>label,.ui.inverted.form .inline.field>p,.ui.inverted.form .inline.fields .field>label,.ui.inverted.form .inline.fields .field>p,.ui.inverted.form .inline.fields>label,.ui.inverted.form .ui.checkbox .box,.ui.inverted.form .ui.checkbox label,.ui.inverted.form label{color:rgba(255,255,255,.9)}.ui.inverted.loading.form{color:#fff}.ui.inverted.loading.form:before{background:rgba(0,0,0,.85)}.ui.inverted.form input:not([type]),.ui.inverted.form input[type=date],.ui.inverted.form input[type=datetime-local],.ui.inverted.form input[type=email],.ui.inverted.form input[type=file],.ui.inverted.form input[type=number],.ui.inverted.form input[type=password],.ui.inverted.form input[type=search],.ui.inverted.form input[type=tel],.ui.inverted.form input[type=text],.ui.inverted.form input[type=time],.ui.inverted.form input[type=url]{background:#fff;border-color:rgba(255,255,255,.1);color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none}.ui.form .grouped.fields{display:block;margin:0 0 1em}.ui.form .grouped.fields:last-child{margin-bottom:0}.ui.form .grouped.fields>label{margin:0 0 .28571429rem 0;color:rgba(0,0,0,.87);font-size:.92857143em;font-weight:700;text-transform:none}.ui.form .grouped.fields .field,.ui.form .grouped.inline.fields .field{display:block;margin:.5em 0;padding:0}.ui.form .fields{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;margin:0 -.5em 1em}.ui.form .fields>.field{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;padding-left:.5em;padding-right:.5em}.ui.form .fields>.field:first-child{border-left:none;-webkit-box-shadow:none;box-shadow:none}.ui.form .two.fields>.field,.ui.form .two.fields>.fields{width:50%}.ui.form .three.fields>.field,.ui.form .three.fields>.fields{width:33.33333333%}.ui.form .four.fields>.field,.ui.form .four.fields>.fields{width:25%}.ui.form .five.fields>.field,.ui.form .five.fields>.fields{width:20%}.ui.form .six.fields>.field,.ui.form .six.fields>.fields{width:16.66666667%}.ui.form .seven.fields>.field,.ui.form .seven.fields>.fields{width:14.28571429%}.ui.form .eight.fields>.field,.ui.form .eight.fields>.fields{width:12.5%}.ui.form .nine.fields>.field,.ui.form .nine.fields>.fields{width:11.11111111%}.ui.form .ten.fields>.field,.ui.form .ten.fields>.fields{width:10%}@media only screen and (max-width:767.98px){.ui.form .fields{-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.form:not(.unstackable) .eight.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .eight.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .nine.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .nine.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .seven.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .seven.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .six.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .six.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .ten.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .ten.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) [class*="equal width"].fields:not(.unstackable)>.field,.ui[class*="equal width"].form:not(.unstackable) .fields>.field{width:100%!important;margin:0 0 1em}}.ui.form .fields .wide.field{width:6.25%;padding-left:.5em;padding-right:.5em}.ui.form .one.wide.field{width:6.25%!important}.ui.form .two.wide.field{width:12.5%!important}.ui.form .three.wide.field{width:18.75%!important}.ui.form .four.wide.field{width:25%!important}.ui.form .five.wide.field{width:31.25%!important}.ui.form .six.wide.field{width:37.5%!important}.ui.form .seven.wide.field{width:43.75%!important}.ui.form .eight.wide.field{width:50%!important}.ui.form .nine.wide.field{width:56.25%!important}.ui.form .ten.wide.field{width:62.5%!important}.ui.form .eleven.wide.field{width:68.75%!important}.ui.form .twelve.wide.field{width:75%!important}.ui.form .thirteen.wide.field{width:81.25%!important}.ui.form .fourteen.wide.field{width:87.5%!important}.ui.form .fifteen.wide.field{width:93.75%!important}.ui.form .sixteen.wide.field{width:100%!important}@media only screen and (max-width:767.98px){.ui.form:not(.unstackable) .fields:not(.unstackable)>.eight.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.eleven.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.fifteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.five.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.four.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.fourteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.nine.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.seven.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.six.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.sixteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.ten.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.thirteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.three.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.twelve.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.two.wide.field,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.fields{width:100%!important}.ui.form .fields{margin-bottom:0}}.ui.form [class*="equal width"].fields>.field,.ui[class*="equal width"].form .fields>.field{width:100%;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.ui.form .inline.fields{margin:0 0 1em;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.form .inline.fields .field{margin:0;padding:0 1em 0 0}.ui.form .inline.field>label,.ui.form .inline.field>p,.ui.form .inline.fields .field>label,.ui.form .inline.fields .field>p,.ui.form .inline.fields>label{display:inline-block;width:auto;margin-top:0;margin-bottom:0;vertical-align:baseline;font-size:.92857143em;font-weight:700;color:rgba(0,0,0,.87);text-transform:none}.ui.form .inline.fields>label{margin:.035714em 1em 0 0}.ui.form .inline.field>input,.ui.form .inline.field>select,.ui.form .inline.fields .field>input,.ui.form .inline.fields .field>select{display:inline-block;width:auto;margin-top:0;margin-bottom:0;vertical-align:middle;font-size:1em}.ui.form .inline.field>:first-child,.ui.form .inline.fields .field>:first-child{margin:0 .85714286em 0 0}.ui.form .inline.field>:only-child,.ui.form .inline.fields .field>:only-child{margin:0}.ui.form .inline.fields .wide.field{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.form .inline.fields .wide.field>input,.ui.form .inline.fields .wide.field>select{width:100%}.ui.form,.ui.form .field .dropdown,.ui.form .field .dropdown .menu>.item{font-size:1rem}.ui.mini.form,.ui.mini.form .field .dropdown,.ui.mini.form .field .dropdown .menu>.item{font-size:.78571429rem}.ui.tiny.form,.ui.tiny.form .field .dropdown,.ui.tiny.form .field .dropdown .menu>.item{font-size:.85714286rem}.ui.small.form,.ui.small.form .field .dropdown,.ui.small.form .field .dropdown .menu>.item{font-size:.92857143rem}.ui.large.form,.ui.large.form .field .dropdown,.ui.large.form .field .dropdown .menu>.item{font-size:1.14285714rem}.ui.big.form,.ui.big.form .field .dropdown,.ui.big.form .field .dropdown .menu>.item{font-size:1.28571429rem}.ui.huge.form,.ui.huge.form .field .dropdown,.ui.huge.form .field .dropdown .menu>.item{font-size:1.42857143rem}.ui.massive.form,.ui.massive.form .field .dropdown,.ui.massive.form .field .dropdown .menu>.item{font-size:1.71428571rem} + /* + * # Fomantic-UI - Grid + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */ + .ui.grid{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;padding:0}.ui.grid{margin-top:-1rem;margin-bottom:-1rem;margin-left:-1rem;margin-right:-1rem}.ui.relaxed.grid{margin-left:-1.5rem;margin-right:-1.5rem}.ui[class*="very relaxed"].grid{margin-left:-2.5rem;margin-right:-2.5rem}.ui.grid+.grid{margin-top:1rem}.ui.grid>.column:not(.row),.ui.grid>.row>.column{position:relative;display:inline-block;width:6.25%;padding-left:1rem;padding-right:1rem;vertical-align:top}.ui.grid>*{padding-left:1rem;padding-right:1rem}.ui.grid>.row{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:inherit;-ms-flex-pack:inherit;justify-content:inherit;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%!important;padding:0;padding-top:1rem;padding-bottom:1rem}.ui.grid>.column:not(.row){padding-top:1rem;padding-bottom:1rem}.ui.grid>.row>.column{margin-top:0;margin-bottom:0}.ui.grid>.row>.column>img,.ui.grid>.row>img{max-width:100%}.ui.grid>.ui.grid:first-child{margin-top:0}.ui.grid>.ui.grid:last-child{margin-bottom:0}.ui.aligned.grid .column>.segment:not(.compact):not(.attached),.ui.grid .aligned.row>.column>.segment:not(.compact):not(.attached){width:100%}.ui.grid .row+.ui.divider{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin:1rem 1rem}.ui.grid .column+.ui.vertical.divider{height:calc(50% - 1rem)}.ui.grid>.column:last-child>.horizontal.segment,.ui.grid>.row>.column:last-child>.horizontal.segment{-webkit-box-shadow:none;box-shadow:none}@media only screen and (max-width:767.98px){.ui.page.grid{width:auto;padding-left:0;padding-right:0;margin-left:0;margin-right:0}}@media only screen and (min-width:768px) and (max-width:991.98px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:2em;padding-right:2em}}@media only screen and (min-width:992px) and (max-width:1199.98px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:3%;padding-right:3%}}@media only screen and (min-width:1200px) and (max-width:1919.98px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:15%;padding-right:15%}}@media only screen and (min-width:1920px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:23%;padding-right:23%}}.ui.grid>.column:only-child,.ui.grid>.row>.column:only-child{width:100%}.ui[class*="one column"].grid>.column:not(.row),.ui[class*="one column"].grid>.row>.column{width:100%}.ui[class*="two column"].grid>.column:not(.row),.ui[class*="two column"].grid>.row>.column{width:50%}.ui[class*="three column"].grid>.column:not(.row),.ui[class*="three column"].grid>.row>.column{width:33.33333333%}.ui[class*="four column"].grid>.column:not(.row),.ui[class*="four column"].grid>.row>.column{width:25%}.ui[class*="five column"].grid>.column:not(.row),.ui[class*="five column"].grid>.row>.column{width:20%}.ui[class*="six column"].grid>.column:not(.row),.ui[class*="six column"].grid>.row>.column{width:16.66666667%}.ui[class*="seven column"].grid>.column:not(.row),.ui[class*="seven column"].grid>.row>.column{width:14.28571429%}.ui[class*="eight column"].grid>.column:not(.row),.ui[class*="eight column"].grid>.row>.column{width:12.5%}.ui[class*="nine column"].grid>.column:not(.row),.ui[class*="nine column"].grid>.row>.column{width:11.11111111%}.ui[class*="ten column"].grid>.column:not(.row),.ui[class*="ten column"].grid>.row>.column{width:10%}.ui[class*="eleven column"].grid>.column:not(.row),.ui[class*="eleven column"].grid>.row>.column{width:9.09090909%}.ui[class*="twelve column"].grid>.column:not(.row),.ui[class*="twelve column"].grid>.row>.column{width:8.33333333%}.ui[class*="thirteen column"].grid>.column:not(.row),.ui[class*="thirteen column"].grid>.row>.column{width:7.69230769%}.ui[class*="fourteen column"].grid>.column:not(.row),.ui[class*="fourteen column"].grid>.row>.column{width:7.14285714%}.ui[class*="fifteen column"].grid>.column:not(.row),.ui[class*="fifteen column"].grid>.row>.column{width:6.66666667%}.ui[class*="sixteen column"].grid>.column:not(.row),.ui[class*="sixteen column"].grid>.row>.column{width:6.25%}.ui.grid>[class*="one column"].row>.column{width:100%!important}.ui.grid>[class*="two column"].row>.column{width:50%!important}.ui.grid>[class*="three column"].row>.column{width:33.33333333%!important}.ui.grid>[class*="four column"].row>.column{width:25%!important}.ui.grid>[class*="five column"].row>.column{width:20%!important}.ui.grid>[class*="six column"].row>.column{width:16.66666667%!important}.ui.grid>[class*="seven column"].row>.column{width:14.28571429%!important}.ui.grid>[class*="eight column"].row>.column{width:12.5%!important}.ui.grid>[class*="nine column"].row>.column{width:11.11111111%!important}.ui.grid>[class*="ten column"].row>.column{width:10%!important}.ui.grid>[class*="eleven column"].row>.column{width:9.09090909%!important}.ui.grid>[class*="twelve column"].row>.column{width:8.33333333%!important}.ui.grid>[class*="thirteen column"].row>.column{width:7.69230769%!important}.ui.grid>[class*="fourteen column"].row>.column{width:7.14285714%!important}.ui.grid>[class*="fifteen column"].row>.column{width:6.66666667%!important}.ui.grid>[class*="sixteen column"].row>.column{width:6.25%!important}.ui.celled.page.grid{-webkit-box-shadow:none;box-shadow:none}.ui.column.grid>[class*="one wide"].column,.ui.grid>.column.row>[class*="one wide"].column,.ui.grid>.row>[class*="one wide"].column,.ui.grid>[class*="one wide"].column{width:6.25%!important}.ui.column.grid>[class*="two wide"].column,.ui.grid>.column.row>[class*="two wide"].column,.ui.grid>.row>[class*="two wide"].column,.ui.grid>[class*="two wide"].column{width:12.5%!important}.ui.column.grid>[class*="three wide"].column,.ui.grid>.column.row>[class*="three wide"].column,.ui.grid>.row>[class*="three wide"].column,.ui.grid>[class*="three wide"].column{width:18.75%!important}.ui.column.grid>[class*="four wide"].column,.ui.grid>.column.row>[class*="four wide"].column,.ui.grid>.row>[class*="four wide"].column,.ui.grid>[class*="four wide"].column{width:25%!important}.ui.column.grid>[class*="five wide"].column,.ui.grid>.column.row>[class*="five wide"].column,.ui.grid>.row>[class*="five wide"].column,.ui.grid>[class*="five wide"].column{width:31.25%!important}.ui.column.grid>[class*="six wide"].column,.ui.grid>.column.row>[class*="six wide"].column,.ui.grid>.row>[class*="six wide"].column,.ui.grid>[class*="six wide"].column{width:37.5%!important}.ui.column.grid>[class*="seven wide"].column,.ui.grid>.column.row>[class*="seven wide"].column,.ui.grid>.row>[class*="seven wide"].column,.ui.grid>[class*="seven wide"].column{width:43.75%!important}.ui.column.grid>[class*="eight wide"].column,.ui.grid>.column.row>[class*="eight wide"].column,.ui.grid>.row>[class*="eight wide"].column,.ui.grid>[class*="eight wide"].column{width:50%!important}.ui.column.grid>[class*="nine wide"].column,.ui.grid>.column.row>[class*="nine wide"].column,.ui.grid>.row>[class*="nine wide"].column,.ui.grid>[class*="nine wide"].column{width:56.25%!important}.ui.column.grid>[class*="ten wide"].column,.ui.grid>.column.row>[class*="ten wide"].column,.ui.grid>.row>[class*="ten wide"].column,.ui.grid>[class*="ten wide"].column{width:62.5%!important}.ui.column.grid>[class*="eleven wide"].column,.ui.grid>.column.row>[class*="eleven wide"].column,.ui.grid>.row>[class*="eleven wide"].column,.ui.grid>[class*="eleven wide"].column{width:68.75%!important}.ui.column.grid>[class*="twelve wide"].column,.ui.grid>.column.row>[class*="twelve wide"].column,.ui.grid>.row>[class*="twelve wide"].column,.ui.grid>[class*="twelve wide"].column{width:75%!important}.ui.column.grid>[class*="thirteen wide"].column,.ui.grid>.column.row>[class*="thirteen wide"].column,.ui.grid>.row>[class*="thirteen wide"].column,.ui.grid>[class*="thirteen wide"].column{width:81.25%!important}.ui.column.grid>[class*="fourteen wide"].column,.ui.grid>.column.row>[class*="fourteen wide"].column,.ui.grid>.row>[class*="fourteen wide"].column,.ui.grid>[class*="fourteen wide"].column{width:87.5%!important}.ui.column.grid>[class*="fifteen wide"].column,.ui.grid>.column.row>[class*="fifteen wide"].column,.ui.grid>.row>[class*="fifteen wide"].column,.ui.grid>[class*="fifteen wide"].column{width:93.75%!important}.ui.column.grid>[class*="sixteen wide"].column,.ui.grid>.column.row>[class*="sixteen wide"].column,.ui.grid>.row>[class*="sixteen wide"].column,.ui.grid>[class*="sixteen wide"].column{width:100%!important}@media only screen and (min-width:320px) and (max-width:767.98px){.ui.column.grid>[class*="one wide mobile"].column,.ui.grid>.column.row>[class*="one wide mobile"].column,.ui.grid>.row>[class*="one wide mobile"].column,.ui.grid>[class*="one wide mobile"].column{width:6.25%!important}.ui.column.grid>[class*="two wide mobile"].column,.ui.grid>.column.row>[class*="two wide mobile"].column,.ui.grid>.row>[class*="two wide mobile"].column,.ui.grid>[class*="two wide mobile"].column{width:12.5%!important}.ui.column.grid>[class*="three wide mobile"].column,.ui.grid>.column.row>[class*="three wide mobile"].column,.ui.grid>.row>[class*="three wide mobile"].column,.ui.grid>[class*="three wide mobile"].column{width:18.75%!important}.ui.column.grid>[class*="four wide mobile"].column,.ui.grid>.column.row>[class*="four wide mobile"].column,.ui.grid>.row>[class*="four wide mobile"].column,.ui.grid>[class*="four wide mobile"].column{width:25%!important}.ui.column.grid>[class*="five wide mobile"].column,.ui.grid>.column.row>[class*="five wide mobile"].column,.ui.grid>.row>[class*="five wide mobile"].column,.ui.grid>[class*="five wide mobile"].column{width:31.25%!important}.ui.column.grid>[class*="six wide mobile"].column,.ui.grid>.column.row>[class*="six wide mobile"].column,.ui.grid>.row>[class*="six wide mobile"].column,.ui.grid>[class*="six wide mobile"].column{width:37.5%!important}.ui.column.grid>[class*="seven wide mobile"].column,.ui.grid>.column.row>[class*="seven wide mobile"].column,.ui.grid>.row>[class*="seven wide mobile"].column,.ui.grid>[class*="seven wide mobile"].column{width:43.75%!important}.ui.column.grid>[class*="eight wide mobile"].column,.ui.grid>.column.row>[class*="eight wide mobile"].column,.ui.grid>.row>[class*="eight wide mobile"].column,.ui.grid>[class*="eight wide mobile"].column{width:50%!important}.ui.column.grid>[class*="nine wide mobile"].column,.ui.grid>.column.row>[class*="nine wide mobile"].column,.ui.grid>.row>[class*="nine wide mobile"].column,.ui.grid>[class*="nine wide mobile"].column{width:56.25%!important}.ui.column.grid>[class*="ten wide mobile"].column,.ui.grid>.column.row>[class*="ten wide mobile"].column,.ui.grid>.row>[class*="ten wide mobile"].column,.ui.grid>[class*="ten wide mobile"].column{width:62.5%!important}.ui.column.grid>[class*="eleven wide mobile"].column,.ui.grid>.column.row>[class*="eleven wide mobile"].column,.ui.grid>.row>[class*="eleven wide mobile"].column,.ui.grid>[class*="eleven wide mobile"].column{width:68.75%!important}.ui.column.grid>[class*="twelve wide mobile"].column,.ui.grid>.column.row>[class*="twelve wide mobile"].column,.ui.grid>.row>[class*="twelve wide mobile"].column,.ui.grid>[class*="twelve wide mobile"].column{width:75%!important}.ui.column.grid>[class*="thirteen wide mobile"].column,.ui.grid>.column.row>[class*="thirteen wide mobile"].column,.ui.grid>.row>[class*="thirteen wide mobile"].column,.ui.grid>[class*="thirteen wide mobile"].column{width:81.25%!important}.ui.column.grid>[class*="fourteen wide mobile"].column,.ui.grid>.column.row>[class*="fourteen wide mobile"].column,.ui.grid>.row>[class*="fourteen wide mobile"].column,.ui.grid>[class*="fourteen wide mobile"].column{width:87.5%!important}.ui.column.grid>[class*="fifteen wide mobile"].column,.ui.grid>.column.row>[class*="fifteen wide mobile"].column,.ui.grid>.row>[class*="fifteen wide mobile"].column,.ui.grid>[class*="fifteen wide mobile"].column{width:93.75%!important}.ui.column.grid>[class*="sixteen wide mobile"].column,.ui.grid>.column.row>[class*="sixteen wide mobile"].column,.ui.grid>.row>[class*="sixteen wide mobile"].column,.ui.grid>[class*="sixteen wide mobile"].column{width:100%!important}}@media only screen and (min-width:768px) and (max-width:991.98px){.ui.column.grid>[class*="one wide tablet"].column,.ui.grid>.column.row>[class*="one wide tablet"].column,.ui.grid>.row>[class*="one wide tablet"].column,.ui.grid>[class*="one wide tablet"].column{width:6.25%!important}.ui.column.grid>[class*="two wide tablet"].column,.ui.grid>.column.row>[class*="two wide tablet"].column,.ui.grid>.row>[class*="two wide tablet"].column,.ui.grid>[class*="two wide tablet"].column{width:12.5%!important}.ui.column.grid>[class*="three wide tablet"].column,.ui.grid>.column.row>[class*="three wide tablet"].column,.ui.grid>.row>[class*="three wide tablet"].column,.ui.grid>[class*="three wide tablet"].column{width:18.75%!important}.ui.column.grid>[class*="four wide tablet"].column,.ui.grid>.column.row>[class*="four wide tablet"].column,.ui.grid>.row>[class*="four wide tablet"].column,.ui.grid>[class*="four wide tablet"].column{width:25%!important}.ui.column.grid>[class*="five wide tablet"].column,.ui.grid>.column.row>[class*="five wide tablet"].column,.ui.grid>.row>[class*="five wide tablet"].column,.ui.grid>[class*="five wide tablet"].column{width:31.25%!important}.ui.column.grid>[class*="six wide tablet"].column,.ui.grid>.column.row>[class*="six wide tablet"].column,.ui.grid>.row>[class*="six wide tablet"].column,.ui.grid>[class*="six wide tablet"].column{width:37.5%!important}.ui.column.grid>[class*="seven wide tablet"].column,.ui.grid>.column.row>[class*="seven wide tablet"].column,.ui.grid>.row>[class*="seven wide tablet"].column,.ui.grid>[class*="seven wide tablet"].column{width:43.75%!important}.ui.column.grid>[class*="eight wide tablet"].column,.ui.grid>.column.row>[class*="eight wide tablet"].column,.ui.grid>.row>[class*="eight wide tablet"].column,.ui.grid>[class*="eight wide tablet"].column{width:50%!important}.ui.column.grid>[class*="nine wide tablet"].column,.ui.grid>.column.row>[class*="nine wide tablet"].column,.ui.grid>.row>[class*="nine wide tablet"].column,.ui.grid>[class*="nine wide tablet"].column{width:56.25%!important}.ui.column.grid>[class*="ten wide tablet"].column,.ui.grid>.column.row>[class*="ten wide tablet"].column,.ui.grid>.row>[class*="ten wide tablet"].column,.ui.grid>[class*="ten wide tablet"].column{width:62.5%!important}.ui.column.grid>[class*="eleven wide tablet"].column,.ui.grid>.column.row>[class*="eleven wide tablet"].column,.ui.grid>.row>[class*="eleven wide tablet"].column,.ui.grid>[class*="eleven wide tablet"].column{width:68.75%!important}.ui.column.grid>[class*="twelve wide tablet"].column,.ui.grid>.column.row>[class*="twelve wide tablet"].column,.ui.grid>.row>[class*="twelve wide tablet"].column,.ui.grid>[class*="twelve wide tablet"].column{width:75%!important}.ui.column.grid>[class*="thirteen wide tablet"].column,.ui.grid>.column.row>[class*="thirteen wide tablet"].column,.ui.grid>.row>[class*="thirteen wide tablet"].column,.ui.grid>[class*="thirteen wide tablet"].column{width:81.25%!important}.ui.column.grid>[class*="fourteen wide tablet"].column,.ui.grid>.column.row>[class*="fourteen wide tablet"].column,.ui.grid>.row>[class*="fourteen wide tablet"].column,.ui.grid>[class*="fourteen wide tablet"].column{width:87.5%!important}.ui.column.grid>[class*="fifteen wide tablet"].column,.ui.grid>.column.row>[class*="fifteen wide tablet"].column,.ui.grid>.row>[class*="fifteen wide tablet"].column,.ui.grid>[class*="fifteen wide tablet"].column{width:93.75%!important}.ui.column.grid>[class*="sixteen wide tablet"].column,.ui.grid>.column.row>[class*="sixteen wide tablet"].column,.ui.grid>.row>[class*="sixteen wide tablet"].column,.ui.grid>[class*="sixteen wide tablet"].column{width:100%!important}}@media only screen and (min-width:992px){.ui.column.grid>[class*="one wide computer"].column,.ui.grid>.column.row>[class*="one wide computer"].column,.ui.grid>.row>[class*="one wide computer"].column,.ui.grid>[class*="one wide computer"].column{width:6.25%!important}.ui.column.grid>[class*="two wide computer"].column,.ui.grid>.column.row>[class*="two wide computer"].column,.ui.grid>.row>[class*="two wide computer"].column,.ui.grid>[class*="two wide computer"].column{width:12.5%!important}.ui.column.grid>[class*="three wide computer"].column,.ui.grid>.column.row>[class*="three wide computer"].column,.ui.grid>.row>[class*="three wide computer"].column,.ui.grid>[class*="three wide computer"].column{width:18.75%!important}.ui.column.grid>[class*="four wide computer"].column,.ui.grid>.column.row>[class*="four wide computer"].column,.ui.grid>.row>[class*="four wide computer"].column,.ui.grid>[class*="four wide computer"].column{width:25%!important}.ui.column.grid>[class*="five wide computer"].column,.ui.grid>.column.row>[class*="five wide computer"].column,.ui.grid>.row>[class*="five wide computer"].column,.ui.grid>[class*="five wide computer"].column{width:31.25%!important}.ui.column.grid>[class*="six wide computer"].column,.ui.grid>.column.row>[class*="six wide computer"].column,.ui.grid>.row>[class*="six wide computer"].column,.ui.grid>[class*="six wide computer"].column{width:37.5%!important}.ui.column.grid>[class*="seven wide computer"].column,.ui.grid>.column.row>[class*="seven wide computer"].column,.ui.grid>.row>[class*="seven wide computer"].column,.ui.grid>[class*="seven wide computer"].column{width:43.75%!important}.ui.column.grid>[class*="eight wide computer"].column,.ui.grid>.column.row>[class*="eight wide computer"].column,.ui.grid>.row>[class*="eight wide computer"].column,.ui.grid>[class*="eight wide computer"].column{width:50%!important}.ui.column.grid>[class*="nine wide computer"].column,.ui.grid>.column.row>[class*="nine wide computer"].column,.ui.grid>.row>[class*="nine wide computer"].column,.ui.grid>[class*="nine wide computer"].column{width:56.25%!important}.ui.column.grid>[class*="ten wide computer"].column,.ui.grid>.column.row>[class*="ten wide computer"].column,.ui.grid>.row>[class*="ten wide computer"].column,.ui.grid>[class*="ten wide computer"].column{width:62.5%!important}.ui.column.grid>[class*="eleven wide computer"].column,.ui.grid>.column.row>[class*="eleven wide computer"].column,.ui.grid>.row>[class*="eleven wide computer"].column,.ui.grid>[class*="eleven wide computer"].column{width:68.75%!important}.ui.column.grid>[class*="twelve wide computer"].column,.ui.grid>.column.row>[class*="twelve wide computer"].column,.ui.grid>.row>[class*="twelve wide computer"].column,.ui.grid>[class*="twelve wide computer"].column{width:75%!important}.ui.column.grid>[class*="thirteen wide computer"].column,.ui.grid>.column.row>[class*="thirteen wide computer"].column,.ui.grid>.row>[class*="thirteen wide computer"].column,.ui.grid>[class*="thirteen wide computer"].column{width:81.25%!important}.ui.column.grid>[class*="fourteen wide computer"].column,.ui.grid>.column.row>[class*="fourteen wide computer"].column,.ui.grid>.row>[class*="fourteen wide computer"].column,.ui.grid>[class*="fourteen wide computer"].column{width:87.5%!important}.ui.column.grid>[class*="fifteen wide computer"].column,.ui.grid>.column.row>[class*="fifteen wide computer"].column,.ui.grid>.row>[class*="fifteen wide computer"].column,.ui.grid>[class*="fifteen wide computer"].column{width:93.75%!important}.ui.column.grid>[class*="sixteen wide computer"].column,.ui.grid>.column.row>[class*="sixteen wide computer"].column,.ui.grid>.row>[class*="sixteen wide computer"].column,.ui.grid>[class*="sixteen wide computer"].column{width:100%!important}}@media only screen and (min-width:1200px) and (max-width:1919.98px){.ui.column.grid>[class*="one wide large screen"].column,.ui.grid>.column.row>[class*="one wide large screen"].column,.ui.grid>.row>[class*="one wide large screen"].column,.ui.grid>[class*="one wide large screen"].column{width:6.25%!important}.ui.column.grid>[class*="two wide large screen"].column,.ui.grid>.column.row>[class*="two wide large screen"].column,.ui.grid>.row>[class*="two wide large screen"].column,.ui.grid>[class*="two wide large screen"].column{width:12.5%!important}.ui.column.grid>[class*="three wide large screen"].column,.ui.grid>.column.row>[class*="three wide large screen"].column,.ui.grid>.row>[class*="three wide large screen"].column,.ui.grid>[class*="three wide large screen"].column{width:18.75%!important}.ui.column.grid>[class*="four wide large screen"].column,.ui.grid>.column.row>[class*="four wide large screen"].column,.ui.grid>.row>[class*="four wide large screen"].column,.ui.grid>[class*="four wide large screen"].column{width:25%!important}.ui.column.grid>[class*="five wide large screen"].column,.ui.grid>.column.row>[class*="five wide large screen"].column,.ui.grid>.row>[class*="five wide large screen"].column,.ui.grid>[class*="five wide large screen"].column{width:31.25%!important}.ui.column.grid>[class*="six wide large screen"].column,.ui.grid>.column.row>[class*="six wide large screen"].column,.ui.grid>.row>[class*="six wide large screen"].column,.ui.grid>[class*="six wide large screen"].column{width:37.5%!important}.ui.column.grid>[class*="seven wide large screen"].column,.ui.grid>.column.row>[class*="seven wide large screen"].column,.ui.grid>.row>[class*="seven wide large screen"].column,.ui.grid>[class*="seven wide large screen"].column{width:43.75%!important}.ui.column.grid>[class*="eight wide large screen"].column,.ui.grid>.column.row>[class*="eight wide large screen"].column,.ui.grid>.row>[class*="eight wide large screen"].column,.ui.grid>[class*="eight wide large screen"].column{width:50%!important}.ui.column.grid>[class*="nine wide large screen"].column,.ui.grid>.column.row>[class*="nine wide large screen"].column,.ui.grid>.row>[class*="nine wide large screen"].column,.ui.grid>[class*="nine wide large screen"].column{width:56.25%!important}.ui.column.grid>[class*="ten wide large screen"].column,.ui.grid>.column.row>[class*="ten wide large screen"].column,.ui.grid>.row>[class*="ten wide large screen"].column,.ui.grid>[class*="ten wide large screen"].column{width:62.5%!important}.ui.column.grid>[class*="eleven wide large screen"].column,.ui.grid>.column.row>[class*="eleven wide large screen"].column,.ui.grid>.row>[class*="eleven wide large screen"].column,.ui.grid>[class*="eleven wide large screen"].column{width:68.75%!important}.ui.column.grid>[class*="twelve wide large screen"].column,.ui.grid>.column.row>[class*="twelve wide large screen"].column,.ui.grid>.row>[class*="twelve wide large screen"].column,.ui.grid>[class*="twelve wide large screen"].column{width:75%!important}.ui.column.grid>[class*="thirteen wide large screen"].column,.ui.grid>.column.row>[class*="thirteen wide large screen"].column,.ui.grid>.row>[class*="thirteen wide large screen"].column,.ui.grid>[class*="thirteen wide large screen"].column{width:81.25%!important}.ui.column.grid>[class*="fourteen wide large screen"].column,.ui.grid>.column.row>[class*="fourteen wide large screen"].column,.ui.grid>.row>[class*="fourteen wide large screen"].column,.ui.grid>[class*="fourteen wide large screen"].column{width:87.5%!important}.ui.column.grid>[class*="fifteen wide large screen"].column,.ui.grid>.column.row>[class*="fifteen wide large screen"].column,.ui.grid>.row>[class*="fifteen wide large screen"].column,.ui.grid>[class*="fifteen wide large screen"].column{width:93.75%!important}.ui.column.grid>[class*="sixteen wide large screen"].column,.ui.grid>.column.row>[class*="sixteen wide large screen"].column,.ui.grid>.row>[class*="sixteen wide large screen"].column,.ui.grid>[class*="sixteen wide large screen"].column{width:100%!important}}@media only screen and (min-width:1920px){.ui.column.grid>[class*="one wide widescreen"].column,.ui.grid>.column.row>[class*="one wide widescreen"].column,.ui.grid>.row>[class*="one wide widescreen"].column,.ui.grid>[class*="one wide widescreen"].column{width:6.25%!important}.ui.column.grid>[class*="two wide widescreen"].column,.ui.grid>.column.row>[class*="two wide widescreen"].column,.ui.grid>.row>[class*="two wide widescreen"].column,.ui.grid>[class*="two wide widescreen"].column{width:12.5%!important}.ui.column.grid>[class*="three wide widescreen"].column,.ui.grid>.column.row>[class*="three wide widescreen"].column,.ui.grid>.row>[class*="three wide widescreen"].column,.ui.grid>[class*="three wide widescreen"].column{width:18.75%!important}.ui.column.grid>[class*="four wide widescreen"].column,.ui.grid>.column.row>[class*="four wide widescreen"].column,.ui.grid>.row>[class*="four wide widescreen"].column,.ui.grid>[class*="four wide widescreen"].column{width:25%!important}.ui.column.grid>[class*="five wide widescreen"].column,.ui.grid>.column.row>[class*="five wide widescreen"].column,.ui.grid>.row>[class*="five wide widescreen"].column,.ui.grid>[class*="five wide widescreen"].column{width:31.25%!important}.ui.column.grid>[class*="six wide widescreen"].column,.ui.grid>.column.row>[class*="six wide widescreen"].column,.ui.grid>.row>[class*="six wide widescreen"].column,.ui.grid>[class*="six wide widescreen"].column{width:37.5%!important}.ui.column.grid>[class*="seven wide widescreen"].column,.ui.grid>.column.row>[class*="seven wide widescreen"].column,.ui.grid>.row>[class*="seven wide widescreen"].column,.ui.grid>[class*="seven wide widescreen"].column{width:43.75%!important}.ui.column.grid>[class*="eight wide widescreen"].column,.ui.grid>.column.row>[class*="eight wide widescreen"].column,.ui.grid>.row>[class*="eight wide widescreen"].column,.ui.grid>[class*="eight wide widescreen"].column{width:50%!important}.ui.column.grid>[class*="nine wide widescreen"].column,.ui.grid>.column.row>[class*="nine wide widescreen"].column,.ui.grid>.row>[class*="nine wide widescreen"].column,.ui.grid>[class*="nine wide widescreen"].column{width:56.25%!important}.ui.column.grid>[class*="ten wide widescreen"].column,.ui.grid>.column.row>[class*="ten wide widescreen"].column,.ui.grid>.row>[class*="ten wide widescreen"].column,.ui.grid>[class*="ten wide widescreen"].column{width:62.5%!important}.ui.column.grid>[class*="eleven wide widescreen"].column,.ui.grid>.column.row>[class*="eleven wide widescreen"].column,.ui.grid>.row>[class*="eleven wide widescreen"].column,.ui.grid>[class*="eleven wide widescreen"].column{width:68.75%!important}.ui.column.grid>[class*="twelve wide widescreen"].column,.ui.grid>.column.row>[class*="twelve wide widescreen"].column,.ui.grid>.row>[class*="twelve wide widescreen"].column,.ui.grid>[class*="twelve wide widescreen"].column{width:75%!important}.ui.column.grid>[class*="thirteen wide widescreen"].column,.ui.grid>.column.row>[class*="thirteen wide widescreen"].column,.ui.grid>.row>[class*="thirteen wide widescreen"].column,.ui.grid>[class*="thirteen wide widescreen"].column{width:81.25%!important}.ui.column.grid>[class*="fourteen wide widescreen"].column,.ui.grid>.column.row>[class*="fourteen wide widescreen"].column,.ui.grid>.row>[class*="fourteen wide widescreen"].column,.ui.grid>[class*="fourteen wide widescreen"].column{width:87.5%!important}.ui.column.grid>[class*="fifteen wide widescreen"].column,.ui.grid>.column.row>[class*="fifteen wide widescreen"].column,.ui.grid>.row>[class*="fifteen wide widescreen"].column,.ui.grid>[class*="fifteen wide widescreen"].column{width:93.75%!important}.ui.column.grid>[class*="sixteen wide widescreen"].column,.ui.grid>.column.row>[class*="sixteen wide widescreen"].column,.ui.grid>.row>[class*="sixteen wide widescreen"].column,.ui.grid>[class*="sixteen wide widescreen"].column{width:100%!important}}.ui.centered.grid,.ui.centered.grid>.row,.ui.grid>.centered.row{text-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.centered.grid>.column:not(.aligned):not(.justified):not(.row),.ui.centered.grid>.row>.column:not(.aligned):not(.justified),.ui.grid .centered.row>.column:not(.aligned):not(.justified){text-align:left}.ui.grid>.centered.column,.ui.grid>.row>.centered.column{display:block;margin-left:auto;margin-right:auto}.ui.grid>.relaxed.row>.column,.ui.relaxed.grid>.column:not(.row),.ui.relaxed.grid>.row>.column{padding-left:1.5rem;padding-right:1.5rem}.ui.grid>[class*="very relaxed"].row>.column,.ui[class*="very relaxed"].grid>.column:not(.row),.ui[class*="very relaxed"].grid>.row>.column{padding-left:2.5rem;padding-right:2.5rem}.ui.grid .relaxed.row+.ui.divider,.ui.relaxed.grid .row+.ui.divider{margin-left:1.5rem;margin-right:1.5rem}.ui.grid [class*="very relaxed"].row+.ui.divider,.ui[class*="very relaxed"].grid .row+.ui.divider{margin-left:2.5rem;margin-right:2.5rem}.ui.padded.grid:not(.vertically):not(.horizontally){margin:0!important}[class*="horizontally padded"].ui.grid{margin-left:0!important;margin-right:0!important}[class*="vertically padded"].ui.grid{margin-top:0!important;margin-bottom:0!important}.ui.grid [class*="left floated"].column{margin-right:auto}.ui.grid [class*="right floated"].column{margin-left:auto}.ui.divided.grid:not([class*="vertically divided"])>.column:not(.row),.ui.divided.grid:not([class*="vertically divided"])>.row>.column{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*="vertically divided"].grid>.column:not(.row),.ui[class*="vertically divided"].grid>.row>.column{margin-top:1rem;margin-bottom:1rem;padding-top:0;padding-bottom:0}.ui[class*="vertically divided"].grid>.row{margin-top:0;margin-bottom:0}.ui.divided.grid:not([class*="vertically divided"])>.column:first-child,.ui.divided.grid:not([class*="vertically divided"])>.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui[class*="vertically divided"].grid>.row:first-child>.column{margin-top:0}.ui.grid>.divided.row>.column{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui.grid>.divided.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui[class*="vertically divided"].grid>.row{position:relative}.ui[class*="vertically divided"].grid>.row:before{position:absolute;content:"";top:0;left:0;width:calc(100% - 2rem);height:1px;margin:0 1rem;-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.padded.divided.grid:not(.vertically):not(.horizontally),[class*="horizontally padded"].ui.divided.grid{width:100%}.ui[class*="vertically divided"].grid>.row:first-child:before{-webkit-box-shadow:none;box-shadow:none}.ui.inverted.divided.grid:not([class*="vertically divided"])>.column:not(.row),.ui.inverted.divided.grid:not([class*="vertically divided"])>.row>.column{-webkit-box-shadow:-1px 0 0 0 rgba(255,255,255,.1);box-shadow:-1px 0 0 0 rgba(255,255,255,.1)}.ui.inverted.divided.grid:not([class*="vertically divided"])>.column:not(.row):first-child,.ui.inverted.divided.grid:not([class*="vertically divided"])>.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui.inverted[class*="vertically divided"].grid>.row:before{-webkit-box-shadow:0 -1px 0 0 rgba(255,255,255,.1);box-shadow:0 -1px 0 0 rgba(255,255,255,.1)}.ui.relaxed[class*="vertically divided"].grid>.row:before{margin-left:1.5rem;margin-right:1.5rem;width:calc(100% - 3rem)}.ui[class*="very relaxed"][class*="vertically divided"].grid>.row:before{margin-left:2.5rem;margin-right:2.5rem;width:calc(100% - 5rem)}.ui.celled.grid{width:100%;margin:1em 0;-webkit-box-shadow:0 0 0 1px #d4d4d5;box-shadow:0 0 0 1px #d4d4d5}.ui.celled.grid>.row{width:100%!important;margin:0;padding:0;-webkit-box-shadow:0 -1px 0 0 #d4d4d5;box-shadow:0 -1px 0 0 #d4d4d5}.ui.celled.grid>.column:not(.row),.ui.celled.grid>.row>.column{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui.celled.grid>.column:first-child,.ui.celled.grid>.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui.celled.grid>.column:not(.row),.ui.celled.grid>.row>.column{padding:1em}.ui.relaxed.celled.grid>.column:not(.row),.ui.relaxed.celled.grid>.row>.column{padding:1.5em}.ui[class*="very relaxed"].celled.grid>.column:not(.row),.ui[class*="very relaxed"].celled.grid>.row>.column{padding:2em}.ui[class*="internally celled"].grid{-webkit-box-shadow:none;box-shadow:none;margin:0}.ui[class*="internally celled"].grid>.row:first-child{-webkit-box-shadow:none;box-shadow:none}.ui[class*="internally celled"].grid>.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui.grid>.row>[class*="top aligned"].column,.ui.grid>[class*="top aligned"].column:not(.row),.ui.grid>[class*="top aligned"].row>.column,.ui[class*="top aligned"].grid>.column:not(.row),.ui[class*="top aligned"].grid>.row>.column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;vertical-align:top;-ms-flex-item-align:start!important;align-self:flex-start!important}.ui.grid>.row>[class*="middle aligned"].column,.ui.grid>[class*="middle aligned"].column:not(.row),.ui.grid>[class*="middle aligned"].row>.column,.ui[class*="middle aligned"].grid>.column:not(.row),.ui[class*="middle aligned"].grid>.row>.column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;vertical-align:middle;-ms-flex-item-align:center!important;align-self:center!important}.ui.grid>.row>[class*="bottom aligned"].column,.ui.grid>[class*="bottom aligned"].column:not(.row),.ui.grid>[class*="bottom aligned"].row>.column,.ui[class*="bottom aligned"].grid>.column:not(.row),.ui[class*="bottom aligned"].grid>.row>.column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;vertical-align:bottom;-ms-flex-item-align:end!important;align-self:flex-end!important}.ui.grid>.row>.stretched.column,.ui.grid>.stretched.column:not(.row),.ui.grid>.stretched.row>.column,.ui.stretched.grid>.column,.ui.stretched.grid>.row>.column{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important;-ms-flex-item-align:stretch;align-self:stretch;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.grid>.row>.stretched.column>*,.ui.grid>.stretched.column:not(.row)>*,.ui.grid>.stretched.row>.column>*,.ui.stretched.grid>.column>*,.ui.stretched.grid>.row>.column>*{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.ui.grid>.row>[class*="left aligned"].column.column,.ui.grid>[class*="left aligned"].column.column,.ui.grid>[class*="left aligned"].row>.column,.ui[class*="left aligned"].grid>.column,.ui[class*="left aligned"].grid>.row>.column{text-align:left;-ms-flex-item-align:inherit;align-self:inherit}.ui.grid>.row>[class*="center aligned"].column.column,.ui.grid>[class*="center aligned"].column.column,.ui.grid>[class*="center aligned"].row>.column,.ui[class*="center aligned"].grid>.column,.ui[class*="center aligned"].grid>.row>.column{text-align:center;-ms-flex-item-align:inherit;align-self:inherit}.ui[class*="center aligned"].grid{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.grid>.row>[class*="right aligned"].column.column,.ui.grid>[class*="right aligned"].column.column,.ui.grid>[class*="right aligned"].row>.column,.ui[class*="right aligned"].grid>.column,.ui[class*="right aligned"].grid>.row>.column{text-align:right;-ms-flex-item-align:inherit;align-self:inherit}.ui.grid>.justified.column.column,.ui.grid>.justified.row>.column,.ui.grid>.row>.justified.column.column,.ui.justified.grid>.column,.ui.justified.grid>.row>.column{text-align:justify;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.ui.grid>.primary.column,.ui.grid>.primary.row,.ui.grid>.row>.primary.column{background-color:#2185d0;color:#fff}.ui.grid>.row>.secondary.column,.ui.grid>.secondary.column,.ui.grid>.secondary.row{background-color:#1b1c1d;color:#fff}.ui.grid>.red.column,.ui.grid>.red.row,.ui.grid>.row>.red.column{background-color:#db2828;color:#fff}.ui.grid>.orange.column,.ui.grid>.orange.row,.ui.grid>.row>.orange.column{background-color:#f2711c;color:#fff}.ui.grid>.row>.yellow.column,.ui.grid>.yellow.column,.ui.grid>.yellow.row{background-color:#fbbd08;color:#fff}.ui.grid>.olive.column,.ui.grid>.olive.row,.ui.grid>.row>.olive.column{background-color:#b5cc18;color:#fff}.ui.grid>.green.column,.ui.grid>.green.row,.ui.grid>.row>.green.column{background-color:#21ba45;color:#fff}.ui.grid>.row>.teal.column,.ui.grid>.teal.column,.ui.grid>.teal.row{background-color:#00b5ad;color:#fff}.ui.grid>.blue.column,.ui.grid>.blue.row,.ui.grid>.row>.blue.column{background-color:#2185d0;color:#fff}.ui.grid>.row>.violet.column,.ui.grid>.violet.column,.ui.grid>.violet.row{background-color:#6435c9;color:#fff}.ui.grid>.purple.column,.ui.grid>.purple.row,.ui.grid>.row>.purple.column{background-color:#a333c8;color:#fff}.ui.grid>.pink.column,.ui.grid>.pink.row,.ui.grid>.row>.pink.column{background-color:#e03997;color:#fff}.ui.grid>.brown.column,.ui.grid>.brown.row,.ui.grid>.row>.brown.column{background-color:#a5673f;color:#fff}.ui.grid>.grey.column,.ui.grid>.grey.row,.ui.grid>.row>.grey.column{background-color:#767676;color:#fff}.ui.grid>.black.column,.ui.grid>.black.row,.ui.grid>.row>.black.column{background-color:#1b1c1d;color:#fff}.ui.grid>[class*="equal width"].row>.column,.ui[class*="equal width"].grid>.column:not(.row),.ui[class*="equal width"].grid>.row>.column{display:inline-block;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.ui.grid>[class*="equal width"].row>.wide.column,.ui[class*="equal width"].grid>.row>.wide.column,.ui[class*="equal width"].grid>.wide.column{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}@media only screen and (max-width:767.98px){.ui.grid>[class*="mobile reversed"].row,.ui[class*="mobile reversed"].grid,.ui[class*="mobile reversed"].grid>.row{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ui.stackable[class*="mobile reversed"],.ui[class*="mobile vertically reversed"].grid{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.ui[class*="mobile reversed"].divided.grid:not([class*="vertically divided"])>.column:first-child,.ui[class*="mobile reversed"].divided.grid:not([class*="vertically divided"])>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*="mobile reversed"].divided.grid:not([class*="vertically divided"])>.column:last-child,.ui[class*="mobile reversed"].divided.grid:not([class*="vertically divided"])>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}.ui.grid[class*="vertically divided"][class*="mobile vertically reversed"]>.row:first-child:before{-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.grid[class*="vertically divided"][class*="mobile vertically reversed"]>.row:last-child:before{-webkit-box-shadow:none;box-shadow:none}.ui[class*="mobile reversed"].celled.grid>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui[class*="mobile reversed"].celled.grid>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}}@media only screen and (min-width:768px) and (max-width:991.98px){.ui.grid>[class*="tablet reversed"].row,.ui[class*="tablet reversed"].grid,.ui[class*="tablet reversed"].grid>.row{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ui[class*="tablet vertically reversed"].grid{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.ui[class*="tablet reversed"].divided.grid:not([class*="vertically divided"])>.column:first-child,.ui[class*="tablet reversed"].divided.grid:not([class*="vertically divided"])>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*="tablet reversed"].divided.grid:not([class*="vertically divided"])>.column:last-child,.ui[class*="tablet reversed"].divided.grid:not([class*="vertically divided"])>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}.ui.grid[class*="vertically divided"][class*="tablet vertically reversed"]>.row:first-child:before{-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.grid[class*="vertically divided"][class*="tablet vertically reversed"]>.row:last-child:before{-webkit-box-shadow:none;box-shadow:none}.ui[class*="tablet reversed"].celled.grid>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui[class*="tablet reversed"].celled.grid>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}}@media only screen and (min-width:992px){.ui.grid>[class*="computer reversed"].row,.ui[class*="computer reversed"].grid,.ui[class*="computer reversed"].grid>.row{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ui[class*="computer vertically reversed"].grid{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.ui[class*="computer reversed"].divided.grid:not([class*="vertically divided"])>.column:first-child,.ui[class*="computer reversed"].divided.grid:not([class*="vertically divided"])>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*="computer reversed"].divided.grid:not([class*="vertically divided"])>.column:last-child,.ui[class*="computer reversed"].divided.grid:not([class*="vertically divided"])>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}.ui.grid[class*="vertically divided"][class*="computer vertically reversed"]>.row:first-child:before{-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.grid[class*="vertically divided"][class*="computer vertically reversed"]>.row:last-child:before{-webkit-box-shadow:none;box-shadow:none}.ui[class*="computer reversed"].celled.grid>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui[class*="computer reversed"].celled.grid>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}}@media only screen and (min-width:768px) and (max-width:991.98px){.ui.doubling.grid{width:auto}.ui.doubling.grid>.row,.ui.grid>.doubling.row{margin:0!important;padding:0!important}.ui.doubling.grid>.row>.column,.ui.grid>.doubling.row>.column{display:inline-block!important;padding-top:1rem!important;padding-bottom:1rem!important;-webkit-box-shadow:none!important;box-shadow:none!important;margin:0}.ui.grid>[class*="two column"].doubling.row.row>.column,.ui[class*="two column"].doubling.grid>.column:not(.row),.ui[class*="two column"].doubling.grid>.row>.column{width:100%!important}.ui.grid>[class*="three column"].doubling.row.row>.column,.ui[class*="three column"].doubling.grid>.column:not(.row),.ui[class*="three column"].doubling.grid>.row>.column{width:50%!important}.ui.grid>[class*="four column"].doubling.row.row>.column,.ui[class*="four column"].doubling.grid>.column:not(.row),.ui[class*="four column"].doubling.grid>.row>.column{width:50%!important}.ui.grid>[class*="five column"].doubling.row.row>.column,.ui[class*="five column"].doubling.grid>.column:not(.row),.ui[class*="five column"].doubling.grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="six column"].doubling.row.row>.column,.ui[class*="six column"].doubling.grid>.column:not(.row),.ui[class*="six column"].doubling.grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="seven column"].doubling.row.row>.column,.ui[class*="seven column"].doubling.grid>.column:not(.row),.ui[class*="seven column"].doubling.grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="eight column"].doubling.row.row>.column,.ui[class*="eight column"].doubling.grid>.column:not(.row),.ui[class*="eight column"].doubling.grid>.row>.column{width:25%!important}.ui.grid>[class*="nine column"].doubling.row.row>.column,.ui[class*="nine column"].doubling.grid>.column:not(.row),.ui[class*="nine column"].doubling.grid>.row>.column{width:25%!important}.ui.grid>[class*="ten column"].doubling.row.row>.column,.ui[class*="ten column"].doubling.grid>.column:not(.row),.ui[class*="ten column"].doubling.grid>.row>.column{width:20%!important}.ui.grid>[class*="eleven column"].doubling.row.row>.column,.ui[class*="eleven column"].doubling.grid>.column:not(.row),.ui[class*="eleven column"].doubling.grid>.row>.column{width:20%!important}.ui.grid>[class*="twelve column"].doubling.row.row>.column,.ui[class*="twelve column"].doubling.grid>.column:not(.row),.ui[class*="twelve column"].doubling.grid>.row>.column{width:16.66666667%!important}.ui.grid>[class*="thirteen column"].doubling.row.row>.column,.ui[class*="thirteen column"].doubling.grid>.column:not(.row),.ui[class*="thirteen column"].doubling.grid>.row>.column{width:16.66666667%!important}.ui.grid>[class*="fourteen column"].doubling.row.row>.column,.ui[class*="fourteen column"].doubling.grid>.column:not(.row),.ui[class*="fourteen column"].doubling.grid>.row>.column{width:14.28571429%!important}.ui.grid>[class*="fifteen column"].doubling.row.row>.column,.ui[class*="fifteen column"].doubling.grid>.column:not(.row),.ui[class*="fifteen column"].doubling.grid>.row>.column{width:14.28571429%!important}.ui.grid>[class*="sixteen column"].doubling.row.row>.column,.ui[class*="sixteen column"].doubling.grid>.column:not(.row),.ui[class*="sixteen column"].doubling.grid>.row>.column{width:12.5%!important}}@media only screen and (max-width:767.98px){.ui.doubling.grid>.row,.ui.grid>.doubling.row{margin:0!important;padding:0!important}.ui.doubling.grid>.row>.column,.ui.grid>.doubling.row>.column{padding-top:1rem!important;padding-bottom:1rem!important;margin:0!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.grid>[class*="two column"].doubling:not(.stackable).row.row>.column,.ui[class*="two column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="two column"].doubling:not(.stackable).grid>.row>.column{width:100%!important}.ui.grid>[class*="three column"].doubling:not(.stackable).row.row>.column,.ui[class*="three column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="three column"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*="four column"].doubling:not(.stackable).row.row>.column,.ui[class*="four column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="four column"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*="five column"].doubling:not(.stackable).row.row>.column,.ui[class*="five column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="five column"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*="six column"].doubling:not(.stackable).row.row>.column,.ui[class*="six column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="six column"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*="seven column"].doubling:not(.stackable).row.row>.column,.ui[class*="seven column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="seven column"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*="eight column"].doubling:not(.stackable).row.row>.column,.ui[class*="eight column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="eight column"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*="nine column"].doubling:not(.stackable).row.row>.column,.ui[class*="nine column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="nine column"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="ten column"].doubling:not(.stackable).row.row>.column,.ui[class*="ten column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="ten column"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="eleven column"].doubling:not(.stackable).row.row>.column,.ui[class*="eleven column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="eleven column"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="twelve column"].doubling:not(.stackable).row.row>.column,.ui[class*="twelve column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="twelve column"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="thirteen column"].doubling:not(.stackable).row.row>.column,.ui[class*="thirteen column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="thirteen column"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="fourteen column"].doubling:not(.stackable).row.row>.column,.ui[class*="fourteen column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="fourteen column"].doubling:not(.stackable).grid>.row>.column{width:25%!important}.ui.grid>[class*="fifteen column"].doubling:not(.stackable).row.row>.column,.ui[class*="fifteen column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="fifteen column"].doubling:not(.stackable).grid>.row>.column{width:25%!important}.ui.grid>[class*="sixteen column"].doubling:not(.stackable).row.row>.column,.ui[class*="sixteen column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="sixteen column"].doubling:not(.stackable).grid>.row>.column{width:25%!important}}@media only screen and (max-width:767.98px){.ui.stackable.grid{width:auto;margin-left:0!important;margin-right:0!important}.ui.grid>.stackable.stackable.stackable.row>.column,.ui.stackable.grid>.column.grid>.column,.ui.stackable.grid>.column.row>.column,.ui.stackable.grid>.column:not(.row),.ui.stackable.grid>.row>.column,.ui.stackable.grid>.row>.wide.column,.ui.stackable.grid>.wide.column{width:100%!important;margin:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;padding:1rem 1rem}.ui.stackable.grid:not(.vertically)>.row{margin:0;padding:0}.ui.container>.ui.stackable.grid>.column,.ui.container>.ui.stackable.grid>.row>.column{padding-left:0!important;padding-right:0!important}.ui.grid .ui.stackable.grid,.ui.segment:not(.vertical) .ui.stackable.page.grid{margin-left:-1rem!important;margin-right:-1rem!important}.ui.stackable.celled.grid>.column:not(.row):first-child,.ui.stackable.celled.grid>.row:first-child>.column:first-child,.ui.stackable.divided.grid>.column:not(.row):first-child,.ui.stackable.divided.grid>.row:first-child>.column:first-child{border-top:none!important}.ui.inverted.stackable.celled.grid>.column:not(.row),.ui.inverted.stackable.celled.grid>.row>.column,.ui.inverted.stackable.divided.grid>.column:not(.row),.ui.inverted.stackable.divided.grid>.row>.column{border-top:1px solid rgba(255,255,255,.1)}.ui.stackable.celled.grid>.column:not(.row),.ui.stackable.celled.grid>.row>.column,.ui.stackable.divided:not(.vertically).grid>.column:not(.row),.ui.stackable.divided:not(.vertically).grid>.row>.column{border-top:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none!important;box-shadow:none!important;padding-top:2rem!important;padding-bottom:2rem!important}.ui.stackable.celled.grid>.row{-webkit-box-shadow:none!important;box-shadow:none!important}.ui.stackable.divided:not(.vertically).grid>.column:not(.row),.ui.stackable.divided:not(.vertically).grid>.row>.column{padding-left:0!important;padding-right:0!important}}@media only screen and (max-width:767.98px){.ui.grid.grid.grid>.row>[class*="tablet only"].column:not(.mobile),.ui.grid.grid.grid>[class*="tablet only"].column:not(.mobile),.ui.grid.grid.grid>[class*="tablet only"].row:not(.mobile),.ui[class*="tablet only"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*="computer only"].column:not(.mobile),.ui.grid.grid.grid>[class*="computer only"].column:not(.mobile),.ui.grid.grid.grid>[class*="computer only"].row:not(.mobile),.ui[class*="computer only"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*="large screen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="large screen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="large screen only"].row:not(.mobile),.ui[class*="large screen only"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].row:not(.mobile),.ui[class*="widescreen only"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:768px) and (max-width:991.98px){.ui.grid.grid.grid>.row>[class*="mobile only"].column:not(.tablet),.ui.grid.grid.grid>[class*="mobile only"].column:not(.tablet),.ui.grid.grid.grid>[class*="mobile only"].row:not(.tablet),.ui[class*="mobile only"].grid.grid.grid:not(.tablet){display:none!important}.ui.grid.grid.grid>.row>[class*="computer only"].column:not(.tablet),.ui.grid.grid.grid>[class*="computer only"].column:not(.tablet),.ui.grid.grid.grid>[class*="computer only"].row:not(.tablet),.ui[class*="computer only"].grid.grid.grid:not(.tablet){display:none!important}.ui.grid.grid.grid>.row>[class*="large screen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="large screen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="large screen only"].row:not(.mobile),.ui[class*="large screen only"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].row:not(.mobile),.ui[class*="widescreen only"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:992px) and (max-width:1199.98px){.ui.grid.grid.grid>.row>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].row:not(.computer),.ui[class*="mobile only"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*="tablet only"].column:not(.computer),.ui.grid.grid.grid>[class*="tablet only"].column:not(.computer),.ui.grid.grid.grid>[class*="tablet only"].row:not(.computer),.ui[class*="tablet only"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*="large screen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="large screen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="large screen only"].row:not(.mobile),.ui[class*="large screen only"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].row:not(.mobile),.ui[class*="widescreen only"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:1200px) and (max-width:1919.98px){.ui.grid.grid.grid>.row>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].row:not(.computer),.ui[class*="mobile only"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*="tablet only"].column:not(.computer),.ui.grid.grid.grid>[class*="tablet only"].column:not(.computer),.ui.grid.grid.grid>[class*="tablet only"].row:not(.computer),.ui[class*="tablet only"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].row:not(.mobile),.ui[class*="widescreen only"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:1920px){.ui.grid.grid.grid>.row>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].row:not(.computer),.ui[class*="mobile only"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*="tablet only"].column:not(.computer),.ui.grid.grid.grid>[class*="tablet only"].column:not(.computer),.ui.grid.grid.grid>[class*="tablet only"].row:not(.computer),.ui[class*="tablet only"].grid.grid.grid:not(.computer){display:none!important}}.ui.ui.ui.compact.grid>.column:not(.row),.ui.ui.ui.compact.grid>.row>.column{padding-left:.5rem;padding-right:.5rem}.ui.ui.ui.compact.grid>*{padding-left:.5rem;padding-right:.5rem}.ui.ui.ui.compact.grid>.row{padding-top:.5rem;padding-bottom:.5rem}.ui.ui.ui.compact.grid>.column:not(.row){padding-top:.5rem;padding-bottom:.5rem}.ui.compact.relaxed.celled.grid>.column:not(.row),.ui.compact.relaxed.celled.grid>.row>.column{padding:.75em}.ui.compact[class*="very relaxed"].celled.grid>.column:not(.row),.ui.compact[class*="very relaxed"].celled.grid>.row>.column{padding:1em}.ui[class*="very compact"].grid>.column:not(.row),.ui[class*="very compact"].grid>.row>.column{padding-left:.25rem;padding-right:.5rem}.ui[class*="very compact"].grid>*{padding-left:.25rem;padding-right:.25rem}.ui[class*="very compact"].grid>.row{padding-top:.25rem;padding-bottom:.25rem}.ui[class*="very compact"].grid>.column:not(.row){padding-top:.25rem;padding-bottom:.25rem}.ui[class*="very compact"].relaxed.celled.grid>.column:not(.row),.ui[class*="very compact"].relaxed.celled.grid>.row>.column{padding:.375em}.ui[class*="very compact"][class*="very relaxed"].celled.grid>.column:not(.row),.ui[class*="very compact"][class*="very relaxed"].celled.grid>.row>.column{padding:.5em} + /* + * # Fomantic-UI - Input + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */ + .ui.input{position:relative;font-weight:400;font-style:normal;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;color:rgba(0,0,0,.87)}.ui.input>input{margin:0;max-width:100%;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;outline:0;-webkit-tap-highlight-color:rgba(255,255,255,0);text-align:left;line-height:1.21428571em;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;padding:.67857143em 1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-transition:border-color .1s ease,-webkit-box-shadow .1s ease;transition:border-color .1s ease,-webkit-box-shadow .1s ease;transition:box-shadow .1s ease,border-color .1s ease;transition:box-shadow .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;-webkit-box-shadow:none;box-shadow:none}.ui.input>input::-webkit-input-placeholder{color:rgba(191,191,191,.87)}.ui.input>input::-moz-placeholder{color:rgba(191,191,191,.87)}.ui.input>input:-ms-input-placeholder{color:rgba(191,191,191,.87)}.ui.disabled.input,.ui.input:not(.disabled) input[disabled]{opacity:.45}.ui.disabled.input>input,.ui.input:not(.disabled) input[disabled]{pointer-events:none}.ui.input.down input,.ui.input>input:active{border-color:rgba(0,0,0,.3);background:#fafafa;color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none}.ui.loading.loading.input>i.icon:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loading.loading.input>i.icon:after{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;-webkit-animation:loader .6s infinite linear;animation:loader .6s infinite linear;border:.2em solid #767676;border-radius:500rem;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}.ui.input.focus>input,.ui.input>input:focus{border-color:#85b7d9;background:#fff;color:rgba(0,0,0,.8);-webkit-box-shadow:none;box-shadow:none}.ui.input.focus>input::-webkit-input-placeholder,.ui.input>input:focus::-webkit-input-placeholder{color:rgba(115,115,115,.87)}.ui.input.focus>input::-moz-placeholder,.ui.input>input:focus::-moz-placeholder{color:rgba(115,115,115,.87)}.ui.input.focus>input:-ms-input-placeholder,.ui.input>input:focus:-ms-input-placeholder{color:rgba(115,115,115,.87)}.ui.input.error>input{background-color:#fff6f6;border-color:#e0b4b4;color:#9f3a38;-webkit-box-shadow:none;box-shadow:none}.ui.input.error>input::-webkit-input-placeholder{color:#e7bdbc}.ui.input.error>input::-moz-placeholder{color:#e7bdbc}.ui.input.error>input:-ms-input-placeholder{color:#e7bdbc}.ui.input.error>input:focus::-webkit-input-placeholder{color:#da9796}.ui.input.error>input:focus::-moz-placeholder{color:#da9796}.ui.input.error>input:focus:-ms-input-placeholder{color:#da9796}.ui.input.info>input{background-color:#f8ffff;border-color:#a9d5de;color:#276f86;-webkit-box-shadow:none;box-shadow:none}.ui.input.info>input::-webkit-input-placeholder{color:#98cfe1}.ui.input.info>input::-moz-placeholder{color:#98cfe1}.ui.input.info>input:-ms-input-placeholder{color:#98cfe1}.ui.input.info>input:focus::-webkit-input-placeholder{color:#70bdd6}.ui.input.info>input:focus::-moz-placeholder{color:#70bdd6}.ui.input.info>input:focus:-ms-input-placeholder{color:#70bdd6}.ui.input.success>input{background-color:#fcfff5;border-color:#a3c293;color:#2c662d;-webkit-box-shadow:none;box-shadow:none}.ui.input.success>input::-webkit-input-placeholder{color:#8fcf90}.ui.input.success>input::-moz-placeholder{color:#8fcf90}.ui.input.success>input:-ms-input-placeholder{color:#8fcf90}.ui.input.success>input:focus::-webkit-input-placeholder{color:#6cbf6d}.ui.input.success>input:focus::-moz-placeholder{color:#6cbf6d}.ui.input.success>input:focus:-ms-input-placeholder{color:#6cbf6d}.ui.input.warning>input{background-color:#fffaf3;border-color:#c9ba9b;color:#573a08;-webkit-box-shadow:none;box-shadow:none}.ui.input.warning>input::-webkit-input-placeholder{color:#edad3e}.ui.input.warning>input::-moz-placeholder{color:#edad3e}.ui.input.warning>input:-ms-input-placeholder{color:#edad3e}.ui.input.warning>input:focus::-webkit-input-placeholder{color:#e39715}.ui.input.warning>input:focus::-moz-placeholder{color:#e39715}.ui.input.warning>input:focus:-ms-input-placeholder{color:#e39715}.ui.transparent.input>input,.ui.transparent.input>textarea{border-color:transparent!important;background-color:transparent!important;padding:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-radius:0!important}.field .ui.transparent.input>textarea{padding:.67857143em 1em}:not(.field)>.ui.transparent.icon.input>i.icon{width:1.1em}:not(.field)>.ui.ui.ui.transparent.icon.input>input{padding-left:0;padding-right:2em}:not(.field)>.ui.ui.ui.transparent[class*="left icon"].input>input{padding-left:2em;padding-right:0}.ui.transparent.inverted.input{color:#fff}.ui.ui.transparent.inverted.input>input,.ui.ui.transparent.inverted.input>textarea{color:inherit}.ui.transparent.inverted.input>input::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.ui.transparent.inverted.input>input::-moz-placeholder{color:rgba(255,255,255,.5)}.ui.transparent.inverted.input>input:-ms-input-placeholder{color:rgba(255,255,255,.5)}.ui.icon.input>i.icon{cursor:default;position:absolute;line-height:1;text-align:center;top:0;right:0;margin:0;height:100%;width:2.67142857em;opacity:.5;border-radius:0 .28571429rem .28571429rem 0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.ui.icon.input>i.icon:not(.link){pointer-events:none}.ui.ui.ui.ui.icon.input>input,.ui.ui.ui.ui.icon.input>textarea{padding-right:2.67142857em}.ui.icon.input>i.icon:after,.ui.icon.input>i.icon:before{left:0;position:absolute;text-align:center;top:50%;width:100%;margin-top:-.5em}.ui.icon.input>i.link.icon{cursor:pointer}.ui.icon.input>i.circular.icon{top:.35em;right:.5em}.ui[class*="left icon"].input>i.icon{right:auto;left:1px;border-radius:.28571429rem 0 0 .28571429rem}.ui[class*="left icon"].input>i.circular.icon{right:auto;left:.5em}.ui.ui.ui.ui[class*="left icon"].input>input,.ui.ui.ui.ui[class*="left icon"].input>textarea{padding-left:2.67142857em;padding-right:1em}.ui.icon.input>input:focus~i.icon,.ui.icon.input>textarea:focus~i.icon{opacity:1}.ui.labeled.input>.label{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin:0;font-size:1em}.ui.labeled.input>.label:not(.corner){padding-top:.78571429em;padding-bottom:.78571429em}.ui.labeled.input:not([class*="corner labeled"]) .label:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.ui.labeled.input:not([class*="corner labeled"]) .label:first-child+input{border-top-left-radius:0;border-bottom-left-radius:0;border-left-color:transparent}.ui.labeled.input:not([class*="corner labeled"]) .label:first-child+input:focus{border-left-color:#85b7d9}.ui[class*="right labeled"].input>input{border-top-right-radius:0!important;border-bottom-right-radius:0!important;border-right-color:transparent!important}.ui[class*="right labeled"].input>input+.label{border-top-left-radius:0;border-bottom-left-radius:0}.ui[class*="right labeled"].input>input:focus{border-right-color:#85b7d9!important}.ui.labeled.input .corner.label{top:1px;right:1px;font-size:.64285714em;border-radius:0 .28571429rem 0 0}.ui[class*="corner labeled"]:not([class*="left corner labeled"]).labeled.input>input,.ui[class*="corner labeled"]:not([class*="left corner labeled"]).labeled.input>textarea{padding-right:2.5em!important}.ui[class*="corner labeled"].icon.input:not([class*="left corner labeled"])>input,.ui[class*="corner labeled"].icon.input:not([class*="left corner labeled"])>textarea{padding-right:3.25em!important}.ui[class*="corner labeled"].icon.input:not([class*="left corner labeled"])>.icon{margin-right:1.25em}.ui[class*="left corner labeled"].labeled.input>input,.ui[class*="left corner labeled"].labeled.input>textarea{padding-left:2.5em!important}.ui[class*="left corner labeled"].icon.input>input,.ui[class*="left corner labeled"].icon.input>textarea{padding-left:3.25em!important}.ui[class*="left corner labeled"].icon.input>.icon{margin-left:1.25em}.ui.icon.input>textarea~.icon{height:3em}:not(.field)>.ui.transparent.icon.input>textarea~.icon{height:1.3em}.ui.input>.ui.corner.label{top:1px;right:1px}.ui.input>.ui.left.corner.label{right:auto;left:1px}.ui.action.input.error>.ui.button,.ui.form>.field.error>.ui.action.input>.ui.button,.ui.form>.field.error>.ui.labeled.input:not([class*="corner labeled"])>.ui.label,.ui.labeled.input.error:not([class*="corner labeled"])>.ui.label{border-top:1px solid #e0b4b4;border-bottom:1px solid #e0b4b4}.ui.form>.field.error>.ui.labeled.input:not(.right):not([class*="corner labeled"])>.ui.label,.ui.form>.field.error>.ui.left.action.input>.ui.button,.ui.labeled.input.error:not(.right):not([class*="corner labeled"])>.ui.label,.ui.left.action.input.error>.ui.button{border-left:1px solid #e0b4b4}.ui.action.input.error:not(.left)>input+.ui.button,.ui.form>.field.error>.ui.action.input:not(.left)>input+.ui.button,.ui.form>.field.error>.ui.right.labeled.input:not([class*="corner labeled"])>input+.ui.label,.ui.right.labeled.input.error:not([class*="corner labeled"])>input+.ui.label{border-right:1px solid #e0b4b4}.ui.form>.field.error>.ui.right.labeled.input:not([class*="corner labeled"])>.ui.label:first-child,.ui.right.labeled.input.error:not([class*="corner labeled"])>.ui.label:first-child{border-left:1px solid #e0b4b4}.ui.action.input.info>.ui.button,.ui.form>.field.info>.ui.action.input>.ui.button,.ui.form>.field.info>.ui.labeled.input:not([class*="corner labeled"])>.ui.label,.ui.labeled.input.info:not([class*="corner labeled"])>.ui.label{border-top:1px solid #a9d5de;border-bottom:1px solid #a9d5de}.ui.form>.field.info>.ui.labeled.input:not(.right):not([class*="corner labeled"])>.ui.label,.ui.form>.field.info>.ui.left.action.input>.ui.button,.ui.labeled.input.info:not(.right):not([class*="corner labeled"])>.ui.label,.ui.left.action.input.info>.ui.button{border-left:1px solid #a9d5de}.ui.action.input.info:not(.left)>input+.ui.button,.ui.form>.field.info>.ui.action.input:not(.left)>input+.ui.button,.ui.form>.field.info>.ui.right.labeled.input:not([class*="corner labeled"])>input+.ui.label,.ui.right.labeled.input.info:not([class*="corner labeled"])>input+.ui.label{border-right:1px solid #a9d5de}.ui.form>.field.info>.ui.right.labeled.input:not([class*="corner labeled"])>.ui.label:first-child,.ui.right.labeled.input.info:not([class*="corner labeled"])>.ui.label:first-child{border-left:1px solid #a9d5de}.ui.action.input.success>.ui.button,.ui.form>.field.success>.ui.action.input>.ui.button,.ui.form>.field.success>.ui.labeled.input:not([class*="corner labeled"])>.ui.label,.ui.labeled.input.success:not([class*="corner labeled"])>.ui.label{border-top:1px solid #a3c293;border-bottom:1px solid #a3c293}.ui.form>.field.success>.ui.labeled.input:not(.right):not([class*="corner labeled"])>.ui.label,.ui.form>.field.success>.ui.left.action.input>.ui.button,.ui.labeled.input.success:not(.right):not([class*="corner labeled"])>.ui.label,.ui.left.action.input.success>.ui.button{border-left:1px solid #a3c293}.ui.action.input.success:not(.left)>input+.ui.button,.ui.form>.field.success>.ui.action.input:not(.left)>input+.ui.button,.ui.form>.field.success>.ui.right.labeled.input:not([class*="corner labeled"])>input+.ui.label,.ui.right.labeled.input.success:not([class*="corner labeled"])>input+.ui.label{border-right:1px solid #a3c293}.ui.form>.field.success>.ui.right.labeled.input:not([class*="corner labeled"])>.ui.label:first-child,.ui.right.labeled.input.success:not([class*="corner labeled"])>.ui.label:first-child{border-left:1px solid #a3c293}.ui.action.input.warning>.ui.button,.ui.form>.field.warning>.ui.action.input>.ui.button,.ui.form>.field.warning>.ui.labeled.input:not([class*="corner labeled"])>.ui.label,.ui.labeled.input.warning:not([class*="corner labeled"])>.ui.label{border-top:1px solid #c9ba9b;border-bottom:1px solid #c9ba9b}.ui.form>.field.warning>.ui.labeled.input:not(.right):not([class*="corner labeled"])>.ui.label,.ui.form>.field.warning>.ui.left.action.input>.ui.button,.ui.labeled.input.warning:not(.right):not([class*="corner labeled"])>.ui.label,.ui.left.action.input.warning>.ui.button{border-left:1px solid #c9ba9b}.ui.action.input.warning:not(.left)>input+.ui.button,.ui.form>.field.warning>.ui.action.input:not(.left)>input+.ui.button,.ui.form>.field.warning>.ui.right.labeled.input:not([class*="corner labeled"])>input+.ui.label,.ui.right.labeled.input.warning:not([class*="corner labeled"])>input+.ui.label{border-right:1px solid #c9ba9b}.ui.form>.field.warning>.ui.right.labeled.input:not([class*="corner labeled"])>.ui.label:first-child,.ui.right.labeled.input.warning:not([class*="corner labeled"])>.ui.label:first-child{border-left:1px solid #c9ba9b}.ui.action.input>.button,.ui.action.input>.buttons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.ui.action.input>.button,.ui.action.input>.buttons>.button{padding-top:.78571429em;padding-bottom:.78571429em;margin:0}.ui[class*="left action"].input>input{border-top-left-radius:0;border-bottom-left-radius:0;border-left-color:transparent}.ui.action.input:not([class*="left action"])>input{border-top-right-radius:0;border-bottom-right-radius:0;border-right-color:transparent}.ui.action.input>.button:first-child,.ui.action.input>.buttons:first-child>.button,.ui.action.input>.dropdown:first-child{border-radius:.28571429rem 0 0 .28571429rem}.ui.action.input>.button:not(:first-child),.ui.action.input>.buttons:not(:first-child)>.button,.ui.action.input>.dropdown:not(:first-child){border-radius:0}.ui.action.input>.button:last-child,.ui.action.input>.buttons:last-child>.button,.ui.action.input>.dropdown:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.action.input:not([class*="left action"])>input:focus{border-right-color:#85b7d9}.ui.ui[class*="left action"].input>input:focus{border-left-color:#85b7d9}.ui.inverted.input>input{border:none}.ui.fluid.input{display:-webkit-box;display:-ms-flexbox;display:flex}.ui.fluid.input>input{width:0!important}.ui.input{font-size:1em}.ui.mini.input{font-size:.78571429em}.ui.tiny.input{font-size:.85714286em}.ui.small.input{font-size:.92857143em}.ui.large.input{font-size:1.14285714em}.ui.big.input{font-size:1.28571429em}.ui.huge.input{font-size:1.42857143em}.ui.massive.input{font-size:1.71428571em} + /* + * # Fomantic-UI - Item + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */ + .ui.items>.item{display:-webkit-box;display:-ms-flexbox;display:flex;margin:1em 0;width:100%;min-height:0;background:0 0;padding:0;border:none;border-radius:0;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:-webkit-box-shadow .1s ease;transition:-webkit-box-shadow .1s ease;transition:box-shadow .1s ease;transition:box-shadow .1s ease,-webkit-box-shadow .1s ease;z-index:''}.ui.items>.item a{cursor:pointer}.ui.items{margin:1.5em 0}.ui.items:first-child{margin-top:0!important}.ui.items:last-child{margin-bottom:0!important}.ui.items>.item:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item:first-child{margin-top:0}.ui.items>.item:last-child{margin-bottom:0}.ui.items>.item>.image{position:relative;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;display:block;float:none;margin:0;padding:0;max-height:'';-ms-flex-item-align:start;align-self:start}.ui.items>.item>.image>img{display:block;width:100%;height:auto;border-radius:.125rem;border:none}.ui.items>.item>.image:only-child>img{border-radius:0}.ui.items>.item>.content{display:block;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;background:0 0;color:rgba(0,0,0,.87);margin:0;padding:0;-webkit-box-shadow:none;box-shadow:none;font-size:1em;border:none;border-radius:0}.ui.items>.item>.content:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item>.image+.content{min-width:0;width:auto;display:block;margin-left:0;-ms-flex-item-align:start;align-self:start;padding-left:1.5em}.ui.items>.item>.content>.header{display:inline-block;margin:-.21425em 0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;color:rgba(0,0,0,.85)}.ui.items>.item>.content>.header:not(.ui){font-size:1.28571429em}.ui.items>.item [class*="left floated"]{float:left}.ui.items>.item [class*="right floated"]{float:right}.ui.items>.item .content img{-ms-flex-item-align:center;align-self:center;width:''}.ui.items>.item .avatar img,.ui.items>.item img.avatar{width:'';height:'';border-radius:500rem}.ui.items>.item>.content>.description{margin-top:.6em;max-width:auto;font-size:1em;line-height:1.4285em;color:rgba(0,0,0,.87)}.ui.items>.item>.content p{margin:0 0 .5em}.ui.items>.item>.content p:last-child{margin-bottom:0}.ui.items>.item .meta{margin:.5em 0 .5em;font-size:1em;line-height:1em;color:rgba(0,0,0,.6)}.ui.items>.item .meta *{margin-right:.3em}.ui.items>.item .meta :last-child{margin-right:0}.ui.items>.item .meta [class*="right floated"]{margin-right:0;margin-left:.3em}.ui.items>.item>.content a:not(.ui){color:'';-webkit-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content a:not(.ui):hover{color:''}.ui.items>.item>.content>a.header{color:rgba(0,0,0,.85)}.ui.items>.item>.content>a.header:hover{color:#1e70bf}.ui.items>.item .meta>a:not(.ui){color:rgba(0,0,0,.4)}.ui.items>.item .meta>a:not(.ui):hover{color:rgba(0,0,0,.87)}.ui.items>.item>.content .favorite.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content .favorite.icon:hover{opacity:1;color:#ffb70a}.ui.items>.item>.content .active.favorite.icon{color:#ffe623}.ui.items>.item>.content .like.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content .like.icon:hover{opacity:1;color:#ff2733}.ui.items>.item>.content .active.like.icon{color:#ff2733}.ui.items>.item .extra{display:block;position:relative;background:0 0;margin:.5rem 0 0;width:100%;padding:0 0 0;top:0;left:0;color:rgba(0,0,0,.4);-webkit-box-shadow:none;box-shadow:none;-webkit-transition:color .1s ease;transition:color .1s ease;border-top:none}.ui.items>.item .extra>*{margin:.25rem .5rem .25rem 0}.ui.items>.item .extra>[class*="right floated"]{margin:.25rem 0 .25rem .5rem}.ui.items>.item .extra:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item>.image:not(.ui){width:175px}@media only screen and (min-width:768px) and (max-width:991.98px){.ui.items>.item{margin:1em 0}.ui.items>.item>.image:not(.ui){width:150px}.ui.items>.item>.image+.content{display:block;padding:0 0 0 1em}}@media only screen and (max-width:767.98px){.ui.items:not(.unstackable)>.item{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:2em 0}.ui.items:not(.unstackable)>.item>.image{display:block;margin-left:auto;margin-right:auto}.ui.items:not(.unstackable)>.item>.image,.ui.items:not(.unstackable)>.item>.image>img{max-width:100%!important;width:auto!important;max-height:250px!important}.ui.items:not(.unstackable)>.item>.image+.content{display:block;padding:1.5em 0 0}}.ui.items>.item>.image+[class*="top aligned"].content{-ms-flex-item-align:start;align-self:flex-start}.ui.items>.item>.image+[class*="middle aligned"].content{-ms-flex-item-align:center;align-self:center}.ui.items>.item>.image+[class*="bottom aligned"].content{-ms-flex-item-align:end;align-self:flex-end}.ui.relaxed.items>.item{margin:1.5em 0}.ui[class*="very relaxed"].items>.item{margin:2em 0}.ui.divided.items>.item{border-top:1px solid rgba(34,36,38,.15);margin:0;padding:1em 0}.ui.divided.items>.item:first-child{border-top:none;margin-top:0!important;padding-top:0!important}.ui.divided.items>.item:last-child{margin-bottom:0!important;padding-bottom:0!important}.ui.relaxed.divided.items>.item{margin:0;padding:1.5em 0}.ui[class*="very relaxed"].divided.items>.item{margin:0;padding:2em 0}.ui.items a.item:hover,.ui.link.items>.item:hover{cursor:pointer}.ui.items a.item:hover .content .header,.ui.link.items>.item:hover .content .header{color:#1e70bf}.ui.items>.item{font-size:1em}.ui.mini.items>.item{font-size:.78571429em}.ui.tiny.items>.item{font-size:.85714286em}.ui.small.items>.item{font-size:.92857143em}.ui.large.items>.item{font-size:1.14285714em}.ui.big.items>.item{font-size:1.28571429em}.ui.huge.items>.item{font-size:1.42857143em}.ui.massive.items>.item{font-size:1.71428571em}@media only screen and (max-width:767.98px){.ui.unstackable.items>.item>.image,.ui.unstackable.items>.item>.image>img{width:125px!important}}.ui.inverted.items>.item{background:0 0}.ui.inverted.items>.item>.content{background:0 0;color:rgba(255,255,255,.9)}.ui.inverted.items>.item .extra{background:0 0}.ui.inverted.items>.item>.content>.header{color:rgba(255,255,255,.9)}.ui.inverted.items>.item>.content>.description{color:rgba(255,255,255,.9)}.ui.inverted.items>.item .meta{color:rgba(255,255,255,.8)}.ui.inverted.items>.item>.content a:not(.ui){color:#57a4ef}.ui.inverted.items>.item>.content a:not(.ui):hover{color:#4183c4}.ui.inverted.items>.item>.content>a.header{color:rgba(255,255,255,.9)}.ui.inverted.items>.item>.content>a.header:hover{color:#fff}.ui.inverted.items>.item .meta>a:not(.ui){color:rgba(255,255,255,.7)}.ui.inverted.items>.item .meta>a:not(.ui):hover{color:rgba(255,255,255,.9)}.ui.inverted.items>.item>.content .favorite.icon:hover{color:#ffc63d}.ui.inverted.items>.item>.content .active.favorite.icon{color:#ffec56}.ui.inverted.items>.item>.content .like.icon:hover{color:#ff5a63}.ui.inverted.items>.item>.content .active.like.icon{color:#ff5a63}.ui.inverted.items>.item .extra{color:rgba(255,255,255,.7)}.ui.inverted.items a.item:hover .content .header,.ui.inverted.link.items>.item:hover .content .header{color:#fff}.ui.inverted.divided.items>.item{border-top:1px solid rgba(255,255,255,.1)}.ui.inverted.divided.items>.item:first-child{border-top:none} + /* + * # Fomantic-UI - Label + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */ + .ui.label{display:inline-block;line-height:1;vertical-align:baseline;margin:0 .14285714em;background-color:#e8e8e8;background-image:none;padding:.5833em .833em;color:rgba(0,0,0,.6);text-transform:none;font-weight:700;border:0 solid transparent;border-radius:.28571429rem;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.label:first-child{margin-left:0}.ui.label:last-child{margin-right:0}a.ui.label{cursor:pointer}.ui.label>a{cursor:pointer;color:inherit;opacity:.5;-webkit-transition:.1s opacity ease;transition:.1s opacity ease}.ui.label>a:hover{opacity:1}.ui.label>img{width:auto!important;vertical-align:middle;height:2.1666em}.ui.label>.icon,.ui.left.icon.label>.icon{width:auto;margin:0 .75em 0 0}.ui.label>.detail{display:inline-block;vertical-align:top;font-weight:700;margin-left:1em;opacity:.8}.ui.label>.detail .icon{margin:0 .25em 0 0}.ui.label>.close.icon,.ui.label>.delete.icon{cursor:pointer;font-size:.92857143em;opacity:.5;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.label>.close.icon:hover,.ui.label>.delete.icon:hover{opacity:1}.ui.label.left.icon>.close.icon,.ui.label.left.icon>.delete.icon{margin:0 .5em 0 0}.ui.label:not(.icon)>.close.icon,.ui.label:not(.icon)>.delete.icon{margin:0 0 0 .5em}.ui.icon.label>.icon{margin:0 auto}.ui.right.icon.label>.icon{margin:0 0 0 .75em}.ui.labels>.label{margin:0 .5em .5em 0}.ui.header>.ui.label{margin-top:-.29165em}.ui.attached.segment>.ui.top.left.attached.label,.ui.bottom.attached.segment>.ui.top.left.attached.label{border-top-left-radius:0}.ui.attached.segment>.ui.top.right.attached.label,.ui.bottom.attached.segment>.ui.top.right.attached.label{border-top-right-radius:0}.ui.top.attached.segment>.ui.bottom.left.attached.label{border-bottom-left-radius:0}.ui.top.attached.segment>.ui.bottom.right.attached.label{border-bottom-right-radius:0}.ui.top.attached.label+:not(.attached),.ui.top.attached.label~.ui.bottom.attached.label+:not(.attached){margin-top:2rem!important}.ui.bottom.attached.label~:last-child:not(.attached){margin-top:0;margin-bottom:2rem!important}.ui.image.label{width:auto!important;margin-top:0;margin-bottom:0;max-width:9999px;vertical-align:baseline;text-transform:none;background:#e8e8e8;padding:.5833em .833em .5833em .5em;border-radius:.28571429rem;-webkit-box-shadow:none;box-shadow:none}.ui.image.label img{display:inline-block;vertical-align:top;height:2.1666em;margin:-.5833em .5em -.5833em -.5em;border-radius:.28571429rem 0 0 .28571429rem}.ui.image.label .detail{background:rgba(0,0,0,.1);margin:-.5833em -.833em -.5833em .5em;padding:.5833em .833em;border-radius:0 .28571429rem .28571429rem 0}.ui.tag.label,.ui.tag.labels .label{margin-left:1em;position:relative;padding-left:1.5em;padding-right:1.5em;border-radius:0 .28571429rem .28571429rem 0;-webkit-transition:none;transition:none}.ui.tag.label:before,.ui.tag.labels .label:before{position:absolute;-webkit-transform:translateY(-50%) translateX(50%) rotate(-45deg);transform:translateY(-50%) translateX(50%) rotate(-45deg);top:50%;right:100%;content:'';background-color:inherit;background-image:none;width:1.56em;height:1.56em;-webkit-transition:none;transition:none}.ui.tag.label:after,.ui.tag.labels .label:after{position:absolute;content:'';top:50%;left:-.25em;margin-top:-.25em;background-color:#fff;width:.5em;height:.5em;-webkit-box-shadow:0 -1px 1px 0 rgba(0,0,0,.3);box-shadow:0 -1px 1px 0 rgba(0,0,0,.3);border-radius:500rem}.ui.basic.tag.label:before,.ui.basic.tag.labels .label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;right:calc(100% + 1px)}.ui.basic.tag.label:after,.ui.basic.tag.labels .label:after{-webkit-box-shadow:0 -1px 3px 0 rgba(0,0,0,.8);box-shadow:0 -1px 3px 0 rgba(0,0,0,.8)}.ui.corner.label{position:absolute;top:0;right:0;margin:0;padding:0;text-align:center;border-color:#e8e8e8;width:4em;height:4em;z-index:1;-webkit-transition:border-color .1s ease;transition:border-color .1s ease}.ui.corner.label{background-color:transparent!important}.ui.corner.label:after{position:absolute;content:"";right:0;top:0;z-index:-1;width:0;height:0;background-color:transparent;border-top:0 solid transparent;border-right:4em solid transparent;border-bottom:4em solid transparent;border-left:0 solid transparent;border-right-color:inherit;-webkit-transition:border-color .1s ease;transition:border-color .1s ease}.ui.corner.label .icon{cursor:inherit;position:absolute;top:.64285714em;left:auto;right:.57142857em;font-size:1.14285714em;margin:0}.ui.left.corner.label,.ui.left.corner.label:after{right:auto;left:0}.ui.left.corner.label:after{border-top:4em solid transparent;border-right:4em solid transparent;border-bottom:0 solid transparent;border-left:0 solid transparent;border-top-color:inherit}.ui.left.corner.label .icon{left:.57142857em;right:auto}.ui.segment>.ui.corner.label{top:-1px;right:-1px}.ui.segment>.ui.left.corner.label{right:auto;left:-1px}.ui.ribbon.label{position:relative;margin:0;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;border-radius:0 .28571429rem .28571429rem 0;border-color:rgba(0,0,0,.15)}.ui.ribbon.label:after{position:absolute;content:'';top:100%;left:0;background-color:transparent;border-style:solid;border-width:0 1.2em 1.2em 0;border-color:transparent;border-right-color:inherit;width:0;height:0}.ui.ribbon.label{left:calc(-1rem - 1.2em);margin-right:-1.2em;padding-left:calc(1rem + 1.2em);padding-right:1.2em}.ui[class*="right ribbon"].label{left:calc(100% + 1rem + 1.2em);padding-left:1.2em;padding-right:calc(1rem + 1.2em)}.ui.basic.ribbon.label{padding-top:calc(.5833em - 1px);padding-bottom:calc(.5833em - 1px)}.ui.basic.ribbon.label:not([class*="right ribbon"]){padding-left:calc(1rem + 1.2em - 1px);padding-right:calc(1.2em - 1px)}.ui.basic[class*="right ribbon"].label{padding-left:calc(1.2em - 1px);padding-right:calc(1rem + 1.2em - 1px)}.ui.basic.ribbon.label::after{top:calc(100% + 1px)}.ui.basic.ribbon.label:not([class*="right ribbon"])::after{left:-1px}.ui.basic[class*="right ribbon"].label::after{right:-1px}.ui[class*="right ribbon"].label{text-align:left;-webkit-transform:translateX(-100%);transform:translateX(-100%);border-radius:.28571429rem 0 0 .28571429rem}.ui[class*="right ribbon"].label:after{left:auto;right:0;border-style:solid;border-width:1.2em 1.2em 0 0;border-color:transparent;border-top-color:inherit}.ui.card .image>.ribbon.label,.ui.image>.ribbon.label{position:absolute;top:1rem}.ui.card .image>.ui.ribbon.label,.ui.image>.ui.ribbon.label{left:calc(.05rem - 1.2em)}.ui.card .image>.ui[class*="right ribbon"].label,.ui.image>.ui[class*="right ribbon"].label{left:calc(100% + -.05rem + 1.2em);padding-left:.833em}.ui.table td>.ui.ribbon.label{left:calc(-1em - 1.2em)}.ui.table td>.ui[class*="right ribbon"].label{left:calc(100% + 1em + 1.2em);padding-left:.833em}.ui.attached.label,.ui[class*="top attached"].label{width:100%;position:absolute;margin:0;top:0;left:0;padding:.75em 1em;border-radius:.21428571rem .21428571rem 0 0}.ui[class*="bottom attached"].label{top:auto;bottom:0;border-radius:0 0 .21428571rem .21428571rem}.ui[class*="top left attached"].label{width:auto;margin-top:0!important;border-radius:.21428571rem 0 .28571429rem 0}.ui[class*="top right attached"].label{width:auto;left:auto;right:0;border-radius:0 .21428571rem 0 .28571429rem}.ui[class*="bottom left attached"].label{width:auto;top:auto;bottom:0;border-radius:0 .28571429rem 0 .21428571rem}.ui[class*="bottom right attached"].label{top:auto;bottom:0;left:auto;right:0;width:auto;border-radius:.28571429rem 0 .21428571rem 0}.ui.label.disabled{opacity:.5}.ui.labels a.label:hover,a.ui.label:hover{background-color:#e0e0e0;border-color:#e0e0e0;background-image:none;color:rgba(0,0,0,.8)}.ui.labels a.label:hover:before,a.ui.label:hover:before{color:rgba(0,0,0,.8)}.ui.active.label{background-color:#d0d0d0;border-color:#d0d0d0;background-image:none;color:rgba(0,0,0,.95)}.ui.active.label:before{background-color:#d0d0d0;background-image:none;color:rgba(0,0,0,.95)}.ui.labels a.active.label:hover,a.ui.active.label:hover{background-color:#c8c8c8;border-color:#c8c8c8;background-image:none;color:rgba(0,0,0,.95)}.ui.labels a.active.label:hover:before,a.ui.active.label:hover:before{background-color:#c8c8c8;background-image:none;color:rgba(0,0,0,.95)}.ui.label.visible:not(.dropdown),.ui.labels.visible .label{display:inline-block!important}.ui.label.hidden,.ui.labels.hidden .label{display:none!important}.ui.basic.label,.ui.basic.labels .label{background:none #fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none}.ui.basic.labels a.label:hover,a.ui.basic.label:hover{text-decoration:none;background:none #fff;color:#1e70bf;-webkit-box-shadow:none;box-shadow:none}.ui.basic.pointing.label:before{border-color:inherit}.ui.fluid.labels>.label,.ui.label.fluid{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.ui.inverted.label,.ui.inverted.labels .label{color:rgba(255,255,255,.9);background-color:#b5b5b5}.ui.inverted.corner.label{border-color:#b5b5b5}.ui.inverted.corner.label:hover{border-color:#e8e8e8;-webkit-transition:none;transition:none}.ui.inverted.basic.label,.ui.inverted.basic.label:hover,.ui.inverted.basic.labels .label{border-color:rgba(255,255,255,.5);background:#1b1c1d}.ui.inverted.basic.label:hover{color:#4183c4}.ui.primary.labels .label,.ui.ui.ui.primary.label{background-color:#2185d0;border-color:#2185d0;color:rgba(255,255,255,.9)}.ui.primary.labels a.label:hover,a.ui.ui.ui.primary.label:hover{background-color:#1678c2;border-color:#1678c2;color:#fff}.ui.ui.ui.primary.ribbon.label{border-color:#1a69a4}.ui.basic.labels .primary.label,.ui.ui.ui.basic.primary.label{background:none #fff;border-color:#2185d0;color:#2185d0}.ui.basic.labels a.primary.label:hover,a.ui.ui.ui.basic.primary.label:hover{background:none #fff;border-color:#1678c2;color:#1678c2}.ui.inverted.labels .primary.label,.ui.ui.ui.inverted.primary.label{background-color:#54c8ff;border-color:#54c8ff;color:#1b1c1d}.ui.inverted.labels a.primary.label:hover,a.ui.ui.ui.inverted.primary.label:hover{background-color:#21b8ff;border-color:#21b8ff;color:#1b1c1d}.ui.ui.ui.inverted.primary.ribbon.label{border-color:#21b8ff}.ui.inverted.basic.labels .primary.label,.ui.ui.ui.inverted.basic.primary.label{background-color:#1b1c1d;border-color:#54c8ff;color:#54c8ff}.ui.inverted.basic.labels a.primary.label:hover,a.ui.ui.ui.inverted.basic.primary.label:hover{border-color:#21b8ff;background-color:#1b1c1d;color:#21b8ff}.ui.inverted.basic.tag.labels .primary.label,.ui.ui.ui.inverted.primary.basic.tag.label{border:1px solid #54c8ff}.ui.inverted.basic.tag.labels .primary.label:before,.ui.ui.ui.inverted.primary.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.secondary.labels .label,.ui.ui.ui.secondary.label{background-color:#1b1c1d;border-color:#1b1c1d;color:rgba(255,255,255,.9)}.ui.secondary.labels a.label:hover,a.ui.ui.ui.secondary.label:hover{background-color:#27292a;border-color:#27292a;color:#fff}.ui.ui.ui.secondary.ribbon.label{border-color:#020203}.ui.basic.labels .secondary.label,.ui.ui.ui.basic.secondary.label{background:none #fff;border-color:#1b1c1d;color:#1b1c1d}.ui.basic.labels a.secondary.label:hover,a.ui.ui.ui.basic.secondary.label:hover{background:none #fff;border-color:#27292a;color:#27292a}.ui.inverted.labels .secondary.label,.ui.ui.ui.inverted.secondary.label{background-color:#545454;border-color:#545454;color:#1b1c1d}.ui.inverted.labels a.secondary.label:hover,a.ui.ui.ui.inverted.secondary.label:hover{background-color:#6e6e6e;border-color:#6e6e6e;color:#1b1c1d}.ui.ui.ui.inverted.secondary.ribbon.label{border-color:#3b3b3b}.ui.inverted.basic.labels .secondary.label,.ui.ui.ui.inverted.basic.secondary.label{background-color:#1b1c1d;border-color:#545454;color:#545454}.ui.inverted.basic.labels a.secondary.label:hover,a.ui.ui.ui.inverted.basic.secondary.label:hover{border-color:#6e6e6e;background-color:#1b1c1d;color:#6e6e6e}.ui.inverted.basic.tag.labels .secondary.label,.ui.ui.ui.inverted.secondary.basic.tag.label{border:1px solid #545454}.ui.inverted.basic.tag.labels .secondary.label:before,.ui.ui.ui.inverted.secondary.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.red.labels .label,.ui.ui.ui.red.label{background-color:#db2828;border-color:#db2828;color:#fff}.ui.red.labels a.label:hover,a.ui.ui.ui.red.label:hover{background-color:#d01919;border-color:#d01919;color:#fff}.ui.ui.ui.red.ribbon.label{border-color:#b21e1e}.ui.basic.labels .red.label,.ui.ui.ui.basic.red.label{background:none #fff;border-color:#db2828;color:#db2828}.ui.basic.labels a.red.label:hover,a.ui.ui.ui.basic.red.label:hover{background:none #fff;border-color:#d01919;color:#d01919}.ui.inverted.labels .red.label,.ui.ui.ui.inverted.red.label{background-color:#ff695e;border-color:#ff695e;color:#1b1c1d}.ui.inverted.labels a.red.label:hover,a.ui.ui.ui.inverted.red.label:hover{background-color:#ff392b;border-color:#ff392b;color:#1b1c1d}.ui.ui.ui.inverted.red.ribbon.label{border-color:#ff392b}.ui.inverted.basic.labels .red.label,.ui.ui.ui.inverted.basic.red.label{background-color:#1b1c1d;border-color:#ff695e;color:#ff695e}.ui.inverted.basic.labels a.red.label:hover,a.ui.ui.ui.inverted.basic.red.label:hover{border-color:#ff392b;background-color:#1b1c1d;color:#ff392b}.ui.inverted.basic.tag.labels .red.label,.ui.ui.ui.inverted.red.basic.tag.label{border:1px solid #ff695e}.ui.inverted.basic.tag.labels .red.label:before,.ui.ui.ui.inverted.red.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.orange.labels .label,.ui.ui.ui.orange.label{background-color:#f2711c;border-color:#f2711c;color:#fff}.ui.orange.labels a.label:hover,a.ui.ui.ui.orange.label:hover{background-color:#f26202;border-color:#f26202;color:#fff}.ui.ui.ui.orange.ribbon.label{border-color:#cf590c}.ui.basic.labels .orange.label,.ui.ui.ui.basic.orange.label{background:none #fff;border-color:#f2711c;color:#f2711c}.ui.basic.labels a.orange.label:hover,a.ui.ui.ui.basic.orange.label:hover{background:none #fff;border-color:#f26202;color:#f26202}.ui.inverted.labels .orange.label,.ui.ui.ui.inverted.orange.label{background-color:#ff851b;border-color:#ff851b;color:#1b1c1d}.ui.inverted.labels a.orange.label:hover,a.ui.ui.ui.inverted.orange.label:hover{background-color:#e76b00;border-color:#e76b00;color:#1b1c1d}.ui.ui.ui.inverted.orange.ribbon.label{border-color:#e76b00}.ui.inverted.basic.labels .orange.label,.ui.ui.ui.inverted.basic.orange.label{background-color:#1b1c1d;border-color:#ff851b;color:#ff851b}.ui.inverted.basic.labels a.orange.label:hover,a.ui.ui.ui.inverted.basic.orange.label:hover{border-color:#e76b00;background-color:#1b1c1d;color:#e76b00}.ui.inverted.basic.tag.labels .orange.label,.ui.ui.ui.inverted.orange.basic.tag.label{border:1px solid #ff851b}.ui.inverted.basic.tag.labels .orange.label:before,.ui.ui.ui.inverted.orange.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.ui.ui.yellow.label,.ui.yellow.labels .label{background-color:#fbbd08;border-color:#fbbd08;color:#fff}.ui.yellow.labels a.label:hover,a.ui.ui.ui.yellow.label:hover{background-color:#eaae00;border-color:#eaae00;color:#fff}.ui.ui.ui.yellow.ribbon.label{border-color:#cd9903}.ui.basic.labels .yellow.label,.ui.ui.ui.basic.yellow.label{background:none #fff;border-color:#fbbd08;color:#fbbd08}.ui.basic.labels a.yellow.label:hover,a.ui.ui.ui.basic.yellow.label:hover{background:none #fff;border-color:#eaae00;color:#eaae00}.ui.inverted.labels .yellow.label,.ui.ui.ui.inverted.yellow.label{background-color:#ffe21f;border-color:#ffe21f;color:#1b1c1d}.ui.inverted.labels a.yellow.label:hover,a.ui.ui.ui.inverted.yellow.label:hover{background-color:#ebcd00;border-color:#ebcd00;color:#1b1c1d}.ui.ui.ui.inverted.yellow.ribbon.label{border-color:#ebcd00}.ui.inverted.basic.labels .yellow.label,.ui.ui.ui.inverted.basic.yellow.label{background-color:#1b1c1d;border-color:#ffe21f;color:#ffe21f}.ui.inverted.basic.labels a.yellow.label:hover,a.ui.ui.ui.inverted.basic.yellow.label:hover{border-color:#ebcd00;background-color:#1b1c1d;color:#ebcd00}.ui.inverted.basic.tag.labels .yellow.label,.ui.ui.ui.inverted.yellow.basic.tag.label{border:1px solid #ffe21f}.ui.inverted.basic.tag.labels .yellow.label:before,.ui.ui.ui.inverted.yellow.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.olive.labels .label,.ui.ui.ui.olive.label{background-color:#b5cc18;border-color:#b5cc18;color:#fff}.ui.olive.labels a.label:hover,a.ui.ui.ui.olive.label:hover{background-color:#a7bd0d;border-color:#a7bd0d;color:#fff}.ui.ui.ui.olive.ribbon.label{border-color:#8d9e13}.ui.basic.labels .olive.label,.ui.ui.ui.basic.olive.label{background:none #fff;border-color:#b5cc18;color:#b5cc18}.ui.basic.labels a.olive.label:hover,a.ui.ui.ui.basic.olive.label:hover{background:none #fff;border-color:#a7bd0d;color:#a7bd0d}.ui.inverted.labels .olive.label,.ui.ui.ui.inverted.olive.label{background-color:#d9e778;border-color:#d9e778;color:#1b1c1d}.ui.inverted.labels a.olive.label:hover,a.ui.ui.ui.inverted.olive.label:hover{background-color:#d2e745;border-color:#d2e745;color:#1b1c1d}.ui.ui.ui.inverted.olive.ribbon.label{border-color:#cddf4d}.ui.inverted.basic.labels .olive.label,.ui.ui.ui.inverted.basic.olive.label{background-color:#1b1c1d;border-color:#d9e778;color:#d9e778}.ui.inverted.basic.labels a.olive.label:hover,a.ui.ui.ui.inverted.basic.olive.label:hover{border-color:#d2e745;background-color:#1b1c1d;color:#d2e745}.ui.inverted.basic.tag.labels .olive.label,.ui.ui.ui.inverted.olive.basic.tag.label{border:1px solid #d9e778}.ui.inverted.basic.tag.labels .olive.label:before,.ui.ui.ui.inverted.olive.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.green.labels .label,.ui.ui.ui.green.label{background-color:#21ba45;border-color:#21ba45;color:#fff}.ui.green.labels a.label:hover,a.ui.ui.ui.green.label:hover{background-color:#16ab39;border-color:#16ab39;color:#fff}.ui.ui.ui.green.ribbon.label{border-color:#198f35}.ui.basic.labels .green.label,.ui.ui.ui.basic.green.label{background:none #fff;border-color:#21ba45;color:#21ba45}.ui.basic.labels a.green.label:hover,a.ui.ui.ui.basic.green.label:hover{background:none #fff;border-color:#16ab39;color:#16ab39}.ui.inverted.labels .green.label,.ui.ui.ui.inverted.green.label{background-color:#2ecc40;border-color:#2ecc40;color:#1b1c1d}.ui.inverted.labels a.green.label:hover,a.ui.ui.ui.inverted.green.label:hover{background-color:#1ea92e;border-color:#1ea92e;color:#1b1c1d}.ui.ui.ui.inverted.green.ribbon.label{border-color:#25a233}.ui.inverted.basic.labels .green.label,.ui.ui.ui.inverted.basic.green.label{background-color:#1b1c1d;border-color:#2ecc40;color:#2ecc40}.ui.inverted.basic.labels a.green.label:hover,a.ui.ui.ui.inverted.basic.green.label:hover{border-color:#1ea92e;background-color:#1b1c1d;color:#1ea92e}.ui.inverted.basic.tag.labels .green.label,.ui.ui.ui.inverted.green.basic.tag.label{border:1px solid #2ecc40}.ui.inverted.basic.tag.labels .green.label:before,.ui.ui.ui.inverted.green.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.teal.labels .label,.ui.ui.ui.teal.label{background-color:#00b5ad;border-color:#00b5ad;color:#fff}.ui.teal.labels a.label:hover,a.ui.ui.ui.teal.label:hover{background-color:#009c95;border-color:#009c95;color:#fff}.ui.ui.ui.teal.ribbon.label{border-color:#00827c}.ui.basic.labels .teal.label,.ui.ui.ui.basic.teal.label{background:none #fff;border-color:#00b5ad;color:#00b5ad}.ui.basic.labels a.teal.label:hover,a.ui.ui.ui.basic.teal.label:hover{background:none #fff;border-color:#009c95;color:#009c95}.ui.inverted.labels .teal.label,.ui.ui.ui.inverted.teal.label{background-color:#6dffff;border-color:#6dffff;color:#1b1c1d}.ui.inverted.labels a.teal.label:hover,a.ui.ui.ui.inverted.teal.label:hover{background-color:#3affff;border-color:#3affff;color:#1b1c1d}.ui.ui.ui.inverted.teal.ribbon.label{border-color:#3affff}.ui.inverted.basic.labels .teal.label,.ui.ui.ui.inverted.basic.teal.label{background-color:#1b1c1d;border-color:#6dffff;color:#6dffff}.ui.inverted.basic.labels a.teal.label:hover,a.ui.ui.ui.inverted.basic.teal.label:hover{border-color:#3affff;background-color:#1b1c1d;color:#3affff}.ui.inverted.basic.tag.labels .teal.label,.ui.ui.ui.inverted.teal.basic.tag.label{border:1px solid #6dffff}.ui.inverted.basic.tag.labels .teal.label:before,.ui.ui.ui.inverted.teal.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.blue.labels .label,.ui.ui.ui.blue.label{background-color:#2185d0;border-color:#2185d0;color:#fff}.ui.blue.labels a.label:hover,a.ui.ui.ui.blue.label:hover{background-color:#1678c2;border-color:#1678c2;color:#fff}.ui.ui.ui.blue.ribbon.label{border-color:#1a69a4}.ui.basic.labels .blue.label,.ui.ui.ui.basic.blue.label{background:none #fff;border-color:#2185d0;color:#2185d0}.ui.basic.labels a.blue.label:hover,a.ui.ui.ui.basic.blue.label:hover{background:none #fff;border-color:#1678c2;color:#1678c2}.ui.inverted.labels .blue.label,.ui.ui.ui.inverted.blue.label{background-color:#54c8ff;border-color:#54c8ff;color:#1b1c1d}.ui.inverted.labels a.blue.label:hover,a.ui.ui.ui.inverted.blue.label:hover{background-color:#21b8ff;border-color:#21b8ff;color:#1b1c1d}.ui.ui.ui.inverted.blue.ribbon.label{border-color:#21b8ff}.ui.inverted.basic.labels .blue.label,.ui.ui.ui.inverted.basic.blue.label{background-color:#1b1c1d;border-color:#54c8ff;color:#54c8ff}.ui.inverted.basic.labels a.blue.label:hover,a.ui.ui.ui.inverted.basic.blue.label:hover{border-color:#21b8ff;background-color:#1b1c1d;color:#21b8ff}.ui.inverted.basic.tag.labels .blue.label,.ui.ui.ui.inverted.blue.basic.tag.label{border:1px solid #54c8ff}.ui.inverted.basic.tag.labels .blue.label:before,.ui.ui.ui.inverted.blue.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.ui.ui.violet.label,.ui.violet.labels .label{background-color:#6435c9;border-color:#6435c9;color:#fff}.ui.violet.labels a.label:hover,a.ui.ui.ui.violet.label:hover{background-color:#5829bb;border-color:#5829bb;color:#fff}.ui.ui.ui.violet.ribbon.label{border-color:#502aa1}.ui.basic.labels .violet.label,.ui.ui.ui.basic.violet.label{background:none #fff;border-color:#6435c9;color:#6435c9}.ui.basic.labels a.violet.label:hover,a.ui.ui.ui.basic.violet.label:hover{background:none #fff;border-color:#5829bb;color:#5829bb}.ui.inverted.labels .violet.label,.ui.ui.ui.inverted.violet.label{background-color:#a291fb;border-color:#a291fb;color:#1b1c1d}.ui.inverted.labels a.violet.label:hover,a.ui.ui.ui.inverted.violet.label:hover{background-color:#745aff;border-color:#745aff;color:#1b1c1d}.ui.ui.ui.inverted.violet.ribbon.label{border-color:#7860f9}.ui.inverted.basic.labels .violet.label,.ui.ui.ui.inverted.basic.violet.label{background-color:#1b1c1d;border-color:#a291fb;color:#a291fb}.ui.inverted.basic.labels a.violet.label:hover,a.ui.ui.ui.inverted.basic.violet.label:hover{border-color:#745aff;background-color:#1b1c1d;color:#745aff}.ui.inverted.basic.tag.labels .violet.label,.ui.ui.ui.inverted.violet.basic.tag.label{border:1px solid #a291fb}.ui.inverted.basic.tag.labels .violet.label:before,.ui.ui.ui.inverted.violet.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.purple.labels .label,.ui.ui.ui.purple.label{background-color:#a333c8;border-color:#a333c8;color:#fff}.ui.purple.labels a.label:hover,a.ui.ui.ui.purple.label:hover{background-color:#9627ba;border-color:#9627ba;color:#fff}.ui.ui.ui.purple.ribbon.label{border-color:#82299f}.ui.basic.labels .purple.label,.ui.ui.ui.basic.purple.label{background:none #fff;border-color:#a333c8;color:#a333c8}.ui.basic.labels a.purple.label:hover,a.ui.ui.ui.basic.purple.label:hover{background:none #fff;border-color:#9627ba;color:#9627ba}.ui.inverted.labels .purple.label,.ui.ui.ui.inverted.purple.label{background-color:#dc73ff;border-color:#dc73ff;color:#1b1c1d}.ui.inverted.labels a.purple.label:hover,a.ui.ui.ui.inverted.purple.label:hover{background-color:#cf40ff;border-color:#cf40ff;color:#1b1c1d}.ui.ui.ui.inverted.purple.ribbon.label{border-color:#cf40ff}.ui.inverted.basic.labels .purple.label,.ui.ui.ui.inverted.basic.purple.label{background-color:#1b1c1d;border-color:#dc73ff;color:#dc73ff}.ui.inverted.basic.labels a.purple.label:hover,a.ui.ui.ui.inverted.basic.purple.label:hover{border-color:#cf40ff;background-color:#1b1c1d;color:#cf40ff}.ui.inverted.basic.tag.labels .purple.label,.ui.ui.ui.inverted.purple.basic.tag.label{border:1px solid #dc73ff}.ui.inverted.basic.tag.labels .purple.label:before,.ui.ui.ui.inverted.purple.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.pink.labels .label,.ui.ui.ui.pink.label{background-color:#e03997;border-color:#e03997;color:#fff}.ui.pink.labels a.label:hover,a.ui.ui.ui.pink.label:hover{background-color:#e61a8d;border-color:#e61a8d;color:#fff}.ui.ui.ui.pink.ribbon.label{border-color:#c71f7e}.ui.basic.labels .pink.label,.ui.ui.ui.basic.pink.label{background:none #fff;border-color:#e03997;color:#e03997}.ui.basic.labels a.pink.label:hover,a.ui.ui.ui.basic.pink.label:hover{background:none #fff;border-color:#e61a8d;color:#e61a8d}.ui.inverted.labels .pink.label,.ui.ui.ui.inverted.pink.label{background-color:#ff8edf;border-color:#ff8edf;color:#1b1c1d}.ui.inverted.labels a.pink.label:hover,a.ui.ui.ui.inverted.pink.label:hover{background-color:#ff5bd1;border-color:#ff5bd1;color:#1b1c1d}.ui.ui.ui.inverted.pink.ribbon.label{border-color:#ff5bd1}.ui.inverted.basic.labels .pink.label,.ui.ui.ui.inverted.basic.pink.label{background-color:#1b1c1d;border-color:#ff8edf;color:#ff8edf}.ui.inverted.basic.labels a.pink.label:hover,a.ui.ui.ui.inverted.basic.pink.label:hover{border-color:#ff5bd1;background-color:#1b1c1d;color:#ff5bd1}.ui.inverted.basic.tag.labels .pink.label,.ui.ui.ui.inverted.pink.basic.tag.label{border:1px solid #ff8edf}.ui.inverted.basic.tag.labels .pink.label:before,.ui.ui.ui.inverted.pink.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.brown.labels .label,.ui.ui.ui.brown.label{background-color:#a5673f;border-color:#a5673f;color:#fff}.ui.brown.labels a.label:hover,a.ui.ui.ui.brown.label:hover{background-color:#975b33;border-color:#975b33;color:#fff}.ui.ui.ui.brown.ribbon.label{border-color:#805031}.ui.basic.labels .brown.label,.ui.ui.ui.basic.brown.label{background:none #fff;border-color:#a5673f;color:#a5673f}.ui.basic.labels a.brown.label:hover,a.ui.ui.ui.basic.brown.label:hover{background:none #fff;border-color:#975b33;color:#975b33}.ui.inverted.labels .brown.label,.ui.ui.ui.inverted.brown.label{background-color:#d67c1c;border-color:#d67c1c;color:#1b1c1d}.ui.inverted.labels a.brown.label:hover,a.ui.ui.ui.inverted.brown.label:hover{background-color:#b0620f;border-color:#b0620f;color:#1b1c1d}.ui.ui.ui.inverted.brown.ribbon.label{border-color:#a96216}.ui.inverted.basic.labels .brown.label,.ui.ui.ui.inverted.basic.brown.label{background-color:#1b1c1d;border-color:#d67c1c;color:#d67c1c}.ui.inverted.basic.labels a.brown.label:hover,a.ui.ui.ui.inverted.basic.brown.label:hover{border-color:#b0620f;background-color:#1b1c1d;color:#b0620f}.ui.inverted.basic.tag.labels .brown.label,.ui.ui.ui.inverted.brown.basic.tag.label{border:1px solid #d67c1c}.ui.inverted.basic.tag.labels .brown.label:before,.ui.ui.ui.inverted.brown.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.grey.labels .label,.ui.ui.ui.grey.label{background-color:#767676;border-color:#767676;color:#fff}.ui.grey.labels a.label:hover,a.ui.ui.ui.grey.label:hover{background-color:#838383;border-color:#838383;color:#fff}.ui.ui.ui.grey.ribbon.label{border-color:#5d5d5d}.ui.basic.labels .grey.label,.ui.ui.ui.basic.grey.label{background:none #fff;border-color:#767676;color:#767676}.ui.basic.labels a.grey.label:hover,a.ui.ui.ui.basic.grey.label:hover{background:none #fff;border-color:#838383;color:#838383}.ui.inverted.labels .grey.label,.ui.ui.ui.inverted.grey.label{background-color:#dcddde;border-color:#dcddde;color:#1b1c1d}.ui.inverted.labels a.grey.label:hover,a.ui.ui.ui.inverted.grey.label:hover{background-color:#c2c4c5;border-color:#c2c4c5;color:#fff}.ui.ui.ui.inverted.grey.ribbon.label{border-color:#e9eaea}.ui.inverted.basic.labels .grey.label,.ui.ui.ui.inverted.basic.grey.label{background-color:#1b1c1d;border-color:#dcddde;color:rgba(255,255,255,.9)}.ui.inverted.basic.labels a.grey.label:hover,a.ui.ui.ui.inverted.basic.grey.label:hover{border-color:#c2c4c5;background-color:#1b1c1d}.ui.inverted.basic.tag.labels .grey.label,.ui.ui.ui.inverted.grey.basic.tag.label{border:1px solid #dcddde}.ui.inverted.basic.tag.labels .grey.label:before,.ui.ui.ui.inverted.grey.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.black.labels .label,.ui.ui.ui.black.label{background-color:#1b1c1d;border-color:#1b1c1d;color:#fff}.ui.black.labels a.label:hover,a.ui.ui.ui.black.label:hover{background-color:#27292a;border-color:#27292a;color:#fff}.ui.ui.ui.black.ribbon.label{border-color:#020203}.ui.basic.labels .black.label,.ui.ui.ui.basic.black.label{background:none #fff;border-color:#1b1c1d;color:#1b1c1d}.ui.basic.labels a.black.label:hover,a.ui.ui.ui.basic.black.label:hover{background:none #fff;border-color:#27292a;color:#27292a}.ui.inverted.labels .black.label,.ui.ui.ui.inverted.black.label{background-color:#545454;border-color:#545454;color:#1b1c1d}.ui.inverted.labels a.black.label:hover,a.ui.ui.ui.inverted.black.label:hover{background-color:#000;border-color:#000;color:#fff}.ui.ui.ui.inverted.black.ribbon.label{border-color:#616161}.ui.inverted.basic.labels .black.label,.ui.ui.ui.inverted.basic.black.label{background-color:#1b1c1d;border-color:#545454;color:rgba(255,255,255,.9)}.ui.inverted.basic.labels a.black.label:hover,a.ui.ui.ui.inverted.basic.black.label:hover{border-color:#000;background-color:#1b1c1d}.ui.inverted.basic.tag.labels .black.label,.ui.ui.ui.inverted.black.basic.tag.label{border:1px solid #545454}.ui.inverted.basic.tag.labels .black.label:before,.ui.ui.ui.inverted.black.basic.tag.label:before{border-color:inherit;border-width:1px 0 0 1px;border-style:inherit;background-color:#1b1c1d;right:calc(100% + 1px)}.ui.horizontal.label,.ui.horizontal.labels .label{margin:0 .5em 0 0;padding:.4em .833em;min-width:3em;text-align:center}.ui.circular.label,.ui.circular.labels .label{min-width:2em;min-height:2em;padding:.5em!important;line-height:1em;text-align:center;border-radius:500rem}.ui.empty.circular.label,.ui.empty.circular.labels .label{min-width:0;min-height:0;overflow:hidden;width:.5em;height:.5em;vertical-align:baseline}.ui.pointing.label{position:relative}.ui.attached.pointing.label{position:absolute}.ui.pointing.label:before{background-color:inherit;background-image:inherit;border-width:0;border-style:solid;border-color:inherit}.ui.pointing.label:before{position:absolute;content:'';-webkit-transform:rotate(45deg);transform:rotate(45deg);background-image:none;z-index:2;width:.6666em;height:.6666em;-webkit-transition:none;transition:none}.ui.pointing.label,.ui[class*="pointing above"].label{margin-top:1em}.ui.pointing.label:before,.ui[class*="pointing above"].label:before{border-width:1px 0 0 1px;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);top:0;left:50%}.ui[class*="bottom pointing"].label,.ui[class*="pointing below"].label{margin-top:0;margin-bottom:1em}.ui[class*="bottom pointing"].label:before,.ui[class*="pointing below"].label:before{border-width:0 1px 1px 0;top:auto;right:auto;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);top:100%;left:50%}.ui[class*="left pointing"].label{margin-top:0;margin-left:.6666em}.ui[class*="left pointing"].label:before{border-width:0 0 1px 1px;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);bottom:auto;right:auto;top:50%;left:0}.ui[class*="right pointing"].label{margin-top:0;margin-right:.6666em}.ui[class*="right pointing"].label:before{border-width:1px 1px 0 0;-webkit-transform:translateX(50%) translateY(-50%) rotate(45deg);transform:translateX(50%) translateY(-50%) rotate(45deg);top:50%;right:0;bottom:auto;left:auto}.ui.basic.pointing.label:before,.ui.basic[class*="pointing above"].label:before{margin-top:-1px}.ui.basic[class*="bottom pointing"].label:before,.ui.basic[class*="pointing below"].label:before{bottom:auto;top:100%;margin-top:1px}.ui.basic[class*="left pointing"].label:before{top:50%;left:-1px}.ui.basic[class*="right pointing"].label:before{top:50%;right:-1px}.ui.floating.label{position:absolute;z-index:100;top:-1em;right:0;white-space:nowrap;-webkit-transform:translateX(50%);transform:translateX(50%)}.ui.right.aligned.floating.label{-webkit-transform:translateX(1.2em);transform:translateX(1.2em)}.ui.left.floating.label{left:0;right:auto;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.ui.left.aligned.floating.label{-webkit-transform:translateX(-1.2em);transform:translateX(-1.2em)}.ui.bottom.floating.label{top:auto;bottom:-1em}.ui.label,.ui.labels .label{font-size:.85714286rem}.ui.mini.label,.ui.mini.labels .label{font-size:.64285714rem}.ui.tiny.label,.ui.tiny.labels .label{font-size:.71428571rem}.ui.small.label,.ui.small.labels .label{font-size:.78571429rem}.ui.large.label,.ui.large.labels .label{font-size:1rem}.ui.big.label,.ui.big.labels .label{font-size:1.28571429rem}.ui.huge.label,.ui.huge.labels .label{font-size:1.42857143rem}.ui.massive.label,.ui.massive.labels .label{font-size:1.71428571rem}.ui.menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin:1rem 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;background:#fff;font-weight:400;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);border-radius:.28571429rem;min-height:2.85714286em}.ui.menu:after{content:'';display:block;height:0;clear:both;visibility:hidden}.ui.menu:first-child{margin-top:0}.ui.menu:last-child{margin-bottom:0}.ui.menu .menu{margin:0}.ui.menu:not(.vertical)>.menu{display:-webkit-box;display:-ms-flexbox;display:flex}.ui.menu:not(.vertical) .item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.menu .item{position:relative;vertical-align:middle;line-height:1;text-decoration:none;-webkit-tap-highlight-color:transparent;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:0 0;padding:.92857143em 1.14285714em;text-transform:none;color:rgba(0,0,0,.87);font-weight:400;-webkit-transition:background .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background .1s ease,box-shadow .1s ease,color .1s ease;transition:background .1s ease,box-shadow .1s ease,color .1s ease,-webkit-box-shadow .1s ease}.ui.menu>.item:first-child{border-radius:.28571429rem 0 0 .28571429rem}.ui.menu .item:before{position:absolute;content:'';top:0;right:0;height:100%;width:1px;background:rgba(34,36,38,.1)}.ui.menu .item>a:not(.ui),.ui.menu .item>p:only-child,.ui.menu .text.item>*{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;line-height:1.3}.ui.menu .item>p:first-child{margin-top:0}.ui.menu .item>p:last-child{margin-bottom:0}.ui.menu .item>i.icon{opacity:.9;float:none;margin:0 .35714286em 0 0}.ui.menu:not(.vertical) .item>.button{position:relative;top:0;margin:-.5em 0;padding-bottom:.78571429em;padding-top:.78571429em;font-size:1em}.ui.menu>.container,.ui.menu>.grid{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:inherit;-ms-flex-align:inherit;align-items:inherit;-webkit-box-orient:inherit;-webkit-box-direction:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.menu .item>.input{width:100%}.ui.menu:not(.vertical) .item>.input{position:relative;top:0;margin:-.5em 0}.ui.menu .item>.input input{font-size:1em;padding-top:.57142857em;padding-bottom:.57142857em}.ui.menu .header.item,.ui.vertical.menu .header.item{margin:0;background:'';text-transform:normal;font-weight:700}.ui.vertical.menu .item>.header:not(.ui){margin:0 0 .5em;font-size:1em;font-weight:700}.ui.menu .item>i.dropdown.icon{padding:0;float:right;margin:0 0 0 1em}.ui.menu .dropdown.item .menu{min-width:calc(100% - 1px);border-radius:0 0 .28571429rem .28571429rem;background:#fff;margin:0 0 0;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.08);box-shadow:0 1px 3px 0 rgba(0,0,0,.08);-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.ui.menu .ui.dropdown .menu>.item{margin:0;text-align:left;font-size:1em!important;padding:.78571429em 1.14285714em!important;background:0 0!important;color:rgba(0,0,0,.87)!important;text-transform:none!important;font-weight:400!important;-webkit-box-shadow:none!important;box-shadow:none!important;-webkit-transition:none!important;transition:none!important}.ui.menu .ui.dropdown .menu>.item:hover{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown .menu>.selected.item{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown .menu>.active.item{background:rgba(0,0,0,.03)!important;font-weight:700!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown.item .menu .item:not(.filtered){display:block}.ui.menu .ui.dropdown .menu>.item .icon:not(.dropdown){display:inline-block;font-size:1em!important;float:none;margin:0 .75em 0 0!important}.ui.secondary.menu .dropdown.item>.menu,.ui.text.menu .dropdown.item>.menu{border-radius:.28571429rem;margin-top:.35714286em}.ui.menu .pointing.dropdown.item .menu{margin-top:.75em}.ui.inverted.menu .search.dropdown.item>.search,.ui.inverted.menu .search.dropdown.item>.text{color:rgba(255,255,255,.9)}.ui.vertical.menu .dropdown.item>.icon{float:right;content:"\f0da";margin-left:1em}.ui.vertical.menu .dropdown.item .menu{left:100%;min-width:0;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;margin:0;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.08);box-shadow:0 1px 3px 0 rgba(0,0,0,.08);border-radius:0 .28571429rem .28571429rem .28571429rem}.ui.vertical.menu .dropdown.item.upward .menu{bottom:0}.ui.vertical.menu .dropdown.item:not(.upward) .menu{top:0}.ui.vertical.menu .active.dropdown.item{border-top-right-radius:0;border-bottom-right-radius:0}.ui.vertical.menu .dropdown.active.item{-webkit-box-shadow:none;box-shadow:none}.ui.item.menu .dropdown .menu .item{width:100%}.ui.menu .item>.label:not(.floating){margin-left:1em;padding:.3em .78571429em}.ui.vertical.menu .item>.label{margin-top:-.15em;margin-bottom:-.15em;padding:.3em .78571429em}.ui.menu .item>.floating.label{padding:.3em .78571429em}.ui.menu .item>.label{background:#999;color:#fff}.ui.menu .item>.image.label img{margin:-.2833em .8em -.2833em -.8em;height:1.5666em}.ui.menu .item>img:not(.ui){display:inline-block;vertical-align:middle;margin:-.3em 0;width:2.5em}.ui.vertical.menu .item>img:not(.ui):only-child{display:block;max-width:100%;width:auto}.ui.menu .list .item:before{background:0 0!important}.ui.vertical.sidebar.menu>.item:first-child:before{display:block!important}.ui.vertical.sidebar.menu>.item::before{top:auto;bottom:0}@media only screen and (max-width:767.98px){.ui.menu>.ui.container{width:100%!important;margin-left:0!important;margin-right:0!important}}@media only screen and (min-width:768px){.ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless)>.container>.item:not(.right):not(.borderless):first-child{border-left:1px solid rgba(34,36,38,.1)}.ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless)>.container>.right.item:not(.borderless):last-child,.ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless)>.container>.right.menu>.item:not(.borderless):last-child{border-right:1px solid rgba(34,36,38,.1)}}.ui.link.menu .item:hover,.ui.menu .dropdown.item:hover,.ui.menu .link.item:hover,.ui.menu a.item:hover{cursor:pointer;background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.link.menu .item:active,.ui.menu .link.item:active,.ui.menu a.item:active{background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.menu .active.item{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);font-weight:400;-webkit-box-shadow:none;box-shadow:none}.ui.menu .active.item>i.icon{opacity:1}.ui.menu .active.item:hover,.ui.vertical.menu .active.item:hover{background-color:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.ui.menu .item.disabled{cursor:default;background-color:transparent;color:rgba(40,40,40,.3);pointer-events:none}.ui.menu:not(.vertical) .left.item,.ui.menu:not(.vertical) .left.menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin-right:auto!important}.ui.menu:not(.vertical) .right.item,.ui.menu:not(.vertical) .right.menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin-left:auto!important}.ui.menu:not(.vertical) :not(.dropdown)>.left.menu,.ui.menu:not(.vertical) :not(.dropdown)>.right.menu{display:inherit}.ui.menu:not(.vertical) .center.item,.ui.menu:not(.vertical) .center.menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin-left:auto!important;margin-right:auto!important}.ui.menu .right.item::before,.ui.menu .right.menu>.item::before{right:auto;left:0}.ui.menu .center.item:last-child::before,.ui.menu .center.menu>.item:last-child::before{display:none}.ui.vertical.menu{display:block;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.ui.vertical.menu .item{display:block;background:0 0;border-top:none;border-right:none}.ui.vertical.menu>.item:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.menu>.item:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.menu .item>.label{float:right;text-align:center}.ui.vertical.menu .item>i.icon,.ui.vertical.menu .item>i.icons{width:1.18em;float:right;margin:0 0 0 .5em}.ui.vertical.menu .item>.label+i.icon{float:none;margin:0 .5em 0 0}.ui.vertical.menu .item:before{position:absolute;content:'';top:0;left:0;width:100%;height:1px;background:rgba(34,36,38,.1)}.ui.vertical.menu .item:first-child:before{display:none!important}.ui.vertical.menu .item>.menu{margin:.5em -1.14285714em 0}.ui.vertical.menu .menu .item{background:0 0;padding:.5em 1.33333333em;font-size:.85714286em;color:rgba(0,0,0,.5)}.ui.vertical.menu .item .menu .link.item:hover,.ui.vertical.menu .item .menu a.item:hover{color:rgba(0,0,0,.85)}.ui.vertical.menu .menu .item:before{display:none}.ui.vertical.menu .active.item{background:rgba(0,0,0,.05);border-radius:0;-webkit-box-shadow:none;box-shadow:none}.ui.vertical.menu>.active.item:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.menu>.active.item:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.menu>.active.item:only-child{border-radius:.28571429rem}.ui.vertical.menu .active.item .menu .active.item{border-left:none}.ui.vertical.menu .item .menu .active.item{background-color:transparent;font-weight:700;color:rgba(0,0,0,.95)}.ui.tabular.menu{border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border:none;background:none transparent;border-bottom:1px solid #d4d4d5}.ui.tabular.fluid.menu{width:calc(100% + 2px)!important}.ui.tabular.menu .item{background:0 0;border-bottom:none;border-left:1px solid transparent;border-right:1px solid transparent;border-top:2px solid transparent;padding:.92857143em 1.42857143em;color:rgba(0,0,0,.87)}.ui.tabular.menu .item:before{display:none}.ui.tabular.menu .item:hover{background-color:transparent;color:rgba(0,0,0,.8)}.ui.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-top-width:1px;border-color:#d4d4d5;font-weight:700;margin-bottom:-1px;-webkit-box-shadow:none;box-shadow:none;border-radius:.28571429rem .28571429rem 0 0!important}.ui.tabular.menu+.attached:not(.top).segment,.ui.tabular.menu+.attached:not(.top).segment+.attached:not(.top).segment{border-top:none;margin-left:0;margin-top:0;margin-right:0;width:100%}.top.attached.segment+.ui.bottom.tabular.menu{position:relative;width:calc(100% + 2px);left:-1px}.ui.bottom.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:none;border-top:1px solid #d4d4d5}.ui.bottom.tabular.menu .item{background:0 0;border-left:1px solid transparent;border-right:1px solid transparent;border-bottom:1px solid transparent;border-top:none}.ui.bottom.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:-1px 0 0 0;border-radius:0 0 .28571429rem .28571429rem!important}.ui.vertical.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:none;border-right:1px solid #d4d4d5}.ui.vertical.tabular.menu .item{background:0 0;border-left:1px solid transparent;border-bottom:1px solid transparent;border-top:1px solid transparent;border-right:none}.ui.vertical.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:0 -1px 0 0;border-radius:.28571429rem 0 0 .28571429rem!important}.ui.vertical.right.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:none;border-right:none;border-left:1px solid #d4d4d5}.ui.vertical.right.tabular.menu .item{background:0 0;border-right:1px solid transparent;border-bottom:1px solid transparent;border-top:1px solid transparent;border-left:none}.ui.vertical.right.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:0 0 0 -1px;border-radius:0 .28571429rem .28571429rem 0!important}.ui.tabular.menu .active.dropdown.item{margin-bottom:0;border-left:1px solid transparent;border-right:1px solid transparent;border-top:2px solid transparent;border-bottom:none}.ui.pagination.menu{margin:0;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.ui.pagination.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.compact.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.pagination.menu .item:last-child:before{display:none}.ui.pagination.menu .item{min-width:3em;text-align:center}.ui.pagination.menu .icon.item i.icon{vertical-align:top}.ui.pagination.menu .active.item{border-top:none;padding-top:.92857143em;background-color:rgba(0,0,0,.05);color:rgba(0,0,0,.95);-webkit-box-shadow:none;box-shadow:none}.ui.secondary.menu{background:0 0;margin-left:-.35714286em;margin-right:-.35714286em;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none}.ui.secondary.menu .item{-ms-flex-item-align:center;align-self:center;-webkit-box-shadow:none;box-shadow:none;border:none;padding:.78571429em .92857143em;margin:0 .35714286em;background:0 0;-webkit-transition:color .1s ease;transition:color .1s ease;border-radius:.28571429rem}.ui.secondary.menu .item:before{display:none!important}.ui.secondary.menu .header.item{border-radius:0;border-right:none;background:none transparent}.ui.secondary.menu .item>img:not(.ui){margin:0}.ui.secondary.menu .dropdown.item:hover,.ui.secondary.menu .link.item:hover,.ui.secondary.menu a.item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.secondary.menu .active.item{-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);border-radius:.28571429rem}.ui.secondary.menu .active.item:hover{-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.secondary.inverted.menu .link.item:not(.disabled),.ui.secondary.inverted.menu a.item:not(.disabled){color:rgba(255,255,255,.7)}.ui.secondary.inverted.menu .dropdown.item:hover,.ui.secondary.inverted.menu .link.item:hover,.ui.secondary.inverted.menu a.item:hover{background:rgba(255,255,255,.08);color:#fff}.ui.secondary.inverted.menu .active.item{background:rgba(255,255,255,.15);color:#fff}.ui.secondary.item.menu{margin-left:0;margin-right:0}.ui.secondary.item.menu .item:last-child{margin-right:0}.ui.secondary.attached.menu{-webkit-box-shadow:none;box-shadow:none}.ui.vertical.secondary.menu .item:not(.dropdown)>.menu{margin:0 -.92857143em}.ui.vertical.secondary.menu .item:not(.dropdown)>.menu>.item{margin:0;padding:.5em 1.33333333em}.ui.secondary.vertical.menu>.item{border:none;margin:0 0 .35714286em;border-radius:.28571429rem!important}.ui.secondary.vertical.menu>.header.item{border-radius:0}.ui.vertical.secondary.menu .item>.menu .item{background-color:transparent}.ui.secondary.inverted.menu{background-color:transparent}.ui.secondary.pointing.menu{margin-left:0;margin-right:0;border-bottom:2px solid rgba(34,36,38,.15)}.ui.secondary.pointing.menu .item{border-bottom-color:transparent;border-bottom-style:solid;border-radius:0;-ms-flex-item-align:end;align-self:flex-end;margin:0 0 -2px;padding:.85714286em 1.14285714em;border-bottom-width:2px;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.secondary.pointing.menu .ui.dropdown .menu .item{border-bottom-width:0}.ui.secondary.pointing.menu .item>.label:not(.floating){margin-top:-.3em;margin-bottom:-.3em}.ui.secondary.pointing.menu .item>.circular.label{margin-top:-.5em;margin-bottom:-.5em}.ui.secondary.pointing.menu .header.item{color:rgba(0,0,0,.85)!important}.ui.secondary.pointing.menu .text.item{-webkit-box-shadow:none!important;box-shadow:none!important}.ui.secondary.pointing.menu .item:after{display:none}.ui.secondary.pointing.menu .dropdown.item:hover,.ui.secondary.pointing.menu .link.item:hover,.ui.secondary.pointing.menu a.item:hover{background-color:transparent;color:rgba(0,0,0,.87)}.ui.secondary.pointing.menu .dropdown.item:active,.ui.secondary.pointing.menu .link.item:active,.ui.secondary.pointing.menu a.item:active{background-color:transparent;border-color:rgba(34,36,38,.15)}.ui.secondary.pointing.menu .active.item{background-color:transparent;-webkit-box-shadow:none;box-shadow:none;border-color:currentColor;font-weight:700;color:rgba(0,0,0,.95)}.ui.secondary.pointing.menu .active.item:hover{border-color:currentColor;color:rgba(0,0,0,.95)}.ui.secondary.pointing.menu .active.dropdown.item{border-color:transparent}.ui.secondary.vertical.pointing.menu{border-bottom-width:0;border-right-width:2px;border-right-style:solid;border-right-color:rgba(34,36,38,.15)}.ui.secondary.vertical.pointing.menu .item{border-bottom:none;border-right-style:solid;border-right-color:transparent;border-radius:0!important;margin:0 -2px 0 0;border-right-width:2px}.ui.secondary.vertical.pointing.menu .active.item{border-color:currentColor}.ui.secondary.inverted.pointing.menu{border-color:rgba(255,255,255,.1)}.ui.secondary.inverted.pointing.menu .item:not(.disabled){color:rgba(255,255,255,.9)}.ui.secondary.inverted.pointing.menu .header.item{color:#fff!important}.ui.secondary.inverted.pointing.menu .link.item:hover,.ui.secondary.inverted.pointing.menu a.item:hover{color:#fff}.ui.ui.secondary.inverted.pointing.menu .active.item{border-color:#fff;color:#fff;background-color:transparent}.ui.text.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none;box-shadow:none;border:none;margin:1em -.5em}.ui.text.menu .item{border-radius:0;-webkit-box-shadow:none;box-shadow:none;-ms-flex-item-align:center;align-self:center;margin:0 0;padding:.35714286em .5em;font-weight:400;color:rgba(0,0,0,.6);-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.text.menu .item:before,.ui.text.menu .menu .item:before{display:none!important}.ui.text.menu .header.item{background-color:transparent;opacity:1;color:rgba(0,0,0,.85);font-size:.92857143em;text-transform:uppercase;font-weight:700}.ui.text.menu .item>img:not(.ui){margin:0}.ui.text.item.menu .item{margin:0}.ui.vertical.text.menu{margin:1em 0}.ui.vertical.text.menu:first-child{margin-top:0}.ui.vertical.text.menu:last-child{margin-bottom:0}.ui.vertical.text.menu .item{margin:.57142857em 0;padding-left:0;padding-right:0}.ui.vertical.text.menu .item>i.icon{float:none;margin:0 .35714286em 0 0}.ui.vertical.text.menu .header.item{margin:.57142857em 0 .71428571em}.ui.vertical.text.menu .item:not(.dropdown)>.menu{margin:0}.ui.vertical.text.menu .item:not(.dropdown)>.menu>.item{margin:0;padding:.5em 0}.ui.text.menu .item:hover{opacity:1;background-color:transparent}.ui.text.menu .active.item{background-color:transparent;border:none;-webkit-box-shadow:none;box-shadow:none;font-weight:400;color:rgba(0,0,0,.95)}.ui.text.menu .active.item:hover{background-color:transparent}.ui.text.pointing.menu .active.item:after{-webkit-box-shadow:none;box-shadow:none}.ui.text.attached.menu{-webkit-box-shadow:none;box-shadow:none}.ui.inverted.text.menu,.ui.inverted.text.menu .active.item,.ui.inverted.text.menu .item,.ui.inverted.text.menu .item:hover{background-color:transparent}.ui.fluid.text.menu{margin-left:0;margin-right:0}.ui.vertical.icon.menu{display:inline-block;width:auto}.ui.icon.menu .item{height:auto;text-align:center;color:#1b1c1d}.ui.icon.menu .item>.icon:not(.dropdown){margin:0;opacity:1}.ui.icon.menu .icon:before{opacity:1}.ui.menu .icon.item>.icon{width:auto;margin:0 auto}.ui.vertical.icon.menu .item>.icon:not(.dropdown){display:block;opacity:1;margin:0 auto;float:none}.ui.inverted.icon.menu .item{color:#fff}.ui.labeled.icon.menu{text-align:center}.ui.labeled.icon.menu .item{min-width:6em;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.labeled.icon.menu>.item>.icon:not(.dropdown){height:1em;display:block;font-size:1.71428571em!important;margin:0 auto .5rem!important}.ui.fluid.labeled.icon.menu>.item{min-width:0}@media only screen and (max-width:767.98px){.ui.stackable.menu{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.stackable.menu .item{width:100%!important}.ui.stackable.menu .item:before{position:absolute;content:'';top:auto;bottom:0;left:0;width:100%;height:1px;background:rgba(34,36,38,.1)}.ui.stackable.menu .left.item,.ui.stackable.menu .left.menu{margin-right:0!important}.ui.stackable.menu .right.item,.ui.stackable.menu .right.menu{margin-left:0!important}.ui.stackable.menu .center.item,.ui.stackable.menu .center.menu{margin-left:0!important;margin-right:0!important}.ui.stackable.menu .center.menu,.ui.stackable.menu .left.menu,.ui.stackable.menu .right.menu{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.ui.ui.menu .primary.active.item,.ui.ui.primary.menu .active.item,.ui.ui.primary.menu .active.item:hover{color:#2185d0}.ui.ui.menu .red.active.item,.ui.ui.red.menu .active.item,.ui.ui.red.menu .active.item:hover{color:#db2828}.ui.ui.menu .orange.active.item,.ui.ui.orange.menu .active.item,.ui.ui.orange.menu .active.item:hover{color:#f2711c}.ui.ui.menu .yellow.active.item,.ui.ui.yellow.menu .active.item,.ui.ui.yellow.menu .active.item:hover{color:#fbbd08}.ui.ui.menu .olive.active.item,.ui.ui.olive.menu .active.item,.ui.ui.olive.menu .active.item:hover{color:#b5cc18}.ui.ui.green.menu .active.item,.ui.ui.green.menu .active.item:hover,.ui.ui.menu .green.active.item{color:#21ba45}.ui.ui.menu .teal.active.item,.ui.ui.teal.menu .active.item,.ui.ui.teal.menu .active.item:hover{color:#00b5ad}.ui.ui.blue.menu .active.item,.ui.ui.blue.menu .active.item:hover,.ui.ui.menu .blue.active.item{color:#2185d0}.ui.ui.menu .violet.active.item,.ui.ui.violet.menu .active.item,.ui.ui.violet.menu .active.item:hover{color:#6435c9}.ui.ui.menu .purple.active.item,.ui.ui.purple.menu .active.item,.ui.ui.purple.menu .active.item:hover{color:#a333c8}.ui.ui.menu .pink.active.item,.ui.ui.pink.menu .active.item,.ui.ui.pink.menu .active.item:hover{color:#e03997}.ui.ui.brown.menu .active.item,.ui.ui.brown.menu .active.item:hover,.ui.ui.menu .brown.active.item{color:#a5673f}.ui.ui.grey.menu .active.item,.ui.ui.grey.menu .active.item:hover,.ui.ui.menu .grey.active.item{color:#767676}.ui.ui.black.menu .active.item,.ui.ui.black.menu .active.item:hover,.ui.ui.menu .black.active.item{color:#1b1c1d}.ui.inverted.menu{border:0 solid transparent;background:#1b1c1d;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.menu .item,.ui.inverted.menu .item>a:not(.ui){background:0 0;color:rgba(255,255,255,.9)}.ui.inverted.menu .item.menu{background:0 0}.ui.inverted.menu .item:before{background:rgba(255,255,255,.08)}.ui.vertical.inverted.menu .item:before{background:rgba(255,255,255,.08)}.ui.vertical.inverted.menu .menu .item,.ui.vertical.inverted.menu .menu .item a:not(.ui){color:rgba(255,255,255,.5)}.ui.inverted.menu .header.item{margin:0;background:0 0;-webkit-box-shadow:none;box-shadow:none}.ui.ui.inverted.menu .item.disabled{color:rgba(225,225,225,.3)}.ui.inverted.menu .dropdown.item:hover,.ui.inverted.menu .link.item:hover,.ui.inverted.menu a.item:hover,.ui.link.inverted.menu .item:hover{background:rgba(255,255,255,.08);color:#fff}.ui.vertical.inverted.menu .item .menu .link.item:hover,.ui.vertical.inverted.menu .item .menu a.item:hover{background:0 0;color:#fff}.ui.inverted.menu .link.item:active,.ui.inverted.menu a.item:active{background:rgba(255,255,255,.08);color:#fff}.ui.inverted.menu .active.item{background:#3d3e3f;color:#fff!important}.ui.inverted.vertical.menu .item .menu .active.item{background:0 0;color:#fff}.ui.inverted.pointing.menu .active.item:after{background:#3d3e3f;margin:0!important;-webkit-box-shadow:none!important;box-shadow:none!important;border:none!important}.ui.inverted.menu .active.item:hover{background:#3d3e3f;color:#fff!important}.ui.inverted.pointing.menu .active.item:hover:after{background:#3d3e3f}.ui.floated.menu{float:left;margin:0 .5rem 0 0}.ui.floated.menu .item:last-child:before{display:none}.ui.right.floated.menu{float:right;margin:0 0 0 .5rem}.ui.ui.inverted.menu .primary.active.item,.ui.ui.inverted.primary.menu{background-color:#2185d0}.ui.inverted.primary.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.primary.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.primary.menu .active.item{background-color:#1678c2}.ui.ui.inverted.menu .red.active.item,.ui.ui.inverted.red.menu{background-color:#db2828}.ui.inverted.red.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.red.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.red.menu .active.item{background-color:#d01919}.ui.ui.inverted.menu .orange.active.item,.ui.ui.inverted.orange.menu{background-color:#f2711c}.ui.inverted.orange.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.orange.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.orange.menu .active.item{background-color:#f26202}.ui.ui.inverted.menu .yellow.active.item,.ui.ui.inverted.yellow.menu{background-color:#fbbd08}.ui.inverted.yellow.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.yellow.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.yellow.menu .active.item{background-color:#eaae00}.ui.ui.inverted.menu .olive.active.item,.ui.ui.inverted.olive.menu{background-color:#b5cc18}.ui.inverted.olive.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.olive.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.olive.menu .active.item{background-color:#a7bd0d}.ui.ui.inverted.green.menu,.ui.ui.inverted.menu .green.active.item{background-color:#21ba45}.ui.inverted.green.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.green.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.green.menu .active.item{background-color:#16ab39}.ui.ui.inverted.menu .teal.active.item,.ui.ui.inverted.teal.menu{background-color:#00b5ad}.ui.inverted.teal.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.teal.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.teal.menu .active.item{background-color:#009c95}.ui.ui.inverted.blue.menu,.ui.ui.inverted.menu .blue.active.item{background-color:#2185d0}.ui.inverted.blue.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.blue.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.blue.menu .active.item{background-color:#1678c2}.ui.ui.inverted.menu .violet.active.item,.ui.ui.inverted.violet.menu{background-color:#6435c9}.ui.inverted.violet.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.violet.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.violet.menu .active.item{background-color:#5829bb}.ui.ui.inverted.menu .purple.active.item,.ui.ui.inverted.purple.menu{background-color:#a333c8}.ui.inverted.purple.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.purple.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.purple.menu .active.item{background-color:#9627ba}.ui.ui.inverted.menu .pink.active.item,.ui.ui.inverted.pink.menu{background-color:#e03997}.ui.inverted.pink.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.pink.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.pink.menu .active.item{background-color:#e61a8d}.ui.ui.inverted.brown.menu,.ui.ui.inverted.menu .brown.active.item{background-color:#a5673f}.ui.inverted.brown.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.brown.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.brown.menu .active.item{background-color:#975b33}.ui.ui.inverted.grey.menu,.ui.ui.inverted.menu .grey.active.item{background-color:#767676}.ui.inverted.grey.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.grey.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.grey.menu .active.item{background-color:#838383}.ui.ui.inverted.black.menu,.ui.ui.inverted.menu .black.active.item{background-color:#1b1c1d}.ui.inverted.black.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.ui.inverted.black.menu .active.item{background-color:rgba(0,0,0,.1)}.ui.inverted.pointing.black.menu .active.item{background-color:#27292a}.ui.ui.ui.inverted.pointing.menu .active.item:after{background-color:inherit}.ui.fitted.menu .item,.ui.fitted.menu .item .menu .item,.ui.menu .fitted.item{padding:0}.ui.horizontally.fitted.menu .item,.ui.horizontally.fitted.menu .item .menu .item,.ui.menu .horizontally.fitted.item{padding-top:.92857143em;padding-bottom:.92857143em}.ui.menu .vertically.fitted.item,.ui.vertically.fitted.menu .item,.ui.vertically.fitted.menu .item .menu .item{padding-left:1.14285714em;padding-right:1.14285714em}.ui.borderless.menu .item .menu .item:before,.ui.borderless.menu .item:before,.ui.menu .borderless.item:before{background:0 0!important}.ui.compact.menu{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin:0;vertical-align:middle}.ui.compact.vertical.menu{display:-ms-inline-flexbox!important;display:inline-block}.ui.compact.menu:not(.secondary) .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.compact.menu .item:last-child:before{display:none}.ui.compact.vertical.menu{width:auto!important}.ui.compact.vertical.menu .item:last-child::before{display:block}.ui.menu.fluid,.ui.vertical.menu.fluid{width:100%!important}.ui.item.menu,.ui.item.menu .item{width:100%;padding-left:0!important;padding-right:0!important;margin-left:0!important;margin-right:0!important;text-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.attached.item.menu:not(.tabular){margin:0 -1px!important}.ui.item.menu .item:last-child:before{display:none}.ui.menu.two.item .item{width:50%}.ui.menu.three.item .item{width:33.333%}.ui.menu.four.item .item{width:25%}.ui.menu.five.item .item{width:20%}.ui.menu.six.item .item{width:16.666%}.ui.menu.seven.item .item{width:14.285%}.ui.menu.eight.item .item{width:12.5%}.ui.menu.nine.item .item{width:11.11%}.ui.menu.ten.item .item{width:10%}.ui.menu.eleven.item .item{width:9.09%}.ui.menu.twelve.item .item{width:8.333%}.ui.menu.fixed{position:fixed;z-index:101;margin:0;width:100%}.ui.menu.fixed,.ui.menu.fixed .item:first-child,.ui.menu.fixed .item:last-child{border-radius:0!important}.ui.fixed.menu,.ui[class*="top fixed"].menu{top:0;left:0;right:auto;bottom:auto}.ui[class*="top fixed"].menu{border-top:none;border-left:none;border-right:none}.ui[class*="right fixed"].menu{border-top:none;border-bottom:none;border-right:none;top:0;right:0;left:auto;bottom:auto;width:auto;height:100%}.ui[class*="bottom fixed"].menu{border-bottom:none;border-left:none;border-right:none;bottom:0;left:0;top:auto;right:auto}.ui[class*="left fixed"].menu{border-top:none;border-bottom:none;border-left:none;top:0;left:0;right:auto;bottom:auto;width:auto;height:100%}.ui.fixed.menu+.ui.grid{padding-top:2.75rem}.ui.pointing.menu .item:after{visibility:hidden;position:absolute;content:'';top:100%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);background:0 0;margin:.5px 0 0;width:.57142857em;height:.57142857em;border:none;border-bottom:1px solid #d4d4d5;border-right:1px solid #d4d4d5;z-index:2;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.vertical.pointing.menu .item:after{position:absolute;top:50%;right:0;bottom:auto;left:auto;-webkit-transform:translateX(50%) translateY(-50%) rotate(45deg);transform:translateX(50%) translateY(-50%) rotate(45deg);margin:0 -.5px 0 0;border:none;border-top:1px solid #d4d4d5;border-right:1px solid #d4d4d5}.ui.pointing.menu .ui.dropdown .menu .item:after,.ui.vertical.pointing.menu .ui.dropdown .menu .item:after{display:none}.ui.pointing.menu .active.item:after{visibility:visible}.ui.pointing.menu .active.dropdown.item:after{visibility:hidden}.ui.pointing.menu .active.item .menu .active.item:after,.ui.pointing.menu .dropdown.active.item:after{display:none}.ui.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.pointing.menu .active.item:after{background-color:#f2f2f2}.ui.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .active.item:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .menu .active.item:after{background-color:#fff}.ui.inverted.pointing.menu .primary.active.item:after{background-color:#2185d0}.ui.inverted.pointing.menu .secondary.active.item:after{background-color:#1b1c1d}.ui.inverted.pointing.menu .red.active.item:after{background-color:#db2828}.ui.inverted.pointing.menu .orange.active.item:after{background-color:#f2711c}.ui.inverted.pointing.menu .yellow.active.item:after{background-color:#fbbd08}.ui.inverted.pointing.menu .olive.active.item:after{background-color:#b5cc18}.ui.inverted.pointing.menu .green.active.item:after{background-color:#21ba45}.ui.inverted.pointing.menu .teal.active.item:after{background-color:#00b5ad}.ui.inverted.pointing.menu .blue.active.item:after{background-color:#2185d0}.ui.inverted.pointing.menu .violet.active.item:after{background-color:#6435c9}.ui.inverted.pointing.menu .purple.active.item:after{background-color:#a333c8}.ui.inverted.pointing.menu .pink.active.item:after{background-color:#e03997}.ui.inverted.pointing.menu .brown.active.item:after{background-color:#a5673f}.ui.inverted.pointing.menu .grey.active.item:after{background-color:#767676}.ui.inverted.pointing.menu .black.active.item:after{background-color:#1b1c1d}.ui.attached.menu{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% + 2px);max-width:calc(100% + 2px);-webkit-box-shadow:none;box-shadow:none}.ui.attached+.ui.attached.menu:not(.top){border-top:none}.ui[class*="top attached"].menu{bottom:0;margin-bottom:0;top:0;margin-top:1rem;border-radius:.28571429rem .28571429rem 0 0}.ui.menu[class*="top attached"]:first-child{margin-top:0}.ui[class*="bottom attached"].menu{bottom:0;margin-top:0;top:0;margin-bottom:1rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui[class*="bottom attached"].menu:last-child{margin-bottom:0}.ui.top.attached.menu>.item:first-child{border-radius:.28571429rem 0 0 0}.ui.bottom.attached.menu>.item:first-child{border-radius:0 0 0 .28571429rem}.ui.attached.menu:not(.tabular){border:1px solid #d4d4d5}.ui.attached.inverted.menu{border:none}.ui.attached.tabular.menu{margin-left:0;margin-right:0;width:100%}.ui.menu{font-size:1rem}.ui.vertical.menu{width:15rem}.ui.mini.menu,.ui.mini.menu .dropdown,.ui.mini.menu .dropdown .menu>.item{font-size:.78571429rem}.ui.mini.vertical.menu:not(.icon){width:9rem}.ui.tiny.menu,.ui.tiny.menu .dropdown,.ui.tiny.menu .dropdown .menu>.item{font-size:.85714286rem}.ui.tiny.vertical.menu:not(.icon){width:11rem}.ui.small.menu,.ui.small.menu .dropdown,.ui.small.menu .dropdown .menu>.item{font-size:.92857143rem}.ui.small.vertical.menu:not(.icon){width:13rem}.ui.large.menu,.ui.large.menu .dropdown,.ui.large.menu .dropdown .menu>.item{font-size:1.07142857rem}.ui.large.vertical.menu:not(.icon){width:18rem}.ui.big.menu,.ui.big.menu .dropdown,.ui.big.menu .dropdown .menu>.item{font-size:1.14285714rem}.ui.big.vertical.menu:not(.icon){width:20rem}.ui.huge.menu,.ui.huge.menu .dropdown,.ui.huge.menu .dropdown .menu>.item{font-size:1.21428571rem}.ui.huge.vertical.menu:not(.icon){width:22rem}.ui.massive.menu,.ui.massive.menu .dropdown,.ui.massive.menu .dropdown .menu>.item{font-size:1.28571429rem}.ui.massive.vertical.menu:not(.icon){width:25rem}.ui.menu .ui.inverted.inverted.dropdown.item .menu{background:#1b1c1d;-webkit-box-shadow:none;box-shadow:none}.ui.menu .ui.inverted.dropdown .menu>.item{color:rgba(255,255,255,.8)!important}.ui.menu .ui.inverted.dropdown .menu>.active.item{background:0 0!important;color:rgba(255,255,255,.8)!important}.ui.menu .ui.inverted.dropdown .menu>.item:hover{background:rgba(255,255,255,.08)!important;color:rgba(255,255,255,.8)!important}.ui.menu .ui.inverted.dropdown .menu>.selected.item{background:rgba(255,255,255,.15)!important;color:rgba(255,255,255,.8)!important}.ui.vertical.menu .inverted.dropdown.item .menu{-webkit-box-shadow:none;box-shadow:none} + /* + * # Fomantic-UI - Segment + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */ + .ui.segment{position:relative;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);margin:1rem 0;padding:1em 1em;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.segment:first-child{margin-top:0}.ui.segment:last-child{margin-bottom:0}.ui.vertical.segment{margin:0;padding-left:0;padding-right:0;background:none transparent;border-radius:0;-webkit-box-shadow:none;box-shadow:none;border:none;border-bottom:1px solid rgba(34,36,38,.15)}.ui.vertical.segment:last-child{border-bottom:none}.ui.inverted.segment>.ui.header,.ui.inverted.segment>.ui.header>.sub.header{color:#fff}.ui[class*="bottom attached"].segment>[class*="top attached"].label{border-top-left-radius:0;border-top-right-radius:0}.ui[class*="top attached"].segment>[class*="bottom attached"].label{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.attached.segment:not(.top):not(.bottom)>[class*="top attached"].label{border-top-left-radius:0;border-top-right-radius:0}.ui.attached.segment:not(.top):not(.bottom)>[class*="bottom attached"].label{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.grid>.row>.ui.segment.column,.ui.grid>.ui.segment.column,.ui.page.grid.segment{padding-top:2em;padding-bottom:2em}.ui.grid.segment{margin:1rem 0;border-radius:.28571429rem}.ui.basic.table.segment{background:#fff;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.ui[class*="very basic"].table.segment{padding:1em 1em}.ui.segment.tab:last-child{margin-bottom:1rem}.ui.placeholder.segment{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;max-width:initial;-webkit-animation:none;animation:none;overflow:visible;padding:1em 1em;min-height:18rem;background:#f9fafb;border-color:rgba(34,36,38,.15);-webkit-box-shadow:0 2px 25px 0 rgba(34,36,38,.05) inset;box-shadow:0 2px 25px 0 rgba(34,36,38,.05) inset}.ui.placeholder.segment .button,.ui.placeholder.segment textarea{display:block}.ui.placeholder.segment .button,.ui.placeholder.segment .field,.ui.placeholder.segment textarea,.ui.placeholder.segment>.ui.input{max-width:15rem;margin-left:auto;margin-right:auto}.ui.placeholder.segment .column .button,.ui.placeholder.segment .column .field,.ui.placeholder.segment .column textarea,.ui.placeholder.segment .column>.ui.input{max-width:15rem;margin-left:auto;margin-right:auto}.ui.placeholder.segment>.inline{-ms-flex-item-align:center;align-self:center}.ui.placeholder.segment>.inline>.button{display:inline-block;width:auto;margin:0 .35714286rem 0 0}.ui.placeholder.segment>.inline>.button:last-child{margin-right:0}.ui.piled.segment,.ui.piled.segments{margin:3em 0;-webkit-box-shadow:'';box-shadow:'';z-index:auto}.ui.piled.segment:first-child{margin-top:0}.ui.piled.segment:last-child{margin-bottom:0}.ui.piled.segment:after,.ui.piled.segment:before,.ui.piled.segments:after,.ui.piled.segments:before{background-color:#fff;visibility:visible;content:'';display:block;height:100%;left:0;position:absolute;width:100%;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:'';box-shadow:''}.ui.piled.segment:before,.ui.piled.segments:before{-webkit-transform:rotate(-1.2deg);transform:rotate(-1.2deg);top:0;z-index:-2}.ui.piled.segment:after,.ui.piled.segments:after{-webkit-transform:rotate(1.2deg);transform:rotate(1.2deg);top:0;z-index:-1}.ui[class*="top attached"].piled.segment{margin-top:3em;margin-bottom:0}.ui.piled.segment[class*="top attached"]:first-child{margin-top:0}.ui.piled.segment[class*="bottom attached"]{margin-top:0;margin-bottom:3em}.ui.piled.segment[class*="bottom attached"]:last-child{margin-bottom:0}.ui.stacked.segment{padding-bottom:1.4em}.ui.stacked.segment:after,.ui.stacked.segment:before,.ui.stacked.segments:after,.ui.stacked.segments:before{content:'';position:absolute;bottom:-3px;left:0;border-top:1px solid rgba(34,36,38,.15);background:rgba(0,0,0,.03);width:100%;height:6px;visibility:visible}.ui.stacked.segment:before,.ui.stacked.segments:before{display:none}.ui.tall.stacked.segment:before,.ui.tall.stacked.segments:before{display:block;bottom:0}.ui.stacked.inverted.segment:after,.ui.stacked.inverted.segment:before,.ui.stacked.inverted.segments:after,.ui.stacked.inverted.segments:before{background-color:rgba(0,0,0,.03);border-top:1px solid rgba(34,36,38,.35)}.ui.padded.segment{padding:1.5em}.ui[class*="very padded"].segment{padding:3em}.ui.padded.segment.vertical.segment,.ui[class*="very padded"].vertical.segment{padding-left:0;padding-right:0}.ui.compact.segment{display:table}.ui.compact.segments{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.ui.compact.segments .segment,.ui.segments .compact.segment{display:block;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.ui.circular.segment{display:table-cell;padding:2em;text-align:center;vertical-align:middle;border-radius:500em}.ui.raised.raised.segment,.ui.raised.raised.segments{-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.segments{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;position:relative;margin:1rem 0;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);border-radius:.28571429rem}.ui.segments:first-child{margin-top:0}.ui.segments:last-child{margin-bottom:0}.ui.segments>.segment{top:0;bottom:0;border-radius:0;margin:0;width:auto;-webkit-box-shadow:none;box-shadow:none;border:none;border-top:1px solid rgba(34,36,38,.15)}.ui.segments:not(.horizontal)>.segment:first-child{top:0;bottom:0;border-top:none;margin-top:0;margin-bottom:0;border-radius:.28571429rem .28571429rem 0 0}.ui.segments:not(.horizontal)>.segment:last-child{top:0;bottom:0;margin-top:0;margin-bottom:0;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui.segments:not(.horizontal)>.segment:only-child{border-radius:.28571429rem}.ui.segments>.ui.segments{border-top:1px solid rgba(34,36,38,.15);margin:1rem 1rem}.ui.segments>.segments:first-child{border-top:none}.ui.segments>.segment+.segments:not(.horizontal){margin-top:0}.ui.horizontal.segments{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;background-color:transparent;padding:0;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);margin:1rem 0;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.stackable.horizontal.segments{-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.segments>.horizontal.segments{margin:0;background-color:transparent;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none;border-top:1px solid rgba(34,36,38,.15)}.ui.horizontal.segments:not(.compact)>.segment:not(.compact){-webkit-box-flex:1;flex:1 1 auto;-ms-flex:1 1 0}.ui.horizontal.segments>.segment{margin:0;min-width:0;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none;border-left:1px solid rgba(34,36,38,.15)}.ui.segments>.horizontal.segments:first-child{border-top:none}.ui.horizontal.segments:not(.stackable)>.segment:first-child{border-left:none}.ui.disabled.segment{opacity:.45;color:rgba(40,40,40,.3)}.ui.loading.segment{position:relative;cursor:default;pointer-events:none;text-shadow:none!important;-webkit-transition:all 0s linear;transition:all 0s linear}.ui.loading.segment:before{position:absolute;content:'';top:0;left:0;background:rgba(255,255,255,.8);width:100%;height:100%;border-radius:.28571429rem;z-index:100}.ui.loading.segment:after{position:absolute;content:'';top:50%;left:50%;margin:-1.5em 0 0 -1.5em;width:3em;height:3em;-webkit-animation:loader .6s infinite linear;animation:loader .6s infinite linear;border:.2em solid #767676;border-radius:500rem;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent;visibility:visible;z-index:101}.ui.basic.segment,.ui.basic.segments,.ui.segments .ui.basic.segment{background:none transparent;-webkit-box-shadow:none;box-shadow:none;border:none;border-radius:0}.ui.clearing.segment:after{content:"";display:block;clear:both}.ui.red.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #db2828}.ui.inverted.red.segment.segment.segment.segment.segment{background-color:#db2828;color:#fff}.ui.orange.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #f2711c}.ui.inverted.orange.segment.segment.segment.segment.segment{background-color:#f2711c;color:#fff}.ui.yellow.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #fbbd08}.ui.inverted.yellow.segment.segment.segment.segment.segment{background-color:#fbbd08;color:#fff}.ui.olive.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #b5cc18}.ui.inverted.olive.segment.segment.segment.segment.segment{background-color:#b5cc18;color:#fff}.ui.green.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #21ba45}.ui.inverted.green.segment.segment.segment.segment.segment{background-color:#21ba45;color:#fff}.ui.teal.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #00b5ad}.ui.inverted.teal.segment.segment.segment.segment.segment{background-color:#00b5ad;color:#fff}.ui.blue.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #2185d0}.ui.inverted.blue.segment.segment.segment.segment.segment{background-color:#2185d0;color:#fff}.ui.violet.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #6435c9}.ui.inverted.violet.segment.segment.segment.segment.segment{background-color:#6435c9;color:#fff}.ui.purple.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #a333c8}.ui.inverted.purple.segment.segment.segment.segment.segment{background-color:#a333c8;color:#fff}.ui.pink.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #e03997}.ui.inverted.pink.segment.segment.segment.segment.segment{background-color:#e03997;color:#fff}.ui.brown.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #a5673f}.ui.inverted.brown.segment.segment.segment.segment.segment{background-color:#a5673f;color:#fff}.ui.grey.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #767676}.ui.inverted.grey.segment.segment.segment.segment.segment{background-color:#767676;color:#fff}.ui.black.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #1b1c1d}.ui.inverted.black.segment.segment.segment.segment.segment{background-color:#1b1c1d;color:#fff}.ui[class*="left aligned"].segment{text-align:left}.ui[class*="right aligned"].segment{text-align:right}.ui[class*="center aligned"].segment{text-align:center}.ui.floated.segment,.ui[class*="left floated"].segment{float:left;margin-right:1em}.ui[class*="right floated"].segment{float:right;margin-left:1em}.ui.inverted.segment{border:none;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.segment,.ui.primary.inverted.segment{background:#1b1c1d;color:rgba(255,255,255,.9)}.ui.inverted.segment .segment{color:rgba(0,0,0,.87)}.ui.inverted.segment .inverted.segment{color:rgba(255,255,255,.9)}.ui.inverted.attached.segment{border-color:#555}.ui.inverted.loading.segment{color:#fff}.ui.inverted.loading.segment:before{background:rgba(0,0,0,.85)}.ui.secondary.segment{background:#f3f4f5;color:rgba(0,0,0,.6)}.ui.secondary.inverted.segment{background:#4c4f52 -webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,.2)),to(rgba(255,255,255,.2)));background:#4c4f52 -webkit-linear-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.2) 100%);background:#4c4f52 linear-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.2) 100%);color:rgba(255,255,255,.8)}.ui.tertiary.segment{background:#dcddde;color:rgba(0,0,0,.6)}.ui.tertiary.inverted.segment{background:#717579 -webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,.35)),to(rgba(255,255,255,.35)));background:#717579 -webkit-linear-gradient(rgba(255,255,255,.35) 0,rgba(255,255,255,.35) 100%);background:#717579 linear-gradient(rgba(255,255,255,.35) 0,rgba(255,255,255,.35) 100%);color:rgba(255,255,255,.8)}.ui.attached.segment{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% + 2px);max-width:calc(100% + 2px);-webkit-box-shadow:none;box-shadow:none;border:1px solid #d4d4d5}.ui.attached:not(.message)+.ui.attached.segment:not(.top){border-top:none}.ui[class*="top attached"].segment{bottom:0;margin-bottom:0;top:0;margin-top:1rem;border-radius:.28571429rem .28571429rem 0 0}.ui.segment[class*="top attached"]:first-child{margin-top:0}.ui.segment[class*="bottom attached"]{bottom:0;margin-top:0;top:0;margin-bottom:1rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui.segment[class*="bottom attached"]:last-child{margin-bottom:1rem}.ui.fitted.segment:not(.horizontally){padding-top:0;padding-bottom:0}.ui.fitted.segment:not(.vertically){padding-left:0;padding-right:0}.ui.segment,.ui.segments .segment{font-size:1rem}.ui.mini.segment,.ui.mini.segments .segment{font-size:.78571429rem}.ui.tiny.segment,.ui.tiny.segments .segment{font-size:.85714286rem}.ui.small.segment,.ui.small.segments .segment{font-size:.92857143rem}.ui.large.segment,.ui.large.segments .segment{font-size:1.14285714rem}.ui.big.segment,.ui.big.segments .segment{font-size:1.28571429rem}.ui.huge.segment,.ui.huge.segments .segment{font-size:1.42857143rem}.ui.massive.segment,.ui.massive.segments .segment{font-size:1.71428571rem} + /* + * # Fomantic-UI - Text + * http://github.com/fomantic/Fomantic-UI/ + * + * + * Released under the MIT license + * https://github.com/fomantic/Fomantic-UI/blob/master/LICENSE.md + * + */ + span.ui.primary.text{color:#2185d0}span.ui.inverted.primary.text{color:#54c8ff}span.ui.secondary.text{color:#1b1c1d}span.ui.inverted.secondary.text{color:#545454}span.ui.red.text{color:#db2828}span.ui.inverted.red.text{color:#ff695e}span.ui.orange.text{color:#f2711c}span.ui.inverted.orange.text{color:#ff851b}span.ui.yellow.text{color:#fbbd08}span.ui.inverted.yellow.text{color:#ffe21f}span.ui.olive.text{color:#b5cc18}span.ui.inverted.olive.text{color:#d9e778}span.ui.green.text{color:#21ba45}span.ui.inverted.green.text{color:#2ecc40}span.ui.teal.text{color:#00b5ad}span.ui.inverted.teal.text{color:#6dffff}span.ui.blue.text{color:#2185d0}span.ui.inverted.blue.text{color:#54c8ff}span.ui.violet.text{color:#6435c9}span.ui.inverted.violet.text{color:#a291fb}span.ui.purple.text{color:#a333c8}span.ui.inverted.purple.text{color:#dc73ff}span.ui.pink.text{color:#e03997}span.ui.inverted.pink.text{color:#ff8edf}span.ui.brown.text{color:#a5673f}span.ui.inverted.brown.text{color:#d67c1c}span.ui.grey.text{color:#767676}span.ui.inverted.grey.text{color:#dcddde}span.ui.black.text{color:#1b1c1d}span.ui.inverted.black.text{color:#545454}span.ui.disabled.text{opacity:.45}span.ui.medium.text{font-size:1em}span.ui.mini.text{font-size:.4em}span.ui.tiny.text{font-size:.5em}span.ui.small.text{font-size:.75em}span.ui.large.text{font-size:1.5em}span.ui.big.text{font-size:2em}span.ui.huge.text{font-size:4em}span.ui.massive.text{font-size:8em} diff --git a/code/modules/vchat/css/ss13styles.css b/code/modules/vchat/css/ss13styles.css new file mode 100644 index 0000000000..570cc72cea --- /dev/null +++ b/code/modules/vchat/css/ss13styles.css @@ -0,0 +1,220 @@ +/* VChat Styles */ +body.inverted { + background-color: #111111; +} + +#topmenu { + overflow-x: auto; + overflow-y: hidden; +} + +#contentbox { + margin-top: 3.3rem; /* Make room for the fixed top menu */ + overflow-wrap: break-word; + word-wrap: break-word; /* IE, blah */ +} + +.menu, .item { + padding-top: 0.2em !important; + padding-bottom: 0.2em !important; +} + +.ui.menu .item > .label:not(.floating) { + margin-left: 0; + padding-bottom: 0; + padding-top: 0; + text-align: center; + font-size: 10px; +} + +.item { + cursor: pointer; +} + +.inputbox { + width: 5em !important; + padding: 0.1em !important; +} + +.icon-left-open-outline:hover, .icon-right-open-outline:hover, .icon-cancel-circled-outline:hover { + color: red; +} + +.blinkwarn { + color: #FF0000; + animation: blink-animation 1s steps(5, start) infinite; +} + +@keyframes blink-animation { + to { + visibility: hidden; + } +} + +/* SS13 Styles */ +#messagebox {font-family: Verdana, sans-serif;} + +#messagebox h1, #messagebox h2, #messagebox h3, #messagebox h4, #messagebox h5, #messagebox h6 {color: #0000ff; font-family: Georgia, Verdana, sans-serif;} + +#messagebox em {font-style: normal; font-weight: bold;} +#messagebox a {text-decoration: underline;} + +.motd {color: #638500;font-family: Verdana, sans-serif;} +.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 + {color: #638500;text-decoration: underline;} +.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover + {color: #638500;} + +.prefix {font-weight: bold;} +.log_message {color: #386AFF; font-weight: bold;} +/*.inverted .message {color: #386AFF; font-weight: bold;}*/ + +/* OOC */ +.ooc {font-weight: bold;} +.ooc img.text_tag {width: 32px; height: 10px;} + +.ooc .everyone {color: #002eb8;} +.inverted .ooc .everyone {color: #004ed8;} /* Dark mode */ +.looc {color: #3A9696;} +.ooc .elevated {color: #2e78d9;} +.ooc .moderator {color: #184880;} +.ooc .developer {color: #1b521f;} +.ooc .admin {color: #b82e00;} +.ooc .event_manager {color: #660033;} +.ooc .aooc {color: #960018;} + +/* Admin: Private Messages */ +.pm .howto {color: #ff0000; font-weight: bold; font-size: 200%;} +.pm .in {color: #ff0000;} +.pm .out {color: #ff0000;} +.pm .other {color: #0000ff;} + +/* Admin: Channels */ +.mod_channel {color: #735638; font-weight: bold;} +.mod_channel .admin {color: #b82e00; font-weight: bold;} +.admin_channel {color: #9611D4; font-weight: bold;} +.event_channel {color: #cc3399; font-weight: bold;} + +/* Radio: Misc */ +.deadsay {color: #530FAD;} +.inverted .deadsay {color: #732FCD;} /* Dark mode */ +.radio {color: #008000;} +.deptradio {color: #ff00ff;} /* when all other department colors fail */ +.newscaster {color: #750000;} + +/* Radio Channels */ +.comradio {color: #193A7A;} +.inverted .comradio {color: #395A9A;} /* Dark mode */ +.syndradio {color: #6D3F40;} +.centradio {color: #5C5C8A;} +.airadio {color: #FF00FF;} +.entradio {color: #339966;} + +.secradio {color: #A30000;} +.engradio {color: #A66300;} +.medradio {color: #008160;} +.sciradio {color: #993399;} +.supradio {color: #5F4519;} +.srvradio {color: #6eaa2c;} +.expradio {color: #555555;} + +/* Miscellaneous */ +.name {font-weight: bold;} +.say {} +.emote {} +.alert {color: #ff0000;} +h1.alert, h2.alert {color: #000000;} + +/* Game Messages */ + +.attack {color: #ff0000;} +.moderate {color: #CC0000;} +.disarm {color: #990000;} +.passive {color: #660000;} + +.critical {color: #ff0000; font-weight: bold; font-size: 150%;} +.danger {color: #ff0000; font-weight: bold;} +.warning {color: #ff0000; font-style: italic;} +.rose {color: #ff5050;} +.info {color: #0000CC;} +.inverted .info {color: #6060c9;} /* Dark mode */ +.notice {color: #000099;} +.inverted .notice {color: #6060c9;} /* Dark mode */ +.alium {color: #00ff00;} +.cult {color: #800080; font-weight: bold; font-style: italic;} + +.reflex_shoot {color: #000099; font-style: italic;} + +/* Languages */ + +.alien {color: #543354;} +.tajaran {color: #803B56;} +.tajaran_signlang {color: #941C1C;} +.akhani {color: #AC398C;} +.skrell {color: #00B0B3;} +.skrellfar {color: #70FCFF;} +.soghun {color: #228B22;} +.solcom {color: #22228B;} +.changeling {color: #800080;} +.sergal {color: #0077FF; font-family: "Comic Sans MS";} +.birdsongc {color: #CC9900;} +.vulpkanin {color: #B97A57;} +.enochian {color: #848A33; letter-spacing:-1pt; word-spacing:4pt; font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;} +.daemon {color: #5E339E; letter-spacing:-1pt; word-spacing:0pt; font-family: "Courier New", Courier, monospace;} +.bug {color: #9e9e39;} +.vox {color: #AA00AA;} +.zaddat {color: #941C1C;} +.rough {font-family: "Trebuchet MS", cursive, sans-serif;} +.say_quote {font-family: Georgia, Verdana, sans-serif;} +.terminus {font-family: "Times New Roman", Times, serif, sans-serif} +.interface {color: #330033;} + +/*BIG IMG.icon {width: 32px; height: 32px;}*/ +img.icon {vertical-align: middle; max-height: 1em;} +img.icon.bigicon {max-height: 32px;} + +/* Zoom levels - Replaced with arbitrary font sizes +.zoom_normal { + font-size: 0.9em; + line-height: 1.35; +} +.zoom_more { + font-size: 1.2em; + line-height: 1.4; +} +.zoom_less { + font-size: 0.8em; + line-height: 1.2; +} +*/ + +/* Debug Logs */ +.debug_error {color:#FF0000; font-weight:bold} +.debug_warning {color:#FF0000;} +.debug_info {} +.debug_debug {color:#0000FF;} +.debug_trace {color:#888888;} + +/* Log animations */ +.msgsanim-enter-active { + transition: opacity 0.5s, transform 0.5s; +} +.msgsanim-enter { + opacity: 0; + transform: translateX(15px); +} + +/* Dog mode */ +.woof { + background-color: rgba(255,255,255,0) !important; + background-image: url('dog.gif') !important; + background-size: cover !important; + + transition: background-color 15s; +} + +.woof div, .woof span { + background-color: rgba(0,0,0,0) !important; + + transition: background-color 15s; +} diff --git a/code/modules/vchat/css/vchat-font-embedded.css b/code/modules/vchat/css/vchat-font-embedded.css new file mode 100644 index 0000000000..b32c6015cd --- /dev/null +++ b/code/modules/vchat/css/vchat-font-embedded.css @@ -0,0 +1,61 @@ +@font-face { + font-family: 'vchat'; + src: url('../font/vchat.eot?83566288'); + src: url('../font/vchat.eot?83566288#iefix') format('embedded-opentype'), + url('../font/vchat.svg?83566288#vchat') format('svg'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'vchat'; + src: url('data:application/octet-stream;base64,d09GRgABAAAAABC8AA8AAAAAGsgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABWAAAADsAAABUIIslek9TLzIAAAGUAAAAQwAAAFY+IEjXY21hcAAAAdgAAABnAAABxOlCnH9jdnQgAAACQAAAABMAAAAgBtX/BGZwZ20AAAJUAAAFkAAAC3CKkZBZZ2FzcAAAB+QAAAAIAAAACAAAABBnbHlmAAAH7AAABcYAAAc4Lw5OdGhlYWQAAA20AAAAMwAAADYX4wdTaGhlYQAADegAAAAfAAAAJAc5A1dobXR4AAAOCAAAACAAAAAgGg7/+mxvY2EAAA4oAAAAEgAAABIJOAc8bWF4cAAADjwAAAAgAAAAIAE/DAZuYW1lAAAOXAAAAXsAAAKpxQA+9HBvc3QAAA/YAAAAZwAAAKXxwKkScHJlcAAAEEAAAAB6AAAAhuVBK7x4nGNgZGBg4GIwYLBjYHJx8wlh4MtJLMljkGJgYYAAkDwymzEnMz2RgQPGA8qxgGkOIGaDiAIAJjsFSAB4nGNgZHZinMDAysDAVMW0h4GBoQdCMz5gMGRkAooysDIzYAUBaa4pDA4vGF6wMQf9z2KIYg5imAYUZgTJAQDU/gt1AHic7ZHBCYBADATnNN6BWIpYkC8fFp8udBNThoFZ2CXksQEWYBa7MGgXjZhTact8Zs3cOHLHIvf+PFJC5S110q7pYmfIdv7ZUu9yIxr7yA4L9YYX8QsvolUv4k9eqF/1/8F4AW2zFTUAeJxjYEADEhDIHPQ/C4QBEmwD3QB4nK1WaXfTRhQdeUmchCwlCy1qYcTEabBGJmzBgAlBsmMgXZytlaCLFDvpvvGJ3+Bf82Tac+g3flrvGy8kkLTncJqTo3fnzdXM22USWpLYC+uRlJsvxdTWJo3sPAnphk3LUXwoO3shZYrJ3wVREK2W2rcdh0REIlC1rrBEEPseWZpkfOhRRsu2pFdNyi096S5b40G9Vd9+GjrKsTuhpGYzdGg9siVVGFWiSKY9UtKmZaj6K0krvL/CzFfNUMKITiJpvBnG0EjeG2e0ymg1tuMoimyy3ChSJJrhQRR5lNUS5+SKCQzKB82Q8sqnEeXD/Iis2KOcVrBLttP8vi95p3c5P7Ffb1G25EAfyI7s4Ox0JV+EW1th3LST7ShUEXbXd0Js2exU/2aP8ppGA7crMr3QjGCpfIUQKz+hzP4hWS2cT/mSR6NaspETQetlTuxLPoHW44gpcc0YWdDd0QkR1P2SMwz2mD4e/PHeKZYLEwJ4HMt6RyWcCBMpYXM0SdowcmAlZYsqqfWumDjldVrEW8J+7drRl85o41B3YjxbDx1bOVHJ8WhSp5lMndpJzaMpDaKUdCZ4zK8DKD+iSV5tYzWJlUfTOGbGhEQiAi3cS1NBLDuxpCkEzaMZvbkbprl2LVqkyQP13KP39OZWuLnTU9oO9LNGf1anYjrYC9PpaeQv8Wna5SJF6frpGX5M4kHWAjKRLTbDlIMHb/0O0svXlhyF1wbY7u3zK6h91kTwpAH7G9AeT9UpCUyFmFWIVkBirWtZlsnVrBapyNR3Q5pWvqzTBIpyHBfHvoxx/V8zM5aYEr7fidOzIy49c+1LCNMcfJt1PZrXqcVyAXFmeU6nWZbv6zTH8gOd5lme1+kIS1unoyw/1GmB5Uc6HWN5QQuadN/BkIsw5AIOkDCEpQNDWF6CISwVDGG5CENYFmEIyyUYwvJjGMJyGYawvKxl1dRTSePamVgGbEJgYo4eucxF5WoquVRCu2hUakOeEm6VVBTPqn9loF488oY5sBZIl8iaXzHOlY9G5fjWFS1vGjtXwLHqbx+O9jnxUtaLhT8F/9XWVCW9Ys3Dk6vwG4aebCeqNql4dE2Xz1U9uv5fVFRYC/QbSIVYKMqybHBnIoSPOp2GaqCVQ8xszDy063XLmp/D/TcxQhZQ/fg3FBoL3INOWUlZ7eCs1dfbstw7g3I4EyxJMTfz+lb4IiOz0n6RWcqej3wecAWMSmXYagOtFbzZJzEPmd4kzwRxW1E2SNrYzgSJDRzzgHnznQQmYeqqDeRO4YYN+AVhbsF5J1yieqMsh+5F7PMopPxbp+JE9qhojMCz2Rthr+9Cym9xDCQ0+aV+DFQVoakYNRXQNFJuqAZfxtm6bULGDvQjKnbDsqziw8cW95WSbRmEfKSI1aOjn9Zeok6q3H5mFJfvnb4FwSA1MX9733RxkMq7WskyR20DU7calVPXmkPjVYfq5lH1vePsEzlrmm66Jx56X9Oq28HFXCyw9m0O0lImF9T1YYUNosvFpVDqZTRJ77gHGBYY0O9Qio3/q/rYfJ4rVYXRcSTfTtS30edgDPwP2H9H9QPQ92Pocg0uz/eaE59u9OFsma6iF+un6Dcwa625WboG3NB0A+IhR62OuMoNfKcGcXqkuRzpIeBj3RXiAcAmgMXgE921jOZTAKP5jDk+wOfMYdBkDoMt5jDYZs4awA5zGOwyh8Eecxh8wZx1gC+ZwyBkDoOIOQyeMCcAeMocBl8xh8HXzGHwDXPuA3zLHAYxcxgkzGGwr+nWMMwtXtBdoLZBVaADU09Y3MPiUFNlyP6OF4b9vUHM/sEgpv6o6faQ+hMvDPVng5j6i0FM/VXTnSH1N14Y6u8GMfUPg5j6TL8Yy2UGv4x8lwoHlF1sPufvifcP28VAuQABAAH//wAPeJx9Vd1vG1UWP+fe+fbHeMYz49ilk6mdjFNn7Kbjj/EKN7G3oWnThOxWprjBzVqrlQpSK5BgtaUqJUDYtAkVL6u2i/K6AoGEUB53tTywD/Ba1BqWl/aFFx5W/AF0zB0XVqvVaqWR7sfvnDvn/s75nQsUYPQp/ZCMIA0NOAMvt1+CeIzG4vQSEBCBiIMUAgg8CANVIryMnMJzg6ROlATG4kpsoCFFpF02UOwBW6w0A9NAWHv69KkTi532sSeDM80z/tHy7Iw7dWjSzk0YDbOuJWUB0phO88Ys+papGYJ4KO8WtVrjSbbOoN8ItELerTWCas0tMqheyAsZs+pbhlAsaIYVYDQVC6YhMD+GVrCRqdZrDd8STZro9PudR+921rHfvjvbQmxaNt5VUinlrmOGX3itu6bz09q28L7pOObztmfjBcsmeeOCU3KQ3O63w9+MTyBSpz9fevQuM72YMlJo2jhfcswLuq5j+Cd2EjZt7wl8wbJt6wWb+T4/PhAAuNEPoxfp53QVNDgNXTgP2+2tJUtLUSIoVOWIpBxzkjwnSwmBxORqKR6TRIGL8UsiUlCAKpcE5GIY4/BSEhnnkqxIA5AhxsmxAfsB6cWRkPhJQOR7wPMJ/tTZZ1ZX0vr6uWfOnz3/61+tdFe7Tx0P6nPlGTc3oZ9OL0+kVN6axYJYFDNiJshUg0xQDIoi9a1JDBpVfxItQcWMjSoKhfwRFJM4i3mXTcZLt7GAxQou4Ng0mMdqOi8Ylj+PbtG3kaVjHsncXvmTtbffXvukvOftr25tre57haacXlaTLXtVV7JBkFX0VbuVVJc1uTm9N8XAkxG4piu5CNTWIvBkWm5OPe21Wr0WaZc662Tj2oDrkW/3q9c3X9/29/f97dc3r1cx5xVOmVx9e/JEtlHLnnCuV6m5XPC8wrIV7Z7M1upsd7vOmacKXvgqO26+O19b31pnH2MReKaDD+hFaoLEMjUNR6AJF9q/MxFhhtW0g7xEl4ADmXDyIIZEQUACA0CgEtJBHCXgRYkfgCgIYhdEUeiBIAorR+cUGaFem2sebVa8qfzkwVw2mZA1ReM5kFBKRPWfT6I1jxX8N3tYW0CXlfKURYRivhjR7k67bDSsjB9M+41aBZkPjn4m5Pizl8nVD6+Sy2Fv7vfpIVaG5Ms/11uvHT22uIFr1fybWj5rGehfvHPn6ztkjyz2Nze4s9e7weWPr1z5+PKj+4tH/tBo3b5Hvg6H35D01dJv38tX31JredTfuPPNLfLecI/VMuPoK/I++RbikAUXqrDUXuQRY4JMCUUyiEoWaJcNFHoKJ1GgsDJTPJBLJhAq5WJ1pnrIybkHXCOdyCazogBxjMcZA5nHymfKZX2AMp1rho2sAdRc/J9InSF7kTI3N7DfYfqLpOtg77+27MP9Dt6LOkHodfrkL7YVemN94z3LfvTc/wFZ74PR38k1EoIKB6HULmYSQnTJpSjjhGU8siBdIAR6bAIrE1kjz/ETs9NGlDEZWcgG05A1jRZL1xGmq5qbF8m1jYVOObyJL3t/PFe+dascWnhY9Wz14UPV9tTn2htYxlcYeu6tCP1HOIy2Hz6ITICMRqNPf4rJhl+0G0+YCZ5j0bCgeBxnAMYJgIh/DiP2Nda9c9mUrdkxBVRUhcdsRwp2a0HDz8gY0cqEHxWXH8jo7i1sEPbzSsXb8vCV8J1yxGbqwYPUZCmFh8Ov1F/234zwNyqeF95kOPmnM6M9eJgqTapYYteJ9ERZrNv0IxqM9XQYTrSPTztZyjEGeWQxU46wxsbsOKCsbggiYXVDSPSEEFyJRHPwQMb8T6lI46cCdFaHOqT9Rsp1hJSVzliPe1SkkehWjaiHWSLe/wx1En4XbobfEdQ/uz0chl8Oh3/bjSe1mHRjR4xpyfjuru5qOzd0V6fV8F/hlfB7DifwGuZ++GukocgDL91IOOLurugkbuxorr6zw1zgRy8nWgkAAHicY2BkYGAA4jclBQ7x/DZfGbiZXwBFGG7lP7wJo///+Z/P/ILZF8jlYGACiQIAm8gPXAB4nGNgZGBgDvqfBSRf/P/z/w/zCwagCArgAAC2HgeVAAPoAAADqgAAA8P//ANrAAACpgAAAn4AAAJ+//8Dqv//AAAAAACwAYQCFgKMAtYDLAOcAAAAAQAAAAgAXgAFAAAAAAACACYANgBzAAAAmAtwAAAAAHicdZLNTgIxFIVPBTRCdKGJGzd3o5GYDCOJG1YaIixcmLBg42oc5o8MU9IpJLyA7+AD+Fo+i4fSKC6cpu13zr29vU0GwBm+oLD77jl3rNCi2vEBjjDw3KD/6LlJHnluoYNnz4dUU89t3OLVcwfneGcF1TymmuPDs0JbNTwf4FSdeG7Qv/TcJF95buFC9Twf0n/y3MZUvXju4Fp9DvVyY4ost3Iz7Eo/7IfythFNq6iiUqKVzbWp5UFSXdmkLHUQ68U6ziM7SbJVGRnHbpkmpi50JXdB6PQ4qRIT2WS2rVivs761qaRGL2Tka8nS6HkS2yC3djno9fbvwBAaS2xgUCBDDgvBDd0u9z5CNwVvzBBm7rIKVIhQ0omw4oncRWrqB86UqqKbMKMkB4i5LrDmnvOExYSxjCdLKrPn/9KUGduKhasluGOVcC8+ZrxyOZG7afbTY82sjF1bjtR1Y9ztwh/kb1/Cd29jczox/cC93tIdoMfxzzu+AR8YeKsAeJxtyE0KgCAQQOGZ/jMKatEtPJSMkwmDhtX9W4SLoLd7HxTwpuC/DgssscIaG2yxwx7UFsVy0sbagaLT8b7EB55ONon2vONh7pPzzcLbpePBIcuSvNu/tJIJxKLJJxK2mQEemSgqTwB4nGPw3sFwIihiIyNjX+QGxp0cDBwMyQUbGVidNjEwMmiBGJu5mBg5ICw+BjCLzWkX0wGgNCeQze60i8EBwmZmcNmowtgRGLHBoSNiI3OKy0Y1EG8XRwMDI4tDR3JIBEhJJBBs5mFi5NHawfi/dQNL70YmBhcADHYj9AAA') format('woff'), + url('data:application/octet-stream;base64,AAEAAAAPAIAAAwBwR1NVQiCLJXoAAAD8AAAAVE9TLzI+IEjXAAABUAAAAFZjbWFw6UKcfwAAAagAAAHEY3Z0IAbV/wQAAA6wAAAAIGZwZ22KkZBZAAAO0AAAC3BnYXNwAAAAEAAADqgAAAAIZ2x5Zi8OTnQAAANsAAAHOGhlYWQX4wdTAAAKpAAAADZoaGVhBzkDVwAACtwAAAAkaG10eBoO//oAAAsAAAAAIGxvY2EJOAc8AAALIAAAABJtYXhwAT8MBgAACzQAAAAgbmFtZcUAPvQAAAtUAAACqXBvc3TxwKkSAAAOAAAAAKVwcmVw5UErvAAAGkAAAACGAAEAAAAKADAAPgACREZMVAAObGF0bgAaAAQAAAAAAAAAAQAAAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAEDQgGQAAUAAAJ6ArwAAACMAnoCvAAAAeAAMQECAAACAAUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBmRWQAQOgA6AYDUv9qAFoDUgCWAAAAAQAAAAAAAAAAAAUAAAADAAAALAAAAAQAAAFgAAEAAAAAAFoAAwABAAAALAADAAoAAAFgAAQALgAAAAQABAABAADoBv//AADoAP//AAAAAQAEAAAAAQACAAMABAAFAAYABwAAAQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAZAAAAAAAAAAHAADoAAAA6AAAAAABAADoAQAA6AEAAAACAADoAgAA6AIAAAADAADoAwAA6AMAAAAEAADoBAAA6AQAAAAFAADoBQAA6AUAAAAGAADoBgAA6AYAAAAHAAMAAP++A6oC/wATADYAUgBzQHAADAsDCwwDbQACAAcAAgdgEAEAAAYFAAZgDwgCBQkBBAoFBGAOEgIKDQELDAoLYBEBAwEBA1QRAQMDAVgAAQMBTDg3FRQBAE9OS0lGREFAPTs3UjhSMjEtKygmJCEfHhoYFDYVNREOCQYAEwETEwUUKwEyFhURFAYHISImJxE0NjsBMhYXATI2NxEjIiY0NjczNCYnISImNSMiBhcVMzIWFAYnIxEUFjcBMhYUBgcjFRQGIiYnNSMiLgE2FzM1NDYyFgcVAw1BXFxB/Y9BWgFcQNErPAEBOBYeAdEKEBAK0SAV/sgsPNEVIAHRChAQCtEeFgHVFSAgFWgeLB4BZxYeAiIUZyAqIAECl1xA/l9BWgFcQAIIQVw+Kv2PHhYBbBAUEAEVHgE+KiAVZxISEgH+lBUgAQE4HiwcAWkWHh4WaR4qIAFoFSAgFWgAAAAE//z/bwPHA00AEQBLAFQAXQCHQIRHFhEQAwIGCgMPBAIICj0gDgUECQgNBgILCTMqDAsIBwYECwVHBwEDAAoAAwptBgEECwELBAFtDgEKDQEICQoIYAAJAAsECQtgAAAAAlgMAQICDEgAAQEFWAAFBQ0FSVZVTUwTElpZVV1WXVFQTFRNVEVDNzUwLSgmGhgSSxNKGBAPBRYrASMHJwcXBxc3FzM3FzcnNycHAzIWHwE3NjMyHwEWBg8BFx4BDwEGIyIvAQcOASsBIiYvAQcGIyIvASY2PwEnLgE/ATYzMh8BNz4BMxMiBhQWMj4BJicyHgEGIiY+AQIwnC2wT4WFT7AtnCyyTYSETbIsIzgJE0oPDjweTRIKGTc3GQoSTR48Dg9KEQk4JZwkOAkTSA8OPB5PEgoaNzcZChFPHjwOD0gTCTgkTiw8PFg8AkAqQVoCXn5gBFgC5bIziIB/hzKysjKHf4CIMwEaLCNJFQQ1hx9GGTY0GUYgiDMDFUojLCwjShYENYcfSBk0NRlGIIc1BBVJIyz+eTxYPD5UPjRahFpahFoAAAAABQAA/6gDbAMVAAgAEQAlAC8AOABnQGQVAQEAKAEDASABBQgDRwAEAAkCBAlgCwECCgEAAQIAYAABAAMIAQNgDAEIAAUHCAVgAAcGBgdUAAcHBlgABgcGTDEwCgkBADU0MDgxOC4sJCIfHRoZDg0JEQoRBQQACAEIDQUUKwEiDgEWPgEuAScyHgEGIiY+AQE0PwEmNTQ2JBYCBiciJwcGIyImJSYnBwYUFhcyNyUyNjQuAQ4BFgH/QVoCXn5gBFhDV3gCfKp8Anj+WDB1E9YBLtYC0pk1PH0xPUReAU8zIoIRIhkWFAEybJiY2JgCnAJEXIBeBFaIVDd4rnp6rnj91UQvdzY8l9QC2P7W2gITfCpimiIzgw80IgESgZjalgKa1pwAAAQAAP/XAqcC5QAMABkAJgAzAEdARAUBAQsGCQMCAwECYAcBAwAAA1QHAQMDAFgKBAgDAAMATCgnGxoODQEALi0nMygzISAaJhsmFBMNGQ4ZBwYADAEMDAUUKxciJicRNDYyFgcRFAYDIgYXERQeATY3ETQmASImJxE0NjIWBxEUBgMiBhcRFB4BNjURNCacQVoBXIBeAVxBFSABHiweASABWEFaAVyAXgFcQRUgAR4sHh4pXEEB1EFcXEH+LEFcAqUeFv4sFh4CIhQB1BYe/VtcQQHUQVxcQf4sQVwCpR4W/iwWHgIiFAHUFh4AAgAA/70CfgL+AA8AHQAqQCcXDQYDAgMBRwABAAMCAQNgAAIAAAJUAAICAFgAAAIATBgZFCIEBRgrJRQGJyInCQE2MhYUDwEXFiUBFjI2NC8BNzY0JiIHAn5eP0Et/o0BcyyGWS2Wli3+FgEpDyweD+DgDx4sD1tAXgEtAXQBcyxZgy2Wli3D/tYPHiwP4N8PLB4PAAL///++An4C/gAPAB4AOUA2HBUNBQQDAgFHAAEFAQIDAQJgAAMAAANUAAMDAFgEAQADAEwREAEAGhkQHhEeCwoADwEPBgUUKxciJjY/AScmNDc2MhcJAQYDIgYWHwEHBhQWMjcJASacP14CLZaWLi4shCwBdP6MLUEVIAEQ398QHyoQASn+1w9CXIItlpYugS4sLP6N/owtAtkgKBHf4BAqHw8BKgEpDwAAAAAD////hwOrAzcACAARACkARkBDJSAZAwQDAUcFAQQDAgMEAm0GAQAAAwQAA2AHAQIBAQJUBwECAgFYAAECAUwKCQEAHRsXFQ4NCREKEQUEAAgBCAgFFCsBMgASAAQAEgATMjYQJiAGEBYTFxYGIyIvAQcGIyImPwEnJjYfATc2FgcB1cIBEgL+6v6A/uoCARLCl9bW/tLW1ruLDA4RCwiJigcLEQ4Mi4sSJhGKiRImEgMz/u7+ev7wBAEYAX4BGvy61gEu1tb+0tYBbYkNIAeLiwcgDYmKESYSiooSJhEAAAEAAAABAADsdHBAXw889QALA+gAAAAA2m/h2QAAAADab+HZ//z/bwPoA00AAAAIAAIAAAAAAAAAAQAAA1L/agAAA+j//P/8A+gAAQAAAAAAAAAAAAAAAAAAAAgD6AAAA6oAAAPD//wDawAAAqYAAAJ+AAACfv//A6r//wAAAAAAsAGEAhYCjALWAywDnAAAAAEAAAAIAF4ABQAAAAAAAgAmADYAcwAAAJgLcAAAAAAAAAASAN4AAQAAAAAAAAA1AAAAAQAAAAAAAQAFADUAAQAAAAAAAgAHADoAAQAAAAAAAwAFAEEAAQAAAAAABAAFAEYAAQAAAAAABQALAEsAAQAAAAAABgAFAFYAAQAAAAAACgArAFsAAQAAAAAACwATAIYAAwABBAkAAABqAJkAAwABBAkAAQAKAQMAAwABBAkAAgAOAQ0AAwABBAkAAwAKARsAAwABBAkABAAKASUAAwABBAkABQAWAS8AAwABBAkABgAKAUUAAwABBAkACgBWAU8AAwABBAkACwAmAaVDb3B5cmlnaHQgKEMpIDIwMjAgYnkgb3JpZ2luYWwgYXV0aG9ycyBAIGZvbnRlbGxvLmNvbXZjaGF0UmVndWxhcnZjaGF0dmNoYXRWZXJzaW9uIDEuMHZjaGF0R2VuZXJhdGVkIGJ5IHN2ZzJ0dGYgZnJvbSBGb250ZWxsbyBwcm9qZWN0Lmh0dHA6Ly9mb250ZWxsby5jb20AQwBvAHAAeQByAGkAZwBoAHQAIAAoAEMAKQAgADIAMAAyADAAIABiAHkAIABvAHIAaQBnAGkAbgBhAGwAIABhAHUAdABoAG8AcgBzACAAQAAgAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAHYAYwBoAGEAdABSAGUAZwB1AGwAYQByAHYAYwBoAGEAdAB2AGMAaABhAHQAVgBlAHIAcwBpAG8AbgAgADEALgAwAHYAYwBoAGEAdABHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAQIBAwEEAQUBBgEHAQgBCQAKZm9sZGVyLWFkZAtjb2ctb3V0bGluZQ5zZWFyY2gtb3V0bGluZQ1wYXVzZS1vdXRsaW5lEWxlZnQtb3Blbi1vdXRsaW5lEnJpZ2h0LW9wZW4tb3V0bGluZRZjYW5jZWwtY2lyY2xlZC1vdXRsaW5lAAAAAAAAAQAB//8ADwAAAAAAAAAAAAAAAAAAAAAAGAAYABgAGANS/2oDUv9qsAAsILAAVVhFWSAgS7gADlFLsAZTWliwNBuwKFlgZiCKVViwAiVhuQgACABjYyNiGyEhsABZsABDI0SyAAEAQ2BCLbABLLAgYGYtsAIsIGQgsMBQsAQmWrIoAQpDRWNFUltYISMhG4pYILBQUFghsEBZGyCwOFBYIbA4WVkgsQEKQ0VjRWFksChQWCGxAQpDRWNFILAwUFghsDBZGyCwwFBYIGYgiophILAKUFhgGyCwIFBYIbAKYBsgsDZQWCGwNmAbYFlZWRuwAStZWSOwAFBYZVlZLbADLCBFILAEJWFkILAFQ1BYsAUjQrAGI0IbISFZsAFgLbAELCMhIyEgZLEFYkIgsAYjQrEBCkNFY7EBCkOwAWBFY7ADKiEgsAZDIIogirABK7EwBSWwBCZRWGBQG2FSWVgjWSEgsEBTWLABKxshsEBZI7AAUFhlWS2wBSywB0MrsgACAENgQi2wBiywByNCIyCwACNCYbACYmawAWOwAWCwBSotsAcsICBFILALQ2O4BABiILAAUFiwQGBZZrABY2BEsAFgLbAILLIHCwBDRUIqIbIAAQBDYEItsAkssABDI0SyAAEAQ2BCLbAKLCAgRSCwASsjsABDsAQlYCBFiiNhIGQgsCBQWCGwABuwMFBYsCAbsEBZWSOwAFBYZVmwAyUjYUREsAFgLbALLCAgRSCwASsjsABDsAQlYCBFiiNhIGSwJFBYsAAbsEBZI7AAUFhlWbADJSNhRESwAWAtsAwsILAAI0KyCwoDRVghGyMhWSohLbANLLECAkWwZGFELbAOLLABYCAgsAxDSrAAUFggsAwjQlmwDUNKsABSWCCwDSNCWS2wDywgsBBiZrABYyC4BABjiiNhsA5DYCCKYCCwDiNCIy2wECxLVFixBGREWSSwDWUjeC2wESxLUVhLU1ixBGREWRshWSSwE2UjeC2wEiyxAA9DVVixDw9DsAFhQrAPK1mwAEOwAiVCsQwCJUKxDQIlQrABFiMgsAMlUFixAQBDYLAEJUKKiiCKI2GwDiohI7ABYSCKI2GwDiohG7EBAENgsAIlQrACJWGwDiohWbAMQ0ewDUNHYLACYiCwAFBYsEBgWWawAWMgsAtDY7gEAGIgsABQWLBAYFlmsAFjYLEAABMjRLABQ7AAPrIBAQFDYEItsBMsALEAAkVUWLAPI0IgRbALI0KwCiOwAWBCIGCwAWG1EBABAA4AQkKKYLESBiuwcisbIlktsBQssQATKy2wFSyxARMrLbAWLLECEystsBcssQMTKy2wGCyxBBMrLbAZLLEFEystsBossQYTKy2wGyyxBxMrLbAcLLEIEystsB0ssQkTKy2wHiwAsA0rsQACRVRYsA8jQiBFsAsjQrAKI7ABYEIgYLABYbUQEAEADgBCQopgsRIGK7ByKxsiWS2wHyyxAB4rLbAgLLEBHistsCEssQIeKy2wIiyxAx4rLbAjLLEEHistsCQssQUeKy2wJSyxBh4rLbAmLLEHHistsCcssQgeKy2wKCyxCR4rLbApLCA8sAFgLbAqLCBgsBBgIEMjsAFgQ7ACJWGwAWCwKSohLbArLLAqK7AqKi2wLCwgIEcgILALQ2O4BABiILAAUFiwQGBZZrABY2AjYTgjIIpVWCBHICCwC0NjuAQAYiCwAFBYsEBgWWawAWNgI2E4GyFZLbAtLACxAAJFVFiwARawLCqwARUwGyJZLbAuLACwDSuxAAJFVFiwARawLCqwARUwGyJZLbAvLCA1sAFgLbAwLACwAUVjuAQAYiCwAFBYsEBgWWawAWOwASuwC0NjuAQAYiCwAFBYsEBgWWawAWOwASuwABa0AAAAAABEPiM4sS8BFSotsDEsIDwgRyCwC0NjuAQAYiCwAFBYsEBgWWawAWNgsABDYTgtsDIsLhc8LbAzLCA8IEcgsAtDY7gEAGIgsABQWLBAYFlmsAFjYLAAQ2GwAUNjOC2wNCyxAgAWJSAuIEewACNCsAIlSYqKRyNHI2EgWGIbIVmwASNCsjMBARUUKi2wNSywABawBCWwBCVHI0cjYbAJQytlii4jICA8ijgtsDYssAAWsAQlsAQlIC5HI0cjYSCwBCNCsAlDKyCwYFBYILBAUVizAiADIBuzAiYDGllCQiMgsAhDIIojRyNHI2EjRmCwBEOwAmIgsABQWLBAYFlmsAFjYCCwASsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsAJiILAAUFiwQGBZZrABY2EjICCwBCYjRmE4GyOwCENGsAIlsAhDRyNHI2FgILAEQ7ACYiCwAFBYsEBgWWawAWNgIyCwASsjsARDYLABK7AFJWGwBSWwAmIgsABQWLBAYFlmsAFjsAQmYSCwBCVgZCOwAyVgZFBYIRsjIVkjICCwBCYjRmE4WS2wNyywABYgICCwBSYgLkcjRyNhIzw4LbA4LLAAFiCwCCNCICAgRiNHsAErI2E4LbA5LLAAFrADJbACJUcjRyNhsABUWC4gPCMhG7ACJbACJUcjRyNhILAFJbAEJUcjRyNhsAYlsAUlSbACJWG5CAAIAGNjIyBYYhshWWO4BABiILAAUFiwQGBZZrABY2AjLiMgIDyKOCMhWS2wOiywABYgsAhDIC5HI0cjYSBgsCBgZrACYiCwAFBYsEBgWWawAWMjICA8ijgtsDssIyAuRrACJUZSWCA8WS6xKwEUKy2wPCwjIC5GsAIlRlBYIDxZLrErARQrLbA9LCMgLkawAiVGUlggPFkjIC5GsAIlRlBYIDxZLrErARQrLbA+LLA1KyMgLkawAiVGUlggPFkusSsBFCstsD8ssDYriiAgPLAEI0KKOCMgLkawAiVGUlggPFkusSsBFCuwBEMusCsrLbBALLAAFrAEJbAEJiAuRyNHI2GwCUMrIyA8IC4jOLErARQrLbBBLLEIBCVCsAAWsAQlsAQlIC5HI0cjYSCwBCNCsAlDKyCwYFBYILBAUVizAiADIBuzAiYDGllCQiMgR7AEQ7ACYiCwAFBYsEBgWWawAWNgILABKyCKimEgsAJDYGQjsANDYWRQWLACQ2EbsANDYFmwAyWwAmIgsABQWLBAYFlmsAFjYbACJUZhOCMgPCM4GyEgIEYjR7ABKyNhOCFZsSsBFCstsEIssDUrLrErARQrLbBDLLA2KyEjICA8sAQjQiM4sSsBFCuwBEMusCsrLbBELLAAFSBHsAAjQrIAAQEVFBMusDEqLbBFLLAAFSBHsAAjQrIAAQEVFBMusDEqLbBGLLEAARQTsDIqLbBHLLA0Ki2wSCywABZFIyAuIEaKI2E4sSsBFCstsEkssAgjQrBIKy2wSiyyAABBKy2wSyyyAAFBKy2wTCyyAQBBKy2wTSyyAQFBKy2wTiyyAABCKy2wTyyyAAFCKy2wUCyyAQBCKy2wUSyyAQFCKy2wUiyyAAA+Ky2wUyyyAAE+Ky2wVCyyAQA+Ky2wVSyyAQE+Ky2wViyyAABAKy2wVyyyAAFAKy2wWCyyAQBAKy2wWSyyAQFAKy2wWiyyAABDKy2wWyyyAAFDKy2wXCyyAQBDKy2wXSyyAQFDKy2wXiyyAAA/Ky2wXyyyAAE/Ky2wYCyyAQA/Ky2wYSyyAQE/Ky2wYiywNysusSsBFCstsGMssDcrsDsrLbBkLLA3K7A8Ky2wZSywABawNyuwPSstsGYssDgrLrErARQrLbBnLLA4K7A7Ky2waCywOCuwPCstsGkssDgrsD0rLbBqLLA5Ky6xKwEUKy2wayywOSuwOystsGwssDkrsDwrLbBtLLA5K7A9Ky2wbiywOisusSsBFCstsG8ssDorsDsrLbBwLLA6K7A8Ky2wcSywOiuwPSstsHIsswkEAgNFWCEbIyFZQiuwCGWwAyRQeLABFTAtAEu4AMhSWLEBAY5ZsAG5CAAIAGNwsQAFQrIAAQAqsQAFQrMKAgEIKrEABUKzDgABCCqxAAZCugLAAAEACSqxAAdCugBAAAEACSqxAwBEsSQBiFFYsECIWLEDZESxJgGIUVi6CIAAAQRAiGNUWLEDAERZWVlZswwCAQwquAH/hbAEjbECAEQAAA==') format('truetype'); +} +/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ +/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ +/* +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: 'vchat'; + src: url('../font/vchat.svg?83566288#vchat') format('svg'); + } +} +*/ + + [class^="icon-"]:before, [class*=" icon-"]:before { + font-family: "vchat"; + font-style: normal; + font-weight: normal; + speak: none; + + display: inline-block; + text-decoration: inherit; + width: 1em; + margin-right: .2em; + text-align: center; + /* opacity: .8; */ + + /* For safety - reset parent styles, that can break glyph codes*/ + font-variant: normal; + text-transform: none; + + /* fix buttons height, for twitter bootstrap */ + line-height: 1em; + + /* Animation center compensation - margins should be symmetric */ + /* remove if not needed */ + margin-left: .2em; + + /* you can be more comfortable with increased icons size */ + font-size: 150%; + + /* Uncomment for 3D effect */ + /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ +} +.icon-folder-add:before { content: '\e800'; } /* 'î €' */ +.icon-cog-outline:before { content: '\e801'; } /* 'î ' */ +.icon-search-outline:before { content: '\e802'; } /* 'î ‚' */ +.icon-pause-outline:before { content: '\e803'; } /* 'î ƒ' */ +.icon-left-open-outline:before { content: '\e804'; } /* 'î „' */ +.icon-right-open-outline:before { content: '\e805'; } /* 'î …' */ +.icon-cancel-circled-outline:before { content: '\e806'; } /* 'î †' */ \ No newline at end of file diff --git a/code/modules/vchat/html/vchat.html b/code/modules/vchat/html/vchat.html new file mode 100644 index 0000000000..a3612d78e4 --- /dev/null +++ b/code/modules/vchat/html/vchat.html @@ -0,0 +1,191 @@ + + + + VChat + + + + + + + + + + + + + + + +
+

You probably shouldn't see this page. This generally means chat is very broken.

+

You can wait a few seconds to see if it loads, or try OOC > Reload VChat.

+
+ + + + + diff --git a/code/modules/vchat/js/polyfills.js b/code/modules/vchat/js/polyfills.js new file mode 100644 index 0000000000..0d1223f7b6 --- /dev/null +++ b/code/modules/vchat/js/polyfills.js @@ -0,0 +1,78 @@ +// https://tc39.github.io/ecma262/#sec-array.prototype.find +if (!Array.prototype.find) { + Object.defineProperty(Array.prototype, 'find', { + value: function(predicate) { + // 1. Let O be ? ToObject(this value). + if (this == null) { + throw TypeError('"this" is null or not defined'); + } + + var o = Object(this); + + // 2. Let len be ? ToLength(? Get(O, "length")). + var len = o.length >>> 0; + + // 3. If IsCallable(predicate) is false, throw a TypeError exception. + if (typeof predicate !== 'function') { + throw TypeError('predicate must be a function'); + } + + // 4. If thisArg was supplied, let T be thisArg; else let T be undefined. + var thisArg = arguments[1]; + + // 5. Let k be 0. + var k = 0; + + // 6. Repeat, while k < len + while (k < len) { + // a. Let Pk be ! ToString(k). + // b. Let kValue be ? Get(O, Pk). + // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)). + // d. If testResult is true, return kValue. + var kValue = o[k]; + if (predicate.call(thisArg, kValue, k, o)) { + return kValue; + } + // e. Increase k by 1. + k++; + } + + // 7. Return undefined. + return undefined; + }, + configurable: true, + writable: true + }); +} + +if (!Date.now) { + Date.now = function now() { + return new Date().getTime(); + }; +} + +//IE ugh +function storageAvailable(type) { + var storage; + try { + storage = window[type]; + var x = '__storage_test__'; + storage.setItem(x, x); + storage.removeItem(x); + return true; + } + catch(e) { + return e instanceof DOMException && ( + // everything except Firefox + e.code === 22 || + // Firefox + e.code === 1014 || + // test name field too, because code might not be present + // everything except Firefox + e.name === 'QuotaExceededError' || + // Firefox + e.name === 'NS_ERROR_DOM_QUOTA_REACHED') && + // acknowledge QuotaExceededError only if there's something already stored + (storage && storage.length !== 0); + } +} \ No newline at end of file diff --git a/code/modules/vchat/js/vchat.js b/code/modules/vchat/js/vchat.js new file mode 100644 index 0000000000..0ecc59b529 --- /dev/null +++ b/code/modules/vchat/js/vchat.js @@ -0,0 +1,924 @@ +//The 'V' is for 'VORE' but you can pretend it's for Vue.js if you really want. + +(function(){ + var oldLog = console.log; + console.log = function (message) { + send_debug(message); + oldLog.apply(console, arguments); + }; + var oldError = console.error; + console.error = function (message) { + send_debug(message); + oldError.apply(console, arguments); + } + window.onerror = function (message, url, line, col, error) { + var stacktrace = ""; + if(error && error.stack) { + stacktrace = error.stack; + } + send_debug(message+" ("+url+"@"+line+":"+col+") "+error+"|UA: "+navigator.userAgent+"|Stack: "+stacktrace); + return true; + } +})(); + + +//Options for vchat +var vchat_opts = { + msBeforeDropped: 30000, //No ping for this long, and the server must be gone + cookiePrefix: "vst-", //If you're another server, you can change this if you want. + alwaysShow: ["vc_looc", "vc_system"], //Categories to always display on every tab + vchatTabsVer: 1.0 //Version of vchat tabs save 'file' +}; + +var DARKMODE_COLORS = { + buttonBgColor: "#40628a", + buttonTextColor: "#FFFFFF", + windowBgColor: "#272727", + highlightColor: "#009900", + tabTextColor: "#FFFFFF", + tabBackgroundColor: "#272727" +}; + +var LIGHTMODE_COLORS = { + buttonBgColor: "none", + buttonTextColor: "#000000", + windowBgColor: "none", + highlightColor: "#007700", + tabTextColor: "#000000", + tabBackgroundColor: "none" +}; + + +/*********** +* +* Setup Methods +* +************/ + +var set_storage = set_cookie; +var get_storage = get_cookie; +var domparser = new DOMParser(); + +//Upgrade to LS +if (storageAvailable('localStorage')) { + set_storage = set_localstorage; + get_storage = get_localstorage; +} + +//State-tracking variables +var vchat_state = { + ready: false, + + //Userinfo as reported by byond + byond_ip: null, + byond_cid: null, + byond_ckey: null, + + //Ping status + lastPingReceived: 0, + latency_sent: 0, + + //Last ID + lastId: 0 +} + +function start_vchat() { + //Instantiate Vue.js + start_vue(); + + //Inform byond we're done + vchat_state.ready = true; + push_Topic('done_loading'); + + //I'll do my own winsets + doWinset("htmloutput", {"is-visible": true}); + doWinset("oldoutput", {"is-visible": false}); + doWinset("chatloadlabel", {"is-visible": false}); + + //Commence the pingening + setInterval(check_ping, vchat_opts.msBeforeDropped); + + //For fun + send_debug("VChat Loaded!"); + //throw new Error("VChat Loaded!"); + +} + +//Loads vue for chat usage +var vueapp; +function start_vue() { + vueapp = new Vue({ + el: '#app', + data: { + messages: [], //List o messages from byond + shown_messages: [], //Used on filtered tabs, but not "Main" because it has 0len categories list, which bypasses filtering for speed + unshown_messages: 0, //How many messages in archive would be shown but aren't + archived_messages: [], //Too old to show + tabs: [ //Our tabs + {name: "Main", categories: [], immutable: true, active: true} + ], + unread_messages: {}, //Message categories that haven't been looked at since we got one of them + editing: false, //If we're in settings edit mode + paused: false, //Autoscrolling + latency: 0, //Not necessarily network latency, since the game server has to align the responses into ticks + reconnecting: false, //If we've lost our connection + ext_styles: "", //Styles for chat downloaded files + is_admin: false, + + //Settings + inverted: false, //Dark mode + crushing: 3, //Combine similar messages + animated: false, //Small CSS animations for new messages + fontsize: 0.9, //Font size nudging + lineheight: 130, + showingnum: 200, //How many messages to show + + //The table to map game css classes to our vchat categories + type_table: [ + { + matches: ".say, .emote", + becomes: "vc_localchat", + pretty: "Local Chat", + tooltip: "In-character local messages (say, emote, etc)", + required: false, + admin: false + }, + { + matches: ".alert, .syndradio, .centradio, .airadio, .entradio, .comradio, .secradio, .engradio, .medradio, .sciradio, .supradio, .srvradio, .expradio, .radio, .deptradio, .newscaster", + becomes: "vc_radio", + pretty: "Radio Comms", + tooltip: "All departments of radio messages", + required: false, + admin: false + }, + { + matches: ".notice:not(.pm), .adminnotice, .info, .sinister, .cult", + becomes: "vc_info", + pretty: "Notices", + tooltip: "Non-urgent messages from the game and items", + required: false, + admin: false + }, + { + matches: ".critical, .danger, .userdanger, .warning:not(.pm), .italics", + becomes: "vc_warnings", + pretty: "Warnings", + tooltip: "Urgent messages from the game and items", + required: false, + admin: false + }, + { + matches: ".deadsay", + becomes: "vc_deadchat", + pretty: "Deadchat", + tooltip: "All of deadchat", + required: false, + admin: false + }, + { + matches: ".ooc:not(.looc)", + becomes: "vc_globalooc", + pretty: "Global OOC", + tooltip: "The bluewall of global OOC messages", + required: false, + admin: false + }, + { + matches: ".pm", + becomes: "vc_adminpm", + pretty: "Admin PMs", + tooltip: "Messages to/from admins ('adminhelps')", + required: false, + admin: false + }, + { + matches: ".admin_channel", + becomes: "vc_adminchat", + pretty: "Admin Chat", + tooltip: "ASAY messages", + required: false, + admin: true + }, + { + matches: ".mod_channel", + becomes: "vc_modchat", + pretty: "Mod Chat", + tooltip: "MSAY messages", + required: false, + admin: true + }, + { + matches: ".event_channel", + becomes: "vc_eventchat", + pretty: "Event Chat", + tooltip: "ESAY messages", + required: false, + admin: true + }, + { + matches: ".ooc.looc, .ooc .looc", //Dumb game + becomes: "vc_looc", + pretty: "Local OOC", + tooltip: "Local OOC messages, always enabled", + required: true + }, + { + matches: ".boldannounce", + becomes: "vc_system", + pretty: "System Messages", + tooltip: "Messages from your client, always enabled", + required: true + } + ], + }, + mounted: function() { + //Load our settings + this.load_settings(); + + var xhr = new XMLHttpRequest(); + xhr.open('GET', 'ss13styles.css'); + xhr.onreadystatechange = (function() { + this.ext_styles = xhr.responseText; + }).bind(this); + xhr.send(); + }, + updated: function() { + if(!this.editing && !this.paused) { + window.scrollTo(0,document.getElementById("messagebox").scrollHeight); + } + }, + watch: { + reconnecting: function(newSetting, oldSetting) { + if(newSetting == true && oldSetting == false) { + this.internal_message("Your client has lost connection to the server, or there is severe lag. Your client will reconnect if possible."); + } else if (newSetting == false && oldSetting == true) { + this.internal_message("Your client has reconnected to the server."); + } + }, + //Save the inverted setting to LS + inverted: function (newSetting) { + set_storage("darkmode",newSetting); + if(newSetting) { //Special treatment for which is outside Vue's scope and has custom css + document.body.classList.add("inverted"); + switch_ui_mode(DARKMODE_COLORS); + } else { + document.body.classList.remove("inverted"); + switch_ui_mode(LIGHTMODE_COLORS); + } + }, + crushing: function (newSetting) { + set_storage("crushing",newSetting); + }, + animated: function (newSetting) { + set_storage("animated",newSetting); + }, + fontsize: function (newSetting, oldSetting) { + if(isNaN(newSetting)) { //Numbers only + this.fontsize = oldSetting; + return; + } + if(newSetting < 0.2) { + this.fontsize = 0.2; + } else if(newSetting > 5) { + this.fontsize = 5; + } + set_storage("fontsize",newSetting); + }, + lineheight: function (newSetting, oldSetting) { + if(!isFinite(newSetting)) { //Integers only + this.lineheight = oldSetting; + return; + } + if(newSetting < 100) { + this.lineheight = 100; + } else if(newSetting > 200) { + this.lineheight = 200; + } + set_storage("lineheight",newSetting); + }, + showingnum: function (newSetting, oldSetting) { + if(!isFinite(newSetting)) { //Integers only + this.showingnum = oldSetting; + return; + } + + newSetting = Math.floor(newSetting); + if(newSetting < 50) { + this.showingnum = 50; + } else if(newSetting > 2000) { + this.showingnum = 2000; + } + + set_storage("showingnum",this.showingnum); + this.attempt_archive(); + }, + current_categories: function(newSetting, oldSetting) { + if(newSetting.length) { + this.apply_filter(newSetting); + } + } + }, + computed: { + //Which tab is active? + active_tab: function() { + //Had to polyfill this stupid .find since IE doesn't have EC6 + let tab = this.tabs.find( function(tab) { + return tab.active; + }); + return tab; + }, + //What color does the latency pip get? + ping_classes: function() { + if(!this.latency) { + return this.reconnecting ? "red" : "green"; //Standard + } + + if (this.latency == "?") { return "grey"; } //Waiting for latency test reply + else if(this.latency < 0 ) {return "red"; } + else if(this.latency <= 200) { return "green"; } + else if(this.latency <= 400) { return "yellow"; } + else { return "grey"; } + }, + current_categories: function() { + if(this.active_tab == this.tabs[0]) { + return []; //Everything, no filtering, special case for speed. + } else { + return this.active_tab.categories.concat(vchat_opts.alwaysShow); + } + } + }, + methods: { + //Load the chat settings + load_settings: function() { + this.inverted = get_storage("darkmode", false); + this.crushing = get_storage("crushing", 3); + this.animated = get_storage("animated", false); + this.fontsize = get_storage("fontsize", 0.9); + this.lineheight = get_storage("lineheight", 130); + this.showingnum = get_storage("showingnum", 200); + + if(isNaN(this.crushing)){this.crushing = 3;} //This used to be a bool (03-02-2020) + if(isNaN(this.fontsize)){this.fontsize = 0.9;} //This used to be a string (03-02-2020) + + this.load_tabs(); + }, + load_tabs: function() { + var loadstring = get_storage("tabs") + if(!loadstring) + return; + var loadfile = JSON.parse(loadstring); + //Malformed somehow. + if(!loadfile.version || !loadfile.tabs) { + this.internal_message("There was a problem loading your tabs. Any new ones you make will be saved, however."); + return; + } + //Version is old? Sorry. + if(!loadfile.version == vchat_opts.vchatTabsVer) { + this.internal_message("Your saved tabs are for an older version of VChat and must be recreated, sorry."); + return; + } + + this.tabs.push.apply(this.tabs, loadfile.tabs); + }, + save_tabs: function() { + var savefile = { + version: vchat_opts.vchatTabsVer, + tabs: [] + } + + //The tabs contain a bunch of vue stuff that gets funky when you try to serialize it with stringify, so we 'purify' it + this.tabs.forEach(function(tab){ + if(tab.immutable) + return; + + var name = tab.name; + + var categories = []; + tab.categories.forEach(function(category){categories.push(category);}); + + var cleantab = {name: name, categories: categories, immutable: false, active: false} + + savefile.tabs.push(cleantab); + }); + + var savestring = JSON.stringify(savefile); + set_storage("tabs", savestring); + }, + //Change to another tab + switchtab: function(tab) { + if(tab == this.active_tab) return; + this.active_tab.active = false; + tab.active = true; + + tab.categories.forEach( function(cls) { + this.unread_messages[cls] = 0; + }, this); + + this.apply_filter(this.current_categories); + }, + //Toggle edit mode + editmode: function() { + this.editing = !this.editing; + this.save_tabs(); + }, + //Toggle autoscroll + pause: function() { + this.paused = !this.paused; + }, + //Create a new tab (stupid lack of classes in ES5...) + newtab: function() { + this.tabs.push({ + name: "New Tab", + categories: [], + immutable: false, + active: false + }); + this.switchtab(this.tabs[this.tabs.length - 1]); + }, + //Rename an existing tab + renametab: function() { + if(this.active_tab.immutable) { + return; + } + var tabtorename = this.active_tab; + var newname = window.prompt("Type the desired tab name:", tabtorename.name); + if(newname === null || newname === "" || tabtorename === null) { + return; + } + tabtorename.name = newname; + }, + //Delete the currently active tab + deltab: function(tab) { + if(!tab) { + tab = this.active_tab; + } + if(tab.immutable) { + return; + } + this.switchtab(this.tabs[0]); + this.tabs.splice(this.tabs.indexOf(tab), 1); + }, + movetab: function(tab, shift) { + if(!tab || tab.immutable) { + return; + } + var at = this.tabs.indexOf(tab); + var to = at + shift; + this.tabs.splice(to, 0, this.tabs.splice(at, 1)[0]); + }, + tab_unread_count: function(tab) { + var unreads = 0; + var thisum = this.unread_messages; + tab.categories.find( function(cls){ + if(thisum[cls]) { + unreads += thisum[cls]; + } + }); + return unreads; + }, + tab_unread_categories: function(tab) { + var unreads = false; + var thisum = this.unread_messages; + tab.categories.find( function(cls){ + if(thisum[cls]) { + unreads = true; + return true; + } + }); + + return { red: unreads, grey: !unreads}; + }, + attempt_archive: function() { + var wiggle = 20; //Wiggle room to prevent hysterisis effects. Slice off 20 at a time. + //Pushing out old messages + if(this.messages.length > this.showingnum) {//Time to slice off old messages + var too_old = this.messages.splice(0,wiggle); //We do a few at a time to avoid doing it too often + Array.prototype.push.apply(this.archived_messages, too_old); //ES6 adds spread operator. I'd use it if I could. + }/* + //Pulling back old messages + } else if(this.messages.length < (this.showingnum - wiggle)) { //Sigh, repopulate old messages + var too_new = this.archived_messages.splice(this.messages.length - (this.showingnum - wiggle)); + Array.prototype.shift.apply(this.messages, too_new); + } + */ + }, + apply_filter: function(cat_array) { + //Clean up the array + this.shown_messages.splice(0); + this.unshown_messages = 0; + + //For each message, try to find it's category in the categories we're showing + this.messages.forEach( function(msg){ + if(cat_array.indexOf(msg.category) > -1) { //Returns the position in the array, and -1 for not found + this.shown_messages.push(msg); + } + }, this); + + //For each message, try to find it's category in the categories we're showing + this.archived_messages.forEach( function(msg){ + if(cat_array.indexOf(msg.category) > -1) { //Returns the position in the array, and -1 for not found + this.unshown_messages++; + } + }, this); + }, + //Push a new message into our array + add_message: function(message) { + //IE doesn't support the 'class' syntactic sugar so we're left making our own object. + let newmessage = { + time: message.time, + category: "error", + content: message.message, + repeats: 1 + }; + + //Get a category + newmessage.category = this.get_category(newmessage.content); + + //Try to crush it with one of the last few + if(this.crushing) { + let crushwith = this.messages.slice(-(this.crushing)); + for (let i = crushwith.length - 1; i >= 0; i--) { + let oldmessage = crushwith[i]; + if(oldmessage.content == newmessage.content) { + newmessage.repeats += oldmessage.repeats; + this.messages.splice(this.messages.indexOf(oldmessage), 1); + } + } + } + + //Unread indicator and insertion into current tab shown messages if sensible + if(this.current_categories.length && (this.current_categories.indexOf(newmessage.category) < 0)) { //Not in the current categories + if (isNaN(this.unread_messages[newmessage.category])) { + this.unread_messages[newmessage.category] = 0; + } + this.unread_messages[newmessage.category] += 1; + } else if(this.current_categories.length) { //Is in the current categories + this.shown_messages.push(newmessage); + } + + //Append to vue's messages + newmessage.id = ++vchat_state.lastId; + this.attempt_archive(); + this.messages.push(newmessage); + }, + //Push an internally generated message into our array + internal_message: function(message) { + let newmessage = { + time: this.messages.length ? this.messages.slice(-1).time+1 : 0, + category: "vc_system", + content: "[VChat Internal] " + message + "" + }; + newmessage.id = ++vchat_state.lastId; + this.messages.push(newmessage); + }, + on_mouseup: function(event) { + // Focus map window on mouseup so hotkeys work. Exception for if they highlighted text or clicked an input. + let ele = event.target; + let textSelected = ('getSelection' in window) && window.getSelection().isCollapsed === false; + if (!textSelected && !(ele && (ele.tagName === 'INPUT' || ele.tagName === 'TEXTAREA'))) { + focusMapWindow(); + // Okay focusing map window appears to prevent click event from being fired. So lets do it ourselves. + event.preventDefault(); + event.target.click(); + } + }, + click_message: function(event) { + let ele = event.target; + if(ele.tagName === "A") { + event.stopPropagation(); + event.preventDefault ? event.preventDefault() : (event.returnValue = false); //The second one is the weird IE method. + + var href = ele.getAttribute('href'); // Gets actual href without transformation into fully qualified URL + + if (href[0] == '?' || (href.length >= 8 && href.substring(0,8) == "byond://")) { + window.location = href; //Internal byond link + } else { //It's an external link + window.location = "byond://?action=openLink&link="+encodeURIComponent(href); + } + } + }, + //Derive a vchat category based on css classes + get_category: function(message) { + if(!vchat_state.ready) { + push_Topic('not_ready'); + return; + } + + let doc = domparser.parseFromString(message, 'text/html'); + let evaluating = doc.querySelector('span'); + + let category = "nomatch"; //What we use if the classes aren't anything we know. + if(!evaluating) return category; + this.type_table.find( function(type) { + if(evaluating.msMatchesSelector(type.matches)) { + category = type.becomes; + return true; + } + }); + + return category; + }, + save_chatlog: function() { + var textToSave = ""; + + var messagesToSave = this.archived_messages.concat(this.messages); + + messagesToSave.forEach( function(message) { + textToSave += message.content; + if(message.repeats > 1) { + textToSave += "(x"+message.repeats+")"; + } + textToSave += "
\n"; + }); + textToSave += ""; + + var fileprefix = "log"; + var extension =".html"; + + var now = new Date(); + var hours = String(now.getHours()); + if(hours.length < 2) { + hours = "0" + hours; + } + var minutes = String(now.getMinutes()); + if(minutes.length < 2) { + minutes = "0" + minutes; + } + var dayofmonth = String(now.getDate()); + if(dayofmonth.length < 2) { + dayofmonth = "0" + dayofmonth; + } + var month = String(now.getMonth()+1); //0-11 + if(month.length < 2) { + month = "0" + month; + } + var year = String(now.getFullYear()); + var datesegment = " "+year+"-"+month+"-"+dayofmonth+" ("+hours+" "+minutes+")"; + + var filename = fileprefix+datesegment+extension; + + //Unlikely to work unfortunately, not supported in any version of IE, only Edge + var hiddenElement = document.createElement('a'); + if (hiddenElement.download !== undefined) { + hiddenElement.href = 'data:attachment/text,' + encodeURI(textToSave); //Has a problem in byond 512 due to weird unicode handling + hiddenElement.target = '_blank'; + hiddenElement.download = filename; + hiddenElement.click(); + //Probably what will end up getting used + } else { + var blob = new Blob([textToSave], {type: 'text/html;charset=utf8;'}); + saved = window.navigator.msSaveOrOpenBlob(blob, filename); + } + }, + do_latency_test: function() { + send_latency_check(); + }, + blur_this: function(event) { + event.target.blur(); + } + } + }); +} + +/*********** +* +* Actual Methods +* +************/ +function check_ping() { + var time_ago = Date.now() - vchat_state.lastPingReceived; + if(time_ago > vchat_opts.msBeforeDropped) + vueapp.reconnecting = true; +} + +//Send a 'ping' to byond +function send_latency_check() { + if(vchat_state.latency_sent) + return; + + vchat_state.latency_sent = Date.now(); + vueapp.latency = "?"; + push_Topic("ping"); + setTimeout(function() { + if(vchat_state.latency_ms == "?") { + vchat_state.latency_ms = 999; + } + }, 1000); // 1 second to reply otherwise we mark it as bad + setTimeout(function() { + vchat_state.latency_sent = 0; + vueapp.latency = 0; + }, 5000); //5 seconds to display ping time overall +} + +function get_latency_check() { + if(!vchat_state.latency_sent) { + return; //Too late + } + + vueapp.latency = Date.now() - vchat_state.latency_sent; +} + +//We accept double-url-encoded JSON strings because Byond is garbage and UTF-8 encoded url_encode() text has crazy garbage in it. +function byondDecode(message) { + + //Byond encodes spaces as pluses?! This is 1998 I guess. + message = message.replace(/\+/g, "%20"); + try { + message = decodeURIComponent(message); + } catch (err) { + message = unescape(message); + } + return JSON.parse(message); +} + +//This is the function byond actually communicates with using byond's client << output() method. +function putmessage(messages) { + messages = byondDecode(messages); + if (Array.isArray(messages)) { + messages.forEach(function(message) { + vueapp.add_message(message); + }); + } else if (typeof messages === 'object') { + vueapp.add_message(messages); + } +} + +//Send an internal message generated in the javascript +function system_message(message) { + vueapp.internal_message(message); +} + +//This is the other direction of communication, to push a Topic message back +function push_Topic(topic_uri) { + window.location = '?_src_=chat&proc=' + topic_uri; //Yes that's really how it works. +} + +//Tells byond client to focus the main map window. +function focusMapWindow() { + window.location = 'byond://winset?mapwindow.map.focus=true'; +} + +//Debug event +function send_debug(message) { + push_Topic("debug¶m[message]="+encodeURIComponent(message)); +} + +//A side-channel to send events over that aren't just chat messages, if necessary. +function get_event(event) { + if(!vchat_state.ready) { + push_Topic("not_ready"); + return; + } + + var parsed_event = {evttype: 'internal_error', event: event}; + parsed_event = byondDecode(event); + + switch(parsed_event.evttype) { + //We didn't parse it very well + case 'internal_error': + system_message("Event parse error: " + event); + break; + + //They provided byond data. + case 'byond_player': + send_client_data(); + vueapp.is_admin = (parsed_event.admin === 'true'); + vchat_state.byond_ip = parsed_event.address; + vchat_state.byond_cid = parsed_event.cid; + vchat_state.byond_ckey = parsed_event.ckey; + set_storage("ip",vchat_state.byond_ip); + set_storage("cid",vchat_state.byond_cid); + set_storage("ckey",vchat_state.byond_ckey); + break; + + //Just a ping. + case 'keepalive': + vchat_state.lastPingReceived = Date.now(); + vueapp.reconnecting = false; + break; + + //Response to a latency test. + case 'pong': + get_latency_check(); + break; + + //The server doesn't know if we're loaded or not (we bail above if we're not, so we must be). + case 'availability': + push_Topic("done_loading"); + break; + + default: + system_message("Didn't know what to do with event: " + event); + } +} + +//Send information retrieved from storage +function send_client_data() { + let client_data = { + ip: get_storage("ip"), + cid: get_storage("cid"), + ckey: get_storage("ckey") + }; + push_Topic("ident¶m[clientdata]="+JSON.stringify(client_data)); +} + +//Newer localstorage methods +function set_localstorage(key, value) { + let localstorage = window.localStorage; + localstorage.setItem(vchat_opts.cookiePrefix+key,value); +} + +function get_localstorage(key, deffo) { + let localstorage = window.localStorage; + let value = localstorage.getItem(vchat_opts.cookiePrefix+key); + + //localstorage only stores strings. + if(value === "null" || value === null) { + value = deffo; + //Coerce bools back into their native forms + } else if(value === "true") { + value = true; + } else if(value === "false") { + value = false; + //Coerce numbers back into numerical form + } else if(!isNaN(value)) { + value = +value; + } + return value; +} + +//Older cookie methods +function set_cookie(key, value) { + let now = new Date(); + now.setFullYear(now.getFullYear() + 1); + let then = now.toUTCString(); + document.cookie = vchat_opts.cookiePrefix+key+"="+value+";expires="+then+";path=/"; +} + +function get_cookie(key, deffo) { + var candidates = {cookie: null, localstorage: null, indexeddb: null}; + let cookie_array = document.cookie.split(';'); + let cookie_object = {}; + cookie_array.forEach( function(element) { + let clean = element.replace(vchat_opts.cookiePrefix,"").trim(); //Strip the prefix, trim whitespace + let equals = clean.search("="); //Find the equals + let left = decodeURIComponent(clean.substring(0,equals)); //From start to one char before equals + let right = decodeURIComponent(clean.substring(equals+1)); //From one char after equals to end + //cookies only stores strings. + if(right == "null" || right === null) { + right = deffo; + } else if(right === "true") { + right = true; + } else if(right === "false") { + right = false; + } else if(!isNaN(right)) { + right = +right; + } + cookie_object[left] = right; //Stick into object + }); + candidates.cookie = cookie_object[key]; //Return value of that key in our object (or undefined) +} + +// Button Controls that need background-color and text-color set. +var SKIN_BUTTONS = [ + /* Rpane */ "rpane.textb", "rpane.infob", "rpane.wikib", "rpane.forumb", "rpane.rulesb", "rpane.github", "rpane.mapb", "rpane.changelog", + /* Mainwindow */ "mainwindow.saybutton", "mainwindow.mebutton", "mainwindow.hotkey_toggle" + +]; +// Windows or controls that need background-color set. +var SKIN_ELEMENTS = [ + /* Mainwindow */ "mainwindow", "mainwindow.mainvsplit", "mainwindow.tooltip", + /* Rpane */ "rpane", "rpane.rpanewindow", "rpane.mediapanel", +]; + +function switch_ui_mode(options) { + doWinset(SKIN_BUTTONS.reduce(function(params, ctl) {params[ctl + ".background-color"] = options.buttonBgColor; return params;}, {})); + doWinset(SKIN_BUTTONS.reduce(function(params, ctl) {params[ctl + ".text-color"] = options.buttonTextColor; return params;}, {})); + doWinset(SKIN_ELEMENTS.reduce(function(params, ctl) {params[ctl + ".background-color"] = options.windowBgColor; return params;}, {})); + doWinset("infowindow", { + "background-color": options.tabBackgroundColor, + "text-color": options.tabTextColor + }); + doWinset("infowindow.info", { + "background-color": options.tabBackgroundColor, + "text-color": options.tabTextColor, + "highlight-color": options.highlightColor, + "tab-text-color": options.tabTextColor, + "tab-background-color": options.tabBackgroundColor + }); +} + +function doWinset(control_id, params) { + if (typeof params === 'undefined') { + params = control_id; // Handle single-argument use case. + control_id = null; + } + var url = "byond://winset?"; + if (control_id) { + url += ("id=" + control_id + "&"); + } + url += Object.keys(params).map(function(ctl) { + return ctl + "=" + encodeURIComponent(params[ctl]); + }).join("&"); + window.location = url; +} diff --git a/code/modules/vchat/js/vue.min.js b/code/modules/vchat/js/vue.min.js new file mode 100644 index 0000000000..e22cf13003 --- /dev/null +++ b/code/modules/vchat/js/vue.min.js @@ -0,0 +1,11965 @@ +/*! + * Vue.js v2.6.11 + * (c) 2014-2019 Evan You + * 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 = global || self, global.Vue = factory()); +}(this, function () { 'use strict'; + + /* */ + + var emptyObject = Object.freeze({}); + + // These helpers produce better VM code in JS engines due to their + // explicitness and function inlining. + function isUndef (v) { + return v === undefined || v === null + } + + function isDef (v) { + return v !== undefined && v !== null + } + + function isTrue (v) { + return v === true + } + + function isFalse (v) { + return v === false + } + + /** + * Check if value is primitive. + */ + function isPrimitive (value) { + return ( + typeof value === 'string' || + typeof value === 'number' || + // $flow-disable-line + typeof value === 'symbol' || + typeof value === 'boolean' + ) + } + + /** + * Quick object check - this is primarily used to tell + * Objects from primitive values when we know the value + * is a JSON-compliant type. + */ + function isObject (obj) { + return obj !== null && typeof obj === 'object' + } + + /** + * Get the raw type string of a value, e.g., [object Object]. + */ + var _toString = Object.prototype.toString; + + function toRawType (value) { + return _toString.call(value).slice(8, -1) + } + + /** + * Strict object type check. Only returns true + * for plain JavaScript objects. + */ + function isPlainObject (obj) { + return _toString.call(obj) === '[object Object]' + } + + function isRegExp (v) { + return _toString.call(v) === '[object RegExp]' + } + + /** + * Check if val is a valid array index. + */ + function isValidArrayIndex (val) { + var n = parseFloat(String(val)); + return n >= 0 && Math.floor(n) === n && isFinite(val) + } + + function isPromise (val) { + return ( + isDef(val) && + typeof val.then === 'function' && + typeof val.catch === 'function' + ) + } + + /** + * Convert a value to a string that is actually rendered. + */ + function toString (val) { + return val == null + ? '' + : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString) + ? JSON.stringify(val, null, 2) + : String(val) + } + + /** + * Convert an input value to a number for persistence. + * If the conversion fails, return original string. + */ + function toNumber (val) { + var n = parseFloat(val); + return isNaN(n) ? val : n + } + + /** + * Make a map and return a function for checking if a key + * is in that map. + */ + function makeMap ( + str, + expectsLowerCase + ) { + var map = Object.create(null); + var list = str.split(','); + for (var i = 0; i < list.length; i++) { + map[list[i]] = true; + } + return expectsLowerCase + ? function (val) { return map[val.toLowerCase()]; } + : function (val) { return map[val]; } + } + + /** + * Check if a tag is a built-in tag. + */ + var isBuiltInTag = makeMap('slot,component', true); + + /** + * Check if an attribute is a reserved attribute. + */ + var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is'); + + /** + * Remove an item from an array. + */ + function remove (arr, item) { + if (arr.length) { + var index = arr.indexOf(item); + if (index > -1) { + return arr.splice(index, 1) + } + } + } + + /** + * Check whether an object has the property. + */ + var hasOwnProperty = Object.prototype.hasOwnProperty; + function hasOwn (obj, key) { + return hasOwnProperty.call(obj, key) + } + + /** + * Create a cached version of a pure function. + */ + function cached (fn) { + var cache = Object.create(null); + return (function cachedFn (str) { + var hit = cache[str]; + return hit || (cache[str] = fn(str)) + }) + } + + /** + * Camelize a hyphen-delimited string. + */ + var camelizeRE = /-(\w)/g; + var camelize = cached(function (str) { + return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; }) + }); + + /** + * Capitalize a string. + */ + var capitalize = cached(function (str) { + return str.charAt(0).toUpperCase() + str.slice(1) + }); + + /** + * Hyphenate a camelCase string. + */ + var hyphenateRE = /\B([A-Z])/g; + var hyphenate = cached(function (str) { + return str.replace(hyphenateRE, '-$1').toLowerCase() + }); + + /** + * Simple bind polyfill for environments that do not support it, + * e.g., PhantomJS 1.x. Technically, we don't need this anymore + * since native bind is now performant enough in most browsers. + * But removing it would mean breaking code that was able to run in + * PhantomJS 1.x, so this must be kept for backward compatibility. + */ + + /* istanbul ignore next */ + function polyfillBind (fn, ctx) { + function boundFn (a) { + var l = arguments.length; + return l + ? l > 1 + ? fn.apply(ctx, arguments) + : fn.call(ctx, a) + : fn.call(ctx) + } + + boundFn._length = fn.length; + return boundFn + } + + function nativeBind (fn, ctx) { + return fn.bind(ctx) + } + + var bind = Function.prototype.bind + ? nativeBind + : polyfillBind; + + /** + * Convert an Array-like object to a real Array. + */ + function toArray (list, start) { + start = start || 0; + var i = list.length - start; + var ret = new Array(i); + while (i--) { + ret[i] = list[i + start]; + } + return ret + } + + /** + * Mix properties into target object. + */ + function extend (to, _from) { + for (var key in _from) { + to[key] = _from[key]; + } + return to + } + + /** + * Merge an Array of Objects into a single Object. + */ + function toObject (arr) { + var res = {}; + for (var i = 0; i < arr.length; i++) { + if (arr[i]) { + extend(res, arr[i]); + } + } + return res + } + + /* eslint-disable no-unused-vars */ + + /** + * Perform no operation. + * Stubbing args to make Flow happy without leaving useless transpiled code + * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/). + */ + function noop (a, b, c) {} + + /** + * Always return false. + */ + var no = function (a, b, c) { return false; }; + + /* eslint-enable no-unused-vars */ + + /** + * Return the same value. + */ + var identity = function (_) { return _; }; + + /** + * Generate a string containing static keys from compiler modules. + */ + function genStaticKeys (modules) { + return modules.reduce(function (keys, m) { + return keys.concat(m.staticKeys || []) + }, []).join(',') + } + + /** + * Check if two values are loosely equal - that is, + * if they are plain objects, do they have the same shape? + */ + function looseEqual (a, b) { + if (a === b) { return true } + var isObjectA = isObject(a); + var isObjectB = isObject(b); + if (isObjectA && isObjectB) { + try { + var isArrayA = Array.isArray(a); + var isArrayB = Array.isArray(b); + if (isArrayA && isArrayB) { + return a.length === b.length && a.every(function (e, i) { + return looseEqual(e, b[i]) + }) + } else if (a instanceof Date && b instanceof Date) { + return a.getTime() === b.getTime() + } else if (!isArrayA && !isArrayB) { + var keysA = Object.keys(a); + var keysB = Object.keys(b); + return keysA.length === keysB.length && keysA.every(function (key) { + return looseEqual(a[key], b[key]) + }) + } else { + /* istanbul ignore next */ + return false + } + } catch (e) { + /* istanbul ignore next */ + return false + } + } else if (!isObjectA && !isObjectB) { + return String(a) === String(b) + } else { + return false + } + } + + /** + * Return the first index at which a loosely equal value can be + * found in the array (if value is a plain object, the array must + * contain an object of the same shape), or -1 if it is not present. + */ + function looseIndexOf (arr, val) { + for (var i = 0; i < arr.length; i++) { + if (looseEqual(arr[i], val)) { return i } + } + return -1 + } + + /** + * Ensure a function is called only once. + */ + function once (fn) { + var called = false; + return function () { + if (!called) { + called = true; + fn.apply(this, arguments); + } + } + } + + var SSR_ATTR = 'data-server-rendered'; + + var ASSET_TYPES = [ + 'component', + 'directive', + 'filter' + ]; + + var LIFECYCLE_HOOKS = [ + 'beforeCreate', + 'created', + 'beforeMount', + 'mounted', + 'beforeUpdate', + 'updated', + 'beforeDestroy', + 'destroyed', + 'activated', + 'deactivated', + 'errorCaptured', + 'serverPrefetch' + ]; + + /* */ + + + + var config = ({ + /** + * Option merge strategies (used in core/util/options) + */ + // $flow-disable-line + optionMergeStrategies: Object.create(null), + + /** + * Whether to suppress warnings. + */ + silent: false, + + /** + * Show production mode tip message on boot? + */ + productionTip: "development" !== 'production', + + /** + * Whether to enable devtools + */ + devtools: "development" !== 'production', + + /** + * Whether to record perf + */ + performance: false, + + /** + * Error handler for watcher errors + */ + errorHandler: null, + + /** + * Warn handler for watcher warns + */ + warnHandler: null, + + /** + * Ignore certain custom elements + */ + ignoredElements: [], + + /** + * Custom user key aliases for v-on + */ + // $flow-disable-line + keyCodes: Object.create(null), + + /** + * Check if a tag is reserved so that it cannot be registered as a + * component. This is platform-dependent and may be overwritten. + */ + isReservedTag: no, + + /** + * Check if an attribute is reserved so that it cannot be used as a component + * prop. This is platform-dependent and may be overwritten. + */ + isReservedAttr: no, + + /** + * Check if a tag is an unknown element. + * Platform-dependent. + */ + isUnknownElement: no, + + /** + * Get the namespace of an element + */ + getTagNamespace: noop, + + /** + * Parse the real tag name for the specific platform. + */ + parsePlatformTagName: identity, + + /** + * Check if an attribute must be bound using property, e.g. value + * Platform-dependent. + */ + mustUseProp: no, + + /** + * Perform updates asynchronously. Intended to be used by Vue Test Utils + * This will significantly reduce performance if set to false. + */ + async: true, + + /** + * Exposed for legacy reasons + */ + _lifecycleHooks: LIFECYCLE_HOOKS + }); + + /* */ + + /** + * unicode letters used for parsing html tags, component names and property paths. + * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname + * skipping \u10000-\uEFFFF due to it freezing up PhantomJS + */ + var unicodeRegExp = /a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/; + + /** + * Check if a string starts with $ or _ + */ + function isReserved (str) { + var c = (str + '').charCodeAt(0); + return c === 0x24 || c === 0x5F + } + + /** + * Define a property. + */ + function def (obj, key, val, enumerable) { + Object.defineProperty(obj, key, { + value: val, + enumerable: !!enumerable, + writable: true, + configurable: true + }); + } + + /** + * Parse simple path. + */ + var bailRE = new RegExp(("[^" + (unicodeRegExp.source) + ".$_\\d]")); + function parsePath (path) { + if (bailRE.test(path)) { + return + } + var segments = path.split('.'); + return function (obj) { + for (var i = 0; i < segments.length; i++) { + if (!obj) { return } + obj = obj[segments[i]]; + } + return obj + } + } + + /* */ + + // can we use __proto__? + var hasProto = '__proto__' in {}; + + // Browser environment sniffing + var inBrowser = typeof window !== 'undefined'; + var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform; + var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase(); + var UA = inBrowser && window.navigator.userAgent.toLowerCase(); + var isIE = UA && /msie|trident/.test(UA); + var isIE9 = UA && UA.indexOf('msie 9.0') > 0; + var isEdge = UA && UA.indexOf('edge/') > 0; + var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android'); + var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios'); + var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge; + var isPhantomJS = UA && /phantomjs/.test(UA); + var isFF = UA && UA.match(/firefox\/(\d+)/); + + // Firefox has a "watch" function on Object.prototype... + var nativeWatch = ({}).watch; + + var supportsPassive = false; + if (inBrowser) { + try { + var opts = {}; + Object.defineProperty(opts, 'passive', ({ + get: function get () { + /* istanbul ignore next */ + supportsPassive = true; + } + })); // https://github.com/facebook/flow/issues/285 + window.addEventListener('test-passive', null, opts); + } catch (e) {} + } + + // this needs to be lazy-evaled because vue may be required before + // vue-server-renderer can set VUE_ENV + var _isServer; + var isServerRendering = function () { + if (_isServer === undefined) { + /* istanbul ignore if */ + if (!inBrowser && !inWeex && typeof global !== 'undefined') { + // detect presence of vue-server-renderer and avoid + // Webpack shimming the process + _isServer = global['process'] && global['process'].env.VUE_ENV === 'server'; + } else { + _isServer = false; + } + } + return _isServer + }; + + // detect devtools + var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__; + + /* istanbul ignore next */ + function isNative (Ctor) { + return typeof Ctor === 'function' && /native code/.test(Ctor.toString()) + } + + var hasSymbol = + typeof Symbol !== 'undefined' && isNative(Symbol) && + typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys); + + var _Set; + /* istanbul ignore if */ // $flow-disable-line + if (typeof Set !== 'undefined' && isNative(Set)) { + // use native Set when available. + _Set = Set; + } else { + // a non-standard Set polyfill that only works with primitive keys. + _Set = /*@__PURE__*/(function () { + function Set () { + this.set = Object.create(null); + } + Set.prototype.has = function has (key) { + return this.set[key] === true + }; + Set.prototype.add = function add (key) { + this.set[key] = true; + }; + Set.prototype.clear = function clear () { + this.set = Object.create(null); + }; + + return Set; + }()); + } + + /* */ + + var warn = noop; + var tip = noop; + var generateComponentTrace = (noop); // work around flow check + var formatComponentName = (noop); + + { + var hasConsole = typeof console !== 'undefined'; + var classifyRE = /(?:^|[-_])(\w)/g; + var classify = function (str) { return str + .replace(classifyRE, function (c) { return c.toUpperCase(); }) + .replace(/[-_]/g, ''); }; + + warn = function (msg, vm) { + var trace = vm ? generateComponentTrace(vm) : ''; + + if (config.warnHandler) { + config.warnHandler.call(null, msg, vm, trace); + } else if (hasConsole && (!config.silent)) { + console.error(("[Vue warn]: " + msg + trace)); + } + }; + + tip = function (msg, vm) { + if (hasConsole && (!config.silent)) { + console.warn("[Vue tip]: " + msg + ( + vm ? generateComponentTrace(vm) : '' + )); + } + }; + + formatComponentName = function (vm, includeFile) { + if (vm.$root === vm) { + return '' + } + var options = typeof vm === 'function' && vm.cid != null + ? vm.options + : vm._isVue + ? vm.$options || vm.constructor.options + : vm; + var name = options.name || options._componentTag; + var file = options.__file; + if (!name && file) { + var match = file.match(/([^/\\]+)\.vue$/); + name = match && match[1]; + } + + return ( + (name ? ("<" + (classify(name)) + ">") : "") + + (file && includeFile !== false ? (" at " + file) : '') + ) + }; + + var repeat = function (str, n) { + var res = ''; + while (n) { + if (n % 2 === 1) { res += str; } + if (n > 1) { str += str; } + n >>= 1; + } + return res + }; + + generateComponentTrace = function (vm) { + if (vm._isVue && vm.$parent) { + var tree = []; + var currentRecursiveSequence = 0; + while (vm) { + if (tree.length > 0) { + var last = tree[tree.length - 1]; + if (last.constructor === vm.constructor) { + currentRecursiveSequence++; + vm = vm.$parent; + continue + } else if (currentRecursiveSequence > 0) { + tree[tree.length - 1] = [last, currentRecursiveSequence]; + currentRecursiveSequence = 0; + } + } + tree.push(vm); + vm = vm.$parent; + } + return '\n\nfound in\n\n' + tree + .map(function (vm, i) { return ("" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm) + ? ((formatComponentName(vm[0])) + "... (" + (vm[1]) + " recursive calls)") + : formatComponentName(vm))); }) + .join('\n') + } else { + return ("\n\n(found in " + (formatComponentName(vm)) + ")") + } + }; + } + + /* */ + + var uid = 0; + + /** + * A dep is an observable that can have multiple + * directives subscribing to it. + */ + var Dep = function Dep () { + this.id = uid++; + this.subs = []; + }; + + Dep.prototype.addSub = function addSub (sub) { + this.subs.push(sub); + }; + + Dep.prototype.removeSub = function removeSub (sub) { + remove(this.subs, sub); + }; + + Dep.prototype.depend = function depend () { + if (Dep.target) { + Dep.target.addDep(this); + } + }; + + Dep.prototype.notify = function notify () { + // stabilize the subscriber list first + var subs = this.subs.slice(); + if (!config.async) { + // subs aren't sorted in scheduler if not running async + // we need to sort them now to make sure they fire in correct + // order + subs.sort(function (a, b) { return a.id - b.id; }); + } + for (var i = 0, l = subs.length; i < l; i++) { + subs[i].update(); + } + }; + + // The current target watcher being evaluated. + // This is globally unique because only one watcher + // can be evaluated at a time. + Dep.target = null; + var targetStack = []; + + function pushTarget (target) { + targetStack.push(target); + Dep.target = target; + } + + function popTarget () { + targetStack.pop(); + Dep.target = targetStack[targetStack.length - 1]; + } + + /* */ + + var VNode = function VNode ( + tag, + data, + children, + text, + elm, + context, + componentOptions, + asyncFactory + ) { + this.tag = tag; + this.data = data; + this.children = children; + this.text = text; + this.elm = elm; + this.ns = undefined; + this.context = context; + this.fnContext = undefined; + this.fnOptions = undefined; + this.fnScopeId = undefined; + this.key = data && data.key; + this.componentOptions = componentOptions; + this.componentInstance = undefined; + this.parent = undefined; + this.raw = false; + this.isStatic = false; + this.isRootInsert = true; + this.isComment = false; + this.isCloned = false; + this.isOnce = false; + this.asyncFactory = asyncFactory; + this.asyncMeta = undefined; + this.isAsyncPlaceholder = false; + }; + + var prototypeAccessors = { child: { configurable: true } }; + + // DEPRECATED: alias for componentInstance for backwards compat. + /* istanbul ignore next */ + prototypeAccessors.child.get = function () { + return this.componentInstance + }; + + Object.defineProperties( VNode.prototype, prototypeAccessors ); + + var createEmptyVNode = function (text) { + if ( text === void 0 ) text = ''; + + var node = new VNode(); + node.text = text; + node.isComment = true; + return node + }; + + function createTextVNode (val) { + return new VNode(undefined, undefined, undefined, String(val)) + } + + // optimized shallow clone + // used for static nodes and slot nodes because they may be reused across + // multiple renders, cloning them avoids errors when DOM manipulations rely + // on their elm reference. + function cloneVNode (vnode) { + var cloned = new VNode( + vnode.tag, + vnode.data, + // #7975 + // clone children array to avoid mutating original in case of cloning + // a child. + vnode.children && vnode.children.slice(), + vnode.text, + vnode.elm, + vnode.context, + vnode.componentOptions, + vnode.asyncFactory + ); + cloned.ns = vnode.ns; + cloned.isStatic = vnode.isStatic; + cloned.key = vnode.key; + cloned.isComment = vnode.isComment; + cloned.fnContext = vnode.fnContext; + cloned.fnOptions = vnode.fnOptions; + cloned.fnScopeId = vnode.fnScopeId; + cloned.asyncMeta = vnode.asyncMeta; + cloned.isCloned = true; + return cloned + } + + /* + * not type checking this file because flow doesn't play well with + * dynamically accessing methods on Array prototype + */ + + var arrayProto = Array.prototype; + var arrayMethods = Object.create(arrayProto); + + var methodsToPatch = [ + 'push', + 'pop', + 'shift', + 'unshift', + 'splice', + 'sort', + 'reverse' + ]; + + /** + * Intercept mutating methods and emit events + */ + methodsToPatch.forEach(function (method) { + // cache original method + var original = arrayProto[method]; + def(arrayMethods, method, function mutator () { + var args = [], len = arguments.length; + while ( len-- ) args[ len ] = arguments[ len ]; + + var result = original.apply(this, args); + var ob = this.__ob__; + var inserted; + switch (method) { + case 'push': + case 'unshift': + inserted = args; + break + case 'splice': + inserted = args.slice(2); + break + } + if (inserted) { ob.observeArray(inserted); } + // notify change + ob.dep.notify(); + return result + }); + }); + + /* */ + + var arrayKeys = Object.getOwnPropertyNames(arrayMethods); + + /** + * In some cases we may want to disable observation inside a component's + * update computation. + */ + var shouldObserve = true; + + function toggleObserving (value) { + shouldObserve = value; + } + + /** + * Observer class that is attached to each observed + * object. Once attached, the observer converts the target + * object's property keys into getter/setters that + * collect dependencies and dispatch updates. + */ + var Observer = function Observer (value) { + this.value = value; + this.dep = new Dep(); + this.vmCount = 0; + def(value, '__ob__', this); + if (Array.isArray(value)) { + if (hasProto) { + protoAugment(value, arrayMethods); + } else { + copyAugment(value, arrayMethods, arrayKeys); + } + this.observeArray(value); + } else { + this.walk(value); + } + }; + + /** + * Walk through all properties and convert them into + * getter/setters. This method should only be called when + * value type is Object. + */ + Observer.prototype.walk = function walk (obj) { + var keys = Object.keys(obj); + for (var i = 0; i < keys.length; i++) { + defineReactive$$1(obj, keys[i]); + } + }; + + /** + * Observe a list of Array items. + */ + Observer.prototype.observeArray = function observeArray (items) { + for (var i = 0, l = items.length; i < l; i++) { + observe(items[i]); + } + }; + + // helpers + + /** + * Augment a target Object or Array by intercepting + * the prototype chain using __proto__ + */ + function protoAugment (target, src) { + /* eslint-disable no-proto */ + target.__proto__ = src; + /* eslint-enable no-proto */ + } + + /** + * Augment a target Object or Array by defining + * hidden properties. + */ + /* istanbul ignore next */ + function copyAugment (target, src, keys) { + for (var i = 0, l = keys.length; i < l; i++) { + var key = keys[i]; + def(target, key, src[key]); + } + } + + /** + * Attempt to create an observer instance for a value, + * returns the new observer if successfully observed, + * or the existing observer if the value already has one. + */ + function observe (value, asRootData) { + if (!isObject(value) || value instanceof VNode) { + return + } + var ob; + if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) { + ob = value.__ob__; + } else if ( + shouldObserve && + !isServerRendering() && + (Array.isArray(value) || isPlainObject(value)) && + Object.isExtensible(value) && + !value._isVue + ) { + ob = new Observer(value); + } + if (asRootData && ob) { + ob.vmCount++; + } + return ob + } + + /** + * Define a reactive property on an Object. + */ + function defineReactive$$1 ( + obj, + key, + val, + customSetter, + shallow + ) { + var dep = new Dep(); + + var property = Object.getOwnPropertyDescriptor(obj, key); + if (property && property.configurable === false) { + return + } + + // cater for pre-defined getter/setters + var getter = property && property.get; + var setter = property && property.set; + if ((!getter || setter) && arguments.length === 2) { + val = obj[key]; + } + + var childOb = !shallow && observe(val); + Object.defineProperty(obj, key, { + enumerable: true, + configurable: true, + get: function reactiveGetter () { + var value = getter ? getter.call(obj) : val; + if (Dep.target) { + dep.depend(); + if (childOb) { + childOb.dep.depend(); + if (Array.isArray(value)) { + dependArray(value); + } + } + } + return value + }, + set: function reactiveSetter (newVal) { + var value = getter ? getter.call(obj) : val; + /* eslint-disable no-self-compare */ + if (newVal === value || (newVal !== newVal && value !== value)) { + return + } + /* eslint-enable no-self-compare */ + if (customSetter) { + customSetter(); + } + // #7981: for accessor properties without setter + if (getter && !setter) { return } + if (setter) { + setter.call(obj, newVal); + } else { + val = newVal; + } + childOb = !shallow && observe(newVal); + dep.notify(); + } + }); + } + + /** + * Set a property on an object. Adds the new property and + * triggers change notification if the property doesn't + * already exist. + */ + function set (target, key, val) { + if (isUndef(target) || isPrimitive(target) + ) { + warn(("Cannot set reactive property on undefined, null, or primitive value: " + ((target)))); + } + if (Array.isArray(target) && isValidArrayIndex(key)) { + target.length = Math.max(target.length, key); + target.splice(key, 1, val); + return val + } + if (key in target && !(key in Object.prototype)) { + target[key] = val; + return val + } + var ob = (target).__ob__; + if (target._isVue || (ob && ob.vmCount)) { + warn( + 'Avoid adding reactive properties to a Vue instance or its root $data ' + + 'at runtime - declare it upfront in the data option.' + ); + return val + } + if (!ob) { + target[key] = val; + return val + } + defineReactive$$1(ob.value, key, val); + ob.dep.notify(); + return val + } + + /** + * Delete a property and trigger change if necessary. + */ + function del (target, key) { + if (isUndef(target) || isPrimitive(target) + ) { + warn(("Cannot delete reactive property on undefined, null, or primitive value: " + ((target)))); + } + if (Array.isArray(target) && isValidArrayIndex(key)) { + target.splice(key, 1); + return + } + var ob = (target).__ob__; + if (target._isVue || (ob && ob.vmCount)) { + warn( + 'Avoid deleting properties on a Vue instance or its root $data ' + + '- just set it to null.' + ); + return + } + if (!hasOwn(target, key)) { + return + } + delete target[key]; + if (!ob) { + return + } + ob.dep.notify(); + } + + /** + * Collect dependencies on array elements when the array is touched, since + * we cannot intercept array element access like property getters. + */ + function dependArray (value) { + for (var e = (void 0), i = 0, l = value.length; i < l; i++) { + e = value[i]; + e && e.__ob__ && e.__ob__.dep.depend(); + if (Array.isArray(e)) { + dependArray(e); + } + } + } + + /* */ + + /** + * Option overwriting strategies are functions that handle + * how to merge a parent option value and a child option + * value into the final value. + */ + var strats = config.optionMergeStrategies; + + /** + * Options with restrictions + */ + { + strats.el = strats.propsData = function (parent, child, vm, key) { + if (!vm) { + warn( + "option \"" + key + "\" can only be used during instance " + + 'creation with the `new` keyword.' + ); + } + return defaultStrat(parent, child) + }; + } + + /** + * Helper that recursively merges two data objects together. + */ + function mergeData (to, from) { + if (!from) { return to } + var key, toVal, fromVal; + + var keys = hasSymbol + ? Reflect.ownKeys(from) + : Object.keys(from); + + for (var i = 0; i < keys.length; i++) { + key = keys[i]; + // in case the object is already observed... + if (key === '__ob__') { continue } + toVal = to[key]; + fromVal = from[key]; + if (!hasOwn(to, key)) { + set(to, key, fromVal); + } else if ( + toVal !== fromVal && + isPlainObject(toVal) && + isPlainObject(fromVal) + ) { + mergeData(toVal, fromVal); + } + } + return to + } + + /** + * Data + */ + function mergeDataOrFn ( + parentVal, + childVal, + vm + ) { + if (!vm) { + // in a Vue.extend merge, both should be functions + if (!childVal) { + return parentVal + } + if (!parentVal) { + return childVal + } + // when parentVal & childVal are both present, + // we need to return a function that returns the + // merged result of both functions... no need to + // check if parentVal is a function here because + // it has to be a function to pass previous merges. + return function mergedDataFn () { + return mergeData( + typeof childVal === 'function' ? childVal.call(this, this) : childVal, + typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal + ) + } + } else { + return function mergedInstanceDataFn () { + // instance merge + var instanceData = typeof childVal === 'function' + ? childVal.call(vm, vm) + : childVal; + var defaultData = typeof parentVal === 'function' + ? parentVal.call(vm, vm) + : parentVal; + if (instanceData) { + return mergeData(instanceData, defaultData) + } else { + return defaultData + } + } + } + } + + strats.data = function ( + parentVal, + childVal, + vm + ) { + if (!vm) { + if (childVal && typeof childVal !== 'function') { + warn( + 'The "data" option should be a function ' + + 'that returns a per-instance value in component ' + + 'definitions.', + vm + ); + + return parentVal + } + return mergeDataOrFn(parentVal, childVal) + } + + return mergeDataOrFn(parentVal, childVal, vm) + }; + + /** + * Hooks and props are merged as arrays. + */ + function mergeHook ( + parentVal, + childVal + ) { + var res = childVal + ? parentVal + ? parentVal.concat(childVal) + : Array.isArray(childVal) + ? childVal + : [childVal] + : parentVal; + return res + ? dedupeHooks(res) + : res + } + + function dedupeHooks (hooks) { + var res = []; + for (var i = 0; i < hooks.length; i++) { + if (res.indexOf(hooks[i]) === -1) { + res.push(hooks[i]); + } + } + return res + } + + LIFECYCLE_HOOKS.forEach(function (hook) { + strats[hook] = mergeHook; + }); + + /** + * Assets + * + * When a vm is present (instance creation), we need to do + * a three-way merge between constructor options, instance + * options and parent options. + */ + function mergeAssets ( + parentVal, + childVal, + vm, + key + ) { + var res = Object.create(parentVal || null); + if (childVal) { + assertObjectType(key, childVal, vm); + return extend(res, childVal) + } else { + return res + } + } + + ASSET_TYPES.forEach(function (type) { + strats[type + 's'] = mergeAssets; + }); + + /** + * Watchers. + * + * Watchers hashes should not overwrite one + * another, so we merge them as arrays. + */ + strats.watch = function ( + parentVal, + childVal, + vm, + key + ) { + // work around Firefox's Object.prototype.watch... + if (parentVal === nativeWatch) { parentVal = undefined; } + if (childVal === nativeWatch) { childVal = undefined; } + /* istanbul ignore if */ + if (!childVal) { return Object.create(parentVal || null) } + { + assertObjectType(key, childVal, vm); + } + if (!parentVal) { return childVal } + var ret = {}; + extend(ret, parentVal); + for (var key$1 in childVal) { + var parent = ret[key$1]; + var child = childVal[key$1]; + if (parent && !Array.isArray(parent)) { + parent = [parent]; + } + ret[key$1] = parent + ? parent.concat(child) + : Array.isArray(child) ? child : [child]; + } + return ret + }; + + /** + * Other object hashes. + */ + strats.props = + strats.methods = + strats.inject = + strats.computed = function ( + parentVal, + childVal, + vm, + key + ) { + if (childVal && "development" !== 'production') { + assertObjectType(key, childVal, vm); + } + if (!parentVal) { return childVal } + var ret = Object.create(null); + extend(ret, parentVal); + if (childVal) { extend(ret, childVal); } + return ret + }; + strats.provide = mergeDataOrFn; + + /** + * Default strategy. + */ + var defaultStrat = function (parentVal, childVal) { + return childVal === undefined + ? parentVal + : childVal + }; + + /** + * Validate component names + */ + function checkComponents (options) { + for (var key in options.components) { + validateComponentName(key); + } + } + + function validateComponentName (name) { + if (!new RegExp(("^[a-zA-Z][\\-\\.0-9_" + (unicodeRegExp.source) + "]*$")).test(name)) { + warn( + 'Invalid component name: "' + name + '". Component names ' + + 'should conform to valid custom element name in html5 specification.' + ); + } + if (isBuiltInTag(name) || config.isReservedTag(name)) { + warn( + 'Do not use built-in or reserved HTML elements as component ' + + 'id: ' + name + ); + } + } + + /** + * Ensure all props option syntax are normalized into the + * Object-based format. + */ + function normalizeProps (options, vm) { + var props = options.props; + if (!props) { return } + var res = {}; + var i, val, name; + if (Array.isArray(props)) { + i = props.length; + while (i--) { + val = props[i]; + if (typeof val === 'string') { + name = camelize(val); + res[name] = { type: null }; + } else { + warn('props must be strings when using array syntax.'); + } + } + } else if (isPlainObject(props)) { + for (var key in props) { + val = props[key]; + name = camelize(key); + res[name] = isPlainObject(val) + ? val + : { type: val }; + } + } else { + warn( + "Invalid value for option \"props\": expected an Array or an Object, " + + "but got " + (toRawType(props)) + ".", + vm + ); + } + options.props = res; + } + + /** + * Normalize all injections into Object-based format + */ + function normalizeInject (options, vm) { + var inject = options.inject; + if (!inject) { return } + var normalized = options.inject = {}; + if (Array.isArray(inject)) { + for (var i = 0; i < inject.length; i++) { + normalized[inject[i]] = { from: inject[i] }; + } + } else if (isPlainObject(inject)) { + for (var key in inject) { + var val = inject[key]; + normalized[key] = isPlainObject(val) + ? extend({ from: key }, val) + : { from: val }; + } + } else { + warn( + "Invalid value for option \"inject\": expected an Array or an Object, " + + "but got " + (toRawType(inject)) + ".", + vm + ); + } + } + + /** + * Normalize raw function directives into object format. + */ + function normalizeDirectives (options) { + var dirs = options.directives; + if (dirs) { + for (var key in dirs) { + var def$$1 = dirs[key]; + if (typeof def$$1 === 'function') { + dirs[key] = { bind: def$$1, update: def$$1 }; + } + } + } + } + + function assertObjectType (name, value, vm) { + if (!isPlainObject(value)) { + warn( + "Invalid value for option \"" + name + "\": expected an Object, " + + "but got " + (toRawType(value)) + ".", + vm + ); + } + } + + /** + * Merge two option objects into a new one. + * Core utility used in both instantiation and inheritance. + */ + function mergeOptions ( + parent, + child, + vm + ) { + { + checkComponents(child); + } + + if (typeof child === 'function') { + child = child.options; + } + + normalizeProps(child, vm); + normalizeInject(child, vm); + normalizeDirectives(child); + + // Apply extends and mixins on the child options, + // but only if it is a raw options object that isn't + // the result of another mergeOptions call. + // Only merged options has the _base property. + if (!child._base) { + if (child.extends) { + parent = mergeOptions(parent, child.extends, vm); + } + if (child.mixins) { + for (var i = 0, l = child.mixins.length; i < l; i++) { + parent = mergeOptions(parent, child.mixins[i], vm); + } + } + } + + var options = {}; + var key; + for (key in parent) { + mergeField(key); + } + for (key in child) { + if (!hasOwn(parent, key)) { + mergeField(key); + } + } + function mergeField (key) { + var strat = strats[key] || defaultStrat; + options[key] = strat(parent[key], child[key], vm, key); + } + return options + } + + /** + * Resolve an asset. + * This function is used because child instances need access + * to assets defined in its ancestor chain. + */ + function resolveAsset ( + options, + type, + id, + warnMissing + ) { + /* istanbul ignore if */ + if (typeof id !== 'string') { + return + } + var assets = options[type]; + // check local registration variations first + if (hasOwn(assets, id)) { return assets[id] } + var camelizedId = camelize(id); + if (hasOwn(assets, camelizedId)) { return assets[camelizedId] } + var PascalCaseId = capitalize(camelizedId); + if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] } + // fallback to prototype chain + var res = assets[id] || assets[camelizedId] || assets[PascalCaseId]; + if (warnMissing && !res) { + warn( + 'Failed to resolve ' + type.slice(0, -1) + ': ' + id, + options + ); + } + return res + } + + /* */ + + + + function validateProp ( + key, + propOptions, + propsData, + vm + ) { + var prop = propOptions[key]; + var absent = !hasOwn(propsData, key); + var value = propsData[key]; + // boolean casting + var booleanIndex = getTypeIndex(Boolean, prop.type); + if (booleanIndex > -1) { + if (absent && !hasOwn(prop, 'default')) { + value = false; + } else if (value === '' || value === hyphenate(key)) { + // only cast empty string / same name to boolean if + // boolean has higher priority + var stringIndex = getTypeIndex(String, prop.type); + if (stringIndex < 0 || booleanIndex < stringIndex) { + value = true; + } + } + } + // check default value + if (value === undefined) { + value = getPropDefaultValue(vm, prop, key); + // since the default value is a fresh copy, + // make sure to observe it. + var prevShouldObserve = shouldObserve; + toggleObserving(true); + observe(value); + toggleObserving(prevShouldObserve); + } + { + assertProp(prop, key, value, vm, absent); + } + return value + } + + /** + * Get the default value of a prop. + */ + function getPropDefaultValue (vm, prop, key) { + // no default, return undefined + if (!hasOwn(prop, 'default')) { + return undefined + } + var def = prop.default; + // warn against non-factory defaults for Object & Array + if (isObject(def)) { + warn( + 'Invalid default value for prop "' + key + '": ' + + 'Props with type Object/Array must use a factory function ' + + 'to return the default value.', + vm + ); + } + // the raw prop value was also undefined from previous render, + // return previous default value to avoid unnecessary watcher trigger + if (vm && vm.$options.propsData && + vm.$options.propsData[key] === undefined && + vm._props[key] !== undefined + ) { + return vm._props[key] + } + // call factory function for non-Function types + // a value is Function if its prototype is function even across different execution context + return typeof def === 'function' && getType(prop.type) !== 'Function' + ? def.call(vm) + : def + } + + /** + * Assert whether a prop is valid. + */ + function assertProp ( + prop, + name, + value, + vm, + absent + ) { + if (prop.required && absent) { + warn( + 'Missing required prop: "' + name + '"', + vm + ); + return + } + if (value == null && !prop.required) { + return + } + var type = prop.type; + var valid = !type || type === true; + var expectedTypes = []; + if (type) { + if (!Array.isArray(type)) { + type = [type]; + } + for (var i = 0; i < type.length && !valid; i++) { + var assertedType = assertType(value, type[i]); + expectedTypes.push(assertedType.expectedType || ''); + valid = assertedType.valid; + } + } + + if (!valid) { + warn( + getInvalidTypeMessage(name, value, expectedTypes), + vm + ); + return + } + var validator = prop.validator; + if (validator) { + if (!validator(value)) { + warn( + 'Invalid prop: custom validator check failed for prop "' + name + '".', + vm + ); + } + } + } + + var simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/; + + function assertType (value, type) { + var valid; + var expectedType = getType(type); + if (simpleCheckRE.test(expectedType)) { + var t = typeof value; + valid = t === expectedType.toLowerCase(); + // for primitive wrapper objects + if (!valid && t === 'object') { + valid = value instanceof type; + } + } else if (expectedType === 'Object') { + valid = isPlainObject(value); + } else if (expectedType === 'Array') { + valid = Array.isArray(value); + } else { + valid = value instanceof type; + } + return { + valid: valid, + expectedType: expectedType + } + } + + /** + * Use function string name to check built-in types, + * because a simple equality check will fail when running + * across different vms / iframes. + */ + function getType (fn) { + var match = fn && fn.toString().match(/^\s*function (\w+)/); + return match ? match[1] : '' + } + + function isSameType (a, b) { + return getType(a) === getType(b) + } + + function getTypeIndex (type, expectedTypes) { + if (!Array.isArray(expectedTypes)) { + return isSameType(expectedTypes, type) ? 0 : -1 + } + for (var i = 0, len = expectedTypes.length; i < len; i++) { + if (isSameType(expectedTypes[i], type)) { + return i + } + } + return -1 + } + + function getInvalidTypeMessage (name, value, expectedTypes) { + var message = "Invalid prop: type check failed for prop \"" + name + "\"." + + " Expected " + (expectedTypes.map(capitalize).join(', ')); + var expectedType = expectedTypes[0]; + var receivedType = toRawType(value); + var expectedValue = styleValue(value, expectedType); + var receivedValue = styleValue(value, receivedType); + // check if we need to specify expected value + if (expectedTypes.length === 1 && + isExplicable(expectedType) && + !isBoolean(expectedType, receivedType)) { + message += " with value " + expectedValue; + } + message += ", got " + receivedType + " "; + // check if we need to specify received value + if (isExplicable(receivedType)) { + message += "with value " + receivedValue + "."; + } + return message + } + + function styleValue (value, type) { + if (type === 'String') { + return ("\"" + value + "\"") + } else if (type === 'Number') { + return ("" + (Number(value))) + } else { + return ("" + value) + } + } + + function isExplicable (value) { + var explicitTypes = ['string', 'number', 'boolean']; + return explicitTypes.some(function (elem) { return value.toLowerCase() === elem; }) + } + + function isBoolean () { + var args = [], len = arguments.length; + while ( len-- ) args[ len ] = arguments[ len ]; + + return args.some(function (elem) { return elem.toLowerCase() === 'boolean'; }) + } + + /* */ + + function handleError (err, vm, info) { + // Deactivate deps tracking while processing error handler to avoid possible infinite rendering. + // See: https://github.com/vuejs/vuex/issues/1505 + pushTarget(); + try { + if (vm) { + var cur = vm; + while ((cur = cur.$parent)) { + var hooks = cur.$options.errorCaptured; + if (hooks) { + for (var i = 0; i < hooks.length; i++) { + try { + var capture = hooks[i].call(cur, err, vm, info) === false; + if (capture) { return } + } catch (e) { + globalHandleError(e, cur, 'errorCaptured hook'); + } + } + } + } + } + globalHandleError(err, vm, info); + } finally { + popTarget(); + } + } + + function invokeWithErrorHandling ( + handler, + context, + args, + vm, + info + ) { + var res; + try { + res = args ? handler.apply(context, args) : handler.call(context); + if (res && !res._isVue && isPromise(res) && !res._handled) { + res.catch(function (e) { return handleError(e, vm, info + " (Promise/async)"); }); + // issue #9511 + // avoid catch triggering multiple times when nested calls + res._handled = true; + } + } catch (e) { + handleError(e, vm, info); + } + return res + } + + function globalHandleError (err, vm, info) { + if (config.errorHandler) { + try { + return config.errorHandler.call(null, err, vm, info) + } catch (e) { + // if the user intentionally throws the original error in the handler, + // do not log it twice + if (e !== err) { + logError(e, null, 'config.errorHandler'); + } + } + } + logError(err, vm, info); + } + + function logError (err, vm, info) { + { + warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm); + } + /* istanbul ignore else */ + if ((inBrowser || inWeex) && typeof console !== 'undefined') { + console.error(err); + } else { + throw err + } + } + + /* */ + + var isUsingMicroTask = false; + + var callbacks = []; + var pending = false; + + function flushCallbacks () { + pending = false; + var copies = callbacks.slice(0); + callbacks.length = 0; + for (var i = 0; i < copies.length; i++) { + copies[i](); + } + } + + // Here we have async deferring wrappers using microtasks. + // In 2.5 we used (macro) tasks (in combination with microtasks). + // However, it has subtle problems when state is changed right before repaint + // (e.g. #6813, out-in transitions). + // Also, using (macro) tasks in event handler would cause some weird behaviors + // that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109). + // So we now use microtasks everywhere, again. + // A major drawback of this tradeoff is that there are some scenarios + // where microtasks have too high a priority and fire in between supposedly + // sequential events (e.g. #4521, #6690, which have workarounds) + // or even between bubbling of the same event (#6566). + var timerFunc; + + // The nextTick behavior leverages the microtask queue, which can be accessed + // via either native Promise.then or MutationObserver. + // MutationObserver has wider support, however it is seriously bugged in + // UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It + // completely stops working after triggering a few times... so, if native + // Promise is available, we will use it: + /* istanbul ignore next, $flow-disable-line */ + if (typeof Promise !== 'undefined' && isNative(Promise)) { + var p = Promise.resolve(); + timerFunc = function () { + p.then(flushCallbacks); + // In problematic UIWebViews, Promise.then doesn't completely break, but + // it can get stuck in a weird state where callbacks are pushed into the + // microtask queue but the queue isn't being flushed, until the browser + // needs to do some other work, e.g. handle a timer. Therefore we can + // "force" the microtask queue to be flushed by adding an empty timer. + if (isIOS) { setTimeout(noop); } + }; + isUsingMicroTask = true; + } else if (!isIE && typeof MutationObserver !== 'undefined' && ( + isNative(MutationObserver) || + // PhantomJS and iOS 7.x + MutationObserver.toString() === '[object MutationObserverConstructor]' + )) { + // Use MutationObserver where native Promise is not available, + // e.g. PhantomJS, iOS7, Android 4.4 + // (#6466 MutationObserver is unreliable in IE11) + var counter = 1; + var observer = new MutationObserver(flushCallbacks); + var textNode = document.createTextNode(String(counter)); + observer.observe(textNode, { + characterData: true + }); + timerFunc = function () { + counter = (counter + 1) % 2; + textNode.data = String(counter); + }; + isUsingMicroTask = true; + } else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) { + // Fallback to setImmediate. + // Technically it leverages the (macro) task queue, + // but it is still a better choice than setTimeout. + timerFunc = function () { + setImmediate(flushCallbacks); + }; + } else { + // Fallback to setTimeout. + timerFunc = function () { + setTimeout(flushCallbacks, 0); + }; + } + + function nextTick (cb, ctx) { + var _resolve; + callbacks.push(function () { + if (cb) { + try { + cb.call(ctx); + } catch (e) { + handleError(e, ctx, 'nextTick'); + } + } else if (_resolve) { + _resolve(ctx); + } + }); + if (!pending) { + pending = true; + timerFunc(); + } + // $flow-disable-line + if (!cb && typeof Promise !== 'undefined') { + return new Promise(function (resolve) { + _resolve = resolve; + }) + } + } + + /* */ + + var mark; + var measure; + + { + var perf = inBrowser && window.performance; + /* istanbul ignore if */ + if ( + perf && + perf.mark && + perf.measure && + perf.clearMarks && + perf.clearMeasures + ) { + mark = function (tag) { return perf.mark(tag); }; + measure = function (name, startTag, endTag) { + perf.measure(name, startTag, endTag); + perf.clearMarks(startTag); + perf.clearMarks(endTag); + // perf.clearMeasures(name) + }; + } + } + + /* not type checking this file because flow doesn't play well with Proxy */ + + var initProxy; + + { + var allowedGlobals = makeMap( + 'Infinity,undefined,NaN,isFinite,isNaN,' + + 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' + + 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' + + 'require' // for Webpack/Browserify + ); + + var warnNonPresent = function (target, key) { + warn( + "Property or method \"" + key + "\" is not defined on the instance but " + + 'referenced during render. Make sure that this property is reactive, ' + + 'either in the data option, or for class-based components, by ' + + 'initializing the property. ' + + 'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.', + target + ); + }; + + var warnReservedPrefix = function (target, key) { + warn( + "Property \"" + key + "\" must be accessed with \"$data." + key + "\" because " + + 'properties starting with "$" or "_" are not proxied in the Vue instance to ' + + 'prevent conflicts with Vue internals. ' + + 'See: https://vuejs.org/v2/api/#data', + target + ); + }; + + var hasProxy = + typeof Proxy !== 'undefined' && isNative(Proxy); + + if (hasProxy) { + var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact'); + config.keyCodes = new Proxy(config.keyCodes, { + set: function set (target, key, value) { + if (isBuiltInModifier(key)) { + warn(("Avoid overwriting built-in modifier in config.keyCodes: ." + key)); + return false + } else { + target[key] = value; + return true + } + } + }); + } + + var hasHandler = { + has: function has (target, key) { + var has = key in target; + var isAllowed = allowedGlobals(key) || + (typeof key === 'string' && key.charAt(0) === '_' && !(key in target.$data)); + if (!has && !isAllowed) { + if (key in target.$data) { warnReservedPrefix(target, key); } + else { warnNonPresent(target, key); } + } + return has || !isAllowed + } + }; + + var getHandler = { + get: function get (target, key) { + if (typeof key === 'string' && !(key in target)) { + if (key in target.$data) { warnReservedPrefix(target, key); } + else { warnNonPresent(target, key); } + } + return target[key] + } + }; + + initProxy = function initProxy (vm) { + if (hasProxy) { + // determine which proxy handler to use + var options = vm.$options; + var handlers = options.render && options.render._withStripped + ? getHandler + : hasHandler; + vm._renderProxy = new Proxy(vm, handlers); + } else { + vm._renderProxy = vm; + } + }; + } + + /* */ + + var seenObjects = new _Set(); + + /** + * Recursively traverse an object to evoke all converted + * getters, so that every nested property inside the object + * is collected as a "deep" dependency. + */ + function traverse (val) { + _traverse(val, seenObjects); + seenObjects.clear(); + } + + function _traverse (val, seen) { + var i, keys; + var isA = Array.isArray(val); + if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) { + return + } + if (val.__ob__) { + var depId = val.__ob__.dep.id; + if (seen.has(depId)) { + return + } + seen.add(depId); + } + if (isA) { + i = val.length; + while (i--) { _traverse(val[i], seen); } + } else { + keys = Object.keys(val); + i = keys.length; + while (i--) { _traverse(val[keys[i]], seen); } + } + } + + /* */ + + var normalizeEvent = cached(function (name) { + var passive = name.charAt(0) === '&'; + name = passive ? name.slice(1) : name; + var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first + name = once$$1 ? name.slice(1) : name; + var capture = name.charAt(0) === '!'; + name = capture ? name.slice(1) : name; + return { + name: name, + once: once$$1, + capture: capture, + passive: passive + } + }); + + function createFnInvoker (fns, vm) { + function invoker () { + var arguments$1 = arguments; + + var fns = invoker.fns; + if (Array.isArray(fns)) { + var cloned = fns.slice(); + for (var i = 0; i < cloned.length; i++) { + invokeWithErrorHandling(cloned[i], null, arguments$1, vm, "v-on handler"); + } + } else { + // return handler return value for single handlers + return invokeWithErrorHandling(fns, null, arguments, vm, "v-on handler") + } + } + invoker.fns = fns; + return invoker + } + + function updateListeners ( + on, + oldOn, + add, + remove$$1, + createOnceHandler, + vm + ) { + var name, def$$1, cur, old, event; + for (name in on) { + def$$1 = cur = on[name]; + old = oldOn[name]; + event = normalizeEvent(name); + if (isUndef(cur)) { + warn( + "Invalid handler for event \"" + (event.name) + "\": got " + String(cur), + vm + ); + } else if (isUndef(old)) { + if (isUndef(cur.fns)) { + cur = on[name] = createFnInvoker(cur, vm); + } + if (isTrue(event.once)) { + cur = on[name] = createOnceHandler(event.name, cur, event.capture); + } + add(event.name, cur, event.capture, event.passive, event.params); + } else if (cur !== old) { + old.fns = cur; + on[name] = old; + } + } + for (name in oldOn) { + if (isUndef(on[name])) { + event = normalizeEvent(name); + remove$$1(event.name, oldOn[name], event.capture); + } + } + } + + /* */ + + function mergeVNodeHook (def, hookKey, hook) { + if (def instanceof VNode) { + def = def.data.hook || (def.data.hook = {}); + } + var invoker; + var oldHook = def[hookKey]; + + function wrappedHook () { + hook.apply(this, arguments); + // important: remove merged hook to ensure it's called only once + // and prevent memory leak + remove(invoker.fns, wrappedHook); + } + + if (isUndef(oldHook)) { + // no existing hook + invoker = createFnInvoker([wrappedHook]); + } else { + /* istanbul ignore if */ + if (isDef(oldHook.fns) && isTrue(oldHook.merged)) { + // already a merged invoker + invoker = oldHook; + invoker.fns.push(wrappedHook); + } else { + // existing plain hook + invoker = createFnInvoker([oldHook, wrappedHook]); + } + } + + invoker.merged = true; + def[hookKey] = invoker; + } + + /* */ + + function extractPropsFromVNodeData ( + data, + Ctor, + tag + ) { + // we are only extracting raw values here. + // validation and default values are handled in the child + // component itself. + var propOptions = Ctor.options.props; + if (isUndef(propOptions)) { + return + } + var res = {}; + var attrs = data.attrs; + var props = data.props; + if (isDef(attrs) || isDef(props)) { + for (var key in propOptions) { + var altKey = hyphenate(key); + { + var keyInLowerCase = key.toLowerCase(); + if ( + key !== keyInLowerCase && + attrs && hasOwn(attrs, keyInLowerCase) + ) { + tip( + "Prop \"" + keyInLowerCase + "\" is passed to component " + + (formatComponentName(tag || Ctor)) + ", but the declared prop name is" + + " \"" + key + "\". " + + "Note that HTML attributes are case-insensitive and camelCased " + + "props need to use their kebab-case equivalents when using in-DOM " + + "templates. You should probably use \"" + altKey + "\" instead of \"" + key + "\"." + ); + } + } + checkProp(res, props, key, altKey, true) || + checkProp(res, attrs, key, altKey, false); + } + } + return res + } + + function checkProp ( + res, + hash, + key, + altKey, + preserve + ) { + if (isDef(hash)) { + if (hasOwn(hash, key)) { + res[key] = hash[key]; + if (!preserve) { + delete hash[key]; + } + return true + } else if (hasOwn(hash, altKey)) { + res[key] = hash[altKey]; + if (!preserve) { + delete hash[altKey]; + } + return true + } + } + return false + } + + /* */ + + // The template compiler attempts to minimize the need for normalization by + // statically analyzing the template at compile time. + // + // For plain HTML markup, normalization can be completely skipped because the + // generated render function is guaranteed to return Array. There are + // two cases where extra normalization is needed: + + // 1. When the children contains components - because a functional component + // may return an Array instead of a single root. In this case, just a simple + // normalization is needed - if any child is an Array, we flatten the whole + // thing with Array.prototype.concat. It is guaranteed to be only 1-level deep + // because functional components already normalize their own children. + function simpleNormalizeChildren (children) { + for (var i = 0; i < children.length; i++) { + if (Array.isArray(children[i])) { + return Array.prototype.concat.apply([], children) + } + } + return children + } + + // 2. When the children contains constructs that always generated nested Arrays, + // e.g.