diff --git a/src/js/generateNewSlaveJS.tw b/src/js/generateNewSlaveJS.tw
new file mode 100644
index 0000000000000000000000000000000000000000..056ca833fe772f0b7752984e005d090cfc8f99cf
--- /dev/null
+++ b/src/js/generateNewSlaveJS.tw
@@ -0,0 +1,1399 @@
+:: Generate New Slave JS [script]
+
+window.GenerateNewSlave = (function(){
+	'use strict';
+	let V, slave;
+
+	function GenerateNewSlave(sex) {
+		V = State.variables;
+		BaseSlave();
+		slave = V.activeSlave;
+
+		preGenCombinedStats();
+		if (!sex) {
+			if (jsRandom(0,99) < V.seeDicks) {
+				GenerateXYSlave();
+			} else if (V.seeDicks > 0) {
+				var femaleSlaveGen = 80;
+				if (V.arcologies[0].FSGenderFundamentalistSMR == 1 || V.arcologies[0].FSRepopulationFocusSMR == 1) {
+					femaleSlaveGen = 90;
+				} else if (V.arcologies[0].FSGenderRadicalist != "unset") {
+					femaleSlaveGen = 50;
+				}
+				if (jsRandom(1,100) > femaleSlaveGen && jsRandom(0,99) < V.seeDicks) {
+					GenerateXYSlave();
+				} else {
+					GenerateXXSlave();
+				}
+			} else {
+				GenerateXXSlave();
+			}
+		} else if (sex == "XY") {
+			GenerateXYSlave();
+		} else {
+			GenerateXXSlave();
+		}
+
+		postGenCleanup();
+	};
+
+	function preGenCombinedStats() {
+		slave.ID = V.IDNumber++;
+		slave.weekAcquired = V.week;
+		slave.canRecruit = 1;
+		slave.devotion = jsRandom(-90,-60);
+		slave.trust = jsRandom(-45,-25);
+		slave.weight = jsRandom(-100,180);
+		slave.health = jsRandom(-50,50);
+		
+		WombInit(slave);
+		generateAge();
+		generateIntelligence();
+		generateCareer();
+		generateNationality(); /* includes race selection */
+		generateAccent();
+		nationalityToName(slave);
+		generateRacialTraits();
+	};
+
+	function postGenCleanup() {
+		generateBoobTweaks(); /* split this up for female vs. male? */
+		generateSkills();
+		generateDisabilities();
+		generatePronouns(slave);
+		if (passage() == "Slave Markets" && V.slaveMarket == "corporate" && V.captureUpgradeRace != "unselected" && V.captureUpgradeRace != "none") {
+			slave.race = V.captureUpgradeRace;
+		}
+	};
+
+	function GenerateXXSlave() {
+		slave.ovaries = 1;
+		slave.pubertyXY = 0;
+		slave.energy = jsRandom(1,85);
+		/* Superfetation as rare genetic disorder 1 from 100, not active for now. 
+		if (jsRandom(0,99) < 1) {
+			slave.superfetation = 1;
+		}
+		*/
+		
+		generateXXBodyProportions();
+		generateVagina();
+		generateXXPreferences();
+		generateXXButt();
+		generateXXBoobs();
+		generateXXFace();
+		generateXXPregAdaptation();
+		generateXXVoice();
+		generateXXTeeth();
+		generateXXMods();
+		generateXXBodyHair();
+		generateXXPuberty();
+	};
+
+	function GenerateXYSlave() {		
+		slave.genes = "XY";
+		slave.hLength = 10;
+		slave.prostate = 1;
+		slave.pubertyXX = 0;
+		slave.energy = jsRandom(15,90);
+		
+		generateXYBodyProportions();
+		generateDick();
+		generateCircumcision();
+		generateXYPreferences(); /* must happen after genitalia generation */
+		generateXYButt(); /* must happen after preferences */
+		generateXYBoobs();
+		generateXYFace();
+		generateXYPregAdaptation();
+		generateXYVoice();
+		generateXYTeeth();
+		generateXYMods();
+		generateXYBodyHair();
+		generateXYPuberty();
+	};
+
+	function generateXXBodyProportions() {
+		slave.height = Math.round(Height.random(slave));
+		if (slave.height >= Height.mean(slave) * 170/162.5) {
+			slave.hips = jsEither([-1, 0, 0, 1, 1, 2, 2]);
+			slave.shoulders = jsEither([-1, -1, 0, 0, 0, 1]);
+		} else {
+			slave.hips = jsEither([-1, 0, 0, 0, 1, 1, 2]);
+			slave.shoulders = jsEither([-2, -1, -1, 0, 0, 1]);
+		}
+		if (slave.physicalAge <= 11) {
+			slave.hips = jsEither([-2, -2, -1, -1, 0]);
+		} else if (slave.physicalAge <= 13) {
+			slave.hips = jsEither([-2, -1, -1, 0, 1]);
+		}
+		if (slave.weight < -30) {
+			slave.waist = jsRandom(-55,0);
+		} else if (slave.physicalAge < 13) {
+			slave.waist = jsRandom(-25,25);
+		} else if (slave.weight <= 30) {
+			slave.waist = jsRandom(-45,45);
+		} else if (slave.weight <= 160) {
+			slave.waist = jsRandom(0,55);
+		} else {
+			slave.waist = jsRandom(50,100);
+		}
+	};
+
+	function generateXYBodyProportions() {
+		slave.height = Math.round(Height.random(slave));
+		if (slave.physicalAge <= 13) {
+			if (slave.height > Height.mean(slave) * 170/172.5) {
+				slave.hips = jsEither(-2, -1, -1, 0, 1);
+				slave.shoulders = jsEither(-1, -1, 0, 0, 0, 1);
+			} else {
+				slave.hips = jsEither(-2, -2, -1, -1, 0);
+				slave.shoulders = jsEither(-2, -1, -1, 0, 0, 1);
+			}
+		} else {
+			if (slave.height > Height.mean(slave) * 170/172.5) {
+				slave.hips = jsEither(-2, -1, -1, 0, 1);
+				slave.shoulders = jsEither(-1, 0, 1, 1, 2, 2);
+			} else {
+				slave.hips = jsEither(-2, -2, -1, -1, 0);
+				slave.shoulders = jsEither(-1, 0, 0, 1, 1, 2);
+			}
+		}
+		if (slave.physicalAge < 13) {
+			slave.waist = jsRandom(-15,25);
+		} else if (slave.weight < -30) {
+			slave.waist = jsRandom(-45,45);
+		} else if (slave.weight <= 30) {
+			slave.waist = jsRandom(-15,65);
+		} else if (slave.weight <= 160) {
+			slave.waist = jsRandom(5,100);
+		} else {
+			slave.waist = jsRandom(50,100);
+		}
+	};
+
+	function generateVagina() {
+		if (slave.physicalAge <= 13) {
+			slave.vagina = jsEither([0, 0, 0, 0, 0, 0, 0, 1]);
+		} else if (slave.physicalAge <= 15) {
+			slave.vagina = jsEither([0, 0, 0, 0, 0, 0, 1, 1]);
+		} else if (slave.physicalAge <= 17) {
+			slave.vagina = jsEither([0, 0, 0, 0, 0, 1, 1, 1]);
+		} else if (slave.physicalAge < 20) {
+			slave.vagina = jsEither([0, 1]);
+		} else if (slave.physicalAge > 30) {
+			slave.vagina = jsEither([1, 1, 1, 1, 2]);
+		} else {
+			slave.vagina = jsEither([0, 0, 1, 1, 1]);
+		}
+		
+		if (slave.physicalAge <= 11) {
+			slave.clit = jsEither([0, 0, 0, 0, 0, 0, 0, 0, 1]);
+		} else if (slave.physicalAge <= 13) {
+			slave.clit = jsEither([0, 0, 0, 0, 0, 0, 0, 1, 1]);
+		} else if (slave.physicalAge <= 15) {
+			slave.clit = jsEither([0, 0, 0, 0, 0, 0, 0, 1, 2]);
+		} else {
+			slave.clit = jsEither([0, 0, 0, 0, 0, 0, 1, 1, 2]);
+		}
+		
+		if (slave.physicalAge <= 11) {
+			slave.labia = jsEither([0, 0, 0, 0, 0, 0, 0, 1, 1]);
+		} else if (slave.physicalAge <= 12) {
+			slave.labia = jsEither([0, 0, 0, 0, 0, 0, 1, 1, 1]);
+		} else if (slave.physicalAge <= 13) {
+			slave.labia = jsEither([0, 0, 0, 0, 0, 1, 1, 1, 1]);
+		} else if (slave.physicalAge <= 14) {
+			slave.labia = jsEither([0, 0, 0, 0, 1, 1, 1, 1, 2]);
+		} else if (slave.physicalAge <= 15) {
+			slave.labia = jsEither([0, 0, 0, 1, 1, 1, 1, 2, 2]);
+		} else {
+			slave.labia = jsEither([0, 0, 0, 1, 1, 1, 1, 2, 2, 3]);
+		}
+		
+		if (slave.energy < random(1,80)) {
+			slave.vaginaLube = 0;
+		} else if ( slave.physicalAge > random(35,60)) {
+			slave.vaginaLube = 0;
+		} else {
+			slave.vaginaLube = 1;
+		}		
+		slave.foreskin = jsRandom(0,4);
+	};
+
+	function generateDick() {
+		slave.vagina = -1;
+		slave.clit = 0;
+		slave.preg = 0;
+		
+		if (slave.physicalAge <= 13) {
+			slave.dick = jsEither([1, 1, 1, 1, 2, 2, 2, 3]);
+			if (V.seeExtreme == 1) {
+				slave.balls = jsEither([0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3]);
+			} else {
+				slave.balls = jsEither([1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3]);
+			}
+			slave.scrotum = slave.balls;
+		} else if (slave.physicalAge <= 15) {
+			slave.dick = jsEither([1, 1, 1, 2, 2, 2, 3]);
+			if (V.seeExtreme == 1) {
+				slave.balls = jsEither([0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4]);
+			} else {
+				slave.balls = jsEither([1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4]);
+			}
+			slave.scrotum = slave.balls;
+		} else if (slave.physicalAge <= 17) {
+			slave.dick = jsEither([1, 1, 2, 2, 3, 3]);
+			if (V.seeExtreme == 1) {
+				slave.balls = jsEither([0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 5]);
+			} else {
+				slave.balls = jsEither([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 5]);
+			}
+			slave.scrotum = slave.balls;
+		} else {
+			slave.dick = jsEither([1, 2, 2, 2, 3, 3, 3, 4, 4, 5]);
+			if (V.seeExtreme == 1) {
+				slave.balls = jsEither([0, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5]);
+			} else {
+				slave.balls = jsEither([1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5]);
+			}
+			if (slave.balls != 0) {
+				slave.scrotum = slave.balls + jsEither([0, 0, 1]);
+			} else {
+				slave.scrotum = 0;
+			}
+			if (jsRandom(1,100) < 3) {
+				slave.vasectomy = 1;
+			}
+		}
+	};
+
+	function generateCircumcision() {
+		/* The default rate of 50* is wildly unrepresentative, and there is extreme regional variation. */
+		/*
+		 What we want is the prevalence among newborns, since this game
+		 happens about 20 years in the future, but we'll use this lacking
+		 something better.
+		 https://pophealthmetrics.biomedcentral.com/articles/10.1186/s12963-016-0073-5
+		 Right now we mostly just break it down by country.
+		 It would be better to break it down by both country
+		 and race if statistics are available.
+		*/
+		if (V.seeCircumcision == 0) {
+			slave.foreskin = slave.dick + jsRandom(0,1);
+		} else {
+			/* Temporarily use activeSlave.foreskin to store the chance of circumcision. */
+			switch (slave.nationality) {
+				case "Afghan":
+				case "Iranian":
+				case "Moroccan":
+				case "Palestinian":
+				case "Sahrawi":
+				case "Tunisian":
+					slave.foreskin = 100;
+					break;
+				case "Comorian":
+				case "Gabonese":
+				case "Iraqi":
+				case "Jordanian":
+				case "Kurdish":
+				case "Mauritanian":
+				case "Nigerian":
+				case "Tajik":
+				case "Turkish":
+				case "Yemeni":
+					slave.foreskin = 99;
+					break;
+				case "Algerian":
+				case "Azerbaijani":
+				case "Liberian":
+				case "Maldivian":
+					slave.foreskin = 98;
+					break;
+				case "Djiboutian":
+				case "Eritrean":
+				case "Ivorian":
+				case "Libyan":
+				case "Saudi":
+				case "Uzbek":
+					slave.foreskin = 97;
+					break;
+				case "Nigerien":
+				case "Pakistani":
+				case "Sierra Leonean":
+				case "Turkmen":
+				case "Zairian":
+					slave.foreskin = 96;
+					break;
+				case "a Cook Islander":
+				case "Egyptian":
+				case "Gambian":
+				case "Guamanian":
+				case "Malagasy":
+				case "Nauruan":
+				case "Ni-Vanuatu":
+				case "Niuean":
+				case "Palauan":
+				case "Samoan":
+				case "a Solomon Islander":
+				case "Togolese":
+				case "Tongan":
+				case "Tuvaluan":
+					slave.foreskin = 95;
+					break;
+				case "Cameroonian":
+				case "Senegalese":
+				case "Somali":
+					slave.foreskin = 94;
+					break;
+				case "Bangladeshi":
+				case "Beninese":
+				case "Bissau-Guinean":
+				case "Indonesian":
+				case "Syrian":
+					slave.foreskin = 93;
+					break;
+				case "Ethiopian":
+				case "Filipina":
+				case "Ghanan":
+				case "Israeli":
+				case "Kosovan":
+					slave.foreskin = 92;
+					break;
+				case "Kenyan":
+				case "Kyrgyz":
+					slave.foreskin = 91;
+					break;
+				case "Burkinabé":
+				case "Omani":
+					slave.foreskin = 88;
+					break;
+				case "Equatoguinean":
+					slave.foreskin = 87;
+					break;
+				case "Kuwaiti":
+				case "Malian":
+					slave.foreskin = 86;
+					break;
+				case "Guinean":
+					slave.foreskin = 84;
+					break;
+				case "Bahraini":
+					slave.foreskin = 81;
+					break;
+				case "French Polynesian":
+					slave.foreskin = 78;
+					break;
+				case "American":
+				case "Qatari":
+					slave.foreskin = 77;
+					break;
+				case "Emirati":
+					slave.foreskin = 76;
+					break;
+				case "Chadian":
+					slave.foreskin = 74;
+					break;
+				case "Tanzanian":
+					slave.foreskin = 72;
+					break;
+				case "Congolese":
+					slave.foreskin = 70;
+					break;
+				case "Central African":
+					slave.foreskin = 63;
+					break;
+				case "Burundian":
+				case "Malaysian":
+					slave.foreskin = 61;
+					break;
+				case "Lebanese":
+					slave.foreskin = 60;
+					break;
+				case "Angolan":
+					slave.foreskin = 58;
+					break;
+				case "Fijian":
+				case "Kazakh":
+					slave.foreskin = 56;
+					break;
+				case "Bruneian":
+				case "Korean":
+				case "Mosotho":
+					/* Population-weighted average of South Korea and North Korea. */
+					slave.foreskin = 52;
+					break;
+				case "New Caledonian":
+					slave.foreskin = 50;
+					break;
+				case "Albanian":
+					slave.foreskin = 48;
+					break;
+				case "Mozambican":
+					slave.foreskin = 47;
+					break;
+				case "South African":
+					slave.foreskin = 45;
+					break;
+				case "Dominican":
+					slave.foreskin = 43;
+					break;
+				case "Bosnian":
+					slave.foreskin = 42;
+					break;
+				case "Sudanese":
+					slave.foreskin = 39;
+					break;
+				case "Mexican":
+					slave.foreskin = 38;
+					break;
+				case "Macedonian":
+					slave.foreskin = 34;
+					break;
+				case "a New Zealander":
+					slave.foreskin = 33;
+					break;
+				case "Canadian":
+					slave.foreskin = 32;
+					break;
+				case "Scottish":
+					slave.foreskin = 28;
+					break;
+				case "Australian":
+				case "Ugandan":
+					slave.foreskin = 27;
+					break;
+				case "Namibian":
+					slave.foreskin = 26;
+					break;
+				case "South Sudanese":
+					slave.foreskin = 24;
+					break;
+				case "Belgian":
+				case "Cypriot":
+				case "Thai":
+					slave.foreskin = 23;
+					break;
+				case "Malawian":
+					slave.foreskin = 22;
+					break;
+				case "British":
+					slave.foreskin = 21;
+					break;
+				case "Puerto Rican":
+					slave.foreskin = 20;
+					break;
+				case "Montenegrin":
+					slave.foreskin = 19;
+					break;
+				case "Mauritian":
+					slave.foreskin = 17;
+					break;
+				case "Motswana":
+				case "Singaporean":
+				case "Surinamese":
+					slave.foreskin = 15;
+					break;
+				case "Chinese":
+				case "French":
+				case "Indian":
+				case "Jamaican":
+					slave.foreskin = 14;
+					break;
+				case "Bulgarian":
+				case "Rwandan":
+				case "Zambian":
+					slave.foreskin = 13;
+					break;
+				case "French Guianan":
+				case "Guyanese":
+				case "Russian":
+					slave.foreskin = 12;
+					break;
+				case "German":
+					slave.foreskin = 11;
+					break;
+				case "Belarusian":
+				case "Georgian":
+				case "Papua New Guinean":
+					slave.foreskin = 10;
+					break;
+				case "Japanese":
+				case "Zimbabwean":
+					slave.foreskin = 9;
+					break;
+				case "Slovene":
+				case "Sri Lankan":
+				case "Swazi":
+				case "Taiwanese":
+					slave.foreskin = 8;
+					break;
+				case "Catalan":
+				case "Haitian":
+				case "Spanish":
+					slave.foreskin = 7;
+					break;
+				case "Austrian":
+				case "Dutch":
+				case "East Timorese":
+				case "Swiss":
+				case "Trinidadian":
+					slave.foreskin = 6;
+					break;
+				case "Danish":
+				case "Greek":
+				case "a Liechtensteiner":
+				case "Swedish":
+					slave.foreskin = 5;
+					break;
+				case "Burmese":
+				case "Cambodian":
+				case "Mongolian":
+				case "Nepalese":
+				case "Peruvian":
+				case "Serbian":
+					slave.foreskin = 4;
+					break;
+				case "Argentinian":
+				case "Italian":
+				case "Norwegian":
+					slave.foreskin = 3;
+					break;
+				case "Luxembourgian":
+				case "Tibetan":
+				case "Ukrainian":
+				case "Vincentian":
+					slave.foreskin = 2;
+					break;
+				case "Andorran":
+				case "Barbadian":
+				case "Bermudian":
+				case "Bhutanese":
+				case "Brazilian":
+				case "Croatian":
+				case "Finnish":
+				case "Hungarian":
+				case "Irish":
+				case "Moldovan":
+				case "Monégasque":
+				case "Panamanian":
+				case "Portuguese":
+				case "Seychellois":
+				case "Uruguayan":
+					slave.foreskin = 1;
+					break;
+				case "Antiguan":
+				case "Armenian":
+				case "Bahamian":
+				case "Belizean":
+				case "Bolivian":
+				case "Cape Verdean":
+				case "Chilean":
+				case "Colombian":
+				case "Costa Rican":
+				case "Cuban":
+				case "Czech":
+				case "Dominiquais":
+				case "Ecuadorian":
+				case "Estonian":
+				case "Greenlandic":
+				case "Grenadian":
+				case "Guatemalan":
+				case "Honduran":
+				case "I-Kiribati":
+				case "Icelandic":
+				case "Kittitian":
+				case "Laotian":
+				case "Latvian":
+				case "Lithuanian":
+				case "Maltese":
+				case "Marshallese":
+				case "Micronesian":
+				case "Nicaraguan":
+				case "Paraguayan":
+				case "Polish":
+				case "Romanian":
+				case "Saint Lucian":
+				case "Salvadoran":
+				case "Sammarinese":
+				case "São Toméan":
+				case "Slovak":
+				case "Vatican":
+				case "Venezuelan":
+				case "Vietnamese":
+					slave.foreskin = 0;
+					break;
+				default:
+					/* Some overlooked country, or possibly stateless. Use global average. */
+					slave.foreskin = 38;
+			}
+			/* Second pass for minorities in other countries. */
+			if (slave.race == "middle eastern" && slave.foreskin < 76) {
+				slave.foreskin = 76;
+			}
+			if (slave.race == "semitic" && slave.foreskin < 90) {
+				slave.foreskin = 90;
+			}
+			/* Chance activeSlave.foreskin back to the normal meaning. */
+			if (jsRandom(0,99) < slave.foreskin) {
+				slave.foreskin = 0;
+			} else {
+				slave.foreskin = slave.dick + jsRandom(0,1);
+			}
+		}
+	};
+
+	function generateXXPreferences() {
+		randomizeAttraction(slave);
+		slave.fetishStrength = jsRandom(0,90);
+		slave.fetish = jsEither(["none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "submissive", "submissive", "cumslut", "humiliation", "humiliation", "buttslut", "boobs", "pregnancy", "dom", "sadist", "masochist"]);
+		slave.behavioralFlaw = jsEither(["none", "none", "none", "arrogant", "bitchy", "odd", "hates men", "hates women", "hates women", "anorexic", "gluttonous", "devout", "liberated"]);
+		
+		if (slave.behavioralFlaw == "devout") {
+			slave.sexualFlaw = jsEither(["none", "repressed", "shamefast", "apathetic", "crude", "judgemental"]);
+		} else {
+			slave.sexualFlaw = jsEither(["none", "none", "none", "none", "hates oral", "hates anal", "hates penetration", "repressed", "idealistic", "shamefast", "apathetic", "crude", "judgemental"]);
+		}
+		if (slave.behavioralFlaw == "none" && jsRandom(1,10) == 1) {
+			slave.behavioralQuirk = jsEither(["confident", "cutting", "funny", "adores women", "adores men", "fitness", "insecure", "sinful", "advocate"]);
+		}
+		if (slave.sexualFlaw == "none" && jsRandom(1,10) == 1) {
+			slave.sexualQuirk = jsEither(["gagfuck queen", "painal queen", "strugglefuck queen", "tease", "romantic", "perverted", "caring", "unflinching", "size queen"]);
+		}
+	};
+
+	function generateXYPreferences() {
+		randomizeAttraction(slave);
+		slave.fetishStrength = jsRandom(0,90);
+		slave.fetish = jsEither(["none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "submissive", "cumslut", "humiliation", "buttslut", "buttslut", "boobs", "dom", "sadist", "masochist"]);
+		slave.behavioralFlaw = jsEither(["none", "none", "none", "arrogant", "bitchy", "odd", "hates men", "hates men", "hates men", "hates women", "anorexic", "gluttonous", "devout", "liberated"]);
+		
+		if (slave.behavioralFlaw == "devout") {
+			slave.sexualFlaw = jsEither(["none", "repressed", "shamefast", "apathetic", "crude", "judgemental"]);
+		} else {
+			slave.sexualFlaw = jsEither(["none", "none", "none", "none", "hates oral", "hates anal", "hates anal", "repressed", "idealistic", "shamefast", "apathetic", "crude", "judgemental"]);
+		}
+		if (slave.behavioralFlaw == "none" && jsRandom(1,10) == 1) {
+			slave.behavioralQuirk = jsEither(["confident", "cutting", "funny", "adores women", "adores men", "fitness", "insecure", "sinful", "advocate"]);
+		}
+		if (slave.sexualFlaw == "none" && jsRandom(1,10) == 1) {
+			slave.sexualQuirk = jsEither(["gagfuck queen", "painal queen", "strugglefuck queen", "tease", "romantic", "perverted", "caring", "unflinching", "size queen"]);
+		}
+	};
+
+	function generateXXButt() {
+		if (slave.physicalAge <= 11) {
+			slave.butt = jsEither([1, 1, 1, 1, 1, 1, 1]);
+		} else if (slave.physicalAge <= 12) {
+			slave.butt = jsEither([1, 1, 1, 1, 1, 2, 2]);
+		} else if (slave.physicalAge <= 13) {
+			slave.butt = jsEither([1, 1, 1, 1, 2, 2, 2]);
+		} else if (slave.physicalAge <= 14) {
+			slave.butt = jsEither([1, 1, 1, 2, 2, 2, 3]);
+		} else if (slave.physicalAge <= 15) {
+			slave.butt = jsEither([1, 1, 2, 2, 2, 2, 3]);
+		} else {
+			switch (slave.race) {
+				case "black":
+					slave.butt = jsEither([1, 2, 2, 3, 3, 4, 4]);
+					break;
+				case "indo-aryan":
+				case "malay":
+				case "pacific islander":
+				case "amerindian":
+				case "asian":
+				case "middle eastern": 
+				case "semitic":
+				case "southern european":
+					slave.butt = jsEither([1, 2, 2, 3, 3]);
+					break;
+				default:
+					slave.butt = jsEither([1, 2, 2, 3, 3, 4]);
+			}
+		}
+		if (V.weightAffectsAssets != 0) {
+			if (slave.weight < -10 && slave.butt > 1) {
+				slave.butt -= 1;
+			} else if (slave.weight > 100 && slave.butt < 6) {
+				slave.butt += jsRandom(1,2);
+			} else if (slave.weight > 10 && slave.butt < 4) {
+				slave.butt += 1;
+			}
+		}
+		slave.anus = jsEither([0, 0, 1, 1, 2]);
+		slave.analArea = slave.anus + jsEither([0, 0, 0, 1]);
+	};
+
+	function generateXYButt() {
+		if (slave.physicalAge <= 13) {
+			slave.butt = jsEither([1, 1, 1, 2, 2, 3, 3, 4]);
+		} else {
+			slave.butt = jsEither([1, 1, 2, 3]);
+		}
+		if (V.weightAffectsAssets != 0) {
+			if (slave.weight < -10 && slave.butt > 1) {
+				slave.butt -= 1;
+			} else if (slave.weight > 100 && slave.butt < 6) {
+				slave.butt += jsRandom(1,2);
+			} else if (slave.weight > 10 && slave.butt < 4) {
+				slave.butt += 1;
+			}
+		}
+		if (slave.attrXY > 0) {
+			slave.anus = jsEither([0, 1, 2]);
+		} else {
+			if (slave.physicalAge <= 13) {
+				slave.anus = jsEither([0, 0, 0, 0, 0, 1]);
+			} else if (slave.physicalAge <= 15) {
+				slave.anus = jsEither([0, 0, 0, 0, 1, 1, 1]);
+			} else if (slave.physicalAge <= 17) {
+				slave.anus = jsEither([0, 0, 0, 1, 1, 1]);
+			} else {
+				slave.anus = jsEither([0, 0, 1, 1, 2]);
+			}
+		}
+		slave.analArea = slave.anus + jsEither([0, 0, 0, 1]);
+	};
+
+	function generateXXBoobs() {
+		if (slave.physicalAge <= 10) {
+			slave.boobs = 100;
+		} else if (slave.physicalAge == 11) {
+			slave.boobs = jsEither([100, 100, 150, 150, 150, 300]);
+		} else if (slave.physicalAge == 12) {
+			slave.boobs = jsEither([100, 100, 150, 150, 150, 200, 200, 300]);
+		} else if (slave.physicalAge == 13) {
+			slave.boobs = jsEither([100, 150, 200, 200, 300, 300, 300, 400]);
+		} else if (slave.physicalAge == 14) {
+			slave.boobs = jsEither([100, 150, 200, 300, 300, 300, 350, 400, 400]);
+		} else if (slave.physicalAge == 15) {
+			slave.boobs = jsEither([150, 200, 300, 300, 300, 350, 350, 350, 400, 400, 450, 450]);
+		} else {
+			switch (slave.race) {
+				case "black":
+					slave.boobs = BoobGenerator.rollBreast(150);
+					break;
+				case "white":
+					slave.boobs = BoobGenerator.rollBreast(50);
+					break;
+				case "asian":
+					slave.boobs = BoobGenerator.rollBreast(-100);
+					break;
+				default:
+					slave.boobs = BoobGenerator.rollBreast(0);
+			}
+		}
+	};
+
+	function generateXYBoobs() {
+		slave.boobs = jsEither([100, 200, 200, 300, 300, 400, 500]);
+	};
+
+	function generateXXFace() {
+		slave.face = jsRandom(-60,60);
+		if (jsRandom(0,2) == 0) {
+			slave.face = jsRandom(-10,10);
+		}
+		if (slave.physicalAge > 40) {
+			slave.face -= jsRandom(0,20);
+		} else if (slave.physicalAge > 35) {
+			slave.face -= jsRandom(0,10);
+		} else if (slave.physicalAge <= 20) {
+			slave.face += jsRandom(0,20);
+		} else if (slave.physicalAge <= 25) {
+			slave.face += jsRandom(0,10);
+		}
+		if (slave.physicalAge > 10) {
+			slave.faceShape = jsEither(["androgynous", "cute", "sensual", "exotic", "normal", "normal"]);
+		} else {
+			slave.faceShape = jsEither(["androgynous", "androgynous", "cute", "cute", "sensual", "exotic", "normal", "normal"]);
+		}
+		switch (slave.faceShape) {
+			case "sensual":
+			case "cute":
+				slave.face += jsRandom(0,20);
+				break;
+			case "exotic":
+			case "androgynous":
+				slave.face += jsRandom(-10,10);
+				break;
+			case "masculine":
+				slave.face += jsRandom(-10,0);
+		}
+	};
+
+	function generateXYFace() {
+		slave.face = jsRandom(-70,20);
+		if (jsRandom(0,2) == 0) {
+			slave.face = jsRandom(-40,-10);
+		}
+		if (slave.physicalAge > 40) {
+			slave.face -= jsRandom(0,20);
+		} else if (slave.physicalAge > 35) {
+			slave.face -= jsRandom(0,10);
+		} else if (slave.physicalAge <= 20) {
+			slave.face += jsRandom(0,20);
+		} else if (slave.physicalAge <= 25) {
+			slave.face += jsRandom(0,10);
+		}
+		if (slave.physicalAge >= 17) {
+			slave.faceShape = jsEither(["masculine", "masculine", "masculine", "androgynous"]);
+		} else if (slave.physicalAge >= 15) {
+			slave.faceShape = jsEither(["masculine", "masculine", "masculine", "masculine", "masculine", "masculine", "masculine", "masculine", "androgynous", "sensual", "exotic", "normal"]);
+		} else if (slave.physicalAge >= 13) {
+			slave.faceShape = jsEither(["masculine", "masculine", "masculine", "androgynous", "cute", "sensual", "exotic", "normal"]);
+		} else if (slave.physicalAge >= 11) {
+			slave.faceShape = jsEither(["masculine", "androgynous", "cute", "sensual", "exotic", "normal", "normal"]);
+		} else {
+			slave.faceShape = jsEither(["androgynous", "androgynous", "cute", "cute", "sensual", "exotic", "normal", "normal"]);
+		}
+		switch (slave.faceShape) {
+			case "sensual":
+			case "cute":
+				slave.face += jsRandom(0,20);
+				break;
+			case "exotic":
+			case "androgynous":
+				slave.face += jsRandom(-10,10);
+				break;
+			case "masculine":
+				slave.face += jsRandom(-10,0);
+		}
+	};
+
+	function generateXXPregAdaptation() {
+		if (slave.physicalAge <= 6) {
+			slave.pregAdaptation = 5;
+		} else if (slave.physicalAge <= 11) {
+			slave.pregAdaptation = slave.physicalAge - 1;
+		} else if (slave.physicalAge <= 14) {
+			slave.pregAdaptation = 4*(slave.physicalAge - 12) + 14;
+		} else if (slave.physicalAge <= 15) {
+			slave.pregAdaptation = 28;
+		} else if (slave.physicalAge <= 16) {
+			slave.pregAdaptation = 34;
+		} else if (slave.physicalAge <= 17) {
+			slave.pregAdaptation = 42;
+		} else {
+			slave.pregAdaptation = 50;
+		}
+	};
+
+	function generateXYPregAdaptation() {
+		if (slave.physicalAge <= 6) {
+			slave.pregAdaptation = 5;
+		} else if (slave.physicalAge <= 11) {
+			slave.pregAdaptation = slave.physicalAge - 1;
+		} else if (slave.physicalAge <= 15) {
+			slave.pregAdaptation = 2*(slave.physicalAge - 12) + 12;
+		} else {
+			slave.pregAdaptation = 20;
+		}
+	};
+
+	function generateXXVoice() {
+		if (slave.physicalAge <= 13) {
+			slave.voice = jsEither([2, 2, 2, 3, 3, 3, 3, 3, 3]);
+		} else if (slave.physicalAge <= 16) {
+			slave.voice = jsEither([2, 2, 2, 2, 2, 3, 3, 3, 3]);
+		} else {
+			slave.voice = jsEither([1, 2, 2, 2, 2, 2, 2, 3, 3, 3]);
+		}
+	};
+
+	function generateXYVoice() {
+		if (slave.physicalAge <= 11) {
+			slave.voice = jsEither([2, 2, 2, 3, 3, 3, 3, 3, 3]);
+		} else if (slave.physicalAge <= 13) {
+			slave.voice = jsEither([1, 1, 2, 2, 2, 2, 2, 3, 3]);
+		} else if (slave.physicalAge <= 16) {
+			slave.voice = jsEither([1, 1, 1, 2, 2, 2, 2, 2, 3]);
+		} else {
+			if (slave.balls > 2) {
+				slave.voice = 1;
+			} else if (slave.balls > 0) {
+				slave.voice = jsEither([1, 1, 2]);
+			} else {
+				slave.voice = jsEither([1, 2, 2]);
+			}
+		}
+	};
+
+	function generateXXTeeth() {
+		var femaleCrookedTeethGen = slave.intelligence+slave.intelligenceImplant;
+		if ("American" == slave.nationality) {
+			femaleCrookedTeethGen += 20;
+		} else if (["Andorran", "Antiguan", "Argentinian", "Aruban", "Australian", "Austrian", "Bahamian", "Bahraini", "Barbadian", "Belarusian", "Belgian", "Bermudian", "Brazilian", "British", "Bruneian", "Bulgarian", "Canadian", "Catalan", "Chilean", "a Cook Islander", "Croatian", "Czech", "Cypriot", "Danish", "Dutch", "Emirati", "Estonian", "Finnish", "French", "German", "Greek", "Greenlandic", "Guamanian", "Hungarian", "Icelandic", "Irish", "Israeli", "Italian", "Japanese", "Kazakh", "Korean", "Kuwaiti", "Latvian", "a Liechtensteiner", "Lithuanian", "Luxembourgian", "Malaysian", "Maltese", "Mauritian", "Monégasque", "Montenegrin", "New Caledonian", "a New Zealander", "Niuean", "Norwegian", "Omani", "Palauan", "Panamanian", "Polish", "Portuguese", "Puerto Rican", "Qatari", "Romanian", "Russian", "Sammarinese", "Saudi", "Seychellois", "Singaporean", "Slovak", "Slovene", "Spanish", "Swedish", "Swiss", "Taiwanese", "Trinidadian", "Uruguayan", "Vatican"].includes(slave.nationality)) {
+			/* do nothing */
+		} else {
+			femaleCrookedTeethGen -= 20;
+		}
+		
+		if (jsRandom(0, femaleCrookedTeethGen) <= 15 && slave.physicalAge >= 12) {
+			slave.teeth = "crooked";
+		}
+		
+		if (slave.physicalAge < 6) {
+			slave.teeth = "baby";
+		} else if (slave.physicalAge < 12) {
+			slave.teeth = "mixed";
+		}
+	};
+
+	function generateXYTeeth() {
+		var maleCrookedTeethGen = slave.intelligence+slave.intelligenceImplant;
+		if ("American" == slave.nationality) {
+			maleCrookedTeethGen += 22;
+		} else if (["Andorran", "Antiguan", "Argentinian", "Aruban", "Australian", "Austrian", "Bahamian", "Bahraini", "Barbadian", "Belarusian", "Belgian", "Bermudian", "Brazilian", "British", "Bruneian", "Bulgarian", "Canadian", "Catalan", "Chilean", "a Cook Islander", "Croatian", "Czech", "Cypriot", "Danish", "Dutch", "Emirati", "Estonian", "Finnish", "French", "German", "Greek", "Greenlandic", "Guamanian", "Hungarian", "Icelandic", "Irish", "Israeli", "Italian", "Japanese", "Kazakh", "Korean", "Kuwaiti", "Latvian", "a Liechtensteiner", "Lithuanian", "Luxembourgian", "Malaysian", "Maltese", "Mauritian", "Monégasque", "Montenegrin", "New Caledonian", "a New Zealander", "Niuean", "Norwegian", "Omani", "Palauan", "Panamanian", "Polish", "Portuguese", "Puerto Rican", "Qatari", "Romanian", "Russian", "Sammarinese", "Saudi", "Seychellois", "Singaporean", "Slovak", "Slovene", "Spanish", "Swedish", "Swiss", "Taiwanese", "Trinidadian", "Uruguayan", "Vatican"].includes(slave.nationality)) {
+			/* do nothing */
+		} else {
+			maleCrookedTeethGen -= 20;
+		}
+		
+		if (jsRandom(0, maleCrookedTeethGen) <= 15 && slave.physicalAge >= 12) {
+			slave.teeth = "crooked";
+		}
+		
+		if (slave.physicalAge < 6) {
+			slave.teeth = "baby";
+		} else if (slave.physicalAge < 12) {
+			slave.teeth = "mixed";
+		}
+	};
+
+	function generateXXMods() {
+		if (passage() != "Starting Girls") {
+			slave.earPiercing = jsEither([0,1]);
+			slave.nosePiercing = jsEither([0,0,0,1]);
+			slave.eyebrowPiercing = jsEither([0,0,0,0,0,1]);
+			slave.clitPiercing = jsEither([0,0,0,0,0,1]);
+			slave.lipsPiercing = jsEither([0,0,0,0,0,1]);
+			slave.navelPiercing = jsEither([0,0,0,1]);
+			slave.nipplesPiercing = jsEither([0,0,0,0,1]);
+		}
+		if (slave.anus != 0 && Math.random() < 0.25) {
+			slave.anusTat = "bleached";
+		}
+	};
+
+	function generateXYMods() {
+		if (passage() != "Starting Girls") {
+			slave.earPiercing = jsEither([0,0,0,1]);
+			slave.nosePiercing = jsEither([0,0,0,0,1]);
+			slave.eyebrowPiercing = jsEither([0,0,0,0,0,1]);
+			slave.clitPiercing = jsEither([0,0,0,0,0,1]);
+			slave.lipsPiercing = jsEither([0,0,0,0,0,1]);
+			slave.navelPiercing = jsEither([0,0,0,0,1]);
+			slave.nipplesPiercing = jsEither([0,0,0,0,1]);
+		}
+		if (slave.anus != 0 && Math.random() < 0.25) {
+			slave.anusTat = "bleached";
+		}
+	};
+
+	function generateXXBodyHair() {
+		slave.pubicHColor = slave.hColor;
+		slave.underArmHColor = slave.hColor;
+		slave.pubicHStyle = jsEither(["hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "waxed", "waxed", "in a strip", "in a strip", "in a strip", "in a strip", "in a strip", "neat", "neat", "neat", "neat", "neat", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy", "bushy", "bushy", "bushy", "bushy", "very bushy", "very bushy"]);
+		slave.underArmHStyle = jsEither(["hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "shaved", "shaved", "shaved", "shaved", "shaved", "neat", "neat", "neat", "neat", "neat", "bushy", "bushy", "bushy"]);
+		if ((slave.pubicHStyle == "hairless" || slave.underArmHStyle == "hairless") && Math.random() > 0.4) {
+			slave.pubicHStyle = "hairless";
+			slave.underArmHStyle = "hairless";
+		}
+		if (slave.hColor == "blonde" && Math.random() > 0.85) {
+			slave.eyebrowHColor = jsEither(["brown", "brown", "brown", "brown", "black"]);
+			slave.override_Brow_H_Color = 1;
+		} else {
+			slave.eyebrowHColor = slave.hColor;
+		}
+		slave.eyebrowHStyle = jsEither(["bald", "shaved", "shaved", "straight", "straight", "straight", "straight", "straight", "straight", "rounded", "rounded", "rounded", "rounded", "rounded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "slanted inwards", "slanted inwards", "slanted outwards", "slanted outwards", "high-arched", "high-arched", "high-arched", "elongated", "elongated", "elongated", "shortened", "shortened", "shortened", "curved", "curved", "curved", "curved", "curved", "curved", "curved"]);
+		slave.eyebrowFullness = jsEither(["pencil-thin", "pencil-thin", "thin", "thin", "thin", "threaded", "threaded", "threaded", "threaded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "tapered", "tapered", "tapered", "tapered", "thick", "thick", "thick", "bushy", "bushy"]);
+	};
+
+	function generateXYBodyHair() {
+		slave.pubicHColor = slave.hColor;
+		slave.underArmHColor = slave.hColor;
+		slave.pubicHStyle = jsEither(["hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "waxed", "waxed", "in a strip", "in a strip", "in a strip", "neat", "neat", "neat", "neat", "neat", "neat", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "very bushy", "very bushy"]);
+		slave.underArmHStyle = jsEither(["hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "shaved", "shaved", "shaved", "shaved", "shaved", "neat", "neat", "neat", "neat", "neat", "neat", "neat", "bushy", "bushy", "bushy", "bushy", "bushy"]);
+		if ((slave.pubicHStyle == "hairless" || slave.underArmHStyle == "hairless") && Math.random() > 0.4) {
+			slave.pubicHStyle = "hairless";
+			slave.underArmHStyle = "hairless";
+		}
+		if (slave.hColor == "blonde" && Math.random() > 0.85) {
+			slave.eyebrowHColor = jsEither(["brown", "brown", "brown", "brown", "black"]);
+			slave.override_Brow_H_Color = 1;
+		} else {
+			slave.eyebrowHColor = slave.hColor;
+		}
+		slave.eyebrowHStyle = jsEither(["bald", "shaved", "shaved", "straight", "straight", "straight", "straight", "straight", "straight", "rounded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "slanted inwards", "slanted outwards", "high-arched", "elongated", "shortened", "curved", "curved", "curved", "curved", "curved"]);
+		slave.eyebrowFullness = jsEither(["pencil-thin", "thin", "thin", "threaded", "threaded", "threaded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "tapered", "tapered", "tapered", "thick", "thick", "bushy"]);
+	};
+
+	function generateXXPuberty() {
+		if (slave.physicalAge >= slave.pubertyAgeXX) {
+			slave.pubertyXX = 1;
+		} else {
+			slave.pubertyXX = 0;
+		}
+	}
+
+	function generateXYPuberty() {
+		if (slave.balls > 0) {
+			if (slave.physicalAge >= slave.pubertyAgeXY) {
+				slave.pubertyXY = 1;
+			} else {
+				slave.pubertyXY = 0;
+			}
+		} else {
+			slave.pubertyXY = 0;
+		}
+	};
+
+	function generateAge() {
+		if (V.activeSlaveOneTimeMaxAge > 998) {
+			V.activeSlaveOneTimeMaxAge = (V.pedo_mode === 1) ? 18 : 42;
+		} else if (V.pedo_mode === 1 && V.one_time_age_overrides_pedo_mode === 0 && V.activeSlaveOneTimeMaxAge > 18) {
+			V.activeSlaveOneTimeMaxAge = 18;
+		}
+		if (V.retirementAge < V.activeSlaveOneTimeMaxAge) {
+			V.activeSlaveOneTimeMaxAge = (V.retirementAge - 1);
+		}
+		if (V.activeSlaveOneTimeMinAge < V.minimumSlaveAge) {
+			V.activeSlaveOneTimeMinAge = V.minimumSlaveAge;
+		} else if (V.pedo_mode === 1 && V.one_time_age_overrides_pedo_mode === 0) {
+			V.activeSlaveOneTimeMinAge = V.minimumSlaveAge;
+		}
+		if (V.activeSlaveOneTimeMaxAge < V.activeSlaveOneTimeMinAge) {
+			V.activeSlaveOneTimeMaxAge = V.activeSlaveOneTimeMinAge;
+		}
+		if (V.activeSlaveOneTimeMaxAge >= 30 && V.arcologies[0].FSMaturityPreferentialist !== "unset" && V.ageAdjustOverride !== 1) {
+			V.activeSlaveOneTimeMaxAge += 10;
+		}
+		slave.actualAge = jsRandom(V.activeSlaveOneTimeMinAge, V.activeSlaveOneTimeMaxAge);
+		const secondAgeRoll = jsRandom(V.activeSlaveOneTimeMinAge, V.activeSlaveOneTimeMaxAge);
+		if (V.arcologies[0].FSYouthPreferentialist !== "unset" && V.arcologies[0].FSYouthPreferentialist >= jsRandom(1, 100)) {
+			slave.actualAge = Math.min(slave.actualAge, secondAgeRoll);
+		} else if (V.arcologies[0].FSMaturityPreferentialist !== "unset" && V.arcologies[0].FSMaturityPreferentialist >= jsRandom(1, 100)) {
+			slave.actualAge = Math.max(slave.actualAge, secondAgeRoll);
+		}
+		if (slave.actualAge >= V.retirementAge) {
+			slave.actualAge = (V.retirementAge - 2);
+		}
+		V.activeSlaveOneTimeMinAge = 0;
+		V.activeSlaveOneTimeMaxAge = 999;
+		V.one_time_age_overrides_pedo_mode = 0;
+		V.ageAdjustOverride = 0;
+		slave.visualAge = slave.actualAge;
+		slave.physicalAge = slave.actualAge;
+		slave.ovaryAge = slave.actualAge;
+		slave.age = slave.actualAge; /*compatibility*/
+		slave.pubertyAgeXX = V.fertilityAge;
+		slave.pubertyAgeXY = V.potencyAge;
+	};
+
+	function generateIntelligence() {
+		const gaussian = gaussianPair();
+		slave.intelligence = Intelligence.random();
+		if (V.AgePenalty == 1 && slave.actualAge <= 24) {
+			if (gaussian[0] < gaussian[1] + slave.intelligence/29 + (slave.actualAge - 24)/8 - 0.35) {
+				slave.intelligenceImplant = 15;
+				if (slave.intelligenceImplant > 0 && jsRandom(15,150) < slave.intelligence) {
+					slave.intelligenceImplant = 30;
+				}
+			}
+		} else {
+			if (gaussian[0] < gaussian[1] + slave.intelligence/29 - 0.35) { /* 40.23% chance if intelligence is 0, 99.26% chance if intelligence is 100 */
+				slave.intelligenceImplant = 15;
+				if (slave.intelligenceImplant > 0 && jsRandom(15,150) < slave.intelligence) {
+					slave.intelligenceImplant = 30;
+				}
+			}
+		}
+	};
+
+	function generateCareer() {
+		if (V.AgePenalty == 1) {
+			if (slave.actualAge < 16) {
+				slave.career = setup.veryYoungCareers.random();
+			} else if (slave.actualAge <= 24) {
+				slave.career = setup.youngCareers.random();
+			} else if (slave.intelligenceImplant >= 15) {
+				slave.career = setup.educatedCareers.random();
+			} else {
+				slave.career = setup.uneducatedCareers.random();
+			}
+		} else {
+			if (slave.actualAge < 16) {
+				slave.career = setup.veryYoungCareers.random();
+			} else if (slave.intelligenceImplant >= 15) {
+				slave.career = setup.educatedCareers.random();
+			} else if (slave.actualAge <= 24) {
+				slave.career = setup.youngCareers.random();
+			} else {
+				slave.career = setup.uneducatedCareers.random();
+			}
+		}
+	};
+
+	function generateNationality() {
+		if (V.fixedRace == 0) {
+			if (V.fixedNationality == 0) {
+				slave.nationality = hashChoice(V.nationalities);
+			} else {
+				slave.nationality = V.fixedNationality;
+				V.fixedNationality = 0;
+			}
+			nationalityToRace(slave);
+
+			if (passage() == "Corporate Market" && (V.captureUpgradeRace != "unselected") && (V.captureUpgradeRace != "none")) {
+				if (V.captureUpgradeRace == "mixed race") {
+					slave.race = "mixed race";
+				} else {
+					const capUpgradeCheck = setup[V.captureUpgradeRace.toLowerCase().replace(/[ -]/g, '')+'Nationalities'];
+					const keys = Object.keys(capUpgradeCheck);
+					var capUpgradeNationalities = {};
+					for (var i = 0; i < keys.length; i++) {
+						if (keys[i] in V.nationalities) {
+							capUpgradeNationalities[keys[i]] = capUpgradeCheck[keys[i]];
+						}
+					}
+					if (Object.keys(capUpgradeNationalities).length > 0) {
+						slave.nationality = hashChoice(capUpgradeNationalities);
+					} else {
+						slave.nationality = hashChoice(capUpgradeCheck);
+					}
+					slave.race = V.captureUpgradeRace;
+				}
+			}
+
+		} else {
+			switch (V.fixedRace) {
+				case "white":
+					slave.nationality = hashChoice(setup.whiteNationalities);
+					break;
+				case "asian":
+					slave.nationality = hashChoice(setup.asianNationalities);
+					break;
+				case "latina":
+					slave.nationality = hashChoice(setup.latinaNationalities);
+					break;
+				case "black":
+					slave.nationality = hashChoice(setup.blackNationalities);
+					break;
+				case "pacific islander":
+					slave.nationality = hashChoice(setup.pacificislanderNationalities);
+					break;
+				case "southern european":
+					slave.nationality = hashChoice(setup.southerneuropeanNationalities);
+					break;
+				case "amerindian":
+					slave.nationality = hashChoice(setup.amerindianNationalities);
+					break;
+				case "semitic":
+					slave.nationality = hashChoice(setup.semiticNationalities);
+					break;
+				case "middle eastern":
+					slave.nationality = hashChoice(setup.middleeasternNationalities);
+					break;
+				case "indo-aryan":
+					slave.nationality = hashChoice(setup.indoaryanNationalities);
+					break;
+				case "malay":
+					slave.nationality = hashChoice(setup.malayNationalities);
+					break;
+				default:
+					slave.nationality = hashChoice(V.nationalities);
+			}
+			slave.race = V.fixedRace;
+			V.fixedRace = 0;
+		}
+	};
+
+	function generateAccent() {
+		nationalityToAccent(slave);
+		if ((slave.intelligenceImplant >= 15 || slave.intelligence > 95) && slave.accent >= 3 && slave.intelligence > jsRandom(0,100)) {
+			slave.accent -= 1;
+		}
+	};
+
+	function generateRacialTraits() {
+		switch (slave.race) {
+			case "black":
+				slave.lips = jsRandom(5,30);
+				slave.skin = jsEither(["black", "dark brown", "brown"]);
+				slave.hColor = jsEither(["black", "black", "black", "brown"]);
+				slave.hStyle = jsEither(["neat", "crinkled"]);
+				break;
+			case "white":
+				slave.lips = jsRandom(5,25);
+				if (slave.nationality == "German") {
+					slave.skin = jsEither(["pale", "light", "fair"]);
+					slave.eyeColor = jsEither(["blue", "blue", "blue", "brown", "green"]);
+					slave.hColor = jsEither(["black", "blonde", "blonde", "blonde", "red", "brown"]);
+				} else if (slave.nationality == "Icelandic") {
+					slave.skin = jsEither(["pale", "pale", "light", "fair"]);
+					slave.eyeColor = jsEither(["blue", "blue", "blue", "brown", "green"]);
+					slave.hColor = jsEither(["black", "blonde", "blonde", "blonde", "red", "brown"]);
+				} else if (slave.nationality == "Irish") {
+					slave.skin = jsEither(["pale", "pale", "light", "fair"]);
+					slave.eyeColor = jsEither(["blue", "brown", "green", "green", "green"]);
+					slave.hColor = jsEither(["black", "blonde", "red", "red", "red", "brown"]);
+				} else if (slave.nationality == "Scottish") {
+					slave.skin = jsEither(["pale", "fair", "light", "fair"]);
+					slave.eyeColor = jsEither(["blue", "brown", "brown", "green", "green", "green"]);
+					slave.hColor = jsEither(["black", "black", "blonde", "red", "red", "red", "brown"]);
+				} else {
+					slave.skin = jsEither(["pale", "light", "fair"]);
+					slave.eyeColor = jsEither(["blue", "brown", "green"]);
+					slave.hColor = jsEither(["black", "blonde", "red", "brown"]);
+				}
+				slave.hStyle = "neat";
+				break;
+			case "latina":
+				slave.lips = jsRandom(5,25);
+				slave.skin = jsEither(["light olive", "brown", "dark brown", "tanned", "dark olive"]);
+				slave.hColor = jsEither(["black", "brown"]);
+				slave.hStyle = "neat";
+				break;
+			case "indo-aryan":
+			case "malay":
+			case "pacific islander":
+			case "amerindian":
+				slave.lips = jsRandom(5,25);
+				slave.skin = jsEither(["dark", "light"]);
+				slave.hColor = "black";
+				slave.hStyle = "neat";
+				break;
+			case "asian":
+				slave.lips = jsRandom(5,25);
+				slave.skin = jsEither(["light olive", "dark olive", "light"]);
+				slave.hColor = "black";
+				slave.hStyle = "neat";
+				break;
+			case "middle eastern": 
+			case "semitic":
+			case "southern european":
+				slave.lips = jsRandom(5,25);
+				slave.skin = jsEither(["fair", "light olive", "tanned", "light"]);
+				slave.hColor = "black";
+				slave.hStyle = "neat";
+				break;
+			default:
+				slave.lips = jsRandom(5,25);
+				slave.skin = jsEither(["pale", "dark", "light"]);
+				slave.hColor = jsEither(["black", "black", "black", "black", "brown", "brown", "blonde", "red"]);
+				slave.hStyle = "neat";
+		}
+		if (slave.skin == "pale" || slave.skin == "fair") {
+			if (jsRandom(1,4) == 1) {
+				slave.markings = jsEither(["freckles", "freckles", "freckles", "heavily freckled", "beauty mark", "beauty mark", "birthmark", "birthmark"]);
+			}
+		} else if (jsRandom(1,8) == 1) {
+			slave.markings = jsEither(["beauty mark", "birthmark"]);
+		}
+	};
+
+	function generateBoobTweaks() {
+		if (V.weightAffectsAssets != 0) {
+			if (slave.weight < -10 && slave.boobs > 200) {
+				slave.boobs -= 100;
+			} else if (slave.weight > 190 && slave.boobs < 3000) {
+				slave.boobs += (jsRandom(3,8)*100);
+			} else if (slave.weight > 160 && slave.boobs < 1500) {
+				slave.boobs += (jsRandom(2,6)*100);
+			} else if (slave.weight > 130 && slave.boobs < 1500) {
+				slave.boobs += (jsRandom(1,4)*100);
+			} else if (slave.weight > 95 && slave.boobs < 1200) {
+				slave.boobs += (jsRandom(1,3)*100);
+			} else if (slave.weight > 30 && slave.boobs < 1000) {
+				slave.boobs += 100;
+			}
+		}
+
+		var BoobShapeGen = [];
+		if (slave.boobs > 250 && slave.boobs < 800) {
+			BoobShapeGen.push("perky");
+			BoobShapeGen.push("downward-facing");
+		}
+		if (slave.boobs > 400 && slave.boobs < 1200) {
+			BoobShapeGen.push("torpedo-shaped");
+			BoobShapeGen.push("wide-set");
+		}
+		if (slave.boobs > 800 && slave.physicalAge > jsRandom(10,50)) {
+			BoobShapeGen.push("saggy");
+		}
+		if (BoobShapeGen.length == 1) {
+			if (Math.random() < 0.5) {
+				slave.boobShape = jsEither(BoobShapeGen);
+			}
+		} else if (BoobShapeGen.length > 1) {
+			if (jsRandom(1,3) != 1) {
+				slave.boobShape = jsEither(BoobShapeGen);
+			}
+		}
+		
+		if (slave.boobs < 250) {
+			slave.nipples = jsEither(["tiny", "tiny", "tiny", "tiny", "cute", "cute", "puffy", "partially inverted"]);
+		} else if (slave.boobs < 500) {
+			slave.nipples = jsEither(["tiny", "cute", "cute", "cute", "puffy", "partially inverted"]);
+		} else if (slave.boobs < 1000) {
+			slave.nipples = jsEither(["tiny", "cute", "cute", "cute", "puffy", "puffy", "partially inverted", "inverted"]);
+		} else {
+			slave.nipples = jsEither(["cute", "puffy", "partially inverted", "inverted", "huge"]);
+		}
+	};
+
+	function generateSkills() {
+		slave.vaginalSkill = (slave.vagina == 0 ? 0 : jsRandom(0,15));
+		slave.analSkill = (slave.anus == 0 ? 0 : jsRandom(0,15));
+		slave.oralSkill = jsRandom(0,15);
+		slave.entertainSkill = jsRandom(0,15);
+		slave.whoreSkill = jsRandom(0,15);
+	};
+
+	function generateDisabilities() {
+		if (slave.physicalAge >= jsRandom(0,100)) {
+			slave.eyes = -1;
+		} 
+		if (slave.physicalAge >= jsRandom(30,100)) {
+			slave.hears = -1;
+		}
+		if (V.seeExtreme == 1) {
+			let disList = [];
+			disList.push("hearNot");
+			disList.push("seeNot");
+			disList.push("speakNot");
+			let disableCount = 0;
+			if (V.oneTimeDisableDisability === 0) {
+				while (disList.length > 0) {
+					let rolled = jsEither(disList);
+					switch (rolled) {
+					case "hearNot":
+						if ((jsRandom(1,100)-(disableCount*2)) > 90) {
+							slave.hears = -2;
+						}
+						disList.delete("hearNot");
+						disableCount++;
+						break;
+					case "seeNot":
+						if ((jsRandom(1,100)-(disableCount*2)) > 90) {
+							slave.eyes = -2;
+						}
+						disList.delete("seeNot");
+						disableCount++;
+						break;
+					case "speakNot":
+						if ((jsRandom(1,100)-(disableCount*2)) > 90) {
+							slave.voice = 0;
+						}
+						disList.delete("speakNot");
+						disableCount++;
+						break;
+					}
+				}
+			}
+			V.oneTimeDisableDisability = 0;
+		}
+	};
+
+	return GenerateNewSlave;
+})();