code:
App.Events.JESlaveVirginityDeal = class JESlaveVirginityDeal extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.justiceEvents.includes("virginity deal"),
		];
	}

	get weight() {
		return V.justiceEvents.length > 2 ? 2 : 1;
	}

	execute(node) {
		let r = [];
		const index = V.justiceEvents.indexOf("virginity deal");
		V.justiceEvents.splice(index, 1);

		const contractCost = 10000;
		const slave = GenerateNewSlave(null, {maxAge: 22, disableDisability: 1});
		slave.origin = "You bought out a deal for $his sale after the seller took $his virginity and the buyer no longer wanted $him.";
		slave.counter.publicUse += 10;
		slave.devotion = random(25, 30);
		slave.trust = slave.devotion-20;
		slave.oldDevotion = slave.devotion;
		setHealth(slave, jsRandom(0, 20));
		slave.anus = 2;
		if (slave.dick === 0) {
			slave.vagina = 2;
			slave.ovaries = 1;
			if (isFertile(slave) && V.seePreg === 1) {
				knockMeUp(slave, 100, 2, -2);
			}
		}
		const {he, him} = getPronouns(slave);

		App.Events.drawEventArt(node, slave);
		App.UI.DOM.appendNewElement("p", node, App.Events.jeCommon());
		r.push(`A wealthy slaveowner, clearly nursing a ferocious hangover, is accusing a less prominent citizen of refusing to honor the terms of a sale they signed in the early hours of the morning. Already shaking your head, you pull up the security logs with his permission. You verify that yes, indeed, they're visible at a loud party hosted by the wealthy slaveowner, talking over a tablet for a long time before shaking hands and signing.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`The putative buyer protests that though the terms of sale don't show it, their conversation before the sale focused on the slave's virginity. The logs show that this, too, is true. And then, he rages, the slaveowner got even drunker, and brought the slave up to join the party, encouraging other guests to gangbang ${him}. The logs show this too; the slave is definitely not a virgin any longer. The would-be buyer says he understands that he should have gotten the part about the virginity in writing and guaranteed up until he got his hands on ${him}, but requests that you honor the spirit of the deal by letting him out of a contract to buy a now-ruined slave.`);

		App.Events.addParagraph(node, r);

		const choices = [];
		choices.push(new App.Events.Result(`Privately inform both parties you'll settle this in favor of the most generous`, bribe,));
		choices.push(new App.Events.Result(`Settle the dispute in favor of the prospective buyer`, buyer,));
		choices.push(new App.Events.Result(`Settle the dispute in favor of the prominent slaveowner`, owner,));
		choices.push(new App.Events.Result(`Offer to buy out the contract`, buy, `This will cost ${cashFormat(contractCost)} and give you the slave`));
		App.Events.addResponses(node, choices);

		function bribe() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You privately inform both parties you'll settle this in favor of the most generous. You instantly receive two notices of escrow payment contingent on the case going the payer's way. You select the bigger of the two and decide the matter before returning to bed in a good mood. However, the next day it becomes apparent that although he isn't stupid enough to make a public accusation of corruption, the buyer is furious at paying virgin prices for a defiled slave, and is privately slandering your administration of justice.`);
			repX(-100, "event");
			cashX(random(150, 200)*10, "event");
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function buyer() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`What's most important is the justice of the outcome. You settle the dispute in favor of the buyer, who would otherwise be forced to buy something he did not mean to pay for. He lets it be known far and wide that you are willing to stand up for what's right, no matter what and no matter who, improving your reputation. The angry seller, now afflicted with a devalued slave in addition to a bad headache, lets his group of friends know that social superiors have no advantage at justice here. They become more reticent about deal-making in your arcology, damaging its prosperity.`);
			V.arcologies[0].prosperity -= 5;
			repX(2500, "event");
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function owner() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`A deal is a deal; buyer beware. You settle the dispute in favor of the slaveowner. He lets it be known amongst his peers that you do not let social inferiors insist on justice against their betters. Citizens of quality become more willing to consider deal-making in your arcology, increasing prosperity. On the other hand, the angry buyer shows himself to be not a person to treat lightly, either; he maintains a malicious whispering campaign to the effect that your administration of justice is fatally biased.`);
			V.arcologies[0].prosperity += 5;
			repX(-500, "event");
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function buy() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You offer to simply buy out the contract, taking the slave for yourself. This lets the buyer out of buying ${him}, and the slaveowner gets his money; but it soon becomes apparent that what both of them were really looking for is an opportunity to put one over on the other. Neither is pleased to be denied a petty victory, but they both have the sense to keep their mouths shut. The poor slave, meanwhile, appears in the penthouse entryway, hopeful that ${he}'s been lucky enough to end up in a less abusive situation.`);
			App.Events.addParagraph(frag, r);
			frag.append(App.UI.newSlaveIntro(slave));
			return frag;
		}
	}
};


code:
App.Events.PEUnderageConcubine = class PEUnderageConcubine extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => !V.eventResults.youngConcubine, // only once
			() => V.minimumSlaveAge < 18, // underage content visible
			() => V.PC.visualAge > 18, // underage PC is a totally different controversy
			() => !!S.Concubine, // must have concubine
			() => V.arcologies[0].FSMaturityPreferentialist === "unset" // failure should not benefit the player
		];
	}

	actorPrerequisites() {
		return [ [ // one actor, must be able-bodied, devoted, hearing/speaking, underaged concubine; eyes not necessary
			(s) => s.ID === V.ConcubineID,
			(s) => s.fetish !== "mindbroken",
			(s) => s.actualAge < 18, // it's in the name of the event
			(s) => s.visualAge < 18, // so they must also look it
			(s) => s.actualAge > 6, // event text assumes fluent speech, inductive reasoning, etc
			(s) => s.devotion > 50, // you took her to an external event with you, so you must be able to count on her obedience
			canTalk,
			(s) => hasAnyArms(s),
			canMove,
			canHear
		] ];
	}

	execute(node) {
		const [concubine] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him, himself, girl
		} = getPronouns(concubine);

		App.Events.drawEventArt(node, concubine);

		const {say, title: Master} = getEnunciation(concubine);

		let t = [];
		t.push(`You've found a bit of time in your hectic schedule, as you always try to do, to relax and enjoy letting`);
		t.push(contextualIntro(V.PC, concubine, true));
		t.push(`do what ${he} does best.`);
		const receptacle = concubine.toyHole === "all her holes" || concubine.toyHole === "dick" ? "mouth" : concubine.toyHole;
		t.push(`Just after you come ${concubine.toyHole === "boobs" ? `on ${his} chest` : `in ${his} ${receptacle}`}, ${V.assistant.name} lets you know that you and ${V.arcologies[0].name} have been trending in old-world social media.`);
		const rel = relativeTerm(V.PC, concubine);
		t.push(`Last week a video was captured of you sharing a kiss with ${concubine.slaveName} at a major event you attended, and now many citizens of nearby old-world countries are up in arms over your young, beautiful concubine, especially once they found out that ${he} is a ${girl} of just ${num(concubine.actualAge, true)}${rel ? `, and your ${rel} to boot.` : `.`}`);
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`Given the amount and variety of degeneracy found throughout the Free Cities, you find it odd that this has generated so much controversy, but maybe the average old world citizen just doesn't know as much about Free Cities culture as you thought. Scrolling through the commentary, you find a mix of reactions, ranging from outrage and revulsion to sheer envy.`);
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`While ${V.assistant.name} expresses some concerns about attracting too much attention, ${concubine.slaveName} has a different opinion.`);
		t.push(Spoken(concubine, `"Why not take this as an opportunity, ${Master}? Maybe if more people saw things the way we do, they wouldn't hate us for it!"`));
		App.Events.addParagraph(node, t);

		V.eventResults.youngConcubine = 1; // don't repeat this event

		const haveSmilingMan = V.secExpEnabled && V.SecExp && V.SecExp.smilingMan.progress === 10;
		App.Events.addResponses(node, [
			new App.Events.Result("Ignore the controversy... What can they do about it anyway?", ignore),
			new App.Events.Result("Contact an old-world talk show and schedule an interview", interview),
			V.PC.skill.hacking >= 40 || haveSmilingMan ? new App.Events.Result("Hack the social media conversation to favor your point of view", hack) : new App.Events.Result(),
			V.PC.skill.hacking >= 60 || haveSmilingMan ? new App.Events.Result("Take down the videos and silence the conversation", silence) : new App.Events.Result()
		]);

		function ignore() {
			let frag = document.createDocumentFragment();
			t = [];
			t.push(`Your days of caring what the Old World has to say are long over. You tell both ${V.assistant.name} and ${concubine.slaveName} to ignore the fuss and go back to what they were doing as you reach over to play with ${concubine.slaveName}'s pretty ${num(concubine.actualAge)}-year-old ${concubine.toyHole === "all her holes" ? "body" : concubine.toyHole}.`);
			App.Events.addParagraph(frag, t);

			// doesn't matter, huh? let's see about that...
			const matureArc = arcologyGoesMature();
			if (matureArc) {
				t = [];
				t.push(`Over the remainder of the week, the storm of outside controversy eventually causes ${matureArc.name}, your neighbor to the ${matureArc.direction}, to release an interview in which they carefully clarify that they, at least, prefer older slaves. They have adopted Maturity Preferentialism.`);
				App.Events.addParagraph(frag, t);
			}
			return frag;
		}

		function arcologyGoesMature() {
			const vulnerableArcologies = V.arcologies.filter((arc) => arc.direction !== 0 && arc.government !== "your agent" && arc.government !== "your trustees" && arc.rival !== 1);
			let arcology = vulnerableArcologies.find((arc) => arc.FSYouthPreferentialist !== "unset"); // if there's a YP arcology, we'll replace it with MP for maximum effect
			if (!arcology) {
				arcology = vulnerableArcologies.find((arc) => FutureSocieties.activeCount(arc) < V.FSCreditCount); // adopt another FS prematurely...hopefully doesn't cause problems
			}
			if (arcology) {
				arcology.FSYouthPreferentialist = "unset";
				if (arcology.FSMaturityPreferentialist === "unset" || arcology.FSMaturityPreferentialist < 60) {
					arcology.FSMaturityPreferentialist = 60; // entrench somewhat
				}
			}
			return arcology;
		}

		function interview() {
			let frag = document.createDocumentFragment();
			let interviewPoints = 0;

			t = [];
			t.push(`${capFirstChar(V.assistant.name)} sets up an interview with a morning talk show based out of a nearby old world country. It's a show that's been friendly towards the Free Cities in the past, so you hope it will be a good platform.`);
			App.Events.addParagraph(frag, t);

			t = [];
			t.push(`The interview is conducted remotely, and broadcast live; you and ${concubine.slaveName} sit comfortably on the couch in your office, with your arm around ${his} shoulders. The host, a petite blonde woman in a professional feminine-cut suit, begins by introducing you both and playing the video clip that's received so much attention.`);
			App.Events.addParagraph(frag, t);

			t = [];
			t.push(`The interviewer clears her throat.`);
			if (concubine.porn.feed) {
				t.push(`"And that's just the beginning. I'm told that our producers have seen some substantially more explicit content featuring the two of you available on the dark web."`);
				if (concubine.porn.fameType === "underage") {
					t.push(`You begin to wonder whether ${concubine.slaveName}'s fame in explicitly underaged pornography in the Free Cities is going to end up making this interview more difficult.`);
				}
			} else {
				t.push(`"Now, I can see why some people might be concerned about that. That kiss looks anything but chaste!"`);
			}
			App.Events.addParagraph(frag, t);

			t = [];
			t.push(`${capFirstChar(concubine.slaveName)} smiles prettily,`);
			if (concubine.face > 40) {
				t.push(`captivating the audience with ${his}`);
				switch (concubine.faceShape) {
					case "cute":
						t.push("extraordinarily cute");
						break;
					case "normal":
						t.push("cute, young");
						break;
					case "masculine":
						t.push("young, handsome");
						break;
					default:
						t.push(`young, ${concubine.faceShape}`);
				}
				t.push(`face,`);
				interviewPoints++;
			}
			t.push(`giggles briefly, and then pulls ${himself} onto your lap to kiss you passionately before returning to ${his} place next to you on the couch.`);
			App.Events.addParagraph(frag, t);

			t = [];
			t.push(`The interviewer blushes but maintains a straight face. "I see... And would you say that this kind of relationship is common in ${V.arcologies[0].name}?"`);
			App.Events.addParagraph(frag, t);

			const puberty = concubine.genes === "XX" ? !!concubine.pubertyXX : !!concubine.pubertyXY;
			App.Events.addResponses(frag, [
				new App.Events.Result(`We have a special relationship`, specialRelationship),
				new App.Events.Result(`Slaves should always see to their ${getWrittenTitle(concubine)}'s happiness, regardless of age`, slavesDuty),
				puberty ? new App.Events.Result(`Sex with teens is common, as it has been historically`, ephebephile) : new App.Events.Result(),
				new App.Events.Result(`We encourage everyone to explore their sexuality, even children`, pedophile)
			]);

			return frag;

			function specialRelationship() {
				let frag2 = document.createDocumentFragment();

				t = [];
				t.push(`"We have a special relationship," you reply.`);
				App.Events.addParagraph(frag2, t);

				// let's see if she backs you up on that...
				t = [];
				switch (concubine.relationship) {
					case -3: { // married
						t.push(`${concubine.slaveName} shows the camera ${his} wedding ring.`);
						t.push(Spoken(concubine, `"We're married! And quite happily, too, thank you!"`));
						t.push(`${He} gives you a quick kiss on the cheek, and you (and the camera) can see the <span class="trust inc">trust</span> and <span class="devotion inc">devotion</span>`);
						if (canSee(concubine)) {
							t.push(`in ${his} eyes.`);
						} else {
							t.push(`on ${his} face.`);
						}
						interviewPoints++;
						concubine.trust += 2;
						concubine.devotion += 2;
						break;
					}
					case -2: { // bonded
						t.push(`${concubine.slaveName} rests ${his} head on your shoulder gently.`);
						t.push(Spoken(concubine, `"I love my ${Master} so much!"`));
						t.push(`${he} ${say}s <span class="trust inc">proudly.</span>`);
						interviewPoints++;
						concubine.trust += 2;
						break;
					}
					default: {
						t.push(`${concubine.slaveName} looks momentarily confused.`);
						if (concubine.intelligence + concubine.intelligenceImplant > 50) {
							t.push(`${He} recovers quickly, smiling at the camera and hugging you, but you and the interviewer both know that wasn't what ${he} expected, and that ${he}'ll expect repercussions from you later.`);
							concubine.devotion--;
							concubine.trust--;
						} else {
							t.push(`"We do?", ${he} asks cautiously. You give a noncommittal reply for the camera, but you know it didn't go over well, either with the audience or with ${concubine.slaveName}.`);
							interviewPoints--;
							concubine.devotion -= 5;
						}
					}
				}
				App.Events.addParagraph(frag2, t);

				conclusion(frag2);

				return frag2;
			}

			function slavesDuty() {
				let frag2 = document.createDocumentFragment();

				t = [];
				t.push(`"Slaves should always see to their ${properMaster()}'s happiness, regardless of age," you reply.`);
				App.Events.addParagraph(frag2, t);

				// remember your audience...this is NOT the answer the old world wants to hear!
				interviewPoints--;

				t = [];
				t.push(`The interviewer looks taken aback momentarily; she didn't expect such a direct answer to that question. It's not going to endear you to the Old World's moralizers.`);
				App.Events.addParagraph(frag2, t);

				// let's see if your concubine is fast enough and motivated enough to make up the difference (or make it worse)
				if (concubine.intelligence + concubine.intelligenceImplant > 15) {
					if (concubine.behavioralQuirk === "advocate") {
						t = [];
						t.push(`${capFirstChar(concubine.slaveName)} knows why you agreed to this interview, and wants to make sure the Old World ends up with a positive impression of the Free Cities.`);
						t.push(Spoken(concubine, `"So many people have no sense of purpose in this world, but we're lucky. As slaves, we know exactly what we're here to do, and we love the assurance and security that brings. I love to serve ${Master}."`));
						App.Events.addParagraph(frag2, t);
						interviewPoints++;
					} else if (concubine.behavioralFlaw === "liberated") {
						t = [];
						t.push(`${capFirstChar(concubine.slaveName)} bristles visibly at your mention of slaves' duty; you've had many conversations with ${him} about the institution of slavery, and you know ${he}'s an idealistic ${girl} who strongly opposes it.`);
						if (concubine.trust > 50) { // doesn't expect to be punished
							t.push(`But the audience doesn't, until ${he} speaks up:`);
							t.push(Spoken(concubine, `"I serve ${Master} because I love him, but not everyone is so lucky. It's just the reality of slavery in the Free Cities."`));
							concubine.devotion--; // even subtle venting helps
						} else {
							t.push(`${He}'s well-broken and keeps ${his} mouth shut, but the audience can sense ${he}'s <span class="devotion dec">disturbed and angry.</span>`);
							concubine.devotion -= 5;
						}
						App.Events.addParagraph(frag2, t);
						interviewPoints--;
					}
				}

				conclusion(frag2);

				return frag2;
			}

			function ephebephile() {
				let frag2 = document.createDocumentFragment();

				t = [];
				t.push(`"Sex with teens is common, as it has been historically," you reply, proceeding to explain in detail that the modern aversion to sex with adolescents is a historical aberration, and that even in modern times sexual attraction to teens has not been considered abnormal by trained psychologists.`);
				// don't try this line of reasoning with NCS youthening, obviously...
				if (concubine.visualAge >= 13) {
					t.push(`You also point out that physical characteristics of teens like ${concubine.slaveName} are really very similar to those of adults, and cast "age of consent" as an arbitrary social construct that the Free Cities' very different society has not chosen to retain.`);
					interviewPoints++;
				} else {
					t.push(`Your efforts to illustrate that teens and adults are physically similar, though, fall flat because of ${concubine.slaveName}'s extremely youthful appearance; there's no way ${he} could even remotely pass as a young adult.`);
					interviewPoints--;
				}
				App.Events.addParagraph(frag2, t);

				conclusion(frag2);

				return frag2;
			}

			function pedophile() {
				let frag2 = document.createDocumentFragment();

				t = [];
				t.push(`"We encourage everyone to explore their sexuality, even children," you reply, proceeding to explain that, far from being asexual, kids like ${concubine.slaveName} are naturally curious about their bodies and sex. Although you do your best to explain having sex with the underaged in your arcology as an educational exercise, you can tell that the interviewer remains skeptical. It seems the old world just isn't ready for interactive sex ed.`);
				App.Events.addParagraph(frag2, t);

				// remember your audience...this is NOT the answer the old world wants to hear!
				interviewPoints--;

				conclusion(frag2);

				return frag2;
			}

			/** @param {DocumentFragment} frag2 */
			function conclusion(frag2) {
				// shared conclusion for interview segment
				t = [];
				t.push(`The remainder of the interview passes similarly. ${concubine.slaveName}'s attention wanders from time to time, but you can tell ${he}'s happy that you decided to address the controversy directly.`);
				concubine.trust += 2;
				App.Events.addParagraph(frag2, t);

				t = [];
				if (interviewPoints > 0) {
					const womanP = getPronouns(V.PC).woman;
					t.push(`Furthermore, by the end of the interview you can tell you've made some significant progress getting the interviewer, and hopefully the audience, more receptive towards your point of view. Recordings find their way back into the Free Cities and you're hailed as a spokes${womanP}.`);
					App.Events.addParagraph(frag2, t);
					V.eventResults.youngConcubine = 2; // record persuasive success in case we want to use it in the future
					repX(1000, "event");
				} else if (interviewPoints === 0) {
					t.push(`Although your performance on the old-world talk show wasn't exactly hailed as persuasive, your openness at least helped tamp down the outrage, and you've earned a bit of respect from your Free Cities peers.`);
					App.Events.addParagraph(frag2, t);
					repX(100, "event");
				} else { // interviewPoints < 0
					t.push(`Unfortunately, your performance on the old-world talk show has just riled up the moralizers even more, and has put other Free Cities on their back foot as they struggle to explain away your controversy. You find yourself getting fewer invitations to attend events as you lose the respect of your peers.`);
					App.Events.addParagraph(frag2, t);
					repX(forceNeg(500), "event");

					const matureArc = arcologyGoesMature();
					if (matureArc) {
						t = [];
						t.push(`Furthermore, the storm of outside controversy causes ${matureArc.name}, your neighbor to the ${matureArc.direction}, to release an interview in which they carefully clarify that they, at least, prefer older slaves. They have adopted Maturity Preferentialism.`);
						App.Events.addParagraph(frag2, t);
					}
				}
			}
		}

		function hack() {
			t = [];
			if (V.PC.skill.hacking >= 80) {
				t.push(`You know the old adage about nothing ever really being gone from the internet, so you decide to take the smarter approach and, through a series of sock puppets and social engineering, push the conversation away from outrage and toward envy. The resulting influx of trade and migration to the Free Cities increases your prosperity.`);
				V.eventResults.youngConcubine = 2; // record persuasive success in case we want to use it in the future
				V.arcologies[0].prosperity += 2;
			} else if (haveSmilingMan) {
				t.push(`Although you know your hacking expertise isn't up to the job, you know someone who can accomplish the impossible. The Smiling Man, through a series of sock puppets, selective moderation, and social engineering, guides the conversation towards more envy and less outrage. The resulting influx of trade and migration to the Free Cities increases your prosperity.`);
				V.eventResults.youngConcubine = 2; // record persuasive success in case we want to use it in the future
				V.arcologies[0].prosperity += 2;
			} else {
				t.push(`You know the old adage about nothing ever really being gone from the internet, so you decide to take the smarter and more subtle approach. Alas, your hamfisted attempts to shape the conversation through hacking and sockpuppets result in significant backlash from within the Free Cities, and death threats from the old world.`);
				repX(forceNeg(1000), "event");
			}
			return t;
		}

		function silence() {
			t = [];
			if (V.PC.skill.hacking >= 100) {
				t.push(`Although it's commonly considered impossible to take anything off the internet, you have just about enough skill and experience to make it happen. Through a relentless series of AI-assisted attacks and breaches, you ensure that the conversation, and the videos, fade from public consciousness in the old world. You leave some search-and-destroy programs running just in case you want to appear in public with ${concubine.slaveName} again.`);
			} else if (haveSmilingMan) {
				t.push(`Although you know your hacking expertise isn't up to the job, you know someone who can accomplish the impossible and make things disappear from the internet. The Smiling Man strikes again, and within hours, the video is gone and the conversations are quiet. And with the Smiling Man watching your back, you can continue taking ${concubine.slaveName} anywhere you want.`);
			} else {
				t.push(`You know the old adage about nothing ever really being gone from the internet, and despite your best attempts, it seems to be true. The video and associated conversations keep resurfacing, and your hamfisted attempts to shut it down cause backlash from within the Free Cities, and death threats from the old world.`);
				repX(forceNeg(1000), "event");
			}
			return t;
		}
	}
};

repo_name: Fekenol/fc

license: mit


code:
App.Events.PEConcubineInterview = class PEConcubineInterview extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => !!S.Concubine
		];
	}

	actorPrerequisites() {
		return [
			[
				s => s.ID === S.Concubine.ID,
				canTalk,
				canHear
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const PC = V.PC;
		const {he, his, him, girl, He, His} = getPronouns(eventSlave);
		const {he: heP, his: hisP, him: himP, woman: womanP, He: HeP} = getPronouns(PC);
		const {say, title: Master} = getEnunciation(eventSlave);
		const lisps = SlaveStatsChecker.checkForLisp(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const fluid = eventSlave.inflationType;
		const arcology = V.arcologies[0];

		App.Events.drawEventArt(node, eventSlave);

		let t = [];

		t.push(`You receive an official communication from a popular talk show e-hosted in one of the old world's still-thriving first world countries. Your fame has become known even in the old world, and they'd like to interview `, App.UI.DOM.slaveDescriptionDialog(eventSlave), ` about you. They frankly warn you that you'll have no right to review the interview and no ability to control what ${he} says, and that they'll be asking about anything the interviewer thinks is juicy. This could be great for your reputation, but it could be hazardous, too.`);

		App.Events.addParagraph(node, t);

		App.Events.addResponses(node, [
			new App.Events.Result("Accept", accept),
			new App.Events.Result("Decline", decline)
		]);

		function accept() {
			const frag = document.createDocumentFragment();
			let repSum = 0; // just tally here...we'll run the whole sum through repX in one go to avoid rep-scaling problems
			const rep = val => repSum += val;
			const speak = string => Spoken(eventSlave, string);

			t = [];

			t.push(`The show is broadcast live; you head out onto a balcony to watch it on a big screen. It's been impossible to hide, and many of your citizens have taken a proprietary attitude towards your fame: they see your success as their success, too, and want to see ${eventSlave.slaveName} do well. The show introduction plays, introducing the host, a swishy, rail-thin gentleman with impeccable sartorial style and a close-cropped salt-and-pepper beard. He reviews who you are, giving equal time to your accomplishments and the inevitable criticisms from old world antislavery activists, and then calls ${eventSlave.slaveName} out.`);

			App.Events.addParagraph(frag, t);

			t = [];

			t.push(`${He} `);
			if (eventSlave.bellyPreg > 1000000) {
				t.push(`barely waddles out,${hasAnyArms(eventSlave) ? ` arm${hasBothArms(eventSlave) ? `s` : ``} resting atop ${his} ${belly} belly,` : ``}`);
			} else if (eventSlave.bellyPreg > 750000) {
				t.push(`barely waddles out,${hasAnyArms(eventSlave) ? ` arm${hasBothArms(eventSlave) ? `s` : ``} struggling to lift ${his} ${belly}, absolutely child-stuffed belly as ${he} lewdly caresses it,` : ``}`);
			} else if (eventSlave.bellyPreg > 600000) {
				t.push(`waddles out,${hasAnyArms(eventSlave) ? ` arm${hasBothArms(eventSlave) ? `s` : ``} cradling ${his} ${belly}, absolutely child-stuffed belly as best ${he} can as ${he} lewdly caresses its sides,` : ``}`);
			} else if (eventSlave.bellyPreg > 450000) {
				t.push(`waddles out,${hasAnyArms(eventSlave) ?
					` arm${hasBothArms(eventSlave) ? `s` : ``} cradling ${his} ${belly}, absolutely child-stuffed belly as ${he} lewdly sways it side to side,` :
					`lewdly swaying ${his} absolutely child-stuffed belly from side to side,`}`);
			} else if (eventSlave.bellyPreg > 300000) {
				t.push(`strides out,${hasAnyArms(eventSlave) ?
					` arm${hasBothArms(eventSlave) ? `s` : ``} cradling ${his} ${belly}, absolutely child-stuffed belly as ${he} lewdly sways it side to side,` :
					`lewdly swaying ${his} absolutely child-stuffed belly from side to side,`}`);
			} else if (eventSlave.bellyPreg > 150000) {
				t.push(`strides out with an exaggerated gait, purposefully swaying ${his} ${belly}, child-stuffed belly from side to side,`);
			} else if (eventSlave.belly > 150000) {
				t.push(`strides out, ${his} ${belly} belly swaying side to side lewdly,`);
			} else if (eventSlave.belly > 5000) {
				t.push(`strides out, sensually swaying ${his} round belly side to side,`);
			} else {
				t.push(`strides out`);
			}
			if (App.Data.clothes.get(eventSlave.clothes).exposure >= 4) {
				t.push(`in magnificent nudity. It's a shock to old world values, no doubt, but the titillation should counterbalance that.`);
			} else {
				t.push(`resplendent in ${eventSlave.clothes}.`);
			}
			if (eventSlave.skill.entertainment > 60) {
				t.push(`${He}'s <span class="green">graceful and sensual,</span> and entirely at home.`);

				rep(500);
			} else if (eventSlave.skill.entertainment < 30) {
				t.push(`${He}'s <span class="red">clumsy and nervous,</span> but does ${his} best to rally.`);

				rep(-100);
			} else {
				t.push(`${He} manages ${his} entrance reasonably well, and conceals any nervousness.`);
			}
			if (eventSlave.geneticQuirks.neoteny === 2 && eventSlave.visualAge < V.minimumSlaveAge) {
				t.push(`"My honey, aren't you a bit young for this sort of thing?${V.minimumSlaveAge < 16 ? ` I know things are a little different where you're from, but still, you're just a child!` : ``}"`);
				if (eventSlave.intelligence + eventSlave.intelligenceImplant > 50) {
					t.push(`${He} <span class="green">effortlessly diffuses the question.</span> ${speak(`"I'm really ${eventSlave.actualAge}. Most people would never consider a ${girl} with a genetic condition like mine, but my dear Master was able to see past it."`)}`);

					rep(500);
				} else if (eventSlave.intelligence + eventSlave.intelligenceImplant > 15) {
					t.push(`${He} manages to sway the topic away from ${his} apparent underageness. ${speak(`"I'm really ${eventSlave.actualAge}, believe it or not. Wouldn't you like to know my secret?"`)}`);
				} else {
					t.push(`${He} manages to completely miss the insinuation and <span class="red">make things worse than they really are.</span> ${speak(`"Master loves the way I look, that's why I'm ${hisP} favorite after all, but I'm still ${eventSlave.actualAge}-years old."`)}`);

					rep(-100);
				}
			} else if (eventSlave.face > 95) {
				t.push(`"Oh my God," exclaims the host reverently. "Honey, <span class="green">you are gorgeous.</span>" He turns to the camera. "Isn't ${he} just gorgeous?"`);

				rep(500);
			} else if (eventSlave.face < 10) {
				t.push(`There is a distinct lack of response from the host; perhaps he was <span class="red">expecting ${him} to be prettier.</span>`);

				rep(-100);
			} else {
				t.push(`The host gives ${him} a perfunctory compliment on ${his} beauty.`);
			}
			t.push(`They seat themselves in comfortable leather chairs and the interview begins in earnest.`);

			App.Events.addParagraph(frag, t);

			t = [];

			t.push(`The host asks ${him} some soft, nonjudgmental questions about ${his} life and how ${he} became your slave. Then he hits ${him}: "So, ${eventSlave.slaveName}. Tell us about ${PlayerName()}."`);
			if (eventSlave.devotion > 95) {
				t.push(`<span class="green">Without a moment's hesitation,</span> ${he} ${lisps ? `lisps` : `proclaims`}, "I love ${himP}. ${HeP}'s so ${PC.title !== 0 ? `handsome` : `pretty`}, and," ${he} manages to blush prettily, "${heP}'s so good to me."`);

				rep(500);
			} else if (eventSlave.devotion < 60) {
				t.push(`${He} struggles for an instant and then says <span class="red">unconvincingly</span> that ${he} loves you.`);

				rep(-100);
			} else {
				t.push(`${He} recovers quickly and responds that ${he} loves you.`);
			}

			App.Events.addParagraph(frag, t);

			t = [];

			t.push(`The host glances at the camera. "Wow." He presses on. "But you're ${hisP} slave, ${eventSlave.slaveName}. ${HeP} owns you. Isn't that hard for you?"`);

			App.Events.addParagraph(frag, t);

			t = [];

			t.push(`${He} shakes ${his} head.`);
			if (eventSlave.trust > 95) {
				t.push(`${He} responds confidently, "My life with ${himP} is very different from anything you might find here in the old world. But I'm happy with ${himP}, and there's no one I'd rather be with, as a slave or not."`);

				rep(500);
			} else if (eventSlave.trust < 60) {
				t.push(`${He} explains that it isn't hard to trust someone like you, but this <span class="red">falls a little flat.</span>`);

				rep(-100);
			} else {
				t.push(`${He} explains earnestly that it isn't hard to trust someone like you, and explains some of the blander details about life as your slave.`);
			}
			if (eventSlave.belly > 1500) {
				t.push(`The host places a hand on ${his} belly,`);
				if (eventSlave.bellyPreg > 450000) {
					t.push(`gasping at the tautness and the feeling of the ${eventSlave.pregType > 1 ? `children` : `child`} distending the skin beneath his hand.`);
				} else if (eventSlave.bellyPreg > 100000) {
					t.push(`gasping at the flurry of kicks in response.`);
				} else if (eventSlave.belly > 15000) {
					t.push(`giving it a good groping.`);
				} else if (eventSlave.belly > 5000) {
					t.push(`giving it a good pat.`);
				} else {
					t.push(`giving it a good feel.`);
				}
				t.push(`"Now I'm sure our viewers are wondering," he says, patting the firm dome. "Is it ${PlayerName()}'s?"`);
				if (eventSlave.pregSource === -1) {
					if (eventSlave.bellyPreg > 450000) {
						t.push(`${speak(`"Of course they are!"`)} ${he} proclaims proudly as ${he} ${hasAnyArms(eventSlave) ? `runs ${his} hand${hasBothArms(eventSlave) ? `s` : ``} across` : `stretches out to show off`} ${his} quivering mass. "All ${eventSlave.pregType} of them!"`);
					} else if (eventSlave.bellyPreg > 100000) {
						t.push(`${speak(`"Of course they are!"`)} ${he} proclaims proudly as ${he} ${hasAnyArms(eventSlave) ? `runs ${his} hand${hasBothArms(eventSlave) ? `s` : ``} across` : `stretches out to show off`} ${his} belly. "All ${eventSlave.pregType} of them!"`);
					} else if (eventSlave.bellyImplant > 1500) {
						t.push(speak(`"It's fake. Pretty hard to tell though, isn't it?"`));
					} else if (eventSlave.bellyPreg > 1500) {
						t.push(speak(`"Of course ${eventSlave.pregType > 1 ? `they are` : `it is`}!"`));
					} else if (eventSlave.bellyFluid > 100) {
						t.push(speak(`"Nah. It's all ${fluid} inside me."`));
					} else if (eventSlave.bellyImplant > -1) {
						t.push(speak(`"It's fake. Pretty hard to tell though, isn't it?"`));
					} else {
						t.push(speak(`"Of course ${eventSlave.pregType > 1 ? `they are` : `it is`}!"`));
					}
				} else {
					t.push(speak(`"That's for me and my ${Master} only," ${he} teases, sticking out ${his} tongue.`));
				}
			}
			if (eventSlave.broodmother === 2 && eventSlave.preg > 37) {
				t.push(`${He} grunts and struggles to ${hasBothLegs(eventSlave) ? `spread ${his} legs` : `get into position`}. ${speak(`"I'm sorry, another one is coming out right now..."`)} ${he} ${say}s, turning red. The host, at a loss for words, can only watch as`);
				if (App.Data.clothes.get(eventSlave.clothes).exposure >= 4) {
					t.push(`a child is born into the world, live on screen.`);
				} else {
					t.push(`a child is born into ${his}`);

					switch (eventSlave.clothes) {
						case "a toga":
							t.push(`toga.`);
							break;
						case "a huipil":
							t.push(`huipil.`);
							break;
						case "a slutty qipao":
							t.push(`slutty qipao.`);
							break;
						case "a penitent nuns habit":
							t.push(`habit.`);
							break;
						case "a slave gown":
						case "a ball gown":
							t.push(`gown.`);
							break;
						case "a comfortable bodysuit":
							t.push(`bodysuit.`);
							break;
						case "a leotard":
							t.push(`leotard.`);
							break;
						case "a bunny outfit":
							t.push(`bunny outfit.`);
							break;
						case "a nice nurse outfit":
							t.push(`nurse outfit.`);
							break;
						case "a slutty nurse outfit":
							t.push(`slutty nurse outfit.`);
							break;
						case "a schoolgirl outfit":
							t.push(`school clothes.`);
							break;
						case "a hijab and abaya":
						case "a niqab and abaya":
							t.push(`abaya.`);
							break;
						case "a klan robe":
							t.push(`robe.`);
							break;
						case "a hijab and blouse":
							t.push(`skirt.`);
							break;
						case "a burqa":
							t.push(`burqa.`);
							break;
						case "a burkini":
							t.push(`burkini.`);
							break;
						case "a kimono":
							t.push(`kimono.`);
							break;
						case "a hanbok":
							t.push(`hanbok.`);
							break;
						case "a nice maid outfit":
							t.push(`maid outfit.`);
							break;
						case "a slutty maid outfit":
							t.push(`skimpy maid outfit.`);
							break;
						case "a gothic lolita dress":
						case "a halter top dress":
						case "a long qipao":
						case "a maternity dress":
						case "a mini dress":
						case "a Santa dress":
						case "a biyelgee costume":
							t.push(`dress.`);
							break;
						case "a latex catsuit":
							t.push(`latex catsuit.`);
							break;
						case "a military uniform":
							t.push(`uniform.`);
							break;
						case "a schutzstaffel uniform":
							t.push(`uniform.`);
							break;
						case "a slutty schutzstaffel uniform":
							t.push(`slutty uniform.`);
							break;
						case "a red army uniform":
							t.push(`uniform.`);
							break;
						case "spats and a tank top":
							t.push(`spats.`);
							break;
						case "a monokini":
							t.push(`monokini.`);
							break;
						case "a cybersuit":
							t.push(`cybersuit.`);
							break;
						case "a tight Imperial bodysuit":
							t.push(`bodysuit.`);
							break;
						case "battlearmor":
							t.push(`armor.`);
							break;
						case "Imperial Plate":
							t.push(`ultra-heavy armor.`);
							break;
						// case "skirt" //FIXME: skirts are not a thing apparently
						// 	t.push(`dress.`);
						// 	break;
						case "a mounty outfit":
						case "a police uniform":
							t.push(`uniform.`);
							break;
						case "lederhosen":
							t.push(`shorts.`);
							break;
						case "a courtesan dress":
							t.push(`layered skirt.`);
							break;
						case "a bimbo outfit":
							t.push(`thong.`);
							break;
						default:
							t.push(`${eventSlave.clothes}.`);
							break;
					}
				}
			}

			App.Events.addParagraph(frag, t);

			t = [];

			t.push(`The interview winds on, gradually descending into prurient territory. ${eventSlave.slaveName} answers readily, giving everyone watching quite a window into an oversexed slave society.`);
			if (eventSlave.intelligence + eventSlave.intelligenceImplant > 15) {
				t.push(`${He}'s clever enough to shock and titillate at the same time; in response to a probing question about whether ${he} has any plans for the rest of the night, ${he} ${say}s, ${speak(`"Of course my ${Master} makes the plans. But I hope I can get back to the arcology early."`)} ${He} shifts suggestively in ${his} chair. "I'm looking forward to getting fucked tonight."`);

				rep(500);
			} else {
				t.push(`${He}'s rather blunt in ${his} responses, answering with a little too much detail; not that the audience minds.`);
			}
			t.push(`The host, taken off guard, laughs in surprise and says he envies you that. He asks a follow up question that hints at ${his} sexual preferences without coming straight out and asking how ${he} likes it.`);
			if (eventSlave.intelligence + eventSlave.intelligenceImplant + eventSlave.skill.entertainment > 130 && !eventSlave.tankBaby) {
				t.push(`${He} has enough knowledge of the old world to be able to answer without going too far, and <span class="green">subtly alludes</span> to how much ${he} enjoys`);
				if (eventSlave.fetish === "submissive") {
					t.push(`submitting to you in bed.`);
				} else if (eventSlave.fetish === "cumslut") {
					if (!PC.dick) {
						t.push(`eating you out.`);
					} else {
						t.push(`sucking you off.`);
					}
				} else if (eventSlave.fetish === "humiliation") {
					t.push(`it when you show ${him} off in public.`);
				} else if (eventSlave.fetish === "buttslut") {
					t.push(`anal sex.`);
				} else if (eventSlave.fetish === "boobs") {
					t.push(`anything that involves ${his} breasts.`);
				} else if (eventSlave.fetish === "sadist") {
					t.push(`it whenever you share a reluctant slave with ${him}.`);
				} else if (eventSlave.fetish === "masochist") {
					t.push(`a good spanking.`);
				} else if (eventSlave.fetish === "dom") {
					t.push(`sharing a submissive slave with you.`);
				} else if (eventSlave.fetish === "pregnancy") {
					if (eventSlave.pregKnown) {
						t.push(`sex while pregnant.`);
					} else if (eventSlave.vagina > 0) {
						t.push(`bareback.`);
					} else {
						t.push(`sharing a pregnant slave with you.`);
					}
				} else if (eventSlave.energy > 95) {
					t.push(`sex, regardless of what kind it is.`);
				} else {
					t.push(`sex in the missionary position.`);
				}

				rep(500);
			} else {
				t.push(`${His} answer betrays how ${eventSlave.tankBaby ? `little ${he} knows` : `much ${he}'s forgotten`} about the old world: ${he} mildly shocks the studio audience by describing`);
				if (eventSlave.fetish === "submissive") {
					t.push(`how good it feels when you hold ${him} down and fuck ${him}`);
				} else if (eventSlave.fetish === "cumslut") {
					if (!PC.dick) {
						t.push(`how much fun sucking your cock is`);
					} else {
						t.push(`how much fun polishing your pearl is`);
					}
				} else if (eventSlave.fetish === "humiliation") {
					t.push(`how hot it is to get fucked in public`);
				} else if (eventSlave.fetish === "buttslut") {
					t.push(`how much ${he} loves the feeling of you stretching ${his} anal ring`);
				} else if (eventSlave.fetish === "boobs") {
					t.push(`how much ${he} loves having ${his} nipples tugged`);
				} else if (eventSlave.fetish === "sadist") {
					t.push(`how much ${he} loves molesting other slaves with you`);
				} else if (eventSlave.fetish === "masochist") {
					t.push(`how good it feels to be forced`);
				} else if (eventSlave.fetish === "dom") {
					t.push(`how much ${he} loves holding other slaves down for you`);
				} else if (eventSlave.fetish === "pregnancy") {
					if (eventSlave.pregKnown || eventSlave.counter.births > 0) {
						t.push(`how good sex feels while pregnant`);
					} else if (eventSlave.vagina > 0) {
						t.push(`how good cum feels inside ${him}`);
					} else {
						t.push(`how much fun it is to fuck pregnant slaves`);
					}
				} else if (eventSlave.energy > 95) {
					t.push(`the average number of sexual encounters ${he} has in a week`);
				} else {
					t.push(`${his} sex life with you`);
				}
				t.push(`in a matter-of-fact tone of voice.`);
			}

			App.Events.addParagraph(frag, t);

			if (eventSlave.intelligence + eventSlave.intelligenceImplant > 50) {
				t = [];

				t.push(`Only because you know ${him} so well are you able to perceive the instant of cold calculation before ${he} makes a perfect tactical decision and turns directly to the camera. "Whatever you want," ${he} ${say}s confidently, ${speak(`"You can find it in a Free Cities arcology like my ${Master}'s. Where I live, there's`)}`);
				if (arcology.FSRestart > 0) {
					t.push(speak(`the most interesting people,`));
				}

				if (arcology.FSPaternalist > 0) {
					t.push(speak(`wonderful opportunities for everyone,`));
				}

				if (arcology.FSAssetExpansionist > 0) {
					t.push(speak(`boobs the size of beach balls,`));
				}

				if (arcology.FSRepopulationFocus > 0) {
					t.push(speak(`lots of bellies of all sizes,`));
				}

				if (arcology.FSBodyPurist === "unset") {
					t.push(speak(`gorgeous tattoos and piercings,`));
				} else if (arcology.FSTransformationFetishist > 0) {
					t.push(speak(`new assets every day,`));
				}

				if (arcology.FSPastoralist > 0) {
					t.push(speak(`milk straight from the nipple,`));
				}

				if (arcology.FSPhysicalIdealist > 0) {
					t.push(speak(`the most incredible oiled-up muscles,`));
				} else if (arcology.FSHedonisticDecadence > 0) {
					t.push(speak(`the softest, most laid-back girls,`));
				}

				if (arcology.FSRomanRevivalist > 0) {
					t.push(speak(`Rome come again,`));
				} else if (arcology.FSNeoImperialist > 0) {
					t.push(speak(`a New Imperium worthy of the ages,`));
				} else if (arcology.FSAztecRevivalist > 0) {
					t.push(speak(`Blood empire reborn,`));
				} else if (arcology.FSEgyptianRevivalist > 0) {
					t.push(speak(`the land of the Pharaohs reborn,`));
				}

				if (arcology.FSGenderRadicalist > 0) {
					t.push(speak(`more ass than you can possibly fuck,`));
				} else if (arcology.FSGenderFundamentalist > 0) {
					t.push(speak(`so much pussy it's unbelievable,`));
				}

				if (arcology.FSIntellectualDependency > 0) {
					t.push(speak(`slaves eager to get in your pants,`));
				}

				if (arcology.FSSlaveProfessionalism > 0) {
					t.push(speak(`slaves you can have a conversation with,`));
				}

				if (arcology.FSPetiteAdmiration > 0) {
					t.push(speak(`where even the shortest can stand tall,`));
				} else if (arcology.FSStatuesqueGlorification > 0) {
					t.push(speak(`plenty of mouths at crotch height,`));
				}

				if (arcology.FSChattelReligionist > 0) {
					t.push(speak(`a fulfilling sexual and spiritual life,`));
				}

				if (arcology.FSDegradationist > 0) {
					t.push(speak(`bitches you can just hold down and use,`));
				}

				if (arcology.FSSupremacist > 0) {
					t.push(speak(`${arcology.FSSupremacistRace} power,`));
				}

				if (arcology.FSSubjugationist > 0) {
					t.push(speak(`${arcology.FSSubjugationistRace} girls to cater to your every whim,`));
				}

				t.push(speak(`girls in pretty dresses and girls in string bikinis and girls who haven't worn clothes in years,`));
				if (V.seeDicks !== 0) {
					t.push(speak(`girls with huge dicks you can assfuck until they cum buckets, girls with soft dicks and no balls,`));
				}

				if (V.seeDicks !== 0 && V.seeDicks !== 100) {
					t.push(speak(`girls with dicks the size of clits and girls with clits the size of dicks,`));
				}

				if (V.seeDicks !== 100) {
					t.push(speak(`young girls on their first pregnancy, MILFs on their tenth,`));
				}

				t.push(speak(`lips, tongues,`));

				if (arcology.FSEgyptianRevivalistIncestPolicy === 1) {
					t.push(speak(`incest,`));
				}

				if (arcology.FSSlimnessEnthusiast === "unset") {
					t.push(speak(`huge breasts and plush asses,`));
				} else if (arcology.FSAssetExpansionist === "unset") {
					t.push(speak(`pert tits and cute butts,`));
				}

				t.push(speak(`and more. I wouldn't trade it for anything."`), ` The host politely regains control of his show, but there's a cautious respect in the rest of his questions.`);

				rep(1500);

				App.Events.addParagraph(frag, t);

				if (PC.title === 0) {
					t = [];

					t.push(`${eventSlave.slaveName} even manages to <span class="green">respond well</span> to a probing question about your gender. ${He} ${lisps ? `lisps` : `explains`}, ${speak(`"You have to understand that all that nonsense about men and women means less to us in the Free Cities. My ${Master} is a successful and powerful ${womanP}.`)}`);
					if (!PC.dick) {
						t.push(`${speak(`We just pay the right amount of attention to the success and the power.`)} ${He} quirks a corner of ${his} mouth. "I know <em>I</em> do."`);
					} else {
						t.push(`${He} quirks a corner of ${his} mouth. ${speak(`"And ${heP} has a wonderful cock."`)}`);
					}

					rep(500);

					App.Events.addParagraph(frag, t);
				}
			}

			t = [];

			t.push(`At the conclusion, the host`);
			if (repSum > 200) {
				t.push(`seems <span class="green">impressed</span> and says sincerely,`);
			} else if (repSum < 0) {
				t.push(`seems <span class="red">unimpressed</span> and says mockingly,`);
			} else {
				t.push(`says jokingly,`);
			}
			t.push(`"My dear it's been a pleasure. If all Free Cities ${girl}s are like you I might have to look into immigrating. Ladies and gentlemen, good night!"`);
			repX(repSum, "concubine", eventSlave);

			App.Events.addParagraph(frag, t);

			return frag;
		}

		function decline() {
			t = [];

			t.push(`You decline. The media representative of the show is understanding. "I'll be sure to contact you if we ever have another opening," she says. "You're pretty interesting, you know."`);

			return t;
		}
	}
};


code:
App.Events.PEFoodplay = class PEFoodplay extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => ((V.rep > 10000) || (V.debugMode > 0 && V.debugModeEventSelection > 0)),
			() => ((V.HeadGirlID !== 0) || (V.ConcubineID !== 0) || (V.BodyguardID !==0))
		];
	}

	execute(node) {
		let eventSlave = undefined;
		App.Events.addParagraph(node, [`You are relaxing in the Penthouse after a day of hard work when your PA alerts you to an incoming shipment. One of the aristocrats in your arcology was able to get their hands on a shipment of fresh, wild-caught fish and has sent you a few prime cuts as a sign of goodwill. Such a delicacy is rare to come across, given the rapidly deteriorating global climate.`]);
		App.Events.addParagraph(node, [`As the leader of a well-established and renowned arcology, it isn't uncommon for you to receive these gestures of friendship and goodwill on a semi-regular basis. Perhaps it wouldn't be such a bad idea to enjoy this latest gift with one of your slaves.`]);

		App.Events.addResponses(node, [
			(V.HeadGirlID !== 0)
				? new App.Events.Result(`Accept the gift and invite your Head Girl to join you `, () => scene(S.HeadGirl))
				: new App.Events.Result(),
			(V.ConcubineID !== 0)
				? new App.Events.Result(`Accept the gift and share it with your Concubine`, () => scene(S.Concubine))
				: new App.Events.Result(),
			(V.BodyguardID !== 0)
				? new App.Events.Result(`Accept the gift, and have your Bodyguard join you`, () => scene(S.Bodyguard))
				: new App.Events.Result(),
			new App.Events.Result(`Decline the gift`, decline)
		]);

		function decline() {
			const r = new SpacedTextAccumulator();
			r.push(`You politely decline the shipment of seafood. You receive plenty of gifts, and can't spend time entertaining each individual that wishes to gain your favor.`);
			return r.container();
		}

		function scene(slave){
			const r = new SpacedTextAccumulator();
			eventSlave = slave;
			const {
				He, he, his, him
			} = getPronouns(eventSlave);
			const {title: Master} = getEnunciation(eventSlave);

			App.Events.drawEventArt(node, eventSlave, "no clothing");

			r.push(`You summon`);
			r.push(contextualIntro(V.PC, eventSlave, true));
			r.push(`to your office and order her to lie down on your desk.`);
			if (hasAnyLegs(eventSlave)){
				if (eventSlave.devotion > 50){
					r.push(`${He} complies with a smile, excited to see what you have in store for ${him}.`);
				} else if (eventSlave.devotion > 20){
					r.push(`${He} complies with a smile, curious to see what you have in store for ${him}.`);
				} else if (eventSlave.trust < 20 && eventSlave.devotion > -20){
					r.push(`${He} nervously complies, curious to see what you have in store for ${him}.`);
				} else if (eventSlave.trust < -50) {
					r.push(`Terrified of what you have in store for ${him}, ${he} nervously complies, dreading what you have in store for ${him}.`);
				} else {
					r.push(`${He} nervously complies, and lays down on the desk.`);
				}
			} else {
				r.push(`${He} is laid onto your desk with the help of other slaves.`);
			}

			r.push(`After ${he} is situated, you go over to ${him} and being to peel off ${his} clothing, ${(eventSlave.trust > 20) ? `to which ${he} gives you a soft smile.` : `the slave shivering against your touch.`}`);
			r.push(`You take a seat at your desk, resuming your work while enjoying the sight of ${eventSlave.slaveName}'s naked body.`);
			r.push(`Another slave brings a pair of chopsticks and several pieces of sushi, prepared from the seafood that was just delivered. She begins placing them along ${eventSlave.slaveName}'s`);
			if (eventSlave.weight > 190) {
				r.push(`immense`);
			} else if (eventSlave.weight > 160) {
				r.push(`massive`);
			} else if (eventSlave.weight > 130) {
				r.push(`huge`);
			} else if (eventSlave.weight > 95) {
				r.push(`thick`);
			} else if (eventSlave.weight > 10) {
				r.push(`ample`);
			} else if (eventSlave.weight >= -10) {
				r.push(`trim`);
			}
			r.push(`body. ${He} shivers as the cold food comes into contact with ${his} skin`);
			if (eventSlave.devotion < -20){
				r.push(`and wriggles on the desk, nearly causing the carefully placed food to fall off of ${him}.`);
			} else {
				r.push(`but diligently remains still so as to make sure none of the precious delicacy falls off ${his} body.`);
			}

			r.toParagraph();

			r.push(`Two pieces are laid onto her`);
			if (eventSlave.boobs > 40000) {
				r.push(`gargantuan`);
			} else if (eventSlave.boobs > 25000) {
				r.push(`immense`);
			} else if (eventSlave.boobs > 10000) {
				r.push(`ridiculous`);
			} else if (eventSlave.boobs > 5000) {
				r.push(`enormous`);
			} else if (eventSlave.boobs > 3200) {
				r.push(`giant`);
			} else if (eventSlave.boobs > 1600) {
				r.push(`huge`);
			} else if (eventSlave.boobs > 800) {
				r.push(`big`);
			} else if (eventSlave.boobs > 300) {
				r.push(`modest`);
			} else {
				r.push(`flat`);
			}
			if (eventSlave.boobs > 300) {
				r.push(`tits`);
			} else {
				r.push(`chest`);
			}

			if (eventSlave.areolae > 2){
				r.push(`, barely covering her huge areolas`);
			}

			r.push(`and ${eventSlave.nipples} nipples.`);

			if (eventSlave.boobs > 1600){
				r.push(`The size of ${his} breasts makes it appear as if the delicate piece of food is about to swallowed by an ocean of undulating flesh.`);
			}

			r.push(`Four pieces of the sliced seafood are laid out on ${his}`);

			if (eventSlave.belly >= 750000) {
				if (eventSlave.bellyPreg > 0) {
					r.push(`grotesquely pregnant`);
				} else {
					r.push(`grotesquely inflated`);
				}
			} else if (eventSlave.belly >= 600000) {
				if (eventSlave.bellyPreg > 0) {
					r.push(`dangerously pregnant`);
				} else {
					r.push(`dangerously distended`);
				}
			} else if (eventSlave.belly >= 450000) {
				if (eventSlave.bellyPreg > 0) {
					r.push(`immensely pregnant`);
				} else {
					r.push(`immensely distended`);
				}
			} else if (eventSlave.belly >= 150000) {
				if (eventSlave.bellyPreg > 0) {
					r.push(`massively pregnant`);
				} else {
					r.push(`massively distended`);
				}
			} else if (eventSlave.belly >= 120000) {
				if (eventSlave.bellyPreg > 0) {
					r.push(`enormously pregnant`);
				} else {
					r.push(`greatly gravid`);
				}
			} else if (eventSlave.belly >= 10000) {
				if (eventSlave.bellyPreg > 3000) {
					r.push(`heavily pregnant`);
				} else if (eventSlave.bellyImplant > 3000) {
					r.push(`very gravid`);
				} else {
					r.push(`taut`);
				}
			} else if (eventSlave.belly >= 5000) {
				if (eventSlave.bellyPreg > 3000) {
					r.push(`very pregnant`);
				} else if (eventSlave.bellyImplant > 3000) {
					r.push(`gravid`);
				} else {
					r.push(`distended`);
				}
			} else if (eventSlave.belly >= 1500) {
				if (eventSlave.bellyPreg > 0) {
					r.push(`slightly pregnant`);
				} else if (eventSlave.bellyImplant > 0) {
					r.push(`slightly distended`);
				} else {
					r.push(`bloated`);
				}
			}

			r.push(`belly, with one over ${his} navel, hiding it from sight.`);
			r.push(`Your eyes trace over the`);

			if (eventSlave.weight > 10){
				r.push(`curves of ${his} soft`);
			} else if (eventSlave.muscles > 6){
				r.push(`lines of ${his} toned`);
			} else {
				r.push(`line of ${his} flat`);
			}

			r.push(`midriff, and down towards ${his}`);

			if (eventSlave.vagina !== -1){
				r.push(`pussy`);
			} else if (eventSlave.dick !== 0){
				r.push('cock');
			} else {
				r.push(`groin`);
			}

			r.push(`as a final piece of fish is placed right above it.`);

			r.toParagraph();

			r.push(`As you resume your work, you begin plucking pieces of the prepared fish off of the slave's vulnerable body, savoring the freshness and mouth-watering flavor of this rare food. Starting at ${his}`);

			if (eventSlave.boobs > 40000) {
				r.push(`beanbag-sized`);
			} else if (eventSlave.boobs > 25000) {
				r.push(`torso-covering`);
			} else if (eventSlave.boobs > 10000) {
				r.push(`obscenely massive`);
			} else if (eventSlave.boobs > 5000) {
				r.push(`beachball-sized`);
			} else if (eventSlave.boobs > 3200) {
				r.push(`arm-filling`);
			} else if (eventSlave.boobs > 1600) {
				r.push(`head-sized`);
			} else if (eventSlave.boobs > 800) {
				r.push(`big`);
			} else if (eventSlave.boobs > 300) {
				r.push(`modest`);
			}
			if (eventSlave.boobs > 300) {
				r.push(`tits`);
			} else {
				r.push(`chest`);
			}

			r.push(`you pluck at ${his} ${eventSlave.nipples} nipples, eliciting a moan as ${eventSlave.slaveName} helplessly squirms under your teasing. You calmly remind ${him} that such a delicacy is hard to come by, and warn ${him} against dropping any of the pieces. Otherwise, there will be consequences.`);

			if (eventSlave.trust > 50){
				r.push(`${eventSlave.slaveName} pokes ${his} tongue out at you playfully and shakes ${his} body, confident that any punishment you can bring forth will only mean more time that ${he} can spend in your presence.`);
			} else {
				r.push(`Fear flashes across the slave's face as they will their body to be still. ${eventSlave.slaveName} imagines the punishment that could possibly result from ruining ${his} ${Master}'s meal and shudders at the thought, causing the remaining pieces of sushi to precariously teeter atop ${his} body.`);
			}

			r.push(`You work your way down ${his} belly, and arrive at the final piece above ${his}`);

			if (eventSlave.vagina !== -1){
				r.push(`wet pussy.`);
			} else if (eventSlave.dick !== 0){
				r.push('throbbing cock.');
			} else {
				r.push(`groin.`);
			}

			r.push(`Eyeing the piece of food, as well as the last piece of sushi, you decide to play with it for a little.`);

			if (eventSlave.piercing.genitals.weight > 0){
				r.push(`You wrap your chopsticks around the glinting piercing at your slave's waist and give it a sharp tug, causing ${eventSlave.slaveName} to scream out in equal parts pain and pleasure.`);
			} else if (eventSlave.vagina !== -1){
				r.push(`You use the chopsticks to fondle with ${his} clit roughly, causing ${eventSlave.slaveName} to gasp out in surprise. Spreading ${him} open, you use your tongue to edge ${him} towards climax.`);
			} else if (eventSlave.dick > 0){
				r.push(`You use the chopsticks to grip with ${his} dick roughly, causing ${eventSlave.slaveName} to gasp out in surprise. Using the utensils to tease and stroke ${his}`);

				if (eventSlave.dick > 4) {
					r.push(`gigantic cock,`);
				} else if (eventSlave.dick > 2) {
					r.push(`impressive erection,`);
				} else if (eventSlave.dick > 0) {
					r.push(`little penis,`);
				}

				r.push(`you skillfully work ${him} towards climax, and he shoots ${his} seed in ropes across his body.`);
			} else {
				r.push(`You use the chopsticks to tease ${his} needy hole, causing ${eventSlave.slaveName} to gasp out in surprise. Spreading ${him} open, you use your tongue to edge ${him} towards climax.`);
			}

			r.toParagraph();

			r.push(`Under your eager attention, ${eventSlave.slaveName} collapses in a moaning, writhing puddle on your desk. You clean your mouth with a handkerchief and tell her to get back to her assignment before calling in another slave to clean up the mess.`);

			r.toParagraph();

			if (eventSlave.trust > 20 || eventSlave.devotion > 20) {
				r.push(`As ${he} goes about the rest of ${his} day, ${eventSlave.slaveName} recalls the events of the morning and smiles. ${He} enjoyed the attention that you lavished on ${him}, and wonders if such an opportunity will ever arise again.`);
				eventSlave.trust += 5;
			} else {
				r.push(`After being carried out and cleaned up, ${eventSlave.slaveName} avoids walking past your office for the remainder of the day, worried that ${he} might catch your eye and be called to entertain you again.`);
				eventSlave.trust -= 5;
			}

			r.toParagraph();

			return r.container();
		}
	}
};


code:
App.Events.PECombatTraining = class PECombatTraining extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => S.Bodyguard && S.Bodyguard.skill.combat === 0
		];
	}

	get weight() {
		return 3;
	}

	execute(node) {
		let r = [];

		App.Events.drawEventArt(node, S.Bodyguard);
		const {
			He,
			he, his, him, hers
		} = getPronouns(S.Bodyguard);

		r.push(
			App.UI.DOM.slaveDescriptionDialog(S.Bodyguard),
			`has many duties as a bodyguard, and ${his} schedule is carefully built to allow ${him} to complete them. When you're at your desk in your penthouse and there are no guests to intimidate, ${his} services are least needed, so ${he} typically uses these lulls to catch up on sleep or train.`
		);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`The feed from the small armory next door shows ${him} doing the latter. ${He} has finished working with a heavy practice sword, and has moved to the tiny, one-shooter range. ${He} seems frustrated, hurrying ${his} shots and missing unnecessarily.`);

		App.Events.addParagraph(node, r);

		App.Events.addResponses(node, [
			new App.Events.Result(`Instruct ${him}`, instruct),
			new App.Events.Result(`Promise ${him} a sexual reward if ${he} improves`, reward, willTake()),
		]);

		function instruct() {
			S.Bodyguard.trust += 4;
			S.Bodyguard.skill.combat = 1;
			return `${S.Bodyguard.slaveName} starts as you enter the range and don ear protection. ${He} is distracted by your body against ${hers} as you come in close to correct ${his} stance, but ${he} concentrates hard for you. You take whatever time you can spare over the week for serious lessons. ${He} is diligent and learns well, and places greater trust in your judgment.`;
		}

		function reward() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`Over the feed, you tell ${S.Bodyguard.slaveName} that ${he} can have ${his} choice of sexual release if ${he} scores well on the next set of targets. ${He} concentrates desperately, trying to ignore ${his} mounting arousal as ${he} imagines enjoying`);
			if (S.Bodyguard.fetish === "none") {
				r.push(`passionate sexual`);
			} else if (S.Bodyguard.fetish === "boobs") {
				r.push(`breast`);
			} else {
				r.push(S.Bodyguard.fetish);
			}
			r.push(`play. ${He} barely makes the stated score, and hurries smiling in for ${his} reward. ${He} feels closer to you, but is distracted from any real learning and does not become a better fighter.`);
			S.Bodyguard.devotion += 4;
			if (canDoVaginal(S.Bodyguard)) {
				r.push(VCheck.Vaginal(S.Bodyguard, 1));
			} else if (canDoAnal(S.Bodyguard)) {
				r.push(VCheck.Anal(S.Bodyguard, 1));
			} else {
				seX(S.Bodyguard, "oral", V.PC);
			}
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function willTake() {
			if (canDoVaginal(S.Bodyguard) && (S.Bodyguard.vagina === 0)) {
				return `This option will take ${his} virginity`;
			} else if (!canDoVaginal(S.Bodyguard) && (S.Bodyguard.anus === 0)) {
				return `This option will take ${his} anal virginity`;
			}
		}
	}
};


code:
App.Events.PEHeadgirlConcubine = class PEHeadgirlConcubine extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => !!S.HeadGirl,
			() => !!S.Concubine,
			() => fuckSlavesLength() > 1,
			() => canTalk(S.Concubine),
			() => canSee(S.Concubine),
			() => canHear(S.Concubine),
			() => S.Concubine.fetish !== "mindbroken",
			() => canHold(S.Concubine),
			() => canWalk(S.Concubine),
		];
	}

	actorPrerequisites() {
		return [];
	}

	execute(node) {
		let r = [];
		const {
			He, His,
			he, him, his, girl
		} = getPronouns(S.HeadGirl);
		const belly = bellyAdjective(S.HeadGirl);

		const {
			His2, He2,
			his2, he2, him2, wife2, girl2
		} = getPronouns(S.Concubine).appendSuffix("2");
		const bellyCon = bellyAdjective(S.Concubine);

		const {
			HeA,
			heA, hisA, himA, himselfA
		} = getPronouns(assistant.pronouns().main).appendSuffix("A");

		App.Events.drawEventArt(node, [S.HeadGirl, S.Concubine]);

		const buttReady = (slave) => canDoAnal(slave) && slave.anus > 0;
		const vagReady = (slave) => canDoVaginal(slave) && slave.vagina > 0;

		const canDo = {
			anal: {
				HG: buttReady(S.HeadGirl),
				conc: buttReady(S.Concubine),
			},
			vaginal: {
				HG: vagReady(S.HeadGirl),
				conc: vagReady(S.Concubine),
			}
		};

		r.push(`You wake up one morning to find`, contextualIntro(V.PC, S.HeadGirl, true), `and`, contextualIntro(S.HeadGirl, S.Concubine, true), `waiting next to your bed. It's immediately obvious that they both have a minor item of business for you, since nothing was urgent enough to wake you early, and they evidently both came in to catch you at your normal hour of rising. They're kneeling side by side next to the`);
		if (S.HeadGirl.boobs >= 10000 && S.Concubine.boobs >= 10000) {
			r.push(`bed (a position that smashes their massive breasts together on one side),`);
		} else if (S.HeadGirl.belly >= 45000 && S.Concubine.belly >= 45000) {
			r.push(`bed (a position that forces their swollen middles to compete for space),`);
		} else if (S.HeadGirl.butt > 5 && S.Concubine.butt > 5) {
			r.push(`bed (a position that smashes their massive asses together on one side),`);
		} else {
			r.push(`bed,`);
		}
		r.push(`and it's also obvious that they've been filling the few minutes they've been waiting for you to wake up by making out. Their lips are moist, ${S.Concubine.slaveName}'s ${S.Concubine.skin} cheeks are a little flushed, and there's even a little unnoticed strand of saliva running from ${his2} mouth to ${S.HeadGirl.slaveName}'s. They both look at you expectantly, wondering whether to speak up or save their questions for after you take a moment to get ready for your day.`);

		App.Events.addParagraph(node, r);

		const choices = [];
		choices.push(new App.Events.Result(`Get right to work`, work));
		choices.push(new App.Events.Result(`Tease them while they meet with you`, tease));
		if (
			(canDo.anal.HG || canDo.vaginal.HG) &&
			(canDo.anal.conc || canDo.vaginal.conc) &&
			V.PC.belly + S.Concubine.belly < 50000 &&
			V.PC.belly + S.HeadGirl.belly < 50000
		) {
			choices.push(new App.Events.Result(`Double penetrate them while they meet with you`, double));
		}
		App.Events.addResponses(node, choices);

		function work() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You didn't get to where you are by lying around on the job. You`);
			if (V.PC.belly < 5000) {
				r.push(`spring`);
			} else if (V.PC.belly < 10000) {
				r.push(`pull yourself`);
			} else {
				r.push(`slowly slip your gravid bulk`);
			}
			r.push(`out of bed and head straight towards your office and its desk to get some work done with your first rush of morning energy before your ablutions. Your Head Girl and Concubine follow along behind you; ${S.HeadGirl.slaveName} does ${his} best to keep up, because the sight of your`);

			if (S.HeadGirl.fetish === "pregnancy" && V.PC.belly >= 10000) {
				r.push(`increasingly large baby bump and motherly waddle`);
			} else if (S.HeadGirl.fetish === "cumslut" && V.PC.balls >= 20) {
				r.push(`over-burdened scrotum in motion as you walk`);
			} else if (S.HeadGirl.attrXX > 65 && S.HeadGirl.attrXY > 65 && V.PC.dick !== -1 && (V.PC.boobs >= 650 || V.PC.title === 0 || V.PC.vagina !== -1)) {
				r.push(`dangling penis`);
				if (V.PC.boobs >= 650) {
					r.push(`and bouncing boobs`);
				} else if (V.PC.vagina !== -1) {
					r.push(`and a hint of the pussy under it`);
				} else {
					r.push(`on such a feminine body`);
				}
				r.push(`in motion as you walk`);
			} else if (S.HeadGirl.attrXY > 65) {
				if (V.PC.dick !== 0) {
					r.push(`dangling penis`);
				} else if (V.PC.title === 1) {
					r.push(`masculine body nude`);
				} else {
					r.push(`beloved body nude`);
				}
				r.push(`in motion as you walk`);
			} else if (S.HeadGirl.attrXX > 65) {
				if (V.PC.boobs >= 300) {
					if (V.PC.boobs >= 1400) {
						r.push(`huge boobs from behind`);
					} else {
						r.push(`bare boobs`);
					}
				} else if (V.PC.vagina !== -1 && V.PC.dick === 0) {
					r.push(`bare pussy`);
				} else if (V.PC.vagina !== -1 && V.PC.dick !== 0) {
					r.push(`bare pussy under your maleness`);
				} else if (V.PC.title === 0) {
					r.push(`feminine body`);
				} else {
					r.push(`beloved body nude`);
				}
				r.push(`in motion as you walk`);
			} else {
				r.push(`beloved body nude in motion as you walk`);
			}
			r.push(`is something ${he} openly enjoys, while ${S.Concubine.slaveName} at least tries to be a little more modest. You sit down at your desk, taking in the situation in your domain at a glance as ${V.assistant.name}`);
			switch (V.assistant.appearance) {
				case "monstergirl":
					r.push(`springs into monstrous life on the glass desktop, eyes flashing and hair writhing.`);
					break;
				case "shemale":
					r.push(`pops up on the glass desktop, helicoptering ${hisA} dick while ${heA} waits for instructions.`);
					break;
				case "amazon":
					r.push(`appears to smash through the glass desktop, landing in a crouch to wait for orders.`);
					break;
				case "businesswoman":
					r.push(`appears on the glass desktop, sitting primly in ${hisA} own chair and waiting for instructions.`);
					break;
				case "fairy":
					r.push(`appears on the glass desktop, pressing ${hisA} face against the screen.`);
					break;
				case "pregnant fairy":
					r.push(`appears on the glass desktop, gingerly pressing ${hisA} face and belly against the screen.`);
					break;
				case "goddess":
					r.push(`gleams into existence on the glass desktop, reclining in a glow of maternal glory while ${heA} waits for direction.`);
					break;
				case "hypergoddess":
					r.push(`gleams into existence on the glass desktop, shifting ${hisA} gravid bulk so that it rests firmly on your desk.`);
					break;
				case "loli":
					r.push(`appears on the glass desktop, facing away from you. ${HeA} spins around with a start, a finger up ${hisA} nose, before quickly brushing ${himselfA} off and pretending ${heA} wasn't doing anything.`);
					break;
				case "preggololi":
					r.push(`appears on the glass desktop, idly stroking ${hisA} pregnancy as ${heA} awaits your command.`);
					break;
				case "schoolgirl":
					r.push(`appears on the glass desktop, sitting in ${hisA} own chair and waiting for instructions with ${hisA} legs spread a little wide for such a short skirt.`);
					break;
				case "angel":
					r.push(`appears on the glass desktop, spreads ${hisA} wings and stretches before taking a seat and waiting for instructions.`);
					break;
				case "cherub":
				case "imp":
					r.push(`flutters into view on the glass desktop, hovering above the ground while awaiting instructions.`);
					break;
				case "incubus":
					r.push(`appears on the glass desktop, idly stroking ${hisA} erection and trying to catch your attention.`);
					break;
				case "succubus":
					r.push(`appears on the glass desktop and presses ${hisA} tits against the screen.`);
					break;
				case "witch":
					r.push(`suddenly appears on the glass desktop; ${heA} gasps and covers ${himselfA} when ${heA} realizes ${hisA} clothes didn't teleport with ${himA}.`);
					break;
				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
					r.push(`slowly coalesces together to form ${hisA} usual feminine figure and standing their blankly waiting for instruction.`);
					break;
				default:
					r.push(`appears as a glowing icon on the glass desktop, awaiting instructions.`);
			}
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`You look at ${S.HeadGirl.slaveName}, standing across the desk from you, and ${he} takes the cue and goes first. ${He} asks your permission to make a couple of last-minute changes to slaves' assignments for the day, and you ask about a couple of minor efficiency issues before giving ${him} the go ahead. Meanwhile, ${S.Concubine.slaveName} kneels beside your chair, resting ${his2}`);
			if (S.Concubine.bald === 0 && S.Concubine.hLength > 0) {
				r.push(S.Concubine.hColor);
			} else {
				r.push(`smooth`);
			}
			r.push(`head on your knee, ${his2}`);
			if (S.Concubine.dick > 8) {
				r.push(`limp, monstrous cock resting softly against one of your ankles.`);
			} else if (S.Concubine.boobs > 10000) {
				r.push(`titanic udders a nice cushion against your calves.`);
			} else if (S.Concubine.weight > 30) {
				r.push(`soft body cushioning nicely against your leg.`);
			} else if (S.Concubine.belly >= 100000) {
				r.push(`${bellyCon} belly resting warmly against your leg.`);
			} else if (S.Concubine.boobs > 1000) {
				r.push(`heavy breast resting against your calf on that side.`);
			} else {
				r.push(`chest warm against your calf on that side.`);
			}
			r.push(`${He2} places a`);
			if (S.Concubine.muscles > 50) {
				r.push(`strong`);
			} else {
				r.push(`soft`);
			}
			r.push(`hand on the inside of your shin and hugs your lower leg, sensual, but companionable rather than sexually insistent.`);
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`Your Head Girl exits, performing the proper formalities and then hurrying off to make sure the reassigned slaves get going. As ${he} withdraws ${he}`);
			if (S.HeadGirl.relationship <= -2) {
				r.push(`has eyes only for you; ${he}`);
			} else if (S.HeadGirl.relationship === -1) {
				r.push(`gives ${S.Concubine.slaveName} a look up and down, which ${his} slutty nature obliges ${him} to give everyone; then ${he}`);
			} else if (S.HeadGirl.relationshipTarget === V.ConcubineID) {
				if (S.HeadGirl.relationship === 1) {
					r.push(`gives ${his} friend ${S.Concubine.slaveName} a smile; then ${he}`);
				} else if (S.HeadGirl.relationship === 2) {
					r.push(`gives ${his} best friend ${S.Concubine.slaveName} a smile and a little wave; then ${he}`);
				} else if (S.HeadGirl.relationship === 3) {
					r.push(`gives ${his} fuckbuddy ${S.Concubine.slaveName} a flirty wink; then ${he}`);
				} else if (S.HeadGirl.relationship === 4) {
					r.push(`blows ${his} lover ${S.Concubine.slaveName} a kiss; then ${he}`);
				} else {
					r.push(`mouths "I love you" at ${his} ${wife2} ${S.Concubine.slaveName}; then ${he}`);
				}
			}
			switch (S.HeadGirl.fetish) {
				case "submissive":
					r.push(`catches ${his} lower lip behind ${his} teeth and gives you a blushing, sexually submissive look`);
					break;
				case "cumslut":
					if (V.PC.dick !== 0) {
						r.push(`focuses on your cock`);
					} else {
						r.push(`looks you in the eye`);
					}
					r.push(`and licks ${his} lips lasciviously`);
					break;
				case "humiliation":
					r.push(`flashes you and blushes artfully`);
					break;
				case "buttslut":
					if (canDoAnal(S.HeadGirl)) { // TODO: do we care about virginity?
						r.push(`cocks ${his} hips, pulls one buttock aside, and winks ${his} asshole in your direction`);
					} else {
						r.push(`looks you in the eye and gives ${his} booty a slap`);
					}
					break;
				case "boobs":
					r.push(`looks you in the eye and gives ${his} boobs a little bounce`);
					break;
				case "pregnancy":
					r.push(`looks you in the eye and traces a hand across ${his} ${belly} belly`);
					break;
				case "dom":
					r.push(`gives you a cheerful, sexually challenging wink`);
					break;
				case "sadist":
					r.push(`gives you a significant glance, as between sadists,`);
					break;
				case "masochist":
					r.push(`looks at you and gives ${his} own butt a light slap`);
					break;
				default:
					r.push(`looks at you and adds a bit of extra sway to ${his} hips`);
			}
			r.push(`on ${his} way out the door. When ${he}'s gone, your Concubine speaks up from ${his2} adoring embrace of your leg. ${He2} asks a little aesthetic question about one of your other bedslaves, ${his2}`);
			if (S.Concubine.voice < 2) {
				r.push(`deep voice rumbling against your knee.`);
			} else if (S.Concubine.voice > 2) {
				r.push(`high voice humming against your knee.`);
			} else {
				r.push(`feminine voice purring against your knee.`);
			}
			r.push(`You chat with ${him2} about how you'd like the bedslave to look and act, ideally, and do other work while running your fingers`);
			if (S.Concubine.bald === 0 && S.Concubine.hLength > 0) {
				r.push(`through your Concubine's`);
				if (S.Concubine.hLength < 10) {
					r.push(`short`);
				}
				r.push(`hair.`);
			} else {
				r.push(`along your Concubine's`);
				if (S.Concubine.bald === 1) {
					r.push(`bald`);
				} else {
					r.push(`shaved`);
				}
				r.push(`head.`);
			}
			r.push(`Your Head Girl's confident assistance managing your chattel and your Concubine's devoted comfort as you work allows you to <span class="cash inc">be unusually productive</span> all morning.`);
			cashX(5000, "event", S.HeadGirl);

			App.Events.addParagraph(frag, r);
			return frag;
		}

		function tease() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You tell them to go ahead, ${S.HeadGirl.slaveName} first, but you flip the sheet back and pat the soft mattress on either side of you while you do. They laugh and clamber on up, ${S.HeadGirl.slaveName} first, and ${he} manages to drag a ${S.HeadGirl.nipples} nipple across your`);
			if (V.PC.boobs >= 300) {
				r.push(`own bare breasts`);
			} else if (V.PC.title === 0) {
				r.push(`flat chest`);
			} else {
				r.push(`chest`);
			}
			r.push(`as ${he}`);
			if (V.PC.belly >= 10000 || S.HeadGirl.boobs > 10000 || S.HeadGirl.belly >= 5000 || S.HeadGirl.dick > 20 || S.HeadGirl.balls > 20) {
				r.push(`struggles to get`);
			} else {
				r.push(`climbs`);
			}
			r.push(`over you. Once ${he}'s situated under the crook of your arm,`);
			if (S.HeadGirl.boobs > 25000) {
				r.push(`the huge weight of ${his} boobs pressing against your ribcage,`);
			} else if (S.HeadGirl.belly >= 10000) {
				r.push(`the huge weight of ${his} ${belly} middle pressing against your body,`);
			} else if (S.HeadGirl.dick > 4 && canAchieveErection(S.HeadGirl)) {
				r.push(`which presses ${his} absurd erection against your hip,`);
			} else if (S.HeadGirl.dick > 5) {
				r.push(`which leaves ${his} absurd dick resting across your lap,`);
			} else if (S.HeadGirl.energy > 95) {
				r.push(`making the eager heat between the nympho's legs quite noticeable against your hip,`);
			} else {
				r.push(`${his} body warm against you,`);
			}
			r.push(`${he} clears ${his} throat and asks your permission to make a couple of last-minute changes to slaves' assignments for the day.`);
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`As ${he} did so, you were encircling your`);
			if (girl === girl2) {
				r.push(`${girl}s`);
			} else {
				r.push(`lovers`);
			}
			r.push(`in your`);
			if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
				r.push(`powerful arms.`);
			} else if (V.PC.title === 1) {
				r.push(`dominant grip.`);
			} else {
				r.push(`loving grip.`);
			}
			r.push(`Cupping your Head Girl's butt in your left hand and your Concubine's in your right, you give them a good squeeze as ${S.HeadGirl.slaveName} finishes ${his} question. ${His} voice rises cutely as your marauding hand moves over the`);
			if (S.HeadGirl.butt > 10) {
				r.push(`endless expanse of ${his} backside. ${He} manages to finish, but trails off into a groan, the`);
				if (Math.floor(S.HeadGirl.buttImplant / S.HeadGirl.butt) > .60) {
					r.push(`firm`);
				} else {
					r.push(`soft`);
				}
				r.push(`flesh quivering against your palm.`);
			} else {
				r.push(`place between ${his}`);
				if (S.HeadGirl.butt > 6) {
					r.push(`huge`);
				} else if (S.HeadGirl.butt > 3) {
					r.push(`healthy`);
				} else {
					r.push(`cute`);
				}
				r.push(`buttocks and you slowly`);
				if (canDoAnal(S.HeadGirl)) {
					r.push(`press a single malicious finger in against ${his}`);
					if (S.HeadGirl.anus > 2) {
						r.push(`loose asspussy.`);
					} else if (S.HeadGirl.butt > 0) {
						r.push(`practiced asshole.`);
					} else {
						r.push(`virgin pucker.`);
					}
					r.push(`${He} manages to finish, but trails off into a groan, the warm, crinkled skin spasming against the teasing digit.`);
				} else {
					r.push(`trace the perimeter of ${his} chastity. ${He} manages to finish, but trails off into a groan, ${his} rump tightening around the invading hand.`);
				}
			}
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`${S.Concubine.slaveName} laughs at ${him} and asks ${his2} own question, a little aesthetic question about one of your other bedslaves, but something you like to exercise artistic control over. ${His2} giggling is cut off as ${he2} has to concentrate on getting ${his2} words out as you use two fingers to massage and tease the sensitive skin between ${his2} ass and`);
			if (S.Concubine.vagina > -1) {
				r.push(`the start of ${his2} cunt.`);
			} else if (S.Concubine.scrotum > 0) {
				r.push(`${his2} ballsack.`);
			} else {
				r.push(`the base of ${his2} dick.`);
			}
			r.push(`It's ${S.HeadGirl.slaveName}'s turn to laugh, which ${he} does throatily, ${his} warm breath gusting deliciously across your`);
			if (V.PC.boobs >= 300 || V.PC.title === 0) {
				r.push(`hardening nipples.`);
			} else {
				r.push(`pecs.`);
			}
			r.push(Spoken(S.HeadGirl, `"See, it's not easy,"`));
			r.push(`${he} breathes across you at your Concubine.`);
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`They soon get their revenge as you give them their orders, though, moving their expert hands between your legs to give you a handjob. They do it cooperatively as you continue to play with them, letting you enjoy the delightful sensation of`);
			if (V.PC.dick !== 0) {
				r.push(`two hands working your shaft while`);
				if (V.PC.vagina !== -1) {
					r.push(`another massages your petals and a fourth delves two fingers inside you.`);
				} else {
					r.push(`another tickles your frenulum and a fourth massages your balls.`);
				}
			} else {
				r.push(`a hand massaging your petals on either side while another delves two fingers inside you and a fourth pleasures your clit.`);
			}
			r.push(`They crane their necks to rain kisses on your chin, neck,`);
			if (V.PC.boobs >= 300) {
				r.push(`breasts, and nipples,`);
			} else if (V.PC.title === 0) {
				r.push(`and nipples,`);
			} else {
				r.push(`and chest,`);
			}
			r.push(`and on each other's mouths. You`);
			if (V.PC.belly < 5000) {
				r.push(`spring`);
			} else if (V.PC.belly < 10000) {
				r.push(`pull yourself`);
			} else {
				r.push(`slowly tip your gravid bulk`);
			}
			r.push(`out of bed when you're satisfied, pulling your leadership with you towards the shower, and they <span class="trust inc">trustingly bounce up to follow.</span>`);
			S.HeadGirl.trust += 4;
			S.Concubine.trust += 4;
			seX(S.HeadGirl, "oral", S.Concubine, "oral");

			App.Events.addParagraph(frag, r);
			return frag;
		}

		function double() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You sit up and order ${S.HeadGirl.slaveName} up onto the bed, on ${his} back, and while ${he}'s`);
			if (S.HeadGirl.energy > 95) {
				r.push(`eagerly obeying,`);
			} else {
				r.push(`obediently getting situated,`);
			}
			r.push(`you tell ${S.Concubine.slaveName} to ride ${him}, reverse cowgirl. ${He2} straddles your Head Girl,`);
			if (S.Concubine.butt > 6) {
				r.push(`using ${his2} hands to situate ${his2} huge buttocks.`);
			} else if (S.Concubine.belly >= 10000) {
				r.push(`making sure ${his2} ${bellyCon} belly is comfortably positioned.`);
			} else if (S.Concubine.boobs > 4000) {
				r.push(`making ${his2} heavy boobs sway deliciously.`);
			} else {
				r.push(`carefully situating ${his2} legs astride ${S.HeadGirl.slaveName}'s hips.`);
			}
			r.push(`You plant a hard kiss on ${S.Concubine.slaveName}'s mouth, pressing ${him2} backwards`);
			if (S.HeadGirl.belly >= 10000) {
				r.push(`into ${S.HeadGirl.slaveName}'s taut belly`);
			}
			r.push(`as you maneuver yourself into place${(V.PC.dick === 0) ? " and don a strap-on, since there isn't enough space for tribbing to work here" : ""}.`);
			if (canDo.vaginal.conc) {
				/* this is up here to give the PC priority on pregnancy */
				if (canImpreg(S.Concubine, V.PC)) {
					knockMeUp(S.Concubine, 10, 0, -1);
				}
				seX(S.Concubine, "vaginal", V.PC);
				r.push(`${He2} moans into you as ${he2} feels you run`);
				if (V.PC.dick === 0) {
					r.push(`the cool head of the phallus`);
				} else {
					r.push(`your cockhead`);
				}
				r.push(`along ${his2}`);
				if (S.Concubine.labia > 0) {
					r.push(`generous`);
				}
				r.push(`labia before plunging it inside ${him2}. Getting the idea, ${S.HeadGirl.slaveName}`);
				if (canPenetrate(S.HeadGirl)) {
					if (canDo.anal.conc) {
						if (S.HeadGirl.dick - S.Concubine.anus > 2) {
							r.push(`gently pushes ${his} cock up ${S.Concubine.slaveName}'s ass, since ${he} knows your Concubine's anus will be a little tight around ${his} imposing dick.`);
						} else if (S.HeadGirl.dick - S.Concubine.anus > 0) {
							r.push(`pushes ${his} cock up ${S.Concubine.slaveName}'s ass, since ${he} knows your Concubine can take ${his} dick without too much trouble.`);
						} else {
							r.push(`shoves ${his} cock up ${S.Concubine.slaveName}'s ass, since ${he} knows your Concubine can take ${his} dick with ease.`);
						}
						if (V.PC.dick !== 0) {
							r.push(`You feel the penetration through ${S.Concubine.slaveName}'s vaginal walls, an incredible sensation.`);
						}
						if (canImpreg(S.Concubine, S.HeadGirl)) {
							knockMeUp(S.Concubine, 10, 1, S.HeadGirl.ID);
						}
						seX(S.Concubine, "anal", V.PC);
						seX(S.Concubine, "anal", S.HeadGirl);
					} else {
						r.push(`gently eases ${his} cock in beside you.`);
						if (V.PC.dick !== 0) {
							r.push(`The added friction against you in ${S.Concubine.slaveName}'s vagina feels incredible.`);
						}
						seX(S.Concubine, "vaginal", V.PC);
						seX(S.Concubine, "vaginal", S.HeadGirl);
						if (canImpreg(S.Concubine, S.HeadGirl)) {
							knockMeUp(S.Concubine, 10, 0, S.HeadGirl.ID);
						}
					}
				} else {
					r.push(`slides a hand down and`);
					if (canDo.anal.conc) {
						if (S.Concubine.anus > 3) {
							r.push(`fists ${S.Concubine.slaveName}'s loose ass, since that's what it takes to fill your Concubine's gaping asspussy.`);
						} else if (S.Concubine.anus === 3) {
							r.push(`starts to fuck ${S.Concubine.slaveName}'s soft anus with three fingers.`);
						} else if (S.Concubine.anus === 2) {
							r.push(`starts to fuck ${S.Concubine.slaveName}'s asspussy with two fingers.`);
						} else {
							r.push(`starts to fuck ${S.Concubine.slaveName}'s tight little backdoor with a finger.`);
						}
						if (V.PC.dick !== 0) {
							r.push(`You feel the penetration through ${S.Concubine.slaveName}'s vaginal walls, an incredible sensation.`);
						}
						seX(S.Concubine, "anal", V.PC);
					} else {
						r.push(`gently eases a few fingers in beside you.`);
						if (V.PC.dick !== 0) {
							r.push(`The added sensation in ${S.Concubine.slaveName}'s vagina feels incredible.`);
						}
						seX(S.Concubine, "vaginal", V.PC);
					}
				}
			} else {
				/* this is up here to give the PC priority on pregnancy */
				if (canImpreg(S.Concubine, V.PC)) {
					knockMeUp(S.Concubine, 10, 1, -1);
				}
				seX(S.Concubine, "anal", V.PC);
				seX(S.Concubine, "anal", S.HeadGirl);
				r.push(`Getting the idea, ${S.HeadGirl.slaveName}`);
				if (canPenetrate(S.HeadGirl)) {
					if (S.HeadGirl.dick - S.Concubine.anus > 2) {
						r.push(`gently pushes ${his} cock up ${S.Concubine.slaveName}'s ass, since ${he} knows your Concubine's anus will be a little tight around ${his} imposing dick.`);
					} else if (S.HeadGirl.dick - S.Concubine.anus > 0) {
						r.push(`pushes ${his} cock up ${S.Concubine.slaveName}'s ass, since ${he} knows your Concubine can take ${his} dick without too much trouble.`);
					} else {
						r.push(`shoves ${his} cock up ${S.Concubine.slaveName}'s ass, since ${he} knows your Concubine can take ${his} dick with ease.`);
					}
					r.push(`Then ${he} grabs ${S.Concubine.slaveName}`);
					if (!hasAnyLegs(S.Concubine)) {
						r.push(`by the stumps`);
					} else {
						r.push(`behind the ${hasBothLegs(S.Concubine) ? "knees" : "knee"}`);
					}
					r.push(`and spreads ${his2}`);
					if (hasBothLegs(S.Concubine)) {
						r.push(`legs`);
					} else {
						r.push(`cheeks`);
					}
					r.push(`as far as they'll go, rotating ${his2} hips to position ${him2} for another phallus up the butt.`);
					if (canImpreg(S.Concubine, S.HeadGirl)) {
						knockMeUp(S.Concubine, 10, 1, S.HeadGirl.ID);
					}
				} else {
					r.push(`slides a hand down and`);
					if (S.Concubine.anus > 3) {
						r.push(`fists ${S.Concubine.slaveName}'s loose ass, since that's what it takes to fill your Concubine's gaping asspussy.`);
					} else if (S.Concubine.anus === 3) {
						r.push(`starts to fuck ${S.Concubine.slaveName}'s soft anus with three fingers.`);
					} else if (S.Concubine.anus === 2) {
						r.push(`starts to fuck ${S.Concubine.slaveName}'s asspussy with two fingers.`);
					} else {
						r.push(`starts to fuck ${S.Concubine.slaveName}'s tight little backdoor with a finger.`);
					}
					r.push(`Then ${he} grabs ${S.Concubine.slaveName} behind a knee with ${his} other hand and rotates ${his2} hips to position ${him2} for additional anal penetration.`);
				}
				r.push(`Your Concubine shivers and moans as ${his2} sphincter accommodates`);
				if (V.PC.dick !== 0) {
					r.push(`your cock,`);
				} else {
					r.push(`the strap-on,`);
				}
				r.push(`too.`);
			}
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`You start to fuck ${him2}, and then ask ${him2} what ${he2} needed from you. The poor ${girl2} has to concentrate hard to remember why ${he2}'s here through the waterfall of sensations, but ${he2} manages it eventually, gasping out a little aesthetic question about one of your other bedslaves. You give ${him2} ${his2} answer and make ${him2} repeat it back. When you're satisfied, you grab ${his2}`);
			if (!hasAnyLegs(S.Concubine)) {
				r.push(`hips`);
			} else {
				r.push(hasBothLegs(S.Concubine) ? `ankles` : `ankle`);
			}
			r.push(`and pull them up, sliding ${him2} off your`);
			if (V.PC.dick !== 0) {
				r.push(`pole`);
			} else {
				r.push(`strap-on`);
			}
			r.push(`and ${S.HeadGirl.slaveName}'s`);
			if (canPenetrate(S.HeadGirl)) {
				r.push(`dick`);
			} else {
				r.push(`penetrating fingers`);
			}
			r.push(`with a lovely lewd noise. After appreciating the sight of ${his2} well-fucked`);
			if (canDo.anal.conc && canDo.vaginal.conc) {
				r.push(`holes,`);
			} else {
				r.push(`hole,`);
			}
			r.push(`you swing ${his2} ass over and deposit it on the bed, producing a grunt as the drop forces the wind out of ${him2}. Grabbing your Head Girl in turn, you yank ${him} towards you, give the giggling slave a kiss, seize ${his}`);
			if (S.HeadGirl.hips > 2) {
				r.push(`breeding`);
			} else if (S.HeadGirl.weight > 95) {
				r.push(`padded`);
			} else if (S.HeadGirl.weight > 10) {
				r.push(`plush`);
			} else if (S.HeadGirl.hips > 1) {
				r.push(`broad`);
			} else if (S.HeadGirl.hips >= 0) {
				r.push(`curvy`);
			} else {
				r.push(`trim`);
			}
			r.push(`hips and lift ${him} onto ${S.Concubine.slaveName}'s lap. ${He} takes`);
			if (canDo.vaginal.HG) {
				if (canDo.vaginal.conc) {
					if (canDo.anal.HG) {
						r.push(`${his} own double pounding, pussy and ass,`);
					} else {
						r.push(`${his} own double pounding,`);
					}
				} else {
					if (canDo.anal.HG) {
						r.push(`double penetration instead, since unlike your Concubine ${he} has two lower fuckholes,`);
					} else {
						r.push(`${his} own double pounding,`);
					}
				}
			} else {
				if (canDo.vaginal.HG) {
					r.push(`double anal instead, since unlike your Concubine`);
					if (S.HeadGirl.vagina === -1) {
						r.push(`${he} only has the one lower fuckhole,`);
					} else {
						r.push(`${his} pussy is off limits,`);
					}
				} else {
					r.push(`${his} own double anal pounding,`);
				}
			}
			r.push(`while taking ${his} turn getting instructions. ${He} manages to ask your permission to make a couple of last-minute changes to slaves' assignments for the day. Having thus given your leadership guidance, you jump up for a shower, crooking a finger to indicate that they should follow. They <span class="devotion inc">trail obediently after you,</span> a bit sore, their holes dripping`);
			if (S.HeadGirl.vagina > -1 || S.Concubine.vagina > -1) {
				if (V.PC.balls > 0 || S.HeadGirl.balls > 0 || S.Concubine.balls > 0) {
					r.push(`cum, pussyjuice, and lube.`);
				} else {
					r.push(`pussyjuice and lube.`);
				}
			} else {
				if (V.PC.balls > 0 || S.HeadGirl.balls > 0 || S.Concubine.balls > 0) {
					r.push(`cum and lube.`);
				} else {
					r.push(`lube.`);
				}
			}
			S.HeadGirl.devotion += 4;
			S.Concubine.devotion += 4;
			/* sex count cleanup for S.HeadGirl since the above block is not pretty */
			if (canDo.vaginal.HG) {
				if (canImpreg(S.HeadGirl, V.PC)) {
					knockMeUp(S.HeadGirl, 10, 0, -1);
				}
				seX(S.HeadGirl, "vaginal", V.PC);
				if (canPenetrate(S.Concubine)) {
					if (canDo.anal.HG) {
						if (canImpreg(S.HeadGirl, S.Concubine)) {
							knockMeUp(S.HeadGirl, 10, 1, V.ConcubineID);
						}
						seX(S.HeadGirl, "anal", S.Concubine);
					} else {
						if (canImpreg(S.HeadGirl, S.Concubine)) {
							knockMeUp(S.HeadGirl, 10, 0, V.ConcubineID);
						}
						seX(S.HeadGirl, "vaginal", S.Concubine);
					}
				} else {
					if (canDo.anal.HG) {
						seX(S.HeadGirl, "anal", V.PC);
					}
				}
			} else {
				if (canImpreg(S.HeadGirl, V.PC)) {
					knockMeUp(S.HeadGirl, 10, 1, -1);
				}
				seX(S.HeadGirl, "anal", V.PC);
				if (canPenetrate(S.Concubine)) {
					seX(S.HeadGirl, "anal", S.Concubine);
					if (canImpreg(S.HeadGirl, S.Concubine)) {
						knockMeUp(S.HeadGirl, 10, 1, V.ConcubineID);
					}
				}
			}

			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};