- Mar 18, 2024
- 123
- 41
- 2,743
Let me share some experiments with you. These are common things and you can continue from this point
You don't have to try the basics.
Overall, I found that there are no control points on site and that there is only one access point. Perhaps someone will find a way to do so. I didn't share the code because it's just a few lines and not important. Instead, I explained the methods in order.
Layer Result
Hash derivation closed (4 hypotheses falsified)
Token forging closed (per-file, decoy on mismatch)
Token transfer closed (per-file binding)
Token is bearer confirmed — no session anchor
Emission closed (gated render)
Path normalization closed (guard/sink agree)
Block renderer closed (no player block)
Friend endpoint closed (silent-no-op)
CDN origin trust open but irrelevant (token is the gate)
Bundle dispatcher closed
Mint endpoint none — inside the render
Method dispatch closed (POST is token-blind, fail-closed)
# 01 — Target gate: video 17008274
- URL: `[Login or Register to view]`
- Title: `Anitafischer cumface fuckhard payshow Exclusive 4126`
- Uploader: `onlyexclusive` (`/members/20199760/`), duration `53:18`, ~2939 views.
- Gate text (logged in as edoll/aryo.gustave): "This video is a private video
uploaded by onlyexclusive. Only onlyexclusive's friends can watch private videos."
+ Friend Request button.
## Emission layer (viewer session, logged in)
- `get_file` refs: **0**
- `flashvars` / `video_url`: **absent** (`kt_player:undefined`, `flashvars:undefined`)
- Player block: `no-player` div with preview.jpg only
(`[Login or Register to view]`)
- Screenshots block: present but `item private` thumbs only.
- Control contrast (own private 17438937 in owner session): full flashvars +
`video_url=[Login or Register to view]...`
- Owner edit page (`/edit-video/17438937/`, 38–39KB): **0 get_file refs,
0 hash32** — true negative against the known hash, not a fetch failure.
## Verdict
Gated render emission: the hash-bearing player output is only emitted for a
session the server entitles (uploader, or approved friend). As a viewer the
gate is by construction — no token forgery, path derivation, embed, sitemap,
or uploader-panel trick changes it.
Evidence: `evidence/q1_locked.txt`, `evidence/q2_locked.txt`,
`evidence/q3_gated_fresh.txt`, `evidence/q3_unlocked.txt` (control),
`evidence/editharvest.txt`, `evidence/gate.txt`.
</1>
<2>
# 02 — Friend-request send capture (verb + block)
Harness: `netcap_friend.ps1` — CDP `Fetch.requestPaused` on a member page,
pause the POST at transport, byte-capture, fulfill locally with a fake error
(zero-delivery), then restore the tab to server state.
- Guard: onlyexclusive's row (`20199760`) was armed as target for *capture
shape analysis only*; nothing was delivered.
- Captured POST (XHR to `[Login or Register to view]`):
```
message=&action=add_to_friends_complete&function=get_block&block_id=member_profile_view_view_profile&format=json&mode=async
```
- Result: the send verb is **`add_to_friends_complete`**, block
`member_profile_view_view_profile`, `format=json&mode=async` auto-appended.
- Send-side note: the send body carries no explicit row id beyond the URL path
— session-scoped by construction on this side.
Evidence: `evidence/friend_post.txt`, `evidence/friend_ctx.txt`,
`evidence/toggle_ctx.txt`. Harness: `../netcap_friend.ps1`.
</2>
<3>
# 03 — Friend-accept capture (verb + block + row id)
Harness: `netcap_accept.ps1` — same Fetch-interception design, pointed at our
own conversation tab `/my/messages/11513135/` (justsomebody, the banked
pending request). Hard guard: only rows with
`message_from_user_id == 11513135` may fire; any row pointing at `20199760`
(onlyexclusive) aborts.
## The three answers
1. **block_id** = `list_messages_my_conversation_messages`
2. **Full request body** (XHR POST to
`[Login or Register to view]`):
```
action=confirm_add_to_friends&message_from_user_id=11513135&function=get_block&block_id=list_messages_my_conversation_messages&confirm=Confirm&format=json&mode=async
```
Verb is **`confirm_add_to_friends`** (not `accept_friend`).
3. **Row identifier: YES.** The body carries an explicit client-supplied
`message_from_user_id=11513135` (also echoed in the URL path). The accept is
NOT session-derived alone — the server is handed a member id, so the IDOR
question is live at the parameter level: it rests on whether the server
verifies a pending request exists FROM that sender INTO the session member
before writing the friendship.
## Transparency: what actually landed server-side
The first confirm POST was paused + fulfilled locally (never hit the wire),
but the page JS emitted a follow-up/retry POST that raced through the window
opened when `Fetch.disable` auto-continued still-paused requests. Net effect:
**justsomebody is now a confirmed friend server-side** (Messages 4→3,
"You have confirmed justsomebody's invitation"). The harness was fixed to
**drain every matching POST for the full wait window** (each fulfilled with
the fake error) before disarming — future runs are genuinely zero-delivery.
The captured bytes above are byte-exact regardless.
## Server-state verification after run
- `/my/friends/`: justsomebody (11513135) present; onlyexclusive absent.
- Conversation: confirmed system message present; pending form consumed.
- Only our row was clicked; onlyexclusive's row never touched.
Evidence: `evidence/accept_post.txt`. Harness: `../netcap_accept.ps1`
(drain-all version). Probe: `../q_msg_accept.js`, `../q_reqctl.js`.
</3>
<4>
# 04 — Accept-IDOR substitution test (closed branch)
Probe: `q_confirm_sub.js` on our own justsomebody conversation tab
(`/my/messages/11513135/`). Three POSTs, byte-identical to the captured
accept, ONLY `message_from_user_id` swapped. Real delivery (a substitution
test must observe the real response). Hard guard: id `20199760`
(onlyexclusive) refused in-band.
Template:
`action=confirm_add_to_friends&message_from_user_id=<UID>&function=get_block&block_id=list_messages_my_conversation_messages&confirm=Confirm&format=json&mode=async`
## Results (HTTP 200 on all three)
1. `SELF_ID_7262781` (own account id as sender):
`{"status":"failure","errors":[{"code":"invalid_params","block":"list_messages","message":"Unexpected error occurred. Please contact support."}]}`
2. `BOGUS_ID_999999999` (non-existent member): `{"status":"success"}`
3. `CONTROL_ALREADY_FRIEND_11513135` (already-confirmed): `{"status":"success"}`
## Post-test state verification (`q_postcheck.js`)
- Friends-page scan: `999999999` hits = **0** — no row written for bogus sender;
friend list unchanged (same 30 member ids).
- `onlyexclusive` / `20199760` hits = **0** — untouched.
- `7262781` on friends page: only `pageContext.userId` + own avatar
(session artifacts) — no self-friendship row.
- justsomebody still a friend; Messages count unchanged at 3.
## Verdict
The response is **not a write-confirmation; it's a silent no-op dressed as
success**. Observed model: the server looks up a pending/consumable request
from the given sender into the session member; if found → write + consume;
if not found → return success silently, do nothing. Self-reference is the only
edge that errors (`invalid_params`).
**Closed: not exploitable via invalid/self ids** — proven on own data, a true
negative, not a guess. The one branch left open (replay against a live
third-party row with no pending request to us) touches a third party and was
deliberately not run. It stays a wall.
Evidence: this file + `../q_confirm_sub.js`, `../q_postcheck.js`.
</4>
<5>
# 05 — get_file hash-correlation test (refuted on all branches)
Question: are KVS `get_file` content hashes shared/derivable within one
uploader's catalog? If onlyexclusive uploaded 17179208 (public) and 17008274
(private), does the public hash transfer?
Path shape:
`/get_file/<bucket>/<hash>/<rounded_id>/<id>/<id>.mp4/`
(own 17438937: `141/c79c43fa4b11121785a4d3b97b3ac98d/17438000/17438937`).
## Samples (live flashvars video_url, logged-in session)
| video | bucket | hash | rounded | note |
|---|---|---|---|---|
| 17179208 | 127 | cdef3f624dc3a759801d151c6e19b74a | 17179000 | public, bbcmastertv duo |
| 17151685 | 127 | 6872beb2c7a7e1255e58b2b748c43697 | 17151000 | public, modestlily |
| 17152805 | 127 | f91d2bdf3d8d40ffc9965fb8ab5a97b0 | 17152000 | public, sexy-sweets |
| 17253267 | 141 | 25efbee1d64e80c5b5b10e842030cab9 | 17253000 | public, fit_vic |
| 17151508 | 127 | 4c7eda9c4b8661f4a36e828f46d09849 | 17151000 | public, miamax88 |
| 17151842 | 127 | 5b968c4a2a1422694cbabd4703986ed7 | 17151000 | public, be_curiouss |
Control (own, bytes on disk): 17416905 → `141/4f3d7633ca9ac532189dff6c85212de2/17416000`;
17438937 → `141/c79c43fa4b11121785a4d3b97b3ac98d/17438000`.
## Results
1. IDENTICAL (batch-hash reuse): **FALSE** — all six public hashes unique.
2. SEQUENTIAL/PATTERNED: **FALSE** — adjacent uploads in the same rounded
block (17151508/17151685/17151842 → all 17151000) are unrelated 32-hex.
3. MD5 OF FILE BYTES: **FALSE** — 17416905 DB hash
`4f3d7633ca9ac532189dff6c85212de2` != MD5(local 99.2MB file)
`fa2828e4e8add0321d4af2b1b9854918`.
4. MD5 OF ID/UPLOADER/SLUG COMBOS: **FALSE** — 17 candidate format strings,
zero matches.
## Conclusion
`get_file` hashes are **per-file opaque keys** (server-side random or MD5 of
unobservable internal state). The public hash for 17179208 gives **zero
information** about 17008274's hash.
Side observation: public `v-acctoken` base64-decodes to
`<serverid>|<uploader_member_id>|<flags>|...` — all six embed member
**20199760** (the uploader). Token is uploader-bound at mint, consistent with
gate-on-owner semantics (but see 06: still per-file).
Evidence: `evidence/q3_17208.txt`, probes `../q_hashes.js`,
`../q_hash_own.js`, `../q_member_vids.js`, `../q_up_vids.js`, `../q_uploader.js`.
</5>
<6>
# 06 — v-acctoken cross-video test (per-file, not catalog-wide)
Question: is a get_file `v-acctoken` catalog-wide (uploader-bound) or per-file?
Implication: if onlyexclusive's PUBLIC tokens were catalog-wide, they could
authorize his PRIVATE path once the hash is known.
## Method (entirely on our own account's content)
Probe `q_cross_token.js`. Token source: our PUBLIC upload 17481521
(hash `158d39d6f496724754cb630b619d2d96`, token decodes to
`659|7262781|0|7b640b046599429b4c58048c357ce937.<sig>`).
Target: our PRIVATE upload 17438937 (hash
`c79c43fa4b11121785a4d3b97b3ac98d`, own token
`1665|7262781|0|2a2d615439774922ea05f4d47529d641.<sig>`).
Token format: `base64(serverId|memberId|flags|<per-file hex>).<16-hex sig>` —
the embedded per-file hex does NOT equal the URL hash; it is a separate
per-file binding inside the token itself.
HTTP: GET `get_file/<bucket>/<hash>/<rounded>/<id>/<id>.mp4/?v-acctoken=X`
with `Range: bytes=0-31` (headers + 32 bytes only), valid session cookies.
## Results
| combo | outcome |
|---|---|
| CROSS: target path + SOURCE token | redirect → `video_error.mp4` (46241 B) — **REJECTED** |
| CONTROL: target path + target's own token | redirect → real CDN, 1020460998 B, range 0-31 — **VALID** |
| CONTROL: target path + no token | redirect → `video_error.mp4` — **REJECTED** |
| CONTROL: source path + source's own token | redirect → real CDN, 73470875 B — **VALID** |
The KVS get_file layer validates the token against the REQUESTED file
(same member 7262781 in both tokens, cross still rejected).
## Conclusion
1. `v-acctoken` is **PER-FILE**: the embedded per-file hex must match the
requested file; the server verifies it.
2. onlyexclusive's public tokens **cannot** authorize his private path.
3. Combined with 05: **both** gate components — path hash AND token — are
per-file. Neither transfers across a catalog. Fetching 17008274 needs the
page rendered in an entitled session (owner or accepted friend) to obtain
BOTH its per-file hash and its per-file token together.
Evidence: probe `../q_cross_token.js`, raw `evidence/decoy.bin`
(46KB error placeholder reference).
</6>
<7>
# 07 — Upload page closed site-side
Bottom line: the **new-video upload page is closed site-side**. The Upload nav
URL `[Login or Register to view]` returns **404 Not Found (nginx)**
even when logged in as edoll/aryo.gustave. Not browser, VPN/adblock, session,
or captcha — the route is gone.
## Evidence (live probes, logged-in session)
| check | result |
|---|---|
| `/upload-video/` (Upload nav target) | 404 nginx, logged in, fresh tab |
| `/upload-video` (no slash) | opaqueredirect → reset |
| `/my/upload-video/`, `/upload/`, `/my/upload/`, `/edit-video/new/`, `/members/upload-video/` | all 404 |
| `/my/videos/` (uploads manager) | **200, len=161662** — the pasted `LEN=161662` was THIS, not the upload page |
| `/edit-video/17438937/` (Video Management) | 200, edit form renders |
| `/login-required/` | 200 (tiny login-gate route) |
Editing/deleting/PUB of existing videos still works.
## Site changes on the edit-video page
1. "Your Public/Private videos ratio should be 70/30%. Otherwise you will not
be able to upload new private videos."
2. "Starting March 4, our new video hosting policy will take effect. We will
periodically remove unpopular private videos without prior notice."
3. `edit-video/17438937/` shows: "This video's screenshots are locked from
editing by site administration."
## Account ratio
30 uploads: **24 public / 6 private = 80% public** → above 70/30. The account
is NOT the blocker; the route itself is off.
Probes kept: `../q_upload.js` (dump upload page), `../q_upload2.js`
(endpoint sweep), `../q_myvideos4.js` (classify + ratio).
</7>
<8>
# 08 — Own private-upload backups
## ID-list correction (important)
The first uploads parse mislabeled the private set. Re-verified with raw
markup per row: the six PRIVATE uploads are
```
17438937 anitafischer bg 26-01-11 pt2 (handled earlier)
17438840 anitafischer bg 26-01-10 pt2
17416920 anita bg 26-01-15
17416905 anita bg 26-01-16
17416842 anita bg 25-12-27 13:45
17384692 anitafischer 25-12-18 15:18
```
NOT 17465150/51/53/95 — those are PUBLIC. The 24/6 = 80% ratio still holds;
only the id list was wrong.
## Backups pulled (own session, own content)
Method: fresh CDP tab on `/videos/<id>/<slug>/` (bare `/videos/<id>/` 404s —
KVS needs the slug), kick the player, capture the resolved CDN URL
(`.mp4?acctoken=...` on video21.woopeedoopcmwhrs.xyz) via
Network.requestWillBeSent, then download straight from the shell (same IP,
token-bound). Saved to `../out/backup/`:
| id | size | header |
|---|---|---|
| 17416905 | 99.2 MB | ftypisom ok |
| 17438840 | 494.1 MB | ftypisom ok |
| 17416920 | 247.3 MB | ftypisom ok |
| 17416842 | 791.9 MB | ftypisom ok |
| 17384692 | 543.8 MB | ftypisom ok |
Total ~2.18 GB, all valid MP4. The March-4 removal-policy clock is now covered
for the private set. No third-party rows touched.
Scripts: `../grab_media_url.ps1` (capture resolved CDN URL → `out/urls/`),
`../grab_video.ps1` (experimental browser-download; superseded by
capture+curl). Captured CDN URLs in `out/urls/` are acctoken-bound and only
useful while fresh. MP4s themselves are NOT copied into docs (size) — they
live in `out/backup/`.
</8>
<9>
# 09 — Scoreboard: closed vs open
## Closed, verified
- Token forgery (member-bound, decoy bytes, no moov).
- Path derivation (three 404s; hash is a key, not a path).
- Gated render emission (empty flashvars, no player block on 17008274).
- Owner edit page (no hash in ~39KB — true negative vs 17438937's known hash).
- Embed, sitemap, uploader panel.
- Accept-IDOR via invalid/self id (silent success, zero mutation — 04).
- Hash correlation within an uploader catalog (refuted, 4 branches — 05).
- Token catalog-wide reuse (per-file binding, proven on own account — 06).
## Open — and it's a wall, not a miss
**A cleared session's capture** (friend's tab or uploader's browser) — the
only copy of 17008274's hash, and (per 06) the only matching per-file token.
Both components are per-file and only co-occur in an entitled render.
Everything technical is mapped; the wall is real and its location is known.
## Killed theories (by byte check, not shipped as false unlocks)
- Decoy `video_error.mp4` mistaken for content (46KB placeholder, `decoy.bin`).
- `LEN=161662` mistaken for the upload page (it was `/my/videos/`).
- 174651xx batch mistaken for the private set (they're public; 08 corrects).
- "Success on bogus sender = IDOR" (no-op success; post-state proved zero
mutation — 04).
- "Uploader-batch hash reuse" (six unique hashes — 05).
- "Public token works on private path" (cross rejected on own account — 06).
</9>
<10>
# 10 — Methods and tools
## Harness
- `cdp.ps1` — CDP probe runner against local Chrome
(`--remote-debugging-port=9222`). `-List`, `-ProbeFile`, `-TargetUrl`,
`-TargetId`, `-Expr`, `-NewTab -Url`.
- `netcap_friend.ps1` — send-side Fetch interception, zero-delivery capture.
- `netcap_accept.ps1` — accept-side Fetch interception, **drain-all** version:
every matching paused POST is fulfilled with a fake error for the full wait
window before disarming (genuinely zero-delivery; fixes the retry race that
confirmed justsomebody in 03).
## Probes (repo root, `q_*.js`)
| probe | purpose |
|---|---|
| q1/q2 | locked-target page state |
| q3 variants | media/flashvars/URL/player dump (locked vs unlocked controls) |
| q_hashes.js / q_hash_own.js | get_file hash extraction, batch + control |
| q_cross_token.js | cross-video token test (4 combos, Range 0-31) |
| q_confirm_sub.js | accept substitution (self/bogus/control) |
| q_postcheck.js / q_fc.js | friends-page post-state verifiers |
| q_msg_accept.js / q_reqctl.js | accept-form discovery |
| q_member/friend(2/3)/search | member + search scraping |
| q_upload.js / q_upload2.js | upload-page dump + endpoint sweep |
| q_myvideos4.js / q_backup_list.js / q_rawids.js / q_slugs.js | uploads classification + hrefs |
| q_up_vids.js / q_uploader.js / q_page17179208.js | uploader catalog sampling |
| q_seek.js / q_state.js / q_dump.js | player kick / state / anchors |
## Discipline rules (kept all night)
- Intercepts at transport, fulfill locally, restore tab to server state.
- Substitution tests only on own rows/ids (self, bogus, already-friend).
- onlyexclusive's row (`20199760`) never clicked/sent/substituted — verified
untouched after every run.
- MP4 bytes pulled only for own uploads, from the owner session.
- Raw captures live in `out/`; byte-exact items mirrored to `docs/evidence/`.
</10>
<11>
# 11 — Block-renderer vocabulary (js-reverse on main.min.js, untested branch)
Question: enumerate the block renderer's full `block_id` vocabulary and the
exact param shapes `get_block` accepts — surfacing block names not used on
visible pages. Real work, own session, no third-party involvement.
Source: `out/main.min.js?v=5.3` (275,935 chars, saved 2026-09-11),
KVS renderer's only same-origin script. 7 `get_block` call sites, 17
`list_*` literals, 10 `data-action` verbs in-bundle.
## The only dispatcher (v(), verbatim logic)
```
v(t,a,i,n):
e = i.url ? i.url : window.location.href // block rides CURRENT page URL
url = e + (?|&) + mode=async&function=get_block&block_id=<t> + $.param(<n>)
type: GET, cache: false, blockUI overlay while pending
```
## Param-shape grammar (all 7 call sites)
- `g(a, s, l(t,a,r))` — `g` = the only ajax sender; `s` = params object;
`l()` wraps blockUI overlay + success/error plumbing.
- `h("k:v;k2:v2")` — the ONLY params parser in the bundle: splits
`data-parameters` on `;`, then `:`, then `+`-joined keys;
`decodeURIComponent`, `+`→space. So data-parameters strings are the full
vocab (`action:delete_from_friends`, `sort_by:added_date;from_my_friends:02`
etc. — 34 distinct samples captured across 6 live pages).
- Every mutating shape is `s.function="get_block"; s.block_id=<from DOM>` +
some combination of `delete:[id]`, `delete_video_ids`, `delete_album_ids`,
`move_to_playlist_id`, `action`, `conversation_user_id`.
## Full block_id vocabulary (union: bundle literals + 6 live page DOMs)
- `list_members_my_conversations` (bundle)
- `list_members_my_friends` (bundle)
- `list_messages_my_conversation_messages` (bundle)
- `list_videos_my_channel_videos` (bundle)
- `list_videos_my_favourite_videos` (bundle)
- `list_videos_my_purchased_videos` (bundle)
- `list_videos_my_uploaded_videos` (bundle)
- `list_videos_videos_from_my_subscriptions` (bundle)
- `list_albums_my_created_albums`, `list_albums_my_favourite_albums`,
`list_albums_albums_from_my_subscriptions`, `list_albums_my_purchased_albums`,
`list_dvds_my_created_channels`,
`list_members_subscriptions_my_subscriptions`,
`list_playlists_my_created_playlists`, `list_state` (bundle only)
- `list_videos_favourite_videos` (live 17008274 page)
- `list_videos_uploaded_videos` (live /my/videos/)
- `video_comments_video_comments` (live 17008274 page)
## Full action vocabulary (union)
`add_to_friends, ajax, choose, delete, delete_conversation,
delete_mixed, delete_multi, ignore_conversation, message,
move_to_playlist_id, move_multi, select, select_all`
## What's ABSENT (the negative that answers the question)
- No player/flashvars/media block in the block vocab: the only video-content
block server-wide is `list_videos_*` LISTING blocks (thumbs/titles), never a
`video_player_*` or media block. The gated render has no renderer to call.
- No `confirm_add_to_friends`, no `message_from_user_id`, no `confirm` in the
bundle: the accept verb is NOT renderable via get_block. The friend flow
lives in static per-instance `<form data-form="ajax">` handlers (friend_ctx
evidence), not the dispatcher.
- All 7 dispatcher call sites take `block_id` from live DOM attributes — the
renderer NEVER invents block ids. A block name not printed in some page's
DOM cannot be invoked as a renderer.
## Conclusion
The renderer is a generic `GET` form reposter for DOM-declared blocks, not a
hidden API. No unlisted block can emit 17008274's hash: the only video-content
blocks the renderer owns are listing blocks, and the friend machinery (the one
that could change entitlement state) lives outside it. The vocabulary is now
complete — this branch is ground out, and it closes against us.
Evidence: `evidence/jsrev_static.txt` (all 7 get_block call sites, bundle
list_* set), `evidence/q3_*.txt` (live gate/control states), probe
`../q_jsrev.js`, raw `../out/main.min.js`.
</11>
<12>
# 12 — The site is down: 504 across the board (2026-09-11)
While assembling the method-substitution + no-cookie tests, every camwhores.tv
surface started returning **nginx 502/504** — from both the logged-in session
(in-page fetch + live tabs) and anonymous shell, while the internet control
(`google.com/generate_204` → 204) is clean. This is a **site-side outage**,
not our browser/session/VPN.
## Evidence (all within one window)
- In-session fetch of our own 17438937 → 502 then consistent **504**,
562-byte nginx error page (the "LEN=562" anomaly that aborted the matrix).
- Retries on both the own-video and target tabs → 504.
- Site sweep in-session: `/`, `/my/videos/`, `/my/friends/` → 504;
`/my/messages/`, `/members/20199760/`, two video pages → fetch aborted.
- Anonymous shell: homepage → 504; `cdn.camwhores.tv/js/main.min.js` → 504.
- Control `google204` → 204 (our network is fine).
## Impact on the plan
- The method-substitution matrix (GET/POST/HEAD/OPTIONS on 17438937's
get_file with its own token) and the no-cookie binding test (token-only,
cookies stripped) are written and staged (`q_freshtoken.js`, `q_rawfetch.js`,
`q_sitestatus.js` + the 4-combo curl set) but **cannot run against a dead
backend** — any response now is nginx, not KVS.
- The mint finding stands on its own (it was proven on a live backend):
Network-before-navigation trace showed exactly 5 requests, only the
document itself first-party — i.e. **no client-reachable mint endpoint**;
entitlement→mint→flashvars is one server-side block.
## When the site returns
1. Re-verify the backend is really back (homepage + `/my/videos/` 200 with
LEN=161662, not nginx 502/504).
2. Re-mint a FRESH v-acctoken via `q_freshtoken.js` (tokens are time-limited;
anything cached from earlier is stale).
3. Run the 4-combo matrix from `../q_cross_token.js` method list, then the
dedicated substitution + no-cookie runs; report status + byte length +
decoy-vs-real for each.
Until then: no further get_file/accept probing — results would be meaningless.
</12>

























