\
  The most prestigious law school admissions discussion board in the world.
BackRefresh Options Favorite

Not only is The Penis not going to make a new bort he's never going to do anythi

He's like that PSA about weed heads where they admit th...
utterly flailing faggot retard arsehole
  10/26/26
rude
The Penis
  10/26/26
How do I look at poasts without just guessing the poast numb...
utterly flailing faggot retard arsehole
  10/26/26
just use my damn scripts
The Penis
  10/26/26
How do I use a script? I'm an artist not a coder Jesus....
utterly flailing faggot retard arsehole
  10/26/26
download tampermonkey then figure out the right places to cl...
The Penis
  10/26/26
I can't even find the script in the other thread becaus...
utterly flailing faggot retard arsehole
  10/26/26
i just bumped a poast that has both of them in them
The Penis
  10/26/26
I found it but I am not prepared for this. I give up. I only...
utterly flailing faggot retard arsehole
  10/26/26
it's easy! just do it. you download an extension, and c...
The Penis
  10/26/26
I'll try tomorrow. Good day.
utterly flailing faggot retard arsehole
  10/26/26
// ==UserScript== // @name AutoAdmit / XO Tree Re...
The Penis
  10/26/26
// ==UserScript== // @name XO Full Poast Viewer ...
The Penis
  10/26/26
first one i just pasted lets you click a reply button to rep...
The Penis
  10/26/26
Great I don't care. Thank you for your service or somet...
utterly flailing faggot retard arsehole
  10/26/26
wow you're like that PSA about weed heads
The Penis
  10/26/26
I hate computer. There is nothing "OK" about compu...
utterly flailing faggot retard arsehole
  10/26/26
Is she right?
The Penis
  10/26/26
No and I decided I'm going to fuck her older sister jus...
utterly flailing faggot retard arsehole
  10/26/26
She better come correct
The Penis
  10/26/26
...
utterly flailing faggot retard arsehole
  10/26/26
hehe
reluctant uke
  10/26/26
...
The Penis
  10/26/26
he's a complete Joke imo
hex
  10/26/26
...
The Penis
  10/26/26


Poast new message in this thread



Reply Favorite

Date: October 26th, 2026 12:18 AM
Author: utterly flailing faggot retard arsehole

He's like that PSA about weed heads where they admit that people don't do crazy shit on weed but they just turn into vegetables.

Hth!

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202044)



Reply Favorite

Date: October 26th, 2026 12:19 AM
Author: The Penis

rude

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202045)



Reply Favorite

Date: October 26th, 2026 12:21 AM
Author: utterly flailing faggot retard arsehole

How do I look at poasts without just guessing the poast number by adding 1 until I find it?

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202047)



Reply Favorite

Date: October 26th, 2026 12:21 AM
Author: The Penis

just use my damn scripts

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202049)



Reply Favorite

Date: October 26th, 2026 12:23 AM
Author: utterly flailing faggot retard arsehole

How do I use a script? I'm an artist not a coder Jesus. ELI5

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202052)



Reply Favorite

Date: October 26th, 2026 12:24 AM
Author: The Penis

download tampermonkey then figure out the right places to click and copy and paste the two scripts i put in those other threads. let me know if you get stuck.

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202055)



Reply Favorite

Date: October 26th, 2026 12:26 AM
Author: utterly flailing faggot retard arsehole

I can't even find the script in the other thread because I don't have the link to the specific poast it's under...

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202057)



Reply Favorite

Date: October 26th, 2026 12:27 AM
Author: The Penis

i just bumped a poast that has both of them in them

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202059)



Reply Favorite

Date: October 26th, 2026 12:28 AM
Author: utterly flailing faggot retard arsehole

I found it but I am not prepared for this. I give up. I only go to websites that work have a good night.

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202063)



Reply Favorite

Date: October 26th, 2026 12:30 AM
Author: The Penis

it's easy! just do it. you download an extension, and click a button copy and paste and click maybe a few more buttons

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202065)



Reply Favorite

Date: October 26th, 2026 12:31 AM
Author: utterly flailing faggot retard arsehole

I'll try tomorrow.

Good day.

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202067)



Reply Favorite

Date: October 26th, 2026 12:28 AM
Author: The Penis

// ==UserScript==

// @name AutoAdmit / XO Tree Reply Rescue

// @namespace https://www.xoxohth.com/

// @version 0.3.0

// @description Restore per-poast reply links while XO's message pane is broken.

// @match *://www.xoxohth.com/thread.php*

// @match *://xoxohth.com/thread.php*

// @match *://www.autoadmit.com/thread.php*

// @match *://autoadmit.com/thread.php*

// @run-at document-idle

// @grant none

// ==/UserScript==

(() => {

'use strict';

if (document.getElementById('xo-reply-rescue')) return;

const params = new URL(location.href).searchParams;

const forumId = params.get('forum_id') || '2';

const threadId = params.get('thread_id') || '';

const rowDate = /\b\d{1,2}\/\d{1,2}\/\d{2,4}\b/;

const tagged = new WeakMap();

let rows = [];

let selected = null;

let initialNative = null;

let panelOpen = true;

function validId(x) {

return /^\d{1,15}$/.test(String(x || '')) && Number(x) > 0;

}

function urlFromString(str) {

try {

return new URL(str, location.href);

} catch {

return null;

}

}

function nativeReply() {

for (const a of document.querySelectorAll('a[href]')) {

if (a.closest('#xo-reply-rescue') ||

a.classList.contains('xo-tree-rescue-link')) continue;

const u = urlFromString(a.getAttribute('href'));

if (!u || u.origin !== location.origin ||

!/\/post\.php$/i.test(u.pathname)) continue;

const id = u.searchParams.get('parent_message_id');

if (validId(id)) return { id, url: u.href };

}

return null;

}

function newMessageUrl() {

for (const a of document.querySelectorAll('a[href]')) {

if (a.closest('#xo-reply-rescue')) continue;

const u = urlFromString(a.getAttribute('href'));

if (!u || u.origin !== location.origin ||

!/\/post\.php$/i.test(u.pathname)) continue;

if (u.searchParams.get('parent_thread_id') === threadId)

return u.href;

}

if (!validId(threadId)) return null;

const u = new URL('post.php', location.href);

u.searchParams.set('parent_thread_id', threadId);

u.searchParams.set('forum_id', forumId);

return u.href;

}

function replyUrl(messageId) {

if (!validId(messageId)) return null;

const example = nativeReply()?.url;

const u = example

? new URL(example)

: new URL('post.php', location.href);

if (u.origin !== location.origin ||

!/\/post\.php$/i.test(u.pathname)) return null;

u.searchParams.delete('parent_thread_id');

u.searchParams.set('parent_message_id', String(messageId));

u.searchParams.set('forum_id', forumId);

return u.href;

}

function extractId(element, row) {

const items = [

element,

element?.parentElement,

element?.closest('td'),

row

].filter(Boolean);

const seen = new Set();

const hints = [];

for (const el of items) {

if (seen.has(el)) continue;

seen.add(el);

for (const attr of el.attributes || []) {

if (attr.name === 'style' || attr.name === 'class') continue;

hints.push(`${attr.name}=${attr.value}`);

}

}

const joined = hints.join(' \n ');

const named =

/(?:^|[^a-z0-9_])(?:parent[-_]?message[-_]?id|message[-_]?id|msg[-_]?id|post[-_]?id|messageId|msgId|postId)\s*(?:=|:)\s*['"\\]?\s*(\d{1,15})\b/gi;

let match;

const namedCandidates = [];

while ((match = named.exec(joined))) {

if (validId(match[1]) && match[1] !== threadId)

namedCandidates.push(match[1]);

}

const uniqueNamed = [...new Set(namedCandidates)];

if (uniqueNamed.length === 1) {

return {

id: uniqueNamed[0],

source: 'named attribute',

certain: true

};

}

const jsFn =

/\b(?:show|load|get|view|select|display|open|expand|reply)[_$]?(?:message|msg|post|poast)\s*\(\s*['"]?(\d{1,15})\b/gi;

const functionCandidates = [];

while ((match = jsFn.exec(joined))) {

if (validId(match[1]) && match[1] !== threadId)

functionCandidates.push(match[1]);

}

const domId =

/(?:\b(?:id|name)=)(?:msg|message|post)[_-](\d{1,15})\b/i.exec(joined);

if (domId && validId(domId[1]) && domId[1] !== threadId) {

return {

id: domId[1],

source: 'DOM element ID',

certain: true

};

}

const uniqueFunctions = [...new Set(functionCandidates)];

if (uniqueFunctions.length === 1) {

return {

id: uniqueFunctions[0],

source: 'click handler',

certain: true

};

}

const fromCode = hints.filter(h =>

/^(?:href|onclick|ondblclick|onmousedown|onmouseup|data-)/i.test(h)

);

const numericCandidates = [

...new Set(

(fromCode.join(' ').match(/(?<!\d)\d{8,15}(?!\d)/g) || [])

.filter(x => x !== threadId)

)

];

if (numericCandidates.length === 1) {

return {

id: numericCandidates[0],

source: 'numeric click hint',

certain: false

};

}

return null;

}

function treeRowFor(a) {

let tr = a.closest('tr');

for (let i = 0; tr && i < 5; i++,

tr = tr.parentElement?.closest('tr')) {

const cells = [...tr.children].filter(x => x.tagName === 'TD');

if (cells.length >= 3 &&

cells[0].contains(a) &&

rowDate.test(tr.textContent || '')) {

return tr;

}

}

return null;

}

function collectRows() {

const entries = [];

const found = new Set();

for (const a of document.querySelectorAll('a')) {

if (a.closest('#xo-reply-rescue') ||

a.classList.contains('xo-tree-rescue-link')) continue;

if (!a.textContent?.trim()) continue;

const tr = treeRowFor(a);

if (!tr || found.has(tr)) continue;

const cells = [...tr.children].filter(x => x.tagName === 'TD');

const text = a.textContent.trim();

if (/^(back|refresh|options|reply|top|favorite|poast new message)/i.test(text))

continue;

found.add(tr);

entries.push({

row: tr,

anchor: a,

title: text,

author: (cells[1]?.textContent || '').trim(),

idInfo: null

});

}

return entries;

}

function make(node, tag, text, css) {

const el = document.createElement(tag);

if (text !== undefined) el.textContent = text;

if (css) el.style.cssText = css;

node.appendChild(el);

return el;

}

const styles = document.createElement('style');

styles.textContent = `

#xo-reply-rescue {

position:fixed;

bottom:12px;

right:12px;

width:320px;

z-index:2147483647;

box-sizing:border-box;

padding:11px;

background:#fffff2;

color:#181818;

font:13px/1.45 Arial,sans-serif;

border:1px solid #666;

box-shadow:0 3px 16px #0003;

border-radius:4px;

}

#xo-reply-rescue * { box-sizing:border-box; }

#xo-reply-rescue a {

color:#0645ad;

text-decoration:underline;

}

#xo-reply-rescue a.action {

display:block;

margin:7px 0 4px;

font-weight:bold;

}

#xo-reply-rescue button {

cursor:pointer;

padding:3px 6px;

font:12px Arial,sans-serif;

}

#xo-reply-rescue .small {

font:11px/1.4 Arial,sans-serif;

color:#444;

margin-top:6px;

}

#xo-reply-rescue .warn { color:#872b00; }

#xo-reply-rescue .controls {

display:flex;

flex-wrap:wrap;

gap:6px;

margin-top:7px;

}

#xo-reply-rescue textarea {

width:100%;

height:110px;

font:11px monospace;

margin-top:6px;

}

.xo-tree-rescue-link {

margin-left:8px !important;

color:#066428 !important;

font:normal 11px Arial,sans-serif !important;

text-decoration:underline !important;

}

tr.xo-tree-rescue-selected > td:first-child {

background:#ffffd9;

}

@media(max-width:500px) {

#xo-reply-rescue {

max-width:calc(100vw - 16px);

right:8px;

bottom:8px;

}

}

`;

document.head.append(styles);

const panel = document.createElement('aside');

panel.id = 'xo-reply-rescue';

const head = make(panel, 'div');

head.style.cssText =

'display:flex;align-items:center;justify-content:space-between;gap:10px';

make(head, 'strong', 'XO reply rescue');

const minimize = make(head, 'button', 'Hide');

minimize.type = 'button';

const content = make(panel, 'div');

const status = make(

content, 'div', 'Scanning thread…', 'margin-top:7px;'

);

const target = make(

content, 'div', '', 'margin-top:7px;'

);

const reply = make(content, 'a', '', 'display:none;');

reply.className = 'action';

const newMessage = make(

content, 'a', 'Poast new message in thread', 'display:none;'

);

newMessage.className = 'action';

const info = make(

content,

'div',

'Click a message title in the tree to select it. Green [reply] links are added when its message ID can be read.',

''

);

info.className = 'small';

const controls = make(content, 'div');

controls.className = 'controls';

const rescan = make(controls, 'button', 'Rescan');

rescan.type = 'button';

const debug = make(controls, 'button', 'Show diagnostics');

debug.type = 'button';

const diag = make(content, 'textarea');

diag.readOnly = true;

diag.style.display = 'none';

document.body.append(panel);

minimize.addEventListener('click', () => {

panelOpen = !panelOpen;

content.style.display = panelOpen ? '' : 'none';

minimize.textContent = panelOpen ? 'Hide' : 'Show';

});

function select(entry, idInfo) {

for (const r of rows)

r.row.classList.remove('xo-tree-rescue-selected');

selected = { ...entry, idInfo: idInfo || null };

entry.row.classList.add('xo-tree-rescue-selected');

update();

}

function update() {

const native = nativeReply();

const identified = rows.filter(r => r.idInfo).length;

status.textContent =

`Detected ${rows.length} tree posts; ${identified} reply target${identified === 1 ? '' : 's'} identified.`;

if (selected) {

const { idInfo, title, author } = selected;

target.textContent =

`Selected: ${title.slice(0, 100)}${author ? ` (${author})` : ''}`;

if (idInfo && validId(idInfo.id)) {

const u = replyUrl(idInfo.id);

reply.href = u || '#';

reply.textContent = `Reply to message ${idInfo.id}`;

reply.style.display = u ? 'block' : 'none';

info.textContent = idInfo.certain

? `Message ID from ${idInfo.source}. Opens XO's own posting form.`

: 'Message ID inferred from the click handler. Confirm it is the correct target before posting.';

info.className = idInfo.certain ? 'small' : 'small warn';

} else {

reply.style.display = 'none';

reply.removeAttribute('href');

info.textContent =

'This title did not expose a reliable message ID. Use Show diagnostics to inspect the clicked link.';

info.className = 'small warn';

}

} else {

target.textContent = 'Select a poast in the tree.';

if (native) {

reply.href = native.url;

reply.textContent = `Existing Reply link (message ${native.id})`;

reply.style.display = 'block';

info.textContent =

'Existing Reply link targets the page-selected post, which may be the root. Click a post first to choose a specific target.';

} else {

reply.style.display = 'none';

}

}

const newUrl = newMessageUrl();

newMessage.style.display = newUrl ? 'block' : 'none';

if (newUrl) newMessage.href = newUrl;

}

function rescanTree() {

for (const a of document.querySelectorAll('.xo-tree-rescue-link'))

a.remove();

rows = collectRows();

initialNative ||= nativeReply();

rows.forEach((entry, index) => {

let idInfo = extractId(entry.anchor, entry.row);

if (!idInfo && index === 0 && initialNative) {

idInfo = {

id: initialNative.id,

source: 'initial native reply link (root)',

certain: true

};

}

entry.idInfo = idInfo;

tagged.set(entry.anchor, entry);

if (!idInfo) return;

const link = document.createElement('a');

link.className = 'xo-tree-rescue-link';

link.textContent = '[reply]';

link.href = replyUrl(idInfo.id) || '#';

link.title =

`Reply to message ${idInfo.id}${idInfo.certain ? '' : ' (inferred)'}`;

link.addEventListener('click', event => {

event.stopPropagation();

if (!idInfo.certain &&

!confirm(

`Reply to inferred message ID ${idInfo.id}?\n\nVerify the target before submitting.`

)) {

event.preventDefault();

}

});

entry.anchor.insertAdjacentElement('afterend', link);

});

selected = null;

update();

}

document.addEventListener('click', e => {

const a = e.target.closest?.('a');

if (!a ||

a.classList.contains('xo-tree-rescue-link') ||

a.closest('#xo-reply-rescue')) return;

const entry = tagged.get(a);

if (!entry) return;

const oldId = nativeReply()?.id || '';

select(entry, entry.idInfo);

for (const delay of [80, 300, 1000]) {

setTimeout(() => {

if (selected?.anchor !== a) return;

const now = nativeReply();

if (now &&

now.id !== oldId &&

now.id !== initialNative?.id) {

entry.idInfo = {

id: now.id,

source: 'XO native Reply link',

certain: true

};

selected.idInfo = entry.idInfo;

update();

}

}, delay);

}

}, true);

reply.addEventListener('click', e => {

if (selected?.idInfo && !selected.idInfo.certain) {

if (!confirm(

`Open XO's reply form for inferred message ${selected.idInfo.id}?\n\nVerify the target before posting.`

)) e.preventDefault();

}

});

rescan.addEventListener('click', rescanTree);

debug.addEventListener('click', () => {

const a = selected?.anchor;

const row = selected?.row;

diag.style.display =

diag.style.display === 'none' ? 'block' : 'none';

debug.textContent =

diag.style.display === 'none'

? 'Show diagnostics'

: 'Hide diagnostics';

const attributes = el => el

? [...el.attributes].reduce((out, p) => {

if (!/^(?:href|onclick|id|name|data-[\w-]+)$/i.test(p.name))

return out;

if (/token|session|csrf|secret|auth/i.test(p.name))

return out;

out[p.name] = p.value

.slice(0, 500)

.replace(

/((?:csrf|token|sid|session|auth|secret|api_key|key)\s*[=:]\s*['"]?)[^&#'"\s;]+/gi,

'$1[REDACTED]'

);

return out;

}, {})

: null;

diag.value = JSON.stringify({

page: location.origin + location.pathname +

`?thread_id=${threadId}&forum_id=${forumId}`,

rowCount: rows.length,

identifiedCount: rows.filter(r => r.idInfo).length,

initialNativeId: initialNative?.id || null,

currentNativeId: nativeReply()?.id || null,

selected: selected && {

title: selected.title,

author: selected.author,

parsed: selected.idInfo,

anchor: attributes(a),

cell: attributes(a?.parentElement),

row: attributes(row)

},

examples: rows.slice(0, 3).map(r => ({

title: r.title,

parsed: r.idInfo,

anchor: attributes(r.anchor)

}))

}, null, 2);

if (diag.style.display !== 'none') diag.select();

});

rescanTree();

})();

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202061)



Reply Favorite

Date: October 26th, 2026 12:28 AM
Author: The Penis

// ==UserScript==

// @name XO Full Poast Viewer

// @namespace https://www.xoxohth.com/

// @version 0.2.0

// @description Recover missing XO message bodies from reply forms

// @match *://www.xoxohth.com/thread.php*

// @match *://xoxohth.com/thread.php*

// @match *://www.autoadmit.com/thread.php*

// @match *://autoadmit.com/thread.php*

// @grant none

// @run-at document-idle

// ==/UserScript==

(() => {

'use strict';

if (document.getElementById('xo-full-poast-viewer')) return;

const forumId =

new URL(location.href).searchParams.get('forum_id') || '2';

const dateRe = /\b\d{1,2}\/\d{1,2}\/\d{2,4}\b/;

const posts = [];

const known = new Set();

const cache = new Map();

let currentIndex = -1;

let latestRequest = 0;

let lastReport = {};

// Find individual posts in XO's existing reply tree.

for (const a of document.querySelectorAll('a[href^="#"]')) {

const match = /^#(\d{6,15})$/.exec(

a.getAttribute('href') || ''

);

if (!match || known.has(match[1])) continue;

let row = a.closest('tr');

for (

let i = 0;

i < 5 && row;

i++, row = row.parentElement?.closest('tr')

) {

const cols = [...row.children].filter(

c => c.tagName === 'TD'

);

if (

cols.length >= 3 &&

cols[0].contains(a) &&

dateRe.test(row.textContent)

) {

known.add(match[1]);

posts.push({

id: match[1],

title: a.textContent.trim(),

author: cols[1].textContent.trim(),

row,

a

});

break;

}

}

}

if (!posts.length) return;

// Viewer styling.

const css = document.createElement('style');

css.textContent = `

#xo-full-poast-viewer {

background: #fff;

border: 1px solid #aaa;

max-width: 950px;

padding: 14px;

margin: 22px 5px;

font: 13px/1.5 Arial, sans-serif;

color: #111;

}

#xo-full-poast-viewer button {

margin: 0 8px 0 0;

cursor: pointer;

}

#xo-full-poast-viewer .xo-body {

white-space: pre-wrap;

overflow-wrap: anywhere;

font: 14px/1.5 Arial, sans-serif;

padding: 10px 2px;

min-height: 55px;

}

#xo-full-poast-viewer .xo-meta {

color: #555;

font-size: 12px;

margin-top: 3px;

}

#xo-full-poast-viewer .xo-error {

color: #a22;

}

#xo-full-poast-viewer pre {

white-space: pre-wrap;

word-break: break-word;

background: #f4f4f4;

padding: 9px;

max-height: 250px;

overflow: auto;

}

tr.xo-full-selected > td:first-child {

background: #ffffdc;

}

`;

document.head.append(css);

// Create the replacement message display.

const viewer = document.createElement('section');

viewer.id = 'xo-full-poast-viewer';

viewer.innerHTML = `

<strong>XO full poast viewer</strong>

<div class="xo-meta" id="xo-viewer-status">

Click a poast title in the tree.

</div>

<h3 id="xo-viewer-title"

style="margin:12px 0 2px"></h3>

<div class="xo-meta" id="xo-viewer-author"></div>

<div class="xo-body" id="xo-viewer-body"></div>

<div style="margin:8px 0">

<button type="button" id="xo-viewer-prev">

← Previous

</button>

<button type="button" id="xo-viewer-next">

Next →

</button>

<a id="xo-viewer-reply" href="#">

Reply to this poast

</a>

</div>

<button type="button" id="xo-viewer-debug">

Show diagnostics

</button>

<pre id="xo-viewer-details" hidden></pre>

`;

const treeTable = posts[0].row.closest('table');

treeTable.insertAdjacentElement('afterend', viewer);

const el = id => viewer.querySelector('#' + id);

const status = el('xo-viewer-status');

const title = el('xo-viewer-title');

const author = el('xo-viewer-author');

const body = el('xo-viewer-body');

const reply = el('xo-viewer-reply');

function replyUrl(id) {

const u = new URL('post.php', location.href);

u.searchParams.set('parent_message_id', id);

u.searchParams.set('forum_id', forumId);

return u;

}

// Extract readable text appearing above the reply form.

// Remote HTML is never inserted directly into the page.

function textBeforeReplyForm(doc) {

const form = [...doc.querySelectorAll('form')]

.find(f => f.querySelector('textarea'));

const parts = [];

const blocks = new Set([

'P', 'DIV', 'TR', 'TD', 'TH',

'H1', 'H2', 'H3', 'H4',

'LI', 'BLOCKQUOTE', 'PRE',

'SECTION', 'ARTICLE', 'TABLE',

'BR', 'HR'

]);

const skip = new Set([

'SCRIPT', 'STYLE', 'NOSCRIPT',

'SVG', 'IFRAME', 'INPUT',

'TEXTAREA', 'SELECT', 'OPTION'

]);

let stopped = false;

function walk(node) {

if (stopped || node === form) {

if (node === form) stopped = true;

return;

}

if (node.nodeType === Node.TEXT_NODE) {

parts.push(node.nodeValue || '');

return;

}

if (node.nodeType !== Node.ELEMENT_NODE) return;

if (skip.has(node.tagName)) return;

if (blocks.has(node.tagName)) parts.push('\n');

for (const child of node.childNodes) {

walk(child);

}

if (blocks.has(node.tagName)) parts.push('\n');

}

walk(doc.body);

return parts.join('')

.replace(/\u00a0/g, ' ')

.replace(/\r/g, '')

.replace(/[ \t]+\n/g, '\n')

.replace(/\n[ \t]+/g, '\n')

.replace(/\n{3,}/g, '\n\n')

.trim();

}

// Parse the quote displayed above XO's reply entry box.

function parseReplyPage(html) {

const doc = new DOMParser().parseFromString(

html,

'text/html'

);

const text = textBeforeReplyForm(doc);

const formPresent = [

...doc.querySelectorAll('form')

].some(f => f.querySelector('textarea'));

const authorMatch =

/(?:^|\n)\s*Author\s*:\s*([^\n]+)/i.exec(text);

const dateMatch =

/(?:^|\n)\s*Date\s*:\s*([^\n]+)/i.exec(text);

const report = {

formPresent,

receivedCharacters: html.length,

textCharactersBeforeForm: text.length,

dateFound: !!dateMatch,

authorFound: !!authorMatch,

preview: text.slice(0, 450)

};

if (!formPresent || !authorMatch) {

return {

error:

'Could not identify the original poast ' +

'on the reply form.',

report

};

}

// Original content begins after its Author line.

const start =

authorMatch.index + authorMatch[0].length;

let original = text.slice(start).trim();

// Stop before XO's reply entry form heading.

const formHeading =

/(?:^|\n)\s*(?:Poast|Post)\s+Reply\b/i.exec(original);

if (formHeading) {

original = original.slice(

0,

formHeading.index

).trim();

}

// Remove XO's automatic thread link and separator.

original = original

.replace(/\n\s*(?:-{3,}|_{3,})\s*$/, '')

.replace(

/\n\s*\(?https?:\/\/(?:www\.)?(?:autoadmit|xoxohth)\.com\/thread\.php[^\n]*\)?\s*$/i,

''

)

.trim();

if (!original) {

return {

error:

'Reply form has author details ' +

'but no recoverable quote text.',

report

};

}

report.extractedCharacters = original.length;

return {

text: original,

author: authorMatch[1].trim(),

date: dateMatch?.[1].trim() || '',

report

};

}

// Fetch exactly one message when selected.

// Cache successfully recovered messages.

async function fetchPost(post) {

if (cache.has(post.id)) {

return cache.get(post.id);

}

const u = replyUrl(post.id);

const resp = await fetch(u, {

method: 'GET',

credentials: 'same-origin',

cache: 'no-store'

});

if (!resp.ok) {

throw new Error(

`Reply form returned HTTP ${resp.status}`

);

}

if (new URL(resp.url).origin !== location.origin) {

throw new Error(

'XO redirected the reply form to another origin.'

);

}

const parsed = parseReplyPage(await resp.text());

if (parsed.error) {

throw Object.assign(

new Error(parsed.error),

{ report: parsed.report }

);

}

cache.set(post.id, parsed);

return parsed;

}

// Display the selected message.

async function show(index) {

if (index < 0 || index >= posts.length) return;

const post = posts[index];

currentIndex = index;

const request = ++latestRequest;

document.querySelectorAll(

'tr.xo-full-selected'

).forEach(r => {

r.classList.remove('xo-full-selected');

});

post.row.classList.add('xo-full-selected');

title.textContent = post.title || '(untitled)';

author.textContent = post.author;

reply.href = replyUrl(post.id).href;

body.textContent = 'Loading full poast…';

body.classList.remove('xo-error');

status.textContent =

`Poast ${index + 1} of ${posts.length}` +

` • ID ${post.id}`;

try {

const data = await fetchPost(post);

// Ignore outdated requests if another post was clicked.

if (request !== latestRequest) return;

lastReport = data.report;

author.textContent =

`${data.author || post.author}` +

`${data.date ? ' • ' + data.date : ''}`;

body.textContent = data.text;

status.textContent =

`Poast ${index + 1} of ${posts.length}` +

` • ID ${post.id} • Full text recovered`;

} catch (err) {

if (request !== latestRequest) return;

lastReport =

err.report || { error: String(err) };

body.textContent =

`Could not load this poast: ${err.message}`;

body.classList.add('xo-error');

status.textContent =

`Poast ${index + 1} of ${posts.length}` +

' • Recovery failed';

}

}

// Clicking the original tree title displays the full post.

for (const [index, post] of posts.entries()) {

post.a.addEventListener('click', event => {

if (

event.ctrlKey ||

event.metaKey ||

event.shiftKey ||

event.altKey

) return;

event.preventDefault();

show(index);

viewer.scrollIntoView({

behavior: 'smooth',

block: 'nearest'

});

});

}

// Previous / Next navigation.

el('xo-viewer-prev').onclick = () => {

show(currentIndex < 1 ? 0 : currentIndex - 1);

};

el('xo-viewer-next').onclick = () => {

show(Math.min(posts.length - 1, currentIndex + 1));

};

// Diagnostics if XO changes its HTML again.

el('xo-viewer-debug').onclick = () => {

const details = el('xo-viewer-details');

details.hidden = !details.hidden;

el('xo-viewer-debug').textContent =

details.hidden

? 'Show diagnostics'

: 'Hide diagnostics';

details.textContent = JSON.stringify({

postId: posts[currentIndex]?.id || null,

status: status.textContent,

...lastReport

}, null, 2);

};

// Display the currently selected post on initial load.

const startingIndex = posts.findIndex(

p => '#' + p.id === location.hash

);

show(startingIndex < 0 ? 0 : startingIndex);

})();

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202062)



Reply Favorite

Date: October 26th, 2026 12:29 AM
Author: The Penis

first one i just pasted lets you click a reply button to reply, second one lets you view poasts in a pane below each poast by clicking through them

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202064)



Reply Favorite

Date: October 26th, 2026 12:31 AM
Author: utterly flailing faggot retard arsehole

Great I don't care. Thank you for your service or something.

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202066)



Reply Favorite

Date: October 26th, 2026 12:31 AM
Author: The Penis

wow you're like that PSA about weed heads

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202068)



Reply Favorite

Date: October 26th, 2026 12:34 AM
Author: utterly flailing faggot retard arsehole

I hate computer. There is nothing "OK" about computer.

An 18 year old girl just told me that she doesn't believe I'm capable of 'getting play'. Absolutely devastating. I'm done here.

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202069)



Reply Favorite

Date: October 26th, 2026 12:44 AM
Author: The Penis

Is she right?

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202074)



Reply Favorite

Date: October 26th, 2026 12:45 AM
Author: utterly flailing faggot retard arsehole

No and I decided I'm going to fuck her older sister just to prove a point.

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202076)



Reply Favorite

Date: October 26th, 2026 12:49 AM
Author: The Penis

She better come correct

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202077)



Reply Favorite

Date: October 26th, 2026 12:53 AM
Author: utterly flailing faggot retard arsehole



(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202080)



Reply Favorite

Date: October 26th, 2026 12:37 AM
Author: reluctant uke

hehe

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202070)



Reply Favorite

Date: October 26th, 2026 12:43 AM
Author: The Penis



(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202073)



Reply Favorite

Date: October 26th, 2026 7:45 AM
Author: hex

he's a complete Joke imo

(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202207)



Reply Favorite

Date: October 26th, 2026 8:09 AM
Author: The Penis



(http://www.autoadmit.com/thread.php?thread_id=6000486&forum_id=2#50202223)