/* eslint-disable camelcase */
/**
 * @param {App.Entity.SlaveState | number} slave
 */
window.clearSummaryCache = function clearSummaryCache(slave) {
	if (!slave) {
		setup.summaryCache = {};
	} else if (slave instanceof Object && slave.ID !== Infinity && slave.ID !== -Infinity) {
		setup.summaryCache[slave.ID] = undefined;
	} else {
		setup.summaryCache[slave] = undefined;
	}
};

/**
 * @param {App.Entity.SlaveState} slave
 * @returns {object}
 */
window.SlaveSummary = function SlaveSummary(slave) {
	if (V.useSummaryCache) {
		if (setup.summaryCache[slave.ID] === undefined) {
			setup.summaryCache[slave.ID] = SlaveSummaryUncached(slave);
		}
		// this.output.appendChild(setup.summaryCache[State.temporary.Slave.ID].cloneNode(true))
		return setup.summaryCache[slave.ID];
	}
	return SlaveSummaryUncached(slave);
};

window.SlaveSummaryUncached = (function() {
	"use strict";

	/** @type {DocumentFragment} */
	let res;

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @returns {DocumentFragment} */
	function SlaveSummaryUncached(slave) {
		res = document.createDocumentFragment();
		let para = makeParagraph(res);

		if (V.abbreviateDevotion === 1) {
			short_devotion(slave, para);
		} else if (V.abbreviateDevotion === 2) {
			long_devotion(slave, para);
		}
		if (slave.fuckdoll === 0) {
			if (V.abbreviateRules === 1) {
				short_rules(slave, para);
			} else if (V.abbreviateRules === 2) {
				long_rules(slave, para);
			}
		}
		if (V.abbreviateDiet === 1) {
			short_weight(slave, para);
		} else if (V.abbreviateDiet === 2) {
			long_weight(slave, para);
		}
		if (V.abbreviateDiet === 1) {
			short_diet(slave, para);
		} else if (V.abbreviateDiet === 2) {
			long_diet(slave, para);
		}
		if (V.abbreviateHealth === 1) {
			short_health(slave, para);
			short_illness(slave, para);
			short_tired(slave, para);
		} else if (V.abbreviateHealth === 2) {
			long_health(slave, para);
			long_illness(slave, para);
			long_tired(slave, para);
		}
		if (V.abbreviateDrugs === 1) {
			short_drugs(slave, para);
		} else if (V.abbreviateDrugs === 2) {
			long_drugs(slave, para);
		}

		para = makeParagraph(res);
		para.classList.add("pink");

		makeSpan(para, `${capFirstChar(SlaveTitle(slave))}${V.abbreviatePhysicals === 2 ? '.' : ''}`, ["coral", "strong"]);
		if (V.seeRace === 1 && V.abbreviateRace !== 0) {
			makeSpan(para, V.abbreviateRace === 1 ? short_race(slave) : long_race(slave), "tan");
		}
		if (V.abbreviateNationality !== 0) {
			makeSpan(para, V.abbreviateNationality === 1 ? short_nationality(slave) : long_nationality(slave), "tan");
		}
		makeSpan(para, V.abbreviatePhysicals === 1 ? short_skin(slave) : `${capFirstChar(slave.skin)} skin.`);
		if (V.abbreviateGenitalia === 1) {
			short_genitals(slave, para);
		} else if (V.abbreviateGenitalia === 2) {
			long_genitals(slave, para);
		}
		if (V.abbreviatePhysicals === 1) {
			short_age(slave, para);
			short_face(slave, para);
			short_eyes(slave, para);
			short_ears(slave, para);
			if (slave.markings !== "none") {
				makeSpan(para, "Markings");
			}
			short_lips(slave, para);
			short_teeth(slave, para);
			short_muscles(slave, para);
			addText(para, App.Desc.shortLimbs(slave));
			short_voice(slave, para);
			short_tits_ass(slave, para);
			short_hips(slave, para);
			short_waist(slave, para);
			short_implants(slave, para);
			short_lactation(slave, para);
			short_mods(slave, para);
		} else if (V.abbreviatePhysicals === 2) {
			long_age(slave, para);
			long_face(slave, para);
			long_eyes(slave, para);
			long_ears(slave, para);
			long_lips(slave, para);
			long_teeth(slave, para);
			long_muscles(slave, para);
			makeSpan(para, App.Desc.longLimbs(slave));
			long_voice(slave, para);
			long_tits_ass(slave, para);
			long_hips(slave, para);
			long_waist(slave, para);
			long_implants(slave, para);
			long_lactation(slave, para);
			long_mods(slave, para);
			if (!jQuery.isEmptyObject(slave.brand)) {
				makeSpan(para, `Branded.`);
			}
		}
		if (V.abbreviateHormoneBalance === 1) {
			if (slave.hormoneBalance <= -21) {
				makeSpan(para, "HB:M", ["deepskyblue", "strong"]);
			} else if (slave.hormoneBalance <= 20) {
				makeSpan(para, "HB:N", ["pink", "strong"]);
			} else if (slave.hormoneBalance <= 500) {
				makeSpan(para, "HB:F", ["pink", "strong"]);
			}
		} else if (V.abbreviateHormoneBalance === 2) {
			const colorClass = slave.hormoneBalance <= -21 ? "deepskyblue" : "pink";
			let desc = "";
			if (slave.hormoneBalance < -400) {
				desc = `Overwhelmingly masculine`;
			} else if (slave.hormoneBalance <= -300) {
				desc = `Extremely masculine`;
			} else if (slave.hormoneBalance <= -200) {
				desc = `Heavily masculine`;
			} else if (slave.hormoneBalance <= -100) {
				desc = `Very masculine`;
			} else if (slave.hormoneBalance <= -21) {
				desc = `Masculine`;
			} else if (slave.hormoneBalance <= 20) {
				desc = `Neutral`;
			} else if (slave.hormoneBalance <= 99) {
				desc = `Feminine`;
			} else if (slave.hormoneBalance <= 199) {
				desc = `Very feminine`;
			} else if (slave.hormoneBalance <= 299) {
				desc = `Heavily feminine`;
			} else if (slave.hormoneBalance <= 399) {
				desc = `Extremely feminine`;
			} else if (slave.hormoneBalance <= 500) {
				desc = `Overwhelmingly feminine`;
			}
			makeSpan(para, desc + " hormone balance.", colorClass);
		}

		para = makeParagraph(res);

		if (V.abbreviateSkills === 1) {
			short_intelligence(slave, para);
			short_skills(slave, para);
			short_prestige(slave, para);
			short_porn_prestige(slave, para);
		} else if (V.abbreviateSkills === 2) {
			long_intelligence(slave, para);
			long_skills(slave, para);
			long_prestige(slave, para);
			long_porn_prestige(slave, para);
		}
		if (V.abbreviateMental === 1) {
			if (slave.fetish !== "mindbroken") {
				if (slave.fetishKnown === 1) {
					short_fetish(slave, para);
				}
				if (slave.attrKnown === 1) {
					short_attraction(slave, para);
				}
			}
			if (slave.clitPiercing === 3) {
				short_smart_fetish(slave, para);
				short_smart_attraction(slave, para);
			}
			short_behavior_flaw(slave, para);
			short_sex_flaw(slave, para);
			short_behavior_quirk(slave, para);
			short_sex_quirk(slave, para);
		} else if (V.abbreviateMental === 2) {
			if (slave.fetish !== "mindbroken") {
				if (slave.fetishKnown === 1) {
					long_fetish(slave, para);
				}
				if (slave.attrKnown === 1) {
					long_attraction(slave, para);
				}
			}
			if (slave.clitPiercing === 3) {
				long_smart_fetish(slave, para);
				long_smart_attraction(slave, para);
			}
			long_behavior_flaw(slave, para);
			long_sex_flaw(slave, para);
			long_behavior_quirk(slave, para);
			long_sex_quirk(slave, para);
		}
		if (slave.custom.label) {
			makeSpan(res, `${capFirstChar(slave.custom.label)}.`, ["yellow", "strong"]);
		}
		if ((slave.relationship !== 0) || (slave.relation !== 0) || (V.abbreviateClothes === 2) || (V.abbreviateRulesets === 2)) {
			para = makeParagraph(res);
		}
		if (V.abbreviateMental === 1) {
			makeSpan(para, V.familyTesting === 1 ? short_extended_family(slave) : short_legacy_family(slave), "lightgreen");
			short_clone(slave, para);
			short_rival(slave, para);
		} else if (V.abbreviateMental === 2) {
			if (V.familyTesting === 1) {
				long_extended_family(slave, para);
			} else {
				long_legacy_family(slave, para);
			}
			long_clone(slave, para);
			long_rival(slave, para);
		}
		if (slave.fuckdoll === 0) {
			if (V.abbreviateClothes === 2) {
				const dressingBlock = makeBlock(para);
				if (slave.choosesOwnClothes === 1) {
					makeSpan(dressingBlock, `Dressing ${getPronouns(slave).himself}.`);
				}
				long_clothes(slave, dressingBlock);
				long_collar(slave, dressingBlock);
				long_belly(slave, dressingBlock);
				if (hasAnyArms(slave)) {
					long_arms(slave, dressingBlock);
				}
				if (hasAnyLegs(slave)) {
					long_legs(slave, dressingBlock);
					long_shoes(slave, dressingBlock);
				}
				long_chastity(slave, dressingBlock);
				long_vaginal_acc(slave, dressingBlock);
				long_dick_acc(slave, dressingBlock);
				long_buttplug(slave, dressingBlock);
			}
		}
		const RABlock = makeBlock(para);
		rules_assistant(slave, RABlock);
		if (V.abbreviateOrigins === 2 && slave.origin !== 0) {
			origins(slave, res);
		}
		return res;
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 */
	function short_devotion(slave, c) {
		if (slave.fetish === "mindbroken") {
			makeSpan(c, "MB", "mindbroken");
		} else if (slave.devotion < -95) {
			makeSpan(c, "Hate", ["devotion", "hateful"], true, slave.devotion);
		} else if (slave.devotion < -50) {
			makeSpan(c, "Hate", ["devotion", "hateful"], true, slave.devotion);
		} else if (slave.devotion < -20) {
			makeSpan(c, "Res", ["devotion", "resistant"], true, slave.devotion);
		} else if (slave.devotion <= 20) {
			makeSpan(c, "Ambiv", ["devotion", "ambivalent"], true, slave.devotion);
		} else if (slave.devotion <= 50) {
			makeSpan(c, "Accept", ["devotion", "accept"], true, slave.devotion);
		} else if (slave.devotion <= 95) {
			makeSpan(c, "Devo", ["devotion", "devoted"], true, slave.devotion);
		} else {
			makeSpan(c, "Wor", ["devotion", "worship"], true, slave.devotion);
		}
		if (slave.fetish === "mindbroken") {
			return;
		} else if (slave.trust < -95) {
			makeSpan(c, "ETerr", ["trust", "extremely-terrified"], true, slave.trust);
		} else if (slave.trust < -50) {
			makeSpan(c, "Terr", ["trust", "terrified"], true, slave.trust);
		} else if (slave.trust < -20) {
			makeSpan(c, "Fright", ["trust", "frightened"], true, slave.trust);
		} else if (slave.trust <= 20) {
			makeSpan(c, "Fear", ["trust", "fearful"], true, slave.trust);
		} else if (slave.trust <= 50) {
			if (slave.devotion < -20) {
				makeSpan(c, "Caref", ["defiant", "careful"], true, slave.trust);
			} else {
				makeSpan(c, "Caref", ["trust", "careful"], true, slave.trust);
			}
		} else if (slave.trust < 95) {
			if (slave.devotion < -20) {
				makeSpan(c, "Bold", ["defiant", "bold"], true, slave.trust);
			} else {
				makeSpan(c, "Trust", ["trust", "trusting"], true, slave.trust);
			}
		} else {
			if (slave.devotion < -20) {
				makeSpan(c, "Defiant", ["defiant", "full"], true, slave.trust);
			} else {
				makeSpan(c, "VTrust", ["trust", "prof-trusting"], true, slave.trust);
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_devotion(slave, c) {
		if (slave.fetish === "mindbroken") {
			makeSpan(c, "Mindbroken.", "mindbroken");
		} else if (slave.devotion < -95) {
			makeSpan(c, "Very hateful", ["devotion", "hateful"], true, slave.devotion);
		} else if (slave.devotion < -50) {
			makeSpan(c, "Hateful", ["devotion", "hateful"], true, slave.devotion);
		} else if (slave.devotion < -20) {
			makeSpan(c, "Resistant", ["devotion", "resistant"], true, slave.devotion);
		} else if (slave.devotion <= 20) {
			makeSpan(c, "Ambivalent", ["devotion", "ambivalent"], true, slave.devotion);
		} else if (slave.devotion <= 50) {
			makeSpan(c, "Accepting", ["devotion", "accept"], true, slave.devotion);
		} else if (slave.devotion <= 95) {
			makeSpan(c, "Devoted", ["devotion", "devoted"], true, slave.devotion);
		} else {
			makeSpan(c, "Worshipful", ["devotion", "worship"], true, slave.devotion);
		}
		if (slave.fetish === "mindbroken") {
			return;
		} else if (slave.trust < -95) {
			makeSpan(c, "Extremely terrified", ["trust", "extremely-terrified"], true, slave.trust);
		} else if (slave.trust < -50) {
			makeSpan(c, "Terrified", ["trust", "terrified"], true, slave.trust);
		} else if (slave.trust < -20) {
			makeSpan(c, "Frightened", ["trust", "frightened"], true, slave.trust);
		} else if (slave.trust <= 20) {
			makeSpan(c, "Fearful", ["trust", "fearful"], true, slave.trust);
		} else if (slave.trust <= 50) {
			if (slave.devotion < -20) {
				makeSpan(c, "Careful", ["defiant", "careful"], true, slave.trust);
			} else {
				makeSpan(c, "Careful", ["trust", "careful"], true, slave.trust);
			}
		} else if (slave.trust <= 95) {
			if (slave.devotion < -20) {
				makeSpan(c, "Bold", ["defiant", "bold"], true, slave.trust);
			} else {
				makeSpan(c, "Trusting", ["trust", "trusting"], true, slave.trust);
			}
		} else {
			if (slave.devotion < -20) {
				makeSpan(c, "Defiant", ["defiant", "full"], true, slave.trust);
			} else {
				makeSpan(c, "Profoundly trusting", ["trust", "prof-trusting"], true, slave.trust);
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_rules(slave, c) {
		const styles = "strong";
		switch (slave.rules.living) {
			case "luxurious":
				makeSpan(c, "LS:Lux", styles);
				break;
			case "normal":
				makeSpan(c, "LS:Nor", styles);
				break;
			default:
				makeSpan(c, "LS:Spa", styles);
				break;
		}
		if (canTalk(slave, false)) {
			switch (slave.rules.speech) {
				case "permissive":
					makeSpan(c, "SpR:P", styles);
					break;
				case "accent elimination":
					makeSpan(c, "SpR:NoAcc", styles);
					break;
				case "language lessons":
					makeSpan(c, "SpR:LL", styles);
					break;
				default:
					makeSpan(c, "SpR:R", styles);
					break;
			}
		}
		switch (slave.rules.relationship) {
			case "permissive":
				makeSpan(c, "ReR:P", styles);
				break;
			case "just friends":
				makeSpan(c, "ReR:Fr", styles);
				break;
			default:
				makeSpan(c, "ReR:R", styles);
				break;
		}
		switch (slave.rules.punishment) {
			case "confinement":
				makeSpan(c, "Pun:Conf", styles);
				break;
			case "whipping":
				makeSpan(c, "Pun:Whip", styles);
				break;
			case "chastity":
				makeSpan(c, "Pun:Chas", styles);
				break;
			default:
				makeSpan(c, "Pun:Situ", styles);
				break;
		}
		switch (slave.rules.reward) {
			case "relaxation":
				makeSpan(c, "Rew:Relx", styles);
				break;
			case "drugs":
				makeSpan(c, "Rew:Drug", styles);
				break;
			case "orgasm":
				makeSpan(c, "Rew:Orga", styles);
				break;
			default:
				makeSpan(c, "Rew:Situ", styles);
				break;
		}
		makeSpan(c, "MaR:" + App.Utils.releaseSummaryShort(slave), styles);
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_rules(slave, c) {
		addText(c, `Living standard: ${slave.rules.living}. `);
		if (canTalk(slave, false)) {
			addText(c, `Speech rules: ${slave.rules.speech}. `);
		}
		addText(c, `Relationship rules: ${slave.rules.relationship}. `);
		addText(c, `Typical punishment: ${slave.rules.punishment}. `);
		addText(c, `Typical reward: ${slave.rules.reward}. `);
		addText(c, `Release rules: ${App.Utils.releaseSummaryLong(slave)}. `);
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_weight(slave, c) {
		if (slave.weight < -95) {
			makeSpan(c, "W---", ["red", "strong"], true, slave.weight);
		} else if (slave.weight < -30) {
			if (slave.hips < -1) {
				makeSpan(c, "W--", "strong", true, slave.weight);
			} else {
				makeSpan(c, "W--", ["red", "strong>"], true, slave.weight);
			}
		} else if (slave.weight < -10) {
			makeSpan(c, "W-", "strong", true, slave.weight);
		} else if (slave.weight <= 10) {
			makeSpan(c, "W", "strong", true, slave.weight);
		} else if (slave.weight <= 30) {
			makeSpan(c, "W+", "strong", true, slave.weight);
		} else if (slave.weight <= 95) {
			if (slave.hips > 1 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
				makeSpan(c, "W++", "strong", true, slave.weight);
			} else {
				makeSpan(c, "W++", ["red", "strong"], true, slave.weight);
			}
		} else if (slave.weight <= 130) {
			if (slave.hips > 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
				makeSpan(c, "W+++", "strong", true, slave.weight);
			} else {
				makeSpan(c, "W+++", ["red", "strong"], true, slave.weight);
			}
		} else if (slave.weight <= 160) {
			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
				makeSpan(c, "W++++", "strong", true, slave.weight);
			} else {
				makeSpan(c, "W++++", ["red", "strong"], true, slave.weight);
			}
		} else if (slave.weight <= 190) {
			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
				makeSpan(c, "W+++++", "strong", true, slave.weight);
			} else {
				makeSpan(c, "W+++++", ["red", "strong"], true, slave.weight);
			}
		} else {
			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
				makeSpan(c, "W++++++", "strong", true, slave.weight);
			} else {
				makeSpan(c, "W++++++", ["red", "strong"], true, slave.weight);
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_weight(slave, c) {
		if (slave.weight < -95) {
			makeSpan(c, "Emaciated", "red", true, slave.weight);
		} else if (slave.weight < -30) {
			if (slave.hips < -1) {
				makeSpan(c, "Model-thin", null, true, slave.weight);
			} else {
				makeSpan(c, "Very thin", "red", true, slave.weight);
			}
		} else if (slave.weight < -10) {
			makeSpan(c, "Thin", null, true, slave.weight);
		} else if (slave.weight <= 10) {
			makeSpan(c, "Trim", null, true, slave.weight);
		} else if (slave.weight <= 30) {
			makeSpan(c, "Plush", null, true, slave.weight);
		} else if (slave.weight <= 95) {
			if (slave.hips > 1 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
				makeSpan(c, "Nicely chubby", null, true, slave.weight);
			} else {
				makeSpan(c, "Overweight", "red", true, slave.weight);
			}
		} else if (slave.weight <= 130) {
			if (slave.hips > 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
				makeSpan(c, "Pleasantly soft and shapely", null, true, slave.weight);
			} else {
				makeSpan(c, "Fat", "red", true, slave.weight);
			}
		} else if (slave.weight <= 160) {
			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
				makeSpan(c, "Amazingly voluptuous", null, true, slave.weight);
			} else {
				makeSpan(c, "Obese", "red", true, slave.weight);
			}
		} else if (slave.weight <= 190) {
			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
				makeSpan(c, "SSBBW", null, true, slave.weight);
			} else {
				makeSpan(c, "Super Obese", "red", true, slave.weight);
			}
		} else {
			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
				makeSpan(c, "Perfectly massive", null, true, slave.weight);
			} else {
				makeSpan(c, "Dangerously Obese", "red", true, slave.weight);
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_diet(slave, c) {
		let diet = makeSpan(null, "", ["teal", "strong"]);
		switch (slave.diet) {
			case "restricted":
				diet.textContent = "Di:W-";
				break;
			case "fattening":
				diet.textContent = "Di:W+";
				break;
			case "XX":
				diet.textContent = "Di:XX+";
				break;
			case "XY":
				diet.textContent = "Di:XY+";
				break;
			case "XXY":
				diet.textContent = "Di:XXY+";
				break;
			case "muscle building":
				diet.textContent = "Di:M+";
				break;
			case "slimming":
				diet.textContent = "Di:M-";
				break;
			case "cum production":
				diet.textContent = "Di:C+";
				break;
			case "cleansing":
				diet.textContent = "Di:H+";
				break;
			case "fertility":
				diet.textContent = "Di:F+";
				break;
		}
		if (diet.textContent.length > 0) {
			c.appendChild(diet);
		}
		let specialDiet = makeSpan(null, "", ["cyan", "strong"]);
		if (slave.dietCum === 2) {
			specialDiet.textContent = "Cum++";
		} else if (((slave.dietCum === 1) && (slave.dietMilk === 0))) {
			specialDiet.textContent = "Cum+";
		} else if (((slave.dietCum === 1) && (slave.dietMilk === 1))) {
			specialDiet.textContent = "Cum+ Milk+";
		} else if (((slave.dietCum === 0) && (slave.dietMilk === 1))) {
			specialDiet.textContent = "Milk+";
		} else if ((slave.dietMilk === 2)) {
			specialDiet.textContent = ">Milk++";
		}
		if (specialDiet.textContent.length > 0) {
			c.appendChild(specialDiet);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_diet(slave, c) {
		let dietDesc = "";
		switch (slave.diet) {
			case "restricted":
				dietDesc = `Dieting.`;
				break;
			case "fattening":
				dietDesc = `Gaining weight.`;
				break;
			case "XX":
				dietDesc = `Estrogen rich.`;
				break;
			case "XY":
				dietDesc = `Testosterone rich.`;
				break;
			case "XXY":
				dietDesc = `Futanari mix.`;
				break;
			case "muscle building":
				dietDesc = `Pumping iron.`;
				break;
			case "slimming":
				dietDesc = `Slimming down.`;
				break;
			case "cum production":
				dietDesc = `Cum production.`;
				break;
			case "cleansing":
				dietDesc = `Cleansing.`;
				break;
			case "fertility":
				dietDesc = `Fertility.`;
				break;
		}

		if (dietDesc) {
			makeSpan(c, dietDesc, "teal");
		}

		function specialDiet(text) {
			addText(c, "Diet base: ");
			makeSpan(c, text, "cyan");
		}

		if (slave.dietCum === 2) {
			specialDiet("Cum Based.");
		} else if (((slave.dietCum === 1) && (slave.dietMilk === 0))) {
			specialDiet("Cum Added.");
		} else if (((slave.dietCum === 1) && (slave.dietMilk === 1))) {
			specialDiet("Milk & Cum Added.");
		} else if (((slave.dietCum === 0) && (slave.dietMilk === 1))) {
			specialDiet("Milk Added.");
		} else if ((slave.dietMilk === 2)) {
			specialDiet("Milk Based.");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_health(slave, c) {
		if (slave.health.health < -20) {
			makeSpan(c, "H", ["red", "strong"], true, slave.health.health);
		} else if (slave.health.health <= 20) {
			makeSpan(c, "H", ["yellow", "strong"], true, slave.health.health);
		} else if (slave.health.health > 20) {
			makeSpan(c, "H", ["green", "strong"], true, slave.health.health);
		}
		if (passage() === "Clinic" && V.clinicUpgradeScanner) {
			if (slave.chem > 15) {
				makeSpan(c, `C${Math.ceil(slave.chem/10)}`, ["cyan", "strong"]);
			} else if (slave.chem <= 15 && slave.assignment === "get treatment in the clinic") {
				makeSpan(c, `CSafe`, ["green", "strong"]);
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_health(slave, c) {
		if (slave.health.health < -90) {
			makeSpan(c, "On the edge of death", ["red", "strong"], true, slave.health.health);
		} else if (slave.health.health < -50) {
			makeSpan(c, "Extremely unhealthy", ["red", "strong"], true, slave.health.health);
		} else if (slave.health.health < -20) {
			makeSpan(c, "Unhealthy", ["red", "strong"], true, slave.health.health);
		} else if (slave.health.health <= 20) {
			makeSpan(c, "healthy", "yellow", true, slave.health.health);
		} else if (slave.health.health <= 50) {
			makeSpan(c, "Very healthy", "green", true, slave.health.health);
		} else if (slave.health.health <= 90) {
			makeSpan(c, "Extremely healthy", "green", true, slave.health.health);
		} else {
			makeSpan(c, "Unnaturally healthy", "green", true, slave.health.health);
		}
		if (passage() === "Clinic" && V.clinicUpgradeScanner) {
			if (slave.chem > 15) {
				makeSpan(c, `Carcinogen buildup: ${Math.ceil(slave.chem/10)}.`, "cyan");
			} else if (slave.chem <= 15 && slave.assignment === "get treatment in the clinic") {
				makeSpan(c, `Safe chem levels.`, "green");
			}
		}
	}

	function short_illness(slave, c) {
		if (slave.health.illness > 4) {
			makeSpan(c, `Ill${slave.health.illness}`, ["red", "strong"], true, slave.health.illness);
		} else if (slave.health.illness > 3) {
			makeSpan(c, `Ill${slave.health.illness}`, ["red", "strong"], true, slave.health.illness);
		} else if (slave.health.illness > 2) {
			makeSpan(c, `Ill${slave.health.illness}`, ["red", "strong"], true, slave.health.illness);
		} else if (slave.health.illness > 0) {
			makeSpan(c, `Ill${slave.health.illness}`, ["yellow", "strong"], true, slave.health.illness);
		}
	}

	function long_illness(slave, c) {
		if (slave.health.illness > 4) {
			makeSpan(c, "Terribly ill", ["red", "strong"], true, slave.health.illness);
		} else if (slave.health.illness > 3) {
			makeSpan(c, "Very ill", ["red", "strong"], true, slave.health.illness);
		} else if (slave.health.illness > 2) {
			makeSpan(c, "Ill", ["red", "strong"], true, slave.health.illness);
		} else if (slave.health.illness > 0) {
			makeSpan(c, "Sick", "yellow", true, slave.health.illness);
		}
	}

	function short_tired(slave, c) {
		if (slave.health.tired > 90) {
			makeSpan(c, "Exh", ["red", "strong"], true, slave.health.tired);
		} else if (slave.health.tired > 60) {
			makeSpan(c, "Tir+", "orange", true, slave.health.tired);
		} else if (slave.health.tired > 30) {
			makeSpan(c, "Tir", "yellow", true, slave.health.tired);
		} else if (slave.health.tired < 0) {
			makeSpan(c, "Ene", "green", true, slave.health.tired);
		}
	}

	function long_tired(slave, c) {
		if (slave.health.tired > 90) {
			makeSpan(c, "Exhausted", ["red", "strong"], true, slave.health.tired);
		} else if (slave.health.tired > 60) {
			makeSpan(c, "Fatigued", "orange", true, slave.health.tired);
		} else if (slave.health.tired > 30) {
			makeSpan(c, "Tired", "yellow", true, slave.health.tired);
		} else if (slave.health.tired < 0) {
			makeSpan(c, "Energetic", "green", true, slave.health.tired);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_drugs(slave, c) {
		let drugDesc = "";
		switch (slave.drugs) {
			case "breast injections":
				drugDesc = "Boobs+";
				break;
			case "intensive breast injections":
				drugDesc = "Boobs++";
				break;
			case "hyper breast injections":
				drugDesc = "Boobs+++";
				break;
			case "butt injections":
				drugDesc = "Butt+";
				break;
			case "intensive butt injections":
				drugDesc = "Butt++";
				break;
			case "hyper butt injections":
				drugDesc = "Butt+++";
				break;
			case "lip injections":
				drugDesc = "Lip+";
				break;
			case "fertility drugs":
				drugDesc = "Fert+";
				break;
			case "super fertility drugs":
				drugDesc = "Fert++";
				break;
			case "penis enhancement":
				drugDesc = "Dick+";
				break;
			case "intensive penis enhancement":
				drugDesc = "Dick++";
				break;
			case "hyper penis enhancement":
				drugDesc = "Dick+++";
				break;
			case "testicle enhancement":
				drugDesc = "Balls+";
				break;
			case "intensive testicle enhancement":
				drugDesc = "Balls++";
				break;
			case "hyper testicle enhancement":
				drugDesc = "Balls+++";
				break;
			case "psychosuppressants":
				drugDesc = "Psych-";
				break;
			case "psychostimulants":
				drugDesc = "Psych+";
				break;
			case "steroids":
				drugDesc = "Ster";
				break;
			case "female hormone injections":
				drugDesc = "HormXX++";
				break;
			case "male hormone injections":
				drugDesc = "HormXY++";
				break;
			case "hormone enhancers":
				drugDesc = "Horm+";
				break;
			case "hormone blockers":
				drugDesc = "Horm-";
				break;
			case "anti-aging cream":
				drugDesc = "Age-";
				break;
			case "appetite suppressors":
				drugDesc = "ApSup";
				break;
			case "penis atrophiers":
				drugDesc = "Dick-";
				break;
			case "testicle atrophiers":
				drugDesc = "Balls-";
				break;
			case "clitoris atrophiers":
				drugDesc = "Clit-";
				break;
			case "labia atrophiers":
				drugDesc = "Labia-";
				break;
			case "nipple atrophiers":
				drugDesc = "Nipple-";
				break;
			case "lip atrophiers":
				drugDesc = "Lip-";
				break;
			case "breast redistributors":
				drugDesc = "Breast-";
				break;
			case "butt redistributors":
				drugDesc = "Butt-";
				break;
			case "sag-B-gone":
				drugDesc = "AntiSag";
				break;
			case "growth stimulants":
				drugDesc = "GroStim";
				break;
			case "priapism agents":
				drugDesc = "Erection";
				break;
		}
		if (drugDesc) {
			makeSpan(c, "Dr:" + drugDesc, ["tan", "strong"]);
		}
		if (slave.curatives === 2) {
			makeSpan(c, "Cura", ["lightgreen", "strong"]);
		} else if (slave.curatives === 1) {
			makeSpan(c, "Prev", ["lightgreen", "strong"]);
		}
		if (slave.aphrodisiacs !== 0) {
			if (slave.aphrodisiacs === 1) {
				makeSpan(c, "Aph", ["lightblue", "strong"]);
			} else if (slave.aphrodisiacs === 2) {
				makeSpan(c, "Aph++", ["lightblue", "strong"]);
			} else {
				makeSpan(c, "Anaph", ["lightblue", "strong"]);
			}
		}
		if (slave.addict !== 0) {
			makeSpan(c, "Add", "cyan");
		}
		let styles = ["lightsalmon", "strong"];
		if (slave.hormones > 1) {
			makeSpan(c, "Ho:F+", styles);
		} else if (slave.hormones > 0) {
			makeSpan(c, "Ho:F", styles);
		} else if (slave.hormones < -1) {
			makeSpan(c, "Ho:M+", styles);
		} else if (slave.hormones < 0) {
			makeSpan(c, "Ho:M", styles);
		}

		styles = ["mediumseagreen", "strong"];
		if ((slave.bellyImplant > -1)) {
			makeSpan(c, "Belly Imp", styles);
		} else if (((slave.preg <= -2) || (slave.ovaries === 0)) && (slave.vagina !== -1)) {
			makeSpan(c, "Barr", styles);
		} else if (slave.pubertyXX === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
			makeSpan(c, "Prepub", styles);
		} else if (slave.ovaryAge >= 47 && (slave.ovaries === 1 || slave.mpreg === 1)) {
			makeSpan(c, "Meno", styles);
		} else if (slave.pregWeek < 0) {
			makeSpan(c, "Postpartum", styles);
		} else if (slave.preg === -1) {
			makeSpan(c, "CC", styles);
		} else if (slave.preg === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
			makeSpan(c, "Fert+", styles);
		} else if (((slave.preg < slave.pregData.normalBirth / 10) && (slave.preg > 0) && slave.pregKnown === 0) || slave.pregWeek === 1) {
			makeSpan(c, "Preg?", styles);
		} else if ((slave.preg >= 36) && (slave.broodmother > 0)) {
			makeSpan(c, "Perm preg", styles);
		} else if (slave.pregKnown === 1) {
			makeSpan(c, `${slave.pregWeek} wks preg`, styles);
		}
		if (slave.induce === 1) {
			makeSpan(c, "Early Labor", ["orange", "strong"]);
		}
		if (slave.pubertyXY === 0 && slave.balls > 0) {
			makeSpan(c, "Prepub balls", "strong");
		}
		if (slave.balls > 0 && slave.vasectomy === 1) {
			makeSpan(c, "Vasect", "strong");
		}
		styles = ["springgreen", "strong"];
		if (slave.inflation === 3) {
			makeSpan(c, `8 ltr ${slave.inflationType}`, styles);
		} else if (slave.inflation === 2) {
			makeSpan(c, `4 ltr ${slave.inflationType}`, styles);
		} else if (slave.inflation === 1) {
			makeSpan(c, `2 ltr ${slave.inflationType}`, styles);
		} else if (slave.bellyFluid > 0) {
			makeSpan(c, `${slave.bellyFluid}ccs ${slave.inflationType}`, styles);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_drugs(slave, c) {
		let swd = WombGetLittersData(slave);
		if ((slave.drugs !== "no drugs") && (slave.drugs !== "none")) {
			makeSpan(c, `On ${slave.drugs}.`, "tan");
		}
		if (slave.curatives === 2) {
			makeSpan(c, "On curatives.", "lightgreen");
		} else if (slave.curatives === 1) {
			makeSpan(c, "On preventatives.", "lightgreen");
		}
		if (slave.aphrodisiacs > 0) {
			makeSpan(c, `On ${slave.aphrodisiacs > 1 ? 'extreme' : ''} aphrodisiacs.`, "lightblue");
		} else if (slave.aphrodisiacs === -1) {
			makeSpan(c, "On anaphrodisiacs.", "lightblue");
		}
		if (slave.addict !== 0) {
			makeSpan(c, "Addict.", "cyan");
		}
		if (slave.hormones > 1) {
			makeSpan(c, "Heavy female hormones.", "lightsalmon");
		} else if (slave.hormones > 0) {
			makeSpan(c, "Female hormones.", "lightsalmon");
		} else if (slave.hormones < -1) {
			makeSpan(c, "Heavy male hormones.", "lightsalmon");
		} else if (slave.hormones < 0) {
			makeSpan(c, "Male hormones.", "lightsalmon");
		}
		let styles = "mediumseagreen";
		if ((slave.bellyImplant > -1)) {
			makeSpan(c, "Belly Implant.", styles);
		} else if ((slave.preg <= -2) && (slave.ovaries === 1 || slave.mpreg === 1)) {
			makeSpan(c, "Barren.", styles);
		} else if ((slave.ovaries === 0) && (slave.vagina !== -1) && (slave.genes === "XX")) {
			makeSpan(c, "Barren.", styles);
		} else if (slave.pubertyXX === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
			makeSpan(c, "Not ovulating yet.", styles);
		} else if (slave.ovaryAge >= 47 && (slave.ovaries === 1 || slave.mpreg === 1)) {
			makeSpan(c, "Menopausal.", styles);
		} else if (slave.pregWeek < 0) {
			makeSpan(c, "Postpartum.", styles);
		} else if (slave.preg === -1) {
			makeSpan(c, "On contraceptives.", styles);
		} else if (slave.preg === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
			makeSpan(c, "Fertile.", styles);
		} else if ((slave.preg >= 36) && (slave.broodmother > 0)) {
			makeSpan(c, "Permanently pregnant.", styles);
		} else if (swd.litters.length > 1) {
			let pregTxt = `Concurrent pregnancies: (${swd.litters.length} sets).`;
			pregTxt += ` Max:${swd.litters[0]} / Min:${swd.litters[swd.litters.length-1]} week(s).`;
			makeSpan(c, pregTxt, "lime");
		} else if (((slave.preg < slave.pregData.normalBirth / 10) && (slave.preg > 0) && slave.pregKnown === 0) || slave.pregWeek === 1) {
			makeSpan(c, "May be pregnant.");
		} else if (slave.pregKnown === 1) {
			if (slave.pregType < 2 || slave.broodmother > 0) {
				makeSpan(c, `${slave.pregWeek} weeks pregnant.`);
			} else {
				let desc = `${slave.pregWeek} weeks pregnant with `;
				if (slave.pregType >= 40) {
					desc += `a tremendous brood of offspring.`;
				} else if (slave.pregType >= 20) {
					desc += `a brood of offspring.`;
				} else if (slave.pregType >= 10) {
					desc += `${slave.pregType} babies.`;
				} else if (slave.pregType === 9) {
					desc += `nonuplets.`;
				} else if (slave.pregType === 8) {
					desc += `octuplets.`;
				} else if (slave.pregType === 7) {
					desc += `septuplets.`;
				} else if (slave.pregType === 6) {
					desc += `sextuplets.`;
				} else if (slave.pregType === 5) {
					desc += `quintuplets.`;
				} else if (slave.pregType === 4) {
					desc += `quadruplets.`;
				} else if (slave.pregType === 3) {
					desc += `triplets.`;
				} else {
					desc += `twins.`;
				}
				makeSpan(c, desc);
			}
			if (slave.preg > slave.pregData.normalBirth && slave.broodmother === 0) {
				makeSpan(c, "(Overdue.)");
			}
		}
		if (slave.induce === 1) {
			makeSpan(c, "Showing signs of early labor.", "orange");
		}
		if (slave.pubertyXY === 0 && slave.balls > 0) {
			makeSpan(c, "Has not had first ejaculation.");
		}
		if (slave.balls > 0 && slave.vasectomy === 1) {
			makeSpan(c, "Vasectomy.");
		}
		if (slave.inflation === 3) {
			makeSpan(c, `Filled with 8 liters of ${slave.inflationType}.`, "springgreen");
		} else if (slave.inflation === 2) {
			makeSpan(c, `Filled with 4 liters of ${slave.inflationType}.`, "springgreen");
		} else if (slave.inflation === 1) {
			makeSpan(c, `Filled with 2 liters of ${slave.inflationType}.`, "springgreen");
		} else if (slave.bellyFluid > 0) {
			makeSpan(c, `Stuffed with ${slave.bellyFluid}ccs of ${slave.inflationType}.`, "springgreen");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @returns {string}
	 */
	function long_race(slave) {
		switch (slave.race) {
			case "white":
				return `Caucasian.`;
			case "asian":
				return `Asian.`;
			case "indo-aryan":
				return `Indo-aryan.`;
			case "latina":
				return `Latina.`;
			case "middle eastern":
				return `Middle Eastern.`;
			case "black":
				return `Black.`;
			case "pacific islander":
				return `Pacific Islander.`;
			case "malay":
				return `Malay.`;
			case "amerindian":
				return `Amerindian.`;
			case "semitic":
				return `Semitic.`;
			case "southern european":
				return `Southern European.`;
			case "mixed race":
				return `Mixed race.`;
			default:
				return `${slave.race.charAt(0).toUpperCase() + slave.race.slice(1)}.`;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @returns {string}
	 */
	function short_race(slave) {
		switch (slave.race) {
			case "white":
				return `C`;
			case "asian":
				return `A`;
			case "indo-aryan":
				return `I`;
			case "latina":
				return `L`;
			case "middle eastern":
				return `ME`;
			case "black":
				return `B`;
			case "pacific islander":
				return `PI`;
			case "malay":
				return `M`;
			case "amerindian":
				return `AI`;
			case "semitic":
				return `S`;
			case "southern european":
				return `SE`;
			case "mixed race":
				return `MR`;
			default:
				return `${slave.race.charAt(0).toUpperCase() + slave.race.charAt(1) + slave.race.charAt(2)}`;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @returns {string}
	 */
	function short_nationality(slave) {
		switch (slave.nationality) {
			case "Afghan":
				return "Afg";
			case "Albanian":
				return "Alb";
			case "Algerian":
				return "Alg";
			case "American":
				return "USA";
			case "Andorran":
				return "And";
			case "Angolan":
				return "Ang";
			case "Antiguan":
				return "AB";
			case "Argentinian":
				return "Arg";
			case "Armenian":
				return "Arm";
			case "Aruban":
				return "Aru";
			case "Australian":
				return "Aus";
			case "Austrian":
				return "Aut";
			case "Azerbaijani":
				return "Aze";
			case "Bahamian":
				return "Bah";
			case "Bahraini":
				return "Bah";
			case "Bangladeshi":
				return "Bgd";
			case "Barbadian":
				return "Bar";
			case "Belarusian":
				return "Ber";
			case "Belgian":
				return "Bel";
			case "Belizean":
				return "Blz";
			case "Beninese":
				return "Ben";
			case "Bermudian":
				return "Bmd";
			case "Bhutanese":
				return "Bhu";
			case "Bissau-Guinean":
				return "GB";
			case "Bolivian":
				return "Bol";
			case "Bosnian":
				return "Bos";
			case "Brazilian":
				return "Bra";
			case "British":
				return "UK";
			case "Bruneian":
				return "Bru";
			case "Bulgarian":
				return "Bul";
			case "Burkinabé":
				return "BF";
			case "Burmese":
				return "Bur";
			case "Burundian":
				return "Bnd";
			case "Cambodian":
				return "Kam";
			case "Cameroonian":
				return "Cam";
			case "Canadian":
				return "Can";
			case "Cape Verdean":
				return "CV";
			case "Catalan":
				return "Cat";
			case "Central African":
				return "CAR";
			case "Chadian":
				return "Cha";
			case "Chilean":
				return "Chl";
			case "Chinese":
				return "Chi";
			case "Colombian":
				return "Col";
			case "Comorian":
				return "Com";
			case "Congolese":
				return "RC";
			case "a Cook Islander":
				return "CI";
			case "Costa Rican":
				return "CR";
			case "Croatian":
				return "Cro";
			case "Cuban":
				return "Cub";
			case "Curaçaoan":
				return "Cur";
			case "Cypriot":
				return "Cyp";
			case "Czech":
				return "Cze";
			case "Danish":
				return "Den";
			case "Djiboutian":
				return "Dji";
			case "Dominican":
				return "DR";
			case "Dominiquais":
				return "Dom";
			case "Dutch":
				return "Nld";
			case "East Timorese":
				return "ET";
			case "Ecuadorian":
				return "Ecu";
			case "Egyptian":
				return "Egy";
			case "Emirati":
				return "UAE";
			case "Equatoguinean":
				return "EG";
			case "Eritrean":
				return "Eri";
			case "Estonian":
				return "Est";
			case "Ethiopian":
				return "Eth";
			case "Fijian":
				return "Fij";
			case "Filipina":
				return "Phl";
			case "Finnish":
				return "Fin";
			case "French":
				return "Fra";
			case "French Guianan":
				return "FG";
			case "French Polynesian":
				return "FP";
			case "Gabonese":
				return "Gab";
			case "Gambian":
				return "Gam";
			case "Georgian":
				return "Geo";
			case "German":
				return "Ger";
			case "Ghanan":
				return "Gha";
			case "Greek":
				return "Gre";
			case "Greenlandic":
				return "Grn";
			case "Grenadian":
				return "Gda";
			case "Guamanian":
				return "Gua";
			case "Guatemalan":
				return "Gtm";
			case "Guinean":
				return "Gui";
			case "Guyanese":
				return "Guy";
			case "Haitian":
				return "Hai";
			case "Honduran":
				return "Hon";
			case "Hungarian":
				return "Hun";
			case "I-Kiribati":
				return "Kir";
			case "Icelandic":
				return "Ice";
			case "Indian":
				return "Ind";
			case "Indonesian":
				return "Idn";
			case "Iranian":
				return "Irn";
			case "Iraqi":
				return "Irq";
			case "Irish":
				return "Irl";
			case "Israeli":
				return "Isr";
			case "Italian":
				return "Ita";
			case "Ivorian":
				return "IC";
			case "Jamaican":
				return "Jam";
			case "Japanese":
				return "Jpn";
			case "Jordanian":
				return "Jor";
			case "Kazakh":
				return "Kaz";
			case "Kenyan":
				return "Ken";
			case "Kittitian":
				return "SKN";
			case "Korean":
				return "Kor";
			case "Kosovan":
				return "Kos";
			case "Kurdish":
				return "Kur";
			case "Kuwaiti":
				return "Kuw";
			case "Kyrgyz":
				return "Kyr";
			case "Laotian":
				return "Lao";
			case "Latvian":
				return "Lat";
			case "Lebanese":
				return "Lbn";
			case "Liberian":
				return "Lib";
			case "Libyan":
				return "Lby";
			case "a Liechtensteiner":
				return "Lie";
			case "Lithuanian":
				return "Lit";
			case "Luxembourgian":
				return "Lux";
			case "Macedonian":
				return "Mac";
			case "Malagasy":
				return "Mad";
			case "Malawian":
				return "Mwi";
			case "Malaysian":
				return "Mys";
			case "Maldivian":
				return "Mdv";
			case "Malian":
				return "Mal";
			case "Maltese":
				return "Mlt";
			case "Marshallese":
				return "MI";
			case "Mauritanian":
				return "Mta";
			case "Mauritian":
				return "Mts";
			case "Mexican":
				return "Mex";
			case "Micronesian":
				return "FSM";
			case "Moldovan":
				return "Mol";
			case "Monégasque":
				return "Mnc";
			case "Mongolian":
				return "Mon";
			case "Montenegrin":
				return "Mng";
			case "Moroccan":
				return "Mor";
			case "Mosotho":
				return "Les";
			case "Motswana":
				return "Bot";
			case "Mozambican":
				return "Moz";
			case "Namibian":
				return "Nam";
			case "Nauruan":
				return "Nau";
			case "Nepalese":
				return "Npl";
			case "New Caledonian":
				return "NC";
			case "a New Zealander":
				return "NZ";
			case "Ni-Vanuatu":
				return "Van";
			case "Nicaraguan":
				return "Nic";
			case "Nigerian":
				return "Nga";
			case "Nigerien":
				return "Ngr";
			case "Niuean":
				return "Niu";
			case "Norwegian":
				return "Nor";
			case "Omani":
				return "Omn";
			case "Pakistani":
				return "Pak";
			case "Palauan":
				return "Plu";
			case "Palestinian":
				return "Pal";
			case "Panamanian":
				return "Pan";
			case "Papua New Guinean":
				return "PNG";
			case "Paraguayan":
				return "Par";
			case "Peruvian":
				return "Per";
			case "Polish":
				return "Pol";
			case "Portuguese":
				return "Por";
			case "Puerto Rican":
				return "PR";
			case "Qatari":
				return "Qat";
			case "Romanian":
				return "Rom";
			case "Russian":
				return "Rus";
			case "Rwandan":
				return "Rwa";
			case "Sahrawi":
				return "Sah";
			case "Saint Lucian":
				return "SL";
			case "Salvadoran":
				return "ES";
			case "Sammarinese":
				return "SM";
			case "Samoan":
				return "Sam";
			case "São Toméan":
				return "STP";
			case "Saudi":
				return "Sau";
			case "Scottish":
				return "Sco";
			case "Senegalese":
				return "Sen";
			case "Serbian":
				return "Srb";
			case "Seychellois":
				return "Sey";
			case "Sierra Leonean":
				return "Sie";
			case "Singaporean":
				return "Sng";
			case "Slovak":
				return "Svk";
			case "Slovene":
				return "Svn";
			case "a Solomon Islander":
				return "SI";
			case "Somali":
				return "Som";
			case "South African":
				return "RSA";
			case "South Sudanese":
				return "SS";
			case "Spanish":
				return "Spa";
			case "Sri Lankan":
				return "Sri";
			case "Sudanese":
				return "Sud";
			case "Surinamese":
				return "Sur";
			case "Swazi":
				return "Swa";
			case "Swedish":
				return "Swe";
			case "Swiss":
				return "Swi";
			case "Syrian":
				return "Syr";
			case "Taiwanese":
				return "Tai";
			case "Tajik":
				return "Taj";
			case "Tanzanian":
				return "Tza";
			case "Thai":
				return "Tha";
			case "Tibetan":
				return "Tib";
			case "Togolese":
				return "Tog";
			case "Tongan":
				return "Ton";
			case "Trinidadian":
				return "TT";
			case "Tunisian":
				return "Tun";
			case "Turkish":
				return "Tur";
			case "Turkmen":
				return "Tkm";
			case "Tuvaluan":
				return "Tuv";
			case "Ugandan":
				return "Uga";
			case "Ukrainian":
				return "Ukr";
			case "Uruguayan":
				return "Uru";
			case "Uzbek":
				return "Uzb";
			case "Vatican":
				return "VC";
			case "Venezuelan":
				return "Ven";
			case "Vietnamese":
				return "Vnm";
			case "Vincentian":
				return "SVG";
			case "Yemeni":
				return "Yem";
			case "Zairian":
				return "DRC";
			case "Zambian":
				return "Zam";
			case "Zimbabwean":
				if (slave.race === "white") {
					return `Rho`;
				} else {
					return `Zwe`;
				}
			case "Ancient Chinese Revivalist":
				return `Chi Rev`;
			case "Ancient Egyptian Revivalist":
				return `Egy Rev`;
			case "Arabian Revivalist":
				return `Ara Rev`;
			case "Aztec Revivalist":
				return `Azt Rev`;
			case "Edo Revivalist":
				return `Edo Rev`;
			case "Roman Revivalist":
				return `Rom Rev`;
			case "":
			case "none":
			case "slave":
			case "Stateless":
				return "None";
			default:
				return `${slave.nationality.charAt(0) + slave.nationality.charAt(1) + slave.nationality.charAt(2)}`;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @returns {string}
	 */
	function long_nationality(slave) {
		switch (slave.nationality) {
			case "a Cook Islander":
				return `Cook Islander.`;
			case "a Liechtensteiner":
				return `Liechtensteiner.`;
			case "a New Zealander":
				return `New Zealander.`;
			case "a Solomon Islander":
				return `Solomon Islander.`;
			case "Zimbabwean":
				if (slave.race === "white") {
					return `Rhodesian.`;
				} else {
					return `${slave.nationality}.`;
				}
			case "slave":
			case "none":
			case "":
			case "Stateless":
				return `Stateless.`;
			default:
				return `${slave.nationality}.`;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @returns {string}
	 */
	function short_skin(slave) {
		switch (slave.skin) {
			case "pure white":
				return `P. Whi`;
			case "extremely fair":
				return `E. Fai`;
			case "very fair":
				return `V. Fai`;
			case "extremely pale":
				return `E. Pal`;
			case "very pale":
				return `V. Pal`;
			case "light brown":
				return `L. Br`;
			case "dark brown":
				return `D. Br`;
			case "light olive":
				return `L. Oli`;
			case "dark olive":
				return `D. Oli`;
			case "light beige":
				return `L. Bei`;
			case "dark beige":
				return `D. Bei`;
			case "tan":
				return `Tan`;
			case "bronze":
				return `Bron`;
			case "ebony":
				return `Ebon`;
			case "pure black":
				return `P. Bla`;
			case "dark":
			case "fair":
			case "pale":
				return `${slave.skin.charAt(0).toUpperCase() + slave.skin.slice(1)}`;
			default:
				return `${slave.skin.charAt(0).toUpperCase() + slave.skin.charAt(1) + slave.skin.charAt(2)}`;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_genitals(slave, c) {
		if (slave.dick > 0) {
			let dickDesc = "";
			if (slave.balls === 0) {
				dickDesc += `Geld`;
			}
			if ((slave.dick > 8) && (slave.balls > 8)) {
				dickDesc += `Junk+++`;
			} else if ((slave.dick > 5) && (slave.balls > 5)) {
				dickDesc += `Junk++`;
			} else if ((slave.dick > 4) && (slave.balls > 4)) {
				dickDesc += `Junk+`;
			} else if ((slave.dick > 3) && (slave.balls > 3)) {
				dickDesc += `Junk`;
			} else if (slave.dick > 8) {
				dickDesc += `Dick+++`;
			} else if (slave.dick > 5) {
				dickDesc += `Dick++`;
			} else if (slave.dick > 4) {
				dickDesc += `Dick+`;
			} else if (slave.dick > 3) {
				dickDesc += `Dick`;
			} else if (slave.balls > 10) {
				dickDesc += `Balls+++`;
			} else if (slave.balls > 5) {
				dickDesc += `Balls++`;
			} else if (slave.balls > 4) {
				dickDesc += `Balls+`;
			} else if (slave.balls > 3) {
				dickDesc += `Balls`;
			}
			if (dickDesc.length) {
				makeSpan(c, dickDesc, "pink");
			}
		}
		if (slave.vagina === 0) {
			makeSpan(c, "VV", "lime");
		} else if ((slave.pregKnown === 1) && canWalk(slave) && (slave.clothes === "no clothing" || slave.clothes === "body oil") && (slave.shoes === "none")) {
			makeSpan(c, "NBP", "pink");
		}
		if (slave.anus === 0) {
			makeSpan(c, "AV", "lime");
		}
		let holesDesc = "";
		if ((slave.vagina > 3) && (slave.anus > 3)) {
			holesDesc += `V++A++`;
		} else if ((slave.vagina > 2) && (slave.anus > 2)) {
			holesDesc += `V+A+`;
		} else if (slave.vagina > 3) {
			holesDesc += `V++`;
		} else if (slave.vagina > 2) {
			holesDesc += `V+`;
		} else if (slave.anus > 3) {
			holesDesc += `A++`;
		} else if (slave.anus > 2) {
			holesDesc += `A+`;
		}
		if (holesDesc.length) {
			makeSpan(c, holesDesc, "pink");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_genitals(slave, c) {
		if (slave.dick > 0) {
			let dickDesc = "";
			if (slave.balls === 0) {
				dickDesc += 'Gelded.';
			}
			if ((slave.dick > 8) && (slave.balls > 8)) {
				dickDesc += `Hyper dick & balls.`;
			} else if ((slave.dick > 5) && (slave.balls > 5)) {
				dickDesc += `Monster dick & balls.`;
			} else if ((slave.dick > 4) && (slave.balls > 4)) {
				dickDesc = `Huge dick & balls.`;
			} else if ((slave.dick > 3) && (slave.balls > 3)) {
				dickDesc = `Big dick & balls.`;
			} else if (slave.dick > 8) {
				dickDesc = `Hyper dong.`;
			} else if (slave.dick > 5) {
				dickDesc = `Monster dong.`;
			} else if (slave.dick > 4) {
				dickDesc = `Huge dick.`;
			} else if (slave.dick > 3) {
				dickDesc = `Big dick.`;
			} else if (slave.balls > 8) {
				dickDesc = `Hyper balls.`;
			} else if (slave.balls > 5) {
				dickDesc = `Monstrous balls.`;
			} else if (slave.balls > 4) {
				dickDesc = `Huge balls.`;
			} else if (slave.balls > 3) {
				dickDesc = `Big balls.`;
			}
			if (dickDesc.length) {
				makeSpan(c, dickDesc, "pink");
			}
		}
		if (slave.vagina === 0) {
			makeSpan(c, "Virgin.", "lime");
		} else if ((slave.pregKnown === 1) && canWalk(slave) && (slave.clothes === "no clothing" || slave.clothes === "body oil") && (slave.shoes === "none")) {
			makeSpan(c, "Naked, barefoot, and pregnant.", "pink");
		}
		if (slave.anus === 0) {
			makeSpan(c, "Anal virgin.", "lime");
		}
		let holesDesc = "";
		if ((slave.vagina > 3) && (slave.anus > 3)) {
			holesDesc += `Blown out holes.`;
		} else if ((slave.vagina > 2) && (slave.anus > 2)) {
			holesDesc += `High mileage.`;
		} else if (slave.vagina > 3) {
			holesDesc += `Cavernous pussy.`;
		} else if (slave.vagina > 2) {
			holesDesc += `Loose pussy.`;
		} else if (slave.anus > 3) {
			holesDesc += `Permagaped anus.`;
		} else if (slave.anus > 2) {
			holesDesc += `Gaping anus.`;
		}
		if (holesDesc.length) {
			makeSpan(c, holesDesc, "pink");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_age(slave, c) {
		let r = makeSpan(c, "", "pink");
		if (V.showAgeDetail === 1) {
			r.textContent += slave.actualAge.toString();
		} else if (slave.actualAge >= 40) {
			r.textContent += "40s";
		} else if (slave.actualAge >= 35) {
			r.textContent += "Lt30s";
		} else if (slave.actualAge >= 30) {
			r.textContent += "Ea30s";
		} else if (slave.actualAge >= 25) {
			r.textContent += "Lt20s";
		} else if (slave.actualAge >= 20) {
			r.textContent += "Ea20s";
		} else if (slave.actualAge >= 18) {
			r.textContent += slave.actualAge.toString();
		}
		if (slave.actualAge !== slave.physicalAge) {
			r.textContent += ` w ${slave.physicalAge}y-bdy`;
		}
		if (slave.visualAge !== slave.physicalAge) {
			r.textContent += ` Lks${slave.visualAge}`;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_face(slave, c) {
		if (slave.face < -95) {
			makeSpan(c, "Face---", "red", true, slave.face);
		} else if (slave.face < -40) {
			makeSpan(c, "Face--", "red", true, slave.face);
		} else if (slave.face < -10) {
			makeSpan(c, "Face-", "red", true, slave.face);
		} else if (slave.face <= 10) {
			makeSpan(c, "Face", null, true, slave.face);
		} else if (slave.face <= 40) {
			makeSpan(c, "Face+", "pink", true, slave.face);
		} else if (slave.face <= 95) {
			makeSpan(c, "Face++", "pink", true, slave.face);
		} else {
			makeSpan(c, "Face+++", "pink", true, slave.face);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_eyes(slave, c) {
		if (!canSee(slave)) {
			makeSpan(c, "Blind", "red");
		} else if (!canSeePerfectly(slave)) {
			makeSpan(c, "Sight-", "yellow");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_ears(slave, c) {
		if (slave.hears === -2) {
			makeSpan(c, "Deaf", "red");
		} else if ((slave.hears === -1) && (slave.earwear !== "hearing aids")) {
			makeSpan(c, "Hearing-", "yellow");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_lips(slave, c) {
		if (slave.lips > 95) {
			makeSpan(c, "Facepussy");
		} else if (slave.lips > 70) {
			makeSpan(c, "Lips+++", null, true, slave.lips);
		} else if (slave.lips > 40) {
			makeSpan(c, "Lips++", null, true, slave.lips);
		} else if (slave.lips > 20) {
			makeSpan(c, "Lips+", null, true, slave.lips);
		} else if (slave.lips > 10) {
			makeSpan(c, "Lips", null, true, slave.lips);
		} else {
			makeSpan(c, "Lips-", "red", true, slave.lips);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_teeth(slave, c) {
		if (slave.teeth === "crooked") {
			makeSpan(c, "Cr Teeth", "yellow");
		} else if (slave.teeth === "gapped") {
			makeSpan(c, "Gap", "yellow");
		} else if (slave.teeth === "cosmetic braces") {
			makeSpan(c, `Cos Braces`);
		} else if (slave.teeth === "straightening braces") {
			makeSpan(c, `Braces`);
		} else if (slave.teeth === "removable") {
			makeSpan(c, `Rem Teeth`);
		} else if (slave.teeth === "pointy") {
			makeSpan(c, `Fangs`);
		} else if (slave.teeth === "baby") {
			makeSpan(c, `Baby`);
		} else if (slave.teeth === "mixed") {
			makeSpan(c, `Mixed`);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_muscles(slave, c) {
		if (slave.muscles > 95) {
			makeSpan(c, "Musc++", undefined, true, slave.muscles);
		} else if (slave.muscles > 50) {
			makeSpan(c, "Musc+", undefined, true, slave.muscles);
		} else if (slave.muscles > 30) {
			makeSpan(c, "Fit", undefined, true, slave.muscles);
		} else if (slave.muscles > 5) {
			makeSpan(c, "Toned", undefined, true, slave.muscles);
		} else if (slave.muscles > -6) {
			makeSpan(c, "Soft", undefined, true, slave.muscles);
		} else if (slave.muscles > -31) {
			if (V.arcologies[0].FSPhysicalIdealist === "unset") {
				makeSpan(c, "Weak", "red", true, slave.muscles);
			} else {
				makeSpan(c, "Soft", undefined, true, slave.muscles);
			}
		} else if (slave.muscles > -96) {
			if (V.arcologies[0].FSPhysicalIdealist === "unset") {
				makeSpan(c, "Weak+", "red", true, slave.muscles);
			} else {
				makeSpan(c, "Soft+", undefined, true, slave.muscles);
			}
		} else {
			makeSpan(c, "Weak++", "red", true, slave.muscles);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_voice(slave, c) {
		if (slave.voice === 0) {
			makeSpan(c, "Mute", "red");
		} else {
			if (slave.accent === 3) {
				makeSpan(c, "Acc--", "red");
			} else if (slave.accent === 2) {
				makeSpan(c, "Acc-");
			} else if (slave.accent === 4) {
				makeSpan(c, "Acc--");
			} else if (slave.accent === 1) {
				makeSpan(c, "Acc", "pink");
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_tits_ass(slave, c) {
		let styles = "pink";
		if ((slave.boobs >= 12000) && (slave.butt > 9)) {
			makeSpan(c, "T&A+++", styles);
		} else if ((slave.boobs > 4000) && (slave.butt > 8)) {
			makeSpan(c, "T&A++", styles);
		} else if ((slave.boobs > 2000) && (slave.butt > 6)) {
			makeSpan(c, "T&A+", styles);
		} else if ((slave.boobs > 800) && (slave.butt > 4)) {
			makeSpan(c, "T&A", styles);
		} else if ((slave.boobs < 500) && (slave.butt < 3) && (slave.weight <= 10) && (slave.muscles <= 30)) {
			makeSpan(c, "Girlish", styles);
		} else if (slave.boobs >= 12000) {
			makeSpan(c, "Boobs+++", styles);
		} else if (slave.boobs > 4000) {
			makeSpan(c, "Boobs++", styles);
		} else if (slave.boobs > 2000) {
			makeSpan(c, "Boobs+", styles);
		} else if (slave.boobs > 800) {
			makeSpan(c, "Boobs", styles);
		} else if (slave.butt > 9) {
			makeSpan(c, "Ass+++", styles);
		} else if (slave.butt > 8) {
			makeSpan(c, "Ass++", styles);
		} else if (slave.butt > 6) {
			makeSpan(c, "Ass+", styles);
		} else if (slave.butt > 4) {
			makeSpan(c, "Ass", styles);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_hips(slave, c) {
		let desc = "";
		if (slave.hips < -1) {
			if (slave.butt > 2 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
				desc = `Disp+`;
			}
		} else if (slave.hips < 0) {
			if (slave.butt > 4 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
				desc = `Disp+`;
			}
		} else if (slave.hips > 2) {
			if (slave.butt <= 8) {
				desc = `Disp-`;
			}
		} else if (slave.hips > 1) {
			if (slave.butt <= 3 && (V.arcologies[0].FSSlimnessEnthusiast === "unset" || (slave.boobs >= 500))) {
				desc = `Disp-`;
			}
		} else if (slave.hips > 0) {
			if (slave.butt > 8) {
				if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
					desc = `Disp+`;
				}
			} else if (slave.butt <= 2 && (V.arcologies[0].FSSlimnessEnthusiast === "unset" || (slave.boobs >= 500))) {
				desc = `Disp-`;
			}
		} else {
			if (slave.butt > 6) {
				if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
					desc = `Disp+`;
				}
			} else if (slave.butt <= 1 && (V.arcologies[0].FSSlimnessEnthusiast === "unset" || (slave.boobs >= 500))) {
				desc = `Disp-`;
			}
		}
		if (desc) {
			makeSpan(c, desc, "red");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_waist(slave, c) {
		if (slave.waist > 95) {
			makeSpan(c, "Wst---", "red", false, slave.waist);
		} else if (slave.waist > 40) {
			makeSpan(c, "Wst--", "red", false, slave.waist);
		} else if (slave.waist > 10) {
			makeSpan(c, "Wst-", "red", false, slave.waist);
		} else if (slave.waist >= -10) {
			makeSpan(c, "Wst", undefined, false, slave.waist);
		} else if (slave.waist >= -40) {
			makeSpan(c, "Wst+", "pink", false, slave.waist);
		} else if (slave.waist >= -95) {
			makeSpan(c, "Wst++", "pink", false, slave.waist);
		} else {
			makeSpan(c, "Wst+++", "pink", false, slave.waist);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_implants(slave, c) {
		if ((slave.boobsImplant === 0) && (slave.buttImplant === 0) && (slave.waist >= -95) && (slave.lipsImplant === 0) && (slave.faceImplant <= 5) && (slave.bellyImplant === -1)) {
			makeSpan(c, "Natr", "pink");
		} else {
			makeSpan(c, "Impl", "pink");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_lactation(slave, c) {
		if (slave.lactation === 1) {
			makeSpan(c, "Lact", "pink");
		} else if (slave.lactation === 2) {
			makeSpan(c, "Lact", "pink");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_mods(slave, c) {
		V.modScore = SlaveStatsChecker.modScore(slave);
		if (slave.corsetPiercing === 0 && V.piercingScore < 3 && V.tatScore < 2) {
			return;
		} else if (V.modScore > 15 || (V.piercingScore > 8 && V.tatScore > 5)) {
			makeSpan(c, "Mods++");
		} else if (V.modScore > 7) {
			makeSpan(c, "Mods+");
		} else {
			makeSpan(c, "Mods");
		}
		if (!jQuery.isEmptyObject(slave.brand)) {
			makeSpan(c, "Br");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_age(slave, c) {
		let r = makeSpan(c, "", "pink");
		if (V.showAgeDetail === 1) {
			r.textContent += `Age ` + `${slave.actualAge}` + `.`;
		} else if (slave.actualAge >= 40) {
			r.textContent += `Forties.`;
		} else if (slave.actualAge >= 35) {
			r.textContent += `Late thirties.`;
		} else if (slave.actualAge >= 30) {
			r.textContent += `Early thirties.`;
		} else if (slave.actualAge >= 25) {
			r.textContent += `Late twenties.`;
		} else if (slave.actualAge >= 20) {
			r.textContent += `Early twenties.`;
		} else if (slave.actualAge >= 19) {
			r.textContent += `Nineteen.`;
		} else if (slave.actualAge >= 18) {
			r.textContent += `Eighteen.`;
		} else {
			r.textContent += `Underage.`;
		}
		/*
		 ** No NCS, then do the standard, However because of the wrinkles of Incubators, as long as visual age is greater
		 ** than or equal to physical age, we do the old physical body/Looks for fresh out of the can NCS slaves.
		 */
		if (((slave.geneMods.NCS === 0) || (slave.visualAge >= slave.physicalAge))) {
			if (slave.actualAge !== slave.physicalAge) {
				r.textContent += ` ${slave.physicalAge}` + ` year old body.`;
			}
			if (slave.visualAge !== slave.physicalAge) {
				r.textContent += ` Looks ` + `${slave.visualAge}` + `.`;
			}
		} else {
			/*
			 ** Now the rub. The use of physical Age for the year old body above, basically conflicts with the changes
			 ** that NCS introduces, so here to *distinguish* the changes, we use visual age with the 'year old body'
			 ** and appears, for example: Slave release from incubator at age 10, Her summary would show, 'Age 0. 10
			 ** year old body.' But if she's given NCS a few weeks after release, while she's still before her first
			 ** birthday, it'll appear the same. But once her birthday fires, if we ran with the above code it would
			 ** say: 'Age 1. 11 year old body.' -- this conflicts with the way NCS works though, because she hasn't
			 ** visually aged, so our change here makes it say 'Age 1. Appears to have a 10 year old body.'
			 */
			r.textContent += ` Appears to have a ` + `${slave.visualAge}` + ` year old body.`;
		}
		if (slave.geneMods.NCS === 1) {
			makeSpan(r, "NCS", "orange");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_face(slave, c) {
		if (slave.face < -95) {
			makeSpan(c, `Very ugly ${slave.faceShape} face`, "red", true, slave.face);
		} else if (slave.face < -40) {
			makeSpan(c, `Ugly ${slave.faceShape} face`, "red", true, slave.face);
		} else if (slave.face < -10) {
			makeSpan(c, `Unattractive ${slave.faceShape} face`, "red", true, slave.face);
		} else if (slave.face <= 10) {
			makeSpan(c, `Average ${slave.faceShape} face`, null, true, slave.face);
		} else if (slave.face <= 40) {
			makeSpan(c, `Attractive ${slave.faceShape} face`, "pink", true, slave.face);
		} else if (slave.face <= 95) {
			makeSpan(c, `Beautiful ${slave.faceShape} face`, "pink", true, slave.face);
		} else {
			makeSpan(c, `Very beautiful ${slave.faceShape} face`, "pink", true, slave.face);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_eyes(slave, c) {
		if (!canSee(slave)) {
			makeSpan(c, "Blind.", "red");
		} else if (!canSeePerfectly(slave)) {
			makeSpan(c, "Nearsighted.", "yellow");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_ears(slave, c) {
		if (slave.hears <= -2) {
			makeSpan(c, "Deaf.", "red");
		} else if ((slave.hears === -1) && (slave.earwear !== "hearing aids")) {
			makeSpan(c, "Hard of hearing.", "yellow");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_lips(slave, c) {
		if (slave.lips > 95) {
			makeSpan(c, "Facepussy", undefined, true, slave.lips);
		} else if (slave.lips > 70) {
			makeSpan(c, "Huge lips", undefined, true, slave.lips);
		} else if (slave.lips > 40) {
			makeSpan(c, "Big lips", undefined, true, slave.lips);
		} else if (slave.lips > 20) {
			makeSpan(c, "Pretty lips", undefined, true, slave.lips);
		} else if (slave.lips > 10) {
			makeSpan(c, "Normal lips", undefined, true, slave.lips);
		} else {
			makeSpan(c, "Thin lips", "red", true, slave.lips);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_teeth(slave, c) {
		if (slave.teeth === "crooked") {
			makeSpan(c, "Crooked teeth.", "yellow");
		} else if (slave.teeth === "gapped") {
			makeSpan(c, "Tooth gap.", "yellow");
		} else if (slave.teeth === "cosmetic braces") {
			makeSpan(c, "Cosmetic braces.");
		} else if (slave.teeth === "straightening braces") {
			makeSpan(c, "Braces.");
		} else if (slave.teeth === "removable") {
			makeSpan(c, "Removable teeth.");
		} else if (slave.teeth === "pointy") {
			makeSpan(c, "Sharp fangs.");
		} else if (slave.teeth === "baby") {
			makeSpan(c, "Baby teeth.");
		} else if (slave.teeth === "mixed") {
			makeSpan(c, "Mixed teeth.");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_muscles(slave, c) {
		if (slave.muscles > 95) {
			makeSpan(c, "Hugely muscular", undefined, true, slave.muscles);
		} else if (slave.muscles > 50) {
			makeSpan(c, "Muscular", undefined, true, slave.muscles);
		} else if (slave.muscles > 30) {
			makeSpan(c, "Fit", undefined, true, slave.muscles);
		} else if (slave.muscles > 5) {
			makeSpan(c, "Toned", undefined, true, slave.muscles);
		} else if (slave.muscles > -6) {
			makeSpan(c, "Soft", undefined, true, slave.muscles);
		} else if (slave.muscles > -31) {
			if (V.arcologies[0].FSPhysicalIdealist === "unset") {
				makeSpan(c, "Weak", "red", true, slave.muscles);
			} else {
				makeSpan(c, "Weak", undefined, true, slave.muscles);
			}
		} else if (slave.muscles > -96) {
			if (V.arcologies[0].FSPhysicalIdealist === "unset") {
				makeSpan(c, "Very weak", "red", true, slave.muscles);
			} else {
				makeSpan(c, "Very weak", undefined, true, slave.muscles);
			}
		} else {
			makeSpan(c, "Frail", "red", true, slave.muscles);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_voice(slave, c) {
		if (slave.voice === 0) {
			makeSpan(c, "Mute.", "red");
		} else {
			if (slave.accent === 3) {
				makeSpan(c, "Bad accent.", "red");
			} else if (slave.accent === 4) {
				makeSpan(c, "No language skills.", "red");
			} else if (slave.accent === 2) {
				makeSpan(c, "Accent.");
			} else if (slave.accent === 1) {
				makeSpan(c, "Cute accent.", "pink");
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_tits_ass(slave, c) {
		const styles = "pink";
		if ((slave.boobs >= 12000) && (slave.butt > 9)) {
			makeSpan(c, "Hyper T&A.", styles);
		} else if ((slave.boobs > 4000) && (slave.butt > 8)) {
			makeSpan(c, "Enormous T&A.", styles);
		} else if ((slave.boobs > 2000) && (slave.butt > 6)) {
			makeSpan(c, "Huge T&A.", styles);
		} else if ((slave.boobs > 800) && (slave.butt > 4)) {
			makeSpan(c, "Big T&A.", styles);
		} else if ((slave.boobs < 500) && (slave.butt < 3) && (slave.weight <= 10) && (slave.muscles <= 30)) {
			makeSpan(c, "Girlish figure.", styles);
		} else if (slave.boobs >= 12000) {
			makeSpan(c, "Immobilizing tits.", styles);
		} else if (slave.boobs > 4000) {
			makeSpan(c, "Monstrous tits.", styles);
		} else if (slave.boobs > 2000) {
			makeSpan(c, "Huge tits.", styles);
		} else if (slave.boobs > 800) {
			makeSpan(c, "Big tits.", styles);
		} else if (slave.butt > 9) {
			makeSpan(c, "Hyper ass.", styles);
		} else if (slave.butt > 8) {
			makeSpan(c, "Titanic ass.", styles);
		} else if (slave.butt > 6) {
			makeSpan(c, "Huge ass.", styles);
		} else if (slave.butt > 4) {
			makeSpan(c, "Big ass.", styles);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_hips(slave, c) {
		const styles = "red";
		if (slave.hips < -1) {
			if (slave.butt > 2 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
				makeSpan(c, "Disproportionately big butt.", styles);
			}
		} else if (slave.hips < 0) {
			if (slave.butt > 4 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
				makeSpan(c, "Disproportionately big butt.", styles);
			}
		} else if (slave.hips > 2) {
			if (slave.butt <= 8) {
				makeSpan(c, "Disproportionately small butt.", styles);
			}
		} else if (slave.hips > 1) {
			if (slave.butt <= 3 && ((V.arcologies[0].FSSlimnessEnthusiast === "unset") || (slave.boobs >= 500))) {
				makeSpan(c, "Disproportionately small butt.", styles);
			}
		} else if (slave.hips > 0) {
			if (slave.butt > 8) {
				if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
					makeSpan(c, "Disproportionately big butt.", styles);
				}
			} else if (slave.butt <= 2 && ((V.arcologies[0].FSSlimnessEnthusiast === "unset") || (slave.boobs >= 500))) {
				makeSpan(c, "Disproportionately small butt.", styles);
			}
		} else {
			if (slave.butt > 6) {
				if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
					makeSpan(c, "Disproportionately big butt.", styles);
				}
			} else if (slave.butt <= 1 && ((V.arcologies[0].FSSlimnessEnthusiast === "unset") || (slave.boobs >= 500))) {
				makeSpan(c, "Disproportionately small butt.", styles);
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_waist(slave, c) {
		if (slave.waist > 95) {
			makeSpan(c, "Masculine waist", "red", true, slave.waist);
		} else if (slave.waist > 40) {
			makeSpan(c, "Ugly waist", "red", true, slave.waist);
		} else if (slave.waist > 10) {
			makeSpan(c, "Unattractive waist", "red", true, slave.waist);
		} else if (slave.waist >= -10) {
			makeSpan(c, "Average waist", null, true, slave.waist);
		} else if (slave.waist >= -40) {
			makeSpan(c, "Feminine waist", "pink", true, slave.waist);
		} else if (slave.waist >= -95) {
			makeSpan(c, "Hourglass waist", "pink", true, slave.waist);
		} else {
			makeSpan(c, "Absurdly narrow waist", "pink", true, slave.waist);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_implants(slave, c) {
		const styles = "pink";
		if ((slave.boobsImplant !== 0) || (slave.buttImplant !== 0) || (slave.lipsImplant !== 0) || (slave.bellyImplant !== -1)) {
			makeSpan(c, "Implants.", styles);
		} else if ((slave.faceImplant >= 30) || (slave.waist < -95)) {
			makeSpan(c, "Surgery enhanced.", styles);
		} else {
			makeSpan(c, "All natural.", styles);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_lactation(slave, c) {
		if (slave.lactation === 1) {
			makeSpan(c, "Lactating naturally.", "pink");
		} else if (slave.lactation === 2) {
			makeSpan(c, "Heavy lactation.", "pink");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_mods(slave, c) {
		V.modScore = SlaveStatsChecker.modScore(slave);
		if (slave.corsetPiercing === 0 && V.piercingScore < 3 && V.tatScore < 2) {
			return;
		} else if (V.modScore > 15 || (V.piercingScore > 8 && V.tatScore > 5)) {
			makeSpan(c, "Extensive body mods.");
		} else if (V.modScore > 7) {
			makeSpan(c, "Noticeable body mods.");
		} else {
			makeSpan(c, "Light body mods.");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_intelligence(slave, c) {
		const intelligence = slave.intelligence + slave.intelligenceImplant;
		if (slave.fetish === "mindbroken") {
			return;
		}
		let education = "";
		let naturalIntelligence = "";
		let styles = undefined;
		if (slave.intelligenceImplant >= 30) {
			education = "(e+)";
		} else if (slave.intelligenceImplant >= 15) {
			education = "(e)";
		} else if (slave.intelligenceImplant <= -15) {
			education = "(e-)";
		}
		if (intelligence >= 130) {
			naturalIntelligence = "I++++";
			styles = "deepskyblue";
		} else if (intelligence > 95) {
			naturalIntelligence = "I+++";
			styles = "deepskyblue";
		} else if (intelligence > 50) {
			naturalIntelligence = "I++";
			styles = "deepskyblue";
		} else if (intelligence > 15) {
			naturalIntelligence = "I+";
			styles = "deepskyblue";
		} else if (intelligence >= -15) {
			naturalIntelligence = "I";
		} else if (intelligence >= -50) {
			naturalIntelligence = "I-";
			styles = "orangered";
		} else if (intelligence >= -95) {
			naturalIntelligence = "I--";
			styles = "orangered";
		} else {
			naturalIntelligence = "I---";
			styles = "orangered";
		}
		makeSpan(c, `${naturalIntelligence}${education}`, styles, true, intelligence);
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_skills(slave, c) {
		let _SSkills = slave.skill.anal + slave.skill.oral;
		let r = makeSpan(c, "", "aquamarine");
		if (((_SSkills + slave.skill.whoring + slave.skill.entertainment) >= 400) && ((slave.vagina < 0) || (slave.skill.vaginal >= 100))) {
			r.textContent += `MSS`;
		} else {
			_SSkills += slave.skill.vaginal;
			_SSkills = Math.trunc(_SSkills);
			if (_SSkills > 180) {
				r.textContent += `S++`;
			} else if ((_SSkills > 120) && (slave.vagina < 0)) {
				r.textContent += `Sh++`;
			} else if (_SSkills > 90) {
				r.textContent += `S+`;
			} else if (_SSkills > 30) {
				r.textContent += `S`;
			} else {
				r.textContent += `S-`;
			}
			if (V.summaryStats) {
				r.textContent += `[${_SSkills}]`;
			}
			r.textContent += " ";
			if (slave.skill.whoring >= 100) {
				r.textContent += `W+++`;
			} else if (slave.skill.whoring > 60) {
				r.textContent += `W++`;
			} else if (slave.skill.whoring > 30) {
				r.textContent += `W+`;
			} else if (slave.skill.whoring > 10) {
				r.textContent += `W`;
			}
			if (slave.skill.whoring > 10) {
				if (V.summaryStats) {
					r.textContent += `[${slave.skill.whoring}]`;
				}
			}
			r.textContent += " ";
			if (slave.skill.entertainment >= 100) {
				r.textContent += `E+++`;
			} else if (slave.skill.entertainment > 60) {
				r.textContent += `E++`;
			} else if (slave.skill.entertainment > 30) {
				r.textContent += `E+`;
			} else if (slave.skill.entertainment > 10) {
				r.textContent += `E`;
			}
			if (slave.skill.entertainment > 10) {
				if (V.summaryStats) {
					r.textContent += `[${slave.skill.entertainment}]`;
				}
			}
		}
		if (slave.skill.combat > 0) {
			r.textContent += " C";
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_prestige(slave, c) {
		if (slave.prestige > 0) {
			const styles = "green";
			if (slave.prestige > 2) {
				makeSpan(c, "Prest++", styles);
			} else if (slave.prestige === 2) {
				makeSpan(c, "Prest+", styles);
			} else if (slave.prestige === 1) {
				makeSpan(c, "Prest", styles);
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_porn_prestige(slave, c) {
		if (slave.porn.prestige > 0) {
			const styles = "green";
			if (slave.porn.prestige > 2) {
				makeSpan(c, "PPrest++", styles);
			} else if (slave.porn.prestige === 2) {
				makeSpan(c, "PPrest+", styles);
			} else if (slave.porn.prestige === 1) {
				makeSpan(c, "PPrest", styles);
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_intelligence(slave, c) {
		const intelligence = slave.intelligence + slave.intelligenceImplant;
		if (slave.fetish === "mindbroken") {
			return;
		}
		let education = "";
		let naturalIntelligence = "";
		let styles = undefined;
		if (slave.intelligenceImplant >= 30) {
			education = ", well educated";
		} else if (slave.intelligenceImplant >= 15) {
			education = ", educated";
		} else if (slave.intelligenceImplant <= -15) {
			education = ", hindered";
		}
		if (intelligence >= 130) {
			naturalIntelligence = "Genius";
			styles = "deepskyblue";
		} else if (intelligence > 95) {
			naturalIntelligence = "Brilliant";
			styles = "deepskyblue";
		} else if (intelligence > 50) {
			naturalIntelligence = "Very smart";
			styles = "deepskyblue";
		} else if (intelligence > 15) {
			naturalIntelligence = "Smart";
			styles = "deepskyblue";
		} else if (intelligence >= -15) {
			naturalIntelligence = "Average intelligence";
		} else if (intelligence >= -50) {
			naturalIntelligence = "Slow";
			styles = "orangered";
		} else if (intelligence >= -95) {
			naturalIntelligence = "Very slow";
			styles = "orangered";
		} else {
			naturalIntelligence = "Moronic";
			styles = "orangered";
		}
		makeSpan(c, `${naturalIntelligence}${education}`, styles, true, intelligence);
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_skills(slave, c) {
		let _SSkills = (slave.skill.anal + slave.skill.oral);
		if (((_SSkills + slave.skill.whoring + slave.skill.entertainment) >= 400) && ((slave.vagina < 0) || (slave.skill.vaginal >= 100))) {
			makeSpan(c, "Masterful Sex Slave.", "aquamarine");
		} else {
			let desc;
			_SSkills += slave.skill.vaginal;
			if (_SSkills > 180) {
				desc = "Sex master";
			} else if ((_SSkills > 120) && (slave.vagina < 0)) {
				desc = "Masterful shemale";
			} else if (_SSkills > 90) {
				desc = "Sexual expert";
			} else if (_SSkills > 30) {
				desc = "Sexually skilled";
			} else {
				desc = "Sexually unskilled";
			}
			if (desc) {
				makeSpan(c, desc, "aquamarine", true, Math.trunc(_SSkills));
				desc = "";
			}
			if (slave.skill.whoring >= 100) {
				desc = "Masterful whore";
			} else if (slave.skill.whoring >= 60) {
				desc = "Expert whore";
			} else if (slave.skill.whoring >= 30) {
				desc = "Skilled whore";
			} else if (slave.skill.whoring >= 10) {
				desc = "Basic whore";
			}
			if (desc) {
				makeSpan(c, desc, "aquamarine", true, slave.skill.whoring);
				desc = "";
			}
			if (slave.skill.entertainment >= 100) {
				desc = "Masterful entertainer";
			} else if (slave.skill.entertainment >= 60) {
				desc = "Expert entertainer";
			} else if (slave.skill.entertainment >= 30) {
				desc = "Skilled entertainer";
			} else if (slave.skill.entertainment >= 10) {
				desc = "Basic entertainer";
			}
			if (desc) {
				makeSpan(c, desc, "aquamarine", true, slave.skill.entertainment);
				desc = "";
			}
		}
		if (slave.skill.combat > 0) {
			makeSpan(c, "Trained fighter.", "aquamarine");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_prestige(slave, c) {
		if (slave.prestige > 0) {
			const styles = "green";
			if (slave.prestige > 2) {
				makeSpan(c, "Extremely prestigious.", styles);
			} else if (slave.prestige === 2) {
				makeSpan(c, "Very prestigious.", styles);
			} else if (slave.prestige === 1) {
				makeSpan(c, "Prestigious.", styles);
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_porn_prestige(slave, c) {
		if (slave.porn.prestige > 0) {
			const styles = "green";
			if (slave.porn.prestige > 2) {
				makeSpan(c, "Porn star.", styles);
			} else if (slave.porn.prestige === 2) {
				makeSpan(c, "Porn slut.", styles);
			} else if (slave.porn.prestige === 1) {
				makeSpan(c, "Porn amateur.", styles);
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_fetish(slave, c) {
		let descStr = "";
		switch (slave.fetish) {
			case "submissive":
				if (slave.fetishStrength > 95) {
					descStr = `Sub++`;
				} else if (slave.fetishStrength > 60) {
					descStr = `Sub+`;
				} else {
					descStr = `Sub`;
				}
				break;
			case "cumslut":
				if (slave.fetishStrength > 95) {
					descStr = `Oral++`;
				} else if (slave.fetishStrength > 60) {
					descStr = `Oral+`;
				} else {
					descStr = `Oral`;
				}
				break;
			case "humiliation":
				if (slave.fetishStrength > 95) {
					descStr = `Humil++`;
				} else if (slave.fetishStrength > 60) {
					descStr = `Humil+`;
				} else {
					descStr = `Humil`;
				}
				break;
			case "buttslut":
				if (slave.fetishStrength > 95) {
					descStr = `Anal++`;
				} else if (slave.fetishStrength > 60) {
					descStr = `Anal+`;
				} else {
					descStr = `Anal`;
				}
				break;
			case "boobs":
				if (slave.fetishStrength > 95) {
					descStr = `Boobs++`;
				} else if (slave.fetishStrength > 60) {
					descStr = `Boobs+`;
				} else {
					descStr = `Boobs`;
				}
				break;
			case "sadist":
				if (slave.fetishStrength > 95) {
					descStr = `Sadist++`;
				} else if (slave.fetishStrength > 60) {
					descStr = `Sadist+`;
				} else {
					descStr = `Sadist`;
				}
				break;
			case "masochist":
				if (slave.fetishStrength > 95) {
					descStr = `Pain++`;
				} else if (slave.fetishStrength > 60) {
					descStr = `Pain+`;
				} else {
					descStr = `Pain`;
				}
				break;
			case "dom":
				if (slave.fetishStrength > 95) {
					descStr = `Dom++`;
				} else if (slave.fetishStrength > 60) {
					descStr = `Dom+`;
				} else {
					descStr = `Dom`;
				}
				break;
			case "pregnancy":
				if (slave.fetishStrength > 95) {
					descStr = `Preg++`;
				} else if (slave.fetishStrength > 60) {
					descStr = `Preg+`;
				} else {
					descStr = `Preg`;
				}
				break;
			default:
				descStr = `Vanilla`;
				break;
		}
		if (V.summaryStats) {
			descStr += `[${slave.fetishStrength}]`;
		}
		makeSpan(c, descStr, "lightcoral");
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_attraction(slave, c) {
		if (slave.attrXY <= 5) {
			makeSpan(c, "XY---", "red", false, slave.attrXY);
		} else if (slave.attrXY <= 15) {
			makeSpan(c, "XY--", "red", false, slave.attrXY);
		} else if (slave.attrXY <= 35) {
			makeSpan(c, "XY---", "red", false, slave.attrXY);
		} else if (slave.attrXY <= 65) {
			makeSpan(c, "XY", undefined, false, slave.attrXY);
		} else if (slave.attrXY <= 85) {
			makeSpan(c, "XY+", "green", false, slave.attrXY);
		} else if (slave.attrXY <= 95) {
			makeSpan(c, "XY++", "green", false, slave.attrXY);
		} else if (slave.attrXX > 95) {
			if (slave.energy <= 95) {
				makeSpan(c, "Omni!", "green");
			} else {
				makeSpan(c, "Omni+Nympho!!", "green");
			}
		} else {
			makeSpan(c, "XY+++", "green", false, slave.attrXY);
		}
		if (slave.attrXX <= 5) {
			makeSpan(c, "XX---", "red", false, slave.attrXX);
		} else if (slave.attrXX <= 15) {
			makeSpan(c, "XX--", "red", false, slave.attrXX);
		} else if (slave.attrXX <= 35) {
			makeSpan(c, "XX-", "red", false, slave.attrXX);
		} else if (slave.attrXX <= 65) {
			makeSpan(c, "XX", undefined, false, slave.attrXX);
		} else if (slave.attrXX <= 85) {
			makeSpan(c, "XX+", "green", false, slave.attrXX);
		} else if (slave.attrXX <= 95) {
			makeSpan(c, "XX++", "green", false, slave.attrXX);
		} else if (slave.attrXY <= 95) {
			makeSpan(c, "XX+++", "green", false, slave.attrXX);
		}
		if (slave.energy > 95) {
			if ((slave.attrXY <= 95) || (slave.attrXX <= 95)) {
				makeSpan(c, "Nympho!", "green");
			}
		} else if (slave.energy > 80) {
			makeSpan(c, "SD++", "green", false, slave.energy);
		} else if (slave.energy > 60) {
			makeSpan(c, "SD+", "green", false, slave.energy);
		} else if (slave.energy > 40) {
			makeSpan(c, "SD", "green", false, slave.energy);
		} else if (slave.energy > 20) {
			makeSpan(c, "SD-", "red", false, slave.energy);
		} else {
			makeSpan(c, "SD--", "red", false, slave.energy);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_smart_fetish(slave, c) {
		function settingStr() {
			if (slave.fetishKnown === 1) {
				if (slave.clitSetting === "off") {
					return `SP-`;
				} else if (((slave.fetish !== "submissive") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "submissive")) {
					return `SP:sub`;
				} else if (((slave.fetish !== "cumslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "oral")) {
					return `SP:oral`;
				} else if (((slave.fetish !== "humiliation") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "humiliation")) {
					return `SP:humil`;
				} else if (((slave.fetish !== "buttslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "anal")) {
					return `SP:anal`;
				} else if (((slave.fetish !== "boobs") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "boobs")) {
					return `SP:boobs`;
				} else if (((slave.fetish !== "sadist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "sadist")) {
					return `SP:sade`;
				} else if (((slave.fetish !== "masochist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "masochist")) {
					return `SP:pain`;
				} else if (((slave.fetish !== "dom") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "dom")) {
					return `SP:dom`;
				} else if (((slave.fetish !== "pregnancy") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "pregnancy")) {
					return `SP:preg`;
				} else if (((slave.fetish !== "none") && (slave.clitSetting === "vanilla"))) {
					return `SP:vanilla`;
				} else if ((slave.energy <= 95) && (slave.clitSetting === "all")) {
					return `SP:all`;
				} else if ((slave.energy > 5) && (slave.clitSetting === "none")) {
					return `SP:none`;
				} else if (!["anti-men", "anti-women", "men", "women"].includes(slave.clitSetting)) {
					return `SP:monitoring`;
				}
			} else {
				switch (slave.clitSetting) {
					case "off":
						return `SP-`;
					case "submissive":
						return `SP:sub`;
					case "lesbian":
						return `SP:les`;
					case "oral":
						return `SP:oral`;
					case "humiliation":
						return `SP:humil`;
					case "anal":
						return `SP:anal`;
					case "boobs":
						return `SP:boobs`;
					case "sadist":
						return `SP:sade`;
					case "masochist":
						return `SP:pain`;
					case "dom":
						return `SP:dom`;
					case "pregnancy":
						return `SP:pregnancy`;
					case "vanilla":
						return `SP:vanilla`;
					case "all":
						return `SP:all`;
					case "none":
						return `SP:none`;
				}
			}
			return null;
		}
		const s = settingStr();
		if (s) {
			makeSpan(c, settingStr());
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_smart_attraction(slave, c) {
		function settingStr() {
			if (slave.attrKnown === 1) {
				if (slave.clitSetting === "women") {
					if (slave.attrXX < 95) {
						return `SP:women`;
					} else {
						return `SP:monitoring`;
					}
				} else if (slave.clitSetting === "men") {
					if (slave.attrXY < 95) {
						return `SP:men`;
					} else {
						return `SP:monitoring`;
					}
				} else if (slave.clitSetting === "anti-women") {
					if (slave.attrXX > 0) {
						return `SP:anti-women`;
					} else {
						return `SP:monitoring`;
					}
				} else if (slave.clitSetting === "anti-men") {
					if (slave.attrXY > 0) {
						return `SP:anti-men`;
					} else {
						return `SP:monitoring`;
					}
				}
			} else {
				if (slave.clitSetting === "women") {
					return `SP:women`;
				} else if (slave.clitSetting === "men") {
					return `SP:men`;
				} else if (slave.clitSetting === "anti-women") {
					return `SP:anti-women`;
				} else if (slave.clitSetting === "anti-men") {
					return `SP:anti-men`;
				}
			}
			return null;
		}
		const s = settingStr();
		if (s) {
			makeSpan(c, settingStr());
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_behavior_flaw(slave, c) {
		function descStr() {
			switch (slave.behavioralFlaw) {
				case "arrogant":
					return `Arrog`;
				case "bitchy":
					return `Bitchy`;
				case "odd":
					return `Odd`;
				case "hates men":
					return `Men-`;
				case "hates women":
					return `Women-`;
				case "gluttonous":
					return `Glut`;
				case "anorexic":
					return `Ano`;
				case "devout":
					return `Dev`;
				case "liberated":
					return `Lib`;
				default:
					slave.behavioralFlaw = "none";
					return null;
			}
		}
		const s = descStr();
		if (s) {
			makeSpan(c, descStr(), "red");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_sex_flaw(slave, c) {
		switch (slave.sexualFlaw) {
			case "hates oral":
				makeSpan(c, "Oral-", "red");
				break;
			case "hates anal":
				makeSpan(c, "Anal-", "red");
				break;
			case "hates penetration":
				makeSpan(c, "Fuck-", "red");
				break;
			case "shamefast":
				makeSpan(c, "Shame", "red");
				break;
			case "idealistic":
				makeSpan(c, "Ideal", "red");
				break;
			case "repressed":
				makeSpan(c, "Repre", "red");
				break;
			case "apathetic":
				makeSpan(c, "Apath", "red");
				break;
			case "crude":
				makeSpan(c, "Crude", "red");
				break;
			case "judgemental":
				makeSpan(c, "Judge", "red");
				break;
			case "cum addict":
				makeSpan(c, "CumAdd", "yellow");
				break;
			case "anal addict":
				makeSpan(c, "AnalAdd", "yellow");
				break;
			case "attention whore":
				makeSpan(c, "Attention", "yellow");
				break;
			case "breast growth":
				makeSpan(c, "BoobObsess", "yellow");
				break;
			case "abusive":
				makeSpan(c, "Abusive", "yellow");
				break;
			case "malicious":
				makeSpan(c, "Malice", "yellow");
				break;
			case "self hating":
				makeSpan(c, "SelfHatr", "yellow");
				break;
			case "neglectful":
				makeSpan(c, "SelfNeglect", "yellow");
				break;
			case "breeder":
				makeSpan(c, "BreedObsess", "yellow");
				break;
			default:
				slave.sexualFlaw = "none";
				break;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_behavior_quirk(slave, c) {
		function descStr() {
			switch (slave.behavioralQuirk) {
				case "confident":
					return `Confid`;
				case "cutting":
					return `Cutting`;
				case "funny":
					return `Funny`;
				case "fitness":
					return `Fit`;
				case "adores women":
					return `Women+`;
				case "adores men":
					return `Men+`;
				case "insecure":
					return `Insec`;
				case "sinful":
					return `Sinf`;
				case "advocate":
					return `Advoc`;
				default:
					slave.behavioralQuirk = "none";
					return null;
			}
		}
		const s = descStr();
		if (s) {
			makeSpan(c, s, "green");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_sex_quirk(slave, c) {
		function descStr() {
			switch (slave.sexualQuirk) {
				case "gagfuck queen":
					return `Gagfuck`;
				case "painal queen":
					return `Painal`;
				case "strugglefuck queen":
					return `Struggle`;
				case "tease":
					return `Tease`;
				case "romantic":
					return `Romantic`;
				case "perverted":
					return `Perverted`;
				case "caring":
					return `Caring`;
				case "unflinching":
					return `Unflinch`;
				case "size queen":
					return `SizeQ`;
				default:
					slave.sexualQuirk = "none";
					return null;
			}
		}
		const s = descStr();
		if (s) {
			makeSpan(c, s, "green");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_fetish(slave, c) {
		function fetishStr() {
			switch (slave.fetish) {
				case "submissive":
					if (slave.fetishStrength > 95) {
						return "Complete submissive";
					} else if (slave.fetishStrength > 60) {
						return "Submissive";
					} else {
						return "Submissive tendencies";
					}
				case "cumslut":
					if (slave.fetishStrength > 95) {
						return "Cumslut";
					} else if (slave.fetishStrength > 60) {
						return "Oral fixation";
					} else {
						return "Prefers oral";
					}
				case "humiliation":
					if (slave.fetishStrength > 95) {
						return "Humiliation slut";
					} else if (slave.fetishStrength > 60) {
						return "Exhibitionist";
					} else {
						return "Interest in humiliation";
					}
				case "buttslut":
					if (slave.fetishStrength > 95) {
						return "Buttslut";
					} else if (slave.fetishStrength > 60) {
						return "Anal fixation";
					} else {
						return "Prefers anal";
					}
				case "boobs":
					if (slave.fetishStrength > 95) {
						return "Boobslut";
					} else if (slave.fetishStrength > 60) {
						return "Breast fixation";
					} else {
						return "Loves boobs";
					}
				case "sadist":
					if (slave.fetishStrength > 95) {
						return "Complete sadist";
					} else if (slave.fetishStrength > 60) {
						return "Sadist";
					} else {
						return "Sadistic tendencies";
					}
				case "masochist":
					if (slave.fetishStrength > 95) {
						return "Complete masochist";
					} else if (slave.fetishStrength > 60) {
						return "Masochist";
					} else {
						return "Masochistic tendencies";
					}
				case "dom":
					if (slave.fetishStrength > 95) {
						return "Complete dom";
					} else if (slave.fetishStrength > 60) {
						return "Dominant";
					} else {
						return "Dominant tendencies";
					}
				case "pregnancy":
					if (slave.fetishStrength > 95) {
						return "Pregnancy fetish";
					} else if (slave.fetishStrength > 60) {
						return "Pregnancy kink";
					} else {
						return "Interest in impregnation";
					}
				default:
					return "Sexually vanilla";
			}
		}
		makeSpan(c, fetishStr(), "lightcoral", true, slave.fetishStrength);
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_attraction(slave, c) {
		if (slave.attrXY <= 5) {
			makeSpan(c, "Disgusted by men", "red", true, slave.attrXY);
		} else if (slave.attrXY <= 15) {
			makeSpan(c, "Turned off by men", "red", true, slave.attrXY);
		} else if (slave.attrXY <= 35) {
			makeSpan(c, "Not attracted to men", "red", true, slave.attrXY);
		} else if (slave.attrXY <= 65) {
			makeSpan(c, "Indifferent to men", undefined, true, slave.attrXY);
		} else if (slave.attrXY <= 85) {
			makeSpan(c, "Attracted to men", "green", true, slave.attrXY);
		} else if (slave.attrXY <= 95) {
			makeSpan(c, "Aroused by men", "green", true, slave.attrXY);
		} else if (slave.attrXX > 95) {
			if (slave.energy <= 95) {
				makeSpan(c, "Omnisexual!", "green");
			} else {
				makeSpan(c, "Omnisexual nymphomaniac!", "green");
			}
		} else {
			makeSpan(c, "Passionate about men", "green", true, slave.attrXY);
		}
		if (slave.attrXX <= 5) {
			makeSpan(c, "disgusted by women", "red", true, slave.attrXX);
		} else if (slave.attrXX <= 15) {
			makeSpan(c, "turned off by women", "red", true, slave.attrXX);
		} else if (slave.attrXX <= 35) {
			makeSpan(c, "not attracted to women", "red", true, slave.attrXX);
		} else if (slave.attrXX <= 65) {
			makeSpan(c, "indifferent to women", undefined, true, slave.attrXX);
		} else if (slave.attrXX <= 85) {
			makeSpan(c, "attracted to women", "green", true, slave.attrXX);
		} else if (slave.attrXX <= 95) {
			makeSpan(c, "aroused by women", "green", true, slave.attrXX);
		} else if (slave.attrXY <= 95) {
			makeSpan(c, "passionate about women", "green", true, slave.attrXX);
		}
		if (slave.energy > 95) {
			if ((slave.attrXY <= 95) || (slave.attrXX <= 95)) {
				makeSpan(c, "Nymphomaniac!", "green");
			}
		} else if (slave.energy > 80) {
			makeSpan(c, "Powerful sex drive", "green", true, slave.energy);
		} else if (slave.energy > 60) {
			makeSpan(c, "Good sex drive", "green", true, slave.energy);
		} else if (slave.energy > 40) {
			makeSpan(c, "Average sex drive", "yellow", true, slave.energy);
		} else if (slave.energy > 20) {
			makeSpan(c, "Poor sex drive", "red", true, slave.energy);
		} else {
			makeSpan(c, "No sex drive", "red", true, slave.energy);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_smart_fetish(slave, c) {
		function descStr() {
			if (slave.fetishKnown === 1) {
				if (slave.clitSetting === "off") {
					return `SP off.`;
				} else if (((slave.fetish !== "submissive") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "submissive")) {
					return `SP: submissive.`;
				} else if (((slave.fetish !== "cumslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "oral")) {
					return `SP: oral.`;
				} else if (((slave.fetish !== "humiliation") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "humiliation")) {
					return `SP: humiliation.`;
				} else if (((slave.fetish !== "buttslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "anal")) {
					return `SP: anal.`;
				} else if (((slave.fetish !== "boobs") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "boobs")) {
					return `SP: breasts.`;
				} else if (((slave.fetish !== "sadist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "sadist")) {
					return `SP: sadism.`;
				} else if (((slave.fetish !== "masochist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "masochist")) {
					return `SP: masochism.`;
				} else if (((slave.fetish !== "dom") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "dom")) {
					return `SP: dominance.`;
				} else if (((slave.fetish !== "pregnancy") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "pregnancy")) {
					return `SP: pregnancy.`;
				} else if ((slave.fetish !== "none") && (slave.clitSetting === "vanilla")) {
					return `SP: vanilla.`;
				} else if ((slave.energy <= 95) && (slave.clitSetting === "all")) {
					return `SP: all.`;
				} else if ((slave.energy > 5) && (slave.clitSetting === "none")) {
					return `SP: none.`;
				} else if (!["anti-men", "anti-women", "men", "women"].includes(slave.clitSetting)) {
					return `SP: monitoring.`;
				}
			} else {
				switch (slave.clitSetting) {
					case "off":
						return `SP off.`;
					case "submissive":
						return `SP: submissive.`;
					case "oral":
						return `SP: oral.`;
					case "humiliation":
						return `SP: humiliation.`;
					case "anal":
						return `SP: anal.`;
					case "boobs":
						return `SP: breasts.`;
					case "sadist":
						return `SP: sadism.`;
					case "masochist":
						return `SP: masochism.`;
					case "dom":
						return `SP: dominance.`;
					case "pregnancy":
						return `SP: pregnancy.`;
					case "vanilla":
						return `SP: vanilla.`;
					case "all":
						return `SP: all.`;
					case "none":
						return `SP: none.`;
				}
			}
			return null;
		}
		const s = descStr();
		if (s) {
			makeSpan(c, s);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_smart_attraction(slave, c) {
		if (slave.attrKnown === 1) {
			if ((slave.attrXX < 100) && (slave.clitSetting === "women")) {
				makeSpan(c, `SP: women.`);
			} else if ((slave.attrXY < 100) && (slave.clitSetting === "men")) {
				makeSpan(c, `SP: men.`);
			}
		} else {
			if (slave.clitSetting === "women") {
				makeSpan(c, `SP: women.`);
			} else if (slave.clitSetting === "men") {
				makeSpan(c, `SP: men.`);
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_behavior_flaw(slave, c) {
		function descStr() {
			switch (slave.behavioralFlaw) {
				case "arrogant":
					return `Arrogant.`;
				case "bitchy":
					return `Bitchy.`;
				case "odd":
					return `Odd.`;
				case "hates men":
					return `Hates men.`;
				case "hates women":
					return `Hates women.`;
				case "gluttonous":
					return `Stress eater.`;
				case "anorexic":
					return `Anorexic.`;
				case "devout":
					return `Devoutly religious.`;
				case "liberated":
					return `Mentally liberated.`;
				default:
					slave.behavioralFlaw = "none";
					return null;
			}
		}
		const s = descStr();
		if (s) {
			makeSpan(c, s, "red");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_sex_flaw(slave, c) {
		switch (slave.sexualFlaw) {
			case "hates oral":
			case "hates anal":
			case "hates penetration":
			case "shamefast":
				makeSpan(c, slave.sexualFlaw, "red", true);
				break;
			case "idealistic":
			case "repressed":
			case "apathetic":
			case "crude":
			case "judgemental":
				makeSpan(c, `Sexually ${slave.sexualFlaw}.`, "red");
				break;
			case "cum addict":
			case "anal addict":
			case "attention whore":
				makeSpan(c, slave.sexualFlaw, "yellow", true);
				break;
			case "breast growth":
				makeSpan(c, `Breast obsession.`, "yellow");
				break;
			case "abusive":
			case "malicious":
				makeSpan(c, `Sexually ${slave.sexualFlaw}.`, "yellow");
				break;
			case "self hating":
				makeSpan(c, `Self hatred.`, "yellow");
				break;
			case "neglectful":
				makeSpan(c, `Self neglectful.`, "yellow");
				break;
			case "breeder":
				makeSpan(c, `Breeding obsession.`, "yellow");
				break;
			default:
				slave.sexualFlaw = "none";
				break;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_behavior_quirk(slave, c) {
		switch (slave.behavioralQuirk) {
			case "confident":
			case "cutting":
			case "funny":
			case "fitness":
			case "adores women":
			case "adores men":
			case "insecure":
			case "sinful":
			case "advocate":
				makeSpan(c, slave.behavioralQuirk, "green", true);
				break;
			default:
				slave.behavioralQuirk = "none";
				break;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_sex_quirk(slave, c) {
		switch (slave.sexualQuirk) {
			case "gagfuck queen":
			case "painal queen":
			case "strugglefuck queen":
			case "tease":
			case "romantic":
			case "perverted":
			case "caring":
			case "unflinching":
			case "size queen":
				makeSpan(c, slave.sexualQuirk, "green", true);
				break;
			default:
				slave.sexualQuirk = "none";
				break;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @returns {string}
	 */
	function short_extended_family(slave) {
		let res = "";
		let handled = 0;
		if (slave.mother > 0) {
			const _ssj = V.slaves.findIndex(s => s.ID === slave.mother);
			if (_ssj !== -1) {
				res += `${SlaveFullName(V.slaves[_ssj])}'s ${getPronouns(slave).daughter}`;
				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
					const friendShipShort = relationshipTermShort(slave);
					res += ` & ${friendShipShort}`;
					handled = 1;
				}
			}
			res += " ";
		} else if (slave.mother === -1) {
			res += `Your ${getPronouns(slave).daughter}`;
			if (slave.relationship === -3) {
				res += ` & ${getPronouns(slave).wife}`;
				handled = 1;
			} else if (slave.relationship === -2) {
				res += ` & lover`;
				handled = 1;
			}
			res += " ";
		} else if (slave.mother in V.missingTable && V.showMissingSlavesSD && V.showMissingSlaves) {
			res += `${V.missingTable[slave.mother].fullName}'s ${getPronouns(slave).daughter} `;
		}
		if (slave.father > 0 && slave.father !== slave.mother) {
			const _ssj = V.slaves.findIndex(s => s.ID === slave.father);
			if (_ssj !== -1) {
				res += `${SlaveFullName(V.slaves[_ssj])}'s ${getPronouns(slave).daughter}`;
				if (slave.relationshipTarget === V.slaves[_ssj].ID && handled !== 1) {
					const friendShipShort = relationshipTermShort(slave);
					res += ` & ${friendShipShort}`;
					handled = 1;
				}
			}
			res += " ";
		} else if (slave.father === -1 && slave.mother !== -1) {
			res += `Your ${getPronouns(slave).daughter}`;
			if (slave.relationship === -3) {
				res += ` & ${getPronouns(slave).wife}`;
				handled = 1;
			} else if (slave.relationship === -2) {
				res += ` & lover`;
				handled = 1;
			}
			res += " ";
		} else if (slave.father in V.missingTable && slave.father !== slave.mother && V.showMissingSlavesSD && V.showMissingSlaves) {
			res += `${V.missingTable[slave.father].fullName}'s ${getPronouns(slave).daughter}`;
		}
		if (slave.daughters === 1) {
			let _ssj = V.slaves.findIndex(s => s.mother === slave.ID);
			if (_ssj !== -1) {
				res += `${SlaveFullName(V.slaves[_ssj])}'s mother`;
				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
					const friendShipShort = relationshipTermShort(slave);
					res += ` & ${friendShipShort}`;
					handled = 1;
				}
			}
			res += " ";
			_ssj = V.slaves.findIndex(s => s.father === slave.ID);
			if (_ssj !== -1) {
				res += `${SlaveFullName(V.slaves[_ssj])}'s father`;
				if (slave.relationshipTarget === V.slaves[_ssj].ID && handled !== 1) {
					const friendShipShort = relationshipTermShort(slave);
					res += ` & ${friendShipShort}`;
					handled = 1;
				}
			}
			res += " ";
		} else if (slave.daughters > 1) {
			res += `multiple daughters `;
		}
		if (slave.sisters === 1) {
			const _ssj = V.slaves.findIndex(s => areSisters(s, slave) > 0);
			if (_ssj !== -1) {
				res += `${SlaveFullName(V.slaves[_ssj])}'s ${getPronouns(slave).sister}`;
				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
					const friendShipShort = relationshipTermShort(slave);
					res += `& ${friendShipShort}`;
					handled = 1;
				}
			}
			res += " ";
		} else if (slave.sisters > 1) {
			res += `multiple sisters `;
		}
		if (slave.relationship > 0 && handled !== 1) {
			const _ssj = V.slaves.findIndex(s => s.ID === slave.relationshipTarget);
			if (_ssj !== -1) {
				res += `${SlaveFullName(V.slaves[_ssj])}'s`;
				const friendShipShort = relationshipTermShort(slave);
				res += ` ${friendShipShort}`;
			}
		} else if (slave.relationship === -3 && slave.mother !== -1 && slave.father !== -1) {
			res += `Your ${getPronouns(slave).wife}`;
		} else if (slave.relationship === -2) {
			res += `E Bonded`;
		} else if (slave.relationship === -1) {
			res += `E Slut`;
		}
		return res;
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @returns {string}
	 */
	function short_legacy_family(slave) {
		let res = "";
		if (slave.relation !== 0) {
			const _ssj = V.slaves.findIndex(s => s.ID === slave.relationTarget);
			if (_ssj !== -1) {
				res += `${SlaveFullName(V.slaves[_ssj])}'s ${slave.relation}`;
			}
		}
		if (slave.relationship > 0) {
			const _ssj = V.slaves.findIndex(s => s.ID === slave.relationshipTarget);
			if (_ssj !== -1) {
				const friendship = relationshipTerm(slave);
				if (slave.relationshipTarget !== slave.relationTarget) {
					res += `${SlaveFullName(V.slaves[_ssj])}'s`;
				} else {
					res += ` &`;
				}
				res += ` ${friendship}`;
			}
		} else if (slave.relationship === -3) {
			res += `Your ${getPronouns(slave).wife}`;
		} else if (slave.relationship === -2) {
			res += `E Bonded`;
		} else if (slave.relationship === -1) {
			res += `E Slut`;
		}
		return res;
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_clone(slave, c) {
		if (slave.clone !== 0) {
			makeSpan(c, "Clone");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function short_rival(slave, c) {
		if (slave.rivalry !== 0) {
			const block = makeBlock(c, "lightsalmon");
			const _ssj = V.slaves.findIndex(s => s.ID === slave.rivalryTarget);
			if (_ssj !== -1) {
				if (slave.rivalry <= 1) {
					block.textContent = `Disl ${SlaveFullName(V.slaves[_ssj])}`;
				} else if (slave.rivalry <= 2) {
					block.textContent = `${SlaveFullName(V.slaves[_ssj])}'s rival`;
				} else {
					block.textContent = `Hates ${SlaveFullName(V.slaves[_ssj])}`;
				}
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_extended_family(slave, c) {
		let handled = 0;
		const block = makeBlock();
		if (slave.mother > 0) {
			const _ssj = V.slaves.findIndex(s => s.ID === slave.mother);
			if (_ssj !== -1) {
				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
				const tmpSpan = makeSpan(block, getPronouns(slave).daughter, "lightgreen");
				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
					const friendShipShort = relationshipTerm(slave);
					tmpSpan.textContent += ` and ${friendShipShort}`;
					handled = 1;
				}
				tmpSpan.textContent += '.';
			}
		} else if (slave.mother === -1) {
			addText(block, `Your `);
			if (slave.relationship === -3) {
				makeSpan(block, `${getPronouns(slave).daughter} and ${getPronouns(slave).wife}.`, "lightgreen");
				handled = 1;
			} else if (slave.relationship === -2) {
				makeSpan(block, `${getPronouns(slave).daughter} and lover.`, "lightgreen");
				handled = 1;
			} else {
				makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
			}
		} else if (slave.mother in V.missingTable && V.showMissingSlavesSD && V.showMissingSlaves) {
			addText(block, `${V.missingTable[slave.mother].fullName}'s `);
			makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
		}
		if (slave.father > 0 && slave.father !== slave.mother) {
			const _ssj = V.slaves.findIndex(s => s.ID === slave.father);
			if (_ssj !== -1) {
				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
				const tmpSpan = makeSpan(block, getPronouns(slave).daughter, "lightgreen");
				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
					const friendShipShort = relationshipTerm(slave);
					tmpSpan.textContent += ` and ${friendShipShort}`;
					handled = 1;
				}
				tmpSpan.textContent += '.';
			}
		} else if (slave.father === -1 && slave.father !== slave.mother) {
			addText(block, `Your `);
			if (slave.relationship === -3) {
				makeSpan(block, `${getPronouns(slave).daughter} and ${getPronouns(slave).wife}.`, "lightgreen");
				handled = 1;
			} else if (slave.relationship === -2) {
				makeSpan(block, `${getPronouns(slave).daughter} and lover.`, "lightgreen");
				handled = 1;
			} else {
				makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
			}
		} else if (slave.father in V.missingTable && slave.father !== slave.mother && V.showMissingSlavesSD && V.showMissingSlaves) {
			addText(block, `${V.missingTable[slave.father].fullName}'s `);
			makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
		}
		if (areSisters(V.PC, slave) > 0) {
			addText(block, `Your `);
			if (slave.relationship === -3) {
				makeSpan(block, `${relativeTerm(V.PC, slave)} and ${getPronouns(slave).wife}.`, "lightgreen");
				handled = 1;
			} else if (slave.relationship === -2) {
				makeSpan(block, `${relativeTerm(V.PC, slave)} and lover.`, "lightgreen");
				handled = 1;
			} else {
				makeSpan(block, `${relativeTerm(V.PC, slave)}.`, "lightgreen");
			}
		}
		if (slave.daughters === 1) {
			let _ssj = V.slaves.findIndex(s => s.mother === slave.ID);
			if (_ssj !== -1) {
				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
				const tmpSpan = makeSpan(block, "mother", "lightgreen");
				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
					const friendShipShort = relationshipTerm(slave);
					tmpSpan.textContent += ` and ${friendShipShort}`;
					handled = 1;
				}
				tmpSpan.textContent += '.';
			}
			_ssj = V.slaves.findIndex(s => s.father === slave.ID);
			if (_ssj !== -1) {
				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
				const tmpSpan = makeSpan(block, "father", "lightgreen");
				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
					const friendShipShort = relationshipTerm(slave);
					tmpSpan.textContent += ` and ${friendShipShort}`;
					handled = 1;
				}
				tmpSpan.textContent += '.';
			}
		} else if (slave.daughters > 1) {
			if (slave.daughters > 10) {
				makeSpan(block, "Has tons of daughters.", "lightgreen");
			} else if (slave.daughters > 5) {
				makeSpan(block, "Has many daughters.", "lightgreen");
			} else {
				makeSpan(block, "Has several daughters.", "lightgreen");
			}
		}
		if (slave.sisters === 1) {
			const _ssj = V.slaves.findIndex(s => areSisters(s, slave) > 0);
			if (_ssj !== -1) {
				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
				const tmpSpan = makeSpan(block, getPronouns(slave).sister, "lightgreen");
				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
					const friendShipShort = relationshipTerm(slave);
					tmpSpan.textContent += ` and ${friendShipShort}`;
					handled = 1;
				}
				tmpSpan.textContent += '.';
			}
		} else if (slave.sisters > 1) {
			if (slave.sisters > 10) {
				makeSpan(block, "One of many sisters.", "lightgreen");
			} else if (slave.sisters > 5) {
				makeSpan(block, "Has many sisters.", "lightgreen");
			} else {
				makeSpan(block, "Has several sisters.", "lightgreen");
			}
		}
		if (slave.relationship > 0 && handled !== 1) {
			const _ssj = V.slaves.findIndex(s => s.ID === slave.relationshipTarget);
			if (_ssj !== -1) {
				const friendship = relationshipTerm(slave);
				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
				makeSpan(block, `${friendship}.`, "lightgreen");
			}
		} else if (slave.relationship === -3 && slave.mother !== -1 && slave.father !== -1 && areSisters(V.PC, slave) === 0) {
			makeSpan(block, `Your ${getPronouns(slave).wife}.`, "lightgreen");
		} else if (slave.relationship === -2) {
			makeSpan(block, "Emotionally bonded to you.", "lightgreen");
		} else if (slave.relationship === -1) {
			makeSpan(block, "Emotional slut.", "lightgreen");
		}

		if (block.textContent.length > 0) {
			c.appendChild(block);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_legacy_family(slave, c) {
		const block = makeBlock();
		if (slave.relation !== 0) {
			const _ssj = V.slaves.findIndex(s => s.ID === slave.relationTarget);
			if (_ssj !== -1) {
				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
				if (slave.relationshipTarget !== slave.relationTarget) {
					makeSpan(block, `${slave.relation}.`, "lightgreen");
				} else {
					makeSpan(block, `${slave.relation}`, "lightgreen");
				}
			}
		}
		if (slave.relationship > 0) {
			const _ssj = V.slaves.findIndex(s => s.ID === slave.relationshipTarget);
			if (_ssj !== -1) {
				const friendship = relationshipTerm(slave);
				if (slave.relationshipTarget !== slave.relationTarget) {
					addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
				} else {
					addText(block, `and `);
				}
				makeSpan(block, `${friendship}.`, "lightgreen");
			}
		} else if (slave.relationship === -3) {
			makeSpan(block, `Your ${getPronouns(slave).wife}.`, "lightgreen");
		} else if (slave.relationship === -2) {
			makeSpan(block, "Emotionally bonded to you.", "lightgreen");
		} else if (slave.relationship === -1) {
			makeSpan(block, "Emotional slut.", "lightgreen");
		}

		if (block.textContent.length > 0) {
			c.appendChild(block);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_clone(slave, c) {
		if (slave.clone !== 0) {
			makeSpan(c, `Clone of ${slave.clone}.`, "skyblue");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_rival(slave, c) {
		if (slave.rivalry !== 0) {
			const block = makeBlock(c);
			const _ssj = V.slaves.findIndex(s => s.ID === slave.rivalryTarget);
			if (_ssj !== -1) {
				if (slave.rivalry <= 1) {
					makeSpan(block, "Dislikes", "lightsalmon");
					block.appendChild(document.createTextNode(` ${SlaveFullName(V.slaves[_ssj])}.`));
				} else if (slave.rivalry <= 2) {
					block.appendChild(document.createTextNode(`${SlaveFullName(V.slaves[_ssj])}'s `));
					makeSpan(block, "rival.", "lightsalmon");
				} else {
					makeSpan(block, "Hates", "lightsalmon");
					block.appendChild(document.createTextNode(` ${SlaveFullName(V.slaves[_ssj])}.`));
				}
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_clothes(slave, c) {
		function descStr() {
			switch (slave.clothes) {
				case "attractive lingerie":
					return `Nice lingerie.`;
				case "a succubus outfit":
					return `Succubus outfit.`;
				case "a string bikini":
					return `String bikini.`;
				case "a scalemail bikini":
					return `Scalemail bikini.`;
				case "striped panties":
					return `Striped panties.`;
				case "a monokini":
					return `Monokini.`;
				case "an apron":
					return `Apron.`;
				case "a cybersuit":
					return `Cybersuit.`;
				case "cutoffs and a t-shirt":
					return `Cutoffs, t-shirt.`;
				case "a slutty outfit":
					return `Slutty outfit.`;
				case "uncomfortable straps":
					return `Leather straps.`;
				case "a fallen nuns habit":
					return `Slutty habit.`;
				case "a chattel habit":
					return `Chattel habit.`;
				case "a penitent nuns habit":
					return `Cilice.`;
				case "slutty jewelry":
					return `Bangles.`;
				case "attractive lingerie for a pregnant woman":
					return `Preggo lingerie.`;
				case "a maternity dress":
					return `Maternity dress.`;
				case "stretch pants and a crop-top":
					return `Stretch pants, crop-top.`;
				case "harem gauze":
					return `Harem outfit.`;
				case "a slave gown":
					return `Slave gown.`;
				case "a halter top dress":
					return `Halter top dress.`;
				case "a mini dress":
					return `Mini dress.`;
				case "a ball gown":
					return `Ball gown.`;
				case "slutty business attire":
					return `Slutty suit.`;
				case "nice business attire":
					return `Nice suit.`;
				case "a comfortable bodysuit":
					return `Bodysuit.`;
				case "a military uniform":
					return `Military uniform.`;
				case "a schutzstaffel uniform":
					return `Schutzstaffel uniform.`;
				case "a slutty schutzstaffel uniform":
					return `Slutty Schutzstaffel uniform.`;
				case "a red army uniform":
					return `Red Army uniform.`;
				case "a long qipao":
					return `Long Qipao.`;
				case "battlearmor":
					return `Battlearmor.`;
				case "a mounty outfit":
					return `Mounty outfit.`;
				case "a dirndl":
					return `Dirndl.`;
				case "lederhosen":
					return `Lederhosen.`;
				case "a biyelgee costume":
					return `Biyelgee costume.`;
				case "a leotard":
					return `Leotard.`;
				case "a bunny outfit":
					return `Bunny outfit.`;
				case "a slutty maid outfit":
					return `Slutty maid.`;
				case "a nice maid outfit":
					return `Nice maid.`;
				case "a slutty nurse outfit":
					return `Slutty nurse.`;
				case "a nice nurse outfit":
					return `Nice nurse.`;
				case "a schoolgirl outfit":
					return `Schoolgirl outfit.`;
				case "a kimono":
					return `Kimono.`;
				case "a hijab and abaya":
					return `Hijab and abaya.`;
				case "battledress":
					return `Battledress.`;
				case "a latex catsuit":
					return `Nice latex.`;
				case "restrictive latex":
					return `Bondage latex.`;
				case "conservative clothing":
					return `Conservative clothing.`;
				case "chains":
					return `Chains.`;
				case "overalls":
					return `Overalls.`;
				case "a cheerleader outfit":
					return `Cheerleader.`;
				case "clubslut netting":
					return `Netting.`;
				case "shibari ropes":
					return `Shibari.`;
				case "Western clothing":
					return `Chaps.`;
				case "body oil":
					return `Body oil.`;
				case "a toga":
					return `Toga.`;
				case "a huipil":
					return `Huipil.`;
				case "a slutty qipao":
					return `Slutty qipao.`;
				case "spats and a tank top":
					return `Spats, tank top.`;
				case "a burkini":
					return `Burkini.`;
				case "a niqab and abaya":
					return `Niqab and abaya.`;
				case "a klan robe":
					return `Klan robe.`;
				case "a hijab and blouse":
					return `Hijab and blouse.`;
				case "a burqa":
					return `Burqa.`;
				case "kitty lingerie":
					return `Kitty lingerie.`;
				case "a tube top and thong":
					return `Tube top, thong.`;
				case "a button-up shirt and panties":
					return `Button-up shirt, panties.`;
				case "a gothic lolita dress":
					return `Gothic lolita dress.`;
				case "a hanbok":
					return `Hanbok.`;
				case "a bra":
					return `Nice bra.`;
				case "a button-up shirt":
					return `Nice button-up shirt.`;
				case "a nice pony outfit":
					return `Nice pony outfit.`;
				case "a sweater":
					return `Nice sweater.`;
				case "a tank-top":
					return `Nice tank-top.`;
				case "a thong":
					return `Nice thong.`;
				case "a tube top":
					return `Nice tube top.`;
				case "a one-piece swimsuit":
					return `Swimsuit.`;
				case "a police uniform":
					return `Police uniform.`;
				case "a striped bra":
					return `Striped bra.`;
				case "a skimpy loincloth":
					return `Skimpy loincloth.`;
				case "a slutty klan robe":
					return `Slutty klan robe.`;
				case "a slutty pony outfit":
					return `Slutty pony outfit.`;
				case "a Santa dress":
					return `Santa dress.`;
				case "a sports bra":
					return `Sports bra.`;
				case "a sweater and panties":
					return `Sweater, panties.`;
				case "a t-shirt":
					return `T-shirt.`;
				case "a tank-top and panties":
					return `Tank-top, panties.`;
				case "a t-shirt and thong":
					return `Thong, t-shirt.`;
				case "an oversized t-shirt and boyshorts":
					return `Over-sized t-shirt, boy shorts.`;
				case "an oversized t-shirt":
					return `Nice over-sized t-shirt.`;
				case "a t-shirt and jeans":
					return `Blue jeans, t-shirt.`;
				case "boyshorts":
					return `Boy shorts.`;
				case "cutoffs":
					return `Jean shorts.`;
				case "leather pants and pasties":
					return `Leather pants, pasties.`;
				case "leather pants":
					return `Nice leather pants.`;
				case "panties":
					return `Nice panties.`;
				case "sport shorts and a t-shirt":
					return `Nice sport shorts, shirt.`;
				case "a t-shirt and panties":
					return `Panties, t-shirt.`;
				case "panties and pasties":
					return `Pasties, panties.`;
				case "pasties":
					return `Pasties.`;
				case "striped underwear":
					return `Striped underwear`;
				case "sport shorts and a sports bra":
					return `Shorts, bra.`;
				case "jeans":
					return `Tight blue jeans.`;
				case "a sweater and cutoffs":
					return `Jean shorts, sweater.`;
				case "leather pants and a tube top":
					return `Leather pants, tube top.`;
				case "sport shorts":
					return `Shorts.`;
				case "a bimbo outfit":
					return `Bimbo outfit.`;
				case "a courtesan dress":
					return `Courtesan dress.`;
				default:
					return `Naked.`;
			}
		}
		makeSpan(c, descStr());
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_collar(slave, c) {
		function descStr() {
			switch (slave.collar) {
				case "uncomfortable leather":
					return `Leather collar.`;
				case "tight steel":
					return `Steel collar.`;
				case "preg biometrics":
					return `Pregnancy biometrics collar.`;
				case "cruel retirement counter":
					return `Cruel counter collar.`;
				case "shock punishment":
					return `Shock collar.`;
				case "dildo gag":
					return `Dildo gag.`;
				case "massive dildo gag":
					return `Throat-bulging dildo gag.`;
				case "neck corset":
					return `Neck corset.`;
				case "stylish leather":
					return `Stylish leather collar.`;
				case "satin choker":
					return `Satin choker.`;
				case "silk ribbon":
					return `Silken ribbon.`;
				case "heavy gold":
					return `Gold collar.`;
				case "bowtie":
					return `Bowtie collar.`;
				case "pretty jewelry":
					return `Pretty collar.`;
				case "nice retirement counter":
					return `Nice counter collar.`;
				case "bell collar":
					return `Bell collar.`;
				case "leather with cowbell":
					return `Cowbell collar.`;
				case "ancient Egyptian":
					return `Wesekh.`;
				case "ball gag":
					return `Ball gag.`;
				case "bit gag":
					return `Bit gag.`;
				case "porcelain mask":
					return `Porcelain mask.`;
				default:
					return null;
			}
		}
		const s = descStr();
		if (s) {
			makeSpan(c, s);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_belly(slave, c) {
		function descStr() {
			switch (slave.bellyAccessory) {
				case "shapewear":
					return `Shapewear.`;
				case "a small empathy belly":
					return `Small fake belly.`;
				case "a medium empathy belly":
					return `Medium fake belly.`;
				case "a large empathy belly":
					return `Large fake belly.`;
				case "a huge empathy belly":
					return `Huge fake belly.`;
				case "a corset":
					return `Corset.`;
				case "an extreme corset":
					return `Extreme corsetage.`;
				case "a support band":
					return `Support band.`;
				default:
					return null;
			}
		}
		const s = descStr();
		if (s) {
			makeSpan(c, s);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_arms(slave, c) {
		if (["hand gloves", "elbow gloves"].includes(slave.armAccessory)) {
			makeSpan(c, slave.armAccessory, undefined, true);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_legs(slave, c) {
		if (slave.legAccessory === "short stockings") {
			makeSpan(c, "Short stockings.");
		} else if (slave.legAccessory === "long stockings") {
			makeSpan(c, "Long stockings.");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_shoes(slave, c) {
		if (["boots", "extreme heels", "extreme platform heels", "flats", "heels", "platform heels", "platform shoes", "pumps"].includes(slave.shoes)) {
			makeSpan(c, slave.shoes, undefined, true);
		} else if (slave.heels === 1) {
			makeSpan(c, "Crawling.", "yellow");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_chastity(slave, c) {
		if (slave.chastityAnus === 1 && slave.chastityPenis === 1 && slave.chastityVagina === 1) {
			makeSpan(c, "Full chastity.");
		} else if (slave.chastityPenis === 1 && slave.chastityVagina === 1) {
			makeSpan(c, "Genital chastity.");
		} else if ((slave.chastityAnus === 1 && slave.chastityVagina === 1) || (slave.chastityAnus === 1 && slave.chastityPenis === 1)) {
			makeSpan(c, "Combined chastity.");
		} else if (slave.chastityVagina === 1) {
			makeSpan(c, "Vaginal chastity.");
		} else if (slave.chastityPenis === 1) {
			makeSpan(c, "Chastity cage.");
		} else if (slave.chastityAnus === 1) {
			makeSpan(c, "Anal chastity.");
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_vaginal_acc(slave, c) {
		if (slave.vaginalAttachment !== "vibrator") {
			switch (slave.vaginalAccessory) {
				case "bullet vibrator":
					makeSpan(c, "Attached bullet vibrator.");
					break;
				case "smart bullet vibrator":
					makeSpan(c, "Attached smart bullet vibrator.");
					break;
				case "dildo":
					makeSpan(c, "Vaginal dildo.");
					break;
				case "large dildo":
					makeSpan(c, "Large vaginal dildo.");
					break;
				case "huge dildo":
					makeSpan(c, "Huge vaginal dildo.");
					break;
				case "long dildo":
					makeSpan(c, "Long vaginal dildo.");
					break;
				case "long, large dildo":
					makeSpan(c, "Long and large vaginal dildo.");
					break;
				case "long, huge dildo":
					makeSpan(c, "Long and wide vaginal dildo.");
					break;
			}
		}
		if (slave.vaginalAttachment !== "none") {
			switch (slave.vaginalAttachment) {
				case "vibrator":
					makeSpan(c, "Vibrating dildo.");
					break;
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_dick_acc(slave, c) {
		switch (slave.dickAccessory) {
			case "sock":
				makeSpan(c, "Cock sock.");
				break;
			case "bullet vibrator":
				makeSpan(c, "Frenulum bullet vibrator.");
				break;
			case "smart bullet vibrator":
				makeSpan(c, "Smart frenulum bullet vibrator.");
				break;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function long_buttplug(slave, c) {
		switch (slave.buttplug) {
			case "plug":
				makeSpan(c, "Buttplug.");
				break;
			case "large plug":
				makeSpan(c, "Large buttplug.");
				break;
			case "huge plug":
				makeSpan(c, "Huge buttplug.");
				break;
			case "long plug":
				makeSpan(c, "Long buttplug.");
				break;
			case "long, large plug":
				makeSpan(c, "Large, long buttplug.");
				break;
			case "long, huge plug":
				makeSpan(c, "Enormous buttplug.");
				break;
		}
		switch (slave.buttplugAttachment) {
			case "tail":
				makeSpan(c, "Attached tail.");
				break;
			case "cat tail":
				makeSpan(c, "Attached cat tail.");
				break;
			case "fox tail":
				makeSpan(c, "Attached fox tail.");
				break;
			case "cow tail":
				makeSpan(c, "Attached cow tail.");
				break;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function rules_assistant(slave, c) {
		if (slave.useRulesAssistant === 0) {
			makeSpan(c, "RA-Exempt", "lightgreen");
		} else if (V.abbreviateRulesets === 2 && (slave.currentRules !== undefined) && (slave.currentRules.length > 0)) {
			c.innerHTML = `Rules: ${V.defaultRules.filter(x => ruleApplied(slave, x)).map(x => x.name).join(", ")}`;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {Node} c
	 * @returns {void}
	 */
	function origins(slave, c) {
		const para = makeParagraph(c);
		para.classList.add("gray");
		const pronouns = getPronouns(slave);
		para.textContent = `${slave.origin.replace(/\$([A-Z]?[a-z]+)/g, (match, cap1) => pronouns[cap1] || match)}`;
	}

	/**
	 * @param {HTMLElement} element
	 * @param {string|string[]} [classNames]
	 */
	function _addClassNames(element, classNames) {
		if (classNames != undefined) { /* eslint-disable-line eqeqeq */
			if (Array.isArray(classNames)) {
				element.classList.add(...classNames);
			} else {
				element.classList.add(classNames);
			}
		}
	}

	/**
	 * @param {Node} container
	 * @param {string} text
	 * @param {string|string[]} [classNames]
	 * @param {boolean} [stdDecor=false]
	 * @param {number} [value]
	 */
	function makeSpan(container, text, classNames, stdDecor = false, value) {
		let r = document.createElement("span");
		r.classList.add("ssi");
		_addClassNames(r, classNames);
		if (value != undefined && V.summaryStats) { /* eslint-disable-line eqeqeq */
			text += `[${value}]`;
		}
		r.textContent = stdDecor ? `${capFirstChar(text)}.` : text;
		if (container) {
			container.appendChild(r);
		}
		return r;
	}

	/**
	 * @param {Node} container
	 * @param {string} text
	 * @returns {Text}
	 */
	function addText(container, text) {
		const r = document.createTextNode(text);
		if (container) {
			container.appendChild(r);
		}
		return r;
	}

	/**
	 * @param {Node} [container]
	 * @param {string|string[]} [classNames]
	 */
	function makeBlock(container, classNames) {
		let r = document.createElement("span");
		r.classList.add("ssb");
		_addClassNames(r, classNames);
		if (container) {
			container.appendChild(r);
		}
		return r;
	}

	/**
	 * @param {Node} container
	 * @param {string|string[]} [classNames]
	 * @returns {HTMLParagraphElement}
	 */
	function makeParagraph(container, classNames) {
		let r = document.createElement("p");
		r.classList.add("si");
		_addClassNames(r, classNames);
		if (container) {
			container.appendChild(r);
		}
		return r;
	}

	/**
	 * @param {Node} container
	 * @param {string} name
	 * @param {string} content
	 */
	function tag(container, name, content) {
		let r = document.createElement(name);
		r.textContent = content;
		if (container) {
			container.appendChild(r);
		}
		return r;
	}

	return SlaveSummaryUncached;
})();