diff --git a/code/__DEFINES.dm b/code/__DEFINES.dm index 00ad7c3e2c9..997dd321621 100644 --- a/code/__DEFINES.dm +++ b/code/__DEFINES.dm @@ -442,3 +442,18 @@ var/list/be_special_flags = list( #define IMPLOYAL_HUD 5 // loyality implant #define IMPCHEM_HUD 6 // chemical implant #define IMPTRACK_HUD 7 // tracking implant + +//DNA - Because fuck you and your magic numbers being all over the codebase. +#define DNA_BLOCK_SIZE 3 + +#define DNA_UNI_IDENTITY_BLOCKS 7 +#define DNA_HAIR_COLOR_BLOCK 1 +#define DNA_FACIAL_HAIR_COLOR_BLOCK 2 +#define DNA_SKIN_TONE_BLOCK 3 +#define DNA_EYE_COLOR_BLOCK 4 +#define DNA_GENDER_BLOCK 5 +#define DNA_FACIAL_HAIR_STYLE_BLOCK 6 +#define DNA_HAIR_STYLE_BLOCK 7 + +#define DNA_STRUC_ENZYMES_BLOCKS 14 +#define DNA_UNIQUE_ENZYMES_LEN 32 \ No newline at end of file diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index a661ab83040..f4d15025868 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -1,14 +1,5 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 -/proc/dopage(src,target = null) - var/href_list - var/href - href_list = params2list("src=\ref[src][target ? "&[target]" : ""]") - href = "src=\ref[src];[target]" - src:temp_html = null - src:Topic(href, href_list) - return null - /proc/get_area(O) var/atom/location = O var/i diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 151abae29c5..35e7f4850ce 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -64,4 +64,13 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel") for(var/t in L) . += " has: [t]\n" world << . -*/ \ No newline at end of file +*/ + +//creates every subtype of prototype (excluding prototype) and adds it to list L. +//if no list/L is provided, one is created. +/proc/init_subtypes(prototype, list/L) + if(!istype(L)) L = list() + for(var/path in typesof(prototype)) + if(path == prototype) continue + L += new path() + return L diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm index b174147d583..fc5ad930680 100644 --- a/code/__HELPERS/maths.dm +++ b/code/__HELPERS/maths.dm @@ -26,9 +26,6 @@ var/const/Sqrt2 = 1.41421356 /proc/Default(a, b) return a ? a : b -/proc/Floor(x) - return round(x) - // Greatest Common Divisor - Euclid's algorithm /proc/Gcd(a, b) return b ? Gcd(b, a % b) : a @@ -47,7 +44,7 @@ var/const/Sqrt2 = 1.41421356 return min <= val && val <= max /proc/IsInteger(x) - return Floor(x) == x + return round(x) == x /proc/IsOdd(x) return !IsEven(x) @@ -110,5 +107,28 @@ var/const/Sqrt2 = 1.41421356 // min is inclusive, max is exclusive /proc/Wrap(val, min, max) var/d = max - min - var/t = Floor((val - min) / d) - return val - (t * d) \ No newline at end of file + var/t = round((val - min) / d) + return val - (t * d) + +//polar variant of a gaussian distributed PRNG +//since this method produces two random numbers, one is saved for subsequent calls +//(making the cost negligble for every second call) +//This will return +/- decimals, situated about mean with standard deviation stddev +var/gaussian_next +#define ACCURACY 10000 +/proc/gaussian(mean, stddev) + var/R1;var/R2;var/working + if(gaussian_next != null) + R1 = gaussian_next + gaussian_next = null + else + do + R1 = rand(-ACCURACY,ACCURACY)/ACCURACY + R2 = rand(-ACCURACY,ACCURACY)/ACCURACY + working = R1*R1 + R2*R2 + while(working >= 1) + R1 *= working + R2 *= working + gaussian_next = R2 + return (mean + stddev * R1) +#undef ACCURACY \ No newline at end of file diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 366052ba80d..0da2da6deec 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -1,3 +1,17 @@ +/proc/random_blood_type() + return pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") + +/proc/random_eye_color() + switch(pick(20;"brown",20;"hazel",20;"grey",15;"blue",15;"green",1;"amber",1;"albino")) + if("brown") return "630" + if("hazel") return "542" + if("grey") return pick("666","777","888","999","aaa","bbb","ccc") + if("blue") return "36c" + if("green") return "060" + if("amber") return "fc0" + if("albino") return pick("c","d","e","f") + pick("0","1","2","3","4","5","6","7","8","9") + pick("0","1","2","3","4","5","6","7","8","9") + else return "000" + /proc/random_underwear(gender) switch(gender) if(MALE) return pick(underwear_m) @@ -16,31 +30,29 @@ proc/random_facial_hair_style(gender) if(FEMALE) return pick(facial_hair_styles_female_list) else return pick(facial_hair_styles_list) -proc/random_name(gender) - if(gender==FEMALE) return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) - else return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) +proc/random_name(gender, attempts_to_find_unique_name=10) + for(var/i=1, i<=attempts_to_find_unique_name, i++) + if(gender==FEMALE) . = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) + else . = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) + + if(i != attempts_to_find_unique_name && !findname(.)) + break proc/random_skin_tone() - switch(pick(60;"caucasian", 15;"afroamerican", 10;"african", 10;"latino", 5;"albino")) - if("caucasian") . = -10 - if("afroamerican") . = -115 - if("african") . = -165 - if("latino") . = -55 - if("albino") . = 34 - else . = rand(-185,34) - return min(max( .+rand(-25, 25), -185),34) + return pick(60;"caucasian", 15;"afroamerican", 10;"african", 10;"latino", 5;"albino", 20;"oriental", 10;"mediteranian") -proc/skintone2racedescription(tone) - switch (tone) - if(30 to INFINITY) return "albino" - if(20 to 30) return "pale" - if(5 to 15) return "light skinned" - if(-10 to 5) return "white" - if(-25 to -10) return "tan" - if(-45 to -25) return "darker skinned" - if(-65 to -45) return "brown" - if(-INFINITY to -65) return "black" - else return "unknown" +var/list/skin_tones = list( + "caucasian" = "fdc", + "afroamerican" = "963", + "african" = "630", + "latino" = "c90", + "albino" = "fff", + "oriental" = "ff6", + "mediteranian" = "cc0" + ) +/proc/skin_tone2color(skin_tone) + . = skin_tones[skin_tone] + if(!.) . = "fdc" proc/age2agedescription(age) switch(age) diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm index 1be69032cf1..2ce093e3003 100644 --- a/code/__HELPERS/sanitize_values.dm +++ b/code/__HELPERS/sanitize_values.dm @@ -30,17 +30,23 @@ else return default return default -/proc/sanitize_hexcolor(color, default="#000000") - if(!istext(color)) return default + +/proc/sanitize_hexcolor(color, desired_format=3, include_bang=0) + var/bang = include_bang ? "#" : "" + if(!istext(color)) + return bang + random_string(desired_format, zero_character_only) + + var/start = 1 + (text2ascii(color,1)==35) var/len = length(color) - if(len != 7 && len !=4) return default - if(text2ascii(color,1) != 35) return default //35 is the ascii code for "#" - . = "#" - for(var/i=2,i<=len,i++) + var/step_size = 1 + ((len+1)-start != desired_format) + + . = bang + for(var/i=start, i<=len, i+=step_size) var/ascii = text2ascii(color,i) switch(ascii) if(48 to 57) . += ascii2text(ascii) //numbers 0 to 9 if(97 to 102) . += ascii2text(ascii) //letters a to f if(65 to 70) . += ascii2text(ascii+32) //letters A to F - translates to lowercase - else return default - return . + else return bang + random_string(desired_format, zero_character_only) + + return . \ No newline at end of file diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index da9d8b34bce..88c1be1a59d 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -329,4 +329,65 @@ var/new_text = "" for(var/i = length(text); i > 0; i--) new_text += copytext(text, i, i+1) - return new_text \ No newline at end of file + return new_text + +var/list/zero_character_only = list("0") +var/list/hex_characters = list("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f") +var/list/alphabet = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z") +var/list/binary = list("0","1") +/proc/random_string(length, list/characters) + . = "" + for(var/i=1, i<=length, i++) + . += pick(characters) + +/proc/repeat_string(times, string="") + . = "" + for(var/i=1, i<=times, i++) + . += string + +/proc/random_short_color() + return random_string(3, hex_characters) + +/proc/add_zero2(t, u) + var/temp1 + while (length(t) < u) + t = "0[t]" + temp1 = t + if (length(t) > u) + temp1 = copytext(t,2,u+1) + return temp1 + +//merges non-null characters (3rd argument) from "from" into "into". Returns result +//e.g. into = "Hello World" +// from = "Seeya______" +// returns"Seeya World" +//The returned text is always the same length as into +//This was coded to handle DNA gene-splicing. +/proc/merge_text(into, from, null_char="_") + . = "" + if(!istext(into)) into = "" + if(!istext(from)) from = "" + var/null_ascii = istext(null_char) ? text2ascii(null_char,1) : null_char + + var/previous = 0 + var/start = 1 + var/end = length(into) + 1 + + for(var/i=1, i 0) - var/char = copytext(hex, i, i + 1) - switch(char) - if("0") - //Apparently, switch works with empty statements, yay! If that doesn't work, blame me, though. -- Urist - if("9", "8", "7", "6", "5", "4", "3", "2", "1") - num += text2num(char) * 16 ** power - if("a", "A") - num += 16 ** power * 10 - if("b", "B") - num += 16 ** power * 11 - if("c", "C") - num += 16 ** power * 12 - if("d", "D") - num += 16 ** power * 13 - if("e", "E") - num += 16 ** power * 14 - if("f", "F") - num += 16 ** power * 15 - else - return - power++ - i-- - return num - -//Returns the hex value of a number given a value assumed to be a base-ten value -/proc/num2hex(num, placeholder) - - if (placeholder == null) - placeholder = 2 - if (!( isnum(num) )) - return - if (!( num )) - return "0" - var/hex = "" - var/i = 0 - while(16 ** i < num) +//Returns the hex value of a decimal number +//len == length of returned string +//if len < 0 then the returned string will be as long as it needs to be to contain the data +//Only supports positive numbers +//if an invalid number is provided, it assumes num==0 +/proc/num2hex(num, len=2) + if(!isnum(num)) + num = 0 + num = round(abs(num)) + . = "" + var/i=0 + while(1) + if(len<0) + if(!num) break + else + if(i>=len) break + var/remainder = num/16 + num = round(remainder) + remainder = (remainder - num) * 16 + switch(remainder) + if(9,8,7,6,5,4,3,2,1) . = "[remainder]" + . + if(10,11,12,13,14,15) . = ascii2text(remainder+87) + . + else . = "0" + . i++ - var/power = null - power = i - 1 - while(power >= 0) - var/val = round(num / 16 ** power) - num -= val * 16 ** power - switch(val) - if(9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0) - hex += text("[]", val) - if(10.0) - hex += "A" - if(11.0) - hex += "B" - if(12.0) - hex += "C" - if(13.0) - hex += "D" - if(14.0) - hex += "E" - if(15.0) - hex += "F" - else - power-- - while(length(hex) < placeholder) - hex = text("0[]", hex) - return hex + return . //Attaches each element of a list to a single string seperated by 'seperator'. @@ -265,4 +242,4 @@ proc/tg_list2text(list/list, glue=",") switch(ui_style) if("Retro") return 'icons/mob/screen_retro.dmi' if("Plasmafire") return 'icons/mob/screen_plasmafire.dmi' - else return 'icons/mob/screen_midnight.dmi' + else return 'icons/mob/screen_midnight.dmi' \ No newline at end of file diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 5f40eea6e63..a7c982e108b 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -259,8 +259,10 @@ Turf and target are seperate in case you want to teleport some distance from a t name = newname if(mind) mind.name = newname - if(dna) - dna.real_name = real_name + if(istype(src, /mob/living/carbon)) + var/mob/living/carbon/C = src + if(C.dna) + C.dna.real_name = real_name if(oldname) //update the datacore records! This is goig to be a bit costly. diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index 3712ad2d25d..49bdb4caa1d 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -44,7 +44,7 @@ affected_mob << "\red You don't feel like yourself.." affected_mob.dna.uni_identity = strain_data["UI"] - updateappearance(affected_mob, affected_mob.dna.uni_identity) + updateappearance(affected_mob) affected_mob.dna.struc_enzymes = strain_data["SE"] affected_mob.real_name = strain_data["name"] domutcheck(affected_mob) @@ -57,7 +57,7 @@ /datum/disease/dnaspread/Del() if ((original_dna["name"]) && (original_dna["UI"]) && (original_dna["SE"])) affected_mob.dna.uni_identity = original_dna["UI"] - updateappearance(affected_mob, affected_mob.dna.uni_identity) + updateappearance(affected_mob) affected_mob.dna.struc_enzymes = original_dna["SE"] affected_mob.real_name = original_dna["name"] diff --git a/code/datums/diseases/retrovirus.dm b/code/datums/diseases/retrovirus.dm index 9ab69e217a8..521176fbf1a 100644 --- a/code/datums/diseases/retrovirus.dm +++ b/code/datums/diseases/retrovirus.dm @@ -84,10 +84,8 @@ affected_mob << "\red Your entire body vibrates." if (prob(35)) - if(prob(50)) - scramble(1, affected_mob, rand(15,45)) - else - scramble(0, affected_mob, rand(15,45)) + if(prob(50)) scramble_dna(affected_mob, 1, 0, rand(15,45)) + else scramble_dna(affected_mob, 0, 1, rand(15,45)) if(4) if(restcure) @@ -102,7 +100,5 @@ cure() return if (prob(60)) - if(prob(50)) - scramble(1, affected_mob, rand(50,75)) - else - scramble(0, affected_mob, rand(50,75)) \ No newline at end of file + if(prob(50)) scramble_dna(affected_mob, 1, 0, rand(50,75)) + else scramble_dna(affected_mob, 0, 1, rand(50,75)) \ No newline at end of file diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 10cb4527844..cbd1d07eade 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -76,8 +76,9 @@ datum/mind current = new_character //associate ourself with our new body new_character.mind = src //and associate our new body with ourself - if(changeling) //if we are a changeling mind, re-add any powers - new_character.make_changeling() + if(changeling && istype(new_character, /mob/living/carbon)) //if we are a changeling mind, re-add any powers + var/mob/living/carbon/C = new_character + C.make_changeling() if(active) new_character.key = key //now transfer the key to link the client to our new body @@ -659,7 +660,7 @@ datum/mind if("changeling") if(!(src in ticker.mode.changelings)) ticker.mode.changelings += src - ticker.mode.grant_changeling_powers(current) + current.make_changeling() special_role = "Changeling" current << "Your powers are awoken. A flash of memory returns to us...we are a changeling!" log_admin("[key_name_admin(usr)] has changeling'ed [current].") @@ -668,13 +669,14 @@ datum/mind usr << "\blue The objectives for changeling [key] have been generated. You can edit them and anounce manually." if("initialdna") - if( !changeling || !changeling.absorbed_dna.len ) + if( !changeling || !changeling.absorbed_dna.len || !istype(current, /mob/living/carbon)) usr << "\red Resetting DNA failed!" else - current.dna = changeling.absorbed_dna[1] - current.real_name = current.dna.real_name - updateappearance(current, current.dna.uni_identity) - domutcheck(current, null) + var/mob/living/carbon/C = current + C.dna = changeling.absorbed_dna[1] + C.real_name = C.dna.real_name + updateappearance(C) + domutcheck(C, null) else if (href_list["nuclear"]) switch(href_list["nuclear"]) @@ -1001,7 +1003,7 @@ datum/mind proc/make_Changling() if(!(src in ticker.mode.changelings)) ticker.mode.changelings += src - ticker.mode.grant_changeling_powers(current) + current.make_changeling() special_role = "Changeling" ticker.mode.forge_changeling_objectives(src) ticker.mode.greet_changeling(src) diff --git a/code/datums/mixed.dm b/code/datums/mixed.dm index 6732e2a8b94..1430901e296 100644 --- a/code/datums/mixed.dm +++ b/code/datums/mixed.dm @@ -2,33 +2,10 @@ /datum/data var/name = "data" - var/size = 1.0 - - -/datum/data/function - name = "function" - size = 2.0 - - -/datum/data/function/data_control - name = "data control" - - -/datum/data/function/id_changer - name = "id changer" - /datum/data/record name = "record" - size = 5.0 - var/list/fields = list( ) - - -/datum/data/text - name = "text" - var/data = null - - + var/list/fields = list() /datum/powernet var/list/cables = list() // all cables & junctions diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 87bc6b4d9df..7ef90d907d3 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -1549,9 +1549,6 @@ proc/process_ghost_teleport_locs() sound_delay = rand(0, 50) for(var/mob/living/carbon/human/H in src) - if(H.s_tone > -55) - H.s_tone-- - H.update_body() if(H.client) mysound.status = SOUND_UPDATE H << mysound @@ -1669,9 +1666,6 @@ var/list/the_station_areas = list ( sound_delay = rand(0, 50) for(var/mob/living/carbon/human/H in src) -// if(H.s_tone > -55) //ugh...nice/novel idea but please no. -// H.s_tone-- -// H.update_body() if(H.client) mysound.status = SOUND_UPDATE H << mysound diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 8afa176ebad..98777f7e0ac 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -310,10 +310,7 @@ its easier to just keep the beam vertical. /atom/proc/add_blood(mob/living/carbon/human/M as mob) if (!( istype(M, /mob/living/carbon/human) )) return 0 - if (!istype(M.dna, /datum/dna)) - M.dna = new /datum/dna(null) - M.dna.real_name = M.real_name - M.check_dna() + check_dna_integrity(M) //check dna is valid and create/setup if necessary if (!( src.flags ) & FPRINT) return 0 if(!blood_DNA || !istype(blood_DNA, /list)) //if our list of DNA doesn't exist yet (or isn't a list) initialise it. diff --git a/code/game/dna.dm b/code/game/dna.dm index c5633d5f70d..623d209e155 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -1,461 +1,296 @@ +#define INJECTOR_TIMEOUT 300 #define REJUVENATORS_INJECT 15 #define REJUVENATORS_MAX 90 +#define NUMBER_OF_BUFFERS 3 +#define RADIATION_STRENGTH_MAX 15 +#define RADIATION_STRENGTH_MULTIPLIER 5 //larger has a more range +#define RADIATION_STRENGTH_BIAS 0 //skews the randomisation based on radstrength*num + +#define RADIATION_DURATION_MAX 30 +#define RADIATION_ACCURACY_MULTIPLIER 12 //larger is less accurate +#define RADIATION_ACCURACY_BIAS 0 //skews the randomisation based on radduration*num + +#define RADIATION_IRRADIATION_MULTIPLIER 0.3 //multiplier for how much radiation a test subject recieves + +#define BAD_MUTATION_DIFFICULTY 2 +#define GOOD_MUTATION_DIFFICULTY 4 +#define OP_MUTATION_DIFFICULTY 5 /////////////////////////// DNA DATUM /datum/dna - var/unique_enzymes = null - var/struc_enzymes = null - var/uni_identity = null - var/b_type = "A+" + var/unique_enzymes + var/struc_enzymes + var/uni_identity + var/b_type var/mutantrace = null //The type of mutant race the player is if applicable (i.e. potato-man) var/real_name //Stores the real name of the person who originally got this dna datum. Used primarely for changelings, -/datum/dna/proc/check_integrity(var/mob/living/carbon/human/character) - if(character) - if(length(uni_identity) != 39) - //Lazy. - var/temp +/datum/dna/New() + if(!b_type) b_type = random_blood_type() - //Hair - var/hair = 0 - if(!character.h_style) - character.h_style = "Skinhead" +/datum/dna/proc/generate_uni_identity(mob/living/carbon/character) + . = "" + var/list/L = new /list(DNA_UNI_IDENTITY_BLOCKS) + if(istype(character)) + L[DNA_GENDER_BLOCK] = construct_block((character.gender!=MALE)+1, 2) + if(istype(character, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = character + L[DNA_HAIR_STYLE_BLOCK] = construct_block(hair_styles_list.Find(H.h_style), hair_styles_list.len) + L[DNA_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.h_color) + L[DNA_FACIAL_HAIR_STYLE_BLOCK] = construct_block(hair_styles_list.Find(H.f_style), facial_hair_styles_list.len) + L[DNA_FACIAL_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.f_color) + L[DNA_SKIN_TONE_BLOCK] = construct_block(skin_tones.Find(H.s_tone), skin_tones.len) + L[DNA_EYE_COLOR_BLOCK] = sanitize_hexcolor(H.eye_color) + + for(var/i=1, i<=DNA_UNI_IDENTITY_BLOCKS, i++) + if(L[i]) . += L[i] + else . += random_string(DNA_BLOCK_SIZE,hex_characters) + return . - var/hrange = round(4095 / hair_styles_list.len) - var/index = hair_styles_list.Find(character.h_style) - if(index) - hair = index * hrange - rand(1,hrange-1) +/datum/dna/proc/generate_struc_enzymes(mob/living/carbon/character) + var/list/L = list("0","1","2","3","4","5","6") + . = "" + for(var/i=1, i<=DNA_STRUC_ENZYMES_BLOCKS, i++) + if(i == RACEBLOCK) + . += construct_block(istype(character,/mob/living/carbon/monkey)+1, 2) + else + . += random_string(DNA_BLOCK_SIZE, L) + return . - //Facial Hair - var/beard = 0 - if(!character.f_style) - character.f_style = "Shaved" - - var/f_hrange = round(4095 / facial_hair_styles_list.len) - index = facial_hair_styles_list.Find(character.f_style) - if(index) - beard = index * f_hrange - rand(1,f_hrange-1) - - temp = add_zero2(num2hex((character.r_hair),1), 3) - temp += add_zero2(num2hex((character.b_hair),1), 3) - temp += add_zero2(num2hex((character.g_hair),1), 3) - temp += add_zero2(num2hex((character.r_facial),1), 3) - temp += add_zero2(num2hex((character.b_facial),1), 3) - temp += add_zero2(num2hex((character.g_facial),1), 3) - temp += add_zero2(num2hex(((character.s_tone + 220) * 16),1), 3) - temp += add_zero2(num2hex((character.r_eyes),1), 3) - temp += add_zero2(num2hex((character.g_eyes),1), 3) - temp += add_zero2(num2hex((character.b_eyes),1), 3) - - var/gender - - if (character.gender == MALE) - gender = add_zero2(num2hex((rand(1,(2050+BLOCKADD))),1), 3) - else - gender = add_zero2(num2hex((rand((2051+BLOCKADD),4094)),1), 3) - - temp += gender - temp += add_zero2(num2hex((beard),1), 3) - temp += add_zero2(num2hex((hair),1), 3) - - uni_identity = temp - if(length(struc_enzymes)!= 42) - var/mutstring = "" - for(var/i = 1, i <= 13, i++) - mutstring += add_zero2(num2hex(rand(1,1024)),3) - - struc_enzymes = mutstring - if(length(unique_enzymes) != 32) - unique_enzymes = md5(character.real_name) +/datum/dna/proc/generate_unique_enzymes(mob/living/carbon/character) + . = "" + if(istype(character)) + real_name = character.real_name + . += md5(character.real_name) + reg_dna[.] = real_name else - if(length(uni_identity) != 39) uni_identity = "00600200A00E0110148FC01300B0095BD7FD3F4" - if(length(struc_enzymes)!= 42) struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4000" + . += repeat_string(DNA_UNIQUE_ENZYMES_LEN, "0") + return . -/datum/dna/proc/ready_dna(mob/living/carbon/human/character) - var/temp +/proc/hardset_dna(mob/living/carbon/owner, ui, se, real_name, mutantrace, blood_type) + if(!istype(owner)) + return + if(!owner.dna) + owner.dna = new /datum/dna() + + if(real_name) + owner.real_name = real_name + owner.dna.generate_unique_enzymes(owner) + + if(blood_type) + owner.dna.b_type = blood_type + + if(ui) + owner.dna.uni_identity = ui + updateappearance(owner) + + var/update_mutantrace = (mutantrace != owner.dna.mutantrace) + owner.dna.mutantrace = mutantrace + if(update_mutantrace && istype(owner, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = owner + H.update_mutantrace() + + if(se) + owner.dna.struc_enzymes = se + domutcheck(owner) + + check_dna_integrity(owner) + +/proc/check_dna_integrity(mob/living/carbon/character) + if(!istype(character)) + return 0 + if(!character.dna) + if(ready_dna(character)) + return 1 + return 0 + + if(length(character.dna.uni_identity) != DNA_UNI_IDENTITY_BLOCKS*DNA_BLOCK_SIZE) + character.dna.uni_identity = character.dna.generate_uni_identity(character) + if(length(character.dna.struc_enzymes)!= DNA_STRUC_ENZYMES_BLOCKS*DNA_BLOCK_SIZE) + character.dna.struc_enzymes = character.dna.generate_struc_enzymes() + if(!character.dna.real_name || length(character.dna.unique_enzymes) != DNA_UNIQUE_ENZYMES_LEN) + character.dna.unique_enzymes = character.dna.generate_unique_enzymes(character) + return 1 - //Hair - var/hair = 0 - if(!character.h_style) - character.h_style = random_hair_style(character.gender) - - var/hrange = round(4095 / hair_styles_list.len) - var/index = hair_styles_list.Find(character.h_style) - if(index) - hair = index * hrange - rand(1,hrange-1) - - //Facial Hair - var/beard = 0 - if(!character.f_style) - character.f_style = random_facial_hair_style(character.gender) - - var/f_hrange = round(4095 / facial_hair_styles_list.len) - index = facial_hair_styles_list.Find(character.f_style) - if(index) - beard = index * f_hrange - rand(1,f_hrange-1) - - temp = add_zero2(num2hex((character.r_hair),1), 3) - temp += add_zero2(num2hex((character.b_hair),1), 3) - temp += add_zero2(num2hex((character.g_hair),1), 3) - temp += add_zero2(num2hex((character.r_facial),1), 3) - temp += add_zero2(num2hex((character.b_facial),1), 3) - temp += add_zero2(num2hex((character.g_facial),1), 3) - temp += add_zero2(num2hex(((character.s_tone + 220) * 16),1), 3) - temp += add_zero2(num2hex((character.r_eyes),1), 3) - temp += add_zero2(num2hex((character.g_eyes),1), 3) - temp += add_zero2(num2hex((character.b_eyes),1), 3) - - var/gender - - if (character.gender == MALE) - gender = add_zero2(num2hex((rand(1,(2050+BLOCKADD))),1), 3) - else - gender = add_zero2(num2hex((rand((2051+BLOCKADD),4094)),1), 3) - - temp += gender - temp += add_zero2(num2hex((beard),1), 3) - temp += add_zero2(num2hex((hair),1), 3) - - uni_identity = temp - - var/mutstring = "" - for(var/i = 1, i <= 13, i++) - mutstring += add_zero2(num2hex(rand(1,1024)),3) - - struc_enzymes = mutstring - - unique_enzymes = md5(character.real_name) - reg_dna[unique_enzymes] = character.real_name +/proc/ready_dna(mob/living/carbon/character, blood_type) + if(!istype(character, /mob/living/carbon/monkey) && !istype(character, /mob/living/carbon/human)) + return 0 + if(!character.dna) + character.dna = new /datum/dna() + if(blood_type) + character.dna.b_type = blood_type + character.dna.real_name = character.real_name + character.dna.uni_identity = character.dna.generate_uni_identity(character) + character.dna.struc_enzymes = character.dna.generate_struc_enzymes(character) + character.dna.unique_enzymes = character.dna.generate_unique_enzymes(character) + return 1 /////////////////////////// DNA DATUM /////////////////////////// DNA HELPER-PROCS /proc/getleftblocks(input,blocknumber,blocksize) - var/string - - if (blocknumber > 1) - string = copytext(input,1,((blocksize*blocknumber)-(blocksize-1))) - return string - else - return null + if(blocknumber > 1) + return copytext(input,1,((blocksize*blocknumber)-(blocksize-1))) /proc/getrightblocks(input,blocknumber,blocksize) - var/string - if (blocknumber < (length(input)/blocksize)) - string = copytext(input,blocksize*blocknumber+1,length(input)+1) - return string - else - return null - -/proc/getblockstring(input,block,subblock,blocksize,src,ui) // src is probably used here just for urls; ui is 1 when requesting for the unique identifier screen, 0 for structural enzymes screen - var/string = "
" - var/subpos = 1 // keeps track of the current sub block - var/blockpos = 1 // keeps track of the current block - - - for(var/i = 1, i <= length(input), i++) // loop through each letter - - var/pushstring - - if(subpos == subblock && blockpos == block) // if the current block/subblock is selected, mark it - pushstring = "[copytext(input, i, i+1)]" - else - if(ui) //This is for allowing block clicks to be differentiated - pushstring = "[copytext(input, i, i+1)]" - else - pushstring = "[copytext(input, i, i+1)]" - - string += pushstring // push the string to the return string - - if(subpos >= blocksize) // add a line break for every block - string += "
" - subpos = 0 - blockpos++ - - subpos++ - - string += "
" - - return string - - -/proc/getblock(input,blocknumber,blocksize) - var/result - result = copytext(input ,(blocksize*blocknumber)-(blocksize-1),(blocksize*blocknumber)+1) - return result + if(blocknumber < (length(input)/blocksize)) + return copytext(input,blocksize*blocknumber+1,length(input)+1) +/proc/getblock(input, blocknumber, blocksize=DNA_BLOCK_SIZE) + return copytext(input, blocksize*(blocknumber-1)+1, (blocksize*blocknumber)+1) +/* /proc/getblockbuffer(input,blocknumber,blocksize) - var/result[3] - var/block = copytext(input ,(blocksize*blocknumber)-(blocksize-1),(blocksize*blocknumber)+1) - for(var/i = 1, i <= 3, i++) - result[i] = copytext(block, i, i+1) + var/result[blocksize] + var/start = (blocksize*blocknumber)-blocksize + for(var/i=1, i<=blocksize, i++) + result[i] = copytext(input, start+i, start+i+1) return result - -/proc/setblock(istring, blocknumber, replacement, blocksize) +*/ +/proc/setblock(istring, blocknumber, replacement, blocksize=DNA_BLOCK_SIZE) if(!istring || !blocknumber || !replacement || !blocksize) return 0 - var/result = getleftblocks(istring, blocknumber, blocksize) + replacement + getrightblocks(istring, blocknumber, blocksize) - return result + return getleftblocks(istring, blocknumber, blocksize) + replacement + getrightblocks(istring, blocknumber, blocksize) -/proc/add_zero2(t, u) - var/temp1 - while (length(t) < u) - t = "0[t]" - temp1 = t - if (length(t) > u) - temp1 = copytext(t,2,u+1) - return temp1 +/proc/scramble(input,rs,rd) + var/length = length(input) + var/num = hex2num(input) + num = round(num + gaussian(rs*RADIATION_STRENGTH_BIAS, rs*RADIATION_STRENGTH_MULTIPLIER), 1) + return num2hex(Wrap(num, 0, 16**length), length) -/proc/miniscramble(input,rs,rd) - var/output - output = null - if (input == "C" || input == "D" || input == "E" || input == "F") - output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"6",prob((rs*10));"7",prob((rs*5)+(rd));"0",prob((rs*5)+(rd));"1",prob((rs*10)-(rd));"2",prob((rs*10)-(rd));"3") - if (input == "8" || input == "9" || input == "A" || input == "B") - output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"A",prob((rs*10));"B",prob((rs*5)+(rd));"C",prob((rs*5)+(rd));"D",prob((rs*5)+(rd));"2",prob((rs*5)+(rd));"3") - if (input == "4" || input == "5" || input == "6" || input == "7") - output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"A",prob((rs*10));"B",prob((rs*5)+(rd));"C",prob((rs*5)+(rd));"D",prob((rs*5)+(rd));"2",prob((rs*5)+(rd));"3") - if (input == "0" || input == "1" || input == "2" || input == "3") - output = pick(prob((rs*10));"8",prob((rs*10));"9",prob((rs*10));"A",prob((rs*10));"B",prob((rs*10)-(rd));"C",prob((rs*10)-(rd));"D",prob((rs*5)+(rd));"E",prob((rs*5)+(rd));"F") - if (!output) output = "5" - return output +/proc/randomize_radiation_accuracy(position_we_were_supposed_to_hit, radduration, number_of_blocks) + return Wrap(round(position_we_were_supposed_to_hit + gaussian(radduration*RADIATION_ACCURACY_BIAS, RADIATION_ACCURACY_MULTIPLIER/radduration), 1), 1, number_of_blocks+1) -//Instead of picking a value far from the input, this will pick values closer to it. -//Sorry for the block of code, but it's more efficient then calling text2hex -> loop -> hex2text -/proc/miniscrambletarget(input,rs,rd) - var/output = null - switch(input) - if("0") - output = pick(prob((rs*10)+(rd));"0",prob((rs*10)+(rd));"1",prob((rs*10));"2",prob((rs*10)-(rd));"3") - if("1") - output = pick(prob((rs*10)+(rd));"0",prob((rs*10)+(rd));"1",prob((rs*10)+(rd));"2",prob((rs*10));"3",prob((rs*10)-(rd));"4") - if("2") - output = pick(prob((rs*10));"0",prob((rs*10)+(rd));"1",prob((rs*10)+(rd));"2",prob((rs*10)+(rd));"3",prob((rs*10));"4",prob((rs*10)-(rd));"5") - if("3") - output = pick(prob((rs*10)-(rd));"0",prob((rs*10));"1",prob((rs*10)+(rd));"2",prob((rs*10)+(rd));"3",prob((rs*10)+(rd));"4",prob((rs*10));"5",prob((rs*10)-(rd));"6") - if("4") - output = pick(prob((rs*10)-(rd));"1",prob((rs*10));"2",prob((rs*10)+(rd));"3",prob((rs*10)+(rd));"4",prob((rs*10)+(rd));"5",prob((rs*10));"6",prob((rs*10)-(rd));"7") - if("5") - output = pick(prob((rs*10)-(rd));"2",prob((rs*10));"3",prob((rs*10)+(rd));"4",prob((rs*10)+(rd));"5",prob((rs*10)+(rd));"6",prob((rs*10));"7",prob((rs*10)-(rd));"8") - if("6") - output = pick(prob((rs*10)-(rd));"3",prob((rs*10));"4",prob((rs*10)+(rd));"5",prob((rs*10)+(rd));"6",prob((rs*10)+(rd));"7",prob((rs*10));"8",prob((rs*10)-(rd));"9") - if("7") - output = pick(prob((rs*10)-(rd));"4",prob((rs*10));"5",prob((rs*10)+(rd));"6",prob((rs*10)+(rd));"7",prob((rs*10)+(rd));"8",prob((rs*10));"9",prob((rs*10)-(rd));"A") - if("8") - output = pick(prob((rs*10)-(rd));"5",prob((rs*10));"6",prob((rs*10)+(rd));"7",prob((rs*10)+(rd));"8",prob((rs*10)+(rd));"9",prob((rs*10));"A",prob((rs*10)-(rd));"B") - if("9") - output = pick(prob((rs*10)-(rd));"6",prob((rs*10));"7",prob((rs*10)+(rd));"8",prob((rs*10)+(rd));"9",prob((rs*10)+(rd));"A",prob((rs*10));"B",prob((rs*10)-(rd));"C") - if("10")//A - output = pick(prob((rs*10)-(rd));"7",prob((rs*10));"8",prob((rs*10)+(rd));"9",prob((rs*10)+(rd));"A",prob((rs*10)+(rd));"B",prob((rs*10));"C",prob((rs*10)-(rd));"D") - if("11")//B - output = pick(prob((rs*10)-(rd));"8",prob((rs*10));"9",prob((rs*10)+(rd));"A",prob((rs*10)+(rd));"B",prob((rs*10)+(rd));"C",prob((rs*10));"D",prob((rs*10)-(rd));"E") - if("12")//C - output = pick(prob((rs*10)-(rd));"9",prob((rs*10));"A",prob((rs*10)+(rd));"B",prob((rs*10)+(rd));"C",prob((rs*10)+(rd));"D",prob((rs*10));"E",prob((rs*10)-(rd));"F") - if("13")//D - output = pick(prob((rs*10)-(rd));"A",prob((rs*10));"B",prob((rs*10)+(rd));"C",prob((rs*10)+(rd));"D",prob((rs*10)+(rd));"E",prob((rs*10));"F") - if("14")//E - output = pick(prob((rs*10)-(rd));"B",prob((rs*10));"C",prob((rs*10)+(rd));"D",prob((rs*10)+(rd));"E",prob((rs*10)+(rd));"F") - if("15")//F - output = pick(prob((rs*10)-(rd));"C",prob((rs*10));"D",prob((rs*10)+(rd));"E",prob((rs*10)+(rd));"F") - - if(!input || !output) //How did this happen? - output = "8" - - return output - -/proc/isblockon(hnumber, bnumber , var/UI = 0) - - var/temp2 - temp2 = hex2num(hnumber) - - if(UI) - if(temp2 >= 2050) - return 1 - else - return 0 - - if (bnumber == HULKBLOCK || bnumber == TELEBLOCK) - if (temp2 >= 3500 + BLOCKADD) - return 1 - else - return 0 - if (bnumber == XRAYBLOCK || bnumber == FIREBLOCK) - if (temp2 >= 3050 + BLOCKADD) - return 1 - else - return 0 - - - if (temp2 >= 2050 + BLOCKADD) - return 1 - else - return 0 - -/proc/randmutb(mob/M as mob) - if(!M) return +/proc/randmutb(mob/living/carbon/M) + if(!check_dna_integrity(M)) return var/num var/newdna - num = pick(1,3,FAKEBLOCK,5,CLUMSYBLOCK,7,9,BLINDBLOCK,DEAFBLOCK) - M.dna.check_integrity() - newdna = setblock(M.dna.struc_enzymes,num,toggledblock(getblock(M.dna.struc_enzymes,num,3)),3) + num = pick(bad_se_blocks) + newdna = setblock(M.dna.struc_enzymes, num, construct_block(2,2)) M.dna.struc_enzymes = newdna return -/proc/randmutg(mob/M as mob) - if(!M) return +/proc/randmutg(mob/living/carbon/M) + if(!check_dna_integrity(M)) return var/num var/newdna - num = pick(HULKBLOCK,XRAYBLOCK,FIREBLOCK,TELEBLOCK) - M.dna.check_integrity() - newdna = setblock(M.dna.struc_enzymes,num,toggledblock(getblock(M.dna.struc_enzymes,num,3)),3) + num = pick(good_se_blocks | op_se_blocks) + newdna = setblock(M.dna.struc_enzymes, num, construct_block(2,2)) M.dna.struc_enzymes = newdna return -/proc/scramble(var/type, mob/M as mob, var/p) - if(!M) return - M.dna.check_integrity() - if(type) - for(var/i = 1, i <= 13, i++) - if(prob(p)) - M.dna.uni_identity = setblock(M.dna.uni_identity, i, add_zero2(num2hex(rand(1,4095), 1), 3), 3) - updateappearance(M, M.dna.uni_identity) - - else - for(var/i = 1, i <= 13, i++) - if(prob(p)) - M.dna.struc_enzymes = setblock(M.dna.struc_enzymes, i, add_zero2(num2hex(rand(1,4095), 1), 3), 3) - domutcheck(M, null) - return - -/proc/randmuti(mob/M as mob) - if(!M) return +/proc/randmuti(mob/living/carbon/M) + if(!check_dna_integrity(M)) return var/num var/newdna - num = pick(1,2,3,4,5,6,7,8,9,10,11,12,13) - M.dna.check_integrity() - newdna = setblock(M.dna.uni_identity,num,add_zero2(num2hex(rand(1,4095),1),3),3) + num = rand(1, DNA_STRUC_ENZYMES_BLOCKS) + newdna = setblock(M.dna.uni_identity, num, random_string(DNA_BLOCK_SIZE, hex_characters)) M.dna.uni_identity = newdna return -/proc/toggledblock(hnumber) //unused - var/temp3 - var/chtemp - temp3 = hex2num(hnumber) - if (temp3 < 2050) - chtemp = rand(2050,4095) - return add_zero2(num2hex(chtemp,1),3) - else - chtemp = rand(1,2049) - return add_zero2(num2hex(chtemp,1),3) +/proc/scramble_dna(mob/living/carbon/M, ui=FALSE, se=FALSE, probability) + if(!check_dna_integrity(M)) + return 0 + if(se) + for(var/i=1, i<=DNA_STRUC_ENZYMES_BLOCKS, i++) + if(prob(probability)) + M.dna.struc_enzymes = setblock(M.dna.struc_enzymes, i, random_string(DNA_BLOCK_SIZE, hex_characters)) + domutcheck(M, null) + if(ui) + for(var/i=1, i<=DNA_UNI_IDENTITY_BLOCKS, i++) + if(prob(probability)) + M.dna.uni_identity = setblock(M.dna.uni_identity, i, random_string(DNA_BLOCK_SIZE, hex_characters)) + updateappearance(M) + return 1 + /////////////////////////// DNA HELPER-PROCS /////////////////////////// DNA MISC-PROCS -/proc/updateappearance(mob/M as mob , structure) - if(istype(M, /mob/living/carbon/human)) - M.dna.check_integrity() - var/mob/living/carbon/human/H = M - H.r_hair = hex2num(getblock(structure,1,3)) - H.b_hair = hex2num(getblock(structure,2,3)) - H.g_hair = hex2num(getblock(structure,3,3)) - H.r_facial = hex2num(getblock(structure,4,3)) - H.b_facial = hex2num(getblock(structure,5,3)) - H.g_facial = hex2num(getblock(structure,6,3)) - H.s_tone = round(((hex2num(getblock(structure,7,3)) / 16) - 220)) - H.r_eyes = hex2num(getblock(structure,8,3)) - H.g_eyes = hex2num(getblock(structure,9,3)) - H.b_eyes = hex2num(getblock(structure,10,3)) - - if (isblockon(getblock(structure, 11,3),11 , 1)) - H.gender = FEMALE - else - H.gender = MALE - - //Hair - var/hairnum = hex2num(getblock(structure,13,3)) - var/index = round(1 +(hairnum / 4096)*hair_styles_list.len) - if((0 < index) && (index <= hair_styles_list.len)) - H.h_style = hair_styles_list[index] - - //Facial Hair - var/beardnum = hex2num(getblock(structure,12,3)) - index = round(1 +(beardnum / 4096)*facial_hair_styles_list.len) - if((0 < index) && (index <= facial_hair_styles_list.len)) - H.f_style = facial_hair_styles_list[index] - - H.update_body(0) - H.update_hair() - - return 1 - else +/proc/updateappearance(mob/living/carbon/human/H) + if(!istype(H) || !istype(H.dna)) return 0 + check_dna_integrity() + var/structure = H.dna.uni_identity + H.h_color = sanitize_hexcolor(getblock(structure, DNA_HAIR_COLOR_BLOCK)) + H.f_color = sanitize_hexcolor(getblock(structure, DNA_FACIAL_HAIR_COLOR_BLOCK)) + H.s_tone = skin_tones[deconstruct_block(getblock(structure, DNA_SKIN_TONE_BLOCK), skin_tones.len)] + H.eye_color = sanitize_hexcolor(getblock(structure, DNA_EYE_COLOR_BLOCK)) + H.gender = (deconstruct_block(getblock(structure, DNA_GENDER_BLOCK), 2)-1) ? MALE : FEMALE + H.f_style = facial_hair_styles_list[deconstruct_block(getblock(structure, DNA_FACIAL_HAIR_STYLE_BLOCK), facial_hair_styles_list.len)] + H.h_style = hair_styles_list[deconstruct_block(getblock(structure, DNA_HAIR_STYLE_BLOCK), hair_styles_list.len)] -/proc/domutcheck(mob/living/M as mob, connected, inj) - //telekinesis = 1 - //firemut = 2 - //xray = 4 - //hulk = 8 - //clumsy = 16 - M.dna.check_integrity() + H.update_body(0) + H.update_hair() + return 1 + +/proc/domutcheck(mob/living/carbon/M, connected, inj) + if(!check_dna_integrity(M)) + return 0 M.disabilities = 0 M.sdisabilities = 0 - M.mutations = list() + M.mutations.Cut() - M.see_in_dark = 2 - M.see_invisible = SEE_INVISIBLE_LIVING + M.see_in_dark = initial(M.see_in_dark) + M.see_invisible = initial(M.see_invisible) - if (isblockon(getblock(M.dna.struc_enzymes, 1,3),1)) + var/list/blocks = new /list(DNA_STRUC_ENZYMES_BLOCKS) //on-off status for each block + for(var/i in bad_se_blocks) //bad mutations + blocks[i] = (deconstruct_block(getblock(M.dna.struc_enzymes, i), BAD_MUTATION_DIFFICULTY) == BAD_MUTATION_DIFFICULTY) + for(var/i in good_se_blocks) //good mutations + blocks[i] = (deconstruct_block(getblock(M.dna.struc_enzymes, i), GOOD_MUTATION_DIFFICULTY) == GOOD_MUTATION_DIFFICULTY) + for(var/i in op_se_blocks) //Overpowered mutations...extra difficult to obtain + blocks[i] = (deconstruct_block(getblock(M.dna.struc_enzymes, i), OP_MUTATION_DIFFICULTY) == OP_MUTATION_DIFFICULTY) + + if(blocks[NEARSIGHTEDBLOCK]) M.disabilities |= NEARSIGHTED M << "\red Your eyes feel strange." - if (isblockon(getblock(M.dna.struc_enzymes, HULKBLOCK,3),2)) - if(inj || prob(10)) - M << "\blue Your muscles hurt." - M.mutations.Add(HULK) - if (isblockon(getblock(M.dna.struc_enzymes, 3,3),3)) + if(blocks[EPILEPSYBLOCK]) M.disabilities |= EPILEPSY M << "\red You get a headache." - if (isblockon(getblock(M.dna.struc_enzymes, FAKEBLOCK,3),4)) + if(blocks[STRANGEBLOCK]) M << "\red You feel strange." - if (prob(95)) - if(prob(50)) - randmutb(M) - else - randmuti(M) - else - randmutg(M) - if (isblockon(getblock(M.dna.struc_enzymes, 5,3),5)) + if(prob(95)) + if(prob(50)) randmutb(M) + else randmuti(M) + else randmutg(M) + if(blocks[COUGHBLOCK]) M.disabilities |= COUGHING M << "\red You start coughing." - if (isblockon(getblock(M.dna.struc_enzymes, CLUMSYBLOCK,3),6)) + if(blocks[CLUMSYBLOCK]) M << "\red You feel lightheaded." - M.mutations.Add(CLUMSY) - if (isblockon(getblock(M.dna.struc_enzymes, 7,3),7)) + M.mutations |= CLUMSY + if(blocks[TOURETTESBLOCK]) M.disabilities |= TOURETTES M << "\red You twitch." - if (isblockon(getblock(M.dna.struc_enzymes, XRAYBLOCK,3),8)) - if(inj || prob(30)) - M << "\blue The walls suddenly disappear." - M.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) - M.see_in_dark = 8 - M.see_invisible = SEE_INVISIBLE_LEVEL_TWO - M.mutations.Add(XRAY) - if (isblockon(getblock(M.dna.struc_enzymes, 9,3),9)) + if(blocks[NERVOUSBLOCK]) M.disabilities |= NERVOUS M << "\red You feel nervous." - if (isblockon(getblock(M.dna.struc_enzymes, FIREBLOCK,3),10)) - if(inj || prob(30)) - M << "\blue Your body feels warm." - M.mutations.Add(COLD_RESISTANCE) - if (isblockon(getblock(M.dna.struc_enzymes, BLINDBLOCK,3),11)) - M.sdisabilities |= BLIND - M << "\red You can't seem to see anything." - if (isblockon(getblock(M.dna.struc_enzymes, TELEBLOCK,3),12)) - if(inj || prob(25)) - M << "\blue You feel smarter." - M.mutations.Add(TK) - if (isblockon(getblock(M.dna.struc_enzymes, DEAFBLOCK,3),13)) + if(blocks[DEAFBLOCK]) M.sdisabilities |= DEAF M.ear_deaf = 1 M << "\red You can't seem to hear anything..." + if(blocks[BLINDBLOCK]) + M.sdisabilities |= BLIND + M << "\red You can't seem to see anything." + if(blocks[HULKBLOCK]) + if(inj || prob(10)) + M.mutations |= HULK + M << "\blue Your muscles hurt." + if(blocks[XRAYBLOCK]) + if(inj || prob(30)) + M.mutations |= XRAY + M << "\blue The walls suddenly disappear." + M.sight |= SEE_MOBS|SEE_OBJS|SEE_TURFS + M.see_in_dark = 8 + M.see_invisible = SEE_INVISIBLE_LEVEL_TWO + if(blocks[FIREBLOCK]) + if(inj || prob(30)) + M.mutations |= COLD_RESISTANCE + M << "\blue Your body feels warm." + if(blocks[TELEBLOCK]) + if(inj || prob(25)) + M.mutations |= TK + M << "\blue You feel smarter." + /* If you want the new mutations to work, UNCOMMENT THIS. if(istype(M, /mob/living/carbon)) @@ -464,162 +299,143 @@ */ //////////////////////////////////////////////////////////// Monkey Block - if (isblockon(getblock(M.dna.struc_enzymes, 14,3),14) && istype(M, /mob/living/carbon/human)) - // human > monkey - var/mob/living/carbon/human/H = M - H.monkeyizing = 1 - var/list/implants = list() //Try to preserve implants. - for(var/obj/item/weapon/implant/W in H) - implants += W - W.loc = null + if(blocks[RACEBLOCK]) + if(istype(M, /mob/living/carbon/human)) // human > monkey + var/mob/living/carbon/human/H = M + H.monkeyizing = 1 + var/list/implants = list() //Try to preserve implants. + for(var/obj/item/weapon/implant/W in H) + implants += W + W.loc = null - if(!connected) - for(var/obj/item/W in (H.contents-implants)) - if (W==H.w_uniform) // will be teared - continue - H.drop_from_inventory(W) - M.monkeyizing = 1 - M.canmove = 0 - M.icon = null - M.invisibility = 101 - var/atom/movable/overlay/animation = new( M.loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - flick("h2monkey", animation) - sleep(48) - del(animation) + if(!connected) + for(var/obj/item/W in (H.contents-implants)) + if(W==H.w_uniform) // will be teared + continue + H.drop_from_inventory(W) + M.monkeyizing = 1 + M.canmove = 0 + M.icon = null + M.invisibility = 101 + var/atom/movable/overlay/animation = new( M.loc ) + animation.icon_state = "blank" + animation.icon = 'icons/mob/mob.dmi' + animation.master = src + flick("h2monkey", animation) + sleep(48) + del(animation) - var/mob/living/carbon/monkey/O = new(src) + var/mob/living/carbon/monkey/O = new(src) - if(M) - if (M.dna) - O.dna = M.dna - M.dna = null + if(M) + if(M.dna) + O.dna = M.dna + M.dna = null - if (M.suiciding) - O.suiciding = M.suiciding - M.suiciding = null + if(M.suiciding) + O.suiciding = M.suiciding + M.suiciding = null - for(var/datum/disease/D in M.viruses) - O.viruses += D - D.affected_mob = O - M.viruses -= D + for(var/datum/disease/D in M.viruses) + O.viruses += D + D.affected_mob = O + M.viruses -= D - for(var/obj/T in (M.contents-implants)) - del(T) - //for(var/R in M.organs) - // del(M.organs[text("[]", R)]) + for(var/obj/T in (M.contents-implants)) + del(T) - O.loc = M.loc + O.loc = M.loc - if(M.mind) - M.mind.transfer_to(O) //transfer our mind to the cute little monkey + if(M.mind) + M.mind.transfer_to(O) //transfer our mind to the cute little monkey - if (connected) //inside dna thing - var/obj/machinery/dna_scannernew/C = connected - O.loc = C - C.occupant = O - connected = null - O.real_name = text("monkey ([])",copytext(md5(M.real_name), 2, 6)) - O.take_overall_damage(M.getBruteLoss() + 40, M.getFireLoss()) - O.adjustToxLoss(M.getToxLoss() + 20) - O.adjustOxyLoss(M.getOxyLoss()) - O.stat = M.stat - O.a_intent = "harm" - for (var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O -// O.update_icon = 1 //queue a full icon update at next life() call - del(M) - return + if(connected) //inside dna thing + var/obj/machinery/dna_scannernew/C = connected + O.loc = C + C.occupant = O + connected = null + O.real_name = text("monkey ([])",copytext(md5(M.real_name), 2, 6)) + O.take_overall_damage(M.getBruteLoss() + 40, M.getFireLoss()) + O.adjustToxLoss(M.getToxLoss() + 20) + O.adjustOxyLoss(M.getOxyLoss()) + O.stat = M.stat + O.a_intent = "harm" + for (var/obj/item/weapon/implant/I in implants) + I.loc = O + I.implanted = O + // O.update_icon = 1 //queue a full icon update at next life() call + del(M) + return 1 + else + if(istype(M, /mob/living/carbon/monkey)) // monkey > human, + var/mob/living/carbon/monkey/Mo = M + Mo.monkeyizing = 1 + var/list/implants = list() //Still preserving implants + for(var/obj/item/weapon/implant/W in Mo) + implants += W + W.loc = null + if(!connected) + for(var/obj/item/W in (Mo.contents-implants)) + Mo.drop_from_inventory(W) + M.monkeyizing = 1 + M.canmove = 0 + M.icon = null + M.invisibility = 101 + var/atom/movable/overlay/animation = new( M.loc ) + animation.icon_state = "blank" + animation.icon = 'icons/mob/mob.dmi' + animation.master = src + flick("monkey2h", animation) + sleep(48) + del(animation) - if (!isblockon(getblock(M.dna.struc_enzymes, 14,3),14) && !istype(M, /mob/living/carbon/human)) - // monkey > human, - var/mob/living/carbon/monkey/Mo = M - Mo.monkeyizing = 1 - var/list/implants = list() //Still preserving implants - for(var/obj/item/weapon/implant/W in Mo) - implants += W - W.loc = null - if(!connected) - for(var/obj/item/W in (Mo.contents-implants)) - Mo.drop_from_inventory(W) - M.monkeyizing = 1 - M.canmove = 0 - M.icon = null - M.invisibility = 101 - var/atom/movable/overlay/animation = new( M.loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - flick("monkey2h", animation) - sleep(48) - del(animation) + var/mob/living/carbon/human/O = new( src ) + O.gender = (deconstruct_block(getblock(M.dna.uni_identity, DNA_GENDER_BLOCK), 2)-1) ? MALE : FEMALE - var/mob/living/carbon/human/O = new( src ) - if (isblockon(getblock(M.dna.uni_identity, 11,3),11)) - O.gender = FEMALE - else - O.gender = MALE + if(M) + if(M.dna) + O.dna = M.dna + M.dna = null - if (M) - if (M.dna) - O.dna = M.dna - M.dna = null + if(M.suiciding) + O.suiciding = M.suiciding + M.suiciding = null - if (M.suiciding) - O.suiciding = M.suiciding - M.suiciding = null + O.viruses = M.viruses.Copy() + M.viruses.Cut() + for(var/datum/disease/D in O.viruses) + D.affected_mob = O - for(var/datum/disease/D in M.viruses) - O.viruses += D - D.affected_mob = O - M.viruses -= D + O.loc = M.loc - //for(var/obj/T in M) - // del(T) + if(M.mind) + M.mind.transfer_to(O) //transfer our mind to the human - O.loc = M.loc + if(connected) //inside dna thing + var/obj/machinery/dna_scannernew/C = connected + O.loc = C + C.occupant = O + connected = null - if(M.mind) - M.mind.transfer_to(O) //transfer our mind to the human - - if (connected) //inside dna thing - var/obj/machinery/dna_scannernew/C = connected - O.loc = C - C.occupant = O - connected = null - - var/i - while (!i) - var/randomname - if (O.gender == MALE) - randomname = capitalize(pick(first_names_male) + " " + capitalize(pick(last_names))) - else - randomname = capitalize(pick(first_names_female) + " " + capitalize(pick(last_names))) - if (findname(randomname)) - continue - else - O.real_name = randomname - i++ - updateappearance(O,O.dna.uni_identity) - O.take_overall_damage(M.getBruteLoss(), M.getFireLoss()) - O.adjustToxLoss(M.getToxLoss()) - O.adjustOxyLoss(M.getOxyLoss()) - O.stat = M.stat - for (var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O -// O.update_icon = 1 //queue a full icon update at next life() call - del(M) - return + O.real_name = random_name(O.gender) + + updateappearance(O) + O.take_overall_damage(M.getBruteLoss(), M.getFireLoss()) + O.adjustToxLoss(M.getToxLoss()) + O.adjustOxyLoss(M.getOxyLoss()) + O.stat = M.stat + for (var/obj/item/weapon/implant/I in implants) + I.loc = O + I.implanted = O + // O.update_icon = 1 //queue a full icon update at next life() call + del(M) + return 1 //////////////////////////////////////////////////////////// Monkey Block if(M) M.update_icon = 1 //queue a full icon update at next life() call - return null + return 1 /////////////////////////// DNA MISC-PROCS @@ -653,9 +469,9 @@ return 0 /obj/machinery/dna_scannernew/relaymove(mob/user as mob) - if (user.stat) + if(user.stat) return - src.go_out() + go_out() return /obj/machinery/dna_scannernew/verb/eject() @@ -663,9 +479,9 @@ set category = "Object" set name = "Eject DNA Scanner" - if (usr.stat != 0) + if(usr.stat != 0) return - src.go_out() + go_out() for(var/obj/O in src) if((!istype(O,/obj/item/weapon/circuitboard/clonescanner)) && (!istype(O,/obj/item/weapon/stock_parts)) && (!istype(O,/obj/item/weapon/cable_coil))) O.loc = get_turf(src)//Ejects items that manage to get in there (exluding the components) @@ -688,6 +504,9 @@ if(occupant) usr << "The scanner is already occupied!" return + if(locked) + usr << "The bolts are locked." + return if(usr.abiotic()) usr << "Subject cannot have abiotic items on." return @@ -695,15 +514,10 @@ usr.client.perspective = EYE_PERSPECTIVE usr.client.eye = src usr.loc = src - src.occupant = usr - src.icon_state = "scanner_1" - /* - for(var/obj/O in src) // THIS IS P. STUPID -- LOVE, DOOHL - //O = null - del(O) - //Foreach goto(124) - */ - src.add_fingerprint(usr) + occupant = usr + icon_state = "scanner_1" + + add_fingerprint(usr) return /obj/machinery/dna_scannernew/attackby(obj/item/weapon/grab/G, mob/user) @@ -712,6 +526,9 @@ if(occupant) user << "The scanner is already occupied!" return + if(locked) + user << "The scanner is locked." + return if(G.affecting.abiotic()) user << "Subject cannot have abiotic items on." return @@ -741,49 +558,37 @@ return /obj/machinery/dna_scannernew/proc/go_out() - if ((!( src.occupant ) || src.locked)) + if(!occupant || locked) return -/* -// it's like this was -just- here to break constructed dna scanners -Pete -// if that's not the case, slap my shit and uncomment this. -// for(var/obj/O in src) -// O.loc = src.loc -*/ - //Foreach goto(30) - if (src.occupant.client) - src.occupant.client.eye = src.occupant.client.mob - src.occupant.client.perspective = MOB_PERSPECTIVE - src.occupant.loc = src.loc - src.occupant = null - src.icon_state = "scanner_0" + + if(occupant.client) + occupant.client.eye = occupant.client.mob + occupant.client.perspective = MOB_PERSPECTIVE + occupant.loc = loc + occupant = null + icon_state = "scanner_0" return /obj/machinery/dna_scannernew/ex_act(severity) switch(severity) if(1.0) for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc + A.loc = loc ex_act(severity) - //Foreach goto(35) - //SN src = null del(src) return if(2.0) - if (prob(50)) + if(prob(50)) for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc + A.loc = loc ex_act(severity) - //Foreach goto(108) - //SN src = null del(src) return if(3.0) - if (prob(25)) + if(prob(25)) for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc + A.loc = loc ex_act(severity) - //Foreach goto(181) - //SN src = null del(src) return else @@ -793,20 +598,79 @@ /obj/machinery/dna_scannernew/blob_act() if(prob(75)) for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc + A.loc = loc del(src) +/obj/machinery/computer/scan_consolenew + name = "DNA Scanner Access Console" + desc = "Scan DNA." + icon = 'icons/obj/computer.dmi' + icon_state = "scanner" + density = 1 + var/radduration = 2 + var/radstrength = 1 + + var/list/buffer[NUMBER_OF_BUFFERS] + + var/injectorready = 0 //Quick fix for issue 286 (screwdriver the screen twice to restore injector) -Pete + var/current_screen = "mainmenu" + var/obj/machinery/dna_scannernew/connected = null + var/obj/item/weapon/disk/data/diskette = null + anchored = 1.0 + use_power = 1 + idle_power_usage = 10 + active_power_usage = 400 + +/obj/machinery/computer/scan_consolenew/attackby(obj/item/I as obj, mob/user as mob) + if(istype(I, /obj/item/weapon/screwdriver)) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + if(do_after(user, 20)) + if (src.stat & BROKEN) + user << "\blue The broken glass falls out." + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) + new /obj/item/weapon/shard( src.loc ) + var/obj/item/weapon/circuitboard/scan_consolenew/M = new /obj/item/weapon/circuitboard/scan_consolenew( A ) + for (var/obj/C in src) + C.loc = src.loc + A.circuit = M + A.state = 3 + A.icon_state = "3" + A.anchored = 1 + del(src) + else + user << "\blue You disconnect the monitor." + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) + var/obj/item/weapon/circuitboard/scan_consolenew/M = new /obj/item/weapon/circuitboard/scan_consolenew( A ) + for (var/obj/C in src) + C.loc = src.loc + A.circuit = M + A.state = 4 + A.icon_state = "4" + A.anchored = 1 + del(src) + if (istype(I, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES + if (!src.diskette) + user.drop_item() + I.loc = src + src.diskette = I + user << "You insert [I]." + src.updateUsrDialog() + return + else + src.attack_hand(user) + return + + + /obj/machinery/computer/scan_consolenew/ex_act(severity) switch(severity) if(1.0) - //SN src = null del(src) return if(2.0) - if (prob(50)) - //SN src = null + if(prob(50)) del(src) return else @@ -825,7 +689,7 @@ stat &= ~NOPOWER else spawn(rand(0, 15)) - src.icon_state = "c_unpowered" + icon_state = "c_unpowered" stat |= NOPOWER /obj/machinery/computer/scan_consolenew/New() @@ -837,802 +701,389 @@ if(!isnull(connected)) break spawn(250) - src.injectorready = 1 + injectorready = 1 return return /obj/machinery/computer/scan_consolenew/attackby(obj/item/W as obj, mob/user as mob) - if ((istype(W, /obj/item/weapon/disk/data)) && (!src.diskette)) + if((istype(W, /obj/item/weapon/disk/data)) && (!diskette)) user.drop_item() W.loc = src - src.diskette = W + diskette = W user << "You insert [W]." - src.updateUsrDialog() -/* -/obj/machinery/computer/scan_consolenew/process() //not really used right now - if(stat & (NOPOWER|BROKEN)) - return - if (!( src.status )) //remove this - return - return -*/ + updateUsrDialog() + /obj/machinery/computer/scan_consolenew/attack_paw(user as mob) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/computer/scan_consolenew/attack_ai(user as mob) - return src.attack_hand(user) + return attack_hand(user) -/obj/machinery/computer/scan_consolenew/attack_hand(user as mob) +/obj/machinery/computer/scan_consolenew/attack_hand(mob/user) if(..()) return - dopage(src) + ShowInterface(user) + +/obj/machinery/computer/scan_consolenew/proc/ShowInterface(mob/user) + if(!user) return + var/datum/browser/popup = new(user, "scannernew", "DNA Modifier Console", 880, 450) // Set up the popup browser window + popup.add_stylesheet("scannernew", 'html/browser/scannernew.css') + + var/mob/living/carbon/viable_occupant + var/occupant_status + var/scanner_status + var/temp_html + if(connected) + if(connected.occupant) //set occupant_status message + viable_occupant = connected.occupant + if(check_dna_integrity(viable_occupant) && !(NOCLONE in viable_occupant.mutations)) //occupent is viable for dna modification + switch(viable_occupant.stat) + if(CONSCIOUS) occupant_status = "Conscious" + if(UNCONSCIOUS) occupant_status = "Unconscious" + else occupant_status = "DEAD" + occupant_status = "[viable_occupant.name] => [occupant_status]
" + occupant_status += "
Health:
[viable_occupant.health]%
" + occupant_status += "
Radiation Level:
[viable_occupant.radiation]%
" + var/rejuvenators = viable_occupant.reagents.get_reagent_amount("inaprovaline") + occupant_status += "
Rejuvenators:
[rejuvenators] units
" + else + viable_occupant = null + occupant_status = "Invalid DNA structure" + else + occupant_status = "No subject detected" + + if(connected.locked) + scanner_status = "Locked" + else + scanner_status = "Unlocked" + else + occupant_status = "Error: Undefined" + scanner_status = "Error: No scanner detected" + var/status = "
Scanner Status: [scanner_status]
Subject Status: [occupant_status]
Emitter Array Output Level: [radstrength]
Emitter Array Pulse Duration: [radduration]
" + + var/buttons = "Scan " + if(connected) buttons += "Toggle Bolts " + else buttons += "Toggle Bolts " + if(viable_occupant) buttons += "Inject Rejuvenators " + else buttons += "Inject Rejuvenators " + if(diskette) buttons += "Eject Disk " + else buttons += "Eject Disk " + if(current_screen == "buffer") buttons += "Main Menu " + else buttons += "Buffers " + buttons += "
-- Emitter Array Output Level ++" + buttons += "
-- Emitter Array Pulse Duration ++" + + switch(current_screen) + if("working") + temp_html += "

System Busy

" + temp_html += status + temp_html += "Working ... Please wait ([radduration] Seconds)" + if("buffer") + temp_html += "

Buffer Menu

" + temp_html += status + temp_html += buttons + + if(istype(buffer)) + for(var/i=1, i<=buffer.len, i++) + temp_html += "
Slot [i]: " + var/list/buffer_slot = buffer[i] + if( !buffer_slot || !buffer_slot.len || !buffer_slot["name"] || !((buffer_slot["UI"] && buffer_slot["UE"]) || buffer_slot["SE"]) ) + temp_html += "
\tNo Data" + if(viable_occupant) temp_html += "
Save to Buffer " + else temp_html += "
Save to Buffer " + temp_html += "Clear Buffer " + if(diskette) temp_html += "Load from Disk " + else temp_html += "Load from Disk " + temp_html += "Save to Disk " + else + var/ui = buffer_slot["UI"] + var/se = buffer_slot["SE"] + var/ue = buffer_slot["UE"] + var/name = buffer_slot["name"] + var/label = buffer_slot["label"] + var/b_type = buffer_slot["b_type"] + temp_html += "
\tLabel: [label ? label : name]" + temp_html += "
\tSubject: [name]" + if(ue && name && b_type) + temp_html += "
\tBlood Type: [b_type]" + temp_html += "
\tUE: [ue] " + if(viable_occupant) temp_html += "Occupant " + else temp_html += "Occupant" + if(injectorready) temp_html += "Injector" + else temp_html += "Injector" + else + temp_html += "
\tBlood Type: No Data" + temp_html += "
\tUE: No Data" + if(ui) + temp_html += "
\tUI: [ui] " + if(viable_occupant) temp_html += "Occupant " + else temp_html += "Occupant" + if(injectorready) temp_html += "Injector" + else temp_html += "Injector" + else + temp_html += "
\tUI: No Data" + if(se) + temp_html += "
\tSE: [se] " + if(viable_occupant) temp_html += "Occupant " + else temp_html += "Occupant " + if(injectorready) temp_html += "Injector" + else temp_html += "Injector" + else + temp_html += "
\tSE: No Data" + if(viable_occupant) temp_html += "
Save to Buffer " + else temp_html += "
Save to Buffer " + temp_html += "Clear Buffer " + if(diskette) temp_html += "Load from Disk " + else temp_html += "Load from Disk " + if(diskette && !diskette.read_only) temp_html += "Save to Disk " + else temp_html += "Save to Disk " + else + temp_html += "

Main Menu

" + temp_html += status + temp_html += buttons + + temp_html += "
Unique Enzymes :
" + if(viable_occupant) + temp_html += "[viable_occupant.dna.unique_enzymes]" + else + temp_html += " - " + temp_html += "
" + + temp_html += "
Unique Identifier:
" + var/max_line_len = DNA_BLOCK_SIZE * 10 + if(viable_occupant) + var/len = length(viable_occupant.dna.uni_identity) + for(var/i=1, i<=len, i++) + temp_html += "[copytext(viable_occupant.dna.uni_identity,i,i+1)]" + if((i % max_line_len) == 0) + temp_html += "
" + else if((i % DNA_BLOCK_SIZE) == 0) + temp_html += " " + else + temp_html += " - " + temp_html += "
" + + temp_html += "
Structural Enzymes:
" + if(viable_occupant) + var/len = length(viable_occupant.dna.struc_enzymes) + for(var/i=1, i<=len, i++) + temp_html += "[copytext(viable_occupant.dna.struc_enzymes,i,i+1)]" + if((i % max_line_len) == 0) + temp_html += "
" + else if((i % DNA_BLOCK_SIZE) == 0) + temp_html += " " + else + temp_html += " - " + temp_html += "
" + + popup.set_content(temp_html) + popup.open() + /obj/machinery/computer/scan_consolenew/Topic(href, href_list) if(..()) return - if(!istype(usr.loc, /turf)) + if(!isturf(usr.loc)) return - if(!src ) + if(!( (isturf(loc) && in_range(src, usr)) || istype(usr, /mob/living/silicon) )) return - if (!((usr.contents.Find(src) || in_range(src, usr) && istype(src.loc, /turf)) || (istype(usr, /mob/living/silicon)))) + if(current_screen == "working") return - src.add_fingerprint(usr) - - var/datum/browser/popup = new(usr, "scannernew", "DNA Modifier Console", 520, 620) // Set up the popup browser window - popup.add_stylesheet("scannernew", 'html/browser/scannernew.css') - popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state)) - - src.scanner_status_html = null // Scanner status is reset each update - src.temp_html = null - var/temp_header_html = null - var/temp_footer_html = null - + add_fingerprint(usr) usr.set_machine(src) + + var/mob/living/carbon/viable_occupant + if(connected) + viable_occupant = connected.occupant + if(!istype(viable_occupant) || !viable_occupant.dna || (NOCLONE in viable_occupant.mutations)) + viable_occupant = null - var/mob/living/occupant = null - var/viable_occupant = null - var/mob/living/carbon/human/human_occupant = null + //Basic Tasks/////////////////////////////////////////// + var/num = round(text2num(href_list["num"])) + switch(href_list["task"]) + if("togglelock") + if(connected) connected.locked = !connected.locked + if("setduration") + if(!num) + num = round(input(usr, "Choose pulse duration:", "Input an Integer", null) as num|null) + if(num) + radduration = Wrap(num, 1, RADIATION_DURATION_MAX+1) + if("setstrength") + if(!num) + num = round(input(usr, "Choose pulse strength:", "Input an Integer", null) as num|null) + if(num) + radstrength = Wrap(num, 1, RADIATION_STRENGTH_MAX+1) + if("screen") + current_screen = href_list["text"] + if("rejuv") + if(viable_occupant && viable_occupant.reagents) + var/inaprovaline_amount = viable_occupant.reagents.get_reagent_amount("inaprovaline") + var/can_add = max(min(REJUVENATORS_MAX - inaprovaline_amount, REJUVENATORS_INJECT), 0) + viable_occupant.reagents.add_reagent("inaprovaline", can_add) + if("setbufferlabel") + var/text = sanitize(input(usr, "Input a new label:", "Input an Text", null) as text|null) + if(num && text) + num = Clamp(num, 1, NUMBER_OF_BUFFERS) + var/list/buffer_slot = buffer[num] + if(istype(buffer_slot)) + buffer_slot["label"] = text + if("setbuffer") + if(num && viable_occupant) + num = Clamp(num, 1, NUMBER_OF_BUFFERS) + buffer[num] = list( + "label"="Buffer[num]:[viable_occupant.real_name]", + "UI"=viable_occupant.dna.uni_identity, + "SE"=viable_occupant.dna.struc_enzymes, + "UE"=viable_occupant.dna.unique_enzymes, + "name"=viable_occupant.real_name, + "b_type"=viable_occupant.dna.b_type + ) + if("clearbuffer") + if(num) + num = Clamp(num, 1, NUMBER_OF_BUFFERS) + var/list/buffer_slot = buffer[num] + if(istype(buffer_slot)) + buffer_slot.Cut() + if("transferbuffer") + if(num && viable_occupant) + num = Clamp(num, 1, NUMBER_OF_BUFFERS) + var/list/buffer_slot = buffer[num] + if(istype(buffer_slot)) + switch(href_list["text"]) + if("se") + if(buffer_slot["SE"]) + viable_occupant.dna.struc_enzymes = buffer_slot["SE"] + domutcheck(viable_occupant, connected) + if("ui") + if(buffer_slot["UI"]) + viable_occupant.dna.uni_identity = buffer_slot["UI"] + updateappearance(viable_occupant) + else + if(buffer_slot["name"] && buffer_slot["UE"] && buffer_slot["b_type"]) + viable_occupant.real_name = buffer_slot["name"] + viable_occupant.name = buffer_slot["name"] + viable_occupant.dna.unique_enzymes = buffer_slot["UE"] + viable_occupant.dna.b_type = buffer_slot["b_type"] + updateappearance(viable_occupant) + viable_occupant.radiation += rand(15,40) + if("injector") + if(num && injectorready) + num = Clamp(num, 1, NUMBER_OF_BUFFERS) + var/list/buffer_slot = buffer[num] + if(istype(buffer_slot)) + var/obj/item/weapon/dnainjector/I + switch(href_list["text"]) + if("se") + if(buffer_slot["SE"]) + I = new /obj/item/weapon/dnainjector(loc) + I.fields = list("SE"=buffer_slot["SE"]) + if("ui") + if(buffer_slot["UI"]) + I = new /obj/item/weapon/dnainjector(loc) + I.fields = list("UI"=buffer_slot["UI"]) + else + if(buffer_slot["name"] && buffer_slot["UE"] && buffer_slot["b_type"]) + I = new /obj/item/weapon/dnainjector(loc) + I.fields = list("name"=buffer_slot["name"], "UE"=buffer_slot["UE"], "b_type"=buffer_slot["b_type"]) + if(I) + injectorready = 0 + spawn(INJECTOR_TIMEOUT) + injectorready = 1 + if("loaddisk") + if(num && diskette && diskette.fields) + num = Clamp(num, 1, NUMBER_OF_BUFFERS) + buffer[num] = diskette.fields.Copy() + if("savedisk") + if(num && diskette && !diskette.read_only) + num = Clamp(num, 1, NUMBER_OF_BUFFERS) + var/list/buffer_slot = buffer[num] + if(istype(buffer_slot)) + diskette.name = "data disk \[[buffer_slot["label"]]\]" + diskette.fields = buffer_slot.Copy() + if("ejectdisk") + if(diskette) + diskette.loc = get_turf(src) + diskette = null + if("pulseui","pulsese") + if(num && viable_occupant && connected) + radduration = Wrap(radduration, 1, RADIATION_DURATION_MAX+1) + radstrength = Wrap(radstrength, 1, RADIATION_STRENGTH_MAX+1) - if (href_list["screen"]) // Passing a screen is only a request, we set current_screen here but it can be overridden below if necessary - src.current_screen = href_list["screen"] - - if (!src.current_screen) // If no screen is set default to mainmenu - src.current_screen = "mainmenu" - - if (!src.connected) //Is the scanner not connected? - src.scanner_status_html = "
Build a DNA Modifier adjacent to this computer and try again.
" - src.current_screen = null // blank does not exist in the switch below, so no screen will be outputted - href_list = new /list(0) //Clear out whatever button the user might have pressed - else - occupant = src.connected.occupant - viable_occupant = (occupant && occupant.dna && !(NOCLONE in occupant.mutations)) - human_occupant = src.connected.occupant - - if (!viable_occupant && src.connected) // If there is no viable occupant only allow certain screens - var/allowed_no_occupant_screens = list("mainmenu", "radsetmenu", "buffermenu") //These are the screens which will be allowed if there's no occupant - if (!(src.current_screen in allowed_no_occupant_screens)) - href_list = new /list(0) // clear list of options - src.current_screen = "mainmenu" - - if (href_list["locked"]) - if (src.connected.occupant) - src.connected.locked = !( src.connected.locked ) - //////////////////////////////////////////////////////// - if (href_list["genpulse"]) - if(!viable_occupant)//Makes sure someone is in there (And valid) before trying anything - src.temp_html = text("No viable occupant detected.")//More than anything, this just acts as a sanity check in case the option DOES appear for whatever reason - //usr << browse(temp_html, "window=scannernew;size=550x650") - //onclose(usr, "scannernew") - popup.set_content(src.temp_html) - popup.open() - else - - src.temp_html = text("Working ... Please wait ([] Seconds)", src.radduration) - popup.set_content(src.temp_html) - popup.open() - var/lock_state = src.connected.locked - src.connected.locked = 1//lock it - sleep(10*src.radduration) - if (!src.connected.occupant) - src.temp_html = null - return null - if (prob(95)) - if(prob(75)) - randmutb(src.connected.occupant) + var/locked_state = connected.locked + connected.locked = 1 + + current_screen = "working" + ShowInterface(usr) + + sleep(radduration*10) + current_screen = "mainmenu" + + if(viable_occupant && connected && connected.occupant==viable_occupant) + viable_occupant.radiation += RADIATION_IRRADIATION_MULTIPLIER*radduration*radstrength + switch(href_list["task"]) + if("pulseui") + var/len = length(viable_occupant.dna.uni_identity) + num = Wrap(num, 1, len+1) + num = randomize_radiation_accuracy(num, radduration, len) + + var/hex = copytext(viable_occupant.dna.uni_identity, num, num+1) + hex = scramble(hex, radstrength, radduration) + + viable_occupant.dna.uni_identity = copytext(viable_occupant.dna.uni_identity, 1, num) + hex + copytext(viable_occupant.dna.uni_identity, num+1, 0) + updateappearance(viable_occupant) + if("pulsese") + var/len = length(viable_occupant.dna.struc_enzymes) + num = Wrap(num, 1, len+1) + num = randomize_radiation_accuracy(num, radduration, len) + + var/hex = copytext(viable_occupant.dna.struc_enzymes, num, num+1) + hex = scramble(hex, radstrength, radduration) + + viable_occupant.dna.struc_enzymes = copytext(viable_occupant.dna.struc_enzymes, 1, num) + hex + copytext(viable_occupant.dna.struc_enzymes, num+1, 0) + domutcheck(viable_occupant, connected) else - randmuti(src.connected.occupant) - else - if(prob(95)) - randmutg(src.connected.occupant) - else - randmuti(src.connected.occupant) - src.connected.occupant.radiation += ((src.radstrength*3)+src.radduration*3) - src.connected.locked = lock_state - src.temp_html = null - dopage(src,"screen=radsetmenu") - if (href_list["radleplus"]) - if(!viable_occupant) - src.temp_html = text("No viable occupant detected.") - popup.set_content(src.temp_html) - popup.open() - if (src.radduration < 20) - src.radduration++ - src.radduration++ - dopage(src,"screen=radsetmenu") - if (href_list["radleminus"]) - if(!viable_occupant) - src.temp_html = text("No viable occupant detected.") - popup.set_content(src.temp_html) - popup.open() - if (src.radduration > 2) - src.radduration-- - src.radduration-- - dopage(src,"screen=radsetmenu") - if (href_list["radinplus"]) - if (src.radstrength < 10) - src.radstrength++ - dopage(src,"screen=radsetmenu") - if (href_list["radinminus"]) - if (src.radstrength > 1) - src.radstrength-- - dopage(src,"screen=radsetmenu") - //////////////////////////////////////////////////////// - if (href_list["unimenuplus"]) - if (src.uniblock < 13) - src.uniblock++ - else - src.uniblock = 1 - dopage(src,"screen=unimenu") - if (href_list["unimenuminus"]) - if (src.uniblock > 1) - src.uniblock-- - else - src.uniblock = 13 - dopage(src,"screen=unimenu") - if (href_list["unimenusubplus"]) - if (src.subblock < 3) - src.subblock++ - else - src.subblock = 1 - dopage(src,"screen=unimenu") - if (href_list["unimenusubminus"]) - if (src.subblock > 1) - src.subblock-- - else - src.subblock = 3 - dopage(src,"screen=unimenu") - if (href_list["unimenutargetplus"]) - if (src.unitarget < 15) - src.unitarget++ - src.unitargethex = src.unitarget - switch(unitarget) - if(10) - src.unitargethex = "A" - if(11) - src.unitargethex = "B" - if(12) - src.unitargethex = "C" - if(13) - src.unitargethex = "D" - if(14) - src.unitargethex = "E" - if(15) - src.unitargethex = "F" - else - src.unitarget = 0 - src.unitargethex = 0 - dopage(src,"screen=unimenu") - if (href_list["unimenutargetminus"]) - if (src.unitarget > 0) - src.unitarget-- - src.unitargethex = src.unitarget - switch(unitarget) - if(10) - src.unitargethex = "A" - if(11) - src.unitargethex = "B" - if(12) - src.unitargethex = "C" - if(13) - src.unitargethex = "D" - if(14) - src.unitargethex = "E" - else - src.unitarget = 15 - src.unitargethex = "F" - dopage(src,"screen=unimenu") - if (href_list["uimenuset"] && href_list["uimenusubset"]) // This chunk of code updates selected block / sub-block based on click - var/menuset = text2num(href_list["uimenuset"]) - var/menusubset = text2num(href_list["uimenusubset"]) - if ((menuset <= 13) && (menuset >= 1)) - src.uniblock = menuset - if ((menusubset <= 3) && (menusubset >= 1)) - src.subblock = menusubset - dopage(src, "unimenu") - if (href_list["unipulse"]) - if(src.connected.occupant) - var/block - var/newblock - var/tstructure2 - block = getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),src.subblock,1) + current_screen = "mainmenu" + + if(connected) + connected.locked = locked_state - src.temp_html = text("Working ... Please wait ([] Seconds)", src.radduration) - popup.set_content(src.temp_html) - popup.open() - var/lock_state = src.connected.locked - src.connected.locked = 1//lock it - sleep(10*src.radduration) - if (!src.connected.occupant) - src.temp_html = null - return null - /// - if (prob((80 + (src.radduration / 2)))) - block = miniscrambletarget(num2text(unitarget), src.radstrength, src.radduration) - newblock = null - if (src.subblock == 1) newblock = block + getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),2,1) + getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),3,1) - if (src.subblock == 2) newblock = getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),1,1) + block + getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),3,1) - if (src.subblock == 3) newblock = getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),1,1) + getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),2,1) + block - tstructure2 = setblock(src.connected.occupant.dna.uni_identity, src.uniblock, newblock,3) - src.connected.occupant.dna.uni_identity = tstructure2 - updateappearance(src.connected.occupant,src.connected.occupant.dna.uni_identity) - src.connected.occupant.radiation += (src.radstrength+src.radduration) - else - if (prob(20+src.radstrength)) - randmutb(src.connected.occupant) - domutcheck(src.connected.occupant,src.connected) - else - randmuti(src.connected.occupant) - updateappearance(src.connected.occupant,src.connected.occupant.dna.uni_identity) - src.connected.occupant.radiation += ((src.radstrength*2)+src.radduration) - src.connected.locked = lock_state - dopage(src,"screen=unimenu") + ShowInterface(usr) + - //////////////////////////////////////////////////////// - if (href_list["rejuv"]) - if(!viable_occupant) - src.temp_html = text("No viable occupant detected.") - popup.set_content(src.temp_html) - popup.open() - else - if(human_occupant) - if (human_occupant.reagents.get_reagent_amount("inaprovaline") < REJUVENATORS_MAX) - if (human_occupant.reagents.get_reagent_amount("inaprovaline") < (REJUVENATORS_MAX - REJUVENATORS_INJECT)) - human_occupant.reagents.add_reagent("inaprovaline", REJUVENATORS_INJECT) - else - human_occupant.reagents.add_reagent("inaprovaline", round(REJUVENATORS_MAX - human_occupant.reagents.get_reagent_amount("inaprovaline"))) - //usr << text("Occupant now has [] units of rejuvenation in his/her bloodstream.", human_occupant.reagents.get_reagent_amount("inaprovaline")) - - //////////////////////////////////////////////////////// - if (href_list["strucmenuplus"]) - if (src.strucblock < 14) - src.strucblock++ - else - src.strucblock = 1 - dopage(src,"screen=strucmenu") - if (href_list["strucmenuminus"]) - if (src.strucblock > 1) - src.strucblock-- - else - src.strucblock = 14 - dopage(src,"screen=strucmenu") - if (href_list["strucmenusubplus"]) - if (src.subblock < 3) - src.subblock++ - else - src.subblock = 1 - dopage(src,"screen=strucmenu") - if (href_list["strucmenusubminus"]) - if (src.subblock > 1) - src.subblock-- - else - src.subblock = 3 - dopage(src,"screen=strucmenu") - if (href_list["semenuset"] && href_list["semenusubset"]) // This chunk of code updates selected block / sub-block based on click (se stands for strutural enzymes) - var/menuset = text2num(href_list["semenuset"]) - var/menusubset = text2num(href_list["semenusubset"]) - if ((menuset <= 14) && (menuset >= 1)) - src.strucblock = menuset - if ((menusubset <= 3) && (menusubset >= 1)) - src.subblock = menusubset - dopage(src, "strucmenu") - if (href_list["strucpulse"]) - var/block - var/newblock - var/tstructure2 - var/oldblock - var/lock_state = src.connected.locked - src.connected.locked = 1//lock it - if (viable_occupant) - block = getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),src.subblock,1) - - src.temp_html = text("Working ... Please wait ([] Seconds)", src.radduration) - popup.set_content(src.temp_html) - popup.open() - sleep(10*src.radduration) - else - src.temp_html = null - return null - /// - if(viable_occupant) - if (prob((80 + (src.radduration / 2)))) - if ((src.strucblock != 2 || src.strucblock != 12 || src.strucblock != 8 || src.strucblock || 10) && prob (20)) - oldblock = src.strucblock - block = miniscramble(block, src.radstrength, src.radduration) - newblock = null - if (src.strucblock > 1 && src.strucblock < 5) - src.strucblock++ - else if (src.strucblock > 5 && src.strucblock < 14) - src.strucblock-- - if (src.subblock == 1) newblock = block + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),2,1) + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),3,1) - if (src.subblock == 2) newblock = getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),1,1) + block + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),3,1) - if (src.subblock == 3) newblock = getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),1,1) + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),2,1) + block - tstructure2 = setblock(src.connected.occupant.dna.struc_enzymes, src.strucblock, newblock,3) - src.connected.occupant.dna.struc_enzymes = tstructure2 - domutcheck(src.connected.occupant,src.connected) - src.connected.occupant.radiation += (src.radstrength+src.radduration) - src.strucblock = oldblock - else - // - block = miniscramble(block, src.radstrength, src.radduration) - newblock = null - if (src.subblock == 1) newblock = block + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),2,1) + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),3,1) - if (src.subblock == 2) newblock = getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),1,1) + block + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),3,1) - if (src.subblock == 3) newblock = getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),1,1) + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.strucblock,3),2,1) + block - tstructure2 = setblock(src.connected.occupant.dna.struc_enzymes, src.strucblock, newblock,3) - src.connected.occupant.dna.struc_enzymes = tstructure2 - domutcheck(src.connected.occupant,src.connected) - src.connected.occupant.radiation += (src.radstrength+src.radduration) - else - if (prob(80-src.radduration)) - randmutb(src.connected.occupant) - domutcheck(src.connected.occupant,src.connected) - else - randmuti(src.connected.occupant) - updateappearance(src.connected.occupant,src.connected.occupant.dna.uni_identity) - src.connected.occupant.radiation += ((src.radstrength*2)+src.radduration) - src.connected.locked = lock_state - /// - dopage(src,"screen=strucmenu") - - //////////////////////////////////////////////////////// - if (href_list["b1addui"]) - if(src.connected.occupant && src.connected.occupant.dna) - src.buffer1iue = 0 - src.buffer1 = src.connected.occupant.dna.uni_identity - if (!istype(src.connected.occupant,/mob/living/carbon/human)) - src.buffer1owner = src.connected.occupant.name - else - src.buffer1owner = src.connected.occupant.real_name - src.buffer1label = "Unique Identifier" - src.buffer1type = "ui" - dopage(src,"screen=buffermenu") - if (href_list["b1adduiue"]) - if(src.connected.occupant && src.connected.occupant.dna) - src.buffer1 = src.connected.occupant.dna.uni_identity - if (!istype(src.connected.occupant,/mob/living/carbon/human)) - src.buffer1owner = src.connected.occupant.name - else - src.buffer1owner = src.connected.occupant.real_name - src.buffer1label = "Unique Identifier & Unique Enzymes" - src.buffer1type = "ui" - src.buffer1iue = 1 - dopage(src,"screen=buffermenu") - if (href_list["b2adduiue"]) - if(src.connected.occupant && src.connected.occupant.dna) - src.buffer2 = src.connected.occupant.dna.uni_identity - if (!istype(src.connected.occupant,/mob/living/carbon/human)) - src.buffer2owner = src.connected.occupant.name - else - src.buffer2owner = src.connected.occupant.real_name - src.buffer2label = "Unique Identifier & Unique Enzymes" - src.buffer2type = "ui" - src.buffer2iue = 1 - dopage(src,"screen=buffermenu") - if (href_list["b3adduiue"]) - if(src.connected.occupant && src.connected.occupant.dna) - src.buffer3 = src.connected.occupant.dna.uni_identity - if (!istype(src.connected.occupant,/mob/living/carbon/human)) - src.buffer3owner = src.connected.occupant.name - else - src.buffer3owner = src.connected.occupant.real_name - src.buffer3label = "Unique Identifier & Unique Enzymes" - src.buffer3type = "ui" - src.buffer3iue = 1 - dopage(src,"screen=buffermenu") - if (href_list["b2addui"]) - if(src.connected.occupant && src.connected.occupant.dna) - src.buffer2iue = 0 - src.buffer2 = src.connected.occupant.dna.uni_identity - if (!istype(src.connected.occupant,/mob/living/carbon/human)) - src.buffer2owner = src.connected.occupant.name - else - src.buffer2owner = src.connected.occupant.real_name - src.buffer2label = "Unique Identifier" - src.buffer2type = "ui" - dopage(src,"screen=buffermenu") - if (href_list["b3addui"]) - if(src.connected.occupant && src.connected.occupant.dna) - src.buffer3iue = 0 - src.buffer3 = src.connected.occupant.dna.uni_identity - if (!istype(src.connected.occupant,/mob/living/carbon/human)) - src.buffer3owner = src.connected.occupant.name - else - src.buffer3owner = src.connected.occupant.real_name - src.buffer3label = "Unique Identifier" - src.buffer3type = "ui" - dopage(src,"screen=buffermenu") - if (href_list["b1addse"]) - if(src.connected.occupant && src.connected.occupant.dna) - src.buffer1iue = 0 - src.buffer1 = src.connected.occupant.dna.struc_enzymes - if (!istype(src.connected.occupant,/mob/living/carbon/human)) - src.buffer1owner = src.connected.occupant.name - else - src.buffer1owner = src.connected.occupant.real_name - src.buffer1label = "Structural Enzymes" - src.buffer1type = "se" - dopage(src,"screen=buffermenu") - if (href_list["b2addse"]) - if(src.connected.occupant && src.connected.occupant.dna) - src.buffer2iue = 0 - src.buffer2 = src.connected.occupant.dna.struc_enzymes - if (!istype(src.connected.occupant,/mob/living/carbon/human)) - src.buffer2owner = src.connected.occupant.name - else - src.buffer2owner = src.connected.occupant.real_name - src.buffer2label = "Structural Enzymes" - src.buffer2type = "se" - dopage(src,"screen=buffermenu") - if (href_list["b3addse"]) - if(src.connected.occupant && src.connected.occupant.dna) - src.buffer3iue = 0 - src.buffer3 = src.connected.occupant.dna.struc_enzymes - if (!istype(src.connected.occupant,/mob/living/carbon/human)) - src.buffer3owner = src.connected.occupant.name - else - src.buffer3owner = src.connected.occupant.real_name - src.buffer3label = "Structural Enzymes" - src.buffer3type = "se" - dopage(src,"screen=buffermenu") - if (href_list["b1clear"]) - src.buffer1 = null - src.buffer1owner = null - src.buffer1label = null - src.buffer1iue = null - dopage(src,"screen=buffermenu") - if (href_list["b2clear"]) - src.buffer2 = null - src.buffer2owner = null - src.buffer2label = null - src.buffer2iue = null - dopage(src,"screen=buffermenu") - if (href_list["b3clear"]) - src.buffer3 = null - src.buffer3owner = null - src.buffer3label = null - src.buffer3iue = null - dopage(src,"screen=buffermenu") - if (href_list["b1label"]) - src.buffer1label = sanitize(input("New Label:","Edit Label","Infos here")) - dopage(src,"screen=buffermenu") - if (href_list["b2label"]) - src.buffer2label = sanitize(input("New Label:","Edit Label","Infos here")) - dopage(src,"screen=buffermenu") - if (href_list["b3label"]) - src.buffer3label = sanitize(input("New Label:","Edit Label","Infos here")) - dopage(src,"screen=buffermenu") - if (href_list["b1transfer"]) - if (!src.connected.occupant || (NOCLONE in src.connected.occupant.mutations) || !src.connected.occupant.dna) - return - if (src.buffer1type == "ui") - if (src.buffer1iue) - src.connected.occupant.real_name = src.buffer1owner - src.connected.occupant.name = src.buffer1owner - src.connected.occupant.dna.uni_identity = src.buffer1 - updateappearance(src.connected.occupant,src.connected.occupant.dna.uni_identity) - else if (src.buffer1type == "se") - src.connected.occupant.dna.struc_enzymes = src.buffer1 - domutcheck(src.connected.occupant,src.connected) - src.temp_html = "Transfered." - src.connected.occupant.radiation += rand(20,50) - - if (href_list["b2transfer"]) - if (!src.connected.occupant || (NOCLONE in src.connected.occupant.mutations) || !src.connected.occupant.dna) - return - if (src.buffer2type == "ui") - if (src.buffer2iue) - src.connected.occupant.real_name = src.buffer2owner - src.connected.occupant.name = src.buffer2owner - src.connected.occupant.dna.uni_identity = src.buffer2 - updateappearance(src.connected.occupant,src.connected.occupant.dna.uni_identity) - else if (src.buffer2type == "se") - src.connected.occupant.dna.struc_enzymes = src.buffer2 - domutcheck(src.connected.occupant,src.connected) - src.temp_html = "Transfered." - src.connected.occupant.radiation += rand(20,50) - - if (href_list["b3transfer"]) - if (!src.connected.occupant || (NOCLONE in src.connected.occupant.mutations) || !src.connected.occupant.dna) - return - if (src.buffer3type == "ui") - if (src.buffer3iue) - src.connected.occupant.real_name = src.buffer3owner - src.connected.occupant.name = src.buffer3owner - src.connected.occupant.dna.uni_identity = src.buffer3 - updateappearance(src.connected.occupant,src.connected.occupant.dna.uni_identity) - else if (src.buffer3type == "se") - src.connected.occupant.dna.struc_enzymes = src.buffer3 - domutcheck(src.connected.occupant,src.connected) - src.temp_html = "Transfered." - src.connected.occupant.radiation += rand(20,50) - - if (href_list["b1injector"]) - if (src.injectorready) - var/obj/item/weapon/dnainjector/I = new /obj/item/weapon/dnainjector - I.dna = src.buffer1 - I.dnatype = src.buffer1type - I.loc = src.loc - I.name += " ([src.buffer1label])" - if (src.buffer1iue) I.ue = src.buffer1owner //lazy haw haw - src.temp_html = "Injector created." - - src.injectorready = 0 - spawn(300) - src.injectorready = 1 - else - src.temp_html = "Replicator not ready yet." - - if (href_list["b2injector"]) - if (src.injectorready) - var/obj/item/weapon/dnainjector/I = new /obj/item/weapon/dnainjector - I.dna = src.buffer2 - I.dnatype = src.buffer2type - I.loc = src.loc - I.name += " ([src.buffer2label])" - if (src.buffer2iue) I.ue = src.buffer2owner //lazy haw haw - src.temp_html = "Injector created." - - src.injectorready = 0 - spawn(300) - src.injectorready = 1 - else - src.temp_html = "Replicator not ready yet." - - if (href_list["b3injector"]) - if (src.injectorready) - var/obj/item/weapon/dnainjector/I = new /obj/item/weapon/dnainjector - I.dna = src.buffer3 - I.dnatype = src.buffer3type - I.loc = src.loc - I.name += " ([src.buffer3label])" - if (src.buffer3iue) I.ue = src.buffer3owner //lazy haw haw - src.temp_html = "Injector created." - - src.injectorready = 0 - spawn(300) - src.injectorready = 1 - else - src.temp_html = "Replicator not ready yet." - - //////////////////////////////////////////////////////// - if (href_list["load_disk"]) - var/buffernum = text2num(href_list["load_disk"]) - if ((buffernum > 3) || (buffernum < 1)) - return - if ((isnull(src.diskette)) || (!src.diskette.data) || (src.diskette.data == "")) - return - switch(buffernum) - if(1) - src.buffer1 = src.diskette.data - src.buffer1type = src.diskette.data_type - src.buffer1iue = src.diskette.ue - src.buffer1owner = src.diskette.owner - if(2) - src.buffer2 = src.diskette.data - src.buffer2type = src.diskette.data_type - src.buffer2iue = src.diskette.ue - src.buffer2owner = src.diskette.owner - if(3) - src.buffer3 = src.diskette.data - src.buffer3type = src.diskette.data_type - src.buffer3iue = src.diskette.ue - src.buffer3owner = src.diskette.owner - src.temp_html = "Data loaded." - - if (href_list["save_disk"]) - var/buffernum = text2num(href_list["save_disk"]) - if ((buffernum > 3) || (buffernum < 1)) - return - if ((isnull(src.diskette)) || (src.diskette.read_only)) - return - switch(buffernum) - if(1) - src.diskette.data = buffer1 - src.diskette.data_type = src.buffer1type - src.diskette.ue = src.buffer1iue - src.diskette.owner = src.buffer1owner - src.diskette.name = "data disk - '[src.buffer1owner]'" - if(2) - src.diskette.data = buffer2 - src.diskette.data_type = src.buffer2type - src.diskette.ue = src.buffer2iue - src.diskette.owner = src.buffer2owner - src.diskette.name = "data disk - '[src.buffer2owner]'" - if(3) - src.diskette.data = buffer3 - src.diskette.data_type = src.buffer3type - src.diskette.ue = src.buffer3iue - src.diskette.owner = src.buffer3owner - src.diskette.name = "data disk - '[src.buffer3owner]'" - src.temp_html = "Data saved." - if (href_list["eject_disk"]) - if (!src.diskette) - return - src.diskette.loc = get_turf(src) - src.diskette = null - //////////////////////////////////////////////////////// - - src.temp_html = temp_header_html - switch(src.current_screen) - if ("mainmenu") - src.temp_html += "

Main Menu

" - if (viable_occupant) //is there REALLY someone in there who can be modified? - src.temp_html += text("Modify Unique Identifier
", src) - src.temp_html += text("Modify Structural Enzymes

", src) - else - src.temp_html += "Modify Unique Identifier
" - src.temp_html += "Modify Structural Enzymes

" - src.temp_html += text("Radiation Emitter Settings

", src) - src.temp_html += text("Transfer Buffer

", src) - - if ("unimenu") - if(!viable_occupant) - src.temp_html = text("No viable occupant detected.") - popup.set_content(src.temp_html) - popup.open() - else - src.temp_html = "<< Main Menu
" - src.temp_html += "

Modify Unique Identifier

" - src.temp_html += "
Unique Identifier:
[getblockstring(src.connected.occupant.dna.uni_identity,uniblock,subblock,3, src,1)]

" - src.temp_html += "Selected Block: <- [src.uniblock] ->

" - src.temp_html += "Selected Sub-Block: <- [src.subblock] ->

" - src.temp_html += "Selected Target: <- [src.unitargethex] ->

" - src.temp_html += "Modify Block
" - src.temp_html += "Irradiate
" - - if ("strucmenu") - if(!viable_occupant) - src.temp_html = text("No viable occupant detected.") - popup.set_content(src.temp_html) - popup.open() - else - src.temp_html = "<< Main Menu
" - src.temp_html += "

Modify Structural Enzymes

" - src.temp_html += "
Structural Enzymes: [getblockstring(src.connected.occupant.dna.struc_enzymes,strucblock,subblock,3,src,0)]

" - src.temp_html += "Selected Block: <- [src.strucblock] ->

" - src.temp_html += "Selected Sub-Block: <- [src.subblock] ->

" - src.temp_html += "Modify Block
" - src.temp_html += "Irradiate
" - - if ("radsetmenu") - src.temp_html = "<< Main Menu
" - src.temp_html += "

Radiation Emitter Settings

" - if (viable_occupant) - src.temp_html += text("Pulse Radiation", src) - else - src.temp_html += "Pulse Radiation" - src.temp_html += "

Radiation Duration: - [src.radduration] +
" - src.temp_html += "Radiation Intensity: - [src.radstrength] +

" - - if ("buffermenu") - src.temp_html = "<< Main Menu
" - src.temp_html += "

Transfer Buffer

" - src.temp_html += "

Buffer 1:

" - if (!(src.buffer1)) - src.temp_html += "Buffer Empty
" - else - src.temp_html += text("Data: []
", src.buffer1) - src.temp_html += text("By: []
", src.buffer1owner) - src.temp_html += text("Label: []
", src.buffer1label) - if (viable_occupant) src.temp_html += text("Save : UI - UI+UE - SE
", src, src, src) - if (src.buffer1) src.temp_html += text("Transfer to: Occupant - Injector
", src, src) - //if (src.buffer1) src.temp_html += text("Isolate Block
", src) - if (src.buffer1) src.temp_html += "Disk: Save To | Load From
" - if (src.buffer1) src.temp_html += text("Edit Label
", src) - if (src.buffer1) src.temp_html += text("Clear Buffer

", src) - if (!src.buffer1) src.temp_html += "
" - src.temp_html += "

Buffer 2:

" - if (!(src.buffer2)) - src.temp_html += "Buffer Empty
" - else - src.temp_html += text("Data: []
", src.buffer2) - src.temp_html += text("By: []
", src.buffer2owner) - src.temp_html += text("Label: []
", src.buffer2label) - if (viable_occupant) src.temp_html += text("Save : UI - UI+UE - SE
", src, src, src) - if (src.buffer2) src.temp_html += text("Transfer to: Occupant - Injector
", src, src) - //if (src.buffer2) src.temp_html += text("Isolate Block
", src) - if (src.buffer2) src.temp_html += "Disk: Save To | Load From
" - if (src.buffer2) src.temp_html += text("Edit Label
", src) - if (src.buffer2) src.temp_html += text("Clear Buffer

", src) - if (!src.buffer2) src.temp_html += "
" - src.temp_html += "

Buffer 3:

" - if (!(src.buffer3)) - src.temp_html += "Buffer Empty
" - else - src.temp_html += text("Data: []
", src.buffer3) - src.temp_html += text("By: []
", src.buffer3owner) - src.temp_html += text("Label: []
", src.buffer3label) - if (viable_occupant) src.temp_html += text("Save : UI - UI+UE - SE
", src, src, src) - if (src.buffer3) src.temp_html += text("Transfer to: Occupant - Injector
", src, src) - //if (src.buffer3) src.temp_html += text("Isolate Block
", src) - if (src.buffer3) src.temp_html += "Disk: Save To | Load From
" - if (src.buffer3) src.temp_html += text("Edit Label
", src) - if (src.buffer3) src.temp_html += text("Clear Buffer

", src) - if (!src.buffer3) src.temp_html += "
" - src.temp_html += temp_footer_html - - if(viable_occupant && !src.scanner_status_html && occupant) //is there REALLY someone in there? - src.scanner_status_html = "
Health:
[occupant.health]%
" - src.scanner_status_html += "
Radiation Level:
[occupant.radiation]%
" - if(human_occupant) - var/rejuvenators = round(human_occupant.reagents.get_reagent_amount("inaprovaline") / REJUVENATORS_MAX * 100) - src.scanner_status_html += "
Rejuvenators:
[human_occupant.reagents.get_reagent_amount("inaprovaline")] units
" - - if (src.current_screen == "mainmenu") - src.scanner_status_html += "
Unique Enzymes :
[uppertext(occupant.dna.unique_enzymes)]
" - src.scanner_status_html += "
Unique Identifier:
[occupant.dna.uni_identity]
" - src.scanner_status_html += "
Structural Enzymes:
[occupant.dna.struc_enzymes]
" - - var/dat = "

Scanner Status

" - - dat += "Scan " - - var/occupant_status = "Scanner Unoccupied" - if(!src.connected) - occupant_status = "No Scanner Detected!" - if(occupant && occupant.dna) //is there REALLY someone in there? - if (!istype(occupant,/mob/living/carbon/human)) //Why is this here? - sleep(1) - if(NOCLONE in occupant.mutations) - occupant_status = "Invalid DNA structure" - else - switch(occupant.stat) // obvious, see what their status is - if(0) - occupant_status = "Conscious" - if(1) - occupant_status = "Unconscious" - else - occupant_status = "DEAD" - - occupant_status = "[occupant.name] => [occupant_status]
" - - dat += "
[occupant_status][src.scanner_status_html]
" - - var/scanner_access_text = "Lock Scanner" - if (src.connected && src.connected.locked) - scanner_access_text = "Unlock Scanner" - if (occupant && occupant.dna) - dat += "[scanner_access_text] " - if (human_occupant) - dat += "Inject Rejuvenators
" - else - dat += "Inject Rejuvenators
" - else - dat += "[scanner_access_text] " - dat += "Inject Rejuvenators
" - - if (!isnull(src.diskette)) - dat += text("Eject Disk
", src) - - dat += "
" - - if (src.temp_html) - dat += src.temp_html - - popup.set_content(dat) - popup.open() /////////////////////////// DNA MACHINES - +#undef INJECTOR_TIMEOUT #undef REJUVENATORS_INJECT -#undef REJUVENATORS_MAX \ No newline at end of file +#undef REJUVENATORS_MAX +#undef NUMBER_OF_BUFFERS + +#undef RADIATION_STRENGTH_MAX +#undef RADIATION_STRENGTH_MULTIPLIER +#undef RADIATION_STRENGTH_BIAS + +#undef RADIATION_DURATION_MAX +#undef RADIATION_ACCURACY_MULTIPLIER +#undef RADIATION_ACCURACY_BIAS + +#undef RADIATION_IRRADIATION_MULTIPLIER + +//#undef BAD_MUTATION_DIFFICULTY +//#undef GOOD_MUTATION_DIFFICULTY +//#undef OP_MUTATION_DIFFICULTY + +//value in range 1 to values. values must be greater than 0 +//all arguments assumed to be positive integers +proc/construct_block(value, values, blocksize=DNA_BLOCK_SIZE) + var/width = round((16**blocksize)/values) + if(value < 1) + value = 1 + value = (value * width) - rand(1,width) + return num2hex(value, blocksize) + +//value is hex +proc/deconstruct_block(value, values, blocksize=DNA_BLOCK_SIZE) + var/width = round((16**blocksize)/values) + value = round(hex2num(value) / width) + 1 + if(value > values) + value = values + return value \ No newline at end of file diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index b988cf24470..30cc32c2d86 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -67,7 +67,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" /datum/game_mode/changeling/post_setup() for(var/datum/mind/changeling in changelings) - grant_changeling_powers(changeling.current) + changeling.current.make_changeling() changeling.special_role = "Changeling" forge_changeling_objectives(changeling) greet_changeling(changeling) @@ -152,10 +152,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" return ..() return 0*/ -/datum/game_mode/proc/grant_changeling_powers(mob/living/carbon/changeling_mob) - if(!istype(changeling_mob)) return - changeling_mob.make_changeling() - /datum/game_mode/proc/auto_declare_completion_changeling() if(changelings.len) var/text = "The changelings were:" diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index 3e05162af07..b4901597126 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -2,13 +2,14 @@ /mob/proc/make_changeling() if(!mind) return if(!mind.changeling) mind.changeling = new /datum/changeling(gender) + if(!iscarbon(src)) return + verbs += /datum/changeling/proc/EvolutionMenu var/lesser_form = !ishuman(src) - if(!powerinstances.len) - for(var/P in powers) - powerinstances += new P() + if(!powerinstances) + powerinstances = init_subtypes(/datum/power/changeling) // Code to auto-purchase free powers. for(var/datum/power/changeling/P in powerinstances) @@ -19,30 +20,27 @@ for(var/datum/power/changeling/P in mind.changeling.purchasedpowers) if(P.isVerb) if(lesser_form && !P.allowduringlesserform) continue - if(!(P in src.verbs)) - src.verbs += P.verbpath + verbs += P.verbpath //byond won't allow two of the same verb to be added to the verbs list. No additional checks necessary - mind.changeling.absorbed_dna |= dna + var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste + mind.changeling.absorbed_dna |= C.dna return 1 //removes our changeling verbs /mob/proc/remove_changeling_powers() - if(!mind || !mind.changeling) return - for(var/datum/power/changeling/P in mind.changeling.purchasedpowers) + for(var/datum/power/changeling/P in powerinstances) if(P.isVerb) verbs -= P.verbpath //Helper proc. Does all the checks and stuff for us to avoid copypasta +//includes a check to see if we're a carbon mob. This means that you can't use powers (even with the verbs) unless you're a carbon-based mob. /mob/proc/changeling_power(var/required_chems=0, var/required_dna=0, var/max_genetic_damage=100, var/max_stat=0) - if(!src.mind) return if(!iscarbon(src)) return var/datum/changeling/changeling = src.mind.changeling - if(!changeling) - world.log << "[src] has the changeling_transform() verb but is not a changeling." - return + if(!changeling) return if(src.stat > max_stat) src << "We are incapacitated." @@ -65,10 +63,10 @@ //Absorbs the victim's DNA making them uncloneable. Requires a strong grip on the victim. //Doesn't cost anything as it's the most basic ability. -/mob/proc/changeling_absorb_dna() +/mob/living/carbon/proc/changeling_absorb_dna() set category = "Changeling" set name = "Absorb DNA" - + var/datum/changeling/changeling = changeling_power(0,0,100) if(!changeling) return @@ -143,7 +141,7 @@ if(!Tp.isVerb) call(Tp.verbpath)() else - src.make_changeling() + make_changeling() changeling.chem_charges += T.mind.changeling.chem_charges changeling.geneticpoints += T.mind.changeling.geneticpoints @@ -160,7 +158,7 @@ //Change our DNA to that of somebody we've absorbed. -/mob/proc/changeling_transform() +/mob/living/carbon/proc/changeling_transform() set category = "Changeling" set name = "Transform (5)" @@ -183,43 +181,42 @@ changeling.geneticdamage = 30 src.dna = chosen_dna src.real_name = chosen_dna.real_name - updateappearance(src, src.dna.uni_identity) + updateappearance(src) domutcheck(src, null) - src.verbs -= /mob/proc/changeling_transform - spawn(10) src.verbs += /mob/proc/changeling_transform + src.verbs -= /mob/living/carbon/proc/changeling_transform + spawn(10) src.verbs += /mob/living/carbon/proc/changeling_transform feedback_add_details("changeling_powers","TR") return 1 //Transform into a monkey. -/mob/proc/changeling_lesser_form() +/mob/living/carbon/proc/changeling_lesser_form() set category = "Changeling" set name = "Lesser Form (1)" var/datum/changeling/changeling = changeling_power(1,0,0) if(!changeling) return - var/mob/living/carbon/C = src changeling.chem_charges-- - C.remove_changeling_powers() - C.visible_message("[C] transforms!") + remove_changeling_powers() + visible_message("[src] transforms!") changeling.geneticdamage = 30 - C << "Our genes cry out!" + src << "Our genes cry out!" //TODO replace with monkeyize proc var/list/implants = list() //Try to preserve implants. - for(var/obj/item/weapon/implant/W in C) + for(var/obj/item/weapon/implant/W in src) implants += W - C.monkeyizing = 1 - C.canmove = 0 - C.icon = null - C.overlays.Cut() - C.invisibility = 101 + monkeyizing = 1 + canmove = 0 + icon = null + overlays.Cut() + invisibility = 101 - var/atom/movable/overlay/animation = new /atom/movable/overlay( C.loc ) + var/atom/movable/overlay/animation = new /atom/movable/overlay( loc ) animation.icon_state = "blank" animation.icon = 'icons/mob/mob.dmi' animation.master = src @@ -228,37 +225,37 @@ del(animation) var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey(src) - O.dna = C.dna - C.dna = null + O.dna = dna + dna = null - for(var/obj/item/W in C) - C.drop_from_inventory(W) - for(var/obj/T in C) + for(var/obj/item/W in src) + drop_from_inventory(W) + for(var/obj/T in src) del(T) - O.loc = C.loc - O.name = "monkey ([copytext(md5(C.real_name), 2, 6)])" - O.setToxLoss(C.getToxLoss()) - O.adjustBruteLoss(C.getBruteLoss()) - O.setOxyLoss(C.getOxyLoss()) - O.adjustFireLoss(C.getFireLoss()) - O.stat = C.stat + O.loc = loc + O.name = "monkey ([copytext(md5(real_name), 2, 6)])" + O.setToxLoss(getToxLoss()) + O.adjustBruteLoss(getBruteLoss()) + O.setOxyLoss(getOxyLoss()) + O.adjustFireLoss(getFireLoss()) + O.stat = stat O.a_intent = "harm" for(var/obj/item/weapon/implant/I in implants) I.loc = O I.implanted = O - C.mind.transfer_to(O) + mind.transfer_to(O) O.make_changeling(1) - O.verbs += /mob/proc/changeling_lesser_transform + O.verbs += /mob/living/carbon/proc/changeling_lesser_transform feedback_add_details("changeling_powers","LF") - del(C) + del(src) return 1 //Transform into a human -/mob/proc/changeling_lesser_transform() +/mob/living/carbon/proc/changeling_lesser_transform() set category = "Changeling" set name = "Transform (1)" @@ -276,23 +273,21 @@ if(!chosen_dna) return - var/mob/living/carbon/C = src - changeling.chem_charges-- - C.remove_changeling_powers() - C.visible_message("[C] transforms!") - C.dna = chosen_dna + remove_changeling_powers() + visible_message("[src] transforms!") + dna = chosen_dna var/list/implants = list() - for (var/obj/item/weapon/implant/I in C) //Still preserving implants + for (var/obj/item/weapon/implant/I in src) //Still preserving implants implants += I - C.monkeyizing = 1 - C.canmove = 0 - C.icon = null - C.overlays.Cut() - C.invisibility = 101 - var/atom/movable/overlay/animation = new /atom/movable/overlay( C.loc ) + monkeyizing = 1 + canmove = 0 + icon = null + overlays.Cut() + invisibility = 101 + var/atom/movable/overlay/animation = new /atom/movable/overlay( loc ) animation.icon_state = "blank" animation.icon = 'icons/mob/mob.dmi' animation.master = src @@ -301,96 +296,92 @@ del(animation) for(var/obj/item/W in src) - C.u_equip(W) - if (C.client) - C.client.screen -= W + u_equip(W) + if (client) + client.screen -= W if (W) - W.loc = C.loc - W.dropped(C) + W.loc = loc + W.dropped(src) W.layer = initial(W.layer) var/mob/living/carbon/human/O = new /mob/living/carbon/human( src ) - if (isblockon(getblock(C.dna.uni_identity, 11,3),11)) - O.gender = FEMALE - else - O.gender = MALE - O.dna = C.dna - C.dna = null + O.gender = (deconstruct_block(getblock(dna.uni_identity, DNA_GENDER_BLOCK), 2)-1) ? MALE : FEMALE + O.dna = dna + dna = null O.real_name = chosen_dna.real_name - for(var/obj/T in C) + for(var/obj/T in src) del(T) - O.loc = C.loc + O.loc = loc - updateappearance(O,O.dna.uni_identity) + updateappearance(O) domutcheck(O, null) - O.setToxLoss(C.getToxLoss()) - O.adjustBruteLoss(C.getBruteLoss()) - O.setOxyLoss(C.getOxyLoss()) - O.adjustFireLoss(C.getFireLoss()) - O.stat = C.stat + O.setToxLoss(getToxLoss()) + O.adjustBruteLoss(getBruteLoss()) + O.setOxyLoss(getOxyLoss()) + O.adjustFireLoss(getFireLoss()) + O.stat = stat for (var/obj/item/weapon/implant/I in implants) I.loc = O I.implanted = O - C.mind.transfer_to(O) + mind.transfer_to(O) O.make_changeling() feedback_add_details("changeling_powers","LFT") - del(C) + del(src) return 1 //Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay. -/mob/proc/changeling_fakedeath() +/mob/living/carbon/proc/changeling_fakedeath() set category = "Changeling" set name = "Regenerative Stasis (20)" - + var/datum/changeling/changeling = changeling_power(20,1,100,DEAD) if(!changeling) return - var/mob/living/carbon/C = src - if(!C.stat && alert("Are we sure we wish to fake our death?",,"Yes","No") == "No")//Confirmation for living changelings if they want to fake their death + if(!stat && alert("Are we sure we wish to fake our death?",,"Yes","No") == "No")//Confirmation for living changelings if they want to fake their death return - C << "We will attempt to regenerate our form." + src << "We will attempt to regenerate our form." - C.status_flags |= FAKEDEATH //play dead - C.update_canmove() - C.remove_changeling_powers() + status_flags |= FAKEDEATH //play dead + update_canmove() + remove_changeling_powers() - C.emote("gasp") - C.tod = worldtime2text() + emote("gasp") + tod = worldtime2text() spawn(rand(800,2000)) if(changeling_power(20,1,100,DEAD)) changeling.chem_charges -= 20 - if(C.stat == DEAD) - dead_mob_list -= C - living_mob_list += C - C.stat = CONSCIOUS - C.tod = null - C.setToxLoss(0) - C.setOxyLoss(0) - C.setCloneLoss(0) - C.SetParalysis(0) - C.SetStunned(0) - C.SetWeakened(0) - C.radiation = 0 - C.heal_overall_damage(C.getBruteLoss(), C.getFireLoss()) - C.reagents.clear_reagents() - C << "We have regenerated." - C.visible_message("[src] appears to wake from the dead, having healed all wounds.") + if(stat == DEAD) + dead_mob_list -= src + living_mob_list += src + stat = CONSCIOUS + tod = null + setToxLoss(0) + setOxyLoss(0) + setCloneLoss(0) + SetParalysis(0) + SetStunned(0) + SetWeakened(0) + radiation = 0 + heal_overall_damage(getBruteLoss(), getFireLoss()) + reagents.clear_reagents() + src << "We have regenerated." + visible_message("[src] appears to wake from the dead, having healed all wounds.") - C.status_flags &= ~(FAKEDEATH) - C.update_canmove() - C.make_changeling() + status_flags &= ~(FAKEDEATH) + update_canmove() + make_changeling() feedback_add_details("changeling_powers","FD") return 1 //Boosts the range of your next sting attack by 1 -/mob/proc/changeling_boost_range() +/mob/living/carbon/proc/changeling_boost_range() set category = "Changeling" set name = "Ranged Sting (10)" set desc="Your next sting ability can be used against targets 2 squares away." @@ -400,14 +391,14 @@ changeling.chem_charges -= 10 src << "Your throat adjusts to launch the sting." changeling.sting_range = 2 - src.verbs -= /mob/proc/changeling_boost_range - spawn(5) src.verbs += /mob/proc/changeling_boost_range + src.verbs -= /mob/living/carbon/proc/changeling_boost_range + spawn(5) src.verbs += /mob/living/carbon/proc/changeling_boost_range feedback_add_details("changeling_powers","RS") return 1 //Recover from stuns. -/mob/proc/changeling_unstun() +/mob/living/carbon/proc/changeling_unstun() set category = "Changeling" set name = "Epinephrine Sacs (45)" set desc = "Removes all stuns" @@ -416,16 +407,15 @@ if(!changeling) return 0 changeling.chem_charges -= 45 - var/mob/living/carbon/human/C = src - C.stat = 0 - C.SetParalysis(0) - C.SetStunned(0) - C.SetWeakened(0) - C.lying = 0 - C.update_canmove() + stat = 0 + SetParalysis(0) + SetStunned(0) + SetWeakened(0) + lying = 0 + update_canmove() - src.verbs -= /mob/proc/changeling_unstun - spawn(5) src.verbs += /mob/proc/changeling_unstun + src.verbs -= /mob/living/carbon/proc/changeling_unstun + spawn(5) src.verbs += /mob/living/carbon/proc/changeling_unstun feedback_add_details("changeling_powers","UNS") return 1 @@ -442,7 +432,7 @@ //Prevents AIs tracking you but makes you easily detectable to the human-eye. -/mob/proc/changeling_digitalcamo() +/mob/living/carbon/proc/changeling_digitalcamo() set category = "Changeling" set name = "Toggle Digital Camoflague" set desc = "The AI can no longer track us, but we will look different if examined. Has a constant cost while active." @@ -450,24 +440,23 @@ var/datum/changeling/changeling = changeling_power() if(!changeling) return 0 - var/mob/living/carbon/human/C = src - if(C.digitalcamo) C << "We return to normal." - else C << "We distort our form to prevent AI-tracking." - C.digitalcamo = !C.digitalcamo + if(digitalcamo) src << "We return to normal." + else src << "We distort our form to prevent AI-tracking." + digitalcamo = !digitalcamo spawn(0) - while(C && C.digitalcamo && C.mind && C.mind.changeling) - C.mind.changeling.chem_charges = max(C.mind.changeling.chem_charges - 1, 0) + while(src && digitalcamo && mind && mind.changeling) + mind.changeling.chem_charges = max(mind.changeling.chem_charges - 1, 0) sleep(40) - src.verbs -= /mob/proc/changeling_digitalcamo - spawn(5) src.verbs += /mob/proc/changeling_digitalcamo + src.verbs -= /mob/living/carbon/proc/changeling_digitalcamo + spawn(5) src.verbs += /mob/living/carbon/proc/changeling_digitalcamo feedback_add_details("changeling_powers","CAM") return 1 //Starts healing you every second for 10 seconds. Can be used whilst unconscious. -/mob/proc/changeling_rapidregen() +/mob/living/carbon/proc/changeling_rapidregen() set category = "Changeling" set name = "Rapid Regeneration (30)" set desc = "Begins rapidly regenerating. Does not effect stuns or chemicals." @@ -476,18 +465,16 @@ if(!changeling) return 0 src.mind.changeling.chem_charges -= 30 - var/mob/living/carbon/human/C = src spawn(0) for(var/i = 0, i<10,i++) - if(C) - C.adjustBruteLoss(-10) - C.adjustToxLoss(-10) - C.adjustOxyLoss(-10) - C.adjustFireLoss(-10) - sleep(10) + adjustBruteLoss(-10) + adjustToxLoss(-10) + adjustOxyLoss(-10) + adjustFireLoss(-10) + sleep(10) - src.verbs -= /mob/proc/changeling_rapidregen - spawn(5) src.verbs += /mob/proc/changeling_rapidregen + src.verbs -= /mob/living/carbon/proc/changeling_rapidregen + spawn(5) src.verbs += /mob/living/carbon/proc/changeling_rapidregen feedback_add_details("changeling_powers","RR") return 1 @@ -495,7 +482,7 @@ var/list/datum/dna/hivemind_bank = list() -/mob/proc/changeling_hiveupload() +/mob/living/carbon/proc/changeling_hiveupload() set category = "Changeling" set name = "Hive Channel (10)" set desc = "Allows you to channel DNA in the airwaves to allow other changelings to absorb it." @@ -525,7 +512,7 @@ var/list/datum/dna/hivemind_bank = list() feedback_add_details("changeling_powers","HU") return 1 -/mob/proc/changeling_hivedownload() +/mob/living/carbon/proc/changeling_hivedownload() set category = "Changeling" set name = "Hive Absorb (20)" set desc = "Allows you to absorb DNA that is being channeled in the airwaves." @@ -556,7 +543,7 @@ var/list/datum/dna/hivemind_bank = list() // Fake Voice -/mob/proc/changeling_mimicvoice() +/mob/living/carbon/proc/changeling_mimicvoice() set category = "Changeling" set name = "Mimic Voice" set desc = "Shape our vocal glands to form a voice of someone we choose. We cannot regenerate chemicals when mimicing." @@ -615,8 +602,8 @@ var/list/datum/dna/hivemind_bank = list() changeling.chem_charges -= required_chems changeling.sting_range = 1 - src.verbs -= verb_path - spawn(10) src.verbs += verb_path + verbs -= verb_path + spawn(10) verbs += verb_path src << "We stealthily sting [T]." if(!T.mind || !T.mind.changeling) return T //T will be affected by the sting @@ -624,35 +611,35 @@ var/list/datum/dna/hivemind_bank = list() return -/mob/proc/changeling_lsdsting() +/mob/living/carbon/proc/changeling_lsdsting() set category = "Changeling" set name = "Hallucination Sting (15)" set desc = "Causes terror in the target." - var/mob/living/carbon/T = changeling_sting(15,/mob/proc/changeling_lsdsting) + var/mob/living/carbon/T = changeling_sting(15,/mob/living/carbon/proc/changeling_lsdsting) if(!T) return 0 spawn(rand(300,600)) if(T) T.hallucination += 400 feedback_add_details("changeling_powers","HS") return 1 -/mob/proc/changeling_silence_sting() +/mob/living/carbon/proc/changeling_silence_sting() set category = "Changeling" set name = "Silence sting (10)" set desc="Sting target" - var/mob/living/carbon/T = changeling_sting(10,/mob/proc/changeling_silence_sting) + var/mob/living/carbon/T = changeling_sting(10,/mob/living/carbon/proc/changeling_silence_sting) if(!T) return 0 T.silent += 30 feedback_add_details("changeling_powers","SS") return 1 -/mob/proc/changeling_blind_sting() +/mob/living/carbon/proc/changeling_blind_sting() set category = "Changeling" set name = "Blind sting (20)" set desc="Sting target" - var/mob/living/carbon/T = changeling_sting(20,/mob/proc/changeling_blind_sting) + var/mob/living/carbon/T = changeling_sting(20,/mob/living/carbon/proc/changeling_blind_sting) if(!T) return 0 T << "Your eyes burn horrificly!" T.disabilities |= NEARSIGHTED @@ -662,12 +649,12 @@ var/list/datum/dna/hivemind_bank = list() feedback_add_details("changeling_powers","BS") return 1 -/mob/proc/changeling_deaf_sting() +/mob/living/carbon/proc/changeling_deaf_sting() set category = "Changeling" set name = "Deaf sting (5)" set desc="Sting target:" - var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_deaf_sting) + var/mob/living/carbon/T = changeling_sting(5,/mob/living/carbon/proc/changeling_deaf_sting) if(!T) return 0 T << "Your ears pop and begin ringing loudly!" T.sdisabilities |= DEAF @@ -675,19 +662,19 @@ var/list/datum/dna/hivemind_bank = list() feedback_add_details("changeling_powers","DS") return 1 -/mob/proc/changeling_paralysis_sting() +/mob/living/carbon/proc/changeling_paralysis_sting() set category = "Changeling" set name = "Paralysis sting (30)" set desc="Sting target" - var/mob/living/carbon/T = changeling_sting(30,/mob/proc/changeling_paralysis_sting) + var/mob/living/carbon/T = changeling_sting(30,/mob/living/carbon/proc/changeling_paralysis_sting) if(!T) return 0 T << "Your muscles begin to painfully tighten." T.Weaken(20) feedback_add_details("changeling_powers","PS") return 1 -/mob/proc/changeling_transformation_sting() +/mob/living/carbon/proc/changeling_transformation_sting() set category = "Changeling" set name = "Transformation sting (40)" set desc="Sting target" @@ -695,11 +682,9 @@ var/list/datum/dna/hivemind_bank = list() var/datum/changeling/changeling = changeling_power(40) if(!changeling) return 0 - - var/list/names = list() for(var/datum/dna/DNA in changeling.absorbed_dna) - names += "[DNA.real_name]" + names += DNA.real_name var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names if(!S) return @@ -708,7 +693,7 @@ var/list/datum/dna/hivemind_bank = list() if(!chosen_dna) return - var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_transformation_sting) + var/mob/living/carbon/T = changeling_sting(40,/mob/living/carbon/proc/changeling_transformation_sting) if(!T) return 0 if((HUSK in T.mutations) || (!ishuman(T) && !ismonkey(T))) src << "Our sting appears ineffective against its DNA." @@ -716,17 +701,17 @@ var/list/datum/dna/hivemind_bank = list() T.visible_message("[T] transforms!") T.dna = chosen_dna T.real_name = chosen_dna.real_name - updateappearance(T, T.dna.uni_identity) + updateappearance(T) domutcheck(T, null) feedback_add_details("changeling_powers","TS") return 1 -/mob/proc/changeling_unfat_sting() +/mob/living/carbon/proc/changeling_unfat_sting() set category = "Changeling" set name = "Unfat sting (5)" set desc = "Sting target" - var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_unfat_sting) + var/mob/living/carbon/T = changeling_sting(5,/mob/living/carbon/proc/changeling_unfat_sting) if(!T) return 0 T << "you feel a small prick as stomach churns violently and you become to feel skinnier." T.overeatduration = 0 @@ -734,12 +719,12 @@ var/list/datum/dna/hivemind_bank = list() feedback_add_details("changeling_powers","US") return 1 -/mob/proc/changeling_DEATHsting() +/mob/living/carbon/proc/changeling_DEATHsting() set category = "Changeling" set name = "Death Sting (40)" set desc = "Causes spasms onto death." - var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_DEATHsting) + var/mob/living/carbon/T = changeling_sting(40,/mob/living/carbon/proc/changeling_DEATHsting) if(!T) return 0 T << "You feel a small prick and your chest becomes tight." T.silent = 10 @@ -749,7 +734,7 @@ var/list/datum/dna/hivemind_bank = list() feedback_add_details("changeling_powers","DTHS") return 1 -/mob/proc/changeling_extract_dna_sting() +/mob/living/carbon/proc/changeling_extract_dna_sting() set category = "Changeling" set name = "Extract DNA Sting (40)" set desc="Stealthily sting a target to extract their DNA." @@ -760,7 +745,7 @@ var/list/datum/dna/hivemind_bank = list() if(!changeling) return 0 - var/mob/living/carbon/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting) + var/mob/living/carbon/T = changeling_sting(40, /mob/living/carbon/proc/changeling_extract_dna_sting) if(!T) return 0 T.dna.real_name = T.real_name diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm index be8338526f7..34a2e978276 100644 --- a/code/game/gamemodes/changeling/modularchangling.dm +++ b/code/game/gamemodes/changeling/modularchangling.dm @@ -1,7 +1,6 @@ // READ: Don't use the apostrophe in name or desc. Causes script errors. -var/list/powers = typesof(/datum/power/changeling) - /datum/power/changeling //needed for the badmin verb for now -var/list/datum/power/changeling/powerinstances = list() +var/list/powerinstances /datum/power //Could be used by other antags too var/name = "Power" @@ -18,13 +17,13 @@ var/list/datum/power/changeling/powerinstances = list() name = "Absorb DNA" desc = "Permits us to syphon the DNA from a human. They become one with us, and we become stronger." genomecost = 0 - verbpath = /mob/proc/changeling_absorb_dna + verbpath = /mob/living/carbon/proc/changeling_absorb_dna /datum/power/changeling/transform name = "Transform" - desc = "We take on the apperance and voice of one we have absorbed." + desc = "We take on the appearance and voice of one we have absorbed." genomecost = 0 - verbpath = /mob/proc/changeling_transform + verbpath = /mob/living/carbon/proc/changeling_transform /datum/power/changeling/fakedeath name = "Regenerative Stasis" @@ -32,7 +31,7 @@ var/list/datum/power/changeling/powerinstances = list() helptext = "Can be used before or after death. Duration varies greatly." genomecost = 0 allowduringlesserform = 1 - verbpath = /mob/proc/changeling_fakedeath + verbpath = /mob/living/carbon/proc/changeling_fakedeath // Hivemind @@ -41,34 +40,34 @@ var/list/datum/power/changeling/powerinstances = list() desc = "We can channel a DNA into the airwaves, allowing our fellow changelings to absorb it and transform into it as if they acquired the DNA themselves." helptext = "Allows other changelings to absorb the DNA you channel from the airwaves. Will not help them towards their absorb objectives." genomecost = 0 - verbpath = /mob/proc/changeling_hiveupload + verbpath = /mob/living/carbon/proc/changeling_hiveupload /datum/power/changeling/hive_download name = "Hive Absorb" desc = "We can absorb a single DNA from the airwaves, allowing us to use more disguises with help from our fellow changelings." helptext = "Allows you to absorb a single DNA and use it. Does not count towards your absorb objective." genomecost = 0 - verbpath = /mob/proc/changeling_hivedownload + verbpath = /mob/living/carbon/proc/changeling_hivedownload /datum/power/changeling/lesser_form name = "Lesser Form" desc = "We debase ourselves and become lesser. We become a monkey." genomecost = 1 - verbpath = /mob/proc/changeling_lesser_form + verbpath = /mob/living/carbon/proc/changeling_lesser_form /datum/power/changeling/deaf_sting name = "Deaf Sting" desc = "We silently sting a human, completely deafening them for a short time." genomecost = 1 allowduringlesserform = 1 - verbpath = /mob/proc/changeling_deaf_sting + verbpath = /mob/living/carbon/proc/changeling_deaf_sting /datum/power/changeling/blind_sting name = "Blind Sting" desc = "We silently sting a human, completely blinding them for a short time." genomecost = 2 allowduringlesserform = 1 - verbpath = /mob/proc/changeling_blind_sting + verbpath = /mob/living/carbon/proc/changeling_blind_sting /datum/power/changeling/silence_sting name = "Silence Sting" @@ -76,14 +75,14 @@ var/list/datum/power/changeling/powerinstances = list() helptext = "Does not provide a warning to a victim that they have been stung, until they try to speak and cannot." genomecost = 2 allowduringlesserform = 1 - verbpath = /mob/proc/changeling_silence_sting + verbpath = /mob/living/carbon/proc/changeling_silence_sting /datum/power/changeling/mimicvoice name = "Mimic Voice" desc = "We shape our vocal glands to sound like a desired voice." helptext = "Will turn your voice into the name that you enter. We must constantly expend chemicals to maintain our form like this" genomecost = 3 - verbpath = /mob/proc/changeling_mimicvoice + verbpath = /mob/living/carbon/proc/changeling_mimicvoice /datum/power/changeling/extractdna name = "Extract DNA" @@ -91,53 +90,53 @@ var/list/datum/power/changeling/powerinstances = list() helptext = "Will give you the DNA of your target, allowing you to transform into them. Does not count towards absorb objectives." genomecost = 4 allowduringlesserform = 1 - verbpath = /mob/proc/changeling_extract_dna_sting + verbpath = /mob/living/carbon/proc/changeling_extract_dna_sting /datum/power/changeling/transformation_sting name = "Transformation Sting" desc = "We silently sting a human, injecting a retrovirus that forces them to transform into another." helptext = "Does not provide a warning to others. The victim will transform much like a changeling would." genomecost = 3 - verbpath = /mob/proc/changeling_transformation_sting + verbpath = /mob/living/carbon/proc/changeling_transformation_sting /datum/power/changeling/paralysis_sting name = "Paralysis Sting" desc = "We silently sting a human, paralyzing them for a short time." genomecost = 3 - verbpath = /mob/proc/changeling_paralysis_sting + verbpath = /mob/living/carbon/proc/changeling_paralysis_sting /datum/power/changeling/LSDSting name = "Hallucination Sting" - desc = "We evolve the ability to sting a target with a powerful hallunicationary chemical." + desc = "We evolve the ability to sting a target with a powerful hallucinogenic chemical." helptext = "The target does not notice they have been stung. The effect occurs after 30 to 60 seconds." genomecost = 3 - verbpath = /mob/proc/changeling_lsdsting + verbpath = /mob/living/carbon/proc/changeling_lsdsting /datum/power/changeling/DeathSting name = "Death Sting" desc = "We silently sting a human, filling him with potent chemicals. His rapid death is all but assured." genomecost = 10 - verbpath = /mob/proc/changeling_DEATHsting + verbpath = /mob/living/carbon/proc/changeling_DEATHsting /datum/power/changeling/unfat_sting name = "Unfat Sting" - desc = "We silently sting a human, forcing them to rapidly metobolize their fat." + desc = "We silently sting a human, forcing them to rapidly metabolize their fat." genomecost = 1 - verbpath = /mob/proc/changeling_unfat_sting + verbpath = /mob/living/carbon/proc/changeling_unfat_sting /datum/power/changeling/boost_range name = "Boost Range" desc = "We evolve the ability to shoot our stingers at humans, with some preperation." genomecost = 2 allowduringlesserform = 1 - verbpath = /mob/proc/changeling_boost_range + verbpath = /mob/living/carbon/proc/changeling_boost_range /datum/power/changeling/Epinephrine name = "Epinephrine sacs" desc = "We evolve additional sacs of adrenaline throughout our body." helptext = "Gives the ability to instantly recover from stuns. High chemical cost." genomecost = 4 - verbpath = /mob/proc/changeling_unstun + verbpath = /mob/living/carbon/proc/changeling_unstun /datum/power/changeling/ChemicalSynth name = "Rapid Chemical-Synthesis" @@ -153,7 +152,7 @@ var/list/datum/power/changeling/powerinstances = list() helptext = "Doubles the rate at which we naturally recharge chemicals." genomecost = 8 isVerb = 0 - verbpath = /mob/proc/changeling_fastchemical + verbpath = /mob/living/carbon/proc/changeling_fastchemical */ /datum/power/changeling/EngorgedGlands name = "Engorged Chemical Glands" @@ -169,14 +168,14 @@ var/list/datum/power/changeling/powerinstances = list() helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us.. uncanny. We must constantly expend chemicals to maintain our form like this." genomecost = 3 allowduringlesserform = 1 - verbpath = /mob/proc/changeling_digitalcamo + verbpath = /mob/living/carbon/proc/changeling_digitalcamo /datum/power/changeling/rapidregeneration name = "Rapid Regeneration" desc = "We evolve the ability to rapidly regenerate, negating the need for stasis." helptext = "Heals a moderate amount of damage every tick." genomecost = 8 - verbpath = /mob/proc/changeling_rapidregen + verbpath = /mob/living/carbon/proc/changeling_rapidregen @@ -188,9 +187,8 @@ var/list/datum/power/changeling/powerinstances = list() if(!usr || !usr.mind || !usr.mind.changeling) return src = usr.mind.changeling - if(!powerinstances.len) - for(var/P in powers) - powerinstances += new P() + if(!powerinstances) + powerinstances = init_subtypes(/datum/power/changeling) var/dat = "Changling Evolution Menu" @@ -463,9 +461,10 @@ var/list/datum/power/changeling/powerinstances = list() /datum/changeling/proc/purchasePower(var/datum/mind/M, var/Pname, var/remake_verbs = 1) - if(!M || !M.changeling) + if(!M || !M.changeling || !istype(M.current, /mob/living/carbon)) return + var/mob/living/carbon/C = M.current var/datum/power/changeling/Thepower = Pname @@ -477,16 +476,16 @@ var/list/datum/power/changeling/powerinstances = list() if(Thepower == null) - M.current << "This is awkward. Changeling power purchase failed, please report this bug to a coder!" + C << "This is awkward. Changeling power purchase failed, please report this bug to a coder!" return if(Thepower in purchasedpowers) - M.current << "We have already evolved this ability!" + C << "We have already evolved this ability!" return if(geneticpoints < Thepower.genomecost) - M.current << "We cannot evolve this... yet. We must acquire more DNA." + C << "We cannot evolve this... yet. We must acquire more DNA." return geneticpoints -= Thepower.genomecost @@ -494,7 +493,7 @@ var/list/datum/power/changeling/powerinstances = list() purchasedpowers += Thepower if(!Thepower.isVerb && Thepower.verbpath) - call(M.current, Thepower.verbpath)() + call(C, Thepower.verbpath)() else if(remake_verbs) - M.current.make_changeling() + C.make_changeling() diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index ca077575a00..6ddbb223978 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -34,7 +34,7 @@ /datum/game_mode/traitor/changeling/post_setup() for(var/datum/mind/changeling in changelings) - grant_changeling_powers(changeling.current) + changeling.current.make_changeling(changeling.current) changeling.special_role = "Changeling" forge_changeling_objectives(changeling) greet_changeling(changeling) diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index 0168bbf2049..ae0b63b7a8c 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -1,48 +1,36 @@ /proc/setupgenetics() +// if (prob(50)) +// BLOCKADD = rand(-300,300) +// if (prob(75)) +// DIFFMUT = rand(0,20) - if (prob(50)) - BLOCKADD = rand(-300,300) - if (prob(75)) - DIFFMUT = rand(0,20) - - var/list/avnums = new/list() - var/tempnum - - avnums.Add(2) - avnums.Add(12) - avnums.Add(10) - avnums.Add(8) - avnums.Add(4) - avnums.Add(11) - avnums.Add(13) - avnums.Add(6) - - tempnum = pick(avnums) - avnums.Remove(tempnum) - HULKBLOCK = tempnum - tempnum = pick(avnums) - avnums.Remove(tempnum) - TELEBLOCK = tempnum - tempnum = pick(avnums) - avnums.Remove(tempnum) - FIREBLOCK = tempnum - tempnum = pick(avnums) - avnums.Remove(tempnum) - XRAYBLOCK = tempnum - tempnum = pick(avnums) - avnums.Remove(tempnum) - CLUMSYBLOCK = tempnum - tempnum = pick(avnums) - avnums.Remove(tempnum) - FAKEBLOCK = tempnum - tempnum = pick(avnums) - avnums.Remove(tempnum) - DEAFBLOCK = tempnum - tempnum = pick(avnums) - avnums.Remove(tempnum) - BLINDBLOCK = tempnum - + var/list/avnums = new /list(DNA_STRUC_ENZYMES_BLOCKS) + for(var/i=1, i<=DNA_STRUC_ENZYMES_BLOCKS, i++) + avnums[i] = i + + HULKBLOCK = pick_n_take(avnums) + TELEBLOCK = pick_n_take(avnums) + + FIREBLOCK = pick_n_take(avnums) + XRAYBLOCK = pick_n_take(avnums) + + CLUMSYBLOCK = pick_n_take(avnums) + STRANGEBLOCK = pick_n_take(avnums) + DEAFBLOCK = pick_n_take(avnums) + BLINDBLOCK = pick_n_take(avnums) + NEARSIGHTEDBLOCK = pick_n_take(avnums) + EPILEPSYBLOCK = pick_n_take(avnums) + COUGHBLOCK = pick_n_take(avnums) + TOURETTESBLOCK = pick_n_take(avnums) + NERVOUSBLOCK = pick_n_take(avnums) + RACEBLOCK = pick_n_take(avnums) + bad_se_blocks = list(RACEBLOCK,NEARSIGHTEDBLOCK,EPILEPSYBLOCK,STRANGEBLOCK,COUGHBLOCK,CLUMSYBLOCK,TOURETTESBLOCK,NERVOUSBLOCK,DEAFBLOCK,BLINDBLOCK) + good_se_blocks = list(FIREBLOCK,XRAYBLOCK) + op_se_blocks = list(HULKBLOCK,TELEBLOCK) + + NULLED_SE = repeat_string(DNA_STRUC_ENZYMES_BLOCKS, repeat_string(DNA_BLOCK_SIZE, "_")) + NULLED_UI = repeat_string(DNA_UNI_IDENTITY_BLOCKS, repeat_string(DNA_BLOCK_SIZE, "_")) // HIDDEN MUTATIONS / SUPERPOWERS INITIALIZTION /* diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index b3cd8c38a90..e41028bcc59 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -27,24 +27,9 @@ icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk. item_state = "card-id" w_class = 1.0 - var/data = "" - var/ue = 0 - var/data_type = "ui" //ui|se - var/owner = "God Emperor of Mankind" + var/list/fields = list() var/read_only = 0 //Well,it's still a floppy disk -/obj/item/weapon/disk/data/demo - name = "data disk - 'God Emperor of Mankind'" - data = "066000033000000000AF00330660FF4DB002690" - //data = "0C80C80C80C80C80C8000000000000161FBDDEF" - Farmer Jeff - ue = 1 - read_only = 1 - -/obj/item/weapon/disk/data/monkey - name = "data disk - 'Mr. Muggles'" - data_type = "se" - data = "0983E840344C39F4B059D5145FC5785DC6406A4FFF" - read_only = 1 //Find a dead mob with a brain and client. /proc/find_dead_player(var/find_key) @@ -68,17 +53,16 @@ //Disk stuff. /obj/item/weapon/disk/data/New() ..() - var/diskcolor = pick(0,1,2) - src.icon_state = "datadisk[diskcolor]" + icon_state = "datadisk[pick(0,1,2)]" /obj/item/weapon/disk/data/attack_self(mob/user as mob) - src.read_only = !src.read_only + read_only = !read_only user << "You flip the write-protect tab to [src.read_only ? "protected" : "unprotected"]." /obj/item/weapon/disk/data/examine() set src in oview(5) ..() - usr << text("The write-protect tab is set to [src.read_only ? "protected" : "unprotected"].") + usr << "The write-protect tab is set to [src.read_only ? "protected" : "unprotected"]." return //Health Tracker Implant @@ -178,22 +162,12 @@ // -- End mode specific stuff - if(!H.dna) - H.dna = new /datum/dna() - H.dna.real_name = H.real_name - if(ui) - H.dna.uni_identity = ui - updateappearance(H, ui) - if(se) - H.dna.struc_enzymes = se - randmutb(H) //Sometimes the clones come out wrong. + hardset_dna(H, ui, se, null, mrace) + randmutb(H) //Sometimes the clones come out wrong. H.f_style = "Shaved" H.h_style = pick("Bedhead", "Bedhead 2", "Bedhead 3") - if(H.dna) - H.dna.mutantrace = mrace - H.update_mutantrace() H.suiciding = 0 src.attempting = 0 return 1 diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 7bbfb604bf5..da99eb150ea 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -1,82 +1,3 @@ -/obj/machinery/computer/scan_consolenew - name = "DNA Scanner Access Console" - desc = "Scan DNA." - icon = 'icons/obj/computer.dmi' - icon_state = "scanner" - density = 1 - var/uniblock = 1.0 - var/strucblock = 1.0 - var/subblock = 1.0 - var/unitarget = 1 - var/unitargethex = 1 - var/status = null - var/radduration = 2.0 - var/radstrength = 1.0 - var/radacc = 1.0 - var/buffer1 = null - var/buffer2 = null - var/buffer3 = null - var/buffer1owner = null - var/buffer2owner = null - var/buffer3owner = null - var/buffer1label = null - var/buffer2label = null - var/buffer3label = null - var/buffer1type = null - var/buffer2type = null - var/buffer3type = null - var/buffer1iue = 0 - var/buffer2iue = 0 - var/buffer3iue = 0 - var/injectorready = 0 //Quick fix for issue 286 (screwdriver the screen twice to restore injector) -Pete - var/current_screen = null - var/scanner_status_html = null - var/temp_html = null - var/obj/machinery/dna_scannernew/connected = null - var/obj/item/weapon/disk/data/diskette = null - anchored = 1.0 - use_power = 1 - idle_power_usage = 10 - active_power_usage = 400 - -/obj/machinery/computer/scan_consolenew/attackby(obj/item/I as obj, mob/user as mob) - if(istype(I, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - if (src.stat & BROKEN) - user << "\blue The broken glass falls out." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - new /obj/item/weapon/shard( src.loc ) - var/obj/item/weapon/circuitboard/scan_consolenew/M = new /obj/item/weapon/circuitboard/scan_consolenew( A ) - for (var/obj/C in src) - C.loc = src.loc - A.circuit = M - A.state = 3 - A.icon_state = "3" - A.anchored = 1 - del(src) - else - user << "\blue You disconnect the monitor." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - var/obj/item/weapon/circuitboard/scan_consolenew/M = new /obj/item/weapon/circuitboard/scan_consolenew( A ) - for (var/obj/C in src) - C.loc = src.loc - A.circuit = M - A.state = 4 - A.icon_state = "4" - A.anchored = 1 - del(src) - if (istype(I, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES - if (!src.diskette) - user.drop_item() - I.loc = src - src.diskette = I - user << "You insert [I]." - src.updateUsrDialog() - return - else - src.attack_hand(user) - return /obj/machinery/computer/cloning name = "Cloning Console" @@ -241,26 +162,21 @@ dat += "Unique Identifier:
[src.active_record.fields["UI"]]
" dat += "Structural Enzymes:
[src.active_record.fields["SE"]]
" - if (!isnull(src.diskette)) + if(diskette && diskette.fields) dat += "
" dat += "

Inserted Disk

" dat += "Contents: " - if (src.diskette.data == "") - dat += "Empty" - else - if (src.diskette.data_type == "ui") - dat += "Unique Identifier" - if (src.diskette.ue) - dat += " + Unique Enzymes" - else if (src.diskette.data_type == "se") - dat += "Structural Enzymes" - dat += "
Load from Disk" + var/list/L = list() + if(diskette.fields["UI"]) + L += "Unique Identifier" + if(diskette.fields["UE"] && diskette.fields["name"] && diskette.fields["b_type"]) + L += "Unique Enzymes" + if(diskette.fields["SE"]) + L += "Structural Enzymes" + dat += english_list(L, "Empty", " + ", " + ") + dat += "
Load from Disk" - - dat += "

Save to Disk:
" - dat += "Unique Identifier + Unique Enzymes
" - dat += "Unique Identifier
" - dat += "Structural Enzymes" + dat += "
Save to Disk" dat += "
" dat += "Delete Record" @@ -313,7 +229,7 @@ else if (href_list["view_rec"]) src.active_record = locate(href_list["view_rec"]) if(istype(src.active_record,/datum/data/record)) - if ((isnull(src.active_record.fields["ckey"])) || (src.active_record.fields["ckey"] == "")) + if (!active_record.fields["ckey"]) del(src.active_record) src.temp = "Record Corrupt" else @@ -343,51 +259,32 @@ else if (href_list["disk"]) //Load or eject. switch(href_list["disk"]) if("load") - if ((isnull(src.diskette)) || (src.diskette.data == "")) + if (!diskette || !istype(diskette.fields) || !diskette.fields["name"] || !diskette.fields) src.temp = "Load error." src.updateUsrDialog() return - if (isnull(src.active_record)) + if (!src.active_record) src.temp = "Record error." src.menu = 1 src.updateUsrDialog() return - - if (src.diskette.data_type == "ui") - src.active_record.fields["UI"] = src.diskette.data - if (src.diskette.ue) - src.active_record.fields["name"] = src.diskette.owner - else if (src.diskette.data_type == "se") - src.active_record.fields["SE"] = src.diskette.data - + + src.active_record.fields = diskette.fields.Copy() src.temp = "Load successful." + if("eject") - if (!isnull(src.diskette)) + if(src.diskette) src.diskette.loc = src.loc src.diskette = null - - else if (href_list["save_disk"]) //Save to disk! - if ((isnull(src.diskette)) || (src.diskette.read_only) || (isnull(src.active_record))) - src.temp = "Save error." - src.updateUsrDialog() - return - - switch(href_list["save_disk"]) //Save as Ui/Ui+Ue/Se - if("ui") - src.diskette.data = src.active_record.fields["UI"] - src.diskette.ue = 0 - src.diskette.data_type = "ui" - if("ue") - src.diskette.data = src.active_record.fields["UI"] - src.diskette.ue = 1 - src.diskette.data_type = "ui" - if("se") - src.diskette.data = src.active_record.fields["SE"] - src.diskette.ue = 0 - src.diskette.data_type = "se" - src.diskette.owner = src.active_record.fields["name"] - src.diskette.name = "data disk - '[src.diskette.owner]'" - src.temp = "Save \[[href_list["save_disk"]]\] successful." + if("save") + if(!diskette || diskette.read_only || !active_record || !active_record.fields) + src.temp = "Save error." + src.updateUsrDialog() + return + + diskette.fields = active_record.fields.Copy() + diskette.name = "data disk - '[src.diskette.fields["name"]]'" + src.temp = "Save successful." else if (href_list["refresh"]) src.updateUsrDialog() @@ -424,7 +321,7 @@ return /obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject as mob) - if ((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna)) + if (!check_dna_integrity(subject) || !istype(subject)) scantemp = "Unable to locate valid genetic data." return if (!getbrain(subject)) @@ -443,9 +340,7 @@ scantemp = "Subject already in database." return - subject.dna.check_integrity() - - var/datum/data/record/R = new /datum/data/record( ) + var/datum/data/record/R = new /datum/data/record() if(subject.dna) R.fields["mrace"] = subject.dna.mutantrace else @@ -453,6 +348,7 @@ R.fields["ckey"] = subject.ckey R.fields["name"] = subject.real_name R.fields["id"] = copytext(md5(subject.real_name), 2, 6) + R.fields["UE"] = subject.dna.unique_enzymes R.fields["UI"] = subject.dna.uni_identity R.fields["SE"] = subject.dna.struc_enzymes diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 1c1014ac67c..85bcd9e9a3c 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -958,8 +958,10 @@ */ var/passed if(src.dna) - if(usr.dna.unique_enzymes==src.dna) - passed = 1 + if(check_dna_integrity(usr)) + var/mob/living/carbon/C = usr + if(C.dna.unique_enzymes==src.dna) + passed = 1 else if(src.operation_allowed(usr)) passed = 1 if(!passed) diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm index ae8fc7220a0..09453b00df8 100644 --- a/code/game/objects/effects/gibs.dm +++ b/code/game/objects/effects/gibs.dm @@ -1,4 +1,4 @@ -/proc/gibs(atom/location, var/list/viruses, var/datum/dna/MobDNA) //CARN MARKER +/proc/gibs(atom/location, var/list/viruses, var/datum/dna/MobDNA) new /obj/effect/gibspawner/generic(get_turf(location),viruses,MobDNA) /proc/hgibs(atom/location, var/list/viruses, var/datum/dna/MobDNA) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 8570ea8909f..bb1ce45aa6a 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -888,8 +888,8 @@ var/global/list/obj/item/device/pda/PDAs = list() user << "You slide \the [C] into \the [src]." return -/obj/item/device/pda/attack(mob/living/C as mob, mob/living/user as mob) - if (istype(C, /mob/living/carbon)) +/obj/item/device/pda/attack(mob/living/carbon/C, mob/living/user as mob) + if(istype(C)) switch(scanmode) if(1) @@ -918,13 +918,13 @@ var/global/list/obj/item/device/pda/PDAs = list() user.show_message(text("\red Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]")) if(2) - if (!istype(C:dna, /datum/dna)) + if(!istype(C.dna)) user << "\blue No fingerprints found on [C]" else if(!istype(C, /mob/living/carbon/monkey)) if(!isnull(C:gloves)) user << "\blue No fingerprints found on [C]" else - user << text("\blue [C]'s Fingerprints: [md5(C:dna.uni_identity)]") + user << text("\blue [C]'s Fingerprints: [md5(C.dna.uni_identity)]") if ( !(C:blood_DNA) ) user << "\blue No blood found on [C]" if(C:blood_DNA) diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 9c0114ed626..4172df49e43 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -68,13 +68,12 @@ if(href_list["setdna"]) if(pai.master_dna) return - var/mob/M = usr - if(!istype(M, /mob/living/carbon)) + if(!istype(usr, /mob/living/carbon)) usr << "You don't have any DNA, or your DNA is incompatible with this device." else - var/datum/dna/dna = usr.dna + var/mob/living/carbon/M = usr pai.master = M.real_name - pai.master_dna = dna.unique_enzymes + pai.master_dna = M.dna.unique_enzymes pai << "

You have been bound to a new master.

" if(href_list["wipe"]) var/confirm = input("Are you CERTAIN you wish to delete the current personality? This action cannot be undone.", "Personality Wipe") in list("Yes", "No") diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 4ce6271997c..a416da8adcc 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -6,72 +6,52 @@ throw_speed = 1 throw_range = 5 w_class = 1.0 - var/dnatype = null - var/dna = null - var/block = null - var/ue = null + + var/list/fields /obj/item/weapon/dnainjector/attack_paw(mob/user) return attack_hand(user) -/obj/item/weapon/dnainjector/proc/inject(mob/M, mob/user) - if(M.stat == DEAD) //prevents dead people from having their DNA changed - user << "You can't modify [M]'s DNA while \he's dead." - return - - if(isliving(M)) +/obj/item/weapon/dnainjector/proc/inject(mob/living/carbon/M, mob/user) + if(check_dna_integrity(M) && !(NOCLONE in M.mutations)) + if(M.stat == DEAD) //prevents dead people from having their DNA changed + user << "You can't modify [M]'s DNA while \he's dead." + return M.radiation += rand(20, 50) - - if(dnatype == "ui") - if(!block) //isolated block? - if(ue) //unique enzymes? yes - M.dna.uni_identity = dna - updateappearance(M, M.dna.uni_identity) - M.real_name = ue - M.name = ue - else //unique enzymes? no - M.dna.uni_identity = dna - updateappearance(M, M.dna.uni_identity) - else - M.dna.uni_identity = setblock(M.dna.uni_identity,block, dna, 3) - updateappearance(M, M.dna.uni_identity) - - else if(dnatype == "se") - if(!block) //isolated block? - M.dna.struc_enzymes = dna - domutcheck(M, null) - else - M.dna.struc_enzymes = setblock(M.dna.struc_enzymes,block, dna, 3) - domutcheck(M, null, 1) - + if(fields) + var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]" + if(fields["name"] && fields["UE"] && fields["b_type"]) + M.real_name = fields["name"] + M.dna.unique_enzymes = fields["UE"] + M.name = M.real_name + M.dna.b_type = fields["b_type"] + if(fields["UI"]) //UI+UE + M.dna.uni_identity = merge_text(M.dna.uni_identity, fields["UI"]) + updateappearance(M) + if(fields["SE"]) + M.dna.struc_enzymes = merge_text(M.dna.struc_enzymes, fields["SE"]) + if(ishuman(M) && (deconstruct_block(getblock(M.dna.struc_enzymes, RACEBLOCK), BAD_MUTATION_DIFFICULTY) == BAD_MUTATION_DIFFICULTY)) //check for monkeying people. + message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] \red(MONKEY)") + log_msg += " (MONKEY)" + domutcheck(M, null,(type != /obj/item/weapon/dnainjector)) //admin-spawnable-injectors always work + log_attack(log_msg) + else + user << "It appears that [M] does not have compatible DNA." + return /obj/item/weapon/dnainjector/attack(mob/target, mob/user) if(!ishuman(user)) user << "You don't have the dexterity to do this!" return - if(!ishuman(target) && !ismonkey(target)) - user << "You can't inject [target]." - return - - target.attack_log += text("\[[time_stamp()]\] [user.name] ([user.ckey]) attempted to inject with [name]") - user.attack_log += text("\[[time_stamp()]\] Used the [name] to attempt to inject [target.name] ([target.ckey])") + + target.attack_log += "\[[time_stamp()]\] [user.name] ([user.ckey]) attempted to inject with [name]" + user.attack_log += "\[[time_stamp()]\] Used the [name] to attempt to inject [target.name] ([target.ckey])" log_attack("[user.name] ([user.ckey]) used the [name] to attempt to inject [target.name] ([target.ckey])") if(target != user) - target.visible_message("[user] is trying to inject [target] with [src]!", \ - "[user] is trying to inject [target] with [src]!") - - if(!do_mob(user, target)) - return - if(!src) - return - - if(ishuman(target)) //check for monkeying people. - if(dnatype == "se") - if(isblockon(getblock(dna, 14,3),14)) - message_admins("[key_name_admin(user)] injected [key_name_admin(target)] with the [name] \red(MONKEY)") - + target.visible_message("[user] is trying to inject [target] with [src]!", "[user] is trying to inject [target] with [src]!") + if(!do_mob(user, target)) return target.visible_message("[user] injects [target] with the syringe with [src]!", \ "[user] injects [target] with the syringe with [src]!") @@ -90,231 +70,188 @@ /obj/item/weapon/dnainjector/antihulk name = "\improper DNA injector (Anti-Hulk)" desc = "Cures green skin." - dnatype = "se" - dna = "708" - //block = 2 New() ..() - block = HULKBLOCK + fields = list("SE"=setblock(NULLED_SE, HULKBLOCK, repeat_string(DNA_BLOCK_SIZE,"0"))) /obj/item/weapon/dnainjector/hulkmut name = "\improper DNA injector (Hulk)" desc = "This will make you big and strong, but give you a bad skin condition." - dnatype = "se" - dna = "FED" - //block = 2 New() ..() - block = HULKBLOCK + fields = list("SE"=setblock(NULLED_SE, HULKBLOCK, repeat_string(DNA_BLOCK_SIZE,"f"))) /obj/item/weapon/dnainjector/xraymut name = "\improper DNA injector (Xray)" desc = "Finally you can see what the Captain does." - dnatype = "se" - dna = "FED" - //block = 8 New() ..() - block = XRAYBLOCK + fields = list("SE"=setblock(NULLED_SE, XRAYBLOCK, repeat_string(DNA_BLOCK_SIZE,"f"))) /obj/item/weapon/dnainjector/antixray name = "\improper DNA injector (Anti-Xray)" desc = "It will make you see harder." - dnatype = "se" - dna = "708" - //block = 8 New() ..() - block = XRAYBLOCK + fields = list("SE"=setblock(NULLED_SE, XRAYBLOCK, repeat_string(DNA_BLOCK_SIZE,"0"))) ///////////////////////////////////// /obj/item/weapon/dnainjector/antiglasses name = "\improper DNA injector (Anti-Glasses)" desc = "Toss away those glasses!" - dnatype = "se" - dna = "708" - block = 1 + New() + ..() + fields = list("SE"=setblock(NULLED_SE, NEARSIGHTEDBLOCK, repeat_string(DNA_BLOCK_SIZE,"0"))) /obj/item/weapon/dnainjector/glassesmut name = "\improper DNA injector (Glasses)" desc = "Will make you need dorkish glasses." - dnatype = "se" - dna = "BD6" - block = 1 + New() + ..() + fields = list("SE"=setblock(NULLED_SE, NEARSIGHTEDBLOCK, repeat_string(DNA_BLOCK_SIZE,"f"))) /obj/item/weapon/dnainjector/epimut name = "\improper DNA injector (Epi.)" desc = "Shake shake shake the room!" - dnatype = "se" - dna = "FA0" - block = 3 + New() + ..() + fields = list("SE"=setblock(NULLED_SE, EPILEPSYBLOCK, repeat_string(DNA_BLOCK_SIZE,"f"))) /obj/item/weapon/dnainjector/antiepi name = "\improper DNA injector (Anti-Epi.)" desc = "Will fix you up from shaking the room." - dnatype = "se" - dna = "708" - block = 3 + New() + ..() + fields = list("SE"=setblock(NULLED_SE, EPILEPSYBLOCK, repeat_string(DNA_BLOCK_SIZE,"0"))) //////////////////////////////////// /obj/item/weapon/dnainjector/anticough name = "\improper DNA injector (Anti-Cough)" desc = "Will stop that aweful noise." - dnatype = "se" - dna = "708" - block = 5 + New() + ..() + fields = list("SE"=setblock(NULLED_SE, COUGHBLOCK, repeat_string(DNA_BLOCK_SIZE,"0"))) /obj/item/weapon/dnainjector/coughmut name = "\improper DNA injector (Cough)" desc = "Will bring forth a sound of horror from your throat." - dnatype = "se" - dna = "BD6" - block = 5 + New() + ..() + fields = list("SE"=setblock(NULLED_SE, COUGHBLOCK, repeat_string(DNA_BLOCK_SIZE,"f"))) + /obj/item/weapon/dnainjector/clumsymut name = "\improper DNA injector (Clumsy)" desc = "Makes clown minions." - dnatype = "se" - dna = "FA0" - //block = 6 New() ..() - block = CLUMSYBLOCK + fields = list("SE"=setblock(NULLED_SE, CLUMSYBLOCK, repeat_string(DNA_BLOCK_SIZE,"f"))) + /obj/item/weapon/dnainjector/anticlumsy name = "\improper DNA injector (Anti-Clumy)" desc = "Apply this for Security Clown." - dnatype = "se" - dna = "708" - //block = 6 New() ..() - block = CLUMSYBLOCK + fields = list("SE"=setblock(NULLED_SE, CLUMSYBLOCK, repeat_string(DNA_BLOCK_SIZE,"0"))) /obj/item/weapon/dnainjector/antitour name = "\improper DNA injector (Anti-Tour.)" desc = "Will cure tourrets." - dnatype = "se" - dna = "708" - block = 7 + New() + ..() + fields = list("SE"=setblock(NULLED_SE, TOURETTESBLOCK, repeat_string(DNA_BLOCK_SIZE,"0"))) /obj/item/weapon/dnainjector/tourmut name = "\improper DNA injector (Tour.)" desc = "Gives you a nasty case off tourrets." - dnatype = "se" - dna = "BD6" - block = 7 + New() + ..() + fields = list("SE"=setblock(NULLED_SE, TOURETTESBLOCK, repeat_string(DNA_BLOCK_SIZE,"f"))) /obj/item/weapon/dnainjector/stuttmut name = "\improper DNA injector (Stutt.)" desc = "Makes you s-s-stuttterrr" - dnatype = "se" - dna = "FA0" - block = 9 + New() + ..() + fields = list("SE"=setblock(NULLED_SE, NERVOUSBLOCK, repeat_string(DNA_BLOCK_SIZE,"f"))) /obj/item/weapon/dnainjector/antistutt name = "\improper DNA injector (Anti-Stutt.)" desc = "Fixes that speaking impairment." - dnatype = "se" - dna = "708" - block = 9 + New() + ..() + fields = list("SE"=setblock(NULLED_SE, NERVOUSBLOCK, repeat_string(DNA_BLOCK_SIZE,"0"))) /obj/item/weapon/dnainjector/antifire name = "\improper DNA injector (Anti-Fire)" desc = "Cures fire." - dnatype = "se" - dna = "708" - //block = 10 New() ..() - block = FIREBLOCK + fields = list("SE"=setblock(NULLED_SE, FIREBLOCK, repeat_string(DNA_BLOCK_SIZE,"0"))) /obj/item/weapon/dnainjector/firemut name = "\improper DNA injector (Fire)" desc = "Gives you fire." - dnatype = "se" - dna = "FED" - //block = 10 New() ..() - block = FIREBLOCK + fields = list("SE"=setblock(NULLED_SE, FIREBLOCK, repeat_string(DNA_BLOCK_SIZE,"0"))) /obj/item/weapon/dnainjector/blindmut name = "\improper DNA injector (Blind)" desc = "Makes you not see anything." - dnatype = "se" - dna = "FA0" - //block = 11 New() ..() - block = BLINDBLOCK + fields = list("SE"=setblock(NULLED_SE, BLINDBLOCK, repeat_string(DNA_BLOCK_SIZE,"f"))) /obj/item/weapon/dnainjector/antiblind name = "\improper DNA injector (Anti-Blind)" desc = "ITS A MIRACLE!!!" - dnatype = "se" - dna = "708" - //block = 11 New() ..() - block = BLINDBLOCK + fields = list("SE"=setblock(NULLED_SE, BLINDBLOCK, repeat_string(DNA_BLOCK_SIZE,"0"))) /obj/item/weapon/dnainjector/antitele name = "\improper DNA injector (Anti-Tele.)" desc = "Will make you not able to control your mind." - dnatype = "se" - dna = "708" - //block = 12 New() ..() - block = TELEBLOCK + fields = list("SE"=setblock(NULLED_SE, TELEBLOCK, repeat_string(DNA_BLOCK_SIZE,"0"))) /obj/item/weapon/dnainjector/telemut name = "\improper DNA injector (Tele.)" desc = "Super brain man!" - dnatype = "se" - dna = "FED" - //block = 12 New() ..() - block = TELEBLOCK + fields = list("SE"=setblock(NULLED_SE, TELEBLOCK, repeat_string(DNA_BLOCK_SIZE,"f"))) /obj/item/weapon/dnainjector/telemut/darkbundle name = "\improper DNA injector" desc = "Good. Let the hate flow through you." -/obj/item/weapon/dnainjector/telemut/darkbundle/attack(mob/M, mob/user) - ..() - domutcheck(M,null) //guarantees that it works instead of getting a dud injector. /obj/item/weapon/dnainjector/deafmut name = "\improper DNA injector (Deaf)" desc = "Sorry, what did you say?" - dnatype = "se" - dna = "FA0" - //block = 13 New() ..() - block = DEAFBLOCK + fields = list("SE"=setblock(NULLED_SE, DEAFBLOCK, repeat_string(DNA_BLOCK_SIZE,"f"))) /obj/item/weapon/dnainjector/antideaf name = "\improper DNA injector (Anti-Deaf)" desc = "Will make you hear once more." - dnatype = "se" - dna = "708" - //block = 13 New() ..() - block = DEAFBLOCK + fields = list("SE"=setblock(NULLED_SE, DEAFBLOCK, repeat_string(DNA_BLOCK_SIZE,"0"))) /obj/item/weapon/dnainjector/h2m name = "\improper DNA injector (Human > Monkey)" desc = "Will make you a flea bag." - dnatype = "se" - dna = "FA0" - block = 14 + New() + ..() + fields = list("SE"=setblock(NULLED_SE, RACEBLOCK, repeat_string(DNA_BLOCK_SIZE,"f"))) /obj/item/weapon/dnainjector/m2h name = "\improper DNA injector (Monkey > Human)" desc = "Will make you...less hairy." - dnatype = "se" - dna = "708" - block = 14 \ No newline at end of file + New() + ..() + fields = list("SE"=setblock(NULLED_SE, RACEBLOCK, repeat_string(DNA_BLOCK_SIZE,"0"))) \ No newline at end of file diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index abbc13a8b2a..3e88bd53eba 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -245,7 +245,7 @@ var/datum/controller/supply_shuttle/supply_shuttle = new() del(MA) if(plasma_count) - points += Floor(plasma_count / plasma_per_point) + points += round(plasma_count / plasma_per_point) //Buyin proc/buy() diff --git a/code/global.dm b/code/global.dm index 9a99a7ac518..97064e128b3 100644 --- a/code/global.dm +++ b/code/global.dm @@ -25,7 +25,11 @@ var/global/list/global_map = null ////////////// - +var/NEARSIGHTEDBLOCK = 0 +var/EPILEPSYBLOCK = 0 +var/COUGHBLOCK = 0 +var/TOURETTESBLOCK = 0 +var/NERVOUSBLOCK = 0 var/BLINDBLOCK = 0 var/DEAFBLOCK = 0 var/HULKBLOCK = 0 @@ -33,9 +37,15 @@ var/TELEBLOCK = 0 var/FIREBLOCK = 0 var/XRAYBLOCK = 0 var/CLUMSYBLOCK = 0 -var/FAKEBLOCK = 0 -var/BLOCKADD = 0 -var/DIFFMUT = 0 +var/STRANGEBLOCK = 0 +var/RACEBLOCK = 0 + +var/list/bad_se_blocks +var/list/good_se_blocks +var/list/op_se_blocks + +var/NULLED_SE +var/NULLED_UI var/skipupdate = 0 /////////////// diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 44757fef817..295cdd877ea 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -393,36 +393,7 @@ client/proc/one_click_antag() var/datum/preferences/A = new() A.copy_to(new_character) - new_character.dna.ready_dna(new_character) + ready_dna(new_character) new_character.key = G_found.key - return new_character -/* DEATH SQUADS -/datum/admins/proc/create_syndicate_death_commando(obj/spawn_location, syndicate_leader_selected = 0) - var/mob/living/carbon/human/new_syndicate_commando = new(spawn_location.loc) - var/syndicate_commando_leader_rank = pick("Lieutenant", "Captain", "Major") - var/syndicate_commando_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major") - var/syndicate_commando_name = pick(last_names) - - new_syndicate_commando.gender = pick(MALE, FEMALE) - - var/datum/preferences/A = new()//Randomize appearance for the commando. - A.randomize_appearance_for(new_syndicate_commando) - - new_syndicate_commando.real_name = "[!syndicate_leader_selected ? syndicate_commando_rank : syndicate_commando_leader_rank] [syndicate_commando_name]" - new_syndicate_commando.name = new_syndicate_commando.real_name - new_syndicate_commando.age = !syndicate_leader_selected ? rand(23,35) : rand(35,45) - - new_syndicate_commando.dna.ready_dna(new_syndicate_commando)//Creates DNA. - - //Creates mind stuff. - new_syndicate_commando.mind_initialize() - new_syndicate_commando.mind.assigned_role = "MODE" - new_syndicate_commando.mind.special_role = "Syndicate Commando" - - //Adds them to current traitor list. Which is really the extra antagonist list. - ticker.mode.traitors += new_syndicate_commando.mind - new_syndicate_commando.equip_syndicate_commando(syndicate_leader_selected) - - return new_syndicate_commando - */ \ No newline at end of file + return new_character diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index f55ed33c49b..56bbc795911 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -326,13 +326,9 @@ Traitors and the like can also be revived with the previous role mostly intact. //DNA if(record_found)//Pull up their name from database records if they did have a mind. - new_character.dna = new()//Let's first give them a new DNA. - new_character.dna.unique_enzymes = record_found.fields["b_dna"]//Enzymes are based on real name but we'll use the record for conformity. - new_character.dna.struc_enzymes = record_found.fields["enzymes"]//This is the default of enzymes so I think it's safe to go with. - new_character.dna.uni_identity = record_found.fields["identity"]//DNA identity is carried over. - updateappearance(new_character,new_character.dna.uni_identity)//Now we configure their appearance based on their unique identity, same as with a DNA machine or somesuch. + hardset_dna(new_character, record_found.fields["identity"], record_found.fields["enzymes"], record_found.fields["name"], null, record_found.fields["b_type"]) else//If they have no records, we just do a random DNA for them, based on their random appearance/savefile. - new_character.dna.ready_dna(new_character) + ready_dna(new_character) new_character.key = G_found.key diff --git a/code/modules/awaymissions/maploader/reader.dm b/code/modules/awaymissions/maploader/reader.dm index 13aef86f46d..427f1bdad59 100644 --- a/code/modules/awaymissions/maploader/reader.dm +++ b/code/modules/awaymissions/maploader/reader.dm @@ -88,7 +88,7 @@ dmm_suite{ } } //Construct attributes associative list - var/list/fields = new(0) + var/list/fields = list() for(var/index=1;index<=attributes.len;index++){ var/trim_left = trim_text(copytext(attributes[index],1,findtext(attributes[index],"="))) var/trim_right = trim_text(copytext(attributes[index],findtext(attributes[index],"=")+1,0)) @@ -164,7 +164,7 @@ dmm_suite{ } } //Construct attributes associative list - var/list/fields = new(0) + var/list/fields = list() for(var/index=1;index<=attributes.len;index++){ var/trim_left = trim_text(copytext(attributes[index],1,findtext(attributes[index],"="))) var/trim_right = trim_text(copytext(attributes[index],findtext(attributes[index],"=")+1,0)) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 2e2a9bbf1c4..04378d48110 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -47,17 +47,11 @@ datum/preferences var/underwear = "Nude" //underwear type var/backbag = 2 //backpack type var/h_style = "Bald" //Hair type - var/r_hair = 0 //Hair color - var/g_hair = 0 //Hair color - var/b_hair = 0 //Hair color + var/h_color = "000" //Hair color var/f_style = "Shaved" //Face hair type - var/r_facial = 0 //Face hair color - var/g_facial = 0 //Face hair color - var/b_facial = 0 //Face hair color - var/s_tone = 0 //Skin color - var/r_eyes = 0 //Eye color - var/g_eyes = 0 //Eye color - var/b_eyes = 0 //Eye color + var/f_color = "000" //Facial hair color + var/s_tone = "caucasian" //Skin color + var/eye_color = "000" //Eye color //Mob preview var/icon/preview_icon_front = null @@ -86,7 +80,7 @@ datum/preferences var/metadata = "" /datum/preferences/New(client/C) - b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") + b_type = random_blood_type() if(istype(C)) if(!IsGuestKey(C.key)) load_path(C.ckey) @@ -163,7 +157,7 @@ datum/preferences dat += "
" dat += "Blood Type: [b_type]
" - dat += "Skin Tone:
[-s_tone + 35]/220
" + dat += "Skin Tone:
    [s_tone]
" dat += "Underwear:
[underwear]
" dat += "Backpack:
[backbaglist[backbag]]
" @@ -173,7 +167,7 @@ datum/preferences dat += "

Hair Style

" dat += "[h_style]
" - dat += "    Change
" + dat += "    Change
" dat += "
" @@ -181,14 +175,14 @@ datum/preferences dat += "

Facial Hair Style

" dat += "[f_style]
" - dat += "    Change
" + dat += "    Change
" dat += "
" dat += "

Eye Color

" - dat += "    Change
" + dat += "    Change
" dat += "
" @@ -487,23 +481,17 @@ datum/preferences if("age") age = rand(AGE_MIN, AGE_MAX) if("hair") - r_hair = rand(0,255) - g_hair = rand(0,255) - b_hair = rand(0,255) + h_color = random_short_color() if("h_style") h_style = random_hair_style(gender) if("facial") - r_facial = rand(0,255) - g_facial = rand(0,255) - b_facial = rand(0,255) + f_color = random_short_color() if("f_style") f_style = random_facial_hair_style(gender) if("underwear") underwear = random_underwear(gender) if("eyes") - r_eyes = rand(0,255) - g_eyes = rand(0,255) - b_eyes = rand(0,255) + eye_color = random_eye_color() if("s_tone") s_tone = random_skin_tone() if("bag") @@ -531,11 +519,10 @@ datum/preferences metadata = sanitize(copytext(new_metadata,1,MAX_MESSAGE_LEN)) if("hair") - var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference") as color|null + var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference") as null|color if(new_hair) - r_hair = hex2num(copytext(new_hair, 2, 4)) - g_hair = hex2num(copytext(new_hair, 4, 6)) - b_hair = hex2num(copytext(new_hair, 6, 8)) + h_color = sanitize_hexcolor(new_hair) + if("h_style") var/new_h_style @@ -547,11 +534,9 @@ datum/preferences h_style = new_h_style if("facial") - var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference") as color|null + var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference") as null|color if(new_facial) - r_facial = hex2num(copytext(new_facial, 2, 4)) - g_facial = hex2num(copytext(new_facial, 4, 6)) - b_facial = hex2num(copytext(new_facial, 6, 8)) + f_color = sanitize_hexcolor(new_facial) if("f_style") var/new_f_style @@ -574,14 +559,12 @@ datum/preferences if("eyes") var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference") as color|null if(new_eyes) - r_eyes = hex2num(copytext(new_eyes, 2, 4)) - g_eyes = hex2num(copytext(new_eyes, 4, 6)) - b_eyes = hex2num(copytext(new_eyes, 6, 8)) + eye_color = sanitize_hexcolor(new_eyes) if("s_tone") - var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference") as num|null + var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in skin_tones if(new_s_tone) - s_tone = 35 - max(min( round(new_s_tone), 220),1) + s_tone = new_s_tone if("ooccolor") var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference") as color|null @@ -680,17 +663,9 @@ datum/preferences character.age = age character.b_type = b_type - character.r_eyes = r_eyes - character.g_eyes = g_eyes - character.b_eyes = b_eyes - - character.r_hair = r_hair - character.g_hair = g_hair - character.b_hair = b_hair - - character.r_facial = r_facial - character.g_facial = g_facial - character.b_facial = b_facial + character.eye_color = eye_color + character.h_color = h_color + character.f_color = f_color character.s_tone = s_tone character.h_style = h_style diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 90551a2dcb7..b079a33ece1 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -160,19 +160,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["name_is_always_random"] >> be_random_name S["gender"] >> gender S["age"] >> age - //colors to be consolidated into hex strings (requires some work with dna code) - S["hair_red"] >> r_hair - S["hair_green"] >> g_hair - S["hair_blue"] >> b_hair - S["facial_red"] >> r_facial - S["facial_green"] >> g_facial - S["facial_blue"] >> b_facial + S["hair_color"] >> h_color + S["facial_hair_color"] >> f_color + S["eye_color"] >> eye_color S["skin_tone"] >> s_tone S["hair_style_name"] >> h_style S["facial_style_name"] >> f_style - S["eyes_red"] >> r_eyes - S["eyes_green"] >> g_eyes - S["eyes_blue"] >> b_eyes S["underwear"] >> underwear S["backbag"] >> backbag @@ -207,16 +200,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car f_style = sanitize_inlist(f_style, facial_hair_styles_female_list) underwear = sanitize_inlist(underwear, underwear_f) age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age)) - r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair)) - g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair)) - b_hair = sanitize_integer(b_hair, 0, 255, initial(b_hair)) - r_facial = sanitize_integer(r_facial, 0, 255, initial(r_facial)) - g_facial = sanitize_integer(g_facial, 0, 255, initial(g_facial)) - b_facial = sanitize_integer(b_facial, 0, 255, initial(b_facial)) - s_tone = sanitize_integer(s_tone, -185, 34, initial(s_tone)) - r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes)) - g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes)) - b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes)) + h_color = sanitize_hexcolor(h_color, 3, 0) + f_color = sanitize_hexcolor(f_color, 3, 0) + eye_color = sanitize_hexcolor(eye_color, 3, 0) + s_tone = sanitize_inlist(s_tone, skin_tones) backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag)) userandomjob = sanitize_integer(userandomjob, 0, 1, initial(userandomjob)) @@ -246,18 +233,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["name_is_always_random"] << be_random_name S["gender"] << gender S["age"] << age - S["hair_red"] << r_hair - S["hair_green"] << g_hair - S["hair_blue"] << b_hair - S["facial_red"] << r_facial - S["facial_green"] << g_facial - S["facial_blue"] << b_facial + S["hair_color"] << h_color + S["facial_hair_color"] << f_color + S["eye_color"] << eye_color S["skin_tone"] << s_tone S["hair_style_name"] << h_style S["facial_style_name"] << f_style - S["eyes_red"] << r_eyes - S["eyes_green"] << g_eyes - S["eyes_blue"] << b_eyes S["underwear"] << underwear S["backbag"] << backbag diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 8e321b098ad..ed54cc8f403 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -168,10 +168,10 @@ if(!istype(user)) return mob = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty") mob2 = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty2") - mob.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD) - mob2.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD) + mob.Blend("#[user.h_color]", ICON_ADD) + mob2.Blend("#[user.h_color]", ICON_ADD) var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner") var/icon/earbit2 = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner2") mob.Blend(earbit, ICON_OVERLAY) - mob2.Blend(earbit2, ICON_OVERLAY) \ No newline at end of file + mob2.Blend(earbit2, ICON_OVERLAY) diff --git a/code/modules/detectivework/detective_work.dm b/code/modules/detectivework/detective_work.dm index 5bd530db1cc..f648654900b 100644 --- a/code/modules/detectivework/detective_work.dm +++ b/code/modules/detectivework/detective_work.dm @@ -89,11 +89,7 @@ atom/proc/add_fibers(mob/living/carbon/human/M) //Now, lets get to the dirty work. //First, make sure their DNA makes sense. var/mob/living/carbon/human/H = M - if(!istype(H.dna, /datum/dna) || !H.dna.uni_identity || (length(H.dna.uni_identity) != 32)) - if(!istype(H.dna, /datum/dna)) - H.dna = new /datum/dna(null) - H.dna.real_name = H.real_name - H.check_dna() + check_dna_integrity(H) //sets up dna and its variables if it was missing somehow //Now, deal with gloves. if(!ignoregloves) diff --git a/code/modules/events/ninja.dm b/code/modules/events/ninja.dm index e827699554a..f0a6961d936 100644 --- a/code/modules/events/ninja.dm +++ b/code/modules/events/ninja.dm @@ -347,7 +347,7 @@ ________________________________________________________________________________ var/datum/preferences/A = new()//Randomize appearance for the ninja. A.real_name = "[pick(ninja_titles)] [pick(ninja_names)]" A.copy_to(new_ninja) - new_ninja.dna.ready_dna(new_ninja) + ready_dna(new_ninja) new_ninja.equip_space_ninja() return new_ninja diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 643c300d02e..10f3d883186 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -744,21 +744,9 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) // -- End mode specific stuff podman.gender = ghost.gender - if(podman.gender in list(NEUTER, PLURAL)) //Sanity check, which should never actually happen. - podman.gender = pick(MALE,FEMALE) - if(!podman.dna) - podman.dna = new /datum/dna() - podman.dna.real_name = podman.real_name - if(ui) - podman.dna.uni_identity = ui - updateappearance(podman, ui) - if(se) - podman.dna.struc_enzymes = se - if(!prob(potency)) //if it fails, plantman! - if(podman.dna) - podman.dna.mutantrace = "plant" - podman.update_mutantrace() + //dna stuff + hardset_dna(podman, ui, se, null, !prob(potency) ? "plant" : null) //makes sure podman has dna and sets the dna's ui/se/mutantrace/real_name etc variables else //else, one packet of seeds. maybe two var/seed_count = 1 diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index 5f50e4f06b5..d0c60fb4609 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -13,8 +13,7 @@ animation.icon = 'icons/mob/mob.dmi' animation.master = src -// flick("gibbed-m", animation) - gibs(loc, viruses, dna) + gibs(loc, viruses) dead_mob_list -= src spawn(15) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 8cc8dc27555..c01f0f5174b 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -170,12 +170,6 @@ move_delay_add = min(move_delay_add + round(amount / 2), 10) // a maximum delay of 10 return -/mob/living/carbon/alien/getDNA() - return null - -/mob/living/carbon/alien/setDNA() - return - /*---------------------------------------- Proc: AddInfectionImages() Des: Gives the client of the alien an image on each infected mob. diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index e1a3d2ad2ab..84abccad38d 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -204,15 +204,6 @@ /mob/living/carbon/proc/eyecheck() return 0 -// ++++ROCKDTBEN++++ MOB PROCS -- Ask me before touching. -// Stop! ... Hammertime! ~Carn - -/mob/living/carbon/proc/getDNA() - return dna - -/mob/living/carbon/proc/setDNA(var/datum/dna/newDNA) - dna = newDNA - // ++++ROCKDTBEN++++ MOB PROCS //END /mob/living/carbon/proc/handle_ventcrawl() // -- TLE -- Merged by Carn diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 2e0b944a659..5f41f4c3cda 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -13,4 +13,6 @@ //inventory slots var/obj/item/back = null var/obj/item/clothing/mask/wear_mask = null - var/obj/item/weapon/tank/internal = null \ No newline at end of file + var/obj/item/weapon/tank/internal = null + + var/datum/dna/dna = null//Carbon diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 98b77320494..9f5d7b02f24 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -18,15 +18,11 @@ reagents = R R.my_atom = src - if(!dna) - dna = new /datum/dna(null) - //initialise organs organs = newlist(/datum/limb/chest, /datum/limb/head, /datum/limb/l_arm, /datum/limb/r_arm, /datum/limb/r_leg, /datum/limb/l_leg) for(var/datum/limb/O in organs) O.owner = src - internal_organs += new /obj/item/organ/appendix internal_organs += new /obj/item/organ/heart internal_organs += new /obj/item/organ/brain @@ -36,12 +32,6 @@ ..() - if(dna) - dna.real_name = real_name - - prev_gender = gender // Debug for plural genders - - /mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes) if ((!( yes ) || now_pushing)) return @@ -586,11 +576,6 @@ return 0 - -/mob/living/carbon/human/proc/check_dna() - dna.check_integrity(src) - - /mob/living/carbon/human/proc/play_xylophone() if(!src.xylophone) visible_message("[src] begins playing \his ribcage like a xylophone. It's quite spooky.","You begin to play a spooky refrain on your ribcage.","You hear a spooky xylophone melody.") diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 1034ca23104..3cb7acc54ac 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -1,22 +1,16 @@ /mob/living/carbon/human //Hair colour and style - var/r_hair = 0 - var/g_hair = 0 - var/b_hair = 0 + var/h_color = "000" var/h_style = "Bald" //Facial hair colour and style - var/r_facial = 0 - var/g_facial = 0 - var/b_facial = 0 + var/f_color = "000" var/f_style = "Shaved" //Eye colour - var/r_eyes = 0 - var/g_eyes = 0 - var/b_eyes = 0 + var/eye_color = "000" - var/s_tone = 0 //Skin tone + var/s_tone = "caucasian" //Skin tone var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 37b538b4d28..e001ab7eeeb 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -211,19 +211,17 @@ Please contact me on #coderbus IRC. ~Carn x //Skin tone if(!skeleton) - if(s_tone >= 0) - stand_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD) - lying_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD) - else - stand_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) - lying_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) + var/color = skin_tones[s_tone] + if(color) + color = "#" + color + stand_icon.Blend(color, ICON_MULTIPLY) + lying_icon.Blend(color, ICON_MULTIPLY) //Eyes - if(!skeleton) var/icon/eyes_s = new/icon('icons/mob/human_face.dmi', "eyes_s") var/icon/eyes_l = new/icon('icons/mob/human_face.dmi', "eyes_l") - eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) - eyes_l.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) + eyes_s.Blend("#[eye_color]", ICON_ADD) + eyes_l.Blend("#[eye_color]", ICON_ADD) stand_icon.Blend(eyes_s, ICON_OVERLAY) lying_icon.Blend(eyes_l, ICON_OVERLAY) @@ -264,8 +262,8 @@ Please contact me on #coderbus IRC. ~Carn x if(facial_hair_style) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") var/icon/facial_l = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_l") - facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) - facial_l.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) + facial_s.Blend("#[f_color]", ICON_ADD) + facial_l.Blend("#[f_color]", ICON_ADD) face_standing.Blend(facial_s, ICON_OVERLAY) face_lying.Blend(facial_l, ICON_OVERLAY) @@ -280,8 +278,8 @@ Please contact me on #coderbus IRC. ~Carn x if(hair_style) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") var/icon/hair_l = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_l") - hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) - hair_l.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) + hair_s.Blend("#[h_color]", ICON_ADD) + hair_l.Blend("#[h_color]", ICON_ADD) face_standing.Blend(hair_s, ICON_OVERLAY) face_lying.Blend(hair_l, ICON_OVERLAY) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index e5819e1de83..d892cc8ed4f 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -21,23 +21,7 @@ if(name == "monkey") name = text("monkey ([rand(1, 1000)])") real_name = name - if (!(dna)) - if(gender == NEUTER) - gender = pick(MALE, FEMALE) - dna = new /datum/dna( null ) - dna.real_name = real_name - dna.uni_identity = "00600200A00E0110148FC01300B009" - dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8" - dna.unique_enzymes = md5(name) - //////////blah - var/gendervar - if (gender == MALE) - gendervar = add_zero2(num2hex((rand(1,2049)),1), 3) - else - gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3) - dna.uni_identity += gendervar - dna.uni_identity += "12C" - dna.uni_identity += "4E2" + gender = pick(MALE, FEMALE) ..() diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index dc3bd9d0f60..d97e8c1f691 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -367,15 +367,17 @@ "} return dat -/mob/living/silicon/pai/proc/CheckDNA(var/mob/M, var/mob/living/silicon/pai/P) +/mob/living/silicon/pai/proc/CheckDNA(mob/living/carbon/M, mob/living/silicon/pai/P) var/answer = input(M, "[P] is requesting a DNA sample from you. Will you allow it to confirm your identity?", "[P] Check DNA", "No") in list("Yes", "No") if(answer == "Yes") var/turf/T = get_turf_or_move(P.loc) for (var/mob/v in viewers(T)) v.show_message("\blue [M] presses \his thumb against [P].", 3, "\blue [P] makes a sharp clicking sound as it extracts DNA material from [M].", 2) - var/datum/dna/dna = M.dna - P << "

[M]'s UE string : [dna.unique_enzymes]

" - if(dna.unique_enzymes == P.master_dna) + if(!check_dna_integrity(M)) + P << "No DNA detected" + return + P << "

[M]'s UE string : [M.dna.unique_enzymes]

" + if(M.dna.unique_enzymes == P.master_dna) P << "DNA is a match to stored Master DNA." else P << "DNA does not match stored Master DNA." diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index a2afe2c03f2..b5d143a9c45 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -87,19 +87,10 @@ var/next_mob_id = 0 if(I && istype(I)) //The istype is necessary for things like bodybags which are structures that do not have an attack() proc. I.attack(src, user) - -/mob/proc/findname(msg) - for(var/mob/M in mob_list) - if (M.real_name == text("[]", msg)) - return M - return 0 - /mob/proc/movement_delay() return 0 /mob/proc/Life() -// if(organStructure) -// organStructure.ProcessOrgans() return /mob/proc/get_item_by_slot(slot_id) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 184b3271c19..791ae20269b 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -126,8 +126,6 @@ var/const/deafness = 2//Carbon var/const/muteness = 4//Carbon - - var/datum/dna/dna = null//Carbon var/radiation = 0.0//Carbon var/list/mutations = list() //Carbon -- Doohl diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 684dff518e4..2198c13a243 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -269,9 +269,11 @@ It's fairly easy to fix if dealing with single letters but not so much with comp /proc/findname(msg) + if(!istext(msg)) + msg = "[msg]" for(var/mob/M in mob_list) - if (M.real_name == text("[msg]")) - return 1 + if(M.real_name == msg) + return M return 0 diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index 01ac7bf2860..7d1907c74ef 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -40,8 +40,12 @@ M.name = src.name M.real_name = src.real_name - if(src.dna) - M.dna = src.dna + if(check_dna_integrity(src) && istype(M, /mob/living/carbon)) + var/mob/living/carbon/C = src + var/mob/living/carbon/D = M + D.dna = C.dna + else + ready_dna(M) if(mind) mind.transfer_to(M) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index f3d113d7025..27d4d5d80c0 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -324,8 +324,8 @@ mind.transfer_to(new_character) //won't transfer key since the mind is not active new_character.name = real_name - new_character.dna.ready_dna(new_character) - new_character.dna.b_type = client.prefs.b_type + + ready_dna(new_character, client.prefs.b_type) new_character.key = key //Manually transfer the key to log them in diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 8a36c953e74..d4447280d2a 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -9,122 +9,12 @@ datum/preferences s_tone = random_skin_tone() h_style = random_hair_style(gender) f_style = random_facial_hair_style(gender) - randomize_hair_color("hair") - randomize_hair_color("facial") - randomize_eyes_color() + h_color = random_short_color() + f_color = h_color + eye_color = random_eye_color() backbag = 2 age = rand(AGE_MIN,AGE_MAX) - - proc/randomize_hair_color(var/target = "hair") - if(prob (75) && target == "facial") // Chance to inherit hair color - r_facial = r_hair - g_facial = g_hair - b_facial = b_hair - return - - var/red - var/green - var/blue - - var/col = pick ("blonde", "black", "chestnut", "copper", "brown", "wheat", "old", "punk") - switch(col) - if("blonde") - red = 255 - green = 255 - blue = 0 - if("black") - red = 0 - green = 0 - blue = 0 - if("chestnut") - red = 153 - green = 102 - blue = 51 - if("copper") - red = 255 - green = 153 - blue = 0 - if("brown") - red = 102 - green = 51 - blue = 0 - if("wheat") - red = 255 - green = 255 - blue = 153 - if("old") - red = rand (100, 255) - green = red - blue = red - if("punk") - red = rand (0, 255) - green = rand (0, 255) - blue = rand (0, 255) - - red = max(min(red + rand (-25, 25), 255), 0) - green = max(min(green + rand (-25, 25), 255), 0) - blue = max(min(blue + rand (-25, 25), 255), 0) - - switch(target) - if("hair") - r_hair = red - g_hair = green - b_hair = blue - if("facial") - r_facial = red - g_facial = green - b_facial = blue - - proc/randomize_eyes_color() - var/red - var/green - var/blue - - var/col = pick ("black", "grey", "brown", "chestnut", "blue", "lightblue", "green", "albino") - switch(col) - if("black") - red = 0 - green = 0 - blue = 0 - if("grey") - red = rand (100, 200) - green = red - blue = red - if("brown") - red = 102 - green = 51 - blue = 0 - if("chestnut") - red = 153 - green = 102 - blue = 0 - if("blue") - red = 51 - green = 102 - blue = 204 - if("lightblue") - red = 102 - green = 204 - blue = 255 - if("green") - red = 0 - green = 102 - blue = 0 - if("albino") - red = rand (200, 255) - green = rand (0, 150) - blue = rand (0, 150) - - red = max(min(red + rand (-25, 25), 255), 0) - green = max(min(green + rand (-25, 25), 255), 0) - blue = max(min(blue + rand (-25, 25), 255), 0) - - r_eyes = red - g_eyes = green - b_eyes = blue - - proc/update_preview_icon() //seriously. This is horrendous. del(preview_icon_front) del(preview_icon_side) @@ -136,10 +26,7 @@ datum/preferences preview_icon = new /icon('icons/mob/human.dmi', "body_[g]_s") // Skin tone - if (s_tone >= 0) - preview_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD) - else - preview_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) + preview_icon.Blend("#[skin_tones[s_tone]]", ICON_MULTIPLY) if(underwear) var/datum/sprite_accessory/underwear/U = underwear_all[underwear] @@ -147,18 +34,18 @@ datum/preferences preview_icon.Blend(new /icon(U.icon, "[U.icon_state]_s"), ICON_OVERLAY) var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes_s") - eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) + eyes_s.Blend("#[eye_color]", ICON_ADD) var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] if(hair_style) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) + hair_s.Blend("#[h_color]", ICON_ADD) eyes_s.Blend(hair_s, ICON_OVERLAY) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] if(facial_hair_style) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") - facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) + facial_s.Blend("#[f_color]", ICON_ADD) eyes_s.Blend(facial_s, ICON_OVERLAY) var/icon/clothes_s = null diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 3eeb5685334..dc14043b5e9 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -26,9 +26,7 @@ O.name = "monkey" O.dna = dna dna = null - O.dna.uni_identity = "00600200A00E0110148FC01300B009" - //O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8" - O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*13)]BB8" + O.dna.struc_enzymes = setblock(O.dna.struc_enzymes, RACEBLOCK, construct_block(BAD_MUTATION_DIFFICULTY,BAD_MUTATION_DIFFICULTY)) O.loc = loc O.viruses = viruses viruses = list() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 728ad546191..82defac7c71 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -59,7 +59,8 @@ M << "Your meaty finger is much too large for the trigger guard!" return if(ishuman(user)) - if(user.dna && user.dna.mutantrace == "adamantine") + var/mob/living/carbon/human/H = user + if(H.dna && H.dna.mutantrace == "adamantine") user << "Your metal fingers don't fit in the trigger guard!" return diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 1d30005f0b1..f0da51b9224 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -78,8 +78,8 @@ flag = "energy" on_hit(var/atom/target, var/blocked = 0) - var/mob/living/M = target - if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //Plantmen possibly get mutated and damaged by the rays. + var/mob/living/carbon/M = target + if(check_dna_integrity(M) && M.dna.mutantrace == "plant") //Plantmen possibly get mutated and damaged by the rays. if(prob(15)) M.apply_effect((rand(30,80)),IRRADIATE) M.Weaken(5) @@ -99,12 +99,10 @@ M.show_message("\red The radiation beam singes you!") // for (var/mob/V in viewers(src)) // V.show_message("\red [M] is singed by the radiation beam.", 3, "\red You hear the crackle of burning leaves.", 2) - else if(istype(target, /mob/living/carbon/)) + else // for (var/mob/V in viewers(src)) // V.show_message("The radiation beam dissipates harmlessly through [M]", 3) M.show_message("\blue The radiation beam dissipates harmlessly through your body.") - else - return 1 /obj/item/projectile/energy/florayield name = "beta somatoray" @@ -114,13 +112,12 @@ nodamage = 1 flag = "energy" - on_hit(var/atom/target, var/blocked = 0) - var/mob/M = target - if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //These rays make plantmen fat. - if(M.nutrition < 500) //sanity check - M.nutrition += 30 - else if (istype(target, /mob/living/carbon/)) - M.show_message("\blue The radiation beam dissipates harmlessly through your body.") + on_hit(mob/living/carbon/target, var/blocked = 0) + if(iscarbon(target)) + if(ishuman(target) && target.dna && target.dna.mutantrace == "plant") //These rays make plantmen fat. + target.nutrition = min(target.nutrition+30, 500) + else + target.show_message("\blue The radiation beam dissipates harmlessly through your body.") else return 1 diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 5ec92710f7a..b4e2aa455c5 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1302,21 +1302,19 @@ datum color = "#13BC5E" // rgb: 19, 188, 94 toxpwr = 0 - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + reaction_mob(var/mob/living/carbon/M, var/method=TOUCH, var/volume) if(!..()) return - if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this. + if(!istype(M) || !M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this. src = null if((method==TOUCH && prob(33)) || method==INGEST) randmuti(M) - if(prob(98)) - randmutb(M) - else - randmutg(M) + if(prob(98)) randmutb(M) + else randmutg(M) domutcheck(M, null) - updateappearance(M,M.dna.uni_identity) + updateappearance(M) return - on_mob_life(var/mob/living/M as mob) - if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this. + on_mob_life(var/mob/living/carbon/M) + if(!istype(M)) return if(!M) M = holder.my_atom M.apply_effect(10,IRRADIATE,0) ..() diff --git a/code/unused/dna_mutations.dm b/code/unused/dna_mutations.dm index 205798cd6ff..b03fb6257ea 100644 --- a/code/unused/dna_mutations.dm +++ b/code/unused/dna_mutations.dm @@ -94,8 +94,8 @@ mob/verb/checkmuts() src << "Required ID: [R.reqID]" src << "" -mob/verb/editSE(t as text) - src:dna:struc_enzymes = t +mob/living/carbon/verb/editSE(t as text) + dna.struc_enzymes = t domutcheck(src) */ diff --git a/code/unused/pda2/base_program.dm b/code/unused/pda2/base_program.dm index f5c11efc077..ab06e16f806 100644 --- a/code/unused/pda2/base_program.dm +++ b/code/unused/pda2/base_program.dm @@ -9,7 +9,7 @@ name = "record" extension = "REC" - var/list/fields = list( ) + var/list/fields = list() //base pda program diff --git a/code/unused/specops.dm b/code/unused/specops.dm index 1c8cc989c92..1c267f2172f 100644 --- a/code/unused/specops.dm +++ b/code/unused/specops.dm @@ -111,7 +111,7 @@ var/global/sent_strike_team = 0 A.real_name = "[!leader_selected ? commando_rank : A.copy_to(new_commando) - new_commando.dna.ready_dna(new_commando)//Creates DNA. + ready_dna(new_commando) //Creates mind stuff. new_commando.mind_initialize() diff --git a/code/unused/tensioner.dm b/code/unused/tensioner.dm index eba4083ea96..064b1629353 100644 --- a/code/unused/tensioner.dm +++ b/code/unused/tensioner.dm @@ -768,7 +768,7 @@ var/global/datum/tension/tension_master var/datum/preferences/A = new() A.copy_to(new_character) - new_character.dna.ready_dna(new_character) + ready_dna(new_character) new_character.key = G_found.key return new_character @@ -787,8 +787,7 @@ var/global/datum/tension/tension_master A.real_name = "[syndicate_commando_rank] [syndicate_commano_name]" A.copy_to(new_syndicate_commando) - - new_syndicate_commando.dna.ready_dna(new_syndicate_commando)//Creates DNA. + ready_dna(new_syndicate_commando) //Creates mind stuff. new_syndicate_commando.mind_initialize() diff --git a/code/world.dm b/code/world.dm index 758585776a2..c7fa563a996 100644 --- a/code/world.dm +++ b/code/world.dm @@ -10,10 +10,10 @@ /world/New() //logs var/date_string = time2text(world.realtime, "YYYY/MM-Month/DD-Day") - if(revdata && istext(revdata.revision) && length(revdata.revision)>7) - log = file("data/logs/runtime/[copytext(revdata.revision,1,8)].log") - else - log = file("data/logs/runtime/[time2text(world.realtime,"YYYY-MM")].log") //funtimelog +// if(revdata && istext(revdata.revision) && length(revdata.revision)>7) +// log = file("data/logs/runtime/[copytext(revdata.revision,1,8)].log") +// else +// log = file("data/logs/runtime/[time2text(world.realtime,"YYYY-MM")].log") //funtimelog href_logfile = file("data/logs/[date_string] hrefs.htm") diary = file("data/logs/[date_string].log") diaryofmeanpeople = file("data/logs/[date_string] Attack.log") diff --git a/html/changelog.html b/html/changelog.html index 777bf011407..632ec3e1fff 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -49,8 +49,13 @@ should be listed in the changelog upon commit tho. Thanks. --> - - +
+

24 April 2013

+

Carnie updated:

+
    +
  • DNA reworked: All SE blocks are randomised. DNA-modifier emitter strength affects the size of the change in the hex-character hit. Emitter duration makes it more likely to hit the character you click on. Almost all DNA-modifier functions are on one screen.
    Balancing -will- be off a bit. Is getting halk to hard/easy? Please report bugs/balancing issues/concerns here: http://forums.nanotrasen.com/viewtopic.php?f=15&t=13083 <3
  • +
+

26 April 2013

@@ -96,7 +101,7 @@ should be listed in the changelog upon commit tho. Thanks. -->
  • Stun batons/prods now work off power cells, which can be removed and replaced! Use a screwdriver to remove the battery.
  • - +

    17 April 2013

    @@ -105,7 +110,7 @@ should be listed in the changelog upon commit tho. Thanks. -->
  • If the configuration option is enabled, AIs and or Cyborgs will not be able to communicate vocally. This means they cannot talk normally and need to use alternative methods to do so
  • - +

    10 April 2013

    @@ -118,7 +123,7 @@ should be listed in the changelog upon commit tho. Thanks. -->
  • NT bluespace engineers have ironed-out that little issue with the teleporter occasionally malfunctioning and dropping users into deep space. Please note, however, that bluespace teleporters are still sensitive experimental technology, and should be Test Fired before use to ensure proper function.
  • - +

    9 April 2013

    diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index afac50b3dc7..2edfe8382e8 100644 Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ diff --git a/maps/tgstation.2.1.2.dmm b/maps/tgstation.2.1.2.dmm index bda614b520e..7694ed75065 100644 --- a/maps/tgstation.2.1.2.dmm +++ b/maps/tgstation.2.1.2.dmm @@ -99,7 +99,7 @@ "abU" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/red,/turf/simulated/floor/carpet,/area/security/hos) "abV" = (/obj/item/weapon/stamp/hos,/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/security/hos) "abW" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/security/hos) -"abX" = (/obj/structure/table/woodentable,/obj/item/device/radio/off,/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/turf/simulated/floor/carpet,/area/security/hos) +"abX" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/item/device/radio/off,/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) "abY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/security/main) "abZ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/security/main) "aca" = (/turf/simulated/wall/r_wall,/area/security/main) @@ -267,7 +267,7 @@ "afg" = (/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/brig) "afh" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/warden) "afi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/closet/secure_closet/warden,/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) -"afj" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/item/device/radio/off,/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) +"afj" = (/obj/structure/table/woodentable,/obj/item/device/radio/off,/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/turf/simulated/floor/carpet,/area/security/hos) "afk" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/book/manual/security_space_law{pixel_x = -3; pixel_y = 5},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) "afl" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) "afm" = (/obj/machinery/light_switch{pixel_x = 24},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) @@ -911,7 +911,7 @@ "arA" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/machinery/light{dir = 1},/obj/item/weapon/hand_labeler,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "arB" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/item/clothing/head/welding,/obj/machinery/atmospherics/pipe/manifold{color = "red"; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/ai_monitored/storage/eva) "arC" = (/obj/machinery/power/apc{dir = 1; name = "EVA APC"; pixel_x = 3; pixel_y = 23},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/ai_monitored/storage/eva) -"arD" = (/obj/machinery/alarm{pixel_y = 23},/obj/item/device/radio/off,/obj/item/device/assembly/timer,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/ai_monitored/storage/eva) +"arD" = (/obj/structure/table,/obj/item/device/radio/off{pixel_y = 6},/obj/item/device/radio/off{pixel_x = 6; pixel_y = 4},/obj/item/device/radio/off{pixel_x = -6; pixel_y = 4},/obj/item/device/radio/off,/turf/simulated/floor,/area/gateway) "arE" = (/obj/structure/table,/obj/item/weapon/cable_coil{pixel_x = 3; pixel_y = -7},/obj/machinery/cell_charger,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "arF" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/weapon/screwdriver{pixel_y = 16},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "arG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/sign/securearea{pixel_y = 32},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) @@ -973,7 +973,7 @@ "asK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_access_txt = "18"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/ai_monitored/storage/eva) "asL" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor,/area/ai_monitored/storage/eva) "asM" = (/turf/simulated/floor,/area/ai_monitored/storage/eva) -"asN" = (/obj/structure/table,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor,/turf/simulated/floor,/area/ai_monitored/storage/eva) +"asN" = (/obj/machinery/alarm{pixel_y = 23},/obj/item/device/radio/off,/obj/item/device/assembly/timer,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/ai_monitored/storage/eva) "asO" = (/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore) "asP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/fsmaint) "asQ" = (/obj/machinery/door/airlock{id_tag = "Dorm2"; name = "Dorm 2"},/turf/simulated/floor,/area/crew_quarters/sleep) @@ -1213,7 +1213,7 @@ "axq" = (/obj/machinery/camera{c_tag = "Gateway"; dir = 4; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/table,/obj/structure/sign/biohazard{pixel_x = -32},/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor,/area/gateway) "axr" = (/obj/structure/table,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor,/area/gateway) "axs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/gateway) -"axt" = (/obj/structure/table,/obj/item/device/radio/off{pixel_y = 6},/obj/item/device/radio/off{pixel_x = 6; pixel_y = 4},/obj/item/device/radio/off{pixel_x = -6; pixel_y = 4},/obj/item/device/radio/off,/turf/simulated/floor,/area/gateway) +"axt" = (/obj/structure/table,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor,/turf/simulated/floor,/area/ai_monitored/storage/eva) "axu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/table,/obj/machinery/recharger,/obj/structure/sign/biohazard{pixel_x = 32},/turf/simulated/floor,/area/gateway) "axv" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "axw" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva) @@ -2594,7 +2594,7 @@ "aXT" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/stool/bed/chair,/turf/simulated/floor/wood,/area/crew_quarters/captain) "aXU" = (/turf/simulated/floor/carpet,/area/crew_quarters/captain) "aXV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/captain) -"aXW" = (/obj/structure/table/woodentable,/obj/machinery/camera{c_tag = "Captain's Office"; dir = 8},/obj/item/weapon/storage/lockbox/medal{pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/captain) +"aXW" = (/obj/item/weapon/screwdriver{pixel_y = 10},/obj/machinery/light{dir = 4},/obj/item/device/radio/off,/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/checkpoint/supply) "aXX" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) "aXY" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Stbd"; location = "HOP"},/turf/simulated/floor,/area/hallway/primary/central) "aXZ" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor,/area/hallway/primary/starboard) @@ -2731,7 +2731,7 @@ "baA" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Captain's Desk"; departmentType = 5; name = "Captain RC"; pixel_x = -30; pixel_y = 0},/obj/structure/filingcabinet,/turf/simulated/floor/wood,/area/crew_quarters/captain) "baB" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/obj/effect/landmark/start{name = "Captain"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/wood,/area/crew_quarters/captain) "baC" = (/obj/machinery/computer/communications,/turf/simulated/floor/wood,/area/crew_quarters/captain) -"baD" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/coin/silver,/turf/simulated/floor/wood,/area/crew_quarters/captain) +"baD" = (/obj/item/weapon/screwdriver{pixel_y = 10},/obj/item/device/radio/off,/turf/simulated/floor{icon_state = "red"},/area/security/checkpoint/science) "baE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/crew_quarters/captain) "baF" = (/obj/structure/table/woodentable,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/item/device/camera,/obj/item/weapon/storage/photo_album{pixel_y = -10},/turf/simulated/floor/wood,/area/crew_quarters/captain) "baG" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/hallway/primary/central) @@ -3050,7 +3050,7 @@ "bgH" = (/obj/structure/stool/bed/chair/office/light{dir = 1},/obj/structure/sign/nosmoking_2{pixel_x = 28},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bgI" = (/obj/structure/closet/secure_closet/security/med,/turf/simulated/floor{icon_state = "red"; dir = 10},/area/security/checkpoint/medical) "bgJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "red"},/area/security/checkpoint/medical) -"bgK" = (/obj/machinery/light_switch{pixel_x = 28; pixel_y = 0},/obj/item/weapon/screwdriver{pixel_y = 10},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/device/radio/off,/turf/simulated/floor{icon_state = "red"; dir = 6},/area/security/checkpoint/medical) +"bgK" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/coin/silver,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bgL" = (/obj/structure/table,/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue) "bgM" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue) "bgN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light_switch{pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue) @@ -3693,7 +3693,7 @@ "bta" = (/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "63"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/security/checkpoint/supply) "btb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/checkpoint/supply) "btc" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/security/checkpoint/supply) -"btd" = (/obj/item/weapon/screwdriver{pixel_y = 10},/obj/machinery/light{dir = 4},/obj/item/device/radio/off,/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/checkpoint/supply) +"btd" = (/obj/structure/table/woodentable,/obj/machinery/camera{c_tag = "Captain's Office"; dir = 8},/obj/item/weapon/storage/lockbox/medal{pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bte" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central) "btf" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AIW"; location = "QM"},/turf/simulated/floor,/area/hallway/primary/central) "btg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/central) @@ -3809,7 +3809,7 @@ "bvm" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "dark"},/area/toxins/server) "bvn" = (/obj/item/device/radio/intercom{pixel_x = -25},/obj/structure/filingcabinet,/turf/simulated/floor{icon_state = "red"; dir = 10},/area/security/checkpoint/science) "bvo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/power/apc{dir = 2; name = "Science Security APC"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor{icon_state = "red"},/area/security/checkpoint/science) -"bvp" = (/obj/item/weapon/screwdriver{pixel_y = 10},/obj/item/device/radio/off,/turf/simulated/floor{icon_state = "red"},/area/security/checkpoint/science) +"bvp" = (/obj/machinery/light_switch{pixel_x = 28; pixel_y = 0},/obj/item/weapon/screwdriver{pixel_y = 10},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/device/radio/off,/turf/simulated/floor{icon_state = "red"; dir = 6},/area/security/checkpoint/medical) "bvq" = (/obj/machinery/computer/secure_data,/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_y = -30},/turf/simulated/floor{icon_state = "red"},/area/security/checkpoint/science) "bvr" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "red"; dir = 6},/area/security/checkpoint/science) "bvs" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/security/checkpoint/science) @@ -5007,7 +5007,7 @@ "bSo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 1; icon_state = "caution"},/area/engine/break_room) "bSp" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "caution"; dir = 5},/area/engine/break_room) "bSq" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/wall,/area/security/checkpoint/engineering) -"bSr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/weapon/screwdriver{pixel_y = 10},/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "Engineering"; name = "Engineering Lockdown"; pixel_x = -24; pixel_y = -6; req_access_txt = "10"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/item/device/radio/off,/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/checkpoint/engineering) +"bSr" = (/obj/structure/table,/obj/item/device/radio/off,/turf/simulated/floor{icon_state = "yellow"; dir = 10},/area/tcommsat/computer) "bSs" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/security/checkpoint/engineering) "bSt" = (/obj/machinery/camera{c_tag = "Security Post - Engineering"; dir = 8; network = list("SS13")},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/checkpoint/engineering) "bSu" = (/obj/structure/sign/nosmoking_2,/turf/simulated/wall,/area/atmos) @@ -5210,7 +5210,7 @@ "bWj" = (/obj/machinery/telecomms/bus/preset_one,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bWk" = (/obj/machinery/telecomms/server/presets/science,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bWl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/computer) -"bWm" = (/obj/structure/table,/obj/item/device/radio/off,/turf/simulated/floor{icon_state = "yellow"; dir = 10},/area/tcommsat/computer) +"bWm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/weapon/screwdriver{pixel_y = 10},/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "Engineering"; name = "Engineering Lockdown"; pixel_x = -24; pixel_y = -6; req_access_txt = "10"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/item/device/radio/off,/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/checkpoint/engineering) "bWn" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -35},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/tcommsat/computer) "bWo" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/light,/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor,/area/tcommsat/computer) "bWp" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor,/area/tcommsat/computer) @@ -7088,7 +7088,7 @@ "cGp" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor,/area/derelict/arrival) "cGq" = (/obj/machinery/light/small,/turf/simulated/floor{icon_state = "dark"},/area/derelict/medical/chapel) "cGr" = (/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine) -"cGs" = (/obj/item/weapon/disk/data/demo,/turf/simulated/floor/plating/airless,/area) +"cGs" = (/obj/structure/alien/resin,/turf/simulated/floor/airless{icon_state = "floorgrime"},/area/mine/abandoned) "cGt" = (/turf/simulated/floor/airless{icon_state = "damaged4"},/area) "cGu" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor,/area/derelict/arrival) "cGv" = (/obj/structure/stool/bed/chair{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor,/area/derelict/arrival) @@ -7386,7 +7386,7 @@ "cMb" = (/turf/simulated/floor/plating/airless,/area/mine/abandoned) "cMc" = (/obj/item/stack/rods,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "cMd" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) -"cMe" = (/obj/item/weapon/shard{icon_state = "medium"},/obj/structure/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) +"cMe" = (/obj/structure/alien/weeds{icon_state = "weeds"},/turf/simulated/floor,/area/mine/abandoned) "cMf" = (/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) "cMg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/mine/abandoned) "cMh" = (/turf/simulated/mineral/random,/area/mine/explored) @@ -7394,57 +7394,57 @@ "cMj" = (/obj/item/weapon/shard,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "cMk" = (/turf/simulated/wall,/area/mine/abandoned) "cMl" = (/obj/item/stack/rods,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shard,/turf/simulated/floor/plating,/area/mine/abandoned) -"cMm" = (/obj/item/stack/rods,/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) +"cMm" = (/obj/structure/alien/weeds,/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) "cMn" = (/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) "cMo" = (/obj/structure/lattice,/obj/structure/lattice,/turf/space,/area) "cMp" = (/obj/structure/lattice,/obj/item/weapon/shard{icon_state = "medium"},/turf/space,/area) "cMq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/mine/abandoned) -"cMr" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) -"cMs" = (/obj/structure/alien/weeds,/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) +"cMr" = (/obj/structure/alien/weeds,/turf/simulated/floor,/area/mine/abandoned) +"cMs" = (/obj/structure/alien/weeds,/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/mine/abandoned) "cMt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/mine/abandoned) "cMu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/mine/abandoned) "cMv" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/mine/abandoned) -"cMw" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) +"cMw" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) "cMx" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) "cMy" = (/obj/item/stack/rods,/obj/structure/lattice,/turf/space,/area) "cMz" = (/obj/item/weapon/shard,/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/mine/abandoned) "cMA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/mine/abandoned) "cMB" = (/obj/structure/table,/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/mine/abandoned) "cMC" = (/obj/structure/table,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) -"cMD" = (/obj/structure/alien/weeds{icon_state = "weeds"},/turf/simulated/floor,/area/mine/abandoned) -"cME" = (/obj/structure/alien/weeds,/turf/simulated/floor/plating,/area/mine/abandoned) -"cMF" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plating,/area/mine/abandoned) +"cMD" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) +"cME" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor,/area/mine/abandoned) +"cMF" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "damaged3"},/area/mine/abandoned) "cMG" = (/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/mine/abandoned) "cMH" = (/obj/item/weapon/shard{icon_state = "small"},/obj/item/clothing/suit/space/syndicate,/turf/simulated/floor/plating/airless,/area/mine/abandoned) "cMI" = (/turf/simulated/floor/airless{icon_state = "damaged3"},/area/mine/abandoned) "cMJ" = (/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "cMK" = (/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/mine/abandoned) -"cML" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/mine/abandoned) +"cML" = (/obj/structure/alien/weeds,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "cMM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/mine/abandoned) -"cMN" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/airless{icon_state = "damaged3"},/area/mine/abandoned) -"cMO" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/plating,/area/mine/abandoned) +"cMN" = (/obj/structure/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "damaged3"},/area/mine/abandoned) +"cMO" = (/obj/structure/alien/weeds,/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) "cMP" = (/obj/item/weapon/shard,/obj/structure/lattice,/turf/space,/area) "cMQ" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating/airless,/area/mine/abandoned) "cMR" = (/obj/effect/gibspawner/robot,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "cMS" = (/obj/effect/gibspawner/human,/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) -"cMT" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/effect/decal/remains/xeno,/turf/simulated/floor/plating,/area/mine/abandoned) +"cMT" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) "cMU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/mine/abandoned) "cMV" = (/obj/item/weapon/shard,/turf/simulated/floor/plating/airless,/area/mine/abandoned) "cMW" = (/obj/structure/lattice,/obj/item/weapon/shard{icon_state = "small"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/space,/area/mine/abandoned) "cMX" = (/obj/structure/lattice,/turf/space,/area/mine/abandoned) -"cMY" = (/obj/structure/alien/weeds,/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/mine/abandoned) +"cMY" = (/obj/structure/alien/weeds,/turf/simulated/floor/airless{icon_state = "damaged3"},/area/mine/abandoned) "cMZ" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/mine/abandoned) -"cNa" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) -"cNb" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) +"cNa" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) +"cNb" = (/obj/structure/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) "cNc" = (/turf/simulated/wall,/area/mine/north_outpost) "cNd" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/mine/north_outpost) "cNe" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/mine/abandoned) "cNf" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/mine/abandoned) "cNg" = (/turf/simulated/floor/airless{icon_state = "damaged4"},/area/mine/abandoned) -"cNh" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plating/airless,/area/mine/abandoned) +"cNh" = (/obj/structure/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "cNi" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/mine/abandoned) "cNj" = (/turf/simulated/floor/airless,/area/mine/abandoned) -"cNk" = (/obj/structure/alien/weeds,/turf/simulated/floor,/area/mine/abandoned) +"cNk" = (/obj/structure/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) "cNl" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor/airless{icon_state = "damaged3"},/area/mine/abandoned) "cNm" = (/obj/structure/table,/turf/simulated/floor,/area/mine/abandoned) "cNn" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/abandoned) @@ -7453,20 +7453,20 @@ "cNq" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/mine/north_outpost) "cNr" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/mine/north_outpost) "cNs" = (/obj/machinery/atmospherics/pipe/tank/air,/turf/simulated/floor/plating,/area/mine/north_outpost) -"cNt" = (/obj/structure/alien/weeds,/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) +"cNt" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) "cNu" = (/obj/effect/decal/remains/human,/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) -"cNv" = (/obj/structure/alien/weeds,/turf/simulated/floor/plating/airless,/area/mine/abandoned) -"cNw" = (/obj/structure/alien/weeds,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) +"cNv" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/airless{icon_state = "damaged3"},/area/mine/abandoned) +"cNw" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/plating,/area/mine/abandoned) "cNx" = (/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "cNy" = (/obj/structure/table,/turf/simulated/floor/airless,/area/mine/abandoned) -"cNz" = (/obj/structure/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) +"cNz" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plating,/area/mine/abandoned) "cNA" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/mine/north_outpost) "cNB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/mine/north_outpost) "cNC" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/item/weapon/storage/box/lights/bulbs,/obj/machinery/atmospherics/pipe/simple{dir = 6},/turf/simulated/floor/plating,/area/mine/north_outpost) "cND" = (/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact-f"},/obj/machinery/meter,/turf/simulated/floor/plating,/area/mine/north_outpost) "cNE" = (/obj/item/weapon/shard,/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/mine/abandoned) "cNF" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/airless,/area/mine/abandoned) -"cNG" = (/obj/structure/alien/weeds,/turf/simulated/floor/airless{icon_state = "damaged3"},/area/mine/abandoned) +"cNG" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/mine/abandoned) "cNH" = (/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "cNI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/airlock/maintenance{name = "Mining Station Maintenance"; req_access_txt = "54"},/turf/simulated/floor/plating,/area/mine/north_outpost) "cNJ" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/wall,/area/mine/north_outpost) @@ -7478,8 +7478,8 @@ "cNP" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/mine/abandoned) "cNQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/mine/abandoned) "cNR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/mine/abandoned) -"cNS" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor,/area/mine/abandoned) -"cNT" = (/obj/structure/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) +"cNS" = (/obj/structure/alien/weeds,/turf/simulated/floor/plating,/area/mine/abandoned) +"cNT" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) "cNU" = (/obj/structure/table,/obj/item/weapon/pickaxe,/turf/simulated/floor,/area/mine/north_outpost) "cNV" = (/turf/simulated/floor,/area/mine/north_outpost) "cNW" = (/obj/structure/table,/obj/machinery/microwave,/turf/simulated/floor,/area/mine/north_outpost) @@ -7492,9 +7492,9 @@ "cOd" = (/obj/machinery/conveyor{dir = 4; id = "mining_north"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/north_outpost) "cOe" = (/obj/machinery/disposal/deliveryChute{dir = 8},/obj/structure/disposalpipe/trunk,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/north_outpost) "cOf" = (/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) -"cOg" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) +"cOg" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/effect/decal/remains/xeno,/turf/simulated/floor/plating,/area/mine/abandoned) "cOh" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor,/area/mine/abandoned) -"cOi" = (/obj/structure/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "damaged3"},/area/mine/abandoned) +"cOi" = (/obj/structure/alien/weeds,/turf/simulated/floor/plating/airless,/area/mine/abandoned) "cOj" = (/obj/structure/table,/obj/item/weapon/shovel,/turf/simulated/floor,/area/mine/north_outpost) "cOk" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor,/area/mine/north_outpost) "cOl" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/mine/north_outpost) @@ -7508,7 +7508,7 @@ "cOt" = (/turf/simulated/floor{icon_state = "green"; dir = 8},/area/mine/abandoned) "cOu" = (/obj/effect/gibspawner/human,/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) "cOv" = (/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor,/area/mine/abandoned) -"cOw" = (/obj/structure/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) +"cOw" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plating/airless,/area/mine/abandoned) "cOx" = (/turf/simulated/wall,/area/mine/explored) "cOy" = (/obj/structure/ore_box,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "cOz" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel,/obj/item/clothing/glasses/meson,/obj/machinery/light/small{dir = 8},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor,/area/mine/north_outpost) @@ -7522,16 +7522,15 @@ "cOH" = (/obj/machinery/conveyor_switch{id = "mining_north"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 1},/area/mine/explored) "cOI" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) "cOJ" = (/obj/effect/decal/remains/human,/turf/simulated/floor{icon_state = "green"; dir = 8},/area/mine/abandoned) -"cOK" = (/obj/structure/alien/resin,/turf/simulated/floor/airless{icon_state = "floorgrime"},/area/mine/abandoned) +"cOK" = (/obj/item/weapon/shard{icon_state = "medium"},/obj/structure/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "cOL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/mine/abandoned) "cOM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/mine/abandoned) -"cON" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/airless{icon_state = "damaged5"},/area/mine/abandoned) +"cON" = (/obj/item/stack/rods,/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "cOO" = (/obj/structure/ore_box,/obj/machinery/light_construct/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "cOP" = (/obj/machinery/light_construct/small{dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "cOQ" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor,/area/mine/north_outpost) "cOR" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor,/area/mine/north_outpost) "cOS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/mine/north_outpost) -"cOT" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "damaged3"},/area/mine/abandoned) "cOU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shard,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/abandoned) "cOV" = (/obj/machinery/door/airlock/glass{name = "Glass Airlock"; req_access_txt = "0"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/abandoned) "cOW" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/mine/abandoned) @@ -7957,7 +7956,7 @@ "cXa" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) "cXb" = (/obj/machinery/mineral/stacking_machine,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) "cXc" = (/obj/machinery/conveyor{icon_state = "conveyor0"; dir = 10; id = "mining_internal"},/obj/machinery/mineral/input,/turf/simulated/floor{dir = 8; icon_state = "loadingarea"},/area/mine/production) - + (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8034,14 +8033,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaiaaOaaPaaOaaQaaOaaRaaOaaSaaOaaTaaOaaOaaUaaVaaVaaVaaVaaVaaVaaVaaVaaVaaVaaWaaXaaYaaZaaWaaWaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaaiabaaaqabbaaQabcaaqabdaaSabeaaGabfaaOabgaaVabhabhabiabjabkablabmabnaaVaboabpabqabrabsaaWaafaaaaafabtabuabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiabvaaqabwabxabyaaqabzaaSabAaaGabzaaOabBaaVabhabCabDabDabDabDabDabDaaVabEabFabGabGabHaaWaafaafaafabtabIabtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaSabJaaOaaQaaSabKaaQaaSaaSabLaaQaaOaaOaaVabMabNabOabPabQabRabSabTaaVabUabVabWabGabXaaWabYabZabtacaabuabtabtacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaSabJaaOaaQaaSabKaaQaaSaaSabLaaQaaOaaOaaVabMabNabOabPabQabRabSabTaaVabUabVabWabGafjaaWabYabZabtacaabuabtabtacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbaccacdaceacfacgachaciacjacgackaclacmacnaaVacoacpacqacqacrabSabSacsaaVactacuacvabGacwaaWacxacyaczabtacAacBacCacCacDaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafacEacFacGacHacIacJacKacLacMacMacNacOacPacQaaVacoacoacRacSacTacUacUacVaaVacWacXacYacZadaaaWadbadcaddadeadfadgadhadiadjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiadkadlaaOadmadnadoaaOadpadpadpaaOadqadraaVadsadsadtaduadvadwaaVadxaaVadyaaWadzaaWadAaaWadBadcadCabtadDadEacCacCadFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaiaaiaaiaaiaaiaaiaaOaaOaaOaaOaaOaaOadGadHaaVadIadJadKadLadMadNaaVadOadPadQadRadSadTadUadVadWadXabtacaabtabtabtacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaadYadZadZadZaeaaebaecaedaeeaefaegaehaeiaejaekaelaemaenaeoaepaeoaeqaeraesaetaeuaevaewaexaeyaeyaezaeAaeAaeAaeAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaafaaaaeBaeCaeDaeEaeFaeGaecaedaeHaeIaeJaeKaeLaeMaeKaeNaeOaePaeQaeRaeSaeTaeUaeVaeWaeXaeYabtabtaeZaeZafaaeyafbafcaeAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaafaafaafaaaaaaaaaaafaaaadYadZadZafdafeaffaecaedafgafhafiafjafkaflaeiafmaaVafnafoafpafqafrafsaftafuafvafwafxafyafyafyafyafyafzafAafBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaafaafaafaaaaaaaaaaafaaaadYadZadZafdafeaffaecaedafgafhafiabXafkaflaeiafmaaVafnafoafpafqafrafsaftafuafvafwafxafyafyafyafyafyafzafAafBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaagaaaafCafCafCafCafCafCafDafEafCadYadYadYafFafGaecaecafHafIaaVafJafKafKafLafMafNaaVacaafOacaacaacaacaabtabtabtabtabtafPafPafPafPafPafQafRafSaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafTafTafTafUafUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaafUafUafTafUafUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafafCafVafWafCafXafYafZagaagaagaagaagbagcagdageagfaggaghagiagiagiagiagiagiagiagiagjagkagiaglafgadYagmagnagoagpagqagragsagtaguagvagwagxagyaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafTaaaaafaaaagzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafUaaaaafaaaagzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaafCafVagAagBagCagDagEagDagDagDagDagFagGagHagIagJagKagLagMagNagNagNagMagNagNagNagOagOagNagNagPagQagRagRagSagTagUagVagWagXagYafPafQafRaeAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafTaafagZaafafTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8062,12 +8061,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamXaoCaoDaoEamXaoFaoDaoEamXaoGaoHaoIaoJaoJaoJaoKaoLalJaaaaaaafTaaaaafaaaaafaafaaaaaaaoMaaaaaaaafaaaaaaaafaaaafTaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaafCaoNagAagAagAafCafCafCafCaoOaoPaoQaoRaoRaoSaoRaoRaoRaoTaoUaoVaoVaoWakKakKaoXajKaoYaeAaoZalWapaapbapcamGapdapeapfapgaphaphapiapjaphapkaplapmaorapnapoappapqaprapsaptamiamiamiamiamiaptapuapvapwaaaaaaafUafUafTaaaaaaaafaaaaaaaiYaaaaafaafaafaafafTafTafTaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaamjamXapxapyamjamXapzapyamjanaapAanaanaanaanaanaapBamqaaaaaaafTafTafTaaaaaaaafaaaapCapDapCaafaafaafaafafTafTafTaafafCafCafCafCapEapFapFapFapFapFapFapFapGafCafCafCafCagAafCapHagAapIapJapKapLapLapLapMapLapLapLapNapLapLapLapOapOapPapQapRapRapSapTanwanxanzanzapUanBapVapVapWapXapYapZapWapVapVaqaaqbaqcapnapoappapqapraqdaqeamiamiamiamiamiaqeaqfapvapwaaaaaaaaaaaaaafaafaaaaafaaaaaaaqgaaaaaaaafaaaaaaaafaaaaaaaafaafaaaaaaaaaaaaaaaaqhaqiaqhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqjaqkaqkaqkaqlaqkaqkaqkaqmaqnaqoaqmaqmaqmaqpanaaqqamqaaaaafaafaaaaaaaaaaaaaafaaaaqraqsaqraafaaaaafaaaaaaaaaaaaaaaafCagAagAaqtagAagAagAagAagAagAagAagAafXaquaqvaqwaqwaqwaqwaqwaqwaqxaqyaqzaqAaqAaqAaqBaqAaqAaqAaqAaqAaqCaqCaqCaqCaqCaqDajKaqEaqFaqGaqHamGamGamGamGanBaqIapVapWapYaqJapYaqKaqLaqMaqNaqOanIaqPaqQaqRaqSaqTaqUaqVamiamiamiamiamiaqWaqXaqYaqZaaaaaaaaaaaaaaaaafaaaaafaaaaraarbaraaaaaafaaaaaaaafaaaaaaaaaaafaafaaaaaaaaaaaaaqharcaqhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafardarearfareargarfarfarharearfariarjarkarkarlanaaqqarmaafaafaaaaaaaaaaaaaaaaafarnaroarparqarraaaaafaaaaaaaaaaaaaaaafCagAafCarsartaruaruaruaruaruaruaruarvarsarwarxarxarxarxarxarxarxalgaryaqAarzarAarBarCarDarEarFarGarHarIarJarKaqCarLajKarMaeAarNalWapaapbarOamGanBarParQaqMaqMarRarSarTarUarVaplarWarXarYarZasaasbascasdaseamiamiamiamiamiasfamgamgamgaqhaqhaqhaafaafaafaafaafaaaasgashasgaaaaafaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaqhasiaqhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamXaqjasjaqjaskarfarfaslaqjasjaqjasmasnargasoanaaqqanaanaaspandandandandaneanaasqasrassastasqafCafCasuasvaswafCafCafCagAaiHarsaaaaafaaaaafaaaaafaaaaafaaaarsarwarxasxasyaszasAasBarxalgasCasDasEasFasGasHasIasIasJasKasLasMasMasNaqCarLajKasOaeAasPanwanxanzanzasQanBasRasSasTasUasVasWasXasXasYasXamgasZataatbatcatdateamgatfamiamiamiamiamiatfamgatgasiathatiaqhaafaafaafaaaaafatjatkarbatlatmaafaaaaaaaafaaaaaaaaaaaaaaaaafaafaaaaaaaqhasiaqhaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafardarearfareargarfarfarharearfariarjarkarkarlanaaqqarmaafaafaaaaaaaaaaaaaaaaafarnaroarparqarraaaaafaaaaaaaaaaaaaaaafCagAafCarsartaruaruaruaruaruaruaruarvarsarwarxarxarxarxarxarxarxalgaryaqAarzarAarBarCasNarEarFarGarHarIarJarKaqCarLajKarMaeAarNalWapaapbarOamGanBarParQaqMaqMarRarSarTarUarVaplarWarXarYarZasaasbascasdaseamiamiamiamiamiasfamgamgamgaqhaqhaqhaafaafaafaafaafaaaasgashasgaaaaafaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaqhasiaqhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamXaqjasjaqjaskarfarfaslaqjasjaqjasmasnargasoanaaqqanaanaaspandandandandaneanaasqasrassastasqafCafCasuasvaswafCafCafCagAaiHarsaaaaafaaaaafaaaaafaaaaafaaaarsarwarxasxasyaszasAasBarxalgasCasDasEasFasGasHasIasIasJasKasLasMasMaxtaqCarLajKasOaeAasPanwanxanzanzasQanBasRasSasTasUasVasWasXasXasYasXamgasZataatbatcatdateamgatfamiamiamiamiamiatfamgatgasiathatiaqhaafaafaafaaaaafatjatkarbatlatmaafaaaaaaaafaaaaaaaaaaaaaaaaafaafaaaaaaaqhasiaqhaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafatnamjatoaoDatpatqatratsattatpaoDatuatvamjatwatxanaatyatzatzatzatzatzatzaoLatAatBasqatCatDatEasqatFagAagAagAagAagAagAagAagAatGarsaafatHatHatHatHatHatHatHaafarsarwarxatIatJatKatLatIarxalgatMaqAatNatOatPatQasMatRatSatTatUasMasMasMatVarLajKatWaeAasPamCamGamGamGamGapdatXasXasXasXasXasXasXatYatZauaasXamgamgamgamgaubamgamgatfamiamiamiamiamiatfamgaqhasiaucatiaqhaaaaaaaaaaaaaafaudaueaufaugaudaafaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafaaaaqhasiaqhaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaardasjauhauiauiauiauiaujasjardaukamjaulaumaunaunaunaunaunaunaunaunapBauoatBasqaupauqaurasqausautausausausausausausausausauuaaaatHauvauwauxauyauzatHaaaarsarwarxatIauAauBauCatIarxalgafCaqAauDauEauFauGauHasMauIauJasMasMauKasMauLarLajKasOaeAarNalWapaapbauMamGanBatXasXauNatZauOauOasXatYauPauaasXauQauRauQauSauTaqhaafauUauVauVauVauVauVauWaaaaqhauXauYauZaqhaqhaaaaaaaaaaafaudavaavbavcaudaafaaaaaaavdaveaveaveaveavfavgaveaveaveaveavhaviaveavjavkavlavmavnaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaavoavpavqavpavpavravsavpavpavqavtavuamjaskavvavwavxavyavzavAavBavCaunapBavDanaasqasqavEavFauuavGavHavIavJavKavLavMavNavOavPauuaafatHavQavRavSavTavUatHaafarsarwarxavVavWavXavWavYarxalgavZaqAawaawbatPawcatPawdaweawfawgawhaqCawiaqCarLajKasOaeAasPanwanxanyanzawjanBatXasXawkatZatZatZasYawlawmawnasXawoawpawpawqauTaqhaaaaafaaaaafaaaaafaaaaafaaaaqhawrawsawtawuaqhaaaaaaaaaaafaudawvawwawxaudaqhawyawzawAawBawCawCawCawCawCawCawDawEawEawFawGawHawEawEawIawJawKaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavoavtavpawLawMawMawNawOawPawQawRawMawMawSawTaqjaskawUaunawVawWawXawYawXawZaxaaxbaxcampaxdaxeaxfatzaxgaxhaxiaxjaxjaxjaxkaxjaxjaxlavHauuaaaatHaxmaxnaxoavTaxpatHaaaarsarwarxaxqaxraxsaxtaxuarxalgaxvaqAaqAaxwaxxaxyaxxaxzaqAaqAaxAaxBaqCaxCaqCarLajKasOaeAasPaxDaxEaxEaxEaxEaxFaxGaxHaxIaxJaxKaxKaxKaxLaxKaxMaxKaxNaxOaxPaxQaxRaqhaqhaqhaqhaqhaqhaqhaqhaqhaqhaqhaqhaqhaqhaxSaqhawyaxTaqhaqhaudaudaxUaxVaudasiaxWaxXaxYaxZayaayaayaayaayaasiaybaycaycaydayeayfaycaygayhayiaygaygaygaygaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavoavtavpawLawMawMawNawOawPawQawRawMawMawSawTaqjaskawUaunawVawWawXawYawXawZaxaaxbaxcampaxdaxeaxfatzaxgaxhaxiaxjaxjaxjaxkaxjaxjaxlavHauuaaaatHaxmaxnaxoavTaxpatHaaaarsarwarxaxqaxraxsarDaxuarxalgaxvaqAaqAaxwaxxaxyaxxaxzaqAaqAaxAaxBaqCaxCaqCarLajKasOaeAasPaxDaxEaxEaxEaxEaxFaxGaxHaxIaxJaxKaxKaxKaxLaxKaxMaxKaxNaxOaxPaxQaxRaqhaqhaqhaqhaqhaqhaqhaqhaqhaqhaqhaqhaqhaqhaxSaqhawyaxTaqhaqhaudaudaxUaxVaudasiaxWaxXaxYaxZayaayaayaayaayaasiaybaycaycaydayeayfaycaygayhayiaygaygaygaygaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawSayjaykaylawMaymawMaymawMaymawMaymawMaynayoatpaskaypaunayqayraysaytayuayvaunatyaywatzayxatzayyampausayzaxlaxjaxjaxjaxjaxjaxjayAayBayCayDayEayFayGayHayIayJatHaafarsayKayLayMayNayOayPayQayLayRaySayTayUayVayWayXayWasLayYaqCayZayZaqCaxAaqCazaazbazcaeAazdazeazeazeazfazgazhaziazjazkazlazjazmazjaznazjazoazpazqawpazrauSazsaztazuazvazvaztazwazxazxazxazxazxazyazzazxazAazBazCazDazEazFawEazGazHazIazIazIazJazKazLazMayaazNazOazPayaaycazQaycazRazSazTazUazVazWazXazYazZaAaaAbaAcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAdaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAeawMawMaAfawMaymawMaymaAgaymawMaymawMaynayoatpaskaAhaunaAiaAjaAkaAlaAkavwavwaAmaAnaAmaAoaApaAoaAoaAqaAraAsaAtaAtaAtaAuaAtaAtaAvaAwauuaaaaAxatHaAyaAzaAyatHatHaaaarsaAAarxaABaACaADaAEaAFaAGaAHaAIaAJaAKauEaxAaxAaxAaALaAMaqCaANaAOaqCawiaqCaAPaAQaARaeAaASaeAaeAaeAaATaeAaAUaAVasXaAWatZasXaAXasXaAYasXaAZaBaaBbaBcaBdaBeaBfaBgaBhawtaBiaBjaBkaBiaBiaBlaveawtaBmawtavhaBnawtaBoaBpaBqaBraBraBsaBtaBuaBvaBraBwaBxaByaBzaBAaBBaBCaBDayaaBEaBFaycaBGaBHaBIaBJazVaBKazZazYaBLaygaygaygaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawSaBMaykaylawMaymawMaymawMaymawMaymawMaynayoatpaBNaBOaBPaBQaBQaBQaBQaBOaBRaBSaBTaBUaBVampaBWaobaobausaBXaBYavHaBZaCaaCbaCcaCdaCeaCfauuaaaaCgaaaaChaCiaChaaaaafaaaarsaAAarxaCjaCkaClaCmaCnarxakEagAaqCaCoaCpaxAaxAaxAaCqaCraqCaaaaaaaCsaCtaCuaCvaCwaCxaCyaCzaCsaaaaaaaCAaCBaCCaCDasXaCEatZatZatZawmatZatZatZaCFauSaCGauSaCHaCIaCJaCKaCJaCJaCLaCMaCNaCJaCOaCPaCPaCQaCPaCRaCPaCSaCTaCTaCUaCTaCTaCVaCTaCTaCTaCTaCWaCXaBzaCYaCZaDaaDbaDcayaaDdaDeaDfaDgaDhaDiaBJaDjaBKazZazYazZaDkaDlaDmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDnaDnaDnaDnaDnaDnaDnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8086,13 +8085,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOqaOqaOqaOqaOqaOqaOqaOqaOqaOqaOqaOqardaUhaIQaUiaNaaUjaUjaUjaUkaUlaUjaUmaUjaMYaUnaUoaUpaUqaUraUraUsaUtaUraUuaSVaUvaIWaSXaSYaUwaUxaIWaUyaTcaTdaUzaUAaUAaUAaUBaTdaUCaUDaUEaUFaTjaTjaTjaTjaCwaCwaUGaUHaUIaUJaUKaULaUMaUNaUOaUPaSbaUQaURaUQaUQaUSaUQaUQaURaUQaUTaUUaUVaUWaUXaUYaUZaVaaVbaVcaSjaCwaCwaCJaCJaCJaCJaCJaVdaMkaVdaVeaVfaCJaCJaCJaCJaCJaVgaVhaVhaVhaVhaVhaVhaViaVhaVgaHraVjaVjaVkaSyaSyaSyaSyaVgaTTaVlaTUayaayaayaayaayaaVmayaayaayaayaaygaVnaVoaVpaVpaVpaVpaVqaygaygaVraMPaVsaMPaMPaPHaMRaKcaKcaPJaDnaDnaDnaDnaDnaDnaDnaDnaDnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatnamjaVtauiaPMamXamXamXamjamjamXaVuaVvaVwaMYaMYaMYaMYaMYaMYaMYaMYaMYaLIaLIaRsaRtaSQaVxaVyaVzaRuaVAaVBaVCaIWaSXaSYaVDaVEaIWaUyaTcaTdaUAaVFaVFaUAaVFaTdaUCaVGaVHaVHaVIaVJaVKaTjaVLaCwaRQaVMaVNaVOaVPaVQaVQaVPaVRaVSaSbaVTaURaVUaVVaVWaVXaVYaURaVZaUTaWaaVbaVbaWbaWcaWdaVbaWeaVcaSjaWfaCwaWgaWhaSyaSyaSyaSyaSyaSyaSyaSyaWiaSyaSyaSyaSyaWjaSyaSyaSyaSyaSyaSyaSyaSyaWhaSyaSyaSyaSyaSyaSyaSyaSyaWkaWlaWmaWnaWnaWnaWnaWnaWoaWpaWqaWnaWraWnaWnaWsaWnaWnaWnaWnaWnaWnaWtaWuaWvaWwaVsaMPaMPaMPaOpaOoaOoaOpaDnaDnaDnaDnaDnaDnaDnaDnaDnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafamXarfaWxaWyaWzaWzaWzaWzaWzaWzaWAaWBaITaWCaLIaRsaRtaRuaRuaWDaWEaRuaIWaIWaWFaIWaSXaWGaVDaWHaIWaUyaTcaTdaUAaWIaUAaVFaWJaTdaUCaWKaVHaVHaVHaWLaWMaTjaWNaCwaRQaWOaWPaWQaWRaWSaWTaWUaVRaWVaSbaUQaUQaWWaTtaWXaTtaWWaUQaUQaUTaWYaWZaVbaWbaXaaWdaVbaVbaVcaXbaCwaCwaWgaWhaSyaSyaSyaSyaSyaSyaSyaSyaXcaSyaSyaSyaSyaSyaSyaXdaWnaWnaWnaWnaWnaWnaXeaWnaWnaWnaWnaWnaWnaWnaXfaXgaXhaXiaSyaSyaSyaSyaSyaSxaSyaSyaSyaSyaSyaSyaSyaSyaSyaSyaSyaSyaXjaXkaXlaMPaMPaVsaMPaMPaXmaXnaKcaKcaXoaDnaDnaDnaDnaDnaDnaDnaDnaDnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafamXaVtaPMaXpaXpaXpaXqaXpaXpaXpaXraITaITaITaITaRsaRtaSQaXsaXtaXuaRuaXvaXwaXxaIWaIWaIWaIWaXyaIWaUyaTcaTdaXzaUAaVFaXAaXBaTdaUCaTjaXCaVHaVHaXDaXEaTjaXFaCwaRQaXGaXHaWQaWRaXIaXJaWUaXKaXLaXMaXNaXOaWWaTtaXPaTtaWWaXOaXQaXRaXSaXTaVbaXUaXUaXVaVbaXWaVcaXXaXYaCwaWgaWhaSyaSyaXZaSyaYaaYbaYbaYbaYcaYbaYbaYbaYdaSyaSyaSyaSyaSyaSyaYeaYfaYgaWhaSyaSyaSyaYhaYiaYjaYkaYlaYmaYnaSyaSyaSyaSyaSyaYoaYpaSyaSyaSyaSyaSyaSyaSyaSyaSyaSyaSyaSyaSyaXkaYqaYraYsaYtaYuaYvaYwaYxaOoaOoaYxaDnaDnaDnaDnaDnaDnaDnaDnaDnaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafamXaVtaPMaXpaXpaXpaXqaXpaXpaXpaXraITaITaITaITaRsaRtaSQaXsaXtaXuaRuaXvaXwaXxaIWaIWaIWaIWaXyaIWaUyaTcaTdaXzaUAaVFaXAaXBaTdaUCaTjaXCaVHaVHaXDaXEaTjaXFaCwaRQaXGaXHaWQaWRaXIaXJaWUaXKaXLaXMaXNaXOaWWaTtaXPaTtaWWaXOaXQaXRaXSaXTaVbaXUaXUaXVaVbbtdaVcaXXaXYaCwaWgaWhaSyaSyaXZaSyaYaaYbaYbaYbaYcaYbaYbaYbaYdaSyaSyaSyaSyaSyaSyaYeaYfaYgaWhaSyaSyaSyaYhaYiaYjaYkaYlaYmaYnaSyaSyaSyaSyaSyaYoaYpaSyaSyaSyaSyaSyaSyaSyaSyaSyaSyaSyaSyaSyaXkaYqaYraYsaYtaYuaYvaYwaYxaOoaOoaYxaDnaDnaDnaDnaDnaDnaDnaDnaDnaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaXpaYyaYzaYAaYAaYBaYCaYDaYEaYFaYFaYFaYGaYHaYIaYIaYJaYKaYIaYLaYLaYMaYLaYNaOCaOCaYOaOCaYPaYQaYRaYSaYTaYTaYUaYVaYRaYWaYXaYYaVHaVHaXDaYZaZaaXFaCwaRQaZbaZcaZdaVPaVPaVPaVPaZeaZcaSbaUQaUQaWWaZfaZgaZhaWWaUQaUQaSbaZiaZjaZkaZlaVbaZmaVbaZnaVcaZoaZpaZpaZqaZqaZqaZqaZqaZqaZqaZraZsaZtaZuaZvaZvaZraZwaZwaZwaZwaZwaZxaZxaZxaZyaZxaZxaZxaZxaZzaZAaYoaZBaZCaZDaZEaZFaSyaSyaZGaZGaZHaZHaZHaZHaZHaZIaZJaZJaZJaZJaSyaZJaZKaZJaZJaZLaZMaZMaZMaZMaZNaZOaKbaKcaKcaKcaKcaPJaDnaDnaDnaDnaDnaDnaDnaDnaDnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaXpaZPaXpaZQaZRaXpaXpaXpaXraITaITaITaZSaRuaSQaZTaVyaZUaRuaZVaZWaZXaZXaZYaZZbaababbacbaabadbaebafbagbafbafbahbaibajbakbalaVHaVHbambanbaoaXFaCwbapaZbbaqbarbasbataZcbaubavbawaSbaVTaURbaxaVXbayaVXbazaURaVZaSbbaAbaBbaCbaDaVbbaEaVbbaFaVcaSjaCwbaGaZqbaHbaIbaJbaKbaLaZqbaMbaNbaNbaObaPbaPbaPbaQbaRbaSbaTaZwbaUbaVbaVbaVbaVbaWbaXbaYbaZbbabaZbaZbaZbbbbbcbbdbbebbdbbfbbfaZHbbgbbhbbiaZHbbjbbkbbjaZHaZIaSyaZLaZMbblbbmbblaZMbbnbboaZMbbpaZOaaaaaaaaaaafaaaaafaDnaDnaDnaDnaDnaDnaDnaDnaDnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaXpaZPaXpaZQaZRaXpaXpaXpaXraITaITaITaZSaRuaSQaZTaVyaZUaRuaZVaZWaZXaZXaZYaZZbaababbacbaabadbaebafbagbafbafbahbaibajbakbalaVHaVHbambanbaoaXFaCwbapaZbbaqbarbasbataZcbaubavbawaSbaVTaURbaxaVXbayaVXbazaURaVZaSbbaAbaBbaCbgKaVbbaEaVbbaFaVcaSjaCwbaGaZqbaHbaIbaJbaKbaLaZqbaMbaNbaNbaObaPbaPbaPbaQbaRbaSbaTaZwbaUbaVbaVbaVbaVbaWbaXbaYbaZbbabaZbaZbaZbbbbbcbbdbbebbdbbfbbfaZHbbgbbhbbiaZHbbjbbkbbjaZHaZIaSyaZLaZMbblbbmbblaZMbbnbboaZMbbpaZOaaaaaaaaaaafaaaaafaDnaDnaDnaDnaDnaDnaDnaDnaDnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaafaXpbbqaXpbbrbbsbbtbbuaXpbbvaLIaITaLIbbwaRuaRuaRuaRuaRuaRubbxbbybbzaLIbbAaTdaTdaTdbbBaTdaTdaTdbbCaTdaTdaTdaTdbbDbbEbbFbbGaVHaVHaXDbbHaZaaXFaCwbbIaZbbbJbaraTraTrbbKbbLbbMbbNaSbaUQbbOaUQbbPaXOaUQaUQbbOaUQaSbbbQbbRbbSbbTaVbaZmbbUaVbaTxbbVbbWbbXaZqbbYbbZbcabcbbccbcdbaPbcebaPbcfbaPbaPbcgbchbcibcjbckaZwbclbaVbclbaVbclbcmbaVaZxbcnbcobcpbcqaZCbcraZEbcsbctbcubcvbcvaZHbcwbcxbcybczbcAbcBbcCaZHbcDaZJbcEaZMbcFbcGbcFbcHbcIbcJaZMbbpaZOaaaaafaaaaaaaaaaaaaDnaDnaDnaDnaDnaDnaDnaDnaDnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaaaaafaaaaXpbcKaXpbcLbbtbcMbcNbcObcPaLIaITbcQbcRbcSbcSbcSbaabaabaabcTbcUbcUbcUbcVaTdbcWbcXbcYbcZbdabdbbdcbddaTdbdebdfbdgbdhbdibdjbdkbdlbdmbdnbdnbdobbWbdpbdqbdrbdsbdtbdubdubdvbbMaTraTraSbbdwaTtaTtbdxaTtaTtbdwaSbbdybdybdzaVbbdAaVbbdBbdCbdDbdEaSjaCwaCwaZqbdFbdGbdHbdIbdJbdKbaPbdLbdMbdNbdObdObdPbdQbdRbdSbdTaZwbclbaVbclbaVbclbcmbdUaZxbdVbdWbdXbdYaZCbcrbdZbeabeabeabebbecbedbeebefbefbefbegbefbehbeibejbekbelbembenbeobepbeqberbesaZMbbpbetaafaafaaaaaaaaaaaaaaaaDnaDnaDnaDnaDnaDnaDnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaXpbeubevbbtbbtaXpaXpaXpbewbexaITbeybezbeybeybeybezbeyaITaITaTdaTdaTdbeAaTdbdcbdcbeBbdcbdcbdcbdcbdcbeCbeDbeEbeFbeGbeHbeHbeHbeIbeJbeKbeLbeMbeNbeObePbeQbeQbeRbeSbeTbeUbeVaTraaabeWbeXbeYbeZbeYbfabeYbfbbeWaaabfcbfdbfebdybdybdybdybffaVcbfgaCwaCwaZqbfhbdGbfibcbbccbfjbaPbcfbfkbflbfmbfnbfoaZwbfpbfqbfraZwbclbfsbclbaVbclbcmbaVaZxaZCaZCaZCaZCaZCbcraZEbftbfubfvbfwbfxbfybfzbfAbfBbfBbfCbcybfDaZHbfEbfFbfGaZMbfHbfIbfJbfKbfLbfMaZMbbpbfNaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaXpbfObevbbtbfPaXpaaaaaaaaaaafaafbfQbfQbfQbfQbfQbfQbfQaaaaaabfRbfSbfTbfUbfVbdcbdcbdcbdcbdcbdcbdcbdcbfWbbGaVHbfXbfYbfZbgabgbbgcbdhaTjaTjbgdbgebgfbggbghbgibgibgjbgibgkbglbgiaafbgmbgnbeYbgobeYbgobeYbgpbgmaafbgqbgraXUbgsbgtbgubgvbgwbgxbgyaCwbgzbgAbgBbgCbfibgDbgEaZqbgFbcfbfkbfmbgGbaPbgHaZwbgIbgJbgKaZwbgLbgMbgNbgObgPbgQbgPbgRbgSbgSbgSbgSbgSbgTaZEbgUbctbctbfwbgVbgWbgXbgYbgZbgZbhabhbbhcaZHbhdbfFbheaZMbhfbhgbhhbfKbepbhiaZMbbpbhjaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaXpbfObevbbtbfPaXpaaaaaaaaaaafaafbfQbfQbfQbfQbfQbfQbfQaaaaaabfRbfSbfTbfUbfVbdcbdcbdcbdcbdcbdcbdcbdcbfWbbGaVHbfXbfYbfZbgabgbbgcbdhaTjaTjbgdbgebgfbggbghbgibgibgjbgibgkbglbgiaafbgmbgnbeYbgobeYbgobeYbgpbgmaafbgqbgraXUbgsbgtbgubgvbgwbgxbgyaCwbgzbgAbgBbgCbfibgDbgEaZqbgFbcfbfkbfmbgGbaPbgHaZwbgIbgJbvpaZwbgLbgMbgNbgObgPbgQbgPbgRbgSbgSbgSbgSbgSbgTaZEbgUbctbctbfwbgVbgWbgXbgYbgZbgZbhabhbbhcaZHbhdbfFbheaZMbhfbhgbhhbfKbepbhiaZMbbpbhjaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaXpbhkbhlbhmaZRaXpaaaaaaaaaaaaaaabfQbfQbfQbfQbfQbfQbfQaaaaaabhnbhobdcbhpbhqbhqbhqbhqbhqbhrbhqbhqbhqbhsbhtbhubhvbhwbhxbhybhzaXDbhAbhBbhCbhDbhEbhFbggbggbgibhGbhHbhIbhJbhKbgiaaabhLbhMbeYbhNbhObhNbeYbhPbhLaaabhQbhRaXUbhSbhTbhUbhTbhVbhWbgyaCwaCwaZqbhXbdGbfibhYbhZaZqbiabibbicbidbiebaPbifbigbihbiibijaZwaZxbikaZxaZxaZxbilbilbilbilbilbilbilbilbcraZEbftbfubfvbimbinbiobipbiqbiqbiqbhabcybiraZHbisbfFbitaZMbiubivbiubiwbepbixaZMbbpaZOaafaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfQbfQbfQbfQbfQbfQbfQbiybizbiAbiBbdcbdcbdcbiCbiCbiCbiCbfUbdcbdcbdcbeCbiDaVHbiEbiFbiGbiHbiIaXDaVHbiJbiKbiLbiMbiNbiObiPbiQbiRbiSbiTbiUbiVbiWayDbiXbiYbiZbeYbhNbeYbjabjbbjcbjdbjebjfbjgbjhbhTbjibhTbhVbhWbjjaCwaCwaZqbjkbdGbfibjlbjmaZqbjnbcfbaPbjobjpbjqbjrbiabjsbjtbjubjvbjwbjxbaPbjybjzbjAbjBbjCbjDbjEbjFbjGbjHbbbbbcbjIbjJbjKbjLbjMaZHbjNbiqbiqbjObjPbcybjQaZHbjRbjSbjTaZMbjUbjVbjWbjXbepbjYaZMbbpaZOaZOaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfQbfQbfQbfQbfQbfQbfQbjZbkabjZbkbbkcbdcbdcbdcbdcbdcbdcbfUbdcbkdaTdaTdbkeaVHaVHbkfbkgbkhbkiaXDaVHaVHbkjbkkbhEbklbkmbknbkobkpbkqbkrbksbktbgiaaabkubkubkvbkwbkxbeYbkybkubkuaaabkzbkAbkAbkAbkAbkAbkAbkBbkCbkDbkEbkEaZqaZqbkFbkGbkHaZqaZqbkIbcfbaPbaPbaPbaPbkJbkKbkLbkMbaPbaPbaPbkMbaPbaPbjzbkNbkObkPbkQbkRbkSbkTbilbkUbkVbkWbkWbkXbkYbkZaZHblabcybcyblbblcbcybldbleblfblfblgblhblhblibblbljbblaZMaZMbbpblkaZOaafaaaaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8102,8 +8101,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfQbfQbfQbfQbfQbfQbfQboQboRboQboSboTboSboSboSboSboSboUboVbdcbloboWaTdboXboYboZbpabeDbpbbpcbpdbpebpbbpbbpfaCwaDXbpgbknbgibphbpibpjbmMbpkbgiaaaaaaaafbnVbplbpmbpnbnVaafaaaaaabkzbpobppbpqbprbodboebofbkCbpsaCwaCwbptbpubpvbkLbpwbpxbokbpybpzbpAbpBbpCbpDbpEbpFbpFbpGbokbaPbaPbnkbpHbmebpIbpJbpKbpLbpMbpNbpNbpObpPbpQbpRbpSbpTbpUbpVbpWbpVbpVbpXbpVbmvbpYbpVbpVbpVbpZbqabqbbqcbqdbqebqfbqgbqhbqiboObbpbmBbfNaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfQbfQbfQbfQbfQbfQbfQbqjbqkbizbqlaTdbqmbizbizbqlbqnbqnbqnbqobqpbqqbqnbqnbqrbqrbqsbqrbpbbqtbqubqvbqwbpbbmKaCwaCxaNwaNwbgibgibgibgibgibqxbgiaDTaDUaDZbnVbqybqzbqAbnVaDTaDUaDZbkzbkAbkAbkAbkAbkAbkAbkAbkCbpsaCwbqBbokbokbqCbqDbqEbokbokbqFbqGbqHbqIbqIbqJbqKbqLbqMbqKbqNbaPbaPbnkbqObqPbqQbqRbqSbqTbqUbqRbqRbqVbqWbqXbqYbqZbqZbqZbqZbrabqZbqZbqZbrbbrcbrdbrebrfbrgbrhbribrjbqcbrkbrlbrmbrnbrobrpboObbpbrqbhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfQbfQbfQbfQbfQbfQbfQaaaaaaaaaaaaaaaaaaaaaaaaaaabqnbrrbrsbrtbrubrvbrwbrxbrybrzbrAbrBbrCbrDbrEbrFbrGbpbbrHbrIbrIbrIbrJbrIbrKbrLaWgbrMbrNbrObrPbrPbrQbrRbrSbrTbrUbrVbrWaCwaCwbrXaFMaCwaFwaCwaCwaCwbrYbrZbpsaCwbsabokbsbbscbsdbsebsfbokbsgbqGbshbqIbqIbqJbqKbqLbsibsjbqNbaPbskbnkbslbsmbsnbsobspbsqbsrbssbstbilbilaZDbsubqZbsvbswbsxbsybszbsAbqZbsBbsCbsDbsEbsFbsGbrhbribrjbsHbsIbsJbsKbsLbsMbsNboObbpbmBaZOaZOaZOaZOaZOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAdaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfQbfQbfQbfQbfQbfQbfQaaaaaaaaaaaaaaaaaaaaaaaaaaabsObsPbsQbsRbsSbsTbsUbsVbsWbsXbsYbsZbtabtbbtcbrFbtdbpbbtebtfaCwaCwaCwaCwaCwaCwaWgaCwbtgaCwaCwaCwaCwaZpbthbtibtjaCwaCwaCwaCwbrXaCwaCwaFwaCwaCwaCwbtkbtlbpsbtmbtnbtobtpbtqbtrbtsbttbtubtvbtwbtxbtybpCbokbtzbtAbtBbtCbokbaPbaPbnkbnkbnkbnkbnkbilbilbilbilbilbilbtDbtEbtFbqZbtGbtHbtIbtJbtKbtLbqZbtMbtNbtObtPbtQbtRbtSbtTbtUbtVbtWbtXbtXbtYbtZbuaboObbpbmBaZObubbucbudaZOaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbuebufbufbugbuhbuhbuibuibuibuibujaaaaafaaaaafaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfQbfQbfQbfQbfQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqnbukbulbumbunbuobupbrxbrybrybuqbrybrCburbusbutbuubpbbuvbuwbuwbuwbuwbuxbuwbuwbuybuwblwaCwbuzbuAbbWbuBbuCbuDbuEbuFbuGbuHaQRbuEbuIaQRbuJbuKaQRbuLbuMbuNbuOaCwaCwbokbuPbuQbuRbuSbopbokbuTbuUbuTbokbokbokbokbokbokbokbokbaPbaPbaPbuVbuWbojbuXbuYbuZbvabvbbvcbvdbvebvfbvgbqZbvhbvibvjbvkbvlbvmbqZbvnbvobvpbvqbvrbvsbvtbvubvvbvwbvxbvybvzbvAbvBbvCboObvDbvEbvEbvEbvEbvFbvGaaaaaaaafaaaaaaaafaaaaaaaafaaaaaaaafaaaaaaaafaaaaaaaafaaaaaaaaaaafaafbvHbvIbvIbvIbuhbuibuibvJbvKbvJbuibuiaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfQbfQbfQbfQbfQbfQbfQaaaaaaaaaaaaaaaaaaaaaaaaaaabsObsPbsQbsRbsSbsTbsUbsVbsWbsXbsYbsZbtabtbbtcbrFaXWbpbbtebtfaCwaCwaCwaCwaCwaCwaWgaCwbtgaCwaCwaCwaCwaZpbthbtibtjaCwaCwaCwaCwbrXaCwaCwaFwaCwaCwaCwbtkbtlbpsbtmbtnbtobtpbtqbtrbtsbttbtubtvbtwbtxbtybpCbokbtzbtAbtBbtCbokbaPbaPbnkbnkbnkbnkbnkbilbilbilbilbilbilbtDbtEbtFbqZbtGbtHbtIbtJbtKbtLbqZbtMbtNbtObtPbtQbtRbtSbtTbtUbtVbtWbtXbtXbtYbtZbuaboObbpbmBaZObubbucbudaZOaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbuebufbufbugbuhbuhbuibuibuibuibujaaaaafaaaaafaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfQbfQbfQbfQbfQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqnbukbulbumbunbuobupbrxbrybrybuqbrybrCburbusbutbuubpbbuvbuwbuwbuwbuwbuxbuwbuwbuybuwblwaCwbuzbuAbbWbuBbuCbuDbuEbuFbuGbuHaQRbuEbuIaQRbuJbuKaQRbuLbuMbuNbuOaCwaCwbokbuPbuQbuRbuSbopbokbuTbuUbuTbokbokbokbokbokbokbokbokbaPbaPbaPbuVbuWbojbuXbuYbuZbvabvbbvcbvdbvebvfbvgbqZbvhbvibvjbvkbvlbvmbqZbvnbvobaDbvqbvrbvsbvtbvubvvbvwbvxbvybvzbvAbvBbvCboObvDbvEbvEbvEbvEbvFbvGaaaaaaaafaaaaaaaafaaaaaaaafaaaaaaaafaaaaaaaafaaaaaaaafaaaaaaaaaaafaafbvHbvIbvIbvIbuhbuibuibvJbvKbvJbuibuiaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqnbqnbvLbvMbvMbvNbqnbqnbvObvPbvQbvRbpbbpbbvSbpbbpbbpbbvTbvUaNwaNwaNwaNwbvVbvVbvVbvVbvVbvVbvVbvVbvVbvVbvWbvXbvYbvZbvZbvZbvZbwabwbbvZbvZbvZbvZbwcbwdbweaCBaEabwfbokbwgbwhbwibwjbwkbokbwlbqGbwmbolbwnbwnbwobwpbwqbwrbolbwsbaPbaPbaPbaPbaPbkLbwtbwubwvbwwbwxbwybwzbwAbwBbwBbwBbwBbwBbwBbwBbwBbwBbwCbwDbwCbwCbwCbwCbwEbwFbwGboNboNboNboNboNboNboNboObwHbwHbwHbwHbmBbwIbfNaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagbwJbvIbvIbwKbuibuibvJbvJbwLbvJbvJbuibuiaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwMaaaaaaaaaaaaaafaaabqrbwNbwObwPbwQbwQbwRbwSbwTbwUbwVbwWbvUaaaaaaaafaaabvVbwXbwYbwZbxabxbbxcbxdbxebvVbxfbxgbxhbvZbxibxjbxkbxlbxmbxnbxobxpbxqbxrbxsbxtbxubxvbwcbokbxwbxxbxybxzbxAbokbxBbqGbxCbxDbqIbqIbqIbqIbqIbxEbxFbxGbjubjubjubjubxHbkLbxIbxJbxKbxLbxMbuYbwzbwAbwBbxNbxNbxNbxObxNbxPbxQbwBbxRbxSbxTbxRbxRbwCbxUbxVbrjbxWbxXbxYbxZbyabybbycbydbyebyfbygbwHbmBbwIbhjaaaaaaaafaaaaaaaafaaaaaaaafaaaaaaaafaaaaaaaafaaaaaaaafaaaaaaaafaaaaaabyhbuibwJbuibuibvJbvJbvJbvJbvJbvJbvJbuibuiaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyibyjbykbyjbylaaaaaaaafbqrbqrbymbrybynbrybyobqrbypbypbyqbyrbysbvUaafbytbyubyvbywbyxbxebyybxebyzbyAbyBbyBbyCbyDbyEbyFbyGbyHbyIbyJbyKbyLbyMbyNbvZbvZbyObyPbyQbyRbySbyTbyUbyVbqGbyWbyXbqIbyYbyZbqGbzabokbzbbzcbqIbzdbpAbzebiabiabiabiabiabzfbkLbkLbzgbwubzhbzibzjbzkbzlbwAbwBbzmbxNbznbxNbzobxNbzpbwBbzqbzrbzsbztbzubwCbvtbzvbzwbzxbzybzzbzzbzzbzzbzzbzzbzAbzBbzCbwHaZOaZNaZObxXbxXbxXbxXbxXaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbuhbuibzDbzEbzEbvJbvJbvJbvJbvJbvJbvJbvJbuibuiaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8123,13 +8122,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaabPdbPdbPdbPdbPdbPebPfbPgbPhbPhbPibNhbMdbPjbPjbPjbPjbPjbPjbPjbPjbPkbPkbPlbPkbPkbPmbypbvUbPnbFQbKabOtbPobPpbPqbPrbLibPsbPtbLibLibPubPvbPwbPxbPybPzbPAbPBbIkbOFbPCbPDbPEbLrbJqbPFbNxbNxbItaafbPGbPHbPHbPHbxvbHrbHsbPIbKCbIBbPJbPKbNAbPLbPKbPLbNAbNFbMObLGbLHbLIbLIbPMbLKbGwbLLbLMbPNbPObxNbxNbxNbwBbLPbLQbPPbPPbPPbPPbPPbPPbPPbPPbPPbPQbPPbPRbNUbPSbPTbPUbNUaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbPVbPWbPXbPYbPXbPZbQabQbbQcbQdbQebNhbMdbPjbQfbQgbQhbQibQjbQkbQfbQlbQmbQnbQobPkbPkbypbvUbQpbFQbKabQqbQrbQsbQtbQubQvbQwbQxbQwbQybQzbQAbHabHabHabQBbIkbODbIkbOFbOGbQCbKraafbItbItbItbItbItaafaafaafaafaafbsubHrbHsbQDbKCbQEbQFbPKbIBbQGbPKbQGbQHbNFbMObLGbxNbQIbxNbQJbMQbGwbMRbGwbMSbQKbxNbQIbxNbwBbLPbQLaZObQMbQNaZOaZOaZObQMbQObQObQNaZOaZObNUbQPbQQbQRbNUaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbPVbQSbQTbQUbQVbPgbQWbPgbQXbPgbQYbQZbRabPjbQfbRbbRcbQfbRdbRebQfbRfbRgbRhbRibRjbPkbypbvUbPnbFQbKabRkbRlbFYbRmbRnbFYbRobRpbRqbFYbRrbMrbRsbHabRtbPBbIkbPzbRubRvbRwbRxbNvbJpbJqbRybRzbRAbItaafaaaaaaaaaaaabJubHrbHsbRBbQGbRCbRDbREbMAbRFbREbRFbMAbNFbMObLGbxNbxNbxNbRGbRHbLMbNIbGwbNJbRIbLIbLIbNLbwBbLPbQLaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaabRJbRKbRLbRMbRNaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbPVbRObRPbRQbRPbRRbRSbRTbRUbRVbRWbNhbRXbPjbRYbRYbRZbQfbSabRYbRYbRfbSbbScbSdbSebSfbSgbShbSibSjbSkbSlbSmbSnbSobSpbSqbSrbSsbStbFYbIkbMrbRsbSubRtbSvbIkbPzbRubOFbOGbSwbKraafbKsbSxbSybSzbItaafaaaaaaaaaaaabKvbHrbHsbHsbSAbSBbHsbHsbHsbHsbHsbHsbHsbNFbMObLGbDJbDJbDJbDJbOVbSCbMRbSDbOVbDJbDJbDJbDJbwBbLPbSEaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaafbSFbSGbSFaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbPVbRObRPbRQbRPbRRbRSbRTbRUbRVbRWbNhbRXbPjbRYbRYbRZbQfbSabRYbRYbRfbSbbScbSdbSebSfbSgbShbSibSjbSkbSlbSmbSnbSobSpbSqbWmbSsbStbFYbIkbMrbRsbSubRtbSvbIkbPzbRubOFbOGbSwbKraafbKsbSxbSybSzbItaafaaaaaaaaaaaabKvbHrbHsbHsbSAbSBbHsbHsbHsbHsbHsbHsbHsbNFbMObLGbDJbDJbDJbDJbOVbSCbMRbSDbOVbDJbDJbDJbDJbwBbLPbSEaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaafbSFbSGbSFaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbPdbPdbPdbPdbPdbNhbNhbNhbNhbNhbNhbNhbSHbPjbRYbRYbQfbQfbQfbRYbSIbSJbSKbSLbSMbSNbPkbypbvUbSObSPbSQbSRbSSbSTbSUbSVbSWbSXbSYbSZbFYbTabTbbRsbHabRtbTcbIkbTdbRubOFbTebTfbPEbLrbJqbTgbRzbRzbItaafaaaaaaaaaaaabLtbHrbThbHsbHsbTibHsbTjbTkbTlbThbThbThbTmbMObLGbLHbLIbLIbTnbLKbGwbLLbLMbTobTpbxNbxNbxNbwBbLPbTqaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafbTrbRLbTraafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafUafUafUafTafTafUafTafTafTagzafTafTafTafUafTaafaafaafbvUbCTbypbypbypbypbypbypbypbypbypbMdbPjbTsbTtbTubTvbQfbQfbTwbTxbTwbTybRibTzbPkbypbTAbJZbFQbTBbTCbTDbSTbTEbTFbTGbTHbTIbTJbTKbJgbTLbHabHabHabTMbIkbTNbTObOFbOGbIkbKraafbItbItbItbItbItaafaafaafaafaafbsubOLbGnbGnbGnbTPbGnbGnbGnbGnbGnbGnbGnbTQbTRbLGbxNbxNbxNbTSbMQbGwbMRbGwbMSbTTbxNbxNbxNbwBbLPbTqaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaaabTUaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafUaaaaaaaafaafaaaaafaafaaaaaaaafaafaafaaaafTaafaaaaaabvUbTVbTWbvUbvUbTXbTYbvUbvUbvUbvUbMdbPjbTZbRYbQfbQfbQfbRYbSIbUabUbbUcbUdbUebSfbShbShbUfbUgbUhbTCbTCbUibSUbUjbUkbUlbUmbUnbFYbIkbInbUobUpbUqbKkbUrbUsbUtbRvbUubUvbNvbJpbJqbUwbUxbUxbItaafaaaaaaaaaaaabPGbPHbPHbPHbPHbUybUzbUzbUzbUzbUzbUzbUzbUAbUBbUCbxNbxNbxNbUDbUEbUFbUGbGwbNJbUHbLIbLIbNLbwBbLPbTqaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaaaaafaaabTUaaaaafaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafUaaabUIbUJbUKaaabUIbUJbUKaaabUIbUJbUKaafafTaaaaaaaaabvUbvUbvUbvUaaaaaaaaaaaaaaaaafbvUbMdbPjbRYbULbUMbQfbUNbRYbRYbRfbUObUcbRibUPbPkbUQbURbUSbUTbUUbUVbUWbUXbSUbUXbSTbSTbSUbUYbFYbUZbVabVbbLibLibLkbNobVcbNsbLlbOGbVdbKraafbKsbVebVfbVgbItaafaaaaaaaaaaaaaafaaaaaaaaabwcbVhbVibVjbVkbVlbVibVibVmbsubVnbLGbwBbwBbwBbwBbwBbwBbVobwBbwBbwBbwBbwBbwBbwBbLPbVpaaaaaaaaaaaaaaaaaabVqbVqbVqbVraafaafaafaafbTUaafaafaafaafaafagzbVqbVqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafUaaabUIbVsbUKaaabUIbVsbUKaaabUIbVsbUKaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaabvUbvUbvUbvUbMdbPjbQfbVtbVubQfbVvbVwbQfbRfbVxbVybVzbVAbVBbVCbVDbVEbVFbVGbVHbVIbVJbVKbVLbSTbSTbSUbVMbFYbVNbIkbInbNobIrbVObVPbVQbVRbHobVSbVTbPEbLrbJqbVUbUxbUxbItaafaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaabVVbThbVWaaaaaaaafbFqbVXbVYbVZbVZbVZbVZbVZbVZbWabWbbWbbWbbWbbWbbWbbWbbWcbQLaaaaaaaaaaaaaaaaaabVqaaaaafaaaaafaaaaaaaaabWdaaaaafaafaaaaaaaaaaaabVqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaafTaafbUIbVsbUKaaabUIbVsbUKaafbUIbVsbUKaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaabWebWfbWebypbMdbPjbQfbWgbWhbWibWjbWkbQfbWlbWmbWnbWobWpbPkbWqbWrbWsbWtbWubWvbWwbWxbWybWzbWAbWBbWCbWDbFYbWEbKnbWFbWGbIkbIkbIkbIqbOAbWGbOGbQCbKraafbItbItbItbItbItaafaafaafaafaafaafaafaafaafaafaafaafbWHbVkbWIaaaaaaaafbFqbWJbPPbWKbWLbWMbWMbPPbPPbPPbPPbWNbPPbPPbWObWPbWQbWRbWSaaaaaaaaaaaaaaaaaabVqaaabWTbWTbWTbWTbWTaafbWUaafbWTbWTbWTbWTbWTaaabVqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaafTaafbUIbVsbUKaaabUIbVsbUKaafbUIbVsbUKaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaabWebWfbWebypbMdbPjbQfbWgbWhbWibWjbWkbQfbWlbSrbWnbWobWpbPkbWqbWrbWsbWtbWubWvbWwbWxbWybWzbWAbWBbWCbWDbFYbWEbKnbWFbWGbIkbIkbIkbIqbOAbWGbOGbQCbKraafbItbItbItbItbItaafaafaafaafaafaafaafaafaafaafaafaafbWHbVkbWIaaaaaaaafbFqbWJbPPbWKbWLbWMbWMbPPbPPbPPbPPbWNbPPbPPbWObWPbWQbWRbWSaaaaaaaaaaaaaaaaaabVqaaabWTbWTbWTbWTbWTaafbWUaafbWTbWTbWTbWTbWTaaabVqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaabUIbVsbUKaafbUIbVsbUKaaabUIbVsbUKaaaaafaafaafaafaafaafaaaaafaaaaafaafbvUbvUbvUbypbMdbPjbPjbPjbPjbPjbPjbPjbPjbPkbPkbPkbPkbPkbPkbvUbWVbvUbWWbWXbWXbWXbWYbWZbXabWXbXbbXcbXdbXebXfbXgbLnbXhbXibXjbXibXhbXkbXhbXlbNobXmaafaafaafaafaafaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafbFqbXnbQMbQObQObQNaZObQMbQObQObQNaZObQMbQObQObQNaZOaZOaZOaaaaaaaaaaaaaaaaaabVqaafbXobXpbXpbXpbXpbXqbWUbXrbXsbXsbXsbXsbXtaafbVqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafUafUafTaafaaabUIbVsbUKaafbUIbVsbUKaaabUIbVsbUKaafaafaaaaaaaaaaaaaafaafbXubXvbXvbXvbXvbXwbypbypbMdbvUbXxbKPbXybXybXybXybXybXybXybXybXybXzbXzbXybXAbXBbWWbXCbXDbXEbXFbXGbXHbWXbXIbXJbXKbFYbXLbXMbXNbXObXPbXQbXRbXSbIkbXTbXUbXVbImaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbXWbXXaaaaafaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaabVqaafbXYbXYbXYbXYbXYaaabWUaaabXYbXYbXYbXYbXYaafbVqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafUaaaaafaaaaafaafbXZaafaafaafbXZaafaaaaafbXZaafaaaaafaaaaaaaaaaaabYabYbbYcbYdbYebYfbYgbYhbYibYibYjbvUbYkbYlbYmbYmbYmbYmbYmbYmbYmbYmbYmbYmbYmbYmbYnbYobYpbYqbYrbYsbYtbYubYvbYwbYxbYybYzbYAbYBbYCbYDbYEbYDbYCbYDbYEbYDbYFbYDbYFbYGaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYHbXXaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaabVqaaaaafaaaaafaafaafaaabWUaaaaafaaaaafaaaaafaaabVqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8831,7 +8830,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFFcFNcFNcFNcFNcFNcFNcFNcFNcFNcFOcFNcFPcFNcFPcFFcFQcFRcFRcFRcFQcFScFTcFUcFVcFQcFWaafafUaafcDgcDgcCFcCGcCGcCGcCFcDgcDgcCFcCGcCmcCmcCmcCmaaacEScETcELcEJcEMcFbcELcFbcEJcFbcFbcFXcFbaagcFecFecFeaagcFecFLcFKcFMcFMcFLcFYcFBcFBcFBcFBcFBcFEcFEcFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFFcFNcFNcFNcFNcFNcFNcFNcFNcFNcFNcFNcFNcFNcFNcFFcFZcFZcFZcGacFZcGbcGccFUcFUcGdaafaafaafaafcCmcCmcDgcGecCHcCFcDgcCmcCmcCmcCmcCmcCmaafaafcFmcGfcETcELcEMcEMcELcFmcFbcFbcFXcFbcFmcGgahDahDcGhcGhcGicGhcFucFucFucFucFucFucFBcFBcGjcFBcFBcFBcFBcFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFFcFPcFNcFNcFNcFNcFNcFNcFFcFFcFFcFFcFFcGkcFFcFFcGlcFZcFZcFZcFZcGmcGbcGccFUcFUcFUcFUaafaafcCmcCmcCmcCmcCJcCmcCmcCmcCmcCmcCmaafaaaaagcEJcFmcEKcELcELcEJcEMcELcELcFmcERcERcERcERcERaafaafaafaaaaaaaaacGncFfcGnaagcCecFucFzcFzcFBcFzcGocFBcGpcFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFFcFPcFPcFNcGqcFNcFNcFNcFFcFNcFNcFOcFNcFNcFNcGkcFZcFZcFZcFZcFZcFZcGbcGccFUcFUcFUcFUaaaaafaafcCmcCmcGrcCJcCJcCmcCmaafaafaafaaaaaacGscEJcETcEKcELcELcEJcEJcEJcEJcFbcERcFpcFecFpcGtaaaaafaaaaaaaaaaaaaaaaaacGnaafcGtcFucGucGucFBcGucGvcFBcFBcFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFFcFPcFPcFNcGqcFNcFNcFNcFFcFNcFNcFOcFNcFNcFNcGkcFZcFZcFZcFZcFZcFZcGbcGccFUcFUcFUcFUaaaaafaafcCmcCmcGrcCJcCJcCmcCmaafaafaafaaaaaaaagcEJcETcEKcELcELcEJcEJcEJcEJcFbcERcFpcFecFpcGtaaaaafaaaaaaaaaaaaaaaaaacGnaafcGtcFucGucGucFBcGucGvcFBcFBcFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFFcFFcFFcFFcFFcFFcFFcGwcFFcGxcFNcGxcFNcGxcFNcFFcFZcFZcFZcFZcFZcGycFZcGbcGccFUcFUcFUaaaaaaaafaafcCmcCmcCmcCmcCmaafaafaaaaaacGzcGzcGAcEJcELcGBcELcEMcEJcEMcFbcELcFbcERcFecGtcFecFeaaaaafaaaaaacCgaaaaaaaaaaaacGtaafcFucFBcFBcFBcFBcGCcFzcFzcFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwtcGDcGEcGFcGEcGFcGEcGFcGEcFFcGxcFNcGxcFNcGxcFNcGkcFZcFZcFZcFZcFZcGGcFZcGHcGbcGIcGccFUcFUcGJcFQcFQcFQcFQcGKcGKaafaaaaafaaacyLaaaaaaaagcEJcEJcGBcELcEJcEJcFmcEMcFmcFbcERcFecGnaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaacFpcFucFvcFBcFBcFvcFvcFvcFvcFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwtcGLcGMcGNcGMcGNcGMcGNcGMcFFcFNcFNcFNcFNcFNcFNcFFcFZcFZcFZcFZcFZcGOcFZcGPcFZcGbcGbcGccFUcFUcGQcFUcGQaagaagaagaagaaaaafaafaafaafaaaaagcEJcEMcGRcEMcEMcEJcEMcEMcEMcEMcERcGtcFeaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaacFucFucFucFBcFBcFvcGScGScGScFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9043,27 +9042,27 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLVcLWcLVaafaaaaaaaaacLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLScLScLScLQcLQcLQcLQcLQcLQcLQcLScLScLScLScLScLQcLQcLQcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLXcLYcLZcMaaafaaaaaacLQcLQcLQcLQcLQcLQcLQcLScLQcLQcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMbcMccMdcLVaafaaaaaacLQcLQcLQcLQcLScLScLScLQcLQcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRcLRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMbcMecMfcMgaafaafcLScLScLQcLQcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScMhcMhcMhaafaafaafaafaafaafaafaafaafaafcMicMicLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLRcLRcLRcLRcLRaaacLRcLRcLRcLRcLRaaacLRcLRcLRcLRcLRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMbcOKcMfcMgaafaafcLScLScLQcLQcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScMhcMhcMhaafaafaafaafaafaafaafaafaafaafcMicMicLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLRcLRcLRcLRcLRaaacLRcLRcLRcLRcLRaaacLRcLRcLRcLRcLRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMjcMdcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScMhcMhcMhaagaagaagaagaagaagaagaagaagaagcMicMicMicMicLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLRcLRcLRcLRcLRaaacLRcLRcLRcLRcLRaaacLRcLRcLRcLRcLRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcMlcMmcMncMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScMhaafaafaafaafaafcMoaafaafaafcMicMicMicLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLRcLRcLRcLRcLRaaaaaaaaaaaaaaaaaaaaacLRcLRcLRcLRcLRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcMpcMqcMrcMscMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcMtcMucMvcMkcMwcMxcMkcMkcMkcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcMycMzcMbcMAcMBcMCcLTcMfcMDcMkcMEcMFcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcMGcMHcMzcMIcMJcMKcMLcMMcMDcMNcMFcMOcMEcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLScLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMPcMGcMQcMGcMbcMbcMwcMRcMJcMkcMscMScMkcMFcMTcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLScLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcMUcMVcMbcMWcMXcMbcMncMYcMKcMZcNacNbcMkcMkcMkcMkcMkcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcNccNccNdcNccNccNccLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcNecNfcNgcMbcMXcNhcMIcNicMJcNjcMkcNkcNlcMkcNmcMDcNncNocMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcNccNpcNqcNrcNscNccLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLQcLQcLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafcLScLScMkcMCcNtcNucNvcNgcNwcNxcMKcNycLTcMfcNzcMkcNmcMscMDcNocMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcLQcLQcMicMicMicMicMicMicLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafcNccNAcNBcNCcNDcNccLQcLQcMicMicMicMicLQcLQcLQcLScLScLScLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcMkcMkcMkcMkcMkcMkcMBcMJcNEcNtcMJcMYcNFcNycNycMMcMDcNkcMkcNmcMncNGcNocMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcMicMicMicNHcNHcNHcNHcMicMicMicLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaafcNccNccNccNccNccNIcNJcNccNccNccNccNccNccNccNccNccNHcMicLQcLQcLScLScLScLScLQcLQcLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcMkcNKcMfcMKcNLcMkcNMcNNcNOcMkcMZcMkcNPcNQcNRcMkcMfcNScLWcNTcMncMrcLWcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcLQcMicMicNHcNHcNHcNHcNHcNHcNHcNHcMicMicLQcLQcLQcLQaaaaaaaaaaaaaaaaafaafaafcNccNUcNVcNWcNXcNYcNZcOacNVcNVcNVcObcOccOdcOecNccNHcNHcLQcLQcLScLScLScLScLScLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLScMkcNKcMncMfcMIcMZcNScNtcOfcNtcOgcMfcMfcOhcMDcMfcMncMncMkcLWcOicMncMfcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcMicMicNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcMicMicLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaafcNccOjcNVcOkcOlcOmcOncOocNccNccOpcOqcOrcOrcOscNccNHcNHcLQcLQcLScLScLScLScLScLScLScLQcLQcLScLQcLQcLQcLQcLQcLQcLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLScLScMkcNKcOtcMncMncMZcMncNGcMwcMncOucOgcNGcNzcOvcMncOwcMscMkcNtcLWcNScMfcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcMicOxcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcOycMicMicMicMicMiaaaaaaaaaaaaaaaaaaaafcNccOzcOAcOBcOCcOBcODcNVcOEcNccOFcOGcOHcOIcNHcNHcNHcMicLQcLQcLQcLScLScLScLScLScLScLScLQcLQcLScLScLQcLQcLQcLQcLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLScLScLScMkcNKcOJcMIcMBcMkcOKcMkcOLcOMcMkcMKcMkcOLcOMcMkcMJcNScMkcOhcONcLWcNkcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcMicOOcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcOPcOxcMicMicMiaaaaaaaaaaaaaaaaaaaaaaafcNccOQcNVcORcNXcNVcOScNVcOEcNccOFcNHcNHcNHcNHcNHcMicMicLQcLQcLQcLScLScLScLScLScLScLScLScLScLQcLQcLScLQcLQcLQcLQcLQcLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLScLScLScLScLScLScMkcMkcMkcMkcMkcMkcOKcMkcOTcMDcMKcNkcMscMJcNwcMJcNbcMIcMkcOLcOUcOVcOWcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcMicOycNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcMiaaaaaaaaaaaaaaaaaaaaaaafaafcNccOXcNVcOYcOlcOZcNVcNVcOEcNccOFcNHcNHcNHcNHcNHcNHcMicLQcLQcLQcLScLScLScLScLScLScLScLScLScLScLQcLQcLScLQcLQcLQcLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLScLScLScLScLScLScLScLScLScLScLScLScMkcOKcMkcMDcNkcPacMYcMdcMIcMDcMkcMJcMscMkcPbcPccPccPdcMkcPecLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcMicMicNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHaaaaaaaaaaaaaaaaaaaaaaafaafaafcNccNccPfcPgcNccNccPhcPicPhcNccOFcNHcNHcNHcNHcNHcNHcMicMicLQcLQcLScLScLScLScLScLScLScLScLScLScLScLQcLQcLQcLQcLQcLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLScLScLScLScLScLScLScLScLScLScLScLScMkcOKcMkcNkcMfcNbcMDcMJcMscNbcMkcOKcMkcMkcNmcLWcPccPjcPkcPecPecLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcMicMicNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcPlcPmcPncPocPocPocPocPocPocPpcPlcPmcNHcNHcPqcPrcPscNccPtcNVcPucNccOFcNHcNHcNHcNHcNHcNHcNHcMicLQcLQcLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcLQcLQcLQcLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLScLScLScLScLScLScLScLScLScLScLScLScLScMkcOKcMkcMkcMkcMkcMkcMkcMkcMkcMkcOKcMkcNmcLWcNncLWcPdcPvcPecPecLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcMicNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcPwcPxcPxcPxcPxcPxcPxcPxcPxcPwcNHcNHcNHcPycPycPycNccPzcPAcPBcNccOFcNHcNHcNHcNHcNHcNHcOPcOxcLQcLQcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcLQcLQcLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCaaaaaaaaaaaaaaacPCcLScLScLScLScLScLScLScLScLScLScLScLScLScLScMkcOKcOKcOKcOKcOKcOKcOKcOKcOKcOKcOKcMkcNmcNncNncNncNocMkcPecPecPecLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcMicNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcPlcPmcPDcPEcPEcPEcPEcPEcPEcPEcPlcPmcNHcNHcNHcNHcNHcNccPhcPFcPhcNccPGcNHcNHcNHcNHcNHcNHcNHcMicLQcLQcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcLQcLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcMlcONcMncMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScMhaafaafaafaafaafcMoaafaafaafcMicMicMicLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLRcLRcLRcLRcLRaaaaaaaaaaaaaaaaaaaaacLRcLRcLRcLRcLRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcMpcMqcNtcMmcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcMtcMucMvcMkcNacMxcMkcMkcMkcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcMycMzcMbcMAcMBcMCcLTcMfcMecMkcNScNzcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcMGcMHcMzcMIcMJcMKcNGcMMcMecNvcNzcNwcNScMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLScLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMPcMGcMQcMGcMbcMbcNacMRcMJcMkcMmcMScMkcNzcOgcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLScLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcMUcMVcMbcMWcMXcMbcMncMscMKcMZcNTcMwcMkcMkcMkcMkcMkcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcNccNccNdcNccNccNccLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcNecNfcNgcMbcMXcOwcMIcNicMJcNjcMkcMrcNlcMkcNmcMecNncNocMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcNccNpcNqcNrcNscNccLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLQcLQcLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafcLScLScMkcMCcMOcNucOicNgcMLcNxcMKcNycLTcMfcNbcMkcNmcMmcMecNocMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcLQcLQcMicMicMicMicMicMicLQcLQcLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafcNccNAcNBcNCcNDcNccLQcLQcMicMicMicMicLQcLQcLQcLScLScLScLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcMkcMkcMkcMkcMkcMkcMBcMJcNEcMOcMJcMscNFcNycNycMMcMecMrcMkcNmcMncMYcNocMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcMicMicMicNHcNHcNHcNHcMicMicMicLQcLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaaaaafcNccNccNccNccNccNIcNJcNccNccNccNccNccNccNccNccNccNHcMicLQcLQcLScLScLScLScLQcLQcLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcMkcNKcMfcMKcNLcMkcNMcNNcNOcMkcMZcMkcNPcNQcNRcMkcMfcMEcLWcNkcMncNtcLWcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcLQcMicMicNHcNHcNHcNHcNHcNHcNHcNHcMicMicLQcLQcLQcLQaaaaaaaaaaaaaaaaafaafaafcNccNUcNVcNWcNXcNYcNZcOacNVcNVcNVcObcOccOdcOecNccNHcNHcLQcLQcLScLScLScLScLScLScLQcLQcLQcLQcLQcLQcLQcLQcLQcLQcLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLScMkcNKcMncMfcMIcMZcMEcMOcOfcMOcMTcMfcMfcOhcMecMfcMncMncMkcLWcMNcMncMfcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcMicMicNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcMicMicLQcLQcLQcLQaaaaaaaaaaaaaaaaaaaafcNccOjcNVcOkcOlcOmcOncOocNccNccOpcOqcOrcOrcOscNccNHcNHcLQcLQcLScLScLScLScLScLScLScLQcLQcLScLQcLQcLQcLQcLQcLQcLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLScLScMkcNKcOtcMncMncMZcMncMYcNacMncOucMTcMYcNbcOvcMncNhcMmcMkcMOcLWcMEcMfcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcMicOxcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcOycMicMicMicMicMiaaaaaaaaaaaaaaaaaaaafcNccOzcOAcOBcOCcOBcODcNVcOEcNccOFcOGcOHcOIcNHcNHcNHcMicLQcLQcLQcLScLScLScLScLScLScLScLQcLQcLScLScLQcLQcLQcLQcLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLScLScLScMkcNKcOJcMIcMBcMkcGscMkcOLcOMcMkcMKcMkcOLcOMcMkcMJcMEcMkcOhcMDcLWcMrcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcMicOOcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcOPcOxcMicMicMiaaaaaaaaaaaaaaaaaaaaaaafcNccOQcNVcORcNXcNVcOScNVcOEcNccOFcNHcNHcNHcNHcNHcMicMicLQcLQcLQcLScLScLScLScLScLScLScLScLScLQcLQcLScLQcLQcLQcLQcLQcLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLScLScLScLScLScLScMkcMkcMkcMkcMkcMkcGscMkcMFcMecMKcMrcMmcMJcMLcMJcMwcMIcMkcOLcOUcOVcOWcMkcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcMicOycNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcMiaaaaaaaaaaaaaaaaaaaaaaafaafcNccOXcNVcOYcOlcOZcNVcNVcOEcNccOFcNHcNHcNHcNHcNHcNHcMicLQcLQcLQcLScLScLScLScLScLScLScLScLScLScLQcLQcLScLQcLQcLQcLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLScLScLScLScLScLScLScLScLScLScLScLScMkcGscMkcMecMrcPacMscMdcMIcMecMkcMJcMmcMkcPbcPccPccPdcMkcPecLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcMicMicNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHaaaaaaaaaaaaaaaaaaaaaaafaafaafcNccNccPfcPgcNccNccPhcPicPhcNccOFcNHcNHcNHcNHcNHcNHcMicMicLQcLQcLScLScLScLScLScLScLScLScLScLScLScLQcLQcLQcLQcLQcLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLScLScLScLScLScLScLScLScLScLScLScLScMkcGscMkcMrcMfcMwcMecMJcMmcMwcMkcGscMkcMkcNmcLWcPccPjcPkcPecPecLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcMicMicNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcPlcPmcPncPocPocPocPocPocPocPpcPlcPmcNHcNHcPqcPrcPscNccPtcNVcPucNccOFcNHcNHcNHcNHcNHcNHcNHcMicLQcLQcLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcLQcLQcLQcLScLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLScLScLScLScLScLScLScLScLScLScLScLScLScMkcGscMkcMkcMkcMkcMkcMkcMkcMkcMkcGscMkcNmcLWcNncLWcPdcPvcPecPecLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcMicNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcPwcPxcPxcPxcPxcPxcPxcPxcPxcPwcNHcNHcNHcPycPycPycNccPzcPAcPBcNccOFcNHcNHcNHcNHcNHcNHcOPcOxcLQcLQcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcLQcLQcLScLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCaaaaaaaaaaaaaaacPCcLScLScLScLScLScLScLScLScLScLScLScLScLScLScMkcGscGscGscGscGscGscGscGscGscGscGscMkcNmcNncNncNncNocMkcPecPecPecLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcMicNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcPlcPmcPDcPEcPEcPEcPEcPEcPEcPEcPlcPmcNHcNHcNHcNHcNHcNccPhcPFcPhcNccPGcNHcNHcNHcNHcNHcNHcNHcMicLQcLQcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcLQcLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScMkcMkcMkcMkcMkcMkcMkcMkcMkcMkcMkcMkcMkcMkcOWcPHcPIcMkcMkcPecPecPecPecLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcMicNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHaaaaaaaaaaaaaaaaaaaaaaaaaaacMicMicMicNHcNHcNHcNHcNHcNHcPJcPKcPLcPMcPNcPOcNHcNHcNHcNHcMicMicMicLQcLQcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcLQcLScLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScPecPecPecMkcPccPccNncMkcPecPecPecPecPecLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcMicNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHaaaaaaaaaaaaaaaaaaaaaaaacMicMicMicMicMicMicMicMicNHcNHcNHcNHcNHcNHcPJcPPcPLcNHcNHcNHcMicMicLQcLQcLQcLQcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLQcLQcLQcLQcLQcLScLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcPCcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScPecPecPecMkcPQcPRcPQcMkcPecPecPecPecPecLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcMicNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHcNHaaaaaaaaaaaaaaaaaaaaaaaacMicMicMicLQcLQcLQcLQcMicMicMicNHcNHcNHcNHcNHcPScNHcNHcNHcNHcMicLQcLQcLQcLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLScLQcLScLScLQcLQcLQcLQcLScLScLScLSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9505,3 +9504,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} +